1/** 2 * This file has no copyright assigned and is placed in the Public Domain. 3 * This file is part of the mingw-w64 runtime package. 4 * No warranty is given; refer to the file DISCLAIMER.PD within this package. 5 */ 6#include <_mingw_mac.h> 7 8 .file "internal_logl.S" 9 .text 10#ifdef __x86_64__ 11 .align 8 12#else 13 .align 4 14#endif 15one: .double 1.0 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. */ 19limit: .double 0.29 20 21.globl __MINGW_USYMBOL(__logl_internal) 22 .def __MINGW_USYMBOL(__logl_internal); .scl 2; .type 32; .endef 23__MINGW_USYMBOL(__logl_internal): 24#ifdef __x86_64__ 25 fldln2 // log(2) 26 fldt (%rdx) // x : log(2) 27 fld %st // x : x : log(2) 28 fsubl one(%rip) // x-1 : x : log(2) 29 fld %st // x-1 : x-1 : x : log(2) 30 fabs // |x-1| : x-1 : x : log(2) 31 fcompl limit(%rip) // x-1 : x : log(2) 32 fnstsw // x-1 : x : log(2) 33 andb $0x45, %ah 34 jz 2f 35 fstp %st(1) // x-1 : log(2) 36 fyl2xp1 // log(x) 37 movq %rcx,%rax 38 movq $0,8(%rcx) 39 fstpt (%rcx) 40 ret 41 422: fstp %st(0) // x : log(2) 43 fyl2x // log(x) 44 movq %rcx,%rax 45 movq $0,8(%rcx) 46 fstpt (%rcx) 47 ret 48#else 49 fldln2 // log(2) 50 fldt 4(%esp) // x : log(2) 51 fld %st // x : x : log(2) 52 fsubl one // x-1 : x : log(2) 53 fld %st // x-1 : x-1 : x : log(2) 54 fabs // |x-1| : x-1 : x : log(2) 55 fcompl limit // x-1 : x : log(2) 56 fnstsw // x-1 : x : log(2) 57 andb $0x45, %ah 58 jz 2f 59 fstp %st(1) // x-1 : log(2) 60 fyl2xp1 // log(x) 61 ret 62 632: fstp %st(0) // x : log(2) 64 fyl2x // log(x) 65 ret 66#endif 67