+2014-06-10 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #17042]
+ * sysdeps/i386/fpu/e_log2.S (__ieee754_log2): Take absolete value
+ when x - 1 is zero.
+ * sysdeps/i386/fpu/e_log2f.S (__ieee754_log2f): Likewise.
+ * sysdeps/i386/fpu/e_log2l.S (__ieee754_log2l): Likewise.
+ * sysdeps/ieee754/ldbl-128/e_log2l.c (__ieee754_log2l): Return
+ 0.0L for an argument of 1.0L.
+ * sysdeps/ieee754/ldbl-128ibm/e_log2l.c (__ieee754_log2l):
+ Likewise.
+ * sysdeps/x86_64/fpu/e_log2l.S (__ieee754_log2l): Take absolute
+ value when x - 1 is zero.
+ * math/libm-test.inc (log2_test): Use ALL_RM_TEST.
+ * sysdeps/i386/fpu/libm-test-ulps: Update.
+ * sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
+
2014-06-09 Bernard Ogden <bernie.ogden@linaro.org>
[BZ #15119]
16791, 16796, 16799, 16800, 16815, 16823, 16824, 16831, 16838, 16849,
16854, 16876, 16877, 16878, 16882, 16885, 16888, 16890, 16912, 16915,
16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958, 16965, 16966,
- 16967, 16977, 16978, 16984, 16990, 17009.
+ 16967, 16977, 16978, 16984, 16990, 17009, 17042.
* The minimum Linux kernel version that this version of the GNU C Library
can be used with is 2.6.32.
static void
log2_test (void)
{
- START (log2, 0);
- RUN_TEST_LOOP_f_f (log2, log2_test_data, );
- END;
+ ALL_RM_TEST (log2, 0, log2_test_data, RUN_TEST_LOOP_f_f, END);
}
fnstsw // x-1 : x : 1
andb $0x45, %ah
jz 2f
- fstp %st(1) // x-1 : 1
+ fxam
+ fnstsw
+ andb $0x45, %ah
+ cmpb $0x40, %ah
+ jne 5f
+ fabs // log2(1) is +0 in all rounding modes.
+5: fstp %st(1) // x-1 : 1
fyl2xp1 // log(x)
ret
fnstsw // x-1 : x : 1
andb $0x45, %ah
jz 2f
- fstp %st(1) // x-1 : 1
+ fxam
+ fnstsw
+ andb $0x45, %ah
+ cmpb $0x40, %ah
+ jne 5f
+ fabs // log2(1) is +0 in all rounding modes.
+5: fstp %st(1) // x-1 : 1
fyl2xp1 // log(x)
ret
fnstsw // x-1 : x : 1
andb $0x45, %ah
jz 2f
- fstp %st(1) // x-1 : 1
+ fxam
+ fnstsw
+ andb $0x45, %ah
+ cmpb $0x40, %ah
+ jne 5f
+ fabs // log2(1) is +0 in all rounding modes.
+5: fstp %st(1) // x-1 : 1
fyl2xp1 // log(x)
ret
ildouble: 1
ldouble: 1
+Function: "log2_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+
+Function: "log2_upward":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+
Function: "log_downward":
ildouble: 1
ldouble: 1
if (hx >= 0x7fff000000000000LL)
return (x + x);
+ if (x == 1.0L)
+ return 0.0L;
+
/* separate mantissa from exponent */
/* Note, frexp is used so that denormal numbers
if (hx >= 0x7ff0000000000000LL)
return (x + x);
+ if (x == 1.0L)
+ return 0.0L;
+
/* separate mantissa from exponent */
/* Note, frexp is used so that denormal numbers
fnstsw // x-1 : x : 1
andb $0x45, %ah
jz 2f
- fstp %st(1) // x-1 : 1
+ fxam
+ fnstsw
+ andb $0x45, %ah
+ cmpb $0x40, %ah
+ jne 5f
+ fabs // log2(1) is +0 in all rounding modes.
+5: fstp %st(1) // x-1 : 1
fyl2xp1 // log(x)
ret
ildouble: 1
ldouble: 1
+Function: "log2_downward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "log2_towardzero":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+ildouble: 1
+ldouble: 1
+
+Function: "log2_upward":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+ildouble: 1
+ldouble: 1
+
Function: "log_downward":
float: 1
ifloat: 1