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