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
12zero_nan:
13 .double 0.0
14nan: .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##(%rip)
22#else
23# define MO(op) op
24#endif
25
26 .text
27ENTRY(__ieee754_scalbl)
28 fldt 24(%rsp)
29 fxam
30 fnstsw
31 fldt 8(%rsp)
32 andl $0x4700, %eax
33 cmpl $0x0700, %eax
34 je 1f
35 andl $0x4500, %eax
36 cmpl $0x0100, %eax
37 je 2f
38 fxam
39 fnstsw
40 andl $0x4500, %eax
41 cmpl $0x0100, %eax
42 je 2f
43 fld %st(1)
44 frndint
45 fcomip %st(2), %st
46 jne 4f
47 fscale
48 fstp %st(1)
49 ret
50
51 /* y is -inf */
521: fxam
53 fnstsw
54 movl 16(%rsp), %edx
55 shrl $5, %eax
56 fstp %st
57 fstp %st
58 andl $0x8000, %edx
59 andl $0x0228, %eax
60 cmpl $0x0028, %eax
61 je 4f
62 andl $8, %eax
63 shrl $11, %edx
64 addl %edx, %eax
65#ifdef PIC
66 lea zero_nan(%rip),%rdx
67 fldl (%rdx,%rax,1)
68#else
69 fldl zero_nan(%rax, 1)
70#endif
71 ret
72
73 /* The result is NaN; raise an exception for sNaN arguments. */
742: faddp
75 ret
76
77 /* Return NaN and raise the invalid exception. */
784: fstp %st
79 fstp %st
80 fldz
81 fdiv %st
82 ret
83END(__ieee754_scalbl)
84libm_alias_finite (__ieee754_scalbl, __scalbl)
85

source code of glibc/sysdeps/x86_64/fpu/e_scalbl.S