]>
Commit | Line | Data |
---|---|---|
ee188d55 RM |
1 | /* |
2 | * Written by J.T. Conklin <jtc@netbsd.org>. | |
3 | * Public domain. | |
4 | * | |
5 | * Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>. | |
6 | */ | |
7 | ||
8 | #include <machine/asm.h> | |
9 | ||
10 | RCSID("$NetBSD: $") | |
11 | ||
d38cd08c UD |
12 | |
13 | #ifdef __ELF__ | |
14 | .section .rodata | |
15 | #else | |
16 | .text | |
17 | #endif | |
18 | .align ALIGNARG(4) | |
19 | ASM_TYPE_DIRECTIVE(one,@object) | |
20 | one: .double 1.0 | |
21 | ASM_SIZE_DIRECTIVE(one) | |
22 | /* It is not important that this constant is precise. It is only | |
23 | a value which is known to be on the safe side for using the | |
24 | fyl2xp1 instruction. */ | |
25 | ASM_TYPE_DIRECTIVE(limit,@object) | |
26 | limit: .double 0.29 | |
27 | ASM_SIZE_DIRECTIVE(limit) | |
28 | ||
29 | ||
30 | #ifdef PIC | |
31 | #define MO(op) op##@GOTOFF(%edx) | |
32 | #else | |
33 | #define MO(op) op | |
34 | #endif | |
35 | ||
36 | .text | |
ee188d55 | 37 | ENTRY(__ieee754_logl) |
d38cd08c UD |
38 | fldln2 // log(2) |
39 | fldt 4(%esp) // x : log(2) | |
32c075e1 JJ |
40 | fxam |
41 | fnstsw | |
d38cd08c | 42 | #ifdef PIC |
fee732e5 | 43 | LOAD_PIC_REG (dx) |
d38cd08c UD |
44 | #endif |
45 | fld %st // x : x : log(2) | |
32c075e1 JJ |
46 | sahf |
47 | jc 3f // in case x is NaN or +-Inf | |
48 | 4: fsubl MO(one) // x-1 : x : log(2) | |
d38cd08c UD |
49 | fld %st // x-1 : x-1 : x : log(2) |
50 | fabs // |x-1| : x-1 : x : log(2) | |
51 | fcompl MO(limit) // x-1 : x : log(2) | |
52 | fnstsw // x-1 : x : log(2) | |
0d8733c4 UD |
53 | andb $0x45, %ah |
54 | jz 2f | |
d38cd08c UD |
55 | fstp %st(1) // x-1 : log(2) |
56 | fyl2xp1 // log(x) | |
57 | ret | |
58 | ||
6bc31da0 | 59 | 2: fstp %st(0) // x : log(2) |
d38cd08c | 60 | fyl2x // log(x) |
ee188d55 | 61 | ret |
32c075e1 JJ |
62 | |
63 | 3: jp 4b // in case x is +-Inf | |
64 | fstp %st(1) | |
65 | fstp %st(1) | |
66 | ret | |
d38cd08c | 67 | END (__ieee754_logl) |