FPUarithmetic.c revision 663860b1408516d02ebfcb3a9999a134e6cfb223
1#include <stdio.h>
2
3typedef enum {
4   ABSS=0, ABSD,
5   ADDS, ADDD,
6   DIVS, DIVD,
7   MULS, MULD,
8   NEGS, NEGD,
9   SQRTS, SQRTD,
10   SUBS, SUBD,
11   RECIPS, RECIPD,
12   RSQRTS, RSQRTD
13} flt_art_op_t;
14
15const char *flt_art_op_names[] = {
16   "abs.s", "abs.d",
17   "add.s", "add.d",
18   "div.s", "div.d",
19   "mul.s", "mul.d",
20   "neg.s", "neg.d",
21   "sqrt.s", "sqrt.d",
22   "sub.s", "sub.d",
23   "recip.s", "recip.d",
24   "rsqrt.s", "rsqrt.d"
25};
26
27const double fs_d[] = {
28   0, 456.2489562, 3, -1,
29   1384.6, -7.2945676, 1000000000, -5786.47,
30   1752, 0.0024575, 0.00000001, -248562.76,
31   -45786.476, 456.2489562, 34.00046, 45786.476,
32   1752065, 107, -45667.24, -7.2945676,
33   -347856.475, 356047.56, -1.0, 23.04
34};
35
36const double ft_d[] = {
37   -45786.476, 456.2489562, 34.00046, 45786.476,
38   1752065, 107, -45667.24, -7.2945676,
39   -347856.475, 356047.56, -1.0, 23.04,
40   0, 456.2489562, 3, -1,
41   1384.6, -7.2945676, 1000000000, -5786.47,
42   1752, 0.0024575, 0.00000001, -248562.76
43};
44
45const float fs_f[] = {
46   0, 456.2489562, 3, -1,
47   1384.6, -7.2945676, 1000000000, -5786.47,
48   1752, 0.0024575, 0.00000001, -248562.76,
49   -45786.476, 456.2489562, 34.00046, 45786.476,
50   1752065, 107, -45667.24, -7.2945676,
51   -347856.475, 356047.56, -1.0, 23.04
52};
53
54const float ft_f[] = {
55   -45786.476, 456.2489562, 34.00046, 45786.476,
56   1752065, 107, -45667.24, -7.2945676,
57   -347856.475, 356047.56, -1.0, 23.04,
58   0, 456.2489562, 3, -1,
59   1384.6, -7.2945676, 1000000000, -5786.47,
60   1752, 0.0024575, 0.00000001, -248562.76
61};
62
63#define UNOPdd(op) \
64        fd_d = 0;  \
65        __asm__ volatile( \
66					op" %0, %1\n\t" \
67					: "=f"(fd_d) : "f"(fs_d[i]));
68
69#define UNOPff(op) \
70        fd_f = 0;  \
71        __asm__ volatile( \
72					op" %0, %1\n\t" \
73					: "=f"(fd_f) : "f"(fs_f[i]));
74
75#define BINOPf(op) \
76        fd_f = 0;  \
77        __asm__ volatile( \
78					op" %0, %1, %2\n\t" \
79					: "=f"(fd_f) : "f"(fs_f[i]) , "f"(ft_f[i]));
80
81#define BINOPd(op) \
82        fd_d = 0;  \
83        __asm__ volatile( \
84					op" %0, %1, %2\n\t" \
85					: "=f"(fd_d) : "f"(fs_d[i]) , "f"(ft_d[i]));
86
87int arithmeticOperations(flt_art_op_t op)
88{
89   double fd_d = 0;
90   float fd_f = 0;
91   int i = 0;
92   for (i = 0; i < 24; i++)
93   {
94      switch(op) {
95         case ABSS:
96              UNOPff("abs.s");
97              printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
98              break;
99         case ABSD:
100              UNOPdd("abs.d");
101              printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
102              break;
103         case ADDS:
104              BINOPf("add.s");
105              printf("%s %f %f %f\n", flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
106              break;
107         case ADDD:
108              BINOPd("add.d");
109              printf("%s %lf %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
110              break;
111         case DIVS:
112              BINOPf("div.s");
113              printf("%s %f %f %f\n", flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
114              break;
115         case DIVD:
116              BINOPd("div.d");
117              printf("%s %lf %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
118              break;
119         case MULS:
120              BINOPf("mul.s");
121              printf("%s %f %f %f\n", flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
122              break;
123         case MULD:
124              BINOPd("mul.d");
125              printf("%s %lf %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
126              break;
127         case NEGS:
128              UNOPff("neg.s");
129              printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
130              break;
131         case NEGD:
132              UNOPdd("neg.d");
133              printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
134              break;
135         case SQRTS:
136              UNOPff("sqrt.s");
137              printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
138              break;
139         case SQRTD:
140              UNOPdd("sqrt.d");
141              printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
142              break;
143         case SUBS:
144              BINOPf("sub.s");
145              printf("%s %f %f %f\n", flt_art_op_names[op], fd_f, fs_f[i], ft_f[i]);
146              break;
147         case SUBD:
148              BINOPd("sub.d");
149              printf("%s %lf %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i], ft_d[i]);
150              break;
151         case RECIPS:
152#if (__mips==32) && (__mips_isa_rev>=2)
153              UNOPff("recip.s");
154              printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
155#endif
156              break;
157         case RECIPD:
158#if (__mips==32) && (__mips_isa_rev>=2)
159              UNOPdd("recip.d");
160              printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
161#endif
162              break;
163         case RSQRTS:
164#if (__mips==32) && (__mips_isa_rev>=2)
165              UNOPff("rsqrt.s");
166              printf("%s %f %f\n", flt_art_op_names[op], fd_f, fs_f[i]);
167#endif
168              break;
169         case RSQRTD:
170#if (__mips==32) && (__mips_isa_rev>=2)
171              UNOPdd("rsqrt.d");
172              printf("%s %lf %lf\n", flt_art_op_names[op], fd_d, fs_d[i]);
173#endif
174              break;
175		default:
176			printf("error\n");
177			break;
178		}
179   }
180   return 0;
181}
182
183int main()
184{
185   flt_art_op_t op;
186
187   printf("-------------------------- %s --------------------------\n",
188        "test FPU Arithmetic Operations");
189   for (op = ABSS; op <= RECIPD; op++) {
190      arithmeticOperations(op);
191   }
192
193   return 0;
194}
195
196