cgen-accfp.c revision 1.1 1 1.1 christos /* Accurate fp support for CGEN-based simulators.
2 1.1 christos Copyright (C) 1999 Cygnus Solutions.
3 1.1 christos
4 1.1 christos This implemention assumes:
5 1.1 christos typedef USI SF;
6 1.1 christos typedef UDI DF;
7 1.1 christos
8 1.1 christos TODO:
9 1.1 christos - lazy encoding/decoding
10 1.1 christos - checking return code (say by callback)
11 1.1 christos - proper rounding
12 1.1 christos */
13 1.1 christos
14 1.1 christos #include "sim-main.h"
15 1.1 christos #include "sim-fpu.h"
16 1.1 christos
17 1.1 christos /* SF mode support */
18 1.1 christos
19 1.1 christos static SF
20 1.1 christos addsf (CGEN_FPU* fpu, SF x, SF y)
21 1.1 christos {
22 1.1 christos sim_fpu op1;
23 1.1 christos sim_fpu op2;
24 1.1 christos sim_fpu ans;
25 1.1 christos unsigned32 res;
26 1.1 christos sim_fpu_status status;
27 1.1 christos
28 1.1 christos sim_fpu_32to (&op1, x);
29 1.1 christos sim_fpu_32to (&op2, y);
30 1.1 christos status = sim_fpu_add (&ans, &op1, &op2);
31 1.1 christos if (status != 0)
32 1.1 christos (*fpu->ops->error) (fpu, status);
33 1.1 christos sim_fpu_to32 (&res, &ans);
34 1.1 christos
35 1.1 christos return res;
36 1.1 christos }
37 1.1 christos
38 1.1 christos static SF
39 1.1 christos subsf (CGEN_FPU* fpu, SF x, SF y)
40 1.1 christos {
41 1.1 christos sim_fpu op1;
42 1.1 christos sim_fpu op2;
43 1.1 christos sim_fpu ans;
44 1.1 christos unsigned32 res;
45 1.1 christos sim_fpu_status status;
46 1.1 christos
47 1.1 christos sim_fpu_32to (&op1, x);
48 1.1 christos sim_fpu_32to (&op2, y);
49 1.1 christos status = sim_fpu_sub (&ans, &op1, &op2);
50 1.1 christos if (status != 0)
51 1.1 christos (*fpu->ops->error) (fpu, status);
52 1.1 christos sim_fpu_to32 (&res, &ans);
53 1.1 christos
54 1.1 christos return res;
55 1.1 christos }
56 1.1 christos
57 1.1 christos static SF
58 1.1 christos mulsf (CGEN_FPU* fpu, SF x, SF y)
59 1.1 christos {
60 1.1 christos sim_fpu op1;
61 1.1 christos sim_fpu op2;
62 1.1 christos sim_fpu ans;
63 1.1 christos unsigned32 res;
64 1.1 christos sim_fpu_status status;
65 1.1 christos
66 1.1 christos sim_fpu_32to (&op1, x);
67 1.1 christos sim_fpu_32to (&op2, y);
68 1.1 christos status = sim_fpu_mul (&ans, &op1, &op2);
69 1.1 christos if (status != 0)
70 1.1 christos (*fpu->ops->error) (fpu, status);
71 1.1 christos sim_fpu_to32 (&res, &ans);
72 1.1 christos
73 1.1 christos return res;
74 1.1 christos }
75 1.1 christos
76 1.1 christos static SF
77 1.1 christos divsf (CGEN_FPU* fpu, SF x, SF y)
78 1.1 christos {
79 1.1 christos sim_fpu op1;
80 1.1 christos sim_fpu op2;
81 1.1 christos sim_fpu ans;
82 1.1 christos unsigned32 res;
83 1.1 christos sim_fpu_status status;
84 1.1 christos
85 1.1 christos sim_fpu_32to (&op1, x);
86 1.1 christos sim_fpu_32to (&op2, y);
87 1.1 christos status = sim_fpu_div (&ans, &op1, &op2);
88 1.1 christos if (status != 0)
89 1.1 christos (*fpu->ops->error) (fpu, status);
90 1.1 christos sim_fpu_to32 (&res, &ans);
91 1.1 christos
92 1.1 christos return res;
93 1.1 christos }
94 1.1 christos
95 1.1 christos static SF
96 1.1 christos negsf (CGEN_FPU* fpu, SF x)
97 1.1 christos {
98 1.1 christos sim_fpu op1;
99 1.1 christos sim_fpu ans;
100 1.1 christos unsigned32 res;
101 1.1 christos sim_fpu_status status;
102 1.1 christos
103 1.1 christos sim_fpu_32to (&op1, x);
104 1.1 christos status = sim_fpu_neg (&ans, &op1);
105 1.1 christos if (status != 0)
106 1.1 christos (*fpu->ops->error) (fpu, status);
107 1.1 christos sim_fpu_to32 (&res, &ans);
108 1.1 christos
109 1.1 christos return res;
110 1.1 christos }
111 1.1 christos
112 1.1 christos static SF
113 1.1 christos abssf (CGEN_FPU* fpu, SF x)
114 1.1 christos {
115 1.1 christos sim_fpu op1;
116 1.1 christos sim_fpu ans;
117 1.1 christos unsigned32 res;
118 1.1 christos sim_fpu_status status;
119 1.1 christos
120 1.1 christos sim_fpu_32to (&op1, x);
121 1.1 christos status = sim_fpu_abs (&ans, &op1);
122 1.1 christos if (status != 0)
123 1.1 christos (*fpu->ops->error) (fpu, status);
124 1.1 christos sim_fpu_to32 (&res, &ans);
125 1.1 christos
126 1.1 christos return res;
127 1.1 christos }
128 1.1 christos
129 1.1 christos static SF
130 1.1 christos sqrtsf (CGEN_FPU* fpu, SF x)
131 1.1 christos {
132 1.1 christos sim_fpu op1;
133 1.1 christos sim_fpu ans;
134 1.1 christos unsigned32 res;
135 1.1 christos sim_fpu_status status;
136 1.1 christos
137 1.1 christos sim_fpu_32to (&op1, x);
138 1.1 christos status = sim_fpu_sqrt (&ans, &op1);
139 1.1 christos if (status != 0)
140 1.1 christos (*fpu->ops->error) (fpu, status);
141 1.1 christos sim_fpu_to32 (&res, &ans);
142 1.1 christos
143 1.1 christos return res;
144 1.1 christos }
145 1.1 christos
146 1.1 christos static SF
147 1.1 christos invsf (CGEN_FPU* fpu, SF x)
148 1.1 christos {
149 1.1 christos sim_fpu op1;
150 1.1 christos sim_fpu ans;
151 1.1 christos unsigned32 res;
152 1.1 christos sim_fpu_status status;
153 1.1 christos
154 1.1 christos sim_fpu_32to (&op1, x);
155 1.1 christos status = sim_fpu_inv (&ans, &op1);
156 1.1 christos if (status != 0)
157 1.1 christos (*fpu->ops->error) (fpu, status);
158 1.1 christos sim_fpu_to32 (&res, &ans);
159 1.1 christos
160 1.1 christos return res;
161 1.1 christos }
162 1.1 christos
163 1.1 christos static SF
164 1.1 christos minsf (CGEN_FPU* fpu, SF x, SF y)
165 1.1 christos {
166 1.1 christos sim_fpu op1;
167 1.1 christos sim_fpu op2;
168 1.1 christos sim_fpu ans;
169 1.1 christos unsigned32 res;
170 1.1 christos sim_fpu_status status;
171 1.1 christos
172 1.1 christos sim_fpu_32to (&op1, x);
173 1.1 christos sim_fpu_32to (&op2, y);
174 1.1 christos status = sim_fpu_min (&ans, &op1, &op2);
175 1.1 christos if (status != 0)
176 1.1 christos (*fpu->ops->error) (fpu, status);
177 1.1 christos sim_fpu_to32 (&res, &ans);
178 1.1 christos
179 1.1 christos return res;
180 1.1 christos }
181 1.1 christos
182 1.1 christos static SF
183 1.1 christos maxsf (CGEN_FPU* fpu, SF x, SF y)
184 1.1 christos {
185 1.1 christos sim_fpu op1;
186 1.1 christos sim_fpu op2;
187 1.1 christos sim_fpu ans;
188 1.1 christos unsigned32 res;
189 1.1 christos sim_fpu_status status;
190 1.1 christos
191 1.1 christos sim_fpu_32to (&op1, x);
192 1.1 christos sim_fpu_32to (&op2, y);
193 1.1 christos status = sim_fpu_max (&ans, &op1, &op2);
194 1.1 christos if (status != 0)
195 1.1 christos (*fpu->ops->error) (fpu, status);
196 1.1 christos sim_fpu_to32 (&res, &ans);
197 1.1 christos
198 1.1 christos return res;
199 1.1 christos }
200 1.1 christos
201 1.1 christos static CGEN_FP_CMP
202 1.1 christos cmpsf (CGEN_FPU* fpu, SF x, SF y)
203 1.1 christos {
204 1.1 christos sim_fpu op1;
205 1.1 christos sim_fpu op2;
206 1.1 christos
207 1.1 christos sim_fpu_32to (&op1, x);
208 1.1 christos sim_fpu_32to (&op2, y);
209 1.1 christos
210 1.1 christos if (sim_fpu_is_nan (&op1)
211 1.1 christos || sim_fpu_is_nan (&op2))
212 1.1 christos return FP_CMP_NAN;
213 1.1 christos
214 1.1 christos if (x < y)
215 1.1 christos return FP_CMP_LT;
216 1.1 christos if (x > y)
217 1.1 christos return FP_CMP_GT;
218 1.1 christos return FP_CMP_EQ;
219 1.1 christos }
220 1.1 christos
221 1.1 christos static int
222 1.1 christos eqsf (CGEN_FPU* fpu, SF x, SF y)
223 1.1 christos {
224 1.1 christos sim_fpu op1;
225 1.1 christos sim_fpu op2;
226 1.1 christos
227 1.1 christos sim_fpu_32to (&op1, x);
228 1.1 christos sim_fpu_32to (&op2, y);
229 1.1 christos return sim_fpu_is_eq (&op1, &op2);
230 1.1 christos }
231 1.1 christos
232 1.1 christos static int
233 1.1 christos nesf (CGEN_FPU* fpu, SF x, SF y)
234 1.1 christos {
235 1.1 christos sim_fpu op1;
236 1.1 christos sim_fpu op2;
237 1.1 christos
238 1.1 christos sim_fpu_32to (&op1, x);
239 1.1 christos sim_fpu_32to (&op2, y);
240 1.1 christos return sim_fpu_is_ne (&op1, &op2);
241 1.1 christos }
242 1.1 christos
243 1.1 christos static int
244 1.1 christos ltsf (CGEN_FPU* fpu, SF x, SF y)
245 1.1 christos {
246 1.1 christos sim_fpu op1;
247 1.1 christos sim_fpu op2;
248 1.1 christos
249 1.1 christos sim_fpu_32to (&op1, x);
250 1.1 christos sim_fpu_32to (&op2, y);
251 1.1 christos return sim_fpu_is_lt (&op1, &op2);
252 1.1 christos }
253 1.1 christos
254 1.1 christos static int
255 1.1 christos lesf (CGEN_FPU* fpu, SF x, SF y)
256 1.1 christos {
257 1.1 christos sim_fpu op1;
258 1.1 christos sim_fpu op2;
259 1.1 christos
260 1.1 christos sim_fpu_32to (&op1, x);
261 1.1 christos sim_fpu_32to (&op2, y);
262 1.1 christos return sim_fpu_is_le (&op1, &op2);
263 1.1 christos }
264 1.1 christos
265 1.1 christos static int
266 1.1 christos gtsf (CGEN_FPU* fpu, SF x, SF y)
267 1.1 christos {
268 1.1 christos sim_fpu op1;
269 1.1 christos sim_fpu op2;
270 1.1 christos
271 1.1 christos sim_fpu_32to (&op1, x);
272 1.1 christos sim_fpu_32to (&op2, y);
273 1.1 christos return sim_fpu_is_gt (&op1, &op2);
274 1.1 christos }
275 1.1 christos
276 1.1 christos static int
277 1.1 christos gesf (CGEN_FPU* fpu, SF x, SF y)
278 1.1 christos {
279 1.1 christos sim_fpu op1;
280 1.1 christos sim_fpu op2;
281 1.1 christos
282 1.1 christos sim_fpu_32to (&op1, x);
283 1.1 christos sim_fpu_32to (&op2, y);
284 1.1 christos return sim_fpu_is_ge (&op1, &op2);
285 1.1 christos }
286 1.1 christos
287 1.1 christos static DF
288 1.1 christos fextsfdf (CGEN_FPU* fpu, int how UNUSED, SF x)
289 1.1 christos {
290 1.1 christos sim_fpu op1;
291 1.1 christos unsigned64 res;
292 1.1 christos
293 1.1 christos sim_fpu_32to (&op1, x);
294 1.1 christos sim_fpu_to64 (&res, &op1);
295 1.1 christos
296 1.1 christos return res;
297 1.1 christos }
298 1.1 christos
299 1.1 christos static SF
300 1.1 christos ftruncdfsf (CGEN_FPU* fpu, int how UNUSED, DF x)
301 1.1 christos {
302 1.1 christos sim_fpu op1;
303 1.1 christos unsigned32 res;
304 1.1 christos
305 1.1 christos sim_fpu_64to (&op1, x);
306 1.1 christos sim_fpu_to32 (&res, &op1);
307 1.1 christos
308 1.1 christos return res;
309 1.1 christos }
310 1.1 christos
311 1.1 christos static SF
312 1.1 christos floatsisf (CGEN_FPU* fpu, int how UNUSED, SI x)
313 1.1 christos {
314 1.1 christos sim_fpu ans;
315 1.1 christos unsigned32 res;
316 1.1 christos
317 1.1 christos sim_fpu_i32to (&ans, x, sim_fpu_round_near);
318 1.1 christos sim_fpu_to32 (&res, &ans);
319 1.1 christos return res;
320 1.1 christos }
321 1.1 christos
322 1.1 christos static DF
323 1.1 christos floatsidf (CGEN_FPU* fpu, int how UNUSED, SI x)
324 1.1 christos {
325 1.1 christos sim_fpu ans;
326 1.1 christos unsigned64 res;
327 1.1 christos
328 1.1 christos sim_fpu_i32to (&ans, x, sim_fpu_round_near);
329 1.1 christos sim_fpu_to64 (&res, &ans);
330 1.1 christos return res;
331 1.1 christos }
332 1.1 christos
333 1.1 christos static SF
334 1.1 christos ufloatsisf (CGEN_FPU* fpu, int how UNUSED, USI x)
335 1.1 christos {
336 1.1 christos sim_fpu ans;
337 1.1 christos unsigned32 res;
338 1.1 christos
339 1.1 christos sim_fpu_u32to (&ans, x, sim_fpu_round_near);
340 1.1 christos sim_fpu_to32 (&res, &ans);
341 1.1 christos return res;
342 1.1 christos }
343 1.1 christos
344 1.1 christos static SI
345 1.1 christos fixsfsi (CGEN_FPU* fpu, int how UNUSED, SF x)
346 1.1 christos {
347 1.1 christos sim_fpu op1;
348 1.1 christos unsigned32 res;
349 1.1 christos
350 1.1 christos sim_fpu_32to (&op1, x);
351 1.1 christos sim_fpu_to32i (&res, &op1, sim_fpu_round_near);
352 1.1 christos return res;
353 1.1 christos }
354 1.1 christos
355 1.1 christos static SI
356 1.1 christos fixdfsi (CGEN_FPU* fpu, int how UNUSED, DF x)
357 1.1 christos {
358 1.1 christos sim_fpu op1;
359 1.1 christos unsigned32 res;
360 1.1 christos
361 1.1 christos sim_fpu_64to (&op1, x);
362 1.1 christos sim_fpu_to32i (&res, &op1, sim_fpu_round_near);
363 1.1 christos return res;
364 1.1 christos }
365 1.1 christos
366 1.1 christos static USI
367 1.1 christos ufixsfsi (CGEN_FPU* fpu, int how UNUSED, SF x)
368 1.1 christos {
369 1.1 christos sim_fpu op1;
370 1.1 christos unsigned32 res;
371 1.1 christos
372 1.1 christos sim_fpu_32to (&op1, x);
373 1.1 christos sim_fpu_to32u (&res, &op1, sim_fpu_round_near);
374 1.1 christos return res;
375 1.1 christos }
376 1.1 christos
377 1.1 christos /* DF mode support */
379 1.1 christos
380 1.1 christos static DF
381 1.1 christos adddf (CGEN_FPU* fpu, DF x, DF y)
382 1.1 christos {
383 1.1 christos sim_fpu op1;
384 1.1 christos sim_fpu op2;
385 1.1 christos sim_fpu ans;
386 1.1 christos unsigned64 res;
387 1.1 christos sim_fpu_status status;
388 1.1 christos
389 1.1 christos sim_fpu_64to (&op1, x);
390 1.1 christos sim_fpu_64to (&op2, y);
391 1.1 christos status = sim_fpu_add (&ans, &op1, &op2);
392 1.1 christos if (status != 0)
393 1.1 christos (*fpu->ops->error) (fpu, status);
394 1.1 christos sim_fpu_to64 (&res, &ans);
395 1.1 christos
396 1.1 christos return res;
397 1.1 christos }
398 1.1 christos
399 1.1 christos static DF
400 1.1 christos subdf (CGEN_FPU* fpu, DF x, DF y)
401 1.1 christos {
402 1.1 christos sim_fpu op1;
403 1.1 christos sim_fpu op2;
404 1.1 christos sim_fpu ans;
405 1.1 christos unsigned64 res;
406 1.1 christos sim_fpu_status status;
407 1.1 christos
408 1.1 christos sim_fpu_64to (&op1, x);
409 1.1 christos sim_fpu_64to (&op2, y);
410 1.1 christos status = sim_fpu_sub (&ans, &op1, &op2);
411 1.1 christos if (status != 0)
412 1.1 christos (*fpu->ops->error) (fpu, status);
413 1.1 christos sim_fpu_to64 (&res, &ans);
414 1.1 christos
415 1.1 christos return res;
416 1.1 christos }
417 1.1 christos
418 1.1 christos static DF
419 1.1 christos muldf (CGEN_FPU* fpu, DF x, DF y)
420 1.1 christos {
421 1.1 christos sim_fpu op1;
422 1.1 christos sim_fpu op2;
423 1.1 christos sim_fpu ans;
424 1.1 christos unsigned64 res;
425 1.1 christos sim_fpu_status status;
426 1.1 christos
427 1.1 christos sim_fpu_64to (&op1, x);
428 1.1 christos sim_fpu_64to (&op2, y);
429 1.1 christos status = sim_fpu_mul (&ans, &op1, &op2);
430 1.1 christos if (status != 0)
431 1.1 christos (*fpu->ops->error) (fpu, status);
432 1.1 christos sim_fpu_to64 (&res, &ans);
433 1.1 christos
434 1.1 christos return res;
435 1.1 christos }
436 1.1 christos
437 1.1 christos static DF
438 1.1 christos divdf (CGEN_FPU* fpu, DF x, DF y)
439 1.1 christos {
440 1.1 christos sim_fpu op1;
441 1.1 christos sim_fpu op2;
442 1.1 christos sim_fpu ans;
443 1.1 christos unsigned64 res;
444 1.1 christos sim_fpu_status status;
445 1.1 christos
446 1.1 christos sim_fpu_64to (&op1, x);
447 1.1 christos sim_fpu_64to (&op2, y);
448 1.1 christos status = sim_fpu_div (&ans, &op1, &op2);
449 1.1 christos if (status != 0)
450 1.1 christos (*fpu->ops->error) (fpu, status);
451 1.1 christos sim_fpu_to64 (&res, &ans);
452 1.1 christos
453 1.1 christos return res;
454 1.1 christos }
455 1.1 christos
456 1.1 christos static DF
457 1.1 christos negdf (CGEN_FPU* fpu, DF x)
458 1.1 christos {
459 1.1 christos sim_fpu op1;
460 1.1 christos sim_fpu ans;
461 1.1 christos unsigned64 res;
462 1.1 christos sim_fpu_status status;
463 1.1 christos
464 1.1 christos sim_fpu_64to (&op1, x);
465 1.1 christos status = sim_fpu_neg (&ans, &op1);
466 1.1 christos if (status != 0)
467 1.1 christos (*fpu->ops->error) (fpu, status);
468 1.1 christos sim_fpu_to64 (&res, &ans);
469 1.1 christos
470 1.1 christos return res;
471 1.1 christos }
472 1.1 christos
473 1.1 christos static DF
474 1.1 christos absdf (CGEN_FPU* fpu, DF x)
475 1.1 christos {
476 1.1 christos sim_fpu op1;
477 1.1 christos sim_fpu ans;
478 1.1 christos unsigned64 res;
479 1.1 christos sim_fpu_status status;
480 1.1 christos
481 1.1 christos sim_fpu_64to (&op1, x);
482 1.1 christos status = sim_fpu_abs (&ans, &op1);
483 1.1 christos if (status != 0)
484 1.1 christos (*fpu->ops->error) (fpu, status);
485 1.1 christos sim_fpu_to64 (&res, &ans);
486 1.1 christos
487 1.1 christos return res;
488 1.1 christos }
489 1.1 christos
490 1.1 christos static DF
491 1.1 christos sqrtdf (CGEN_FPU* fpu, DF x)
492 1.1 christos {
493 1.1 christos sim_fpu op1;
494 1.1 christos sim_fpu ans;
495 1.1 christos unsigned64 res;
496 1.1 christos sim_fpu_status status;
497 1.1 christos
498 1.1 christos sim_fpu_64to (&op1, x);
499 1.1 christos status = sim_fpu_sqrt (&ans, &op1);
500 1.1 christos if (status != 0)
501 1.1 christos (*fpu->ops->error) (fpu, status);
502 1.1 christos sim_fpu_to64 (&res, &ans);
503 1.1 christos
504 1.1 christos return res;
505 1.1 christos }
506 1.1 christos
507 1.1 christos static DF
508 1.1 christos invdf (CGEN_FPU* fpu, DF x)
509 1.1 christos {
510 1.1 christos sim_fpu op1;
511 1.1 christos sim_fpu ans;
512 1.1 christos unsigned64 res;
513 1.1 christos sim_fpu_status status;
514 1.1 christos
515 1.1 christos sim_fpu_64to (&op1, x);
516 1.1 christos status = sim_fpu_inv (&ans, &op1);
517 1.1 christos if (status != 0)
518 1.1 christos (*fpu->ops->error) (fpu, status);
519 1.1 christos sim_fpu_to64 (&res, &ans);
520 1.1 christos
521 1.1 christos return res;
522 1.1 christos }
523 1.1 christos
524 1.1 christos static DF
525 1.1 christos mindf (CGEN_FPU* fpu, DF x, DF y)
526 1.1 christos {
527 1.1 christos sim_fpu op1;
528 1.1 christos sim_fpu op2;
529 1.1 christos sim_fpu ans;
530 1.1 christos unsigned64 res;
531 1.1 christos sim_fpu_status status;
532 1.1 christos
533 1.1 christos sim_fpu_64to (&op1, x);
534 1.1 christos sim_fpu_64to (&op2, y);
535 1.1 christos status = sim_fpu_min (&ans, &op1, &op2);
536 1.1 christos if (status != 0)
537 1.1 christos (*fpu->ops->error) (fpu, status);
538 1.1 christos sim_fpu_to64 (&res, &ans);
539 1.1 christos
540 1.1 christos return res;
541 1.1 christos }
542 1.1 christos
543 1.1 christos static DF
544 1.1 christos maxdf (CGEN_FPU* fpu, DF x, DF y)
545 1.1 christos {
546 1.1 christos sim_fpu op1;
547 1.1 christos sim_fpu op2;
548 1.1 christos sim_fpu ans;
549 1.1 christos unsigned64 res;
550 1.1 christos sim_fpu_status status;
551 1.1 christos
552 1.1 christos sim_fpu_64to (&op1, x);
553 1.1 christos sim_fpu_64to (&op2, y);
554 1.1 christos status = sim_fpu_max (&ans, &op1, &op2);
555 1.1 christos if (status != 0)
556 1.1 christos (*fpu->ops->error) (fpu, status);
557 1.1 christos sim_fpu_to64 (&res, &ans);
558 1.1 christos
559 1.1 christos return res;
560 1.1 christos }
561 1.1 christos
562 1.1 christos static CGEN_FP_CMP
563 1.1 christos cmpdf (CGEN_FPU* fpu, DF x, DF y)
564 1.1 christos {
565 1.1 christos sim_fpu op1;
566 1.1 christos sim_fpu op2;
567 1.1 christos
568 1.1 christos sim_fpu_64to (&op1, x);
569 1.1 christos sim_fpu_64to (&op2, y);
570 1.1 christos
571 1.1 christos if (sim_fpu_is_nan (&op1)
572 1.1 christos || sim_fpu_is_nan (&op2))
573 1.1 christos return FP_CMP_NAN;
574 1.1 christos
575 1.1 christos if (x < y)
576 1.1 christos return FP_CMP_LT;
577 1.1 christos if (x > y)
578 1.1 christos return FP_CMP_GT;
579 1.1 christos return FP_CMP_EQ;
580 1.1 christos }
581 1.1 christos
582 1.1 christos static int
583 1.1 christos eqdf (CGEN_FPU* fpu, DF x, DF y)
584 1.1 christos {
585 1.1 christos sim_fpu op1;
586 1.1 christos sim_fpu op2;
587 1.1 christos
588 1.1 christos sim_fpu_64to (&op1, x);
589 1.1 christos sim_fpu_64to (&op2, y);
590 1.1 christos return sim_fpu_is_eq (&op1, &op2);
591 1.1 christos }
592 1.1 christos
593 1.1 christos static int
594 1.1 christos nedf (CGEN_FPU* fpu, DF x, DF y)
595 1.1 christos {
596 1.1 christos sim_fpu op1;
597 1.1 christos sim_fpu op2;
598 1.1 christos
599 1.1 christos sim_fpu_64to (&op1, x);
600 1.1 christos sim_fpu_64to (&op2, y);
601 1.1 christos return sim_fpu_is_ne (&op1, &op2);
602 1.1 christos }
603 1.1 christos
604 1.1 christos static int
605 1.1 christos ltdf (CGEN_FPU* fpu, DF x, DF y)
606 1.1 christos {
607 1.1 christos sim_fpu op1;
608 1.1 christos sim_fpu op2;
609 1.1 christos
610 1.1 christos sim_fpu_64to (&op1, x);
611 1.1 christos sim_fpu_64to (&op2, y);
612 1.1 christos return sim_fpu_is_lt (&op1, &op2);
613 1.1 christos }
614 1.1 christos
615 1.1 christos static int
616 1.1 christos ledf (CGEN_FPU* fpu, DF x, DF y)
617 1.1 christos {
618 1.1 christos sim_fpu op1;
619 1.1 christos sim_fpu op2;
620 1.1 christos
621 1.1 christos sim_fpu_64to (&op1, x);
622 1.1 christos sim_fpu_64to (&op2, y);
623 1.1 christos return sim_fpu_is_le (&op1, &op2);
624 1.1 christos }
625 1.1 christos
626 1.1 christos static int
627 1.1 christos gtdf (CGEN_FPU* fpu, DF x, DF y)
628 1.1 christos {
629 1.1 christos sim_fpu op1;
630 1.1 christos sim_fpu op2;
631 1.1 christos
632 1.1 christos sim_fpu_64to (&op1, x);
633 1.1 christos sim_fpu_64to (&op2, y);
634 1.1 christos return sim_fpu_is_gt (&op1, &op2);
635 1.1 christos }
636 1.1 christos
637 1.1 christos static int
638 1.1 christos gedf (CGEN_FPU* fpu, DF x, DF y)
639 1.1 christos {
640 1.1 christos sim_fpu op1;
641 1.1 christos sim_fpu op2;
642 1.1 christos
643 1.1 christos sim_fpu_64to (&op1, x);
644 1.1 christos sim_fpu_64to (&op2, y);
645 1.1 christos return sim_fpu_is_ge (&op1, &op2);
646 1.1 christos }
647 1.1 christos
648 1.1 christos /* Initialize FP_OPS to use accurate library. */
650 1.1 christos
651 1.1 christos void
652 1.1 christos cgen_init_accurate_fpu (SIM_CPU* cpu, CGEN_FPU* fpu, CGEN_FPU_ERROR_FN* error)
653 1.1 christos {
654 1.1 christos CGEN_FP_OPS* o;
655 1.1 christos
656 1.1 christos fpu->owner = cpu;
657 1.1 christos /* ??? small memory leak, not freed by sim_close */
658 1.1 christos fpu->ops = (CGEN_FP_OPS*) xmalloc (sizeof (CGEN_FP_OPS));
659 1.1 christos
660 1.1 christos o = fpu->ops;
661 1.1 christos memset (o, 0, sizeof (*o));
662 1.1 christos
663 1.1 christos o->error = error;
664 1.1 christos
665 1.1 christos o->addsf = addsf;
666 1.1 christos o->subsf = subsf;
667 1.1 christos o->mulsf = mulsf;
668 1.1 christos o->divsf = divsf;
669 1.1 christos o->negsf = negsf;
670 1.1 christos o->abssf = abssf;
671 1.1 christos o->sqrtsf = sqrtsf;
672 1.1 christos o->invsf = invsf;
673 1.1 christos o->minsf = minsf;
674 1.1 christos o->maxsf = maxsf;
675 1.1 christos o->cmpsf = cmpsf;
676 1.1 christos o->eqsf = eqsf;
677 1.1 christos o->nesf = nesf;
678 1.1 christos o->ltsf = ltsf;
679 1.1 christos o->lesf = lesf;
680 1.1 christos o->gtsf = gtsf;
681 1.1 christos o->gesf = gesf;
682 1.1 christos
683 1.1 christos o->adddf = adddf;
684 1.1 christos o->subdf = subdf;
685 1.1 christos o->muldf = muldf;
686 1.1 christos o->divdf = divdf;
687 1.1 christos o->negdf = negdf;
688 1.1 christos o->absdf = absdf;
689 1.1 christos o->sqrtdf = sqrtdf;
690 1.1 christos o->invdf = invdf;
691 1.1 christos o->mindf = mindf;
692 1.1 christos o->maxdf = maxdf;
693 1.1 christos o->cmpdf = cmpdf;
694 1.1 christos o->eqdf = eqdf;
695 1.1 christos o->nedf = nedf;
696 1.1 christos o->ltdf = ltdf;
697 1.1 christos o->ledf = ledf;
698 1.1 christos o->gtdf = gtdf;
699 1.1 christos o->gedf = gedf;
700 1.1 christos o->fextsfdf = fextsfdf;
701 1.1 christos o->ftruncdfsf = ftruncdfsf;
702 1.1 christos o->floatsisf = floatsisf;
703 1.1 christos o->floatsidf = floatsidf;
704 1.1 christos o->ufloatsisf = ufloatsisf;
705 1.1 christos o->fixsfsi = fixsfsi;
706 1.1 christos o->fixdfsi = fixdfsi;
707 o->ufixsfsi = ufixsfsi;
708 }
709