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