Blame sysdeps/x86_64/fpu/e_scalbl.S

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
 * Adapted for x86-64 by Andreas Jaeger <aj@suse.de>
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##(%rip)
Packit 6c4009
#else
Packit 6c4009
# define MO(op) op
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
	.text
Packit 6c4009
ENTRY(__ieee754_scalbl)
Packit 6c4009
	fldt	24(%rsp)
Packit 6c4009
	fxam
Packit 6c4009
	fnstsw
Packit 6c4009
	fldt	8(%rsp)
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
	fcomip	%st(2), %st
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
	fnstsw
Packit 6c4009
	movl	16(%rsp), %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
#ifdef PIC
Packit 6c4009
	lea	zero_nan(%rip),%rdx
Packit 6c4009
	fldl	(%rdx,%rax,1)
Packit 6c4009
#else
Packit 6c4009
	fldl	zero_nan(%rax, 1)
Packit 6c4009
#endif
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)