exp_ld.s raw

   1  .global expm1l
   2  .type expm1l,@function
   3  expm1l:
   4  	fldt 4(%esp)
   5  	fldl2e
   6  	fmulp
   7  	mov $0xc2820000,%eax
   8  	push %eax
   9  	flds (%esp)
  10  	pop %eax
  11  	fucomp %st(1)
  12  	fnstsw %ax
  13  	sahf
  14  	fld1
  15  	jb 1f
  16  		# x*log2e < -65, return -1 without underflow
  17  	fstp %st(1)
  18  	fchs
  19  	ret
  20  1:	fld %st(1)
  21  	fabs
  22  	fucom %st(1)
  23  	fnstsw %ax
  24  	fstp %st(0)
  25  	fstp %st(0)
  26  	sahf
  27  	ja 1f
  28  	f2xm1
  29  	ret
  30  1:	call 1f
  31  	fld1
  32  	fsubrp
  33  	ret
  34  
  35  .global exp2l
  36  .global __exp2l
  37  .hidden __exp2l
  38  .type exp2l,@function
  39  exp2l:
  40  __exp2l:
  41  	fldt 4(%esp)
  42  1:	sub $12,%esp
  43  	fld %st(0)
  44  	fstpt (%esp)
  45  	mov 8(%esp),%ax
  46  	and $0x7fff,%ax
  47  	cmp $0x3fff+13,%ax
  48  	jb 4f             # |x| < 8192
  49  	cmp $0x3fff+15,%ax
  50  	jae 3f            # |x| >= 32768
  51  	fsts (%esp)
  52  	cmpl $0xc67ff800,(%esp)
  53  	jb 2f             # x > -16382
  54  	movl $0x5f000000,(%esp)
  55  	flds (%esp)       # 0x1p63
  56  	fld %st(1)
  57  	fsub %st(1)
  58  	faddp
  59  	fucomp %st(1)
  60  	fnstsw
  61  	sahf
  62  	je 2f             # x - 0x1p63 + 0x1p63 == x
  63  	movl $1,(%esp)
  64  	flds (%esp)       # 0x1p-149
  65  	fdiv %st(1)
  66  	fstps (%esp)      # raise underflow
  67  2:	fld1
  68  	fld %st(1)
  69  	frndint
  70  	fxch %st(2)
  71  	fsub %st(2)       # st(0)=x-rint(x), st(1)=1, st(2)=rint(x)
  72  	f2xm1
  73  	faddp             # 2^(x-rint(x))
  74  1:	fscale
  75  	fstp %st(1)
  76  	add $12,%esp
  77  	ret
  78  3:	xor %eax,%eax
  79  4:	cmp $0x3fff-64,%ax
  80  	fld1
  81  	jb 1b             # |x| < 0x1p-64
  82  	fstpt (%esp)
  83  	fistl 8(%esp)
  84  	fildl 8(%esp)
  85  	fsubrp %st(1)
  86  	addl $0x3fff,8(%esp)
  87  	f2xm1
  88  	fld1
  89  	faddp             # 2^(x-rint(x))
  90  	fldt (%esp)       # 2^rint(x)
  91  	fmulp
  92  	add $12,%esp
  93  	ret
  94