------- Comment #6 from seongbae dot park at gmail dot com  2006-10-05 05:00 
-------
For example:

# cat m.c
int todouble(double a, double b) {
  return (int)(a+b);
}
#

With 4.1.0 i686-unknown-linux-gnu target:

# gcc -O2 m.c -S
# cat m.s
...
        .type   todouble, @function
todouble:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        fnstcw  -2(%ebp)
        fldl    16(%ebp)
        faddl   8(%ebp)
        movzwl  -2(%ebp), %eax
        orw     $3072, %ax
        movw    %ax, -4(%ebp)
        fldcw   -4(%ebp)
        fistpl  -8(%ebp)
        fldcw   -2(%ebp)
        movl    -8(%ebp), %eax
        leave
        ret
...

With x86_64-unknown-linux-gnu (without -mfpmath=387):

# gcc -O2 m.c -S
# cat m.s
...
todouble:
.LFB2:
        addsd   %xmm1, %xmm0
        cvttsd2si       %xmm0, %eax
        ret


With x86_64-unknown-linux-gnu with -mfpmath=387:
# gcc -O2 m.c -mfpmath=387 -S
# cat m.s
...
todouble:
.LFB2:
        movsd   %xmm0, -8(%rsp)
        fldl    -8(%rsp)
        movsd   %xmm1, -8(%rsp)
        fldl    -8(%rsp)
        faddp   %st, %st(1)
        fstpl   -8(%rsp)
        movlpd  -8(%rsp), %xmm0
        cvttsd2si       %xmm0, %eax
        ret
#

All three codes can behave differently.
There's no doubt that using cvt* is faster, but that's not the point either.
I'm arguing that the purpose of -mfpmath=387 is to be compatible with 387
behavior, hence it should imply -mno-sse. 
The fact that -mfpmath=sse exists implies that -mfpmath=387 turns off sse
(and that's what the description of -mfpmath=387 says).
Clearly this is not the current behavior of -mfpmath=387 - so if this behavior
is not going to be fixed, at the least,
the documentation should be updated to reflect that.

Having said that,
-mno-sse is an acceptable workaround so I won't pursue the bug anymore.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29337

Reply via email to