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,
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
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
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
49 #if defined(__mips_hard_float)
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" \
65 : "t0", "t1", "$f0", "$f1" \
67 printf("mtc1, mov.s, mfc1 :: mem: 0x%llx out: 0x%llx\n", \
68 (long long)mem, out); \
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" \
86 : "t0", "t1", "$f0", "$f2" \
88 printf("dmtc1, mov.d, dmfc1 :: mem: 0x%llx out: 0x%llx\n", \
89 (long long)mem, out); \
91 #if (__mips_isa_rev < 6)
93 #define TEST3(instruction, FD, FS, cc, offset) \
96 __asm__ __volatile__( \
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" \
107 "mfc1 %0, $"#FD "\n\t" \
109 : "r" (cc), "r" (reg_val_f) \
110 : "t0", "t1", "$"#FD, "$"#FS, "$f0", "$f2" \
112 printf("%s :: out: 0x%x, cc: %d\n", \
113 instruction, out, cc); \
117 #define TEST3d(instruction, FD, FS, cc, offset) \
119 unsigned long long out; \
120 __asm__ __volatile__( \
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" \
130 "dmfc1 %0, $"#FD "\n\t" \
132 : "r" (cc), "r" (reg_val_f) \
133 : "t0", "t1", "$"#FD, "$"#FS, "$f0", "$f2" \
135 printf("%s :: out: 0x%llx, cc: %d\n", \
136 instruction, out, cc); \
140 /* movX.s fd, fs, rt */
141 #define TEST4(instruction, offset, RTval, FD, FS, RT) \
144 __asm__ __volatile__( \
145 "move $"#RT", %2" "\n\t" \
146 "dmtc1 $zero, $"#FD "\n\t" \
147 "dmtc1 $zero, $"#FS "\n\t" \
148 "move $t0, %1" "\n\t" \
149 "lwc1 $"#FS", "#offset"($t0)" "\n\t" \
151 "mfc1 %0, $"#FD"\n\t" \
153 : "r" (reg_val_f), "r" (RTval) \
154 : "t0", #RT, "$"#FD, "$"#FS \
156 printf("%s :: out: 0x%x\n", instruction, out); \
159 /* movX.d fd, fs, rt */
160 #define TEST4d(instruction, offset, RTval, FD, FS, RT) \
162 unsigned long long out; \
163 __asm__ __volatile__( \
164 "move $"#RT", %2" "\n\t" \
165 "dmtc1 $zero, $"#FD "\n\t" \
166 "dmtc1 $zero, $"#FS "\n\t" \
167 "move $t0, %1" "\n\t" \
168 "ldc1 $"#FS", "#offset"($t0)" "\n\t" \
170 "dmfc1 %0, $"#FD "\n\t" \
172 : "r" (reg_val_f), "r" (RTval) \
173 : #RT, "t0", "$"#FD, "$"#FS \
175 printf("%s :: out: 0x%llx\n", instruction, out); \
178 #if (__mips_isa_rev < 6)
180 #define TEST5(instruction, RDval, RSval, RD, RS) \
182 unsigned long long out; \
183 __asm__ __volatile__( \
184 "c.eq.s %3, %4" "\n\t" \
185 "move $"#RD", %1" "\n\t" \
186 "move $"#RS", %2" "\n\t" \
187 instruction" $"#RD", $"#RS", $fcc0" "\n\t" \
188 "move %0, $"#RD "\n\t" \
190 : "r" (RDval), "r" (RSval), "f" (fs1_f[i]), "f" (fs2_f[i]) \
193 printf("%s :: RDval: 0x%x, RSval: 0x%x, out: 0x%llx\n", \
194 instruction, RDval, RSval, out); \
201 #if defined(__mips_hard_float)
205 for (i
= 0; i
< N
; i
++) {
212 #if (__mips_isa_rev < 6)
213 printf("--- MOVF.S ---\n");
214 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 1, 0);
215 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 1, 8);
216 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 1, 16);
217 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 1, 24);
218 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 1, 32)
219 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 1, 40)
220 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 1, 48)
221 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 1, 56)
222 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 0, 0);
223 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 0, 8);
224 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 0, 16);
225 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 0, 24);
226 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 0, 32);
227 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 0, 40);
228 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 0, 48);
229 TEST3("movf.s $f4, $f6, $fcc0", f4
, f6
, 0, 56);
231 printf("--- MOVF.D ---\n");
232 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 1, 0);
233 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 1, 8);
234 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 1, 16);
235 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 1, 24);
236 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 1, 32);
237 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 1, 40)
238 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 1, 48)
239 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 1, 56)
240 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 0, 0);
241 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 0, 8);
242 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 0, 16);
243 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 0, 24);
244 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 0, 32);
245 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 0, 40);
246 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 0, 48);
247 TEST3d("movf.d $f4, $f6, $fcc0", f4
, f6
, 0, 56);
249 printf("--- MOVN.S ---\n");
250 TEST4("movn.s $f0, $f2, $11", 0, 0, f0
, f2
, 11);
251 TEST4("movn.s $f0, $f2, $11", 0, 1, f0
, f2
, 11);
252 TEST4("movn.s $f0, $f2, $11", 8, 0xffff, f0
, f2
, 11);
253 TEST4("movn.s $f0, $f2, $11", 16, -1, f0
, f2
, 11);
254 TEST4("movn.s $f0, $f2, $11", 16, 5, f0
, f2
, 11);
255 TEST4("movn.s $f0, $f2, $11", 24, 0, f0
, f2
, 11);
256 TEST4("movn.s $f0, $f2, $11", 24, 0, f0
, f2
, 11);
257 TEST4("movn.s $f0, $f2, $11", 32, 5, f0
, f2
, 11);
258 TEST4("movn.s $f0, $f2, $11", 32, 125487, f0
, f2
, 11);
259 TEST4("movn.s $f0, $f2, $11", 40, 68, f0
, f2
, 11);
260 TEST4("movn.s $f0, $f2, $11", 40, -122544, f0
, f2
, 11);
261 TEST4("movn.s $f0, $f2, $11", 48, 0, f0
, f2
, 11);
262 TEST4("movn.s $f0, $f2, $11", 48, 0, f0
, f2
, 11);
263 TEST4("movn.s $f0, $f2, $11", 56, 0xffffffff, f0
, f2
, 11);
264 TEST4("movn.s $f0, $f2, $11", 56, 0x80000000, f0
, f2
, 11);
265 TEST4("movn.s $f0, $f2, $11", 64, 0x7fffffff, f0
, f2
, 11);
267 printf("--- MOVN.D ---\n");
268 TEST4d("movn.d $f0, $f2, $11", 0, 0, f0
, f2
, 11);
269 TEST4d("movn.d $f0, $f2, $11", 0, 1, f0
, f2
, 11);
270 TEST4d("movn.d $f0, $f2, $11", 8, 0xffff, f0
, f2
, 11);
271 TEST4d("movn.d $f0, $f2, $11", 8, -1, f0
, f2
, 11);
272 TEST4d("movn.d $f0, $f2, $11", 16, 5, f0
, f2
, 11);
273 TEST4d("movn.d $f0, $f2, $11", 24, 0, f0
, f2
, 11);
274 TEST4d("movn.d $f0, $f2, $11", 24, 0, f0
, f2
, 11);
275 TEST4d("movn.d $f0, $f2, $11", 32, 5, f0
, f2
, 11);
276 TEST4d("movn.d $f0, $f2, $11", 32, 125487, f0
, f2
, 11);
277 TEST4d("movn.d $f0, $f2, $11", 40, 68, f0
, f2
, 11);
278 TEST4d("movn.d $f0, $f2, $11", 40, -122544, f0
, f2
, 11);
279 TEST4d("movn.d $f0, $f2, $11", 48, 0, f0
, f2
, 11);
280 TEST4d("movn.d $f0, $f2, $11", 48, 0, f0
, f2
, 11);
281 TEST4d("movn.d $f0, $f2, $11", 56, 0xffffffff, f0
, f2
, 11);
282 TEST4d("movn.d $f0, $f2, $11", 56, 0x80000000, f0
, f2
, 11);
283 TEST4d("movn.d $f0, $f2, $11", 64, 0x7fffffff, f0
, f2
, 11);
285 printf("--- MOVT.S ---\n");
286 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 1, 0);
287 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 1, 0);
288 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 1, 8);
289 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 1, 16);
290 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 1, 24);
291 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 1, 32);
292 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 1, 40)
293 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 1, 48)
294 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 1, 56)
295 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 0, 0);
296 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 0, 8);
297 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 0, 16);
298 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 0, 24);
299 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 0, 32);
300 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 0, 40);
301 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 0, 48);
302 TEST3("movt.s $f4, $f6, $fcc0", f4
, f6
, 0, 56);
304 printf("--- MOVT.D ---\n");
305 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 1, 0);
306 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 1, 0);
307 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 1, 8);
308 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 1, 16);
309 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 1, 24);
310 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 1, 32);
311 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 1, 40)
312 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 1, 48)
313 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 1, 56)
314 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 0, 0);
315 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 0, 8);
316 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 0, 16);
317 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 0, 24);
318 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 0, 32);
319 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 0, 40);
320 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 0, 48);
321 TEST3d("movt.d $f4, $f6, $fcc0", f4
, f6
, 0, 56);
323 printf("--- MOVZ.S ---\n");
324 TEST4("movz.s $f0, $f2, $11", 0, 0, f0
, f2
, 11);
325 TEST4("movz.s $f0, $f2, $11", 8, 1, f0
, f2
, 11);
326 TEST4("movz.s $f0, $f2, $11", 8, 0xffff, f0
, f2
, 11);
327 TEST4("movz.s $f0, $f2, $11", 16, -1, f0
, f2
, 11);
328 TEST4("movz.s $f0, $f2, $11", 16, 5, f0
, f2
, 11);
329 TEST4("movz.s $f0, $f2, $11", 24, 0, f0
, f2
, 11);
330 TEST4("movz.s $f0, $f2, $11", 24, 0, f0
, f2
, 11);
331 TEST4("movz.s $f0, $f2, $11", 32, 5, f0
, f2
, 11);
332 TEST4("movz.s $f0, $f2, $11", 32, 125487, f0
, f2
, 11);
333 TEST4("movz.s $f0, $f2, $11", 40, 68, f0
, f2
, 11);
334 TEST4("movz.s $f0, $f2, $11", 40, -122544, f0
, f2
, 11);
335 TEST4("movz.s $f0, $f2, $11", 48, 0, f0
, f2
, 11);
336 TEST4("movz.s $f0, $f2, $11", 48, 0, f0
, f2
, 11);
337 TEST4("movz.s $f0, $f2, $11", 56, 0xffffffff, f0
, f2
, 11);
338 TEST4("movz.s $f0, $f2, $11", 56, 0x80000000, f0
, f2
, 11);
339 TEST4("movz.s $f0, $f2, $11", 64, 0x7fffffff, f0
, f2
, 11);
341 printf("--- MOVZ.D ---\n");
342 TEST4d("movz.d $f0, $f2, $11", 0, 0, f0
, f2
, 11);
343 TEST4d("movz.d $f0, $f2, $11", 0, 1, f0
, f2
, 11);
344 TEST4d("movz.d $f0, $f2, $11", 8, 0xffff, f0
, f2
, 11);
345 TEST4d("movz.d $f0, $f2, $11", 16, -1, f0
, f2
, 11);
346 TEST4d("movz.d $f0, $f2, $11", 16, 5, f0
, f2
, 11);
347 TEST4d("movz.d $f0, $f2, $11", 24, 0, f0
, f2
, 11);
348 TEST4d("movz.d $f0, $f2, $11", 24, 0, f0
, f2
, 11);
349 TEST4d("movz.d $f0, $f2, $11", 32, 5, f0
, f2
, 11);
350 TEST4d("movz.d $f0, $f2, $11", 32, 125487, f0
, f2
, 11);
351 TEST4d("movz.d $f0, $f2, $11", 40, 68, f0
, f2
, 11);
352 TEST4d("movz.d $f0, $f2, $11", 40, -122544, f0
, f2
, 11);
353 TEST4d("movz.d $f0, $f2, $11", 48, 0, f0
, f2
, 11);
354 TEST4d("movz.d $f0, $f2, $11", 48, 0, f0
, f2
, 11);
355 TEST4d("movz.d $f0, $f2, $11", 56, 0xffffffff, f0
, f2
, 11);
356 TEST4d("movz.d $f0, $f2, $11", 56, 0x80000000, f0
, f2
, 11);
357 TEST4d("movz.d $f0, $f2, $11", 64, 0x7fffffff, f0
, f2
, 11);
359 printf("--- MOVF --- if FPConditionalCode(cc) == 0 then "
360 "out = RSval else out = RDval\n");
361 for (i
= 0; i
< 24; i
++) {
362 TEST5("movf", 0xaaaaaaaa, 0x80000000, t0
, t1
);
363 TEST5("movf", 0xccccffff, 0xffffffff, t1
, t2
);
364 TEST5("movf", 0xffffaaaa, 0xaaaaffff, t3
, t1
);
365 TEST5("movf", 0x0, 0xffffffff, t3
, t0
);
368 printf("--- MOVT --- if FPConditionalCode(cc) == 1 then "
369 "out = RSval else out = RDval\n");
370 for (i
= 0; i
< 24; i
++) {
371 TEST5("movt", 0x0, 0xffffffff, t0
, t1
);
372 TEST5("movt", 0x11111111, 0xeeeeffff, t1
, t2
);
373 TEST5("movt", 0x5555ffff, 0xffffffff, t3
, t1
);
374 TEST5("movt", 0xeeeeeeee, 0xffffeeee, t3
, t0
);