|
|
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.