Blame sysdeps/i386/fpu/s_log1pf.S

Packit 6c4009
/*
Packit 6c4009
 * Written by J.T. Conklin <jtc@netbsd.org>.
Packit 6c4009
 * Public domain.
Packit 6c4009
 */
Packit 6c4009
Packit 6c4009
#include <machine/asm.h>
Packit 6c4009
#include <i386-math-asm.h>
Packit 6c4009
Packit 6c4009
RCSID("$NetBSD: s_log1pf.S,v 1.4 1995/05/09 00:13:05 jtc Exp $")
Packit 6c4009
Packit 6c4009
	.section .rodata
Packit 6c4009
Packit 6c4009
	.align ALIGNARG(4)
Packit 6c4009
	/* The fyl2xp1 can only be used for values in
Packit 6c4009
		-1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
Packit 6c4009
	   0.29 is a safe value.
Packit 6c4009
	*/
Packit 6c4009
limit:	.float 0.29
Packit 6c4009
one:	.float 1.0
Packit 6c4009
Packit 6c4009
DEFINE_FLT_MIN
Packit 6c4009
Packit 6c4009
#ifdef PIC
Packit 6c4009
# define MO(op) op##@GOTOFF(%edx)
Packit 6c4009
#else
Packit 6c4009
# define MO(op) op
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
 * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
Packit 6c4009
 * otherwise fyl2x with the needed extra computation.
Packit 6c4009
 */
Packit 6c4009
	.text
Packit 6c4009
ENTRY(__log1pf)
Packit 6c4009
	fldln2
Packit 6c4009
Packit 6c4009
	flds	4(%esp)
Packit 6c4009
Packit 6c4009
#ifdef	PIC
Packit 6c4009
	LOAD_PIC_REG (dx)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
	fxam
Packit 6c4009
	fnstsw
Packit 6c4009
	fld	%st
Packit 6c4009
	sahf
Packit 6c4009
	jc	3f		// in case x is NaN or ±Inf
Packit 6c4009
4:	fabs
Packit 6c4009
	fcomps	MO(limit)
Packit 6c4009
	fnstsw
Packit 6c4009
	sahf
Packit 6c4009
	jc	2f
Packit 6c4009
Packit 6c4009
	fadds	MO(one)
Packit 6c4009
	fyl2x
Packit 6c4009
	ret
Packit 6c4009
Packit 6c4009
2:	fyl2xp1
Packit 6c4009
	FLT_CHECK_FORCE_UFLOW_NONNAN
Packit 6c4009
	ret
Packit 6c4009
Packit 6c4009
3:	jp	4b		// in case x is ±Inf
Packit 6c4009
	fstp	%st(1)
Packit 6c4009
	fstp	%st(1)
Packit 6c4009
	ret
Packit 6c4009
Packit 6c4009
END (__log1pf)