|
|
1.1 ! root 1: ////////// ! 2: / libm 8087 ! 3: / atan2(y, x) ! 4: ////////// ! 5: ! 6: #include "larges.h" ! 7: #include "ifno8087.h" ! 8: ! 9: .globl atan2_ ! 10: .globl atan ! 11: .globl cfcc87 ! 12: .globl tstcc ! 13: ! 14: ////////// ! 15: / double ! 16: / atan2(y, x) ! 17: / double y, x; ! 18: ////////// ! 19: ! 20: y = RASIZE / y arg offset ! 21: x = RASIZE+8 / x arg offset ! 22: ! 23: atan2_: ! 24: ifno8087(_atan2_) ! 25: mov bx, sp ! 26: fdld Pss y(bx) / Load argument y. ! 27: fdld Pss x(bx) / Load argument x. ! 28: ! 29: atan2: / x, y ! 30: Gcall tstcc ! 31: jne 1f / Jump if x nonzero. ! 32: fcompp / x = 0, compare 0 to y and pop x and y. ! 33: Gcall cfcc87 ! 34: fild cs:minus1 / -1 ! 35: fldpi / pi, -1 ! 36: fscale / pi/2, -1 ! 37: fstp st1 / pi/2 ! 38: jbe 0f / 0 <= y, return pi/2. ! 39: fchs / 0 > y, return -pi/2. ! 40: ! 41: 0: Gret ! 42: ! 43: 1: pushf / Save flags with sign of x. ! 44: fld st1 / y, x, y ! 45: fdivr / y/x, y ! 46: Gcall atan / atan(y/x), y ! 47: popf / Restore flags. ! 48: jb 2f / x < 0, must adjust by pi. ! 49: fstp st1 / atan(y/x) ! 50: Gret ! 51: ! 52: 2: fxch / y, atan(y/x) ! 53: Gcall tstcc ! 54: fstp st / atan(y/x) ! 55: fldpi / pi, atan(y/x) ! 56: jae 3f / y >= 0, add pi. ! 57: fchs / y < 0, subtract pi. ! 58: ! 59: 3: fadd / atan(y/x) + pi ! 60: Gret ! 61: ! 62: / Data. ! 63: minus1: .word -1 ! 64: ! 65: / end of atan287.m
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.