• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 
3 unsigned int mem[] = {
4    0x121f1e1f, 0, 3, -1,
5    0x232f2e2f, 0x242c2b2b, 0x252a2e2b, 0x262d2d2a,
6    0x3f343f3e, 0x3e353d3c, 0x363a3c3b, 0x3b373b3a,
7    0x454f4e45, 0x4e464d46, 0x474d474c, 0x4a484a4c
8 };
9 
10 unsigned int mem1[] = {
11    0, 0, 0, 0,
12    0, 0, 0, 0,
13    0xffffffff, 0, 0, 0,
14    0, 0, 0, 0
15 };
16 
17 unsigned int mem2[] = {
18 0x0000e680, 0x00010700, 0x0000e7dc, 0x0000b0d0,
19 0x2ab05fd0, 0x0000b6a0, 0x0000be80, 0x0000de10,
20 0x0000df20, 0x2ab05fe0, 0x0000dfd0, 0x00010300
21 };
22 
23 // sb $t0, 0($t1)
24 #define TESTINST1(instruction, RTval, offset, RT, RS) \
25 {                                                     \
26    unsigned int out;                                  \
27    __asm__ volatile(                                  \
28       "move $" #RS", %1                         \n\t" \
29       "li $" #RT", " #RTval"                    \n\t" \
30       instruction "                             \n\t" \
31       "lw %0, "#offset"($"#RS")                 \n\t" \
32       : "=&r" (out)                                   \
33       : "r" (mem1), "r" (RTval)                       \
34       : #RS, #RT, "memory"                            \
35    );                                                 \
36    printf("%s :: RTval: 0x%x, out: 0x%x\n",           \
37           instruction, RTval, out);                   \
38    out = 0;                                           \
39    __asm__ volatile(                                  \
40       "move $" #RS", %1                         \n\t" \
41       "li $" #RT", " #RTval "                   \n\t" \
42       instruction "                             \n\t" \
43       "lw %0, "#offset"($"#RS")                 \n\t" \
44       : "=&r" (out)                                   \
45       : "r" (mem), "r" (RTval)                        \
46       : #RS, #RT, "memory"                            \
47    );                                                 \
48    printf("%s :: RTval: 0x%x, out: 0x%x\n",           \
49           instruction, RTval, out);                   \
50 }
51 
52 // swl $t0, 3($t1)
53 // swr $t0, 0($t1)
54 #define TESTINSTsw(RTval, offset, RT, RS)             \
55 {                                                     \
56    unsigned int out;                                  \
57    __asm__ volatile(                                  \
58       "move $" #RS", %1\n\t"                          \
59       "addiu $"#RS", $"#RS", "#offset"          \n\t" \
60       "li $" #RT", " #RTval"                    \n\t" \
61       "swl $t0, 3($t1)                          \n\t" \
62       "swr $t0, 0($t1)                          \n\t" \
63       "lw %0, 0($"#RS")                         \n\t" \
64       : "=&r" (out)                                   \
65       : "r" (mem2), "r" (RTval)                       \
66       : #RT, #RS, "memory"                            \
67    );                                                 \
68    printf("swl $t0, 3($t1)\nswr $t0, 0($t1)\n"        \
69           " :: RTval: 0x%x, out: 0x%x\n",             \
70           RTval, out);                                \
71 }
72 
ppMem(unsigned int * m,int len)73 void ppMem(unsigned int* m, int len)
74 {
75    int i;
76    printf("MEM1:\n");
77    for (i = 0; i < len; i=i+4)
78    {
79       printf("0x%x, 0x%x, 0x%x, 0x%x\n", m[i], m[i+1], m[i+2], m[i+3]);
80       m[i] = 0;
81       m[i+1] = 0;
82       m[i+2] = 0;
83       m[i+3] = 0;
84       if (i == 2)
85       {
86          m[i] = 0xffffffff;
87          m[i+1] = 0;
88          m[i+2] = 0;
89          m[i+3] = 0;
90       }
91    }
92 }
93 
ppMem1(unsigned int * m,int len)94 void ppMem1(unsigned int* m, int len)
95 {
96    int i;
97    printf("MEM:\n");
98    for (i = 0; i < len; i=i+4)
99    {
100       printf("0x%x, 0x%x, 0x%x, 0x%x\n", m[i], m[i+1], m[i+2], m[i+3]);
101    }
102    m[0] = 0x121f1e1f;
103    m[1] = 0;
104    m[2] = 3;
105    m[3] = -1;
106    m[4] = 0x232f2e2f;
107    m[5] = 0x242c2b2b;
108    m[6] = 0x252a2e2b;
109    m[7] = 0x262d2d2a;
110    m[8] = 0x3f343f3e;
111    m[9] = 0x3e353d3c;
112    m[10] = 0x363a3c3b;
113    m[11] = 0x3b373b3a;
114    m[12] = 0x454f4e45;
115    m[13] = 0x4e464d46;
116    m[14] = 0x474d474c;
117    m[15] = 0x4a484a4c;
118 }
119 
ppMem0(unsigned int * m,int len)120 void ppMem0(unsigned int* m, int len)
121 {
122    int i;
123    printf("MEM:\n");
124    for (i = 0; i < len; i=i+4)
125    {
126       printf("0x%x, 0x%x, 0x%x, 0x%x\n", m[i], m[i+1], m[i+2], m[i+3]);
127    }
128 
129    m[0] = 0x0000e680;
130    m[1] = 0x00010700;
131    m[2] = 0x0000e7dc;
132    m[3] = 0x0000b0d0;
133    m[4] = 0x2ab05fd0;
134    m[5] = 0x0000b6a0;
135    m[6] = 0x0000be80;
136    m[7] = 0x0000de10;
137    m[8] = 0x0000df20;
138    m[9] = 0x2ab05fe0;
139    m[10] = 0x0000dfd0;
140    m[11] = 0x00010300;
141 }
142 
main()143 int main()
144 {
145    printf("sb\n");
146    TESTINST1("sb $t0, 0($t1)", 0, 0, t0, t1);
147    TESTINST1("sb $t0, 0($t1)", 0x31415927, 0, t0, t1);
148    TESTINST1("sb $t0, 0($t1)", 0x7fffffff, 0, t0, t1);
149    TESTINST1("sb $t0, 0($t1)", 0x80000000, 0, t0, t1);
150    TESTINST1("sb $t0, 2($t1)", 0x80000000, 2, t0, t1);
151    TESTINST1("sb $t0, 6($t1)", 0x7fffffff, 6, t0, t1);
152    TESTINST1("sb $t0, 10($t1)", 0x7fffffff, 10, t0, t1);
153    TESTINST1("sb $t0, 8($t1)", -1, 8, t0, t1);
154    TESTINST1("sb $t0, 0($t1)", 0x31415927, 0, t0, t1);
155    TESTINST1("sb $t0, 0($t1)", 0x0dd00000, 0, t0, t1);
156    TESTINST1("sb $t0, 0($t1)", 655, 0, t0, t1);
157    TESTINST1("sb $t0, 0($t1)", -655, 0, t0, t1);
158    TESTINST1("sb $t0, 0($t1)", 15, 0, t0, t1);
159    TESTINST1("sb $t0, 0($t1)", 1, 0, t0, t1);
160    TESTINST1("sb $t0, 0($t1)", 53, 0, t0, t1);
161    TESTINST1("sb $t0, 2($t1)", 0xffffffff, 2, t0, t1);
162    TESTINST1("sb $t0, 2($t1)", 0xffffffff, 2, t0, t1);
163    TESTINST1("sb $t0, 32($t1)", 0xffffffff, 32, t0, t1);
164    TESTINST1("sb $t0, 36($t1)", 0xffffffff, 36, t0, t1);
165    TESTINST1("sb $t0, 40($t1)", 0x31415927, 40, t0, t1);
166    TESTINST1("sb $t0, 44($t1)", 0x7fffffff, 44, t0, t1);
167    TESTINST1("sb $t0, 48($t1)", 0x80000000, 48, t0, t1);
168    TESTINST1("sb $t0, 52($t1)", 655, 52, t0, t1);
169    ppMem(mem1, 16);
170    ppMem1(mem, 16);
171 
172    printf("sh\n");
173    TESTINST1("sh $t0, 0($t1)", 0, 0, t0, t1);
174    TESTINST1("sh $t0, 0($t1)", 0x31415927, 0, t0, t1);
175    TESTINST1("sh $t0, 0($t1)", 0x7fffffff, 0, t0, t1);
176    TESTINST1("sh $t0, 0($t1)", 0x80000000, 0, t0, t1);
177    TESTINST1("sh $t0, 2($t1)", 0x80000000, 2, t0, t1);
178    TESTINST1("sh $t0, 6($t1)", 0x7fffffff, 6, t0, t1);
179    TESTINST1("sh $t0, 10($t1)", 0x7fffffff, 10, t0, t1);
180    TESTINST1("sh $t0, 8($t1)", -1, 8, t0, t1);
181    TESTINST1("sh $t0, 0($t1)", 0x31415927, 0, t0, t1);
182    TESTINST1("sh $t0, 0($t1)", 0x0dd00000, 0, t0, t1);
183    TESTINST1("sh $t0, 0($t1)", 655, 0, t0, t1);
184    TESTINST1("sh $t0, 0($t1)", -655, 0, t0, t1);
185    TESTINST1("sh $t0, 0($t1)", 15, 0, t0, t1);
186    TESTINST1("sh $t0, 0($t1)", 1, 0, t0, t1);
187    TESTINST1("sh $t0, 0($t1)", 53, 0, t0, t1);
188    TESTINST1("sh $t0, 2($t1)", 0xffffffff, 2, t0, t1);
189    TESTINST1("sh $t0, 2($t1)", 0xffffffff, 2, t0, t1);
190    TESTINST1("sh $t0, 32($t1)", 0xffffffff, 32, t0, t1);
191    TESTINST1("sh $t0, 36($t1)", 0xffffffff, 36, t0, t1);
192    TESTINST1("sh $t0, 40($t1)", 0x31415927, 40, t0, t1);
193    TESTINST1("sh $t0, 44($t1)", 0x7fffffff, 44, t0, t1);
194    TESTINST1("sh $t0, 48($t1)", 0x80000000, 48, t0, t1);
195    TESTINST1("sh $t0, 52($t1)", 655, 52, t0, t1);
196    ppMem(mem1, 16);
197    ppMem1(mem, 16);
198 
199    printf("sw\n");
200    TESTINST1("sw $t0, 0($t1)", 0, 0, t0, t1);
201    TESTINST1("sw $t0, 0($t1)", 0x31415927, 0, t0, t1);
202    TESTINST1("sw $t0, 0($t1)", 0x7fffffff, 0, t0, t1);
203    TESTINST1("sw $t0, 0($t1)", 0x80000000, 0, t0, t1);
204    TESTINST1("sw $t0, 2($t1)", 0x80000000, 2, t0, t1);
205    TESTINST1("sw $t0, 6($t1)", 0x7fffffff, 6, t0, t1);
206    TESTINST1("sw $t0, 10($t1)", 0x7fffffff, 10, t0, t1);
207    TESTINST1("sw $t0, 8($t1)", -1, 8, t0, t1);
208    TESTINST1("sw $t0, 0($t1)", 0x31415927, 0, t0, t1);
209    TESTINST1("sw $t0, 0($t1)", 0x0dd00000, 0, t0, t1);
210    TESTINST1("sw $t0, 0($t1)", 655, 0, t0, t1);
211    TESTINST1("sw $t0, 0($t1)", -655, 0, t0, t1);
212    TESTINST1("sw $t0, 0($t1)", 15, 0, t0, t1);
213    TESTINST1("sw $t0, 0($t1)", 1, 0, t0, t1);
214    TESTINST1("sw $t0, 0($t1)", 53, 0, t0, t1);
215    TESTINST1("sw $t0, 2($t1)", 0xffffffff, 2, t0, t1);
216    TESTINST1("sw $t0, 2($t1)", 0xffffffff, 2, t0, t1);
217    TESTINST1("sw $t0, 32($t1)", 0xffffffff, 32, t0, t1);
218    TESTINST1("sw $t0, 36($t1)", 0xffffffff, 36, t0, t1);
219    TESTINST1("sw $t0, 40($t1)", 0x31415927, 40, t0, t1);
220    TESTINST1("sw $t0, 44($t1)", 0x7fffffff, 44, t0, t1);
221    TESTINST1("sw $t0, 48($t1)", 0x80000000, 48, t0, t1);
222    TESTINST1("sw $t0, 52($t1)", 655, 52, t0, t1);
223    ppMem(mem1, 16);
224    ppMem1(mem, 16);
225 
226    printf("swl\n");
227    TESTINST1("swl $t0, 0($t1)", 0, 0, t0, t1);
228    TESTINST1("swl $t0, 0($t1)", 0x31415927, 0, t0, t1);
229    TESTINST1("swl $t0, 0($t1)", 0x7fffffff, 0, t0, t1);
230    TESTINST1("swl $t0, 0($t1)", 0x80000000, 0, t0, t1);
231    TESTINST1("swl $t0, 2($t1)", 0x80000000, 2, t0, t1);
232    TESTINST1("swl $t0, 6($t1)", 0x7fffffff, 6, t0, t1);
233    TESTINST1("swl $t0, 10($t1)", 0x7fffffff, 10, t0, t1);
234    TESTINST1("swl $t0, 8($t1)", -1, 8, t0, t1);
235    TESTINST1("swl $t0, 0($t1)", 0x31415927, 0, t0, t1);
236    TESTINST1("swl $t0, 0($t1)", 0x0dd00000, 0, t0, t1);
237    TESTINST1("swl $t0, 0($t1)", 655, 0, t0, t1);
238    TESTINST1("swl $t0, 0($t1)", -655, 0, t0, t1);
239    TESTINST1("swl $t0, 0($t1)", 15, 0, t0, t1);
240    TESTINST1("swl $t0, 0($t1)", 1, 0, t0, t1);
241    TESTINST1("swl $t0, 0($t1)", 53, 0, t0, t1);
242    TESTINST1("swl $t0, 2($t1)", 0xffffffff, 2, t0, t1);
243    TESTINST1("swl $t0, 2($t1)", 0xffffffff, 2, t0, t1);
244    TESTINST1("swl $t0, 32($t1)", 0xffffffff, 32, t0, t1);
245    TESTINST1("swl $t0, 36($t1)", 0xffffffff, 36, t0, t1);
246    TESTINST1("swl $t0, 40($t1)", 0x31415927, 40, t0, t1);
247    TESTINST1("swl $t0, 44($t1)", 0x7fffffff, 44, t0, t1);
248    TESTINST1("swl $t0, 48($t1)", 0x80000000, 48, t0, t1);
249    TESTINST1("swl $t0, 52($t1)", 655, 52, t0, t1);
250    ppMem(mem1, 16);
251    ppMem1(mem, 16);
252 
253    printf("swr\n");
254    TESTINST1("swr $t0, 0($t1)", 0, 0, t0, t1);
255    TESTINST1("swr $t0, 0($t1)", 0x31415927, 0, t0, t1);
256    TESTINST1("swr $t0, 0($t1)", 0x7fffffff, 0, t0, t1);
257    TESTINST1("swr $t0, 0($t1)", 0x80000000, 0, t0, t1);
258    TESTINST1("swr $t0, 2($t1)", 0x80000000, 2, t0, t1);
259    TESTINST1("swr $t0, 6($t1)", 0x7fffffff, 6, t0, t1);
260    TESTINST1("swr $t0, 10($t1)", 0x7fffffff, 10, t0, t1);
261    TESTINST1("swr $t0, 8($t1)", -1, 8, t0, t1);
262    TESTINST1("swr $t0, 0($t1)", 0x31415927, 0, t0, t1);
263    TESTINST1("swr $t0, 0($t1)", 0x0dd00000, 0, t0, t1);
264    TESTINST1("swr $t0, 0($t1)", 655, 0, t0, t1);
265    TESTINST1("swr $t0, 0($t1)", -655, 0, t0, t1);
266    TESTINST1("swr $t0, 0($t1)", 15, 0, t0, t1);
267    TESTINST1("swr $t0, 0($t1)", 1, 0, t0, t1);
268    TESTINST1("swr $t0, 0($t1)", 53, 0, t0, t1);
269    TESTINST1("swr $t0, 2($t1)", 0xffffffff, 2, t0, t1);
270    TESTINST1("swr $t0, 2($t1)", 0xffffffff, 2, t0, t1);
271    TESTINST1("swr $t0, 32($t1)", 0xffffffff, 32, t0, t1);
272    TESTINST1("swr $t0, 36($t1)", 0xffffffff, 36, t0, t1);
273    TESTINST1("swr $t0, 40($t1)", 0x31415927, 40, t0, t1);
274    TESTINST1("swr $t0, 44($t1)", 0x7fffffff, 44, t0, t1);
275    TESTINST1("swr $t0, 48($t1)", 0x80000000, 48, t0, t1);
276    TESTINST1("swr $t0, 52($t1)", 655, 52, t0, t1);
277    ppMem(mem1, 16);
278    ppMem1(mem, 16);
279 
280    printf("ulw\n");
281    TESTINST1("ulw $t0, 0($t1)", 0, 0, t0, t1);
282    TESTINST1("ulw $t0, 0($t1)", 0x31415927, 0, t0, t1);
283    TESTINST1("ulw $t0, 0($t1)", 0x7fffffff, 0, t0, t1);
284    TESTINST1("ulw $t0, 0($t1)", 0x80000000, 0, t0, t1);
285    TESTINST1("ulw $t0, 2($t1)", 0x80000000, 2, t0, t1);
286    TESTINST1("ulw $t0, 6($t1)", 0x7fffffff, 6, t0, t1);
287    TESTINST1("ulw $t0, 10($t1)", 0x7fffffff, 10, t0, t1);
288    TESTINST1("ulw $t0, 8($t1)", -1, 8, t0, t1);
289    TESTINST1("ulw $t0, 0($t1)", 0x31415927, 0, t0, t1);
290    TESTINST1("ulw $t0, 0($t1)", 0x0dd00000, 0, t0, t1);
291    TESTINST1("ulw $t0, 0($t1)", 655, 0, t0, t1);
292    TESTINST1("ulw $t0, 0($t1)", -655, 0, t0, t1);
293    TESTINST1("ulw $t0, 0($t1)", 15, 0, t0, t1);
294    TESTINST1("ulw $t0, 0($t1)", 1, 0, t0, t1);
295    TESTINST1("ulw $t0, 0($t1)", 53, 0, t0, t1);
296    TESTINST1("ulw $t0, 2($t1)", 0xffffffff, 2, t0, t1);
297    TESTINST1("ulw $t0, 2($t1)", 0xffffffff, 2, t0, t1);
298    TESTINST1("ulw $t0, 32($t1)", 0xffffffff, 32, t0, t1);
299    TESTINST1("ulw $t0, 36($t1)", 0xffffffff, 36, t0, t1);
300    TESTINST1("ulw $t0, 40($t1)", 0x31415927, 40, t0, t1);
301    TESTINST1("ulw $t0, 44($t1)", 0x7fffffff, 44, t0, t1);
302    TESTINST1("ulw $t0, 48($t1)", 0x80000000, 48, t0, t1);
303    TESTINST1("ulw $t0, 52($t1)", 655, 52, t0, t1);
304    ppMem(mem1, 16);
305    ppMem1(mem, 16);
306 
307    printf("usw\n");
308    TESTINST1("usw $t0, 0($t1)", 0, 0, t0, t1);
309    TESTINST1("usw $t0, 0($t1)", 0x31415927, 0, t0, t1);
310    TESTINST1("usw $t0, 0($t1)", 0x7fffffff, 0, t0, t1);
311    TESTINST1("usw $t0, 0($t1)", 0x80000000, 0, t0, t1);
312    TESTINST1("usw $t0, 2($t1)", 0x80000000, 2, t0, t1);
313    TESTINST1("usw $t0, 6($t1)", 0x7fffffff, 6, t0, t1);
314    TESTINST1("usw $t0, 10($t1)", 0x7fffffff, 10, t0, t1);
315    TESTINST1("usw $t0, 8($t1)", -1, 8, t0, t1);
316    TESTINST1("usw $t0, 0($t1)", 0x31415927, 0, t0, t1);
317    TESTINST1("usw $t0, 0($t1)", 0x0dd00000, 0, t0, t1);
318    TESTINST1("usw $t0, 0($t1)", 655, 0, t0, t1);
319    TESTINST1("usw $t0, 0($t1)", -655, 0, t0, t1);
320    TESTINST1("usw $t0, 0($t1)", 15, 0, t0, t1);
321    TESTINST1("usw $t0, 0($t1)", 1, 0, t0, t1);
322    TESTINST1("usw $t0, 0($t1)", 53, 0, t0, t1);
323    TESTINST1("usw $t0, 2($t1)", 0xffffffff, 2, t0, t1);
324    TESTINST1("usw $t0, 2($t1)", 0xffffffff, 2, t0, t1);
325    TESTINST1("usw $t0, 32($t1)", 0xffffffff, 32, t0, t1);
326    TESTINST1("usw $t0, 36($t1)", 0xffffffff, 36, t0, t1);
327    TESTINST1("usw $t0, 40($t1)", 0x31415927, 40, t0, t1);
328    TESTINST1("usw $t0, 44($t1)", 0x7fffffff, 44, t0, t1);
329    TESTINST1("usw $t0, 48($t1)", 0x80000000, 48, t0, t1);
330    TESTINST1("usw $t0, 52($t1)", 655, 52, t0, t1);
331    ppMem(mem1, 16);
332    ppMem1(mem, 16);
333 
334    printf("swl $t0, 3($t0)\nswr $t0, 0($t0)\n");
335    TESTINSTsw(0x4853000, 0, t0, t1);
336    ppMem0(mem2, 12);
337    TESTINSTsw(0x4853000, 4, t0, t1);
338    ppMem0(mem2, 12);
339    TESTINSTsw(0x4863700, 8, t0, t1);
340    ppMem0(mem2, 12);
341    TESTINSTsw(0x48aedd0, 12, t0, t1);
342    ppMem0(mem2, 12);
343    TESTINSTsw(0x2aaee700, 16, t0, t1);
344    ppMem0(mem2, 12);
345    TESTINSTsw(0x2aaee7ff, 20, t0, t1);
346    ppMem0(mem2, 12);
347    TESTINSTsw(0x2aaeffff, 24, t0, t1);
348    ppMem0(mem2, 12);
349    TESTINSTsw(0x4863700, 28, t0, t1);
350    ppMem0(mem2, 12);
351    TESTINSTsw(0x2aaee700, 32, t0, t1);
352    ppMem0(mem2, 12);
353    return 0;
354 }
355