]>
Commit | Line | Data |
---|---|---|
00406dff FB |
1 | /* |
2 | NetWinder Floating Point Emulator | |
3 | (c) Rebel.COM, 1998,1999 | |
4 | ||
5 | Direct questions, comments to Scott Bambrough <[email protected]> | |
6 | ||
7 | This program is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 2 of the License, or | |
10 | (at your option) any later version. | |
11 | ||
12 | This program is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
70539e18 | 18 | along with this program; if not, see <http://www.gnu.org/licenses/>. |
00406dff FB |
19 | */ |
20 | ||
21 | #include "fpa11.h" | |
6b4c305c | 22 | #include "fpu/softfloat.h" |
00406dff FB |
23 | #include "fpopcode.h" |
24 | ||
25 | float32 float32_exp(float32 Fm); | |
26 | float32 float32_ln(float32 Fm); | |
27 | float32 float32_sin(float32 rFm); | |
28 | float32 float32_cos(float32 rFm); | |
29 | float32 float32_arcsin(float32 rFm); | |
30 | float32 float32_arctan(float32 rFm); | |
31 | float32 float32_log(float32 rFm); | |
32 | float32 float32_tan(float32 rFm); | |
33 | float32 float32_arccos(float32 rFm); | |
34 | float32 float32_pow(float32 rFn,float32 rFm); | |
35 | float32 float32_pol(float32 rFn,float32 rFm); | |
36 | ||
37 | unsigned int SingleCPDO(const unsigned int opcode) | |
38 | { | |
39 | FPA11 *fpa11 = GET_FPA11(); | |
f090c9d4 | 40 | float32 rFm, rFn = float32_zero; |
00406dff FB |
41 | unsigned int Fd, Fm, Fn, nRc = 1; |
42 | ||
43 | Fm = getFm(opcode); | |
44 | if (CONSTANT_FM(opcode)) | |
45 | { | |
46 | rFm = getSingleConstant(Fm); | |
47 | } | |
48 | else | |
3b46e624 | 49 | { |
00406dff FB |
50 | switch (fpa11->fType[Fm]) |
51 | { | |
52 | case typeSingle: | |
53 | rFm = fpa11->fpreg[Fm].fSingle; | |
54 | break; | |
3b46e624 | 55 | |
00406dff FB |
56 | default: return 0; |
57 | } | |
58 | } | |
59 | ||
60 | if (!MONADIC_INSTRUCTION(opcode)) | |
61 | { | |
62 | Fn = getFn(opcode); | |
63 | switch (fpa11->fType[Fn]) | |
64 | { | |
65 | case typeSingle: | |
66 | rFn = fpa11->fpreg[Fn].fSingle; | |
67 | break; | |
68 | ||
69 | default: return 0; | |
70 | } | |
71 | } | |
72 | ||
73 | Fd = getFd(opcode); | |
74 | switch (opcode & MASK_ARITHMETIC_OPCODE) | |
75 | { | |
76 | /* dyadic opcodes */ | |
77 | case ADF_CODE: | |
20495218 | 78 | fpa11->fpreg[Fd].fSingle = float32_add(rFn,rFm, &fpa11->fp_status); |
00406dff FB |
79 | break; |
80 | ||
81 | case MUF_CODE: | |
82 | case FML_CODE: | |
20495218 | 83 | fpa11->fpreg[Fd].fSingle = float32_mul(rFn,rFm, &fpa11->fp_status); |
00406dff FB |
84 | break; |
85 | ||
86 | case SUF_CODE: | |
20495218 | 87 | fpa11->fpreg[Fd].fSingle = float32_sub(rFn,rFm, &fpa11->fp_status); |
00406dff FB |
88 | break; |
89 | ||
90 | case RSF_CODE: | |
20495218 | 91 | fpa11->fpreg[Fd].fSingle = float32_sub(rFm,rFn, &fpa11->fp_status); |
00406dff FB |
92 | break; |
93 | ||
94 | case DVF_CODE: | |
95 | case FDV_CODE: | |
20495218 | 96 | fpa11->fpreg[Fd].fSingle = float32_div(rFn,rFm, &fpa11->fp_status); |
00406dff FB |
97 | break; |
98 | ||
99 | case RDF_CODE: | |
100 | case FRD_CODE: | |
20495218 | 101 | fpa11->fpreg[Fd].fSingle = float32_div(rFm,rFn, &fpa11->fp_status); |
00406dff FB |
102 | break; |
103 | ||
104 | #if 0 | |
105 | case POW_CODE: | |
106 | fpa11->fpreg[Fd].fSingle = float32_pow(rFn,rFm); | |
107 | break; | |
108 | ||
109 | case RPW_CODE: | |
110 | fpa11->fpreg[Fd].fSingle = float32_pow(rFm,rFn); | |
111 | break; | |
112 | #endif | |
113 | ||
114 | case RMF_CODE: | |
20495218 | 115 | fpa11->fpreg[Fd].fSingle = float32_rem(rFn,rFm, &fpa11->fp_status); |
00406dff FB |
116 | break; |
117 | ||
118 | #if 0 | |
119 | case POL_CODE: | |
120 | fpa11->fpreg[Fd].fSingle = float32_pol(rFn,rFm); | |
121 | break; | |
122 | #endif | |
123 | ||
124 | /* monadic opcodes */ | |
125 | case MVF_CODE: | |
126 | fpa11->fpreg[Fd].fSingle = rFm; | |
127 | break; | |
128 | ||
129 | case MNF_CODE: | |
f090c9d4 | 130 | fpa11->fpreg[Fd].fSingle = float32_chs(rFm); |
00406dff FB |
131 | break; |
132 | ||
133 | case ABS_CODE: | |
f090c9d4 | 134 | fpa11->fpreg[Fd].fSingle = float32_abs(rFm); |
00406dff FB |
135 | break; |
136 | ||
137 | case RND_CODE: | |
138 | case URD_CODE: | |
20495218 | 139 | fpa11->fpreg[Fd].fSingle = float32_round_to_int(rFm, &fpa11->fp_status); |
00406dff FB |
140 | break; |
141 | ||
142 | case SQT_CODE: | |
20495218 | 143 | fpa11->fpreg[Fd].fSingle = float32_sqrt(rFm, &fpa11->fp_status); |
00406dff FB |
144 | break; |
145 | ||
146 | #if 0 | |
147 | case LOG_CODE: | |
148 | fpa11->fpreg[Fd].fSingle = float32_log(rFm); | |
149 | break; | |
150 | ||
151 | case LGN_CODE: | |
152 | fpa11->fpreg[Fd].fSingle = float32_ln(rFm); | |
153 | break; | |
154 | ||
155 | case EXP_CODE: | |
156 | fpa11->fpreg[Fd].fSingle = float32_exp(rFm); | |
157 | break; | |
158 | ||
159 | case SIN_CODE: | |
160 | fpa11->fpreg[Fd].fSingle = float32_sin(rFm); | |
161 | break; | |
162 | ||
163 | case COS_CODE: | |
164 | fpa11->fpreg[Fd].fSingle = float32_cos(rFm); | |
165 | break; | |
166 | ||
167 | case TAN_CODE: | |
168 | fpa11->fpreg[Fd].fSingle = float32_tan(rFm); | |
169 | break; | |
170 | ||
171 | case ASN_CODE: | |
172 | fpa11->fpreg[Fd].fSingle = float32_arcsin(rFm); | |
173 | break; | |
174 | ||
175 | case ACS_CODE: | |
176 | fpa11->fpreg[Fd].fSingle = float32_arccos(rFm); | |
177 | break; | |
178 | ||
179 | case ATN_CODE: | |
180 | fpa11->fpreg[Fd].fSingle = float32_arctan(rFm); | |
181 | break; | |
182 | #endif | |
183 | ||
184 | case NRM_CODE: | |
185 | break; | |
3b46e624 | 186 | |
00406dff FB |
187 | default: |
188 | { | |
189 | nRc = 0; | |
190 | } | |
191 | } | |
192 | ||
193 | if (0 != nRc) fpa11->fType[Fd] = typeSingle; | |
194 | return nRc; | |
195 | } | |
196 | ||
197 | #if 0 | |
198 | float32 float32_exp(float32 Fm) | |
199 | { | |
200 | //series | |
201 | } | |
202 | ||
203 | float32 float32_ln(float32 Fm) | |
204 | { | |
205 | //series | |
206 | } | |
207 | ||
208 | float32 float32_sin(float32 rFm) | |
209 | { | |
210 | //series | |
211 | } | |
212 | ||
213 | float32 float32_cos(float32 rFm) | |
214 | { | |
215 | //series | |
216 | } | |
217 | ||
218 | float32 float32_arcsin(float32 rFm) | |
219 | { | |
220 | //series | |
221 | } | |
222 | ||
223 | float32 float32_arctan(float32 rFm) | |
224 | { | |
225 | //series | |
226 | } | |
227 | ||
228 | float32 float32_arccos(float32 rFm) | |
229 | { | |
230 | //return float32_sub(halfPi,float32_arcsin(rFm)); | |
231 | } | |
232 | ||
233 | float32 float32_log(float32 rFm) | |
234 | { | |
235 | return float32_div(float32_ln(rFm),getSingleConstant(7)); | |
236 | } | |
237 | ||
238 | float32 float32_tan(float32 rFm) | |
239 | { | |
240 | return float32_div(float32_sin(rFm),float32_cos(rFm)); | |
241 | } | |
242 | ||
243 | float32 float32_pow(float32 rFn,float32 rFm) | |
244 | { | |
5fafdf24 | 245 | return float32_exp(float32_mul(rFm,float32_ln(rFn))); |
00406dff FB |
246 | } |
247 | ||
248 | float32 float32_pol(float32 rFn,float32 rFm) | |
249 | { | |
5fafdf24 | 250 | return float32_arctan(float32_div(rFn,rFm)); |
00406dff FB |
251 | } |
252 | #endif |