http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55894
--- Comment #4 from Marc Glisse <glisse at gcc dot gnu.org> 2013-01-07 20:17:15 UTC --- Two more versions: __m128d f(){ union { long long t[2]; __m128d d; } a = {{ 0x7fffffffffffffff, 0x7fffffffffffffff }}; return a.d; } _Z1fv: .LFB537: .cfi_startproc movabsq $9223372036854775807, %rax movq %rax, -24(%rsp) movq %rax, -16(%rsp) movapd -24(%rsp), %xmm0 ret .cfi_endproc __m128d g(){ union { long long l; double d; } b; b.l = 0x7fffffffffffffff; return _mm_set1_pd(b.d); } _Z1gv: .LFB538: .cfi_startproc movapd .LC0(%rip), %xmm0 ret .cfi_endproc I'll hope that other compilers also optimize this last version and use that one.