diff --git a/src/util/simd_utils.h b/src/util/simd_utils.h index dc8922fd..b7cb1c0f 100644 --- a/src/util/simd_utils.h +++ b/src/util/simd_utils.h @@ -176,7 +176,15 @@ static really_inline u64a movq(const m128 in) { /* another form of movq */ static really_inline m128 load_m128_from_u64a(const u64a *p) { +#if defined(__GNUC__) && !defined(__INTEL_COMPILER) + /* unfortunately _mm_loadl_epi64() is best avoided as it seems to cause + * trouble on some older compilers, possibly because it is misdefined to + * take an m128 as its parameter */ + return _mm_set_epi64((__m64)0ULL, (__m64)*p); +#else + /* ICC doesn't like casting to __m64 */ return _mm_loadl_epi64((const m128 *)p); +#endif } #define rshiftbyte_m128(a, count_immed) _mm_srli_si128(a, count_immed)