[Bug c/43599] Several missing optimizations
--- Comment #4 from rguenth at gcc dot gnu dot org 2010-03-31 11:10 --- Btw, on targets which have sincos in their libm gcc emits a call to that routine when optimizing. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43599
[Bug c/43599] Several missing optimizations
--- 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) flds4(%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
[Bug c/43599] Several missing optimizations
--- Comment #2 from piotr dot wyderski at gmail dot com 2010-03-31 11:00 --- With -ffast-math the code becomes .file "testcase.cpp" .text .p2align 4,,15 .globl __Z3fn1d .def__Z3fn1d; .scl2; .type 32; .endef __Z3fn1d: fldl4(%esp) fsincos fmulp %st, %st(1) ret .p2align 4,,15 .globl __Z3fn2d .def__Z3fn2d; .scl2; .type 32; .endef __Z3fn2d: fldl4(%esp) fsincos fmulp %st, %st(1) ret which is exactly the expected output, but: -ffast-math: This option should never be turned on by any -O option since it can result in incorrect output for programs which depend on an exact implementation of IEEE or ISO rules/specifications for math functions. So, what IEEE rules does the fsin/fcos/fsincos emission/fussion break? The only problem I see is excessive accuracy, but it can be removed using the fld/fst trick used by -ffloat-store (and THAT can be removed by -ffast-math), without the need to declare the entire program as IEEE754 non-conformant. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43599
[Bug c/43599] Several missing optimizations
--- Comment #1 from rguenth at gcc dot gnu dot org 2010-03-31 10:47 --- fsin and fcos are not precise, you have to use -funsafe-math-optimizations to enable their use. -- rguenth at gcc dot gnu dot org changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED Resolution||WORKSFORME http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43599