.global expm1l .type expm1l,@function expm1l: fldt 8(%rsp) fldl2e fmulp fld1 fld %st(1) fabs fucom %st(1) fnstsw %ax fstp %st(0) fstp %st(0) sahf ja 1f f2xm1 ret 1: push %rax call 1f pop %rax fld1 fsubrp ret .global exp2l .type exp2l,@function exp2l: fldt 8(%rsp) 1: fld %st(0) sub $16,%rsp fstpt (%rsp) mov 8(%rsp),%ax and $0x7fff,%ax cmp $0x3fff+13,%ax jb 4f # |x| < 8192 cmp $0x3fff+15,%ax jae 3f # |x| >= 32768 fsts (%rsp) cmpl $0xc67ff800,(%rsp) jb 2f # x > -16382 movl $0x5f000000,(%rsp) flds (%rsp) # 0x1p63 fld %st(1) fsub %st(1) faddp fucomp %st(1) fnstsw sahf je 2f # x - 0x1p63 + 0x1p63 == x movl $1,(%rsp) flds (%rsp) # 0x1p-149 fdiv %st(1) fstps (%rsp) # raise underflow 2: fld1 fld %st(1) frndint fxch %st(2) fsub %st(2) # st(0)=x-rint(x), st(1)=1, st(2)=rint(x) f2xm1 faddp # 2^(x-rint(x)) 1: fscale fstp %st(1) add $16,%rsp ret 3: xor %eax,%eax 4: cmp $0x3fff-64,%ax fld1 jb 1b # |x| < 0x1p-64 fstpt (%rsp) fistl 8(%rsp) fildl 8(%rsp) fsubrp %st(1) addl $0x3fff,8(%rsp) f2xm1 fld1 faddp # 2^(x-rint(x)) fldt (%rsp) # 2^rint(x) fmulp add $16,%rsp ret