1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
/*
* |-----------------------------------------------------------|
* | Copyright (c) 1991, 1990 MIPS Computer Systems, Inc. |
* | All Rights Reserved |
* |-----------------------------------------------------------|
* | Restricted Rights Legend |
* | Use, duplication, or disclosure by the Government is |
* | subject to restrictions as set forth in |
* | subparagraph (c)(1)(ii) of the Rights in Technical |
* | Data and Computer Software Clause of DFARS 252.227-7013. |
* | MIPS Computer Systems, Inc. |
* | 950 DeGuigne Avenue |
* | Sunnyvale, California 94088-3650, USA |
* |-----------------------------------------------------------|
*/
/* $Header: tanh.s,v 3000.5.1.3 92/02/03 16:50:49 zaineb Exp $ */
/* Algorithm from Cody and Waite. */
#include <kxmips.h>
#define ln3o2 0.54930614433405484570
#define eps 3.72529029846191406250e-9
#define p2 -0.96437492777225469787e+0
#define p1 -0.99225929672236083313e+2
#define p0 -0.16134119023996228053e+4
#define q2 +0.11274474380534949335e+3
#define q1 +0.22337720718962312926e+4
#define q0 +0.48402357071988688686e+4
#define xbig 19.061547465398498
#define FSIZE 16
.text
.globl tanh
.ent tanh
tanh:
.frame sp, FSIZE, ra
subu sp, FSIZE
sw ra, FSIZE-4(sp)
.prologue 1
li.d $f8, ln3o2
abs.d $f0, $f12
c.olt.d $f8, $f0
li.d $f8, eps
bc1t calltanh2
c.ult.d $f0, $f8
bc1t tanh1
mul.d $f2, $f0, $f0
li.d $f10, p2
li.d $f8, q2
mul.d $f4, $f2, $f10
add.d $f6, $f2, $f8
li.d $f10, p1
mul.d $f6, $f2
add.d $f4, $f10
li.d $f8, q1
mul.d $f4, $f2
add.d $f6, $f8
li.d $f10, p0
mul.d $f6, $f2
add.d $f4, $f10
li.d $f8, q0
mul.d $f4, $f2
add.d $f6, $f8
div.d $f4, $f6
mul.d $f4, $f12
add.d $f0, $f4, $f12
j ret
tanh1:
mov.d $f0, $f12
j ret
calltanh2:
jal tanh2
j ret
.end tanh
.ent tanh2
tanh2:
.frame sp, FSIZE, ra
subu sp, FSIZE
sw ra, FSIZE-4(sp)
.prologue 1
li.d $f10, xbig
swc1 $f13, 20(sp)
c.ole.d $f0, $f10
add.d $f12, $f0, $f0
bc1f tanh4
jal exp
li.d $f10, 1.0
li.d $f8, 2.0
add.d $f0, $f10
div.d $f0, $f8, $f0
lw t0, 20(sp)
bltz t0, 1f
sub.d $f0, $f10, $f0
j ret
1: sub.d $f0, $f0, $f10
j ret
tanh4:
lw t0, 20(sp)
li.d $f0, 1.0
bltz t0, 1f
j ret1
1: neg.d $f0
j ret1
ret: lw ra, FSIZE-4(sp)
ret1: addu sp, FSIZE
j ra
.end tanh2
|