master
  1/**
  2 * This file has no copyright assigned and is placed in the Public Domain.
  3 * This file is part of the mingw-w64 runtime package.
  4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
  5 */
  6#include <_mingw_mac.h>
  7
  8	.file	"log1pl.S"
  9	.text
 10	/* The fyl2xp1 can only be used for values in
 11	   -1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
 12	   0.29 is a safe value.
 13	 */
 14
 15	/* Only gcc understands the .tfloat type
 16	   The series of .long below represents
 17	   limit:	.tfloat 0.29
 18	 */
 19	.align 16
 20limit:
 21	.long 2920577761
 22	.long 2491081031
 23	.long 16381
 24#ifdef __x86_64__
 25	.align 8
 26#else
 27	.align 4
 28#endif
 29	/* Please note:	 we use a double value here.  Since 1.0 has
 30	   an exact representation this does not effect the accuracy
 31	   but it helps to optimize the code.  */
 32one:	.double 1.0
 33
 34/*
 35 * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
 36 * otherwise fyl2x with the needed extra computation.
 37 */
 38.globl __MINGW_USYMBOL(log1pl)
 39	.def	__MINGW_USYMBOL(log1pl);	.scl	2;	.type	32;	.endef
 40__MINGW_USYMBOL(log1pl):
 41#ifdef __x86_64__
 42	fldln2
 43	fldt	(%rdx)
 44	fxam
 45	fnstsw
 46	fld	%st
 47	sahf
 48	jc	3f		// in case x is NaN or Inf
 494:
 50	fabs
 51	fldt	limit(%rip)
 52	fcompp
 53	fnstsw
 54	sahf
 55	jnc	2f
 56	faddl	one(%rip)
 57	fyl2x
 58	movq	%rcx,%rax
 59	movq	$0,8(%rcx)
 60	fstpt	(%rcx)
 61	ret
 62
 632:	fyl2xp1
 64	movq	%rcx,%rax
 65	movq	$0,8(%rcx)
 66	fstpt	(%rcx)
 67	ret
 68
 693:	jp	4b		// in case x is Inf
 70	fstp	%st(1)
 71	fstp	%st(1)
 72	movq	%rcx,%rax
 73	movq	$0,8(%rcx)
 74	fstpt	(%rcx)
 75	ret
 76#else
 77	fldln2
 78	fldt	4(%esp)
 79	fxam
 80	fnstsw
 81	fld	%st
 82	sahf
 83	jc	3f		// in case x is NaN or Inf
 844:
 85	fabs
 86	fldt	limit
 87	fcompp
 88	fnstsw
 89	sahf
 90	jnc	2f
 91	faddl	one
 92	fyl2x
 93	ret
 94
 952:	fyl2xp1
 96	ret
 97
 983:	jp	4b		// in case x is Inf
 99	fstp	%st(1)
100	fstp	%st(1)
101	ret
102#endif