1 /*
2 * GXemul floating point tests.
3 *
4 * This file is in the Public Domain.
5 */
6
7 #ifdef HOSTNATIVE
8 #include <stdio.h>
9 #include <stdlib.h>
10 #else
11 #include "dev_cons.h"
12 #endif
13
14
15 #ifdef MIPS
16 /* Note: The ugly cast to a signed int (32-bit) causes the address to be
17 sign-extended correctly on MIPS when compiled in 64-bit mode */
18 #define PHYSADDR_OFFSET ((signed int)0xa0000000)
19 #else
20 #define PHYSADDR_OFFSET 0
21 #endif
22
23
24 #define PUTCHAR_ADDRESS (PHYSADDR_OFFSET + \
25 DEV_CONS_ADDRESS + DEV_CONS_PUTGETCHAR)
26 #define HALT_ADDRESS (PHYSADDR_OFFSET + \
27 DEV_CONS_ADDRESS + DEV_CONS_HALT)
28
29
30 #include "fpconst.h"
31
32
printchar(char ch)33 void printchar(char ch)
34 {
35 #ifdef HOSTNATIVE
36 printf("%c", ch);
37 #else
38 *((volatile unsigned char *) PUTCHAR_ADDRESS) = ch;
39 #endif
40 }
41
42
halt(void)43 void halt(void)
44 {
45 #ifdef HOSTNATIVE
46 exit(0);
47 #else
48 *((volatile unsigned char *) HALT_ADDRESS) = 0;
49 #endif
50 }
51
52
str(char * s)53 void str(char *s)
54 {
55 while (*s)
56 printchar(*s++);
57 }
58
59
print_hex(unsigned long long value,int bits)60 void print_hex(unsigned long long value, int bits)
61 {
62 unsigned long long head = value >> 4;
63 unsigned long long tail = value & 15;
64 char hexchar[16] = "0123456789abcdef";
65
66 if (bits > 4)
67 print_hex(head, bits - 4);
68
69 printchar(hexchar[tail]);
70 }
71
72
print_float(void * value)73 void print_float(void* value)
74 {
75 unsigned int v = *(unsigned int *) value;
76 print_hex(v, 32);
77 }
78
79
print_double(void * value)80 void print_double(void* value)
81 {
82 unsigned long long v = *(unsigned long long *) value;
83 print_hex(v, 64);
84 }
85
86
87 #ifdef HOSTNATIVE
main(int argc,char * argv[])88 int main(int argc, char* argv[])
89 #else
90 int f(void)
91 #endif
92 {
93 str("GXemul floating point tests\n\n");
94
95 str("constant 0.0:\t");
96 {
97 float f;
98 f = f_0_0();
99 print_float(&f);
100 str("\t");
101 }
102 {
103 double d;
104 d = d_0_0();
105 print_double(&d);
106 str("\n");
107 }
108
109 str("constant -0.0:\t");
110 {
111 float f;
112 f = f_m0_0();
113 print_float(&f);
114 str("\t");
115 }
116 {
117 double d;
118 d = d_m0_0();
119 print_double(&d);
120 str("\n");
121 }
122
123 str("constant 0.17:\t");
124 {
125 float f;
126 f = f_0_17();
127 print_float(&f);
128 str("\t");
129 }
130 {
131 double d;
132 d = d_0_17();
133 print_double(&d);
134 str("\n");
135 }
136
137 str("constant -0.17:\t");
138 {
139 float f;
140 f = f_m0_17();
141 print_float(&f);
142 str("\t");
143 }
144 {
145 double d;
146 d = d_m0_17();
147 print_double(&d);
148 str("\n");
149 }
150
151 str("constant 1.0:\t");
152 {
153 float f;
154 f = f_1_0();
155 print_float(&f);
156 str("\t");
157 }
158 {
159 double d;
160 d = d_1_0();
161 print_double(&d);
162 str("\n");
163 }
164
165 str("constant -1.0:\t");
166 {
167 float f;
168 f = f_m1_0();
169 print_float(&f);
170 str("\t");
171 }
172 {
173 double d;
174 d = d_m1_0();
175 print_double(&d);
176 str("\n");
177 }
178
179 str("constant 1.7:\t");
180 {
181 float f;
182 f = f_1_7();
183 print_float(&f);
184 str("\t");
185 }
186 {
187 double d;
188 d = d_1_7();
189 print_double(&d);
190 str("\n");
191 }
192
193 str("constant -1.7:\t");
194 {
195 float f;
196 f = f_m1_7();
197 print_float(&f);
198 str("\t");
199 }
200 {
201 double d;
202 d = d_m1_7();
203 print_double(&d);
204 str("\n");
205 }
206
207 str("constant 42:\t");
208 {
209 float f;
210 f = f_42();
211 print_float(&f);
212 str("\t");
213 }
214 {
215 double d;
216 d = d_42();
217 print_double(&d);
218 str("\n");
219 }
220
221 str("constant -42:\t");
222 {
223 float f;
224 f = f_m42();
225 print_float(&f);
226 str("\t");
227 }
228 {
229 double d;
230 d = d_m42();
231 print_double(&d);
232 str("\n");
233 }
234
235 str("constant inf:\t");
236 {
237 float f;
238 f = f_inf();
239 print_float(&f);
240 str("\t");
241 }
242 {
243 double d;
244 d = d_inf();
245 print_double(&d);
246 str("\n");
247 }
248
249 str("constant -inf:\t");
250 {
251 float f;
252 f = f_m_inf();
253 print_float(&f);
254 str("\t");
255 }
256 {
257 double d;
258 d = d_m_inf();
259 print_double(&d);
260 str("\n");
261 }
262
263 str("constant nan:\t");
264 {
265 float f;
266 f = f_nan();
267 print_float(&f);
268 str("\t");
269 }
270 {
271 double d;
272 d = d_nan();
273 print_double(&d);
274 str("\n");
275 }
276
277 str("constant nan_x:\t");
278 {
279 float f;
280 f = f_nan_x();
281 print_float(&f);
282 str("\t");
283 }
284 {
285 double d;
286 d = d_nan_x();
287 print_double(&d);
288 str("\n");
289 }
290
291 // TODO: Denormalized subnormal values
292 // TODO: Min/max values?
293
294 str("\n");
295
296 str("0.0 + 0.0:\t");
297 {
298 float x1, x2, x;
299 x1 = f_0_0();
300 x2 = f_0_0();
301 x = x1 + x2;
302 print_float(&x);
303 str("\t");
304 }
305 {
306 double x1, x2, x;
307 x1 = d_0_0();
308 x2 = d_0_0();
309 x = x1 + x2;
310 print_double(&x);
311 str("\n");
312 }
313
314 str("0.0 + -0.0:\t");
315 {
316 float x1, x2, x;
317 x1 = f_0_0();
318 x2 = f_m0_0();
319 x = x1 + x2;
320 print_float(&x);
321 str("\t");
322 }
323 {
324 double x1, x2, x;
325 x1 = d_0_0();
326 x2 = d_m0_0();
327 x = x1 + x2;
328 print_double(&x);
329 str("\n");
330 }
331
332 str("-0.0 + 0.0:\t");
333 {
334 float x1, x2, x;
335 x1 = f_m0_0();
336 x2 = f_0_0();
337 x = x1 + x2;
338 print_float(&x);
339 str("\t");
340 }
341 {
342 double x1, x2, x;
343 x1 = d_m0_0();
344 x2 = d_0_0();
345 x = x1 + x2;
346 print_double(&x);
347 str("\n");
348 }
349
350 str("0.0 + 1.0:\t");
351 {
352 float x1, x2, x;
353 x1 = f_0_0();
354 x2 = f_1_0();
355 x = x1 + x2;
356 print_float(&x);
357 str("\t");
358 }
359 {
360 double x1, x2, x;
361 x1 = d_0_0();
362 x2 = d_1_0();
363 x = x1 + x2;
364 print_double(&x);
365 str("\n");
366 }
367
368 str("0.0 + -1.0:\t");
369 {
370 float x1, x2, x;
371 x1 = f_0_0();
372 x2 = f_m1_0();
373 x = x1 + x2;
374 print_float(&x);
375 str("\t");
376 }
377 {
378 double x1, x2, x;
379 x1 = d_0_0();
380 x2 = d_m1_0();
381 x = x1 + x2;
382 print_double(&x);
383 str("\n");
384 }
385
386 str("1.0 + 0.0:\t");
387 {
388 float x1, x2, x;
389 x1 = f_1_0();
390 x2 = f_0_0();
391 x = x1 + x2;
392 print_float(&x);
393 str("\t");
394 }
395 {
396 double x1, x2, x;
397 x1 = d_1_0();
398 x2 = d_0_0();
399 x = x1 + x2;
400 print_double(&x);
401 str("\n");
402 }
403
404 str("1.0 + 1.0:\t");
405 {
406 float x1, x2, x;
407 x1 = f_1_0();
408 x2 = f_1_0();
409 x = x1 + x2;
410 print_float(&x);
411 str("\t");
412 }
413 {
414 double x1, x2, x;
415 x1 = d_1_0();
416 x2 = d_1_0();
417 x = x1 + x2;
418 print_double(&x);
419 str("\n");
420 }
421
422 str("1.0 + -1.0:\t");
423 {
424 float x1, x2, x;
425 x1 = f_1_0();
426 x2 = f_m1_0();
427 x = x1 + x2;
428 print_float(&x);
429 str("\t");
430 }
431 {
432 double x1, x2, x;
433 x1 = d_1_0();
434 x2 = d_m1_0();
435 x = x1 + x2;
436 print_double(&x);
437 str("\n");
438 }
439
440 str("0.0 + 1.7:\t");
441 {
442 float x1, x2, x;
443 x1 = f_0_0();
444 x2 = f_1_7();
445 x = x1 + x2;
446 print_float(&x);
447 str("\t");
448 }
449 {
450 double x1, x2, x;
451 x1 = d_0_0();
452 x2 = d_1_7();
453 x = x1 + x2;
454 print_double(&x);
455 str("\n");
456 }
457
458 str("1.7 + 0.0:\t");
459 {
460 float x1, x2, x;
461 x1 = f_1_7();
462 x2 = f_0_0();
463 x = x1 + x2;
464 print_float(&x);
465 str("\t");
466 }
467 {
468 double x1, x2, x;
469 x1 = d_1_7();
470 x2 = d_0_0();
471 x = x1 + x2;
472 print_double(&x);
473 str("\n");
474 }
475
476 str("42 + 0.0:\t");
477 {
478 float x1, x2, x;
479 x1 = f_42();
480 x2 = f_0_0();
481 x = x1 + x2;
482 print_float(&x);
483 str("\t");
484 }
485 {
486 double x1, x2, x;
487 x1 = d_42();
488 x2 = d_0_0();
489 x = x1 + x2;
490 print_double(&x);
491 str("\n");
492 }
493
494 str("42 + 42:\t");
495 {
496 float x1, x2, x;
497 x1 = f_42();
498 x2 = f_42();
499 x = x1 + x2;
500 print_float(&x);
501 str("\t");
502 }
503 {
504 double x1, x2, x;
505 x1 = d_42();
506 x2 = d_42();
507 x = x1 + x2;
508 print_double(&x);
509 str("\n");
510 }
511
512 str("-42 + 42:\t");
513 {
514 float x1, x2, x;
515 x1 = f_m42();
516 x2 = f_42();
517 x = x1 + x2;
518 print_float(&x);
519 str("\t");
520 }
521 {
522 double x1, x2, x;
523 x1 = d_m42();
524 x2 = d_42();
525 x = x1 + x2;
526 print_double(&x);
527 str("\n");
528 }
529
530 str("0.0 + inf:\t");
531 {
532 float x1, x2, x;
533 x1 = f_0_0();
534 x2 = f_inf();
535 x = x1 + x2;
536 print_float(&x);
537 str("\t");
538 }
539 {
540 double x1, x2, x;
541 x1 = d_0_0();
542 x2 = d_inf();
543 x = x1 + x2;
544 print_double(&x);
545 str("\n");
546 }
547
548 str("0.0 + -inf:\t");
549 {
550 float x1, x2, x;
551 x1 = f_0_0();
552 x2 = f_m_inf();
553 x = x1 + x2;
554 print_float(&x);
555 str("\t");
556 }
557 {
558 double x1, x2, x;
559 x1 = d_0_0();
560 x2 = d_m_inf();
561 x = x1 + x2;
562 print_double(&x);
563 str("\n");
564 }
565
566 str("inf + inf:\t");
567 {
568 float x1, x2, x;
569 x1 = f_inf();
570 x2 = f_inf();
571 x = x1 + x2;
572 print_float(&x);
573 str("\t");
574 }
575 {
576 double x1, x2, x;
577 x1 = d_inf();
578 x2 = d_inf();
579 x = x1 + x2;
580 print_double(&x);
581 str("\n");
582 }
583
584 str("inf + -inf:\t");
585 {
586 float x1, x2, x;
587 x1 = f_inf();
588 x2 = f_m_inf();
589 x = x1 + x2;
590 print_float(&x);
591 str("\t");
592 }
593 {
594 double x1, x2, x;
595 x1 = d_inf();
596 x2 = d_m_inf();
597 x = x1 + x2;
598 print_double(&x);
599 str("\n");
600 }
601
602 str("-inf + -inf:\t");
603 {
604 float x1, x2, x;
605 x1 = f_m_inf();
606 x2 = f_m_inf();
607 x = x1 + x2;
608 print_float(&x);
609 str("\t");
610 }
611 {
612 double x1, x2, x;
613 x1 = d_m_inf();
614 x2 = d_m_inf();
615 x = x1 + x2;
616 print_double(&x);
617 str("\n");
618 }
619
620 str("inf + 1.7:\t");
621 {
622 float x1, x2, x;
623 x1 = f_inf();
624 x2 = f_1_7();
625 x = x1 + x2;
626 print_float(&x);
627 str("\t");
628 }
629 {
630 double x1, x2, x;
631 x1 = d_inf();
632 x2 = d_1_7();
633 x = x1 + x2;
634 print_double(&x);
635 str("\n");
636 }
637
638 str("inf + nan:\t");
639 {
640 float x1, x2, x;
641 x1 = f_inf();
642 x2 = f_nan();
643 x = x1 + x2;
644 print_float(&x);
645 str("\t");
646 }
647 {
648 double x1, x2, x;
649 x1 = d_inf();
650 x2 = d_nan();
651 x = x1 + x2;
652 print_double(&x);
653 str("\n");
654 }
655
656 str("nan + 0.0:\t");
657 {
658 float x1, x2, x;
659 x1 = f_nan();
660 x2 = f_0_0();
661 x = x1 + x2;
662 print_float(&x);
663 str("\t");
664 }
665 {
666 double x1, x2, x;
667 x1 = d_nan();
668 x2 = d_0_0();
669 x = x1 + x2;
670 print_double(&x);
671 str("\n");
672 }
673
674 str("nan_x + 0.0:\t");
675 {
676 float x1, x2, x;
677 x1 = f_nan_x();
678 x2 = f_0_0();
679 x = x1 + x2;
680 print_float(&x);
681 str("\t");
682 }
683 {
684 double x1, x2, x;
685 x1 = d_nan_x();
686 x2 = d_0_0();
687 x = x1 + x2;
688 print_double(&x);
689 str("\n");
690 }
691
692 str("nan + 1.7:\t");
693 {
694 float x1, x2, x;
695 x1 = f_nan();
696 x2 = f_1_7();
697 x = x1 + x2;
698 print_float(&x);
699 str("\t");
700 }
701 {
702 double x1, x2, x;
703 x1 = d_nan();
704 x2 = d_1_7();
705 x = x1 + x2;
706 print_double(&x);
707 str("\n");
708 }
709
710 str("nan_x + 1.7:\t");
711 {
712 float x1, x2, x;
713 x1 = f_nan_x();
714 x2 = f_1_7();
715 x = x1 + x2;
716 print_float(&x);
717 str("\t");
718 }
719 {
720 double x1, x2, x;
721 x1 = d_nan_x();
722 x2 = d_1_7();
723 x = x1 + x2;
724 print_double(&x);
725 str("\n");
726 }
727
728 str("nan + nan_x:\t");
729 {
730 float x1, x2, x;
731 x1 = f_nan();
732 x2 = f_nan_x();
733 x = x1 + x2;
734 print_float(&x);
735 str("\t");
736 }
737 {
738 double x1, x2, x;
739 x1 = d_nan();
740 x2 = d_nan_x();
741 x = x1 + x2;
742 print_double(&x);
743 str("\n");
744 }
745
746 str("nan_x + nan:\t");
747 {
748 float x1, x2, x;
749 x1 = f_nan_x();
750 x2 = f_nan();
751 x = x1 + x2;
752 print_float(&x);
753 str("\t");
754 }
755 {
756 double x1, x2, x;
757 x1 = d_nan_x();
758 x2 = d_nan();
759 x = x1 + x2;
760 print_double(&x);
761 str("\n");
762 }
763
764 // TODO: - * /
765 // TODO: == < > <= >=
766 // TODO: sqrt sin cos etc...
767
768 str("\n");
769 halt();
770 return 0;
771 }
772
773