]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/i386/fpu/e_powf.S
.
[thirdparty/glibc.git] / sysdeps / i386 / fpu / e_powf.S
index b3fa624f4db8655e50b7bd11add18d49886df5c9..c91545418d6142f4e327c54dec592bb953e5ccd6 100644 (file)
@@ -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, 2007
+   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,14 +150,16 @@ 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
        fldl    MO(one)         // 1.0 : x : y
-       fld     %st(1)          // x : 1.0 : x : y
-       fsub    %st(1)          // x-1 : 1.0 : x : y
-       fabs                    // |x-1| : 1.0 : x : y
-       fcompl  MO(limit)       // 1.0 : x : y
+       fldl    MO(limit)       // 0.29 : 1.0 : x : y
+       fld     %st(2)          // x : 0.29 : 1.0 : x : y
+       fsub    %st(2)          // x-1 : 0.29 : 1.0 : x : y
+       fabs                    // |x-1| : 0.29 : 1.0 : x : y
+       fucompp                 // 1.0 : x : y
        fnstsw
        fxch                    // x : 1.0 : y
        sahf
@@ -175,6 +178,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
 
@@ -188,9 +192,10 @@ ENTRY(__ieee754_powf)
        // y == ±inf
        .align ALIGNARG(4)
 12:    fstp    %st(0)          // pop y
-       flds    4(%esp)         // x
-       fabs
-       fcompl  MO(one)         // < 1, == 1, or > 1
+       fldl    MO(one)         // 1
+       flds    4(%esp)         // x : 1
+       fabs                    // abs(x) : 1
+       fucompp                 // < 1, == 1, or > 1
        fnstsw
        andb    $0x45, %ah
        cmpb    $0x45, %ah
@@ -213,6 +218,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 +237,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 +251,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 +293,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 +305,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 +331,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 +340,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