http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54027
Markus Trippelsdorf <markus at trippelsdorf dot de> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |markus at trippelsdorf dot
| |de
--- Comment #4 from Markus Trippelsdorf <markus at trippelsdorf dot de>
2012-08-09 13:31:22 UTC ---
FYI this also turns glibc's __ieee754_fmodf into an endless loop:
>From sysdeps/ieee754/flt-32/e_fmodf.c:
float
__ieee754_fmodf (float x, float y)
{
int32_t n,hx,hy,hz,ix,iy,sx,i;
GET_FLOAT_WORD(hx,x);
GET_FLOAT_WORD(hy,y);
sx = hx&0x80000000; /* sign of x */
hx ^=sx; /* |x| */
hy &= 0x7fffffff; /* |y| */
/* purge off exception values */
if(hy==0||(hx>=0x7f800000)|| /* y=0,or x not finite */
(hy>0x7f800000)) /* or y is NaN */
return (x*y)/(x*y);
if(hx<hy) return x; /* |x|<|y| return x */
if(hx==hy)
return Zero[(u_int32_t)sx>>31]; /* |x|=|y| return x*0*/
/* determine ix = ilogb(x) */
if(hx<0x00800000) { /* subnormal x */
for (ix = -126,i=(hx<<8); i>0; i<<=1) ix -=1;
} //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ endless loop
Disassembly of section .text:
0000000000000000 <__fmodf_finite>:
0: 66 0f 7e c0 movd %xmm0,%eax
4: 89 c7 mov %eax,%edi
6: 81 e7 00 00 00 80 and $0x80000000,%edi
c: 66 41 0f 7e c8 movd %xmm1,%r8d
11: 31 f8 xor %edi,%eax
13: 44 89 c6 mov %r8d,%esi
16: 81 e6 ff ff ff 7f and $0x7fffffff,%esi
1c: 3d ff ff 7f 7f cmp $0x7f7fffff,%eax
21: 7f 2d jg 50 <__fmodf_finite+0x50>
23: 85 f6 test %esi,%esi
25: 74 29 je 50 <__fmodf_finite+0x50>
27: 81 fe 00 00 80 7f cmp $0x7f800000,%esi
2d: 7f 21 jg 50 <__fmodf_finite+0x50>
2f: 39 f0 cmp %esi,%eax
31: 7c 6d jl a0 <__fmodf_finite+0xa0>
33: 74 73 je a8 <__fmodf_finite+0xa8>
35: 3d ff ff 7f 00 cmp $0x7fffff,%eax
3a: 89 c2 mov %eax,%edx
3c: 7f 7a jg b8 <__fmodf_finite+0xb8>
3e: c1 e2 08 shl $0x8,%edx
41: 85 d2 test %edx,%edx
43: 0f 8e 2a 01 00 00 jle 173 <__fmodf_finite+0x173>
49: eb fe jmp 49 <__fmodf_finite+0x49>