------- 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