| 1 | .text |
| 2 | |
| 3 | .set noreorder |
| 4 | .set noat |
| 5 | |
| 6 | .set arch=4010 |
| 7 | |
| 8 | flushi |
| 9 | flushd |
| 10 | flushid |
| 11 | madd $4,$5 |
| 12 | maddu $5,$6 |
| 13 | ffc $6,$7 |
| 14 | ffs $7,$8 |
| 15 | msub $8,$9 |
| 16 | msubu $9,$10 |
| 17 | selsl $10,$11,$12 |
| 18 | selsr $11,$12,$13 |
| 19 | waiti |
| 20 | wb 16($14) |
| 21 | addciu $14,$15,16 |
| 22 | |
| 23 | .set arch=4100 |
| 24 | |
| 25 | hibernate |
| 26 | standby |
| 27 | suspend |
| 28 | |
| 29 | .set arch=4650 |
| 30 | |
| 31 | mad $4,$5 |
| 32 | madu $5,$6 |
| 33 | mul $6,$7,$8 |
| 34 | |
| 35 | # test mips4 instructions. |
| 36 | |
| 37 | .set arch=mips4 |
| 38 | |
| 39 | text_label: |
| 40 | bc1f text_label |
| 41 | bc1f $fcc1,text_label |
| 42 | bc1fl $fcc1,text_label |
| 43 | bc1t $fcc1,text_label |
| 44 | bc1tl $fcc2,text_label |
| 45 | c.f.d $f4,$f6 |
| 46 | c.f.d $fcc1,$f4,$f6 |
| 47 | ldxc1 $f2,$4($5) |
| 48 | lwxc1 $f2,$4($5) |
| 49 | madd.d $f0,$f2,$f4,$f6 |
| 50 | madd.s $f0,$f2,$f4,$f6 |
| 51 | movf $4,$5,$fcc4 |
| 52 | movf.d $f4,$f6,$fcc0 |
| 53 | movf.s $f4,$f6,$fcc0 |
| 54 | movn $4,$6,$6 |
| 55 | movn.d $f4,$f6,$6 |
| 56 | movn.s $f4,$f6,$6 |
| 57 | movt $4,$5,$fcc4 |
| 58 | movt.d $f4,$f6,$fcc0 |
| 59 | movt.s $f4,$f6,$fcc0 |
| 60 | movz $4,$6,$6 |
| 61 | movz.d $f4,$f6,$6 |
| 62 | movz.s $f4,$f6,$6 |
| 63 | msub.d $f0,$f2,$f4,$f6 |
| 64 | msub.s $f0,$f2,$f4,$f6 |
| 65 | nmadd.d $f0,$f2,$f4,$f6 |
| 66 | nmadd.s $f0,$f2,$f4,$f6 |
| 67 | nmsub.d $f0,$f2,$f4,$f6 |
| 68 | nmsub.s $f0,$f2,$f4,$f6 |
| 69 | |
| 70 | # We don't test pref because currently the disassembler will |
| 71 | # disassemble it as lwc3. lwc3 is correct for mips1 to mips3, |
| 72 | # while pref is correct for mips4. Unfortunately, the |
| 73 | # disassembler does not know which architecture it is |
| 74 | # disassembling for. |
| 75 | # pref 4,0($4) |
| 76 | |
| 77 | prefx 4,$4($5) |
| 78 | recip.d $f4,$f6 |
| 79 | recip.s $f4,$f6 |
| 80 | rsqrt.d $f4,$f6 |
| 81 | rsqrt.s $f4,$f6 |
| 82 | sdxc1 $f4,$4($5) |
| 83 | swxc1 $f4,$4($5) |
| 84 | |
| 85 | # test mips5 instructions. |
| 86 | |
| 87 | .set arch=mips5 |
| 88 | |
| 89 | abs.ps $f0, $f2 |
| 90 | add.ps $f2, $f4, $f6 |
| 91 | alnv.ps $f6, $f8, $f10, $3 |
| 92 | c.eq.ps $f8, $f10 |
| 93 | c.eq.ps $fcc2, $f10, $f12 |
| 94 | c.f.ps $f8, $f10 |
| 95 | c.f.ps $fcc2, $f10, $f12 |
| 96 | c.le.ps $f8, $f10 |
| 97 | c.le.ps $fcc2, $f10, $f12 |
| 98 | c.lt.ps $f8, $f10 |
| 99 | c.lt.ps $fcc2, $f10, $f12 |
| 100 | c.nge.ps $f8, $f10 |
| 101 | c.nge.ps $fcc2, $f10, $f12 |
| 102 | c.ngl.ps $f8, $f10 |
| 103 | c.ngl.ps $fcc2, $f10, $f12 |
| 104 | c.ngle.ps $f8, $f10 |
| 105 | c.ngle.ps $fcc2, $f10, $f12 |
| 106 | c.ngt.ps $f8, $f10 |
| 107 | c.ngt.ps $fcc2, $f10, $f12 |
| 108 | c.ole.ps $f8, $f10 |
| 109 | c.ole.ps $fcc2, $f10, $f12 |
| 110 | c.olt.ps $f8, $f10 |
| 111 | c.olt.ps $fcc2, $f10, $f12 |
| 112 | c.seq.ps $f8, $f10 |
| 113 | c.seq.ps $fcc2, $f10, $f12 |
| 114 | c.sf.ps $f8, $f10 |
| 115 | c.sf.ps $fcc2, $f10, $f12 |
| 116 | c.ueq.ps $f8, $f10 |
| 117 | c.ueq.ps $fcc2, $f10, $f12 |
| 118 | c.ule.ps $f8, $f10 |
| 119 | c.ule.ps $fcc2, $f10, $f12 |
| 120 | c.ult.ps $f8, $f10 |
| 121 | c.ult.ps $fcc2, $f10, $f12 |
| 122 | c.un.ps $f8, $f10 |
| 123 | c.un.ps $fcc2, $f10, $f12 |
| 124 | cvt.ps.s $f12, $f14, $f16 |
| 125 | cvt.s.pl $f16, $f18 |
| 126 | cvt.s.pu $f18, $f20 |
| 127 | luxc1 $f20, $4($5) |
| 128 | madd.ps $f20, $f22, $f24, $f26 |
| 129 | mov.ps $f24, $f26 |
| 130 | movf.ps $f26, $f28, $fcc2 |
| 131 | movn.ps $f26, $f28, $3 |
| 132 | movt.ps $f28, $f30, $fcc4 |
| 133 | movz.ps $f28, $f30, $5 |
| 134 | msub.ps $f30, $f0, $f2, $f4 |
| 135 | mul.ps $f2, $f4, $f6 |
| 136 | neg.ps $f6, $f8 |
| 137 | nmadd.ps $f6, $f8, $f10, $f12 |
| 138 | nmsub.ps $f6, $f8, $f10, $f12 |
| 139 | pll.ps $f10, $f12, $f14 |
| 140 | plu.ps $f14, $f16, $f18 |
| 141 | pul.ps $f16, $f18, $f20 |
| 142 | puu.ps $f20, $f22, $f24 |
| 143 | sub.ps $f22, $f24, $f26 |
| 144 | suxc1 $f26, $6($7) |
| 145 | |
| 146 | c.eq.ps $fcc3, $f10, $f12 # warns |
| 147 | movf.ps $f26, $f28, $fcc3 # warns |
| 148 | |
| 149 | # test assembly of mips32 instructions |
| 150 | |
| 151 | .set arch=mips32 |
| 152 | |
| 153 | # unprivileged CPU instructions |
| 154 | |
| 155 | clo $1, $2 |
| 156 | clz $3, $4 |
| 157 | madd $5, $6 |
| 158 | maddu $7, $8 |
| 159 | msub $9, $10 |
| 160 | msubu $11, $12 |
| 161 | mul $13, $14, $15 |
| 162 | pref 4, ($16) |
| 163 | pref 4, 32767($17) |
| 164 | pref 4, -32768($18) |
| 165 | ssnop |
| 166 | |
| 167 | # unprivileged coprocessor instructions. |
| 168 | # these tests use cp2 to avoid other (cp0, fpu, prefetch) opcodes. |
| 169 | |
| 170 | bc2f text_label |
| 171 | nop |
| 172 | bc2fl text_label |
| 173 | nop |
| 174 | bc2t text_label |
| 175 | nop |
| 176 | bc2tl text_label |
| 177 | nop |
| 178 | # XXX other BCzCond encodings not currently expressable |
| 179 | cfc2 $1, $2 |
| 180 | cop2 0x1234567 # disassembles as c2 ... |
| 181 | ctc2 $2, $3 |
| 182 | mfc2 $3, $4 |
| 183 | mfc2 $4, $5, 0 # disassembles without sel |
| 184 | mfc2 $5, $6, 7 |
| 185 | mtc2 $6, $7 |
| 186 | mtc2 $7, $8, 0 # disassembles without sel |
| 187 | mtc2 $8, $9, 7 |
| 188 | |
| 189 | # privileged instructions |
| 190 | |
| 191 | cache 5, ($1) |
| 192 | cache 5, 32767($2) |
| 193 | cache 5, -32768($3) |
| 194 | eret |
| 195 | tlbp |
| 196 | tlbr |
| 197 | tlbwi |
| 198 | tlbwr |
| 199 | wait |
| 200 | wait 0 # disassembles without code |
| 201 | wait 0x56789 |
| 202 | |
| 203 | # For a while break for the mips32 ISA interpreted a single argument |
| 204 | # as a 20-bit code, placing it in the opcode differently to |
| 205 | # traditional ISAs. This turned out to cause problems, so it has |
| 206 | # been removed. This test is to assure consistent interpretation. |
| 207 | break |
| 208 | break 0 # disassembles without code |
| 209 | break 0x345 |
| 210 | break 0x48,0x345 # this still specifies a 20-bit code |
| 211 | |
| 212 | # Instructions in previous ISAs or CPUs which are now slightly |
| 213 | # different. |
| 214 | sdbbp |
| 215 | sdbbp 0 # disassembles without code |
| 216 | sdbbp 0x56789 |
| 217 | |
| 218 | # test assembly of mips32r2 instructions |
| 219 | |
| 220 | .set arch=mips32r2 |
| 221 | |
| 222 | # unprivileged CPU instructions |
| 223 | |
| 224 | ehb |
| 225 | |
| 226 | ext $4, $5, 6, 8 |
| 227 | |
| 228 | ins $4, $5, 6, 8 |
| 229 | |
| 230 | jalr.hb $8 |
| 231 | jalr.hb $20, $9 |
| 232 | |
| 233 | jr.hb $8 |
| 234 | |
| 235 | # Note, further testing of rdhwr is done in hwr-names-mips32r2.d |
| 236 | rdhwr $10, $0 |
| 237 | rdhwr $11, $1 |
| 238 | rdhwr $12, $2 |
| 239 | rdhwr $13, $3 |
| 240 | rdhwr $14, $4 |
| 241 | rdhwr $15, $5 |
| 242 | |
| 243 | # This file checks that in fact HW rotate will |
| 244 | # be used for this arch, and checks assembly |
| 245 | # of the official MIPS mnemonics. (Note that disassembly |
| 246 | # uses the traditional "ror" and "rorv" mnemonics.) |
| 247 | # Additional rotate tests are done by rol-hw.d. |
| 248 | rotl $25, $10, 4 |
| 249 | rotr $25, $10, 4 |
| 250 | rotl $25, $10, $4 |
| 251 | rotr $25, $10, $4 |
| 252 | rotrv $25, $10, $4 |
| 253 | |
| 254 | seb $7 |
| 255 | seb $8, $10 |
| 256 | |
| 257 | seh $7 |
| 258 | seh $8, $10 |
| 259 | |
| 260 | synci 0x5555($10) |
| 261 | |
| 262 | wsbh $7 |
| 263 | wsbh $8, $10 |
| 264 | |
| 265 | # cp0 instructions |
| 266 | |
| 267 | di |
| 268 | di $0 |
| 269 | di $10 |
| 270 | |
| 271 | ei |
| 272 | ei $0 |
| 273 | ei $10 |
| 274 | |
| 275 | rdpgpr $10, $25 |
| 276 | |
| 277 | wrpgpr $10, $25 |
| 278 | |
| 279 | # FPU (cp1) instructions |
| 280 | # |
| 281 | # Even registers are supported w/ 32-bit FPU, odd |
| 282 | # registers supported only for 64-bit FPU. |
| 283 | # Only the 32-bit FPU instructions are tested here. |
| 284 | |
| 285 | mfhc1 $17, $f0 |
| 286 | mthc1 $17, $f0 |
| 287 | |
| 288 | # cp2 instructions |
| 289 | |
| 290 | mfhc2 $17, 0x5555 |
| 291 | mthc2 $17, 0x5555 |
| 292 | |
| 293 | .set arch=mips64 |
| 294 | |
| 295 | # test assembly of mips64 instructions |
| 296 | |
| 297 | # unprivileged CPU instructions |
| 298 | |
| 299 | dclo $1, $2 |
| 300 | dclz $3, $4 |
| 301 | |
| 302 | # unprivileged coprocessor instructions. |
| 303 | # these tests use cp2 to avoid other (cp0, fpu, prefetch) opcodes. |
| 304 | |
| 305 | dmfc2 $3, $4 |
| 306 | dmfc2 $4, $5, 0 # disassembles without sel |
| 307 | dmfc2 $5, $6, 7 |
| 308 | dmtc2 $6, $7 |
| 309 | dmtc2 $7, $8, 0 # disassembles without sel |
| 310 | dmtc2 $8, $9, 7 |
| 311 | |
| 312 | .set arch=vr4111 |
| 313 | |
| 314 | dmadd16 $4,$5 |
| 315 | madd16 $5,$6 |
| 316 | |
| 317 | .set arch=vr4120 |
| 318 | |
| 319 | # Include mflos to check for nop insertion. |
| 320 | mflo $4 |
| 321 | dmacc $4,$5,$6 |
| 322 | dmacchi $4,$5,$6 |
| 323 | dmacchis $4,$5,$6 |
| 324 | dmacchiu $4,$5,$6 |
| 325 | dmacchius $4,$5,$6 |
| 326 | dmaccs $4,$5,$6 |
| 327 | dmaccu $4,$5,$6 |
| 328 | dmaccus $4,$5,$6 |
| 329 | mflo $4 |
| 330 | macc $4,$5,$6 |
| 331 | macchi $4,$5,$6 |
| 332 | macchis $4,$5,$6 |
| 333 | macchiu $4,$5,$6 |
| 334 | macchius $4,$5,$6 |
| 335 | maccs $4,$5,$6 |
| 336 | maccu $4,$5,$6 |
| 337 | maccus $4,$5,$6 |
| 338 | |
| 339 | .set arch=vr5400 |
| 340 | |
| 341 | /* Integer instructions. */ |
| 342 | |
| 343 | mulu $4,$5,$6 |
| 344 | mulhi $4,$5,$6 |
| 345 | mulhiu $4,$5,$6 |
| 346 | muls $4,$5,$6 |
| 347 | mulsu $4,$5,$6 |
| 348 | mulshi $4,$5,$6 |
| 349 | mulshiu $4,$5,$6 |
| 350 | macc $4,$5,$6 |
| 351 | maccu $4,$5,$6 |
| 352 | macchi $4,$5,$6 |
| 353 | macchiu $4,$5,$6 |
| 354 | msac $4,$5,$6 |
| 355 | msacu $4,$5,$6 |
| 356 | msachi $4,$5,$6 |
| 357 | msachiu $4,$5,$6 |
| 358 | |
| 359 | ror $4,$5,25 |
| 360 | rorv $4,$5,$6 |
| 361 | dror $4,$5,25 |
| 362 | dror $4,$5,57 /* Should expand to dror32 $4,$5,25. */ |
| 363 | dror32 $4,$5,25 |
| 364 | drorv $4,$5,$6 |
| 365 | |
| 366 | /* Debug instructions. */ |
| 367 | |
| 368 | dbreak |
| 369 | dret |
| 370 | mfdr $3,$3 |
| 371 | mtdr $3,$3 |
| 372 | |
| 373 | /* Coprocessor 0 instructions, minus standard ISA 3 ones. |
| 374 | That leaves just the performance monitoring registers. */ |
| 375 | |
| 376 | mfpc $4,1 |
| 377 | mfps $4,1 |
| 378 | mtpc $4,1 |
| 379 | mtps $4,1 |
| 380 | |
| 381 | /* Multimedia instructions. */ |
| 382 | |
| 383 | .macro nsel2 op |
| 384 | /* Test each form of each vector opcode. */ |
| 385 | \op $f0,$f2 |
| 386 | \op $f4,$f6[2] |
| 387 | \op $f6,15 |
| 388 | .if 0 /* Which is right?? */ |
| 389 | /* Test negative numbers in immediate-value slot. */ |
| 390 | \op $f4,-3 |
| 391 | .else |
| 392 | /* Test that it's recognized as an unsigned field. */ |
| 393 | \op $f4,31 |
| 394 | .endif |
| 395 | .endm |
| 396 | |
| 397 | .macro nsel3 op |
| 398 | /* Test each form of each vector opcode. */ |
| 399 | \op $f0,$f2,$f4 |
| 400 | \op $f2,$f4,$f6[2] |
| 401 | \op $f6,$f4,15 |
| 402 | .if 0 /* Which is right?? */ |
| 403 | /* Test negative numbers in immediate-value slot. */ |
| 404 | \op $f4,$f6,-3 |
| 405 | .else |
| 406 | /* Test that it's recognized as an unsigned field. */ |
| 407 | \op $f4,$f6,31 |
| 408 | .endif |
| 409 | .endm |
| 410 | |
| 411 | nsel3 add.ob |
| 412 | nsel3 and.ob |
| 413 | nsel2 c.eq.ob |
| 414 | nsel2 c.le.ob |
| 415 | nsel2 c.lt.ob |
| 416 | nsel3 max.ob |
| 417 | nsel3 min.ob |
| 418 | nsel3 mul.ob |
| 419 | nsel2 mula.ob |
| 420 | nsel2 mull.ob |
| 421 | nsel2 muls.ob |
| 422 | nsel2 mulsl.ob |
| 423 | nsel3 nor.ob |
| 424 | nsel3 or.ob |
| 425 | nsel3 pickf.ob |
| 426 | nsel3 pickt.ob |
| 427 | nsel3 sub.ob |
| 428 | nsel3 xor.ob |
| 429 | |
| 430 | /* ALNI, SHFL: Vector only. */ |
| 431 | alni.ob $f0,$f2,$f4,5 |
| 432 | shfl.mixh.ob $f0,$f2,$f4 |
| 433 | shfl.mixl.ob $f0,$f2,$f4 |
| 434 | shfl.pach.ob $f0,$f2,$f4 |
| 435 | shfl.pacl.ob $f0,$f2,$f4 |
| 436 | |
| 437 | /* SLL,SRL: Scalar or immediate. */ |
| 438 | sll.ob $f2,$f4,$f6[3] |
| 439 | sll.ob $f4,$f6,14 |
| 440 | srl.ob $f2,$f4,$f6[3] |
| 441 | srl.ob $f4,$f6,14 |
| 442 | |
| 443 | /* RZU: Immediate, must be 0, 8, or 16. */ |
| 444 | rzu.ob $f2,13 |
| 445 | |
| 446 | /* No selector. */ |
| 447 | rach.ob $f2 |
| 448 | racl.ob $f2 |
| 449 | racm.ob $f2 |
| 450 | wach.ob $f2 |
| 451 | wacl.ob $f2,$f4 |
| 452 | |
| 453 | ror $4,$5,$6 |
| 454 | rol $4,$5,15 |
| 455 | dror $4,$5,$6 |
| 456 | drol $4,$5,31 |
| 457 | drol $4,$5,62 |
| 458 | |
| 459 | .set arch=vr5500 |
| 460 | |
| 461 | /* Prefetch instructions. */ |
| 462 | # We don't test pref because currently the disassembler will |
| 463 | # disassemble it as lwc3. lwc3 is correct for mips1 to mips3, |
| 464 | # while pref is correct for mips4. Unfortunately, the |
| 465 | # disassembler does not know which architecture it is |
| 466 | # disassembling for. |
| 467 | # pref 4,0($4) |
| 468 | |
| 469 | prefx 4,$4($5) |
| 470 | |
| 471 | /* Miscellaneous instructions. */ |
| 472 | |
| 473 | wait |
| 474 | wait 0 # disassembles without code |
| 475 | wait 0x56789 |
| 476 | |
| 477 | ssnop |
| 478 | |
| 479 | clo $3,$4 |
| 480 | dclo $3,$4 |
| 481 | clz $3,$4 |
| 482 | dclz $3,$4 |
| 483 | |
| 484 | luxc1 $f0,$4($2) |
| 485 | suxc1 $f2,$4($2) |
| 486 | |
| 487 | tlbp |
| 488 | tlbr |
| 489 | |
| 490 | .set arch=default |
| 491 | |
| 492 | # make objdump print ... |
| 493 | .space 8 |