hi, good news to hear they are being fixed. I reported this problem about one month ago,it was fixed in gcc3.1. But i have no time to investigate other math test problems,wish you good luck:) ÔÚ 2002-03-17 11:52:00 you wrote£º >I have found a problem in glibc caused by the gcc-2.96-99.1 compiler >from H.J's miniport. > >in the exp() function (file w_expf.c), there is code like: > >#ifdef __STDC__ > float __expf(float x) /* wrapper expf */ >#else > float __expf(x) /* wrapper expf */ > float x; >#endif >{ >#ifdef _IEEE_LIBM > return __ieee754_expf(x); >#else > float z; > z = __ieee754_expf(x); > if(_LIB_VERSION == _IEEE_) return z; > > if(__finitef(x)) { > if(x>o_threshold) > > >(IEEE_LIBM is not set). Note that there are two function calls (ieee754_expf >and finitef()) followed by a FP if-statement (x>o_threshold). This >translates into: > >00400570 <__expf>: > 400570: 3c1c0fc1 lui gp,0xfc1 > 400574: 279cc090 addiu gp,gp,-16240 > 400578: 0399e021 addu gp,gp,t9 > 40057c: 27bdffc8 addiu sp,sp,-56 > 400580: afbc0018 sw gp,24(sp) > 400584: e7b60030 swc1 $f22,48(sp) > 400588: e7b70034 swc1 $f23,52(sp) > 40058c: e7b40028 swc1 $f20,40(sp) > 400590: e7b5002c swc1 $f21,44(sp) > 400594: afbf0024 sw ra,36(sp) > 400598: 46006506 mov.s $f20,$f12 > 40059c: afbc0020 sw gp,32(sp) > 4005a0: 8f998630 lw t9,-31184(gp) > 4005a4: 00000000 nop > 4005a8: 0320f809 jalr t9 __ieee754_expf > 4005ac: 00000000 nop > 4005b0: 8fbc0018 lw gp,24(sp) > 4005b4: 00000000 nop > 4005b8: 8f8388f4 lw v1,-30476(gp) > 4005bc: 00000000 nop > 4005c0: 8c630000 lw v1,0(v1) > 4005c4: 2402ffff li v0,-1 > 4005c8: 46000586 mov.s $f22,$f0 > 4005cc: 1062002d beq v1,v0,400684 <__expf+0x114> > 4005d0: 4600a306 mov.s $f12,$f20 > 4005d4: 8f9986d0 lw t9,-31024(gp) > 4005d8: 00000000 nop > 4005dc: 0320f809 jalr t9 finitef() > 4005e0: 00000000 nop > 4005e4: 8fbc0018 lw gp,24(sp) > 4005e8: 00000000 nop > 4005ec: 3c0142b1 lui at,0x42b1 > 4005f0: 34217180 ori at,at,0x7180 > 4005f4: 44810000 mtc1 at,$f0 > 4005f8: 00000000 nop > 4005fc: 4614003c c.lt.s $f0,$f20 Wow!!!! > ... > 400608: 1040001e beqz v0,400684 <__expf+0x114> > 40060c: 4600b006 mov.s $f0,$f22 > 400610: 4500000b bc1f 400640 <__expf+0xd0> > > >Note that the c.lt.s (from the FP compare) is done before the finitef() >value has been checked (beqz in 400608). This particular issue causes >the wrong setting of bits in the FPU SR in some cases (with exp(nan)), >and "make check" in glibc to fail. > >BTW, the "make check" in glibc has so far turned up a few other items in >glibc as well as in the kernel (FPU emulator), which are being fixed. > >/Hartvig > >-- > _ _ _____ ____ Hartvig Ekner Mailto:hartvige@mips.com > |\ /| | |____)(____ Direct: +45 4486 5503 > | \/ | | | _____) MIPS Denmark Switch: +45 4486 5555 >T E C H N O L O G I E S http://www.mips.com Fax...: +45 4486 5556 Regards Zhang Fuxin fxzhang@ict.ac.cn