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

source code of glibc/sysdeps/i386/fpu/e_scalbf.S