https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68924
--- Comment #3 from Peter Cordes <peter at cordes dot ca> --- (In reply to Marc Glisse from comment #2) > Does anything bad happen if you remove the #ifdef/#endif for > _mm_cvtsi64_si128? (2 files in the testsuite would need updating for a > proper patch) It's just a wrapper for _mm_cvtsi64_si128 (long long __A) { return _mm_set_epi64x (0, __A); } and _mm_set_epi64x is already available in 32-bit mode. I tried using _mm_set_epi64x(0, i) (https://godbolt.org/g/24AYPk), and got the expected results (same as with _mm_loadl_epi64(&i)); __m128i movq_test(uint64_t *p) { return _mm_set_epi64x( 0, *p ); } movl 4(%esp), %eax vmovq (%eax), %xmm0 ret For the test where we shift before movq, it still uses 32-bit integer double-precision shifts, stores to the stack, then vmovq (instead of optimizing to vmovq / vpsllq) For the reverse, we get: long long extract(__m128i v) { return ((__v2di)v)[0]; } subl $28, %esp vmovq %xmm0, 8(%esp) movl 8(%esp), %eax movl 12(%esp), %edx addl $28, %esp ret MOVD / PEXTRD might be better, but gcc does handle it. It's all using syntax that's available in 32-bit mode, not a special built-in. I don't think it's helpful to disable the 64-bit integer intrinsics for 32-bit mode, even though they are no longer always single instructions. I guess it could be worse if someone used it without thinking, assuming it would be the same cost as MOVD, and didn't really need the full 64 bits. In that case, a compile-time error would prompt them to port more optimally to 32-bit. But it's not usually gcc's job to refuse to compile code that might be sub-optimal!