54 |
#include "macros.inc" |
#include "macros.inc" |
55 |
#include "fplib.inc" |
#include "fplib.inc" |
56 |
|
|
57 |
TEXT_SEG(fplib, tanh) |
TEXT_SEG(fplib, tanh) |
58 |
FUNCTION(tanh) |
FUNCTION(tanh) |
59 |
|
|
60 |
GLOBAL(tanh) |
GLOBAL(tanh) |
61 |
/* check for x > 8.3177661895751953 [41051592] |
/* check for x > 8.3177661895751953 [41051592] |
69 |
CPC rA1,rB1 |
CPC rA1,rB1 |
70 |
CPC rA2,rB2 |
CPC rA2,rB2 |
71 |
CPC rA3,rB3 ; compare with 8.3177661895751953 = | ln(2^24)/2 | |
CPC rA3,rB3 ; compare with 8.3177661895751953 = | ln(2^24)/2 | |
72 |
BRCS _tanh_00 |
BRCS 1f |
73 |
LDI rA3,0x3F |
LDI rA3,0x3F |
74 |
LDI rA2,0x80 |
LDI rA2,0x80 |
75 |
LDI rA1,0x00 |
LDI rA1,0x00 |
77 |
BLD rA3,7 ; if x positivive _tanh(x) = 1 |
BLD rA3,7 ; if x positivive _tanh(x) = 1 |
78 |
RET |
RET |
79 |
|
|
80 |
_tanh_00: |
1: |
81 |
BLD rA3,7 |
BLD rA3,7 |
82 |
|
|
83 |
PUSH rA0 /* LDI rB3,1 */ |
/* PUSH rA0 */ LDI rB3,0 |
84 |
PUSH rA1 /* RCALL _ldexp ; x -> 2x */ |
/* */ LDI rB2,1 |
85 |
PUSH rA2 /* */ |
/* PUSH rA1 */ RCALL _U(ldexp) ; x -> 2x |
86 |
PUSH rA3 /* RCALL _exp */ |
/* PUSH rA2 */ |
87 |
RCALL _U(cosh) /* PUSH rA0 */ |
/* PUSH rA3 */ RCALL _U(exp) |
88 |
POP rB3 /* PUSH rA1 */ |
/* RCALL _U(cosh) */ PUSH rA0 |
89 |
POP rB2 /* PUSH rA2 */ |
/* POP rB3 */ PUSH rA1 |
90 |
POP rB1 /* PUSH rA3 */ |
/* POP rB2 */ PUSH rA2 |
91 |
POP rB0 /* CLR rB0 */ |
/* POP rB1 */ PUSH rA3 |
92 |
PUSH rA3 /* CLR rB1 */ |
/* POP rB0 */ CLR rB0 |
93 |
PUSH rA2 /* LDI rB2,0x80 */ |
/* PUSH rA3 */ CLR rB1 |
94 |
PUSH rA1 /* LDI rB3,0x3F ; B = 1.0 */ |
/* PUSH rA2 */ LDI rB2,0x80 |
95 |
PUSH rA0 /* RCALL ___addsf3 */ |
/* PUSH rA1 */ LDI rB3,0x3F ; B = 1.0 |
96 |
MOV rA3,rB3 /* POP rB3 */ |
/* PUSH rA0 */ RCALL _U(__addsf3) |
97 |
MOV rA2,rB2 /* POP rB2 */ |
/* MOV rA3,rB3 */ POP rB3 |
98 |
MOV rA1,rB1 /* POP rB1 */ |
/* MOV rA2,rB2 */ POP rB2 |
99 |
MOV rA0,rB0 /* POP rB0 ; B = exp(2x) */ |
/* MOV rA1,rB1 */ POP rB1 |
100 |
RCALL _U(sinh) /* PUSH rA0 */ |
/* MOV rA0,rB0 */ POP rB0 ; B = exp(2x) |
101 |
POP rB0 /* PUSH rA1 */ |
/* RCALL _U(sinh) */ PUSH rA0 |
102 |
POP rB1 /* PUSH rA2 */ |
/* POP rB0 */ PUSH rA1 |
103 |
POP rB2 /* PUSH rA3 */ |
/* POP rB1 */ PUSH rA2 |
104 |
POP rB3 /* CLR rA0 */ |
/* POP rB2 */ PUSH rA3 |
105 |
RJMP _U(__divsf3) /* CLR rA1 */ |
/* POP rB3 */ CLR rA0 |
106 |
/* LDI rA2,0x80 */ |
/* RJMP _U(__divsf3) */ CLR rA1 |
107 |
/* LDI rA3,0xBF ; A = -1.0 */ |
/* */ LDI rA2,0x80 |
108 |
/* RCALL ___addsf3 */ |
/* */ LDI rA3,0xBF ; A = -1.0 |
109 |
/* POP rB3 */ |
/* */ RCALL _U(__addsf3) |
110 |
/* POP rB2 */ |
/* */ POP rB3 |
111 |
/* POP rB1 */ |
/* */ POP rB2 |
112 |
/* POP rB0 ; B = exp(2x)+1 */ |
/* */ POP rB1 |
113 |
/* RJMP ___divsf3 */ |
/* */ POP rB0 ; B = exp(2x)+1 |
114 |
|
/* */ RJMP _U(__divsf3) |
115 |
|
|
116 |
ENDFUNC |
ENDFUNC |
117 |
|
|