summary refs log tree commit diff
path: root/sysdeps/i386/fpu/e_powf.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/i386/fpu/e_powf.S')
-rw-r--r--sysdeps/i386/fpu/e_powf.S25
1 files changed, 21 insertions, 4 deletions
diff --git a/sysdeps/i386/fpu/e_powf.S b/sysdeps/i386/fpu/e_powf.S
index b3fa624f4d..c835b978b9 100644
--- a/sysdeps/i386/fpu/e_powf.S
+++ b/sysdeps/i386/fpu/e_powf.S
@@ -1,5 +1,6 @@
 /* ix87 specific implementation of pow function.
-   Copyright (C) 1996, 1997, 1999, 2001, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1999, 2001, 2004, 2005
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
@@ -66,9 +67,7 @@ ENTRY(__ieee754_powf)
 	fxam
 
 #ifdef	PIC
-	call	1f
-1:	popl	%ecx
-	addl	$_GLOBAL_OFFSET_TABLE_+[.-1b], %ecx
+	LOAD_PIC_REG (cx)
 #endif
 
 	fnstsw
@@ -86,6 +85,7 @@ ENTRY(__ieee754_powf)
 	flds	4(%esp)		// x : y
 
 	subl	$4, %esp
+	cfi_adjust_cfa_offset (4)
 
 	fxam
 	fnstsw
@@ -119,6 +119,7 @@ ENTRY(__ieee754_powf)
 
 	/* OK, we have an integer value for y.  */
 	popl	%edx
+	cfi_adjust_cfa_offset (-4)
 	orl	$0, %edx
 	fstp	%st(0)		// x
 	jns	4f		// y >= 0, jump
@@ -149,6 +150,7 @@ ENTRY(__ieee754_powf)
 31:	fstp	%st(1)
 	ret
 
+	cfi_adjust_cfa_offset (4)
 	.align ALIGNARG(4)
 2:	/* y is a real number.  */
 	fxch			// x : y
@@ -175,6 +177,7 @@ ENTRY(__ieee754_powf)
 	faddl	MO(one)		// 2^fract(y*log2(x)) : int(y*log2(x))
 	fscale			// 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
 	addl	$4, %esp
+	cfi_adjust_cfa_offset (-4)
 	fstp	%st(1)		// 2^fract(y*log2(x))*2^int(y*log2(x))
 	ret
 
@@ -213,6 +216,7 @@ ENTRY(__ieee754_powf)
 13:	flds	4(%esp)		// load x == NaN
 	ret
 
+	cfi_adjust_cfa_offset (4)
 	.align ALIGNARG(4)
 	// x is ±inf
 15:	fstp	%st(0)		// y
@@ -231,6 +235,7 @@ ENTRY(__ieee754_powf)
 	// OK, the value is an integer, but is the number of bits small
 	// enough so that all are coming from the mantissa?
 	popl	%edx
+	cfi_adjust_cfa_offset (-4)
 	testb	$1, %dl
 	jz	18f		// jump if not odd
 	movl	%edx, %eax
@@ -244,22 +249,27 @@ ENTRY(__ieee754_powf)
 	fldl	MOX(minf_mzero, %edx, 8)
 	ret
 
+	cfi_adjust_cfa_offset (4)
 	.align ALIGNARG(4)
 16:	fcompl	MO(zero)
 	addl	$4, %esp
+	cfi_adjust_cfa_offset (-4)
 	fnstsw
 	shrl	$5, %eax
 	andl	$8, %eax
 	fldl	MOX(inf_zero, %eax, 1)
 	ret
 
+	cfi_adjust_cfa_offset (4)
 	.align ALIGNARG(4)
 17:	shll	$30, %edx	// sign bit for y in right position
 	addl	$4, %esp
+	cfi_adjust_cfa_offset (-4)
 18:	shrl	$31, %edx
 	fldl	MOX(inf_zero, %edx, 8)
 	ret
 
+	cfi_adjust_cfa_offset (4)
 	.align ALIGNARG(4)
 	// x is ±0
 20:	fstp	%st(0)		// y
@@ -281,6 +291,7 @@ ENTRY(__ieee754_powf)
 	// OK, the value is an integer, but is the number of bits small
 	// enough so that all are coming from the mantissa?
 	popl	%edx
+	cfi_adjust_cfa_offset (-4)
 	testb	$1, %dl
 	jz	27f		// jump if not odd
 	cmpl	$0xff000000, %edx
@@ -292,13 +303,16 @@ ENTRY(__ieee754_powf)
 	fchs
 	ret
 
+	cfi_adjust_cfa_offset (4)
 25:	fstp	%st(0)
 26:	addl	$4, %esp
+	cfi_adjust_cfa_offset (-4)
 27:	// Raise divide-by-zero exception and get infinity value.
 	fldl	MO(one)
 	fdivl	MO(zero)
 	ret
 
+	cfi_adjust_cfa_offset (4)
 	.align ALIGNARG(4)
 	// x is ±0 and y is > 0.  We must find out whether y is an odd integer.
 21:	testb	$2, %dh
@@ -315,6 +329,7 @@ ENTRY(__ieee754_powf)
 	// OK, the value is an integer, but is the number of bits small
 	// enough so that all are coming from the mantissa?
 	popl	%edx
+	cfi_adjust_cfa_offset (-4)
 	testb	$1, %dl
 	jz	24f		// jump if not odd
 	cmpl	$0xff000000, %edx
@@ -323,8 +338,10 @@ ENTRY(__ieee754_powf)
 	fldl	MO(mzero)
 	ret
 
+	cfi_adjust_cfa_offset (4)
 22:	fstp	%st(0)
 23:	addl	$4, %esp	// Don't use pop.
+	cfi_adjust_cfa_offset (-4)
 24:	fldl	MO(zero)
 	ret