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