1 // cgen-fpu.cxx - CPU components. -*- C++ -*-
2 // CGEN fpu support for SID
4 // Copyright (C) 2005, 2010 Red Hat.
5 // This file is part of SID and is licensed under the GPL.
6 // See the file COPYING.SID for conditions for redistribution.
11 using namespace sidutil;
17 cgen_fp_ops::addsf (const cgen_fpu* fpu, SF x, SF y)
19 fp r = fp (x) + fp (y);
20 check_result (fpu, r);
26 SF cgen_fp_ops::subsf (const cgen_fpu* fpu, SF x, SF y)
28 fp r = fp (x) - fp (y);
29 check_result (fpu, r);
35 SF cgen_fp_ops::mulsf (const cgen_fpu* fpu, SF x, SF y)
37 fp r = fp (x) * fp (y);
38 check_result (fpu, r);
44 SF cgen_fp_ops::divsf (const cgen_fpu* fpu, SF x, SF y)
46 fp r = fp (x) / fp (y);
47 check_result (fpu, r);
53 SF cgen_fp_ops::negsf (const cgen_fpu* fpu, SF x)
57 check_result (fpu, r);
63 SF cgen_fp_ops::abssf (const cgen_fpu* fpu, SF x)
67 check_result (fpu, r);
73 SF cgen_fp_ops::sqrtsf (const cgen_fpu* fpu, SF x)
77 check_result (fpu, r);
84 #if 0 // not implemented yet
85 SF cgen_fp_ops::invsf (const cgen_fpu*, SF);
86 SF cgen_fp_ops::cossf (const cgen_fpu*, SF);
87 SF cgen_fp_ops::sinsf (const cgen_fpu*, SF);
88 SF cgen_fp_ops::minsf (const cgen_fpu*, SF, SF);
89 SF cgen_fp_ops::maxsf (const cgen_fpu*, SF, SF);
92 int cgen_fp_ops::eqsf (const cgen_fpu*, SF x, SF y)
94 return fp (x) == fp (y);
96 int cgen_fp_ops::nesf (const cgen_fpu*, SF x, SF y)
98 return fp (x) != fp (y);
100 int cgen_fp_ops::ltsf (const cgen_fpu*, SF x, SF y)
102 return fp (x) < fp (y);
104 int cgen_fp_ops::lesf (const cgen_fpu*, SF x, SF y)
106 return fp (x) <= fp (y);
108 int cgen_fp_ops::gtsf (const cgen_fpu*, SF x, SF y)
110 return fp (x) > fp (y);
112 int cgen_fp_ops::gesf (const cgen_fpu*, SF x, SF y)
114 return fp (x) >= fp (y);
117 int cgen_fp_ops::unorderedsf (const cgen_fpu*, SF x, SF y)
121 return f1.is_nan () || f2.is_nan ();
125 DF cgen_fp_ops::adddf (const cgen_fpu *fpu, DF x, DF y)
127 fp r = fp (x) + fp (y);
128 check_result (fpu, r);
134 DF cgen_fp_ops::subdf (const cgen_fpu *fpu, DF x, DF y)
136 fp r = fp (x) - fp (y);
137 check_result (fpu, r);
143 DF cgen_fp_ops::muldf (const cgen_fpu *fpu, DF x, DF y)
145 fp r = fp (x) * fp (y);
146 check_result (fpu, r);
152 DF cgen_fp_ops::divdf (const cgen_fpu *fpu, DF x, DF y)
154 fp r = fp (x) / fp (y);
155 check_result (fpu, r);
161 DF cgen_fp_ops::negdf (const cgen_fpu *fpu, DF x)
165 check_result (fpu, r);
171 DF cgen_fp_ops::absdf (const cgen_fpu *fpu, DF x)
175 check_result (fpu, r);
181 DF cgen_fp_ops::sqrtdf (const cgen_fpu *fpu, DF x)
185 check_result (fpu, r);
192 DF cgen_fp_ops::invdf (const cgen_fpu*, DF);
193 DF cgen_fp_ops::cosdf (const cgen_fpu*, DF);
194 DF cgen_fp_ops::sindf (const cgen_fpu*, DF);
195 DF cgen_fp_ops::mindf (const cgen_fpu*, DF, DF);
196 DF cgen_fp_ops::maxdf (const cgen_fpu*, DF, DF);
199 int cgen_fp_ops::eqdf (const cgen_fpu *fpu, DF x, DF y)
201 return fp (x) == fp (y);
204 int cgen_fp_ops::nedf (const cgen_fpu *fpu, DF x, DF y)
206 return fp (x) == fp (y);
208 int cgen_fp_ops::ltdf (const cgen_fpu *fpu, DF x, DF y)
210 return fp (x) < fp (y);
212 int cgen_fp_ops::ledf (const cgen_fpu *fpu, DF x, DF y)
214 return fp (x) <= fp (y);
216 int cgen_fp_ops::gtdf (const cgen_fpu *fpu, DF x, DF y)
218 return fp (x) > fp (y);
220 int cgen_fp_ops::gedf (const cgen_fpu *fpu, DF x, DF y)
222 return fp (x) >= fp (y);
225 int cgen_fp_ops::unordereddf (const cgen_fpu *fpu, DF x, DF y)
229 return f1.is_nan () || f2.is_nan ();
232 /* SF/DF conversion ops */
234 DF cgen_fp_ops::fextsfdf (const cgen_fpu *fpu, int how, SF x)
242 SF cgen_fp_ops::ftruncdfsf (const cgen_fpu *fpu, int how, DF x)
250 SF cgen_fp_ops::floatsisf (const cgen_fpu* fpu, int how, SI x)
252 fp r = fp::from_int (x);
253 check_result (fpu, r);
259 SF cgen_fp_ops::floatdisf (const cgen_fpu *fpu, int how, DI x)
261 fp r = fp::from_int (x);
262 check_result (fpu, r);
268 #if 0 // not implemented yet
269 SF cgen_fp_ops::ufloatsisf (const cgen_fpu*, int how, USI);
270 SF cgen_fp_ops::ufloatdisf (const cgen_fpu*, int how, UDI);
271 #endif // not implemented yet
273 SI cgen_fp_ops::fixsfsi (const cgen_fpu *fpu, int how, SF x)
277 r.integer (tmp, fp::round_default);
281 DI cgen_fp_ops::fixsfdi (const cgen_fpu *fpu, int how, SF x)
285 r.integer (tmp, fp::round_default);
289 #if 0 // not implemented yet
290 USI cgen_fp_ops::ufixsfsi (const cgen_fpu*, int how, SF);
291 UDI cgen_fp_ops::ufixsfdi (const cgen_fpu*, int how, SF);
294 DF cgen_fp_ops::floatsidf (const cgen_fpu *fpu, int how, SI x)
296 fp r = fp::from_int (x);
297 check_result (fpu, r);
303 DF cgen_fp_ops::floatdidf (const cgen_fpu *fpu, int how, DI x)
305 fp r = fp::from_int (x);
306 check_result (fpu, r);
313 DF cgen_fp_ops::ufloatsidf (const cgen_fpu*, int how, USI);
314 DF cgen_fp_ops::ufloatdidf (const cgen_fpu*, int how, UDI);
317 SI cgen_fp_ops::fixdfsi (const cgen_fpu *fpu, int how, DF x)
321 r.integer (tmp, fp::round_default);
325 DI cgen_fp_ops::fixdfdi (const cgen_fpu *fpu, int how, DF x)
329 r.integer (tmp, fp::round_default);
334 USI cgen_fp_ops::ufixdfsi (const cgen_fpu*, int how, DF);
335 UDI cgen_fp_ops::ufixdfdi (const cgen_fpu*, int how, DF);
337 /* XF mode support (kept separate 'cus not always present) */
338 XF cgen_fp_ops::addxf (const cgen_fpu*, XF, XF);
339 XF cgen_fp_ops::subxf (const cgen_fpu*, XF, XF);
340 XF cgen_fp_ops::mulxf (const cgen_fpu*, XF, XF);
341 XF cgen_fp_ops::divxf (const cgen_fpu*, XF, XF);
342 XF cgen_fp_ops::negxf (const cgen_fpu*, XF);
343 XF cgen_fp_ops::absxf (const cgen_fpu*, XF);
344 XF cgen_fp_ops::sqrtxf (const cgen_fpu*, XF);
345 XF cgen_fp_ops::invxf (const cgen_fpu*, XF);
346 XF cgen_fp_ops::cosxf (const cgen_fpu*, XF);
347 XF cgen_fp_ops::sinxf (const cgen_fpu*, XF);
348 XF cgen_fp_ops::minxf (const cgen_fpu*, XF, XF);
349 XF cgen_fp_ops::maxxf (const cgen_fpu*, XF, XF);
351 int cgen_fp_ops::eqxf (const cgen_fpu*, XF, XF);
352 int cgen_fp_ops::nexf (const cgen_fpu*, XF, XF);
353 int cgen_fp_ops::ltxf (const cgen_fpu*, XF, XF);
354 int cgen_fp_ops::lexf (const cgen_fpu*, XF, XF);
355 int cgen_fp_ops::gtxf (const cgen_fpu*, XF, XF);
356 int cgen_fp_ops::gexf (const cgen_fpu*, XF, XF);
358 XF cgen_fp_ops::extsfxf (const cgen_fpu*, int how, SF);
359 XF cgen_fp_ops::extdfxf (const cgen_fpu*, int how, DF);
360 SF cgen_fp_ops::truncxfsf (const cgen_fpu*, int how, XF);
361 DF cgen_fp_ops::truncxfdf (const cgen_fpu*, int how, XF);
363 XF cgen_fp_ops::floatsixf (const cgen_fpu*, int how, SI);
364 XF cgen_fp_ops::floatdixf (const cgen_fpu*, int how, DI);
365 XF cgen_fp_ops::ufloatsixf (const cgen_fpu*, int how, USI);
366 XF cgen_fp_ops::ufloatdixf (const cgen_fpu*, int how, UDI);
368 SI cgen_fp_ops::fixxfsi (const cgen_fpu*, int how, XF);
369 DI cgen_fp_ops::fixxfdi (const cgen_fpu*, int how, XF);
370 USI cgen_fp_ops::ufixxfsi (const cgen_fpu*, int how, XF);
371 UDI cgen_fp_ops::ufixxfdi (const cgen_fpu*, int how, XF);
373 /* TF mode support (kept separate 'cus not always present) */
374 TF cgen_fp_ops::addtf (const cgen_fpu*, TF, TF);
375 TF cgen_fp_ops::subtf (const cgen_fpu*, TF, TF);
376 TF cgen_fp_ops::multf (const cgen_fpu*, TF, TF);
377 TF cgen_fp_ops::divtf (const cgen_fpu*, TF, TF);
378 TF cgen_fp_ops::negtf (const cgen_fpu*, TF);
379 TF cgen_fp_ops::abstf (const cgen_fpu*, TF);
380 TF cgen_fp_ops::sqrttf (const cgen_fpu*, TF);
381 TF cgen_fp_ops::invtf (const cgen_fpu*, TF);
382 TF cgen_fp_ops::costf (const cgen_fpu*, TF);
383 TF cgen_fp_ops::sintf (const cgen_fpu*, TF);
384 TF cgen_fp_ops::mintf (const cgen_fpu*, TF, TF);
385 TF cgen_fp_ops::maxtf (const cgen_fpu*, TF, TF);
387 int cgen_fp_ops::eqtf (const cgen_fpu*, TF, TF);
388 int cgen_fp_ops::netf (const cgen_fpu*, TF, TF);
389 int cgen_fp_ops::lttf (const cgen_fpu*, TF, TF);
390 int cgen_fp_ops::letf (const cgen_fpu*, TF, TF);
391 int cgen_fp_ops::gttf (const cgen_fpu*, TF, TF);
392 int cgen_fp_ops::getf (const cgen_fpu*, TF, TF);
394 TF cgen_fp_ops::extsftf (const cgen_fpu*, int how, SF);
395 TF cgen_fp_ops::extdftf (const cgen_fpu*, int how, DF);
396 SF cgen_fp_ops::trunctfsf (const cgen_fpu*, int how, TF);
397 DF cgen_fp_ops::trunctfdf (const cgen_fpu*, int how, TF);
399 TF cgen_fp_ops::floatsitf (const cgen_fpu*, int how, SI);
400 TF cgen_fp_ops::floatditf (const cgen_fpu*, int how, DI);
401 TF cgen_fp_ops::ufloatsitf (const cgen_fpu*, int how, USI);
402 TF cgen_fp_ops::ufloatditf (const cgen_fpu*, int how, UDI);
404 SI cgen_fp_ops::fixtfsi (const cgen_fpu*, int how, TF);
405 DI cgen_fp_ops::fixtfdi (const cgen_fpu*, int how, TF);
406 USI cgen_fp_ops::ufixtfsi (const cgen_fpu*, int how, TF);
407 UDI cgen_fp_ops::ufixtfdi (const cgen_fpu*, int how, TF);
408 #endif // not implemented yet