|
|
1.1 root 1: //////////
2: / /usr/src/libm/i387/asin87.s
3: / i387 mathematics library
4: / asin(d)
5: //////////
6:
7: RASIZE = 4
8:
9: .globl asin
10: .globl _asin
11: .globl _cfcc
12: .globl _edomain
13:
14: //////////
15: / double
16: / asin(d)
17: / double d;
18: /
19: / _asin() returns asin(%st).
20: / It sets the Carry flag iff a domain error occurs.
21: //////////
22:
23: d = RASIZE / arg offset
24:
25: asin:
26: fldl d(%esp) / Load argument d.
27:
28: _asin: / d
29: fld %st / d, d
30: fabs / abs(d), d
31: fld1 / 1, abs(d), d
32: fcompp / Compare 1 to abs(d) and pop twice.
33: call _cfcc
34: ja ?1 / -1 < d < 1, use atan.
35: je ?0 / d = 1 or d = -1
36: call _edomain / d < -1 or 1 < d, issue EDOM error
37: stc / and set the Carry flag
38: ret / and return.
39:
40: ?0:
41: fld1 / 1, d
42: fchs / -1, d
43: fldpi / pi, -1, d
44: fscale / pi/2, -1, d
45: fstp %st(1) / pi/2, d
46: fmul / For d = 1 or d = -1, asin(d) = d * pi/2.
47: clc / Clear the Carry flag.
48: ret
49:
50: ?1:
51: fld %st / d, d
52: fmul %st, %st / d*d, d
53: fld1 / 1, d*d, d
54: fsub / 1 - d*d, d
55: fsqrt / sqrt(1-d*d), d
56: fpatan / asin(d) = atan(d/sqrt(1-d*d))
57: clc / Clear the Carry flag.
58: ret
59:
60: / end of asin87.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.