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