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