1#include <stdio.h>
2
3/* Simple test to see that basic operators are mapped
4   correctly. Uses default rounding mode. */
5
6volatile double d1, d2;
7volatile float f1, f2;
8
9void fadd8(void)
10{
11   printf("%f + %f = %f\n", d1, d2, d1 + d2);
12}
13
14void fsub8(void)
15{
16   printf("%f - %f = %f\n", d1, d2, d1 - d2);
17}
18
19void fmul8(void)
20{
21   printf("%f * %f = %f\n", d1, d2, d1 * d2);
22}
23
24void fdiv8(void)
25{
26   printf("%f / %f = %f\n", d1, d2, d1 / d2);
27}
28
29void fadd4(void)
30{
31   register float r1 asm("f1") = f1;
32   register float r2 asm("f2") = f2;
33
34   __asm__ volatile ("aebr %[r1],%[r2]\n\t"
35                     : [r1] "+f"(r1)
36                     : [r2] "f"(r2) : "cc");
37   printf("%f + %f = %f\n", f1, f2, r1);
38}
39
40void fsub4(void)
41{
42   register float r1 asm("f1") = f1;
43   register float r2 asm("f2") = f2;
44
45   __asm__ volatile ("sebr %[r1],%[r2]\n\t"
46                     : [r1] "+f"(r1)
47                     : [r2] "f"(r2) : "cc");
48   printf("%f - %f = %f\n", f1, f2, r1);
49}
50
51void fmul4(void)
52{
53   register float r1 asm("f1") = f1;
54   register float r2 asm("f2") = f2;
55
56   __asm__ volatile ("meebr %[r1],%[r2]\n\t"
57                     : [r1] "+f"(r1)
58                     : [r2] "f"(r2) : "cc");
59   printf("%f * %f = %f\n", f1, f2, r1);
60}
61
62void fdiv4(void)
63{
64   register float r1 asm("f1") = f1;
65   register float r2 asm("f2") = f2;
66
67   __asm__ volatile ("debr %[r1],%[r2]\n\t"
68                     : [r1] "+f"(r1)
69                     : [r2] "f"(r2) : "cc");
70   printf("%f / %f = %f\n", f1, f2, r1);
71}
72
73
74int main()
75{
76   printf("double arithmetic\n");
77   d1 = 10.5;
78   d2 =  1.25;
79   fadd8();
80   fsub8();
81   fmul8();
82   fdiv8();
83
84   printf("float arithmetic\n");
85   f1 = 10.5f;
86   f2 =  1.25f;
87   fadd4();
88   fsub4();
89   fmul4();
90   fdiv4();
91
92   return 0;
93}
94