------- Comment #3 from rguenth at gcc dot gnu dot org  2010-03-31 11:08 -------
fsin/fcos are known to get wrong results for certain values and their precision
is nowhere near acceptable.  Note that when emitting fsin/fcos GCC omits
necessary range reduction for large arguments - fsin/fcos only work
correctly for a limited range.

Proper code is in libm for example:

ENTRY(__sinf)
        flds    4(%esp)
        fxam
        fstsw   %ax
        movb    $0x45, %dh
        andb    %ah, %dh
        cmpb    $0x05, %dh
        je      3f
4:      fsin
        fnstsw  %ax
        testl   $0x400,%eax
        jnz     1f
        ret
        .align ALIGNARG(4)
1:      fldpi
        fadd    %st(0)
        fxch    %st(1)
2:      fprem1
        fnstsw  %ax
        testl   $0x400,%eax
        jnz     2b
        fstp    %st(1)
        fsin
        ret
3:
#ifdef PIC
        pushl   %ebx
        cfi_adjust_cfa_offset (4)
        cfi_rel_offset (ebx, 0)
        LOAD_PIC_REG (bx)
        call    __errno_locat...@plt
        movl    $EDOM, (%eax)
        popl    %ebx
        cfi_adjust_cfa_offset (-4)
        cfi_restore (ebx)
#else
        call    __errno_locat...@plt
        movl    $EDOM, (%eax)
#endif
        jmp     4b


-- 


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

Reply via email to