As i coulnd't understand why g++ insisted on spitting movq $0, <stack> only to rewrite the same place a few cycles behind (with a different width), i've made a testcase and now 20mn later i'm even more puzzled.
#include <xmmintrin.h> #include <stdio.h> struct dir_t { __m128 x,y,z; }; int creative_codegen(const struct dir_t *dir) { const int sx = _mm_movemask_ps(dir->x), sy = _mm_movemask_ps(dir->y), sz = _mm_movemask_ps(dir->z), signs_all[4] = { !(sx > 0), !(sy > 0), !(sz > 0), 0 }, coherent = (((sx == 0) | (sx == 15)) & ((sy == 0) | (sy == 15)) & ((sz == 0) | (sz == 15))); if (coherent) { int i; for (i=0; i<4; ++i) printf("%d",signs_all[i]); } return coherent; } int main(int argc, void **argv) { return creative_codegen((struct dir_t*)argv); } with g++ -O2 (4.0.3, 4.2.0 20060121) [...] 40056d: movq $0x0,0x10(%rsp) # ? 400576: movq $0x0,0x18(%rsp) # ?? [...] 40058b: movq $0x0,(%rsp) # ??? 400593: movq $0x0,0x8(%rsp) # ok [...] 40059f: mov %eax,0x10(%rsp) # ok [...] 4005b1: mov %eax,0x14(%rsp) # ok [...] 4005c4: mov %eax,0x18(%rsp) # ok If compiled with gcc, there's no such preliminary movq. So the question is, what is so obviously flying way over my head?