• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include "const.h"
3 
4 const float reg_val_f[] = {
5    -347856.475, 356047.56,   -1.0,       23.04,
6    1752,        0.0024575,   0.00000001, -248562.76,
7    1384.6,      -7.2945676,  1000000000, -5786.47,
8    -347856.475, 356047.56,   -1.0,       23.04,
9    0,           456.2489562, 3,          -1,
10    -45786.476,  456.2489562, 34.00046,   45786.476,
11    0,           456.2489562, 3,          -1,
12    1384.6,      -7.2945676,  1000000000, -5786.47,
13    1752,        0.0024575,   0.00000001, -248562.76,
14    -45786.476,  456.2489562, 34.00046,   45786.476,
15    1752065,     107,         -45667.24,  -7.2945676,
16    -347856.475, 356047.56,   -1.0,       23.04,
17    -347856.475, 356047.56,   -1.0,       23.04,
18    1752,        0.0024575,   0.00000001, -248562.76,
19    1384.6,      -7.2945676,  1000000000, -5786.47,
20    -347856.475, 356047.56,   -1.0,       23.04,
21    0,           456.2489562, 3,          -1,
22    -45786.476,  456.2489562, 34.00046,   45786.476,
23    0,           456.2489562, 3,          -1,
24    1384.6,      -7.2945676,  1000000000, -5786.47,
25    1752,        0.0024575,   0.00000001, -248562.76,
26    -45786.476,  456.2489562, 34.00046,   45786.476,
27    1752065,     107,         -45667.24,  -7.2945676,
28    -347856.475, 356047.56,   -1.0,       23.04
29 };
30 
31 const float fs1_f[] = {
32    0,           456.2489562, 3,          -1,
33    1384.6,      -7.2945676,  1000000000, -5786.47,
34    1752,        0.0024575,   0.00000001, -248562.76,
35    -45786.476,  456.2489562, 34.00046,   45786.476,
36    1752065,     107,         -45667.24,  -7.2945676,
37    -347856.475, 356047.56,   -1.0,       23.04
38 };
39 
40 const double fs2_f[] = {
41    0,           456.2489562, 3,           -1,
42    -7.2945676,  1384.6,      1000000000,  -5786.47,
43    1752,        0.0024575,   -248562.76,  0.00000001,
44    -45786.476,  45786.476,   456.2489562, 34.00046,
45    1752065,     107,         -45667.24,   -7.2945676,
46    -347856.475, 23.04        -1.0,        356047.56
47 };
48 
49 #if defined(__mips_hard_float)
50 #define TEST1(mem)                                           \
51 {                                                            \
52    unsigned long long out;                                   \
53    __asm__ __volatile__(                                     \
54       ".set  noreorder"  "\n\t"                              \
55       ".set  nomacro"    "\n\t"                              \
56       "move  $t0, %1"    "\n\t"                              \
57       "mtc1  $t0, $f0"   "\n\t"                              \
58       "mov.s $f1, $f0"   "\n\t"                              \
59       "mfc1  $t1, $f1"   "\n\t"                              \
60       "move  %0,  $t1"   "\n\t"                              \
61       ".set  reorder"    "\n\t"                              \
62       ".set  macro"      "\n\t"                              \
63       : "=r" (out)                                           \
64       : "r" (mem)                                            \
65       : "t0", "t1", "$f0", "$f1"                             \
66    );                                                        \
67    printf("mtc1, mov.s, mfc1 :: mem: 0x%llx out: 0x%llx\n",  \
68           (long long)mem, out);                              \
69 }
70 
71 #define TEST2(mem)                                             \
72 {                                                              \
73    unsigned long long out;                                     \
74    __asm__ __volatile__(                                       \
75       ".set  noreorder"  "\n\t"                                \
76       ".set  nomacro"    "\n\t"                                \
77       "move  $t0, %1"    "\n\t"                                \
78       "dmtc1 $t0, $f2"   "\n\t"                                \
79       "mov.d $f0, $f2"   "\n\t"                                \
80       "dmfc1 $t1, $f0"   "\n\t"                                \
81       "move  %0,  $t1"   "\n\t"                                \
82       ".set  reorder"  "\n\t"                                  \
83       ".set  macro"    "\n\t"                                  \
84       : "=r" (out)                                             \
85       : "r" (mem)                                              \
86       : "t0", "t1", "$f0", "$f2"                               \
87    );                                                          \
88    printf("dmtc1, mov.d, dmfc1 :: mem: 0x%llx out: 0x%llx\n",  \
89           (long long)mem, out);                                \
90 }
91 
92 /* movX.s fd, fs */
93 #define TEST3(instruction, FD, FS, cc, offset)    \
94 {                                                 \
95    unsigned int out;                              \
96    __asm__ __volatile__(                          \
97       "li     $t0,    1"               "\n\t"     \
98       "move   $t1,    %1"              "\n\t"     \
99       "mtc1   $t0,    $f0"             "\n\t"     \
100       "mtc1   $t1,    $f2"             "\n\t"     \
101       "dmtc1  $zero,  $"#FD            "\n\t"     \
102       "dmtc1  $zero,  $"#FS            "\n\t"     \
103       "c.eq.s $f0,    $f2"             "\n\t"     \
104       "move   $t0,    %2"              "\n\t"     \
105       "lwc1   $"#FS", "#offset"($t0)"  "\n\t"     \
106       instruction                      "\n\t"     \
107       "mfc1   %0,     $"#FD            "\n\t"     \
108       : "=r" (out)                                \
109       : "r" (cc), "r" (reg_val_f)                 \
110       : "t0", "t1", "$"#FD, "$"#FS, "$f0", "$f2"  \
111    );                                             \
112    printf("%s :: out: 0x%x, cc: %d\n",            \
113           instruction, out, cc);                  \
114 }
115 
116 /* movX.d fd, fs */
117 #define TEST3d(instruction, FD, FS, cc, offset)   \
118 {                                                 \
119    unsigned long long out;                        \
120    __asm__ __volatile__(                          \
121       "li     $t0,    1"               "\n\t"     \
122       "move   $t1,    %1"              "\n\t"     \
123       "mtc1   $t0,    $f0"             "\n\t"     \
124       "mtc1   $t1,    $f2"             "\n\t"     \
125       "dmtc1  $zero,  $"#FD            "\n\t"     \
126       "c.eq.s $f0,    $f2"             "\n\t"     \
127       "move   $t0,    %2"              "\n\t"     \
128       "ldc1   $"#FS", "#offset"($t0)"  "\n\t"     \
129       instruction                      "\n\t"     \
130       "dmfc1  %0,     $"#FD            "\n\t"     \
131       : "=r" (out)                                \
132       : "r" (cc), "r" (reg_val_f)                 \
133       : "t0", "t1", "$"#FD, "$"#FS, "$f0", "$f2"  \
134    );                                             \
135    printf("%s :: out: 0x%llx, cc: %d\n",          \
136           instruction, out, cc);                  \
137 }
138 
139 /* movX.s fd, fs, rt */
140 #define TEST4(instruction, offset, RTval, FD, FS, RT)  \
141 {                                                      \
142    unsigned int out;                                   \
143    __asm__ __volatile__(                               \
144       "move  $"#RT", %2"              "\n\t"           \
145       "dmtc1 $zero,  $"#FD            "\n\t"           \
146       "dmtc1 $zero,  $"#FS            "\n\t"           \
147       "move  $t0,    %1"              "\n\t"           \
148       "lwc1  $"#FS", "#offset"($t0)"  "\n\t"           \
149       instruction                     "\n\t"           \
150       "mfc1 %0,     $"#FD"\n\t"                        \
151       : "=r" (out)                                     \
152       : "r" (reg_val_f), "r" (RTval)                   \
153       : "t0", #RT, "$"#FD, "$"#FS                      \
154    );                                                  \
155    printf("%s :: out: 0x%x\n", instruction, out);      \
156 }
157 
158 /* movX.d fd, fs, rt */
159 #define TEST4d(instruction, offset, RTval, FD, FS, RT)  \
160 {                                                       \
161    unsigned long long out;                              \
162    __asm__ __volatile__(                                \
163       "move  $"#RT", %2"              "\n\t"            \
164       "dmtc1 $zero,  $"#FD            "\n\t"            \
165       "dmtc1 $zero,  $"#FS            "\n\t"            \
166       "move  $t0,    %1"              "\n\t"            \
167       "ldc1  $"#FS", "#offset"($t0)"  "\n\t"            \
168       instruction                     "\n\t"            \
169       "dmfc1 %0,     $"#FD            "\n\t"            \
170       : "=r" (out)                                      \
171       : "r" (reg_val_f), "r" (RTval)                    \
172       : #RT, "t0", "$"#FD, "$"#FS                       \
173    );                                                   \
174    printf("%s :: out: 0x%llx\n", instruction, out);     \
175 }
176 
177 /* movf, movt */
178 #define TEST5(instruction, RDval, RSval, RD, RS)                  \
179 {                                                                 \
180    unsigned long out;                                             \
181    __asm__ __volatile__(                                          \
182       "c.eq.s      %3,     %4"             "\n\t"                 \
183       "move        $"#RD", %1"             "\n\t"                 \
184       "move        $"#RS", %2"             "\n\t"                 \
185       instruction" $"#RD", $"#RS", $fcc0"  "\n\t"                 \
186       "move        %0,     $"#RD           "\n\t"                 \
187       : "=r" (out)                                                \
188       : "r" (RDval), "r" (RSval), "f" (fs1_f[i]), "f" (fs2_f[i])  \
189       : #RD, #RS                                                  \
190    );                                                             \
191    printf("%s ::  RDval: 0x%x, RSval: 0x%x, out: 0x%lx\n",        \
192           instruction, RDval, RSval, out);                        \
193 }
194 #endif
195 
main()196 int main()
197 {
198 #if defined(__mips_hard_float)
199    int i;
200    init_reg_val2();
201 
202    for (i = 0; i < N; i++) {
203       TEST1(reg_val1[i]);
204       TEST2(reg_val1[i]);
205       TEST1(reg_val2[i]);
206       TEST2(reg_val2[i]);
207    }
208 
209    printf("--- MOVF.S ---\n");
210    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 1, 0);
211    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 1, 8);
212    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 1, 16);
213    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 1, 24);
214    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 1, 32)
215    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 1, 40)
216    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 1, 48)
217    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 1, 56)
218    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 0, 0);
219    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 0, 8);
220    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 0, 16);
221    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 0, 24);
222    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 0, 32);
223    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 0, 40);
224    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 0, 48);
225    TEST3("movf.s  $f4, $f6, $fcc0", f4, f6, 0, 56);
226 
227    printf("--- MOVF.D ---\n");
228    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 1, 0);
229    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 1, 8);
230    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 1, 16);
231    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 1, 24);
232    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 1, 32);
233    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 1, 40)
234    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 1, 48)
235    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 1, 56)
236    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 0, 0);
237    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 0, 8);
238    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 0, 16);
239    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 0, 24);
240    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 0, 32);
241    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 0, 40);
242    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 0, 48);
243    TEST3d("movf.d  $f4, $f6, $fcc0", f4, f6, 0, 56);
244 
245    printf("--- MOVN.S ---\n");
246    TEST4("movn.s  $f0, $f2, $11", 0,  0,          f0, f2, 11);
247    TEST4("movn.s  $f0, $f2, $11", 0,  1,          f0, f2, 11);
248    TEST4("movn.s  $f0, $f2, $11", 8,  0xffff,     f0, f2, 11);
249    TEST4("movn.s  $f0, $f2, $11", 16, -1,         f0, f2, 11);
250    TEST4("movn.s  $f0, $f2, $11", 16, 5,          f0, f2, 11);
251    TEST4("movn.s  $f0, $f2, $11", 24, 0,          f0, f2, 11);
252    TEST4("movn.s  $f0, $f2, $11", 24, 0,          f0, f2, 11);
253    TEST4("movn.s  $f0, $f2, $11", 32, 5,          f0, f2, 11);
254    TEST4("movn.s  $f0, $f2, $11", 32, 125487,     f0, f2, 11);
255    TEST4("movn.s  $f0, $f2, $11", 40, 68,         f0, f2, 11);
256    TEST4("movn.s  $f0, $f2, $11", 40, -122544,    f0, f2, 11);
257    TEST4("movn.s  $f0, $f2, $11", 48, 0,          f0, f2, 11);
258    TEST4("movn.s  $f0, $f2, $11", 48, 0,          f0, f2, 11);
259    TEST4("movn.s  $f0, $f2, $11", 56, 0xffffffff, f0, f2, 11);
260    TEST4("movn.s  $f0, $f2, $11", 56, 0x80000000, f0, f2, 11);
261    TEST4("movn.s  $f0, $f2, $11", 64, 0x7fffffff, f0, f2, 11);
262 
263    printf("--- MOVN.D ---\n");
264    TEST4d("movn.d $f0, $f2, $11", 0,  0,          f0, f2, 11);
265    TEST4d("movn.d $f0, $f2, $11", 0,  1,          f0, f2, 11);
266    TEST4d("movn.d $f0, $f2, $11", 8,  0xffff,     f0, f2, 11);
267    TEST4d("movn.d $f0, $f2, $11", 8,  -1,         f0, f2, 11);
268    TEST4d("movn.d $f0, $f2, $11", 16, 5,          f0, f2, 11);
269    TEST4d("movn.d $f0, $f2, $11", 24, 0,          f0, f2, 11);
270    TEST4d("movn.d $f0, $f2, $11", 24, 0,          f0, f2, 11);
271    TEST4d("movn.d $f0, $f2, $11", 32, 5,          f0, f2, 11);
272    TEST4d("movn.d $f0, $f2, $11", 32, 125487,     f0, f2, 11);
273    TEST4d("movn.d $f0, $f2, $11", 40, 68,         f0, f2, 11);
274    TEST4d("movn.d $f0, $f2, $11", 40, -122544,    f0, f2, 11);
275    TEST4d("movn.d $f0, $f2, $11", 48, 0,          f0, f2, 11);
276    TEST4d("movn.d $f0, $f2, $11", 48, 0,          f0, f2, 11);
277    TEST4d("movn.d $f0, $f2, $11", 56, 0xffffffff, f0, f2, 11);
278    TEST4d("movn.d $f0, $f2, $11", 56, 0x80000000, f0, f2, 11);
279    TEST4d("movn.d $f0, $f2, $11", 64, 0x7fffffff, f0, f2, 11);
280 
281    printf("--- MOVT.S ---\n");
282    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 1, 0);
283    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 1, 0);
284    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 1, 8);
285    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 1, 16);
286    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 1, 24);
287    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 1, 32);
288    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 1, 40)
289    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 1, 48)
290    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 1, 56)
291    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 0, 0);
292    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 0, 8);
293    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 0, 16);
294    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 0, 24);
295    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 0, 32);
296    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 0, 40);
297    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 0, 48);
298    TEST3("movt.s  $f4, $f6, $fcc0", f4, f6, 0, 56);
299 
300    printf("--- MOVT.D ---\n");
301    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 1, 0);
302    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 1, 0);
303    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 1, 8);
304    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 1, 16);
305    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 1, 24);
306    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 1, 32);
307    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 1, 40)
308    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 1, 48)
309    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 1, 56)
310    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 0, 0);
311    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 0, 8);
312    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 0, 16);
313    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 0, 24);
314    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 0, 32);
315    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 0, 40);
316    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 0, 48);
317    TEST3d("movt.d  $f4, $f6, $fcc0", f4, f6, 0, 56);
318 
319    printf("--- MOVZ.S ---\n");
320    TEST4("movz.s $f0, $f2, $11", 0,  0,          f0, f2, 11);
321    TEST4("movz.s $f0, $f2, $11", 8,  1,          f0, f2, 11);
322    TEST4("movz.s $f0, $f2, $11", 8,  0xffff,     f0, f2, 11);
323    TEST4("movz.s $f0, $f2, $11", 16, -1,         f0, f2, 11);
324    TEST4("movz.s $f0, $f2, $11", 16, 5,          f0, f2, 11);
325    TEST4("movz.s $f0, $f2, $11", 24, 0,          f0, f2, 11);
326    TEST4("movz.s $f0, $f2, $11", 24, 0,          f0, f2, 11);
327    TEST4("movz.s $f0, $f2, $11", 32, 5,          f0, f2, 11);
328    TEST4("movz.s $f0, $f2, $11", 32, 125487,     f0, f2, 11);
329    TEST4("movz.s $f0, $f2, $11", 40, 68,         f0, f2, 11);
330    TEST4("movz.s $f0, $f2, $11", 40, -122544,    f0, f2, 11);
331    TEST4("movz.s $f0, $f2, $11", 48, 0,          f0, f2, 11);
332    TEST4("movz.s $f0, $f2, $11", 48, 0,          f0, f2, 11);
333    TEST4("movz.s $f0, $f2, $11", 56, 0xffffffff, f0, f2, 11);
334    TEST4("movz.s $f0, $f2, $11", 56, 0x80000000, f0, f2, 11);
335    TEST4("movz.s $f0, $f2, $11", 64, 0x7fffffff, f0, f2, 11);
336 
337    printf("--- MOVZ.D ---\n");
338    TEST4d("movz.d $f0, $f2, $11", 0,  0,          f0, f2, 11);
339    TEST4d("movz.d $f0, $f2, $11", 0,  1,          f0, f2, 11);
340    TEST4d("movz.d $f0, $f2, $11", 8,  0xffff,     f0, f2, 11);
341    TEST4d("movz.d $f0, $f2, $11", 16, -1,         f0, f2, 11);
342    TEST4d("movz.d $f0, $f2, $11", 16, 5,          f0, f2, 11);
343    TEST4d("movz.d $f0, $f2, $11", 24, 0,          f0, f2, 11);
344    TEST4d("movz.d $f0, $f2, $11", 24, 0,          f0, f2, 11);
345    TEST4d("movz.d $f0, $f2, $11", 32, 5,          f0, f2, 11);
346    TEST4d("movz.d $f0, $f2, $11", 32, 125487,     f0, f2, 11);
347    TEST4d("movz.d $f0, $f2, $11", 40, 68,         f0, f2, 11);
348    TEST4d("movz.d $f0, $f2, $11", 40, -122544,    f0, f2, 11);
349    TEST4d("movz.d $f0, $f2, $11", 48, 0,          f0, f2, 11);
350    TEST4d("movz.d $f0, $f2, $11", 48, 0,          f0, f2, 11);
351    TEST4d("movz.d $f0, $f2, $11", 56, 0xffffffff, f0, f2, 11);
352    TEST4d("movz.d $f0, $f2, $11", 56, 0x80000000, f0, f2, 11);
353    TEST4d("movz.d $f0, $f2, $11", 64, 0x7fffffff, f0, f2, 11);
354 
355    printf("--- MOVF --- if FPConditionalCode(cc) == 0 then "
356           "out = RSval else out = RDval\n");
357    for (i = 0; i < 24; i++) {
358       TEST5("movf", 0xaaaaaaaa, 0x80000000, t0, t1);
359       TEST5("movf", 0xccccffff, 0xffffffff, t1, t2);
360       TEST5("movf", 0xffffaaaa, 0xaaaaffff, t3, t1);
361       TEST5("movf", 0x0,        0xffffffff, t3, t0);
362    }
363 
364    printf("--- MOVT --- if FPConditionalCode(cc) == 1 then "
365           "out = RSval else out = RDval\n");
366    for (i = 0; i < 24; i++) {
367       TEST5("movt", 0x0,        0xffffffff, t0, t1);
368       TEST5("movt", 0x11111111, 0xeeeeffff, t1, t2);
369       TEST5("movt", 0x5555ffff, 0xffffffff, t3, t1);
370       TEST5("movt", 0xeeeeeeee, 0xffffeeee, t3, t0);
371    }
372 #endif
373    return 0;
374 }
375