Get rid of ASM_TYPE_DIRECTIVE{,_PREFIX}.
[platform/upstream/glibc.git] / sysdeps / i386 / fpu / e_scalbl.S
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  * Correct handling of y==-inf <drepper@gnu>
8  */
9
10 #include <machine/asm.h>
11
12         .section .rodata
13
14         .align ALIGNARG(4)
15         .type zero_nan,@object
16 zero_nan:
17         .double 0.0
18 nan:    .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
19         .byte 0, 0, 0, 0, 0, 0, 0, 0x80
20         .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
21         ASM_SIZE_DIRECTIVE(zero_nan)
22
23
24 #ifdef PIC
25 # define MO(op) op##@GOTOFF(%ecx)
26 # define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
27 #else
28 # define MO(op) op
29 # define MOX(op,x,f) op(,x,f)
30 #endif
31
32         .text
33 ENTRY(__ieee754_scalbl)
34         fldt    16(%esp)
35         fxam
36         fnstsw
37         fldt    4(%esp)
38         andl    $0x4700, %eax
39         cmpl    $0x0700, %eax
40         je      1f
41         andl    $0x4500, %eax
42         cmpl    $0x0100, %eax
43         je      2f
44         fxam
45         fnstsw
46         andl    $0x4500, %eax
47         cmpl    $0x0100, %eax
48         je      3f
49         fld     %st(1)
50         frndint
51         fcomp   %st(2)
52         fnstsw
53         sahf
54         jne     4f
55         fscale
56         fstp    %st(1)
57         ret
58
59         /* y is -inf */
60 1:      fxam
61 #ifdef  PIC
62         LOAD_PIC_REG (cx)
63 #endif
64         fnstsw
65         movl    12(%esp), %edx
66         shrl    $5, %eax
67         fstp    %st
68         fstp    %st
69         andl    $0x8000, %edx
70         andl    $8, %eax
71         jnz     4f
72         shrl    $11, %edx
73         addl    %edx, %eax
74         fldl    MOX(zero_nan, %eax, 1)
75         ret
76
77         /* The result is NaN, but we must not raise an exception.
78            So use a variable.  */
79 2:      fstp    %st
80         fstp    %st
81 #ifdef  PIC
82         LOAD_PIC_REG (cx)
83 #endif
84         fldl    MO(nan)
85         ret
86
87         /* The first parameter is a NaN.  Return it.  */
88 3:      fstp    %st(1)
89         ret
90
91         /* Return NaN and raise the invalid exception.  */
92 4:      fstp    %st
93         fstp    %st
94         fldz
95         fdiv    %st
96         ret
97 END(__ieee754_scalbl)
98 strong_alias (__ieee754_scalbl, __scalbl_finite)