Remove __ELF__ conditionals
[platform/upstream/glibc.git] / sysdeps / x86_64 / fpu / e_logl.S
index a0bed66..8876dc2 100644 (file)
@@ -8,15 +8,10 @@
 
 #include <machine/asm.h>
 
-RCSID("$NetBSD: $")
 
+       .section .rodata.cst8,"aM",@progbits,8
 
-#ifdef __ELF__
-       .section .rodata
-#else
-       .text
-#endif
-       .align ALIGNARG(4)
+       .p2align 3
        ASM_TYPE_DIRECTIVE(one,@object)
 one:   .double 1.0
        ASM_SIZE_DIRECTIVE(one)
@@ -29,17 +24,21 @@ limit:      .double 0.29
 
 
 #ifdef PIC
-#define MO(op) op##(%rip)
+# define MO(op) op##(%rip)
 #else
-#define MO(op) op
+# define MO(op) op
 #endif
 
        .text
 ENTRY(__ieee754_logl)
        fldln2                  // log(2)
        fldt    8(%rsp)         // x : log(2)
+       fxam
+       fnstsw
        fld     %st             // x : x : log(2)
-       fsubl   MO(one)         // x-1 : x : log(2)
+       testb   $1, %ah
+       jnz     3f              // in case x is NaN or +-Inf
+4:     fsubl   MO(one)         // x-1 : x : log(2)
        fld     %st             // x-1 : x-1 : x : log(2)
        fabs                    // |x-1| : x-1 : x : log(2)
        fcompl  MO(limit)       // x-1 : x : log(2)
@@ -53,4 +52,27 @@ ENTRY(__ieee754_logl)
 2:     fstp    %st(0)          // x : log(2)
        fyl2x                   // log(x)
        ret
+
+3:     testb   $4, %ah
+       jnz     4b              // in case x is +-Inf
+       fstp    %st(1)
+       fstp    %st(1)
+       ret
 END (__ieee754_logl)
+
+
+ENTRY(__logl_finite)
+       fldln2                  // log(2)
+       fldt    8(%rsp)         // x : log(2)
+       fld     %st             // x : x : log(2)
+       fsubl   MO(one)         // x-1 : x : log(2)
+       fld     %st             // x-1 : x-1 : x : log(2)
+       fabs                    // |x-1| : x-1 : x : log(2)
+       fcompl  MO(limit)       // x-1 : x : log(2)
+       fnstsw                  // x-1 : x : log(2)
+       andb    $0x45, %ah
+       jz      2b
+       fstp    %st(1)          // x-1 : log(2)
+       fyl2xp1                 // log(x)
+       ret
+END (__logl_finite)