|
|
1.1 root 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
18: along with this program; if not, write to the Free Software
19: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20: */
21:
22: #include "fpa11.h"
23: #include "softfloat.h"
24: #include "fpopcode.h"
25:
26: floatx80 floatx80_exp(floatx80 Fm);
27: floatx80 floatx80_ln(floatx80 Fm);
28: floatx80 floatx80_sin(floatx80 rFm);
29: floatx80 floatx80_cos(floatx80 rFm);
30: floatx80 floatx80_arcsin(floatx80 rFm);
31: floatx80 floatx80_arctan(floatx80 rFm);
32: floatx80 floatx80_log(floatx80 rFm);
33: floatx80 floatx80_tan(floatx80 rFm);
34: floatx80 floatx80_arccos(floatx80 rFm);
35: floatx80 floatx80_pow(floatx80 rFn,floatx80 rFm);
36: floatx80 floatx80_pol(floatx80 rFn,floatx80 rFm);
37:
38: unsigned int ExtendedCPDO(const unsigned int opcode)
39: {
40: FPA11 *fpa11 = GET_FPA11();
41: floatx80 rFm, rFn;
42: unsigned int Fd, Fm, Fn, nRc = 1;
43:
44: //printk("ExtendedCPDO(0x%08x)\n",opcode);
45:
46: Fm = getFm(opcode);
47: if (CONSTANT_FM(opcode))
48: {
49: rFm = getExtendedConstant(Fm);
50: }
51: else
52: {
53: switch (fpa11->fType[Fm])
54: {
55: case typeSingle:
56: rFm = float32_to_floatx80(fpa11->fpreg[Fm].fSingle, &fpa11->fp_status);
57: break;
58:
59: case typeDouble:
60: rFm = float64_to_floatx80(fpa11->fpreg[Fm].fDouble, &fpa11->fp_status);
61: break;
62:
63: case typeExtended:
64: rFm = fpa11->fpreg[Fm].fExtended;
65: break;
66:
67: default: return 0;
68: }
69: }
70:
71: if (!MONADIC_INSTRUCTION(opcode))
72: {
73: Fn = getFn(opcode);
74: switch (fpa11->fType[Fn])
75: {
76: case typeSingle:
77: rFn = float32_to_floatx80(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status);
78: break;
79:
80: case typeDouble:
81: rFn = float64_to_floatx80(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status);
82: break;
83:
84: case typeExtended:
85: rFn = fpa11->fpreg[Fn].fExtended;
86: break;
87:
88: default: return 0;
89: }
90: }
91:
92: Fd = getFd(opcode);
93: switch (opcode & MASK_ARITHMETIC_OPCODE)
94: {
95: /* dyadic opcodes */
96: case ADF_CODE:
97: fpa11->fpreg[Fd].fExtended = floatx80_add(rFn,rFm, &fpa11->fp_status);
98: break;
99:
100: case MUF_CODE:
101: case FML_CODE:
102: fpa11->fpreg[Fd].fExtended = floatx80_mul(rFn,rFm, &fpa11->fp_status);
103: break;
104:
105: case SUF_CODE:
106: fpa11->fpreg[Fd].fExtended = floatx80_sub(rFn,rFm, &fpa11->fp_status);
107: break;
108:
109: case RSF_CODE:
110: fpa11->fpreg[Fd].fExtended = floatx80_sub(rFm,rFn, &fpa11->fp_status);
111: break;
112:
113: case DVF_CODE:
114: case FDV_CODE:
115: fpa11->fpreg[Fd].fExtended = floatx80_div(rFn,rFm, &fpa11->fp_status);
116: break;
117:
118: case RDF_CODE:
119: case FRD_CODE:
120: fpa11->fpreg[Fd].fExtended = floatx80_div(rFm,rFn, &fpa11->fp_status);
121: break;
122:
123: #if 0
124: case POW_CODE:
125: fpa11->fpreg[Fd].fExtended = floatx80_pow(rFn,rFm);
126: break;
127:
128: case RPW_CODE:
129: fpa11->fpreg[Fd].fExtended = floatx80_pow(rFm,rFn);
130: break;
131: #endif
132:
133: case RMF_CODE:
134: fpa11->fpreg[Fd].fExtended = floatx80_rem(rFn,rFm, &fpa11->fp_status);
135: break;
136:
137: #if 0
138: case POL_CODE:
139: fpa11->fpreg[Fd].fExtended = floatx80_pol(rFn,rFm);
140: break;
141: #endif
142:
143: /* monadic opcodes */
144: case MVF_CODE:
145: fpa11->fpreg[Fd].fExtended = rFm;
146: break;
147:
148: case MNF_CODE:
149: rFm.high ^= 0x8000;
150: fpa11->fpreg[Fd].fExtended = rFm;
151: break;
152:
153: case ABS_CODE:
154: rFm.high &= 0x7fff;
155: fpa11->fpreg[Fd].fExtended = rFm;
156: break;
157:
158: case RND_CODE:
159: case URD_CODE:
160: fpa11->fpreg[Fd].fExtended = floatx80_round_to_int(rFm, &fpa11->fp_status);
161: break;
162:
163: case SQT_CODE:
164: fpa11->fpreg[Fd].fExtended = floatx80_sqrt(rFm, &fpa11->fp_status);
165: break;
166:
167: #if 0
168: case LOG_CODE:
169: fpa11->fpreg[Fd].fExtended = floatx80_log(rFm);
170: break;
171:
172: case LGN_CODE:
173: fpa11->fpreg[Fd].fExtended = floatx80_ln(rFm);
174: break;
175:
176: case EXP_CODE:
177: fpa11->fpreg[Fd].fExtended = floatx80_exp(rFm);
178: break;
179:
180: case SIN_CODE:
181: fpa11->fpreg[Fd].fExtended = floatx80_sin(rFm);
182: break;
183:
184: case COS_CODE:
185: fpa11->fpreg[Fd].fExtended = floatx80_cos(rFm);
186: break;
187:
188: case TAN_CODE:
189: fpa11->fpreg[Fd].fExtended = floatx80_tan(rFm);
190: break;
191:
192: case ASN_CODE:
193: fpa11->fpreg[Fd].fExtended = floatx80_arcsin(rFm);
194: break;
195:
196: case ACS_CODE:
197: fpa11->fpreg[Fd].fExtended = floatx80_arccos(rFm);
198: break;
199:
200: case ATN_CODE:
201: fpa11->fpreg[Fd].fExtended = floatx80_arctan(rFm);
202: break;
203: #endif
204:
205: case NRM_CODE:
206: break;
207:
208: default:
209: {
210: nRc = 0;
211: }
212: }
213:
214: if (0 != nRc) fpa11->fType[Fd] = typeExtended;
215: return nRc;
216: }
217:
218: #if 0
219: floatx80 floatx80_exp(floatx80 Fm)
220: {
221: //series
222: }
223:
224: floatx80 floatx80_ln(floatx80 Fm)
225: {
226: //series
227: }
228:
229: floatx80 floatx80_sin(floatx80 rFm)
230: {
231: //series
232: }
233:
234: floatx80 floatx80_cos(floatx80 rFm)
235: {
236: //series
237: }
238:
239: floatx80 floatx80_arcsin(floatx80 rFm)
240: {
241: //series
242: }
243:
244: floatx80 floatx80_arctan(floatx80 rFm)
245: {
246: //series
247: }
248:
249: floatx80 floatx80_log(floatx80 rFm)
250: {
251: return floatx80_div(floatx80_ln(rFm),getExtendedConstant(7));
252: }
253:
254: floatx80 floatx80_tan(floatx80 rFm)
255: {
256: return floatx80_div(floatx80_sin(rFm),floatx80_cos(rFm));
257: }
258:
259: floatx80 floatx80_arccos(floatx80 rFm)
260: {
261: //return floatx80_sub(halfPi,floatx80_arcsin(rFm));
262: }
263:
264: floatx80 floatx80_pow(floatx80 rFn,floatx80 rFm)
265: {
266: return floatx80_exp(floatx80_mul(rFm,floatx80_ln(rFn)));
267: }
268:
269: floatx80 floatx80_pol(floatx80 rFn,floatx80 rFm)
270: {
271: return floatx80_arctan(floatx80_div(rFn,rFm));
272: }
273: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.