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