1/*
2 * Public domain.
3 */
4
5#include <machine/asm.h>
6#include <i386-math-asm.h>
7
8RCSID("$NetBSD: s_log1p.S,v 1.7 1995/05/09 00:10:58 jtc Exp $")
9
10	.section .rodata
11
12	.align ALIGNARG(4)
13	/* The fyl2xp1 can only be used for values in
14		-1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
15	   0.29 is a safe value.
16	*/
17limit:	.double 0.29
18one:	.double 1.0
19
20DEFINE_DBL_MIN
21
22#ifdef PIC
23# define MO(op) op##@GOTOFF(%edx)
24#else
25# define MO(op) op
26#endif
27
28/*
29 * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
30 * otherwise fyl2x with the needed extra computation.
31 */
32	.text
33ENTRY(__log1p)
34	fldln2
35
36	fldl	4(%esp)
37
38#ifdef	PIC
39	LOAD_PIC_REG (dx)
40#endif
41
42	fxam
43	fnstsw
44	fld	%st
45	sahf
46	jc	3f		// in case x is NaN or �Inf
474:	fabs
48	fcompl	MO(limit)
49	fnstsw
50	sahf
51	jc	2f
52
53	faddl	MO(one)
54	fyl2x
55	ret
56
572:	fyl2xp1
58	DBL_CHECK_FORCE_UFLOW_NONNAN
59	ret
60
613:	jp	4b		// in case x is �Inf
62	fstp	%st(1)
63	fstp	%st(1)
64	ret
65
66END (__log1p)
67