Add feature test macro _ISOC2Y_SOURCE
[glibc.git] / sysdeps / i386 / fpu / e_scalbl.S
blob29457e6dff235f3f25389e1ad488978ed9f1dcb3
1 /*
2  * Public domain.
3  */
5 #include <machine/asm.h>
6 #include <libm-alias-finite.h>
8         .section .rodata
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)
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
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
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
75         /* The result is NaN; raise an exception for sNaN arguments.  */
76 2:      faddp
77         ret
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)