1/*
2 * Written by J.T. Conklin <jtc@netbsd.org>.
3 * Public domain.
4 */
5
6#include <machine/asm.h>
7
8RCSID("$NetBSD: s_log1p.S,v 1.7 1995/05/09 00:10:58 jtc Exp $")
9
10#ifdef __ELF__
11	.section .rodata
12#else
13	.text
14#endif
15	.align ALIGNARG(4)
16	/* The fyl2xp1 can only be used for values in
17		-1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
18	   0.29 is a safe value.
19	*/
20limit:	.double 0.29
21one:	.double 1.0
22
23/*
24 * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
25 * otherwise fyl2x with the needed extra computation.
26 */
27	.text
28ENTRY(__log1p)
29	fldln2
30
31	fldl	4(%esp)
32
33#ifdef	PIC
34	call	1f
351:	popl	%edx
36	addl	$_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
37#endif
38
39	fxam
40	fnstsw
41	fld	%st
42	sahf
43	jc	3f		// in case x is NaN or �Inf
444:	fabs
45#ifdef PIC
46	fcompl	limit@GOTOFF(%edx)
47#else
48	fcompl	limit
49#endif
50	fnstsw
51	sahf
52	jc	2f
53
54#ifdef PIC
55	faddl	one@GOTOFF(%edx)
56#else
57	faddl	one
58#endif
59	fyl2x
60	ret
61
622:	fyl2xp1
63	ret
64
653:	jp	4b		// in case x is �Inf
66	fstp	%st(1)
67	fstp	%st(1)
68	ret
69
70END (__log1p)
71weak_alias (__log1p, log1p)
72