最適化オプション付けないで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レジスタ関係ないだろ。しかし寒くて手が動かんのでまあいいや…多分スタックに変な値のってるとかそれ系だろ…