[Bug c/43599] Several missing optimizations

2010-03-31 Thread rguenth at gcc dot gnu dot org


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

2010-03-31 Thread rguenth at gcc dot gnu dot org


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

2010-03-31 Thread piotr dot wyderski at gmail dot com


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

2010-03-31 Thread rguenth at gcc dot gnu dot org


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