1 #include <stdio.h>
2
3 typedef 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
15 const 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
27 const 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
36 const 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
45 const 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
54 const 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
arithmeticOperations(flt_art_op_t op)87 int 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
main()183 int 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