2 * Written by J.T. Conklin <jtc@NetBSD.org>.
5 * $NetBSD: s_log1pf.S,v 1.10 2003/09/16 18:17:11 wennmach Exp $
6 * $DragonFly: src/lib/libm/arch/i386/s_log1pf.S,v 1.1 2005/07/26 21:15:19 joerg Exp $
10 * Modified by Lex Wennmacher <wennmach@NetBSD.org>
11 * Still public domain.
14 #include <machine/asm.h>
19 * The log1pf() function is provided to compute an accurate value of
20 * log(1 + x), even for tiny values of x. The i387 FPU provides the
21 * fyl2xp1 instruction for this purpose. However, the range of this
22 * instruction is limited to:
23 * -(1 - (sqrt(2) / 2)) <= x <= sqrt(2) - 1
24 * -0.292893 <= x <= 0.414214
25 * at least on older processor versions.
27 * log1pf() is implemented by testing the range of the argument.
28 * If it is appropriate for fyl2xp1, this instruction is used.
29 * Else, we compute log1pf(x) = ln(2)*ld(1 + x) the traditional way
32 * The range testing costs speed, but as the rationale for the very
33 * existence of this function is accuracy, we accept that.
35 * In order to reduce the cost for testing the range, we check if
36 * the argument is in the range
38 * which can be done with just one conditional branch. If x is
39 * inside this range, we use fyl2xp1. Outside of this range,
40 * the use of fyl2x is accurate enough.
47 XMM_ONE_ARG_FLOAT_PROLOGUE
51 fadd %st(0) /* ... x 2 */
52 fadd %st(0) /* ... x 4 */
54 fdivp /* ... x 0.25 */