1 | /* |
2 | * Public domain. |
3 | */ |
4 | |
5 | #include <machine/asm.h> |
6 | #include <libm-alias-finite.h> |
7 | |
8 | .section .rodata |
9 | |
10 | .align ALIGNARG(4) |
11 | .type zero_nan,@object |
12 | zero_nan: |
13 | .double 0.0 |
14 | nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f |
15 | .byte 0, 0, 0, 0, 0, 0, 0, 0x80 |
16 | .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f |
17 | ASM_SIZE_DIRECTIVE(zero_nan) |
18 | |
19 | |
20 | #ifdef PIC |
21 | # define MO(op) op##@GOTOFF(%ecx) |
22 | # define MOX(op,x,f) op##@GOTOFF(%ecx,x,f) |
23 | #else |
24 | # define MO(op) op |
25 | # define MOX(op,x,f) op(,x,f) |
26 | #endif |
27 | |
28 | .text |
29 | ENTRY(__ieee754_scalbl) |
30 | fldt 16(%esp) |
31 | fxam |
32 | fnstsw |
33 | fldt 4(%esp) |
34 | andl $0x4700, %eax |
35 | cmpl $0x0700, %eax |
36 | je 1f |
37 | andl $0x4500, %eax |
38 | cmpl $0x0100, %eax |
39 | je 2f |
40 | fxam |
41 | fnstsw |
42 | andl $0x4500, %eax |
43 | cmpl $0x0100, %eax |
44 | je 2f |
45 | fld %st(1) |
46 | frndint |
47 | fcomp %st(2) |
48 | fnstsw |
49 | sahf |
50 | jne 4f |
51 | fscale |
52 | fstp %st(1) |
53 | ret |
54 | |
55 | /* y is -inf */ |
56 | 1: fxam |
57 | #ifdef PIC |
58 | LOAD_PIC_REG (cx) |
59 | #endif |
60 | fnstsw |
61 | movl 12(%esp), %edx |
62 | shrl $5, %eax |
63 | fstp %st |
64 | fstp %st |
65 | andl $0x8000, %edx |
66 | andl $0x0228, %eax |
67 | cmpl $0x0028, %eax |
68 | je 4f |
69 | andl $8, %eax |
70 | shrl $11, %edx |
71 | addl %edx, %eax |
72 | fldl MOX(zero_nan, %eax, 1) |
73 | ret |
74 | |
75 | /* The result is NaN; raise an exception for sNaN arguments. */ |
76 | 2: faddp |
77 | ret |
78 | |
79 | /* Return NaN and raise the invalid exception. */ |
80 | 4: fstp %st |
81 | fstp %st |
82 | fldz |
83 | fdiv %st |
84 | ret |
85 | END(__ieee754_scalbl) |
86 | libm_alias_finite (__ieee754_scalbl, __scalbl) |
87 | |