Package: libstdc++-4.8-dev Version: 4.8.0-6 User: multiarch-de...@lists.alioth.debian.org Usertags: multiarch
libstdc++-4.8-dev is marked as "Multi-Arch: same", but the following files are architecture-dependent:
/usr/include/c++/4.8/bits/opt_random.h /usr/include/c++/4.8/ext/opt_random.h An example diff between i386 and powerpc is attached. -- Jakub Wilk
diff -ur libstdc++-4.8-dev_4.8.0-6_i386/usr/include/c++/4.8/bits/opt_random.h libstdc++-4.8-dev_4.8.0-6_powerpc/usr/include/c++/4.8/bits/opt_random.h --- libstdc++-4.8-dev_4.8.0-6_i386/usr/include/c++/4.8/bits/opt_random.h 2013-05-08 05:35:00.000000000 +0200 +++ libstdc++-4.8-dev_4.8.0-6_powerpc/usr/include/c++/4.8/bits/opt_random.h 2013-05-08 04:41:32.000000000 +0200 @@ -1,4 +1,4 @@ -// Optimizations for random number functions, x86 version -*- C++ -*- +// Optimizations for random number handling, generic version -*- C++ -*- // Copyright (C) 2012-2013 Free Software Foundation, Inc. // @@ -30,190 +30,9 @@ #ifndef _BITS_OPT_RANDOM_H #define _BITS_OPT_RANDOM_H 1 -#include <x86intrin.h> - - #pragma GCC system_header -namespace std _GLIBCXX_VISIBILITY(default) -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION - -#ifdef __SSE3__ - template<> - template<typename _UniformRandomNumberGenerator> - void - normal_distribution<double>:: - __generate(typename normal_distribution<double>::result_type* __f, - typename normal_distribution<double>::result_type* __t, - _UniformRandomNumberGenerator& __urng, - const param_type& __param) - { - typedef uint64_t __uctype; - - if (__f == __t) - return; - - if (_M_saved_available) - { - _M_saved_available = false; - *__f++ = _M_saved * __param.stddev() + __param.mean(); - - if (__f == __t) - return; - } - - constexpr uint64_t __maskval = 0xfffffffffffffull; - static const __m128i __mask = _mm_set1_epi64x(__maskval); - static const __m128i __two = _mm_set1_epi64x(0x4000000000000000ull); - static const __m128d __three = _mm_set1_pd(3.0); - const __m128d __av = _mm_set1_pd(__param.mean()); - - const __uctype __urngmin = __urng.min(); - const __uctype __urngmax = __urng.max(); - const __uctype __urngrange = __urngmax - __urngmin; - const __uctype __uerngrange = __urngrange + 1; - - while (__f + 1 < __t) - { - double __le; - __m128d __x; - do - { - union - { - __m128i __i; - __m128d __d; - } __v; - - if (__urngrange > __maskval) - { - if (__detail::_Power_of_2(__uerngrange)) - __v.__i = _mm_and_si128(_mm_set_epi64x(__urng(), - __urng()), - __mask); - else - { - const __uctype __uerange = __maskval + 1; - const __uctype __scaling = __urngrange / __uerange; - const __uctype __past = __uerange * __scaling; - uint64_t __v1; - do - __v1 = __uctype(__urng()) - __urngmin; - while (__v1 >= __past); - __v1 /= __scaling; - uint64_t __v2; - do - __v2 = __uctype(__urng()) - __urngmin; - while (__v2 >= __past); - __v2 /= __scaling; - - __v.__i = _mm_set_epi64x(__v1, __v2); - } - } - else if (__urngrange == __maskval) - __v.__i = _mm_set_epi64x(__urng(), __urng()); - else if ((__urngrange + 2) * __urngrange >= __maskval - && __detail::_Power_of_2(__uerngrange)) - { - uint64_t __v1 = __urng() * __uerngrange + __urng(); - uint64_t __v2 = __urng() * __uerngrange + __urng(); - - __v.__i = _mm_and_si128(_mm_set_epi64x(__v1, __v2), - __mask); - } - else - { - size_t __nrng = 2; - __uctype __high = __maskval / __uerngrange / __uerngrange; - while (__high > __uerngrange) - { - ++__nrng; - __high /= __uerngrange; - } - const __uctype __highrange = __high + 1; - const __uctype __scaling = __urngrange / __highrange; - const __uctype __past = __highrange * __scaling; - __uctype __tmp; - - uint64_t __v1; - do - { - do - __tmp = __uctype(__urng()) - __urngmin; - while (__tmp >= __past); - __v1 = __tmp / __scaling; - for (size_t __cnt = 0; __cnt < __nrng; ++__cnt) - { - __tmp = __v1; - __v1 *= __uerngrange; - __v1 += __uctype(__urng()) - __urngmin; - } - } - while (__v1 > __maskval || __v1 < __tmp); - - uint64_t __v2; - do - { - do - __tmp = __uctype(__urng()) - __urngmin; - while (__tmp >= __past); - __v2 = __tmp / __scaling; - for (size_t __cnt = 0; __cnt < __nrng; ++__cnt) - { - __tmp = __v2; - __v2 *= __uerngrange; - __v2 += __uctype(__urng()) - __urngmin; - } - } - while (__v2 > __maskval || __v2 < __tmp); - - __v.__i = _mm_set_epi64x(__v1, __v2); - } - - __v.__i = _mm_or_si128(__v.__i, __two); - __x = _mm_sub_pd(__v.__d, __three); - __m128d __m = _mm_mul_pd(__x, __x); - __le = _mm_cvtsd_f64(_mm_hadd_pd (__m, __m)); - } - while (__le == 0.0 || __le >= 1.0); - - double __mult = (std::sqrt(-2.0 * std::log(__le) / __le) - * __param.stddev()); - - __x = _mm_add_pd(_mm_mul_pd(__x, _mm_set1_pd(__mult)), __av); - - _mm_storeu_pd(__f, __x); - __f += 2; - } - - if (__f != __t) - { - result_type __x, __y, __r2; - - __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> - __aurng(__urng); - - do - { - __x = result_type(2.0) * __aurng() - 1.0; - __y = result_type(2.0) * __aurng() - 1.0; - __r2 = __x * __x + __y * __y; - } - while (__r2 > 1.0 || __r2 == 0.0); - - const result_type __mult = std::sqrt(-2 * std::log(__r2) / __r2); - _M_saved = __x * __mult; - _M_saved_available = true; - *__f = __y * __mult * __param.stddev() + __param.mean(); - } - } -#endif - - -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace #endif // _BITS_OPT_RANDOM_H diff -ur libstdc++-4.8-dev_4.8.0-6_i386/usr/include/c++/4.8/ext/opt_random.h libstdc++-4.8-dev_4.8.0-6_powerpc/usr/include/c++/4.8/ext/opt_random.h --- libstdc++-4.8-dev_4.8.0-6_i386/usr/include/c++/4.8/ext/opt_random.h 2013-05-08 05:35:00.000000000 +0200 +++ libstdc++-4.8-dev_4.8.0-6_powerpc/usr/include/c++/4.8/ext/opt_random.h 2013-05-08 04:41:32.000000000 +0200 @@ -1,4 +1,4 @@ -// Optimizations for random number extensions, x86 version -*- C++ -*- +// Optimizations for random number extensions, generic version -*- C++ -*- // Copyright (C) 2012-2013 Free Software Foundation, Inc. // @@ -22,7 +22,7 @@ // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // <http://www.gnu.org/licenses/>. -/** @file ext/random.tcc +/** @file ext/opt_random.h * This is an internal header file, included by other library headers. * Do not attempt to use it directly. @headername{ext/random} */ @@ -32,109 +32,7 @@ #pragma GCC system_header -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -#ifdef __SSE2__ -namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) -{ -_GLIBCXX_BEGIN_NAMESPACE_VERSION - - namespace { - - template<size_t __sl1, size_t __sl2, size_t __sr1, size_t __sr2, - uint32_t __msk1, uint32_t __msk2, uint32_t __msk3, uint32_t __msk4> - inline __m128i __sse2_recursion(__m128i __a, __m128i __b, - __m128i __c, __m128i __d) - { - __m128i __y = _mm_srli_epi32(__b, __sr1); - __m128i __z = _mm_srli_si128(__c, __sr2); - __m128i __v = _mm_slli_epi32(__d, __sl1); - __z = _mm_xor_si128(__z, __a); - __z = _mm_xor_si128(__z, __v); - __m128i __x = _mm_slli_si128(__a, __sl2); - __y = _mm_and_si128(__y, _mm_set_epi32(__msk4, __msk3, __msk2, __msk1)); - __z = _mm_xor_si128(__z, __x); - return _mm_xor_si128(__z, __y); - } - - } - - -#define _GLIBCXX_OPT_HAVE_RANDOM_SFMT_GEN_READ 1 - template<typename _UIntType, size_t __m, - size_t __pos1, size_t __sl1, size_t __sl2, - size_t __sr1, size_t __sr2, - uint32_t __msk1, uint32_t __msk2, - uint32_t __msk3, uint32_t __msk4, - uint32_t __parity1, uint32_t __parity2, - uint32_t __parity3, uint32_t __parity4> - void simd_fast_mersenne_twister_engine<_UIntType, __m, - __pos1, __sl1, __sl2, __sr1, __sr2, - __msk1, __msk2, __msk3, __msk4, - __parity1, __parity2, __parity3, - __parity4>:: - _M_gen_rand(void) - { - __m128i __r1 = _mm_load_si128(&_M_state[_M_nstate - 2]); - __m128i __r2 = _mm_load_si128(&_M_state[_M_nstate - 1]); - - size_t __i; - for (__i = 0; __i < _M_nstate - __pos1; ++__i) - { - __m128i __r = __sse2_recursion<__sl1, __sl2, __sr1, __sr2, - __msk1, __msk2, __msk3, __msk4> - (_M_state[__i], _M_state[__i + __pos1], __r1, __r2); - _mm_store_si128(&_M_state[__i], __r); - __r1 = __r2; - __r2 = __r; - } - for (; __i < _M_nstate; ++__i) - { - __m128i __r = __sse2_recursion<__sl1, __sl2, __sr1, __sr2, - __msk1, __msk2, __msk3, __msk4> - (_M_state[__i], _M_state[__i + __pos1 - _M_nstate], __r1, __r2); - _mm_store_si128(&_M_state[__i], __r); - __r1 = __r2; - __r2 = __r; - } - - _M_pos = 0; - } - - -#define _GLIBCXX_OPT_HAVE_RANDOM_SFMT_OPERATOREQUAL 1 - template<typename _UIntType, size_t __m, - size_t __pos1, size_t __sl1, size_t __sl2, - size_t __sr1, size_t __sr2, - uint32_t __msk1, uint32_t __msk2, - uint32_t __msk3, uint32_t __msk4, - uint32_t __parity1, uint32_t __parity2, - uint32_t __parity3, uint32_t __parity4> - bool - operator==(const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType, - __m, __pos1, __sl1, __sl2, __sr1, __sr2, - __msk1, __msk2, __msk3, __msk4, - __parity1, __parity2, __parity3, __parity4>& __lhs, - const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType, - __m, __pos1, __sl1, __sl2, __sr1, __sr2, - __msk1, __msk2, __msk3, __msk4, - __parity1, __parity2, __parity3, __parity4>& __rhs) - { - __m128i __res = _mm_cmpeq_epi8(__lhs._M_state[0], __rhs._M_state[0]); - for (size_t __i = 1; __i < __lhs._M_nstate; ++__i) - __res = _mm_and_si128(__res, _mm_cmpeq_epi8(__lhs._M_state[__i], - __rhs._M_state[__i])); - return (_mm_movemask_epi8(__res) == 0xffff - && __lhs._M_pos == __rhs._M_pos); - } - - -_GLIBCXX_END_NAMESPACE_VERSION -} // namespace - -#endif // __SSE2__ - -#endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #endif // _EXT_OPT_RANDOM_H