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?