aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/libm-i387')
-rw-r--r--sysdeps/libm-i387/e_pow.S7
-rw-r--r--sysdeps/libm-i387/e_powf.S7
-rw-r--r--sysdeps/libm-i387/e_powl.S7
-rw-r--r--sysdeps/libm-i387/s_cexp.S22
-rw-r--r--sysdeps/libm-i387/s_cexpf.S22
-rw-r--r--sysdeps/libm-i387/s_cexpl.S22
6 files changed, 54 insertions, 33 deletions
diff --git a/sysdeps/libm-i387/e_pow.S b/sysdeps/libm-i387/e_pow.S
index e665326438..45c41b48ab 100644
--- a/sysdeps/libm-i387/e_pow.S
+++ b/sysdeps/libm-i387/e_pow.S
@@ -48,9 +48,6 @@ one: .double 1.0
ASM_TYPE_DIRECTIVE(limit,@object)
limit: .double 0.29
ASM_SIZE_DIRECTIVE(limit)
- ASM_TYPE_DIRECTIVE(nan,@object)
-nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
- ASM_SIZE_DIRECTIVE(nan)
#ifdef PIC
#define MO(op) op##@GOTOFF(%ecx)
@@ -191,8 +188,8 @@ ENTRY(__ieee754_pow)
ret
.align ALIGNARG(4)
-14: fldl MO(nan)
- faddl MO(zero) // raise invalid exception
+14: fldl MO(infinity)
+ fmull MO(zero) // raise invalid exception
ret
.align ALIGNARG(4)
diff --git a/sysdeps/libm-i387/e_powf.S b/sysdeps/libm-i387/e_powf.S
index 102cd4e3af..d7342bf56f 100644
--- a/sysdeps/libm-i387/e_powf.S
+++ b/sysdeps/libm-i387/e_powf.S
@@ -48,9 +48,6 @@ one: .double 1.0
ASM_TYPE_DIRECTIVE(limit,@object)
limit: .double 0.29
ASM_SIZE_DIRECTIVE(limit)
- ASM_TYPE_DIRECTIVE(nan,@object)
-nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
- ASM_SIZE_DIRECTIVE(nan)
#ifdef PIC
#define MO(op) op##@GOTOFF(%ecx)
@@ -187,8 +184,8 @@ ENTRY(__ieee754_powf)
ret
.align ALIGNARG(4)
-14: fldl MO(nan)
- faddl MO(zero) // raise invalid exception
+14: fldl MO(infinity)
+ fmull MO(zero) // raise invalid exception
ret
.align ALIGNARG(4)
diff --git a/sysdeps/libm-i387/e_powl.S b/sysdeps/libm-i387/e_powl.S
index dba725aa77..0ea4829822 100644
--- a/sysdeps/libm-i387/e_powl.S
+++ b/sysdeps/libm-i387/e_powl.S
@@ -48,9 +48,6 @@ one: .double 1.0
ASM_TYPE_DIRECTIVE(limit,@object)
limit: .double 0.29
ASM_SIZE_DIRECTIVE(limit)
- ASM_TYPE_DIRECTIVE(nan,@object)
-nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
- ASM_SIZE_DIRECTIVE(nan)
#ifdef PIC
#define MO(op) op##@GOTOFF(%ecx)
@@ -191,8 +188,8 @@ ENTRY(__ieee754_powl)
ret
.align ALIGNARG(4)
-14: fldl MO(nan)
- faddl MO(zero) // raise invalid exception
+14: fldl MO(infinity)
+ fmull MO(zero) // raise invalid exception
ret
.align ALIGNARG(4)
diff --git a/sysdeps/libm-i387/s_cexp.S b/sysdeps/libm-i387/s_cexp.S
index 48e002b2f6..5630d3cb65 100644
--- a/sysdeps/libm-i387/s_cexp.S
+++ b/sysdeps/libm-i387/s_cexp.S
@@ -31,7 +31,8 @@ huge_nan_null_null:
.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
.double 0.0
- .double 0.0
+zero: .double 0.0
+infinity:
.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
.double 0.0
@@ -90,7 +91,7 @@ ENTRY(__cexp)
Check your FPU manual for more information. */
andb $0x01, %ah
cmpb $0x01, %ah
- je 2f
+ je 20f
/* We have finite numbers in the real and imaginary part. Do
the real work now. */
@@ -139,9 +140,8 @@ ENTRY(__cexp)
1: fxam /* y : x */
fnstsw
movb %ah, %dl
- andb $0x01, %ah /* See above why 0x01 is usable here. */
- cmpb $0x01, %ah
- je 3f
+ testb $0x01, %ah /* See above why 0x01 is usable here. */
+ jne 3f
/* The real part is +-Inf and the imaginary part is finite. */
@@ -220,7 +220,14 @@ ENTRY(__cexp)
.align ALIGNARG(4)
3: fstp %st(0)
fstp %st(0) /* <empty> */
- movl %edx, %eax
+ andb $0x45, %ah
+ andb $0x47, %dh
+ xorb %dh, %ah
+ jnz 30f
+ fldl MO(infinity) /* Raise invalid exception. */
+ fmull MO(zero)
+ fstp %st(0)
+30: movl %edx, %eax
shrl $5, %edx
shll $4, %eax
andl $16, %edx
@@ -236,6 +243,9 @@ ENTRY(__cexp)
/* The real part is NaN. */
.align ALIGNARG(4)
+20: fldl MO(infinity) /* Raise invalid exception. */
+ fmull MO(zero)
+ fstp %st(0)
2: fstp %st(0)
fstp %st(0)
movl 4(%esp), %eax /* Pointer to memory for result. */
diff --git a/sysdeps/libm-i387/s_cexpf.S b/sysdeps/libm-i387/s_cexpf.S
index 6fd414b045..d6dcebcb23 100644
--- a/sysdeps/libm-i387/s_cexpf.S
+++ b/sysdeps/libm-i387/s_cexpf.S
@@ -31,7 +31,8 @@ huge_nan_null_null:
.byte 0, 0, 0x80, 0x7f
.byte 0, 0, 0xc0, 0x7f
.float 0.0
- .float 0.0
+zero: .float 0.0
+infinity:
.byte 0, 0, 0x80, 0x7f
.byte 0, 0, 0xc0, 0x7f
.float 0.0
@@ -90,7 +91,7 @@ ENTRY(__cexpf)
Check your FPU manual for more information. */
andb $0x01, %ah
cmpb $0x01, %ah
- je 2f
+ je 20f
/* We have finite numbers in the real and imaginary part. Do
the real work now. */
@@ -143,9 +144,8 @@ ENTRY(__cexpf)
1: fxam /* y : x */
fnstsw
movb %ah, %dl
- andb $0x01, %ah /* See above why 0x01 is usable here. */
- cmpb $0x01, %ah
- je 3f
+ testb $0x01, %ah /* See above why 0x01 is usable here. */
+ jne 3f
/* The real part is +-Inf and the imaginary part is finite. */
@@ -222,7 +222,14 @@ ENTRY(__cexpf)
.align ALIGNARG(4)
3: fstp %st(0)
fstp %st(0) /* <empty> */
- movl %edx, %eax
+ andb $0x45, %ah
+ andb $0x47, %dh
+ xorb %dh, %ah
+ jnz 30f
+ flds MO(infinity) /* Raise invalid exception. */
+ fmuls MO(zero)
+ fstp %st(0)
+30: movl %edx, %eax
shrl $6, %edx
shll $3, %eax
andl $8, %edx
@@ -235,6 +242,9 @@ ENTRY(__cexpf)
/* The real part is NaN. */
.align ALIGNARG(4)
+20: flds MO(infinity) /* Raise invalid exception. */
+ fmuls MO(zero)
+ fstp %st(0)
2: fstp %st(0)
fstp %st(0)
movl MO(huge_nan_null_null+4), %eax
diff --git a/sysdeps/libm-i387/s_cexpl.S b/sysdeps/libm-i387/s_cexpl.S
index fa31e74162..11c05c52e6 100644
--- a/sysdeps/libm-i387/s_cexpl.S
+++ b/sysdeps/libm-i387/s_cexpl.S
@@ -31,7 +31,8 @@ huge_nan_null_null:
.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
.double 0.0
- .double 0.0
+zero: .double 0.0
+infinity:
.byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f
.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
.double 0.0
@@ -90,7 +91,7 @@ ENTRY(__cexpl)
Check your FPU manual for more information. */
andb $0x01, %ah
cmpb $0x01, %ah
- je 2f
+ je 20f
/* We have finite numbers in the real and imaginary part. Do
the real work now. */
@@ -139,9 +140,8 @@ ENTRY(__cexpl)
1: fxam /* y : x */
fnstsw
movb %ah, %dl
- andb $0x01, %ah /* See above why 0x01 is usable here. */
- cmpb $0x01, %ah
- je 3f
+ testb $0x01, %ah /* See above why 0x01 is usable here. */
+ jne 3f
/* The real part is +-Inf and the imaginary part is finite. */
@@ -220,7 +220,14 @@ ENTRY(__cexpl)
.align ALIGNARG(4)
3: fstp %st(0)
fstp %st(0) /* <empty> */
- movl %edx, %eax
+ andb $0x45, %ah
+ andb $0x47, %dh
+ xorb %dh, %ah
+ jnz 30f
+ fldl MO(infinity) /* Raise invalid exception. */
+ fmull MO(zero)
+ fstp %st(0)
+30: movl %edx, %eax
shrl $5, %edx
shll $4, %eax
andl $16, %edx
@@ -236,6 +243,9 @@ ENTRY(__cexpl)
/* The real part is NaN. */
.align ALIGNARG(4)
+20: fldl MO(infinity) /* Raise invalid exception. */
+ fmull MO(zero)
+ fstp %st(0)
2: fstp %st(0)
fstp %st(0)
movl 4(%esp), %eax /* Pointer to memory for result. */