|
Packit |
6c4009 |
/*
|
|
Packit |
6c4009 |
* Written by J.T. Conklin <jtc@netbsd.org>.
|
|
Packit |
6c4009 |
* Public domain.
|
|
Packit |
6c4009 |
*
|
|
Packit |
6c4009 |
* Adapted for `long double' by Ulrich Drepper <drepper@cygnus.com>.
|
|
Packit |
6c4009 |
*
|
|
Packit |
6c4009 |
* Correct handling of y==-inf <drepper@gnu>
|
|
Packit |
6c4009 |
*/
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#include <machine/asm.h>
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
.section .rodata
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
.align ALIGNARG(4)
|
|
Packit |
6c4009 |
.type zero_nan,@object
|
|
Packit |
6c4009 |
zero_nan:
|
|
Packit |
6c4009 |
.double 0.0
|
|
Packit |
6c4009 |
nan: .byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
|
|
Packit |
6c4009 |
.byte 0, 0, 0, 0, 0, 0, 0, 0x80
|
|
Packit |
6c4009 |
.byte 0, 0, 0, 0, 0, 0, 0xff, 0x7f
|
|
Packit |
6c4009 |
ASM_SIZE_DIRECTIVE(zero_nan)
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
#ifdef PIC
|
|
Packit |
6c4009 |
# define MO(op) op##@GOTOFF(%ecx)
|
|
Packit |
6c4009 |
# define MOX(op,x,f) op##@GOTOFF(%ecx,x,f)
|
|
Packit |
6c4009 |
#else
|
|
Packit |
6c4009 |
# define MO(op) op
|
|
Packit |
6c4009 |
# define MOX(op,x,f) op(,x,f)
|
|
Packit |
6c4009 |
#endif
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
.text
|
|
Packit |
6c4009 |
ENTRY(__ieee754_scalbl)
|
|
Packit |
6c4009 |
fldt 16(%esp)
|
|
Packit |
6c4009 |
fxam
|
|
Packit |
6c4009 |
fnstsw
|
|
Packit |
6c4009 |
fldt 4(%esp)
|
|
Packit |
6c4009 |
andl $0x4700, %eax
|
|
Packit |
6c4009 |
cmpl $0x0700, %eax
|
|
Packit |
6c4009 |
je 1f
|
|
Packit |
6c4009 |
andl $0x4500, %eax
|
|
Packit |
6c4009 |
cmpl $0x0100, %eax
|
|
Packit |
6c4009 |
je 2f
|
|
Packit |
6c4009 |
fxam
|
|
Packit |
6c4009 |
fnstsw
|
|
Packit |
6c4009 |
andl $0x4500, %eax
|
|
Packit |
6c4009 |
cmpl $0x0100, %eax
|
|
Packit |
6c4009 |
je 2f
|
|
Packit |
6c4009 |
fld %st(1)
|
|
Packit |
6c4009 |
frndint
|
|
Packit |
6c4009 |
fcomp %st(2)
|
|
Packit |
6c4009 |
fnstsw
|
|
Packit |
6c4009 |
sahf
|
|
Packit |
6c4009 |
jne 4f
|
|
Packit |
6c4009 |
fscale
|
|
Packit |
6c4009 |
fstp %st(1)
|
|
Packit |
6c4009 |
ret
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
/* y is -inf */
|
|
Packit |
6c4009 |
1: fxam
|
|
Packit |
6c4009 |
#ifdef PIC
|
|
Packit |
6c4009 |
LOAD_PIC_REG (cx)
|
|
Packit |
6c4009 |
#endif
|
|
Packit |
6c4009 |
fnstsw
|
|
Packit |
6c4009 |
movl 12(%esp), %edx
|
|
Packit |
6c4009 |
shrl $5, %eax
|
|
Packit |
6c4009 |
fstp %st
|
|
Packit |
6c4009 |
fstp %st
|
|
Packit |
6c4009 |
andl $0x8000, %edx
|
|
Packit |
6c4009 |
andl $0x0228, %eax
|
|
Packit |
6c4009 |
cmpl $0x0028, %eax
|
|
Packit |
6c4009 |
je 4f
|
|
Packit |
6c4009 |
andl $8, %eax
|
|
Packit |
6c4009 |
shrl $11, %edx
|
|
Packit |
6c4009 |
addl %edx, %eax
|
|
Packit |
6c4009 |
fldl MOX(zero_nan, %eax, 1)
|
|
Packit |
6c4009 |
ret
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
/* The result is NaN; raise an exception for sNaN arguments. */
|
|
Packit |
6c4009 |
2: faddp
|
|
Packit |
6c4009 |
ret
|
|
Packit |
6c4009 |
|
|
Packit |
6c4009 |
/* Return NaN and raise the invalid exception. */
|
|
Packit |
6c4009 |
4: fstp %st
|
|
Packit |
6c4009 |
fstp %st
|
|
Packit |
6c4009 |
fldz
|
|
Packit |
6c4009 |
fdiv %st
|
|
Packit |
6c4009 |
ret
|
|
Packit |
6c4009 |
END(__ieee754_scalbl)
|
|
Packit |
6c4009 |
strong_alias (__ieee754_scalbl, __scalbl_finite)
|