about summary refs log tree commit diff
path: root/sysdeps/x86_64
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/x86_64')
-rw-r--r--sysdeps/x86_64/fpu/e_expl.S15
1 files changed, 14 insertions, 1 deletions
diff --git a/sysdeps/x86_64/fpu/e_expl.S b/sysdeps/x86_64/fpu/e_expl.S
index 0ebe3882a5..866bad2c6e 100644
--- a/sysdeps/x86_64/fpu/e_expl.S
+++ b/sysdeps/x86_64/fpu/e_expl.S
@@ -65,6 +65,10 @@ c1:	.byte 0x20, 0xfa, 0xee, 0xc2, 0x5f, 0x70, 0xa5, 0xec, 0xed, 0x3f
 csat:	.byte 0, 0, 0, 0, 0, 0, 0, 0x80, 0x0e, 0x40
 	.byte 0, 0, 0, 0, 0, 0
 	ASM_SIZE_DIRECTIVE(csat)
+	.type cmin,@object
+cmin:	.byte 0, 0, 0, 0, 0, 0, 0, 0x80, 0x1, 0
+	.byte 0, 0, 0, 0, 0, 0
+	ASM_SIZE_DIRECTIVE(cmin)
 #endif
 
 #ifdef PIC
@@ -182,8 +186,17 @@ ENTRY(IEEE754_EXPL)
 	fstp	%st(1)		/* 2  */
 	fscale			/* 2 scale factor is st(1); base^x */
 	fstp	%st(1)		/* 1  */
+	/* Ensure underflow for tiny result.  */
+	fldt	MO(cmin)	/* 2 cmin  */
+	fld	%st(1)		/* 3  */
+	fcomip	%st(1), %st	/* 2  */
+	fstp	%st		/* 1  */
+	jnc	6f
+	fld	%st
+	fmul	%st
+	fstp	%st
 #endif
-	fstp	%st(1)		/* 0  */
+6:	fstp	%st(1)		/* 0  */
 	jmp	2f
 1:
 #ifdef USE_AS_EXPM1L