1 #include <stdio.h>
2
3 unsigned int mem[] = {
4 0x4095A266, 0x66666666,
5 0xBFF00000, 0x00000000,
6 0x3FF00000, 0x00000000,
7 0x252a2e2b, 0x262d2d2a,
8 0xFFFFFFFF, 0xFFFFFFFF,
9 0x41D26580, 0xB487E5C9,
10 0x42026580, 0xB750E388,
11 0x3E45798E, 0xE2308C3A,
12 0x3FBF9ADD, 0x3746F65F
13 };
14
15 float fs_f[] = {
16 0, 456.2489562, 3, -1,
17 1384.6, -7.2945676, 1000000000, -5786.47,
18 1752, 0.0024575, 0.00000001, -248562.76,
19 -45786.476, 456.2489562, 34.00046, 45786.476,
20 1752065, 107, -45667.24, -7.2945676,
21 -347856.475, 356047.56, -1.0, 23.04
22 };
23
24 double fs_d[] = {
25 0, 456.2489562, 3, -1,
26 1384.6, -7.2945676, 1000000000, -5786.47,
27 1752, 0.0024575, 0.00000001, -248562.76,
28 -45786.476, 456.2489562, 34.00046, 45786.476,
29 1752065, 107, -45667.24, -7.2945676,
30 -347856.475, 356047.56, -1.0, 23.04
31 };
32
33 double mem1[] = {
34 0, 0, 0, 0,
35 0, 0, 0, 0,
36 0, 0, 0, 0,
37 0, 0, 0, 0
38 };
39
40 float mem1f[] = {
41 0, 0, 0, 0,
42 0, 0, 0, 0,
43 0, 0, 0, 0,
44 0, 0, 0, 0
45 };
46
47 // ldc1 $f0, 0($t1)
48 #if (__mips_fpr==64)
49 #define TESTINSN5LOAD(instruction, RTval, offset, RT) \
50 { \
51 double out; \
52 int out1; \
53 int out2; \
54 __asm__ volatile( \
55 "move $t1, %3\n\t" \
56 "li $t0, " #RTval"\n\t" \
57 instruction "\n\t" \
58 "mov.d %0, $" #RT "\n\t" \
59 "mfc1 %1, $" #RT "\n\t" \
60 "mfhc1 %2, $" #RT "\n\t" \
61 : "=&f" (out), "=&r" (out1), "=&r" (out2) \
62 : "r" (mem), "r" (RTval) \
63 : "cc", "memory" \
64 ); \
65 printf("%s :: ft 0x%x%x\n", \
66 instruction, out1, out2); \
67 }
68 #else
69 #define TESTINSN5LOAD(instruction, RTval, offset, RT) \
70 { \
71 double out; \
72 int out1; \
73 int out2; \
74 __asm__ volatile( \
75 "move $t1, %3\n\t" \
76 "li $t0, " #RTval"\n\t" \
77 instruction "\n\t" \
78 "mov.d %0, $" #RT "\n\t" \
79 "mfc1 %1, $" #RT "\n\t" \
80 "mfc1 %2, $f1\n\t" \
81 : "=&f" (out), "=&r" (out1), "=&r" (out2) \
82 : "r" (mem), "r" (RTval) \
83 : "cc", "memory" \
84 ); \
85 printf("%s :: ft 0x%x%x\n", \
86 instruction, out1, out2); \
87 }
88 #endif
89
90 // lwc1 $f0, 0($t1)
91 #define TESTINSN5LOADw(instruction, RTval, offset, RT) \
92 { \
93 double out; \
94 int out1; \
95 __asm__ volatile( \
96 "move $t1, %2\n\t" \
97 "li $t0, " #RTval"\n\t" \
98 instruction "\n\t" \
99 "mov.d %0, $" #RT "\n\t" \
100 "mfc1 %1, $" #RT "\n\t" \
101 : "=&f" (out), "=&r" (out1) \
102 : "r" (mem), "r" (RTval) \
103 : "cc", "memory" \
104 ); \
105 printf("%s :: ft 0x%x\n", \
106 instruction, out1); \
107 }
108
109 // lwxc1 $f0, $a3($v0)
110 #define TESTINSN6LOADw(instruction, indexVal, fd, index, base) \
111 { \
112 int out; \
113 __asm__ volatile( \
114 "move $" #base ", %1\n\t" \
115 "li $" #index ", " #indexVal"\n\t" \
116 instruction "\n\t" \
117 "mfc1 %0, $" #fd "\n\t" \
118 : "=&r" (out) \
119 : "r" (mem) \
120 : "cc", "memory" \
121 ); \
122 printf("%s :: ft 0x%x\n", \
123 instruction, out); \
124 }
125
126 // ldxc1 $f0, $a3($v0)
127 #if (__mips_fpr==64)
128 #define TESTINSN6LOADd(instruction, indexVal, fd, index, base) \
129 { \
130 int out1; \
131 int out2; \
132 __asm__ volatile( \
133 "move $" #base ", %2\n\t" \
134 "li $" #index ", " #indexVal"\n\t" \
135 instruction "\n\t" \
136 "mfc1 %0, $" #fd "\n\t" \
137 "mfhc1 %1, $" #fd "\n\t" \
138 : "=&r" (out1), "=&r" (out2) \
139 : "r" (mem) \
140 : "cc", "memory" \
141 ); \
142 printf("%s :: ft lo: 0x%x, ft hi: 0x%x\n", \
143 instruction, out1, out2); \
144 }
145 #else
146 #define TESTINSN6LOADd(instruction, indexVal, fd, index, base) \
147 { \
148 int out1; \
149 int out2; \
150 __asm__ volatile( \
151 "move $" #base ", %2\n\t" \
152 "li $" #index ", " #indexVal"\n\t" \
153 instruction "\n\t" \
154 "mfc1 %0, $" #fd "\n\t" \
155 "mfc1 %1, $f1\n\t" \
156 : "=&r" (out1), "=&r" (out2) \
157 : "r" (mem) \
158 : "cc", "memory" \
159 ); \
160 printf("%s :: ft lo: 0x%x, ft hi: 0x%x\n", \
161 instruction, out1, out2); \
162 }
163 #endif
164
165 // sdc1 $f0, 0($t0)
166 #define TESTINST1(offset) \
167 { \
168 unsigned int out; \
169 __asm__ volatile( \
170 "move $t0, %1\n\t" \
171 "move $t1, %2\n\t" \
172 "ldc1 $f0, "#offset"($t1)\n\t" \
173 "sdc1 $f0, "#offset"($t0) \n\t" \
174 "lw %0, "#offset"($t0)\n\t" \
175 : "=&r" (out) \
176 : "r" (mem1), "r" (fs_d) \
177 : "t1", "t0", "cc", "memory" \
178 ); \
179 printf("sdc1 $f0, 0($t0) :: out: 0x%x\n", \
180 out); \
181 }
182
183 // sdxc1 $f0, $t2($t0)
184 #define TESTINST1a(offset) \
185 { \
186 unsigned int out; \
187 unsigned int out1; \
188 __asm__ volatile( \
189 "move $t0, %2\n\t" \
190 "move $t1, %3\n\t" \
191 "li $t2, "#offset"\n\t" \
192 "ldc1 $f0, "#offset"($t1)\n\t" \
193 "sdxc1 $f0, $t2($t0) \n\t" \
194 "lw %0, "#offset"($t0)\n\t" \
195 "addi $t0, $t0, 4 \n\t" \
196 "lw %1, "#offset"($t0)\n\t" \
197 : "=&r" (out), "=&r" (out1) \
198 : "r" (mem1), "r" (fs_d) \
199 : "t2", "t1", "t0", "cc", "memory" \
200 ); \
201 printf("sdc1 $f0, #t2($t0) :: out: 0x%x : out1: 0x%x\n", \
202 out, out1); \
203 }
204
205 // swc1 $f0, 0($t0)
206 #define TESTINST2(offset) \
207 { \
208 unsigned int out; \
209 __asm__ volatile( \
210 "move $t0, %1\n\t" \
211 "move $t1, %2\n\t" \
212 "lwc1 $f0, "#offset"($t1)\n\t" \
213 "swc1 $f0, "#offset"($t0) \n\t" \
214 "lw %0, "#offset"($t0)\n\t" \
215 : "=&r" (out) \
216 : "r" (mem1f), "r" (fs_f) \
217 : "t1", "t0", "cc", "memory" \
218 ); \
219 printf("swc1 $f0, 0($t0) :: out: 0x%x\n", \
220 out); \
221 }
222
223 // SWXC1 $f0, $t2($t0)
224 #define TESTINST2a(offset) \
225 { \
226 unsigned int out; \
227 __asm__ volatile( \
228 "move $t0, %1\n\t" \
229 "move $t1, %2\n\t" \
230 "li $t2, "#offset" \n\t" \
231 "lwc1 $f0, "#offset"($t1)\n\t" \
232 "swxc1 $f0, $t2($t0) \n\t" \
233 "lw %0, "#offset"($t0)\n\t" \
234 : "=&r" (out) \
235 : "r" (mem1f), "r" (fs_f) \
236 : "t2", "t1", "t0", "cc", "memory" \
237 ); \
238 printf("swxc1 $f0, 0($t0) :: out: 0x%x\n", \
239 out); \
240 }
ppMem(double * m,int len)241 void ppMem(double *m, int len)
242 {
243 int i;
244 printf("MEM1:\n");
245 for (i = 0; i < len; i=i+4)
246 {
247 printf("%lf, %lf, %lf, %lf\n", m[i], m[i+1], m[i+2], m[i+3]);
248 m[i] = 0;
249 m[i+1] = 0;
250 m[i+2] = 0;
251 m[i+3] = 0;
252 }
253 }
254
ppMemF(float * m,int len)255 void ppMemF(float *m, int len)
256 {
257 int i;
258 printf("MEM1:\n");
259 for (i = 0; i < len; i=i+4)
260 {
261 printf("%lf, %lf, %lf, %lf\n", m[i], m[i+1], m[i+2], m[i+3]);
262 m[i] = 0;
263 m[i+1] = 0;
264 m[i+2] = 0;
265 m[i+3] = 0;
266 }
267 }
268
main()269 int main()
270 {
271 printf("LDC1\n");
272 TESTINSN5LOAD("ldc1 $f0, 0($t1)", 0, 0, f0);
273 TESTINSN5LOAD("ldc1 $f0, 8($t1)", 0, 8, f0);
274 TESTINSN5LOAD("ldc1 $f0, 16($t1)", 0, 16, f0);
275 TESTINSN5LOAD("ldc1 $f0, 24($t1)", 0, 24, f0);
276 TESTINSN5LOAD("ldc1 $f0, 32($t1)", 0, 32, f0);
277 TESTINSN5LOAD("ldc1 $f0, 40($t1)", 0, 40, f0);
278 TESTINSN5LOAD("ldc1 $f0, 48($t1)", 0, 48, f0);
279 TESTINSN5LOAD("ldc1 $f0, 56($t1)", 0, 56, f0);
280 TESTINSN5LOAD("ldc1 $f0, 64($t1)", 0, 64, f0);
281 TESTINSN5LOAD("ldc1 $f0, 0($t1)", 0, 0, f0);
282 TESTINSN5LOAD("ldc1 $f0, 8($t1)", 0, 8, f0);
283 TESTINSN5LOAD("ldc1 $f0, 16($t1)", 0, 16, f0);
284 TESTINSN5LOAD("ldc1 $f0, 24($t1)", 0, 24, f0);
285 TESTINSN5LOAD("ldc1 $f0, 32($t1)", 0, 32, f0);
286 TESTINSN5LOAD("ldc1 $f0, 40($t1)", 0, 40, f0);
287 TESTINSN5LOAD("ldc1 $f0, 48($t1)", 0, 48, f0);
288 TESTINSN5LOAD("ldc1 $f0, 56($t1)", 0, 56, f0);
289 TESTINSN5LOAD("ldc1 $f0, 0($t1)", 0, 0, f0);
290 TESTINSN5LOAD("ldc1 $f0, 8($t1)", 0, 8, f0);
291 TESTINSN5LOAD("ldc1 $f0, 16($t1)", 0, 16, f0);
292 TESTINSN5LOAD("ldc1 $f0, 24($t1)", 0, 24, f0);
293 TESTINSN5LOAD("ldc1 $f0, 32($t1)", 0, 32, f0);
294 TESTINSN5LOAD("ldc1 $f0, 40($t1)", 0, 40, f0);
295 TESTINSN5LOAD("ldc1 $f0, 48($t1)", 0, 48, f0);
296 TESTINSN5LOAD("ldc1 $f0, 56($t1)", 0, 56, f0);
297 TESTINSN5LOAD("ldc1 $f0, 64($t1)", 0, 64, f0);
298 TESTINSN5LOAD("ldc1 $f0, 0($t1)", 0, 0, f0);
299
300 printf("LWC1\n");
301 TESTINSN5LOADw("lwc1 $f0, 0($t1)", 0, 0, f0);
302 TESTINSN5LOADw("lwc1 $f0, 4($t1)", 0, 4, f0);
303 TESTINSN5LOADw("lwc1 $f0, 8($t1)", 0, 8, f0);
304 TESTINSN5LOADw("lwc1 $f0, 12($t1)", 0, 12, f0);
305 TESTINSN5LOADw("lwc1 $f0, 16($t1)", 0, 16, f0);
306 TESTINSN5LOADw("lwc1 $f0, 20($t1)", 0, 20, f0);
307 TESTINSN5LOADw("lwc1 $f0, 24($t1)", 0, 24, f0);
308 TESTINSN5LOADw("lwc1 $f0, 28($t1)", 0, 28, f0);
309 TESTINSN5LOADw("lwc1 $f0, 32($t1)", 0, 32, f0);
310 TESTINSN5LOADw("lwc1 $f0, 36($t1)", 0, 36, f0);
311 TESTINSN5LOADw("lwc1 $f0, 40($t1)", 0, 40, f0);
312 TESTINSN5LOADw("lwc1 $f0, 44($t1)", 0, 44, f0);
313 TESTINSN5LOADw("lwc1 $f0, 48($t1)", 0, 48, f0);
314 TESTINSN5LOADw("lwc1 $f0, 52($t1)", 0, 52, f0);
315 TESTINSN5LOADw("lwc1 $f0, 56($t1)", 0, 56, f0);
316 TESTINSN5LOADw("lwc1 $f0, 60($t1)", 0, 60, f0);
317 TESTINSN5LOADw("lwc1 $f0, 64($t1)", 0, 64, f0);
318 TESTINSN5LOADw("lwc1 $f0, 0($t1)", 0, 0, f0);
319 TESTINSN5LOADw("lwc1 $f0, 8($t1)", 0, 8, f0);
320 TESTINSN5LOADw("lwc1 $f0, 16($t1)", 0, 16, f0);
321 TESTINSN5LOADw("lwc1 $f0, 24($t1)", 0, 24, f0);
322 TESTINSN5LOADw("lwc1 $f0, 32($t1)", 0, 32, f0);
323 TESTINSN5LOADw("lwc1 $f0, 40($t1)", 0, 40, f0);
324 TESTINSN5LOADw("lwc1 $f0, 48($t1)", 0, 48, f0);
325 TESTINSN5LOADw("lwc1 $f0, 56($t1)", 0, 56, f0);
326 TESTINSN5LOADw("lwc1 $f0, 64($t1)", 0, 64, f0);
327 TESTINSN5LOADw("lwc1 $f0, 0($t1)", 0, 0, f0);
328
329 #if (__mips==32) && (__mips_isa_rev>=2)
330 printf("LWXC1\n");
331 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 0, f0, a3, v0);
332 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 4, f0, a3, v0);
333 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 8, f0, a3, v0);
334 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 12, f0, a3, v0);
335 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 16, f0, a3, v0);
336 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 20, f0, a3, v0);
337 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 24, f0, a3, v0);
338 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 28, f0, a3, v0);
339 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 32, f0, a3, v0);
340 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 36, f0, a3, v0);
341 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 40, f0, a3, v0);
342 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 44, f0, a3, v0);
343 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 48, f0, a3, v0);
344 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 52, f0, a3, v0);
345 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 56, f0, a3, v0);
346 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 60, f0, a3, v0);
347 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 64, f0, a3, v0);
348 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 0, f0, a3, v0);
349 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 4, f0, a3, v0);
350 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 8, f0, a3, v0);
351 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 12, f0, a3, v0);
352 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 16, f0, a3, v0);
353 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 20, f0, a3, v0);
354 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 24, f0, a3, v0);
355 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 28, f0, a3, v0);
356 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 32, f0, a3, v0);
357 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 36, f0, a3, v0);
358 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 40, f0, a3, v0);
359 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 44, f0, a3, v0);
360 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 48, f0, a3, v0);
361 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 52, f0, a3, v0);
362 TESTINSN6LOADw("lwxc1 $f0, $a3($v0)", 56, f0, a3, v0);
363
364 printf("LDXC1\n");
365 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 0, f0, a3, v0);
366 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 8, f0, a3, v0);
367 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 16, f0, a3, v0);
368 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 24, f0, a3, v0);
369 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 32, f0, a3, v0);
370 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 40, f0, a3, v0);
371 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 48, f0, a3, v0);
372 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 56, f0, a3, v0);
373 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 64, f0, a3, v0);
374 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 0, f0, a3, v0);
375 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 8, f0, a3, v0);
376 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 16, f0, a3, v0);
377 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 24, f0, a3, v0);
378 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 32, f0, a3, v0);
379 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 40, f0, a3, v0);
380 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 48, f0, a3, v0);
381 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 56, f0, a3, v0);
382 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 64, f0, a3, v0);
383 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 0, f0, a3, v0);
384 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 8, f0, a3, v0);
385 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 16, f0, a3, v0);
386 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 24, f0, a3, v0);
387 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 32, f0, a3, v0);
388 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 40, f0, a3, v0);
389 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 48, f0, a3, v0);
390 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 56, f0, a3, v0);
391 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 64, f0, a3, v0);
392 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 0, f0, a3, v0);
393 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 8, f0, a3, v0);
394 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 16, f0, a3, v0);
395 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 24, f0, a3, v0);
396 TESTINSN6LOADd("ldxc1 $f0, $a3($v0)", 32, f0, a3, v0);
397 #endif
398
399 printf("SDC1\n");
400 TESTINST1(0);
401 TESTINST1(8);
402 TESTINST1(16);
403 TESTINST1(24);
404 TESTINST1(32);
405 TESTINST1(40);
406 TESTINST1(48);
407 TESTINST1(56);
408 TESTINST1(64);
409 ppMem(mem1, 16);
410
411 #if (__mips==32) && (__mips_isa_rev>=2)
412 printf("SDXC1\n");
413 TESTINST1a(0);
414 TESTINST1a(8);
415 TESTINST1a(16);
416 TESTINST1a(24);
417 TESTINST1a(32);
418 TESTINST1a(40);
419 TESTINST1a(48);
420 TESTINST1a(56);
421 TESTINST1a(64);
422 ppMem(mem1, 16);
423 #endif
424
425 printf("SWC1\n");
426 TESTINST2(0);
427 TESTINST2(8);
428 TESTINST2(16);
429 TESTINST2(24);
430 TESTINST2(32);
431 TESTINST2(40);
432 TESTINST2(48);
433 TESTINST2(56);
434 TESTINST2(64);
435 ppMemF(mem1f, 16);
436
437 #if (__mips==32) && (__mips_isa_rev>=2)
438 printf("SWXC1\n");
439 TESTINST2a(0);
440 TESTINST2a(8);
441 TESTINST2a(16);
442 TESTINST2a(24);
443 TESTINST2a(32);
444 TESTINST2a(40);
445 TESTINST2a(48);
446 TESTINST2a(56);
447 TESTINST2a(64);
448 ppMemF(mem1f, 16);
449 #endif
450
451 return 0;
452 }
453
454