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