/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#include <_mingw_mac.h>

	.file	"exp2f.S"
	.text
#ifdef _WIN64
	.align 8
#else
	.align 4
#endif
.globl __MINGW_USYMBOL(exp2f)
	.def	__MINGW_USYMBOL(exp2f);	.scl	2;	.type	32;	.endef
__MINGW_USYMBOL(exp2f):
#ifdef _WIN64
	subq	$24, %rsp
	movss	%xmm0,(%rsp)
	flds	(%rsp)
	fxam				/* Is NaN or +-Inf?  */
	fstsw	%ax
	movb	$0x45, %dh
	andb	%ah, %dh
	cmpb	$0x05, %dh
	je	1f			/* Is +-Inf, jump.  */
	fld	%st
  	subq $8, %rsp /* int(x) */
    	fnstcw 4(%rsp)
    	movzwl 4(%rsp), %eax
    	orb $12, %ah
    	movw %ax, (%rsp)
    	fldcw (%rsp)
    	frndint
    	fldcw 4(%rsp)
    	addq $8, %rsp
	fsubr	%st,%st(1)		/* fract(x) */
	fxch
	f2xm1				/* 2^(fract(x)) - 1 */
	fld1
	faddp				/* 2^(fract(x)) */
	fscale				/* e^x */
	fstp	%st(1)
	fstps	(%rsp)
	movss	(%rsp),%xmm0
	addq	$24, %rsp
	ret

1:	testl	$0x200, %eax		/* Test sign.  */
	jz	2f			/* If positive, jump.  */
	fstp	%st
	fldz				/* Set result to 0.  */
2:	fstps	(%rsp)
	movss	(%rsp),%xmm0
	addq	$24, %rsp
	ret
#else
	flds	4(%esp)
/* I added the following ugly construct because exp(+-Inf) resulted
   in NaN.  The ugliness results from the bright minds at Intel.
   For the i686 the code can be written better.
   -- drepper@cygnus.com.  */
	fxam				/* Is NaN or +-Inf?  */
	fstsw	%ax
	movb	$0x45, %dh
	andb	%ah, %dh
	cmpb	$0x05, %dh
	je	1f			/* Is +-Inf, jump.  */
	fld	%st
	subl $8, %esp /* int(x) */
	fnstcw 4(%esp)
	movzwl 4(%esp), %eax
	orb $12, %ah
	movw %ax, (%esp)
	fldcw (%esp)
	frndint
	fldcw 4(%esp)
	addl $8, %esp
	fsubr	%st,%st(1)		/* fract(x) */
	fxch
	f2xm1				/* 2^(fract(x)) - 1 */
	fld1
	faddp				/* 2^(fract(x)) */
	fscale				/* e^x */
	fstp	%st(1)
	ret

1:	testl	$0x200, %eax		/* Test sign.  */
	jz	2f			/* If positive, jump.  */
	fstp	%st
	fldz				/* Set result to 0.  */
2:	ret
#endif
