最適化オプション付けないでmath.hをインクルードしないときのsinの挙動
遅いのが謎だが…
レジスタの初期値が辛い値になってるかと思ったけど、
__declspec(noinline) int a(int v) { return cos(v); } int main() { int i; __int64 b,e; a(100); b = __rdtsc(); for (i=0; i<100; i++) { if (1) { __asm { pxor xmm0, xmm0; pxor xmm1, xmm1; pxor xmm2, xmm2; pxor xmm3, xmm3; pxor xmm4, xmm4; pxor xmm5, xmm5; pxor xmm6, xmm6; pxor xmm7, xmm7; } } a(0); } e = __rdtsc(); printf("%lld\n", e-b); }
こういうのでもmath.h入れないほうが遅い。
math.hなし(35000clkぐらい)
_a PROC ; File c:\users\w0\test\cl\sin.c ; Line 5 push ebp mov ebp, esp ; Line 6 mov eax, DWORD PTR _v$[ebp] push eax call _cos add esp, 4 ; Line 7 pop ebp ret 0
あり。(3500clkぐらい)
_a PROC ; File c:\users\w0\test\cl\sin.c ; Line 5 push ebp mov ebp, esp sub esp, 8 ; Line 6 cvtsi2sd xmm0, DWORD PTR _v$[ebp] sub esp, 8 movsd QWORD PTR [esp], xmm0 call _cos add esp, 8 fstp QWORD PTR tv72[ebp] movsd xmm0, QWORD PTR tv72[ebp] cvttsd2si eax, xmm0 ; Line 7 mov esp, ebp pop ebp ret 0
いや引数スタックだからxmmレジスタ関係ないだろ。しかし寒くて手が動かんのでまあいいや…多分スタックに変な値のってるとかそれ系だろ…