double test(double a, double b) {
return 1.0 + sin (a + b*b);
}
gcc -O2 -fomit-frame-pointer -mssse3 -ffast-math -mfpmath=387
test:
fldl 12(%esp)
fmul %st(0), %st
faddl 4(%esp)
fsin
fadds .LC0
ret
test:
subl $44, %esp
movsd 56(%esp), %xmm0
mulsd %xmm0, %xmm0
addsd 48(%esp), %xmm0
movsd %xmm0, (%esp)
call sin
fstpl 24(%esp)
movsd 24(%esp), %xmm0
addsd .LC0, %xmm0
movsd %xmm0, 24(%esp)
fldl 24(%esp)
addl $44, %esp
ret
test:
fldl 12(%esp)
fmul %st(0), %st
faddl 4(%esp)
fsin
faddl .LC0
ret
test:
subl $12, %esp
mulsd %xmm1, %xmm1
addsd %xmm0, %xmm1
movapd %xmm1, %xmm0
call sin
addsd .LC0, %xmm0
addl $12, %esp
ret
test:
subl $20, %esp
mulsd %xmm1, %xmm1
movsd %xmm1, (%esp)
fldl (%esp)
movsd %xmm0, 8(%esp)
faddl 8(%esp)
fsin
fstpl (%esp)
movsd (%esp), %xmm0
addsd .LC0, %xmm0
addl $20, %esp
ret
Как видно, код для устаревшего FPU в некоторых случаях оказывается эффективнее SSE(кстати, к сравопросу о 32 vs 64...). Ман про «sse+387» говорит, что опция экспериментальная и пользоваться нужно с осторожностью. У кого вся система так собрана, есть ли проблемы?
Если собрать всю систему -msseregparm, то так понимаю где-нибудь поломается бинарная совместимость?