|
|
1.1 root 1: //////////
2: / /usr/src/libm/i387/tanh87.s
3: / i387 mathematics library
4: / tanh(d)
5: //////////
6:
7: RASIZE = 4
8:
9: .globl tanh
10: .globl _exp
11: .globl _tstcc
12:
13: //////////
14: / double
15: / tanh(d)
16: / double d;
17: /
18: / tanh(d) = (exp(d) - exp(-d)) / (exp(d) + exp(-d))
19: / = (1 - exp(-2 * d)) / (1 + exp(-2 * d)) (used for d > 0)
20: / = - (1 - exp(2 * d)) / (1 + exp(2 * d)) (used for d < 0)
21: //////////
22:
23: d = RASIZE / arg offset
24:
25: tanh:
26: fldl d(%esp) / Load argument d.
27:
28: call _tstcc / Check sign of d.
29: je ?1 / d is zero, just return it.
30: jb ?0 / Jump if negative.
31: fchs / Change positive to negative.
32:
33: ?0:
34: pushf / Save the flags.
35: fadd %st, %st / 2 * d
36: call _exp / exp(2 * d)
37: fld1 / 1, exp(2 * d)
38: fsub %st, %st(1) / 1 - exp(2 * d), exp(2 * d)
39: fld1 / 1, 1 - exp(2 * d), exp(2 * d)
40: faddp %st(2), %st / 1 - exp(2 * d), 1 + exp(2 * d)
41: fdiv / (1 - exp(2 * d)) / (1 + exp(2 * d))
42: popf / Restore the flags.
43: ja ?1 / d was positive, done.
44: fchs / d was negative, flip result sign.
45:
46: ?1:
47: ret
48:
49: / end of tanh87.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.