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 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 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 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 143 int main() 144 { 145 printf("sb\n"); 146 TESTINST1("sb $t0, 3($t1)", 0, 3, t0, t1); 147 TESTINST1("sb $t0, 5($t1)", 0x31415927, 5, t0, t1); 148 TESTINST1("sb $t0, 7($t1)", 0x7fffffff, 7, t0, t1); 149 TESTINST1("sb $t0, 1($t1)", 0x80000000, 1, 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, 11($t1)", 0x7fffffff, 11, 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, 31($t1)", 0xffffffff, 31, t0, t1); 164 TESTINST1("sb $t0, 35($t1)", 0xffffffff, 35, t0, t1); 165 TESTINST1("sb $t0, 41($t1)", 0x31415927, 41, t0, t1); 166 TESTINST1("sb $t0, 42($t1)", 0x7fffffff, 42, t0, t1); 167 TESTINST1("sb $t0, 45($t1)", 0x80000000, 45, t0, t1); 168 TESTINST1("sb $t0, 51($t1)", 655, 51, t0, t1); 169 ppMem(mem1, 16); 170 ppMem1(mem, 16); 171 172 printf("sh\n"); 173 TESTINST1("sh $t0, 1($t1)", 0, 1, t0, t1); 174 TESTINST1("sh $t0, 3($t1)", 0x31415927, 3, t0, t1); 175 TESTINST1("sh $t0, 5($t1)", 0x7fffffff, 5, t0, t1); 176 TESTINST1("sh $t0, 7($t1)", 0x80000000, 7, t0, t1); 177 TESTINST1("sh $t0, 9($t1)", 0x80000000, 9, t0, t1); 178 TESTINST1("sh $t0, 6($t1)", 0x7fffffff, 6, t0, t1); 179 TESTINST1("sh $t0, 11($t1)", 0x7fffffff, 11, 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, 31($t1)", 0xffffffff, 31, t0, t1); 191 TESTINST1("sh $t0, 35($t1)", 0xffffffff, 35, t0, t1); 192 TESTINST1("sh $t0, 41($t1)", 0x31415927, 41, t0, t1); 193 TESTINST1("sh $t0, 47($t1)", 0x7fffffff, 47, t0, t1); 194 TESTINST1("sh $t0, 49($t1)", 0x80000000, 49, t0, t1); 195 TESTINST1("sh $t0, 51($t1)", 655, 51, t0, t1); 196 ppMem(mem1, 16); 197 ppMem1(mem, 16); 198 199 printf("sw\n"); 200 TESTINST1("sw $t0, 1($t1)", 0, 1, t0, t1); 201 TESTINST1("sw $t0, 3($t1)", 0x31415927, 3, t0, t1); 202 TESTINST1("sw $t0, 5($t1)", 0x7fffffff, 5, t0, t1); 203 TESTINST1("sw $t0, 7($t1)", 0x80000000, 7, t0, t1); 204 TESTINST1("sw $t0, 9($t1)", 0x80000000, 9, t0, t1); 205 TESTINST1("sw $t0, 6($t1)", 0x7fffffff, 6, t0, t1); 206 TESTINST1("sw $t0, 15($t1)", 0x7fffffff, 11, 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, 31($t1)", 0xffffffff, 31, t0, t1); 218 TESTINST1("sw $t0, 37($t1)", 0xffffffff, 37, t0, t1); 219 TESTINST1("sw $t0, 49($t1)", 0x31415927, 49, t0, t1); 220 TESTINST1("sw $t0, 41($t1)", 0x7fffffff, 41, t0, t1); 221 TESTINST1("sw $t0, 43($t1)", 0x80000000, 43, t0, t1); 222 TESTINST1("sw $t0, 51($t1)", 655, 51, t0, t1); 223 ppMem(mem1, 16); 224 ppMem1(mem, 16); 225 226 printf("swl\n"); 227 TESTINST1("swl $t0, 1($t1)", 0, 1, t0, t1); 228 TESTINST1("swl $t0, 3($t1)", 0x31415927, 3, t0, t1); 229 TESTINST1("swl $t0, 5($t1)", 0x7fffffff, 5, t0, t1); 230 TESTINST1("swl $t0, 7($t1)", 0x80000000, 7, t0, t1); 231 TESTINST1("swl $t0, 9($t1)", 0x80000000, 9, t0, t1); 232 TESTINST1("swl $t0, 6($t1)", 0x7fffffff, 6, t0, t1); 233 TESTINST1("swl $t0, 11($t1)", 0x7fffffff, 11, 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, 33($t1)", 0xffffffff, 33, t0, t1); 245 TESTINST1("swl $t0, 35($t1)", 0xffffffff, 35, t0, t1); 246 TESTINST1("swl $t0, 41($t1)", 0x31415927, 41, t0, t1); 247 TESTINST1("swl $t0, 45($t1)", 0x7fffffff, 45, t0, t1); 248 TESTINST1("swl $t0, 49($t1)", 0x80000000, 49, t0, t1); 249 TESTINST1("swl $t0, 51($t1)", 655, 51, t0, t1); 250 ppMem(mem1, 16); 251 ppMem1(mem, 16); 252 253 printf("swr\n"); 254 TESTINST1("swr $t0, 1($t1)", 0, 1, t0, t1); 255 TESTINST1("swr $t0, 3($t1)", 0x31415927, 3, t0, t1); 256 TESTINST1("swr $t0, 5($t1)", 0x7fffffff, 5, t0, t1); 257 TESTINST1("swr $t0, 7($t1)", 0x80000000, 7, t0, t1); 258 TESTINST1("swr $t0, 9($t1)", 0x80000000, 9, t0, t1); 259 TESTINST1("swr $t0, 6($t1)", 0x7fffffff, 6, t0, t1); 260 TESTINST1("swr $t0, 11($t1)", 0x7fffffff, 11, 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, 31($t1)", 0xffffffff, 31, t0, t1); 272 TESTINST1("swr $t0, 33($t1)", 0xffffffff, 33, t0, t1); 273 TESTINST1("swr $t0, 45($t1)", 0x31415927, 45, t0, t1); 274 TESTINST1("swr $t0, 47($t1)", 0x7fffffff, 47, t0, t1); 275 TESTINST1("swr $t0, 49($t1)", 0x80000000, 49, t0, t1); 276 TESTINST1("swr $t0, 51($t1)", 655, 51, 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 356