fastmath generating extra fmull
b u
bnulbig@yahoo.com
Mon Jul 19 02:46:00 GMT 2004
I have the following lines of code in a critical
section:
r = x->a / ( r + 1.0 );
if ( x->lg = ( r > x->ctf ) ) {...}
I get the following asm from g++ 3.3.2 with -O3
-march=pentium4 -ftracer.
My question was on the extra fmull added by the
fast-math version below this dump. (I added the if to
show that it generates an extra test instruction,
though that's really no biggie.)
fadd %st(1), %st
fldl 32(%esi)
fxch %st(1)
movl %eax, 4(%esi)
fdivrl 16(%esi)
fucomi %st(1), %st
fstp %st(1)
seta %cl
testb %cl, %cl
movb %cl, 1(%esi)
je .L49
Here's the -ffast-math version. Instead of doing the
divr directly from mem, it first divr's 1.0 and then
does a mull. Obviously legal, but is it really
"fast-math"? What is gained here?
fadd %st(1), %st
fldl 32(%esi)
fxch %st(1)
movl %eax, 4(%esi)
fdivr %st(2), %st
fmull 16(%esi)
fcomi %st(1), %st
fstp %st(1)
seta %cl
testb %cl, %cl
movb %cl, 1(%esi)
je .L49
Thanks,
Ben
__________________________________
Do you Yahoo!?
New and Improved Yahoo! Mail - 100MB free storage!
http://promotions.yahoo.com/new_mail
More information about the Gcc-help
mailing list