about summary refs log tree commit diff
path: root/sysdeps/libm-i387
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.  */