|
|
1.1 root 1: //////////
2: / libm 8087
3: / tan(d)
4: //////////
5:
6: #include "larges.h"
7: #include "ifno8087.h"
8:
9: .globl tan_
10: .globl tan
11: .globl cfcc87
12: .globl tstcc
13:
14: //////////
15: / double
16: / tan(angle)
17: / double angle;
18: //////////
19:
20: d = RASIZE / arg offset
21:
22: tan_:
23: ifno8087(_tan_)
24: mov bx, sp
25: fdld Pss d(bx) / Load argument d.
26:
27: Gcall tan / Get x, y.
28: fdiv / tan = y / x.
29: Gret
30:
31: //////////
32: / tan() is passed an argument d on the 8087 stack
33: / and returns x and y on 8087 stack.
34: /
35: / tan() reduces angle d to octant 0,
36: / uses fptan to get a sine y and cosine x,
37: / and puts x and y back to the correct octant.
38: /
39: / Uses fptan, which requires 0 <= d < pi/4.
40: //////////
41:
42: tan: / d
43: fild cs:minus2 / -2, d
44: fldpi / pi, -2, d
45: fscale / pi/4, -2, d
46: fstp st1 / pi/4, d
47: fxch / d, pi/4
48:
49: 0: Gcall tstcc / Is d < 0.?
50: jnb 1f / No, ok.
51: fldpi
52: fld st
53: fadd
54: fadd / Add 2 * pi.
55: jmp 0b / Repeat until d is positive.
56:
57: 1: fprem / Reduce angle to octant 0.
58: Gcall cfcc87 / Set condition codes.
59: jpe 1b / Repeat until fully reduced.
60: fstp st1 / Pop pi/4, retain reduced arg.
61: fptan / x = r*cos(arg), y=r*sin(arg)
62:
63: / cos(pi+d) = -cos(d), sin(pi+d) = -sin(d).
64: jnc 2f / Test for c0 set by cfcc87 above.
65: fchs / Octants 4, 5, 6, 7
66: fxch / need both
67: fchs / signs
68: fxch / changed.
69:
70: / cos(pi/2+d) = -sin(d), sin(pi/2+d) = cos(d).
71: 2: jnz 3f / Test for c3 set by cfcc87 above.
72: fxch / Octants 2, 3, 6, 7
73: fchs / need switch and sign change.
74:
75: / cos(pi/4+d) = (cos(d)-sin(d))*k, sin(pi/4+d) = (cos(d)+sin(d))*k.
76: 3: testb ah, $2 / Test for c1 set by cfcc87 above.
77: jz 4f / Done.
78: fld st / Octants 1, 3, 5, 7
79: fld st2 / need x-y and x+y.
80: fadd / x+y, x, y
81: fxch st2 / y, x, x+y
82: fsub / x-y, x+y
83:
84: 4: Gret
85:
86: //////////
87: / data
88: //////////
89: minus2: .word -2
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.