]> git.ipfire.org Git - thirdparty/glibc.git/blob - sysdeps/i386/fpu/s_log1p.S
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
[thirdparty/glibc.git] / sysdeps / i386 / fpu / s_log1p.S
1 /*
2 * Written by J.T. Conklin <jtc@netbsd.org>.
3 * Public domain.
4 */
5
6 #include <machine/asm.h>
7
8 RCSID("$NetBSD: s_log1p.S,v 1.7 1995/05/09 00:10:58 jtc Exp $")
9
10 #ifdef __ELF__
11 .section .rodata
12 #else
13 .text
14 #endif
15 .align ALIGNARG(4)
16 /* The fyl2xp1 can only be used for values in
17 -1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
18 0.29 is a safe value.
19 */
20 limit: .double 0.29
21 one: .double 1.0
22
23 /*
24 * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
25 * otherwise fyl2x with the needed extra computation.
26 */
27 .text
28 ENTRY(__log1p)
29 fldln2
30
31 fldl 4(%esp)
32
33 #ifdef PIC
34 call 1f
35 1: popl %edx
36 addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
37 #endif
38
39 fxam
40 fnstsw
41 fld %st
42 sahf
43 jc 3f // in case x is NaN or ±Inf
44 4: fabs
45 #ifdef PIC
46 fcompl limit@GOTOFF(%edx)
47 #else
48 fcompl limit
49 #endif
50 fnstsw
51 sahf
52 jc 2f
53
54 #ifdef PIC
55 faddl one@GOTOFF(%edx)
56 #else
57 faddl one
58 #endif
59 fyl2x
60 ret
61
62 2: fyl2xp1
63 ret
64
65 3: jp 4b // in case x is ±Inf
66 fstp %st(1)
67 fstp %st(1)
68 ret
69
70 END (__log1p)
71 weak_alias (__log1p, log1p)