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	.text
30ENTRY(__ieee754_scalb)
31	fldl	12(%esp)
32	fxam
33	fnstsw
34	fldl	4(%esp)
35	andl	$0x4700, %eax
36	cmpl	$0x0700, %eax
37	je	1f
38	andl	$0x4500, %eax
39	cmpl	$0x0100, %eax
40	je	2f
41	fxam
42	fnstsw
43	andl	$0x4500, %eax
44	cmpl	$0x0100, %eax
45	je	3f
46	fld	%st(1)
47	frndint
48	fcomp	%st(2)
49	fnstsw
50	sahf
51	jne	4f
52	fscale
53	fstp	%st(1)
54	DBL_NARROW_EVAL
55	ret
56
57	/* y is -inf */
581:	fxam
59#ifdef  PIC
60	LOAD_PIC_REG (cx)
61#endif
62	fnstsw
63	movl	8(%esp), %edx
64	shrl	$5, %eax
65	fstp	%st
66	fstp	%st
67	andl	$0x80000000, %edx
68	andl	$0x0228, %eax
69	cmpl	$0x0028, %eax
70	je	4f
71	andl	$8, %eax
72	shrl	$27, %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.  */
792:	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.  */
883:	fstp	%st(1)
89	ret
90
91	/* Return NaN and raise the invalid exception.  */
924:	fstp	%st
93	fstp	%st
94	fldz
95	fdiv	%st
96	ret
97END(__ieee754_scalb)
98libm_alias_finite (__ieee754_scalb, __scalb)
99