1/*
2 * Public domain.
3 *
4 * Adapted for i686 instructions.
5 */
6
7#include <machine/asm.h>
8#include <libm-alias-finite.h>
9
10	.section .rodata.cst8,"aM",@progbits,8
11
12	.p2align 3
13	.type one,@object
14one:	.double 1.0
15	ASM_SIZE_DIRECTIVE(one)
16	/* It is not important that this constant is precise.  It is only
17	   a value which is known to be on the safe side for using the
18	   fyl2xp1 instruction.  */
19	.type limit,@object
20limit:	.double 0.29
21	ASM_SIZE_DIRECTIVE(limit)
22
23
24#ifdef PIC
25# define MO(op) op##@GOTOFF(%edx)
26#else
27# define MO(op) op
28#endif
29
30	.text
31ENTRY(__ieee754_logl)
32	fldln2			// log(2)
33	fldt	4(%esp)		// x : log(2)
34	fucomi	%st
35	jp	3f
36#ifdef PIC
37	LOAD_PIC_REG (dx)
38#endif
39	fld	%st		// x : x : log(2)
40	movzwl	4+8(%esp), %eax
41	cmpl	$0xc000, %eax
42	jae	5f		// x <= -2, avoid overflow from -LDBL_MAX - 1.
43	fsubl	MO(one)		// x-1 : x : log(2)
445:	fld	%st		// x-1 : x-1 : x : log(2)
45	fabs			// |x-1| : x-1 : x : log(2)
46	fld	MO(limit)	// 0.29 : |x-1| : x-1 : x : log(2)
47	fcomip	%st(1)		// |x-1| : x-1 : x : log(2)
48	fstp	%st(0)		// x-1 : x : log(2)
49	jc	2f
50	fxam
51	fnstsw
52	andb	$0x45, %ah
53	cmpb	$0x40, %ah
54	jne	4f
55	fabs			// log(1) is +0 in all rounding modes.
564:	fstp	%st(1)		// x-1 : log(2)
57	fyl2xp1			// log(x)
58	ret
59
602:	fstp	%st(0)		// x : log(2)
61	fyl2x			// log(x)
62	ret
63
643:	fstp	%st(1)
65	fadd	%st(0)
66	ret
67END (__ieee754_logl)
68
69ENTRY(__logl_finite)
70	fldln2			// log(2)
71	fldt	4(%esp)		// x : log(2)
72#ifdef PIC
73	LOAD_PIC_REG (dx)
74#endif
75	fld	%st		// x : x : log(2)
76	fsubl	MO(one)		// x-1 : x : log(2)
77	fld	%st		// x-1 : x-1 : x : log(2)
78	fabs			// |x-1| : x-1 : x : log(2)
79	fld	MO(limit)	// 0.29 : |x-1| : x-1 : x : log(2)
80	fcomip	%st(1)		// |x-1| : x-1 : x : log(2)
81	fstp	%st(0)		// x-1 : x : log(2)
82	jc	2b
83	fxam
84	fnstsw
85	andb	$0x45, %ah
86	cmpb	$0x40, %ah
87	jne	6f
88	fabs			// log(1) is +0 in all rounding modes.
896:	fstp	%st(1)		// x-1 : log(2)
90	fyl2xp1			// log(x)
91	ret
92END(__logl_finite)
93libm_alias_finite (__logl_finite, __logl)
94