diff options
| author | Mike Pall <mike> | 2020-01-20 22:15:45 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2020-01-20 22:15:45 +0100 |
| commit | 94d0b53004a5fa368defa4307a17edcdb87fe727 (patch) | |
| tree | 2468fb7d60f39ccadcd696d333c83ef49f3dfc02 /dynasm | |
| parent | dfa692b746c9de067857d5fc992a41730be3d99a (diff) | |
| download | luajit-94d0b53004a5fa368defa4307a17edcdb87fe727.tar.gz luajit-94d0b53004a5fa368defa4307a17edcdb87fe727.tar.bz2 luajit-94d0b53004a5fa368defa4307a17edcdb87fe727.zip | |
MIPS: Add MIPS64 R6 port.
Contributed by Hua Zhang, YunQiang Su from Wave Computing,
and Radovan Birdic from RT-RK.
Sponsored by Wave Computing.
Diffstat (limited to 'dynasm')
| -rw-r--r-- | dynasm/dasm_mips.h | 13 | ||||
| -rw-r--r-- | dynasm/dasm_mips.lua | 625 | ||||
| -rw-r--r-- | dynasm/dynasm.lua | 1 |
3 files changed, 407 insertions, 232 deletions
diff --git a/dynasm/dasm_mips.h b/dynasm/dasm_mips.h index 71a835b2..7d06aa72 100644 --- a/dynasm/dasm_mips.h +++ b/dynasm/dasm_mips.h | |||
| @@ -355,14 +355,15 @@ int dasm_encode(Dst_DECL, void *buffer) | |||
| 355 | CK(n >= 0, UNDEF_PC); | 355 | CK(n >= 0, UNDEF_PC); |
| 356 | n = *DASM_POS2PTR(D, n); | 356 | n = *DASM_POS2PTR(D, n); |
| 357 | if (ins & 2048) | 357 | if (ins & 2048) |
| 358 | n = n - (int)((char *)cp - base); | ||
| 359 | else | ||
| 360 | n = (n + (int)(size_t)base) & 0x0fffffff; | 358 | n = (n + (int)(size_t)base) & 0x0fffffff; |
| 361 | patchrel: | 359 | else |
| 360 | n = n - (int)((char *)cp - base); | ||
| 361 | patchrel: { | ||
| 362 | unsigned int e = 16 + ((ins >> 12) & 15); | ||
| 362 | CK((n & 3) == 0 && | 363 | CK((n & 3) == 0 && |
| 363 | ((n + ((ins & 2048) ? 0x00020000 : 0)) >> | 364 | ((n + ((ins & 2048) ? 0 : (1<<(e+1)))) >> (e+2)) == 0, RANGE_REL); |
| 364 | ((ins & 2048) ? 18 : 28)) == 0, RANGE_REL); | 365 | cp[-1] |= ((n>>2) & ((1<<e)-1)); |
| 365 | cp[-1] |= ((n>>2) & ((ins & 2048) ? 0x0000ffff: 0x03ffffff)); | 366 | } |
| 366 | break; | 367 | break; |
| 367 | case DASM_LABEL_LG: | 368 | case DASM_LABEL_LG: |
| 368 | ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); | 369 | ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); |
diff --git a/dynasm/dasm_mips.lua b/dynasm/dasm_mips.lua index bd2a2b43..ccdc53cd 100644 --- a/dynasm/dasm_mips.lua +++ b/dynasm/dasm_mips.lua | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | ------------------------------------------------------------------------------ | 6 | ------------------------------------------------------------------------------ |
| 7 | 7 | ||
| 8 | local mips64 = mips64 | 8 | local mips64 = mips64 |
| 9 | local mipsr6 = _map_def.MIPSR6 | ||
| 9 | 10 | ||
| 10 | -- Module information: | 11 | -- Module information: |
| 11 | local _info = { | 12 | local _info = { |
| @@ -238,7 +239,6 @@ local map_op = { | |||
| 238 | bne_3 = "14000000STB", | 239 | bne_3 = "14000000STB", |
| 239 | blez_2 = "18000000SB", | 240 | blez_2 = "18000000SB", |
| 240 | bgtz_2 = "1c000000SB", | 241 | bgtz_2 = "1c000000SB", |
| 241 | addi_3 = "20000000TSI", | ||
| 242 | li_2 = "24000000TI", | 242 | li_2 = "24000000TI", |
| 243 | addiu_3 = "24000000TSI", | 243 | addiu_3 = "24000000TSI", |
| 244 | slti_3 = "28000000TSI", | 244 | slti_3 = "28000000TSI", |
| @@ -248,40 +248,22 @@ local map_op = { | |||
| 248 | ori_3 = "34000000TSU", | 248 | ori_3 = "34000000TSU", |
| 249 | xori_3 = "38000000TSU", | 249 | xori_3 = "38000000TSU", |
| 250 | lui_2 = "3c000000TU", | 250 | lui_2 = "3c000000TU", |
| 251 | beqzl_2 = "50000000SB", | ||
| 252 | beql_3 = "50000000STB", | ||
| 253 | bnezl_2 = "54000000SB", | ||
| 254 | bnel_3 = "54000000STB", | ||
| 255 | blezl_2 = "58000000SB", | ||
| 256 | bgtzl_2 = "5c000000SB", | ||
| 257 | daddi_3 = mips64 and "60000000TSI", | ||
| 258 | daddiu_3 = mips64 and "64000000TSI", | 251 | daddiu_3 = mips64 and "64000000TSI", |
| 259 | ldl_2 = mips64 and "68000000TO", | 252 | ldl_2 = mips64 and "68000000TO", |
| 260 | ldr_2 = mips64 and "6c000000TO", | 253 | ldr_2 = mips64 and "6c000000TO", |
| 261 | lb_2 = "80000000TO", | 254 | lb_2 = "80000000TO", |
| 262 | lh_2 = "84000000TO", | 255 | lh_2 = "84000000TO", |
| 263 | lwl_2 = "88000000TO", | ||
| 264 | lw_2 = "8c000000TO", | 256 | lw_2 = "8c000000TO", |
| 265 | lbu_2 = "90000000TO", | 257 | lbu_2 = "90000000TO", |
| 266 | lhu_2 = "94000000TO", | 258 | lhu_2 = "94000000TO", |
| 267 | lwr_2 = "98000000TO", | ||
| 268 | lwu_2 = mips64 and "9c000000TO", | 259 | lwu_2 = mips64 and "9c000000TO", |
| 269 | sb_2 = "a0000000TO", | 260 | sb_2 = "a0000000TO", |
| 270 | sh_2 = "a4000000TO", | 261 | sh_2 = "a4000000TO", |
| 271 | swl_2 = "a8000000TO", | ||
| 272 | sw_2 = "ac000000TO", | 262 | sw_2 = "ac000000TO", |
| 273 | sdl_2 = mips64 and "b0000000TO", | ||
| 274 | sdr_2 = mips64 and "b1000000TO", | ||
| 275 | swr_2 = "b8000000TO", | ||
| 276 | cache_2 = "bc000000NO", | ||
| 277 | ll_2 = "c0000000TO", | ||
| 278 | lwc1_2 = "c4000000HO", | 263 | lwc1_2 = "c4000000HO", |
| 279 | pref_2 = "cc000000NO", | ||
| 280 | ldc1_2 = "d4000000HO", | 264 | ldc1_2 = "d4000000HO", |
| 281 | ld_2 = mips64 and "dc000000TO", | 265 | ld_2 = mips64 and "dc000000TO", |
| 282 | sc_2 = "e0000000TO", | ||
| 283 | swc1_2 = "e4000000HO", | 266 | swc1_2 = "e4000000HO", |
| 284 | scd_2 = mips64 and "f0000000TO", | ||
| 285 | sdc1_2 = "f4000000HO", | 267 | sdc1_2 = "f4000000HO", |
| 286 | sd_2 = mips64 and "fc000000TO", | 268 | sd_2 = mips64 and "fc000000TO", |
| 287 | 269 | ||
| @@ -289,10 +271,6 @@ local map_op = { | |||
| 289 | nop_0 = "00000000", | 271 | nop_0 = "00000000", |
| 290 | sll_3 = "00000000DTA", | 272 | sll_3 = "00000000DTA", |
| 291 | sextw_2 = "00000000DT", | 273 | sextw_2 = "00000000DT", |
| 292 | movf_2 = "00000001DS", | ||
| 293 | movf_3 = "00000001DSC", | ||
| 294 | movt_2 = "00010001DS", | ||
| 295 | movt_3 = "00010001DSC", | ||
| 296 | srl_3 = "00000002DTA", | 274 | srl_3 = "00000002DTA", |
| 297 | rotr_3 = "00200002DTA", | 275 | rotr_3 = "00200002DTA", |
| 298 | sra_3 = "00000003DTA", | 276 | sra_3 = "00000003DTA", |
| @@ -301,31 +279,16 @@ local map_op = { | |||
| 301 | rotrv_3 = "00000046DTS", | 279 | rotrv_3 = "00000046DTS", |
| 302 | drotrv_3 = mips64 and "00000056DTS", | 280 | drotrv_3 = mips64 and "00000056DTS", |
| 303 | srav_3 = "00000007DTS", | 281 | srav_3 = "00000007DTS", |
| 304 | jr_1 = "00000008S", | ||
| 305 | jalr_1 = "0000f809S", | 282 | jalr_1 = "0000f809S", |
| 306 | jalr_2 = "00000009DS", | 283 | jalr_2 = "00000009DS", |
| 307 | movz_3 = "0000000aDST", | ||
| 308 | movn_3 = "0000000bDST", | ||
| 309 | syscall_0 = "0000000c", | 284 | syscall_0 = "0000000c", |
| 310 | syscall_1 = "0000000cY", | 285 | syscall_1 = "0000000cY", |
| 311 | break_0 = "0000000d", | 286 | break_0 = "0000000d", |
| 312 | break_1 = "0000000dY", | 287 | break_1 = "0000000dY", |
| 313 | sync_0 = "0000000f", | 288 | sync_0 = "0000000f", |
| 314 | mfhi_1 = "00000010D", | ||
| 315 | mthi_1 = "00000011S", | ||
| 316 | mflo_1 = "00000012D", | ||
| 317 | mtlo_1 = "00000013S", | ||
| 318 | dsllv_3 = mips64 and "00000014DTS", | 289 | dsllv_3 = mips64 and "00000014DTS", |
| 319 | dsrlv_3 = mips64 and "00000016DTS", | 290 | dsrlv_3 = mips64 and "00000016DTS", |
| 320 | dsrav_3 = mips64 and "00000017DTS", | 291 | dsrav_3 = mips64 and "00000017DTS", |
| 321 | mult_2 = "00000018ST", | ||
| 322 | multu_2 = "00000019ST", | ||
| 323 | div_2 = "0000001aST", | ||
| 324 | divu_2 = "0000001bST", | ||
| 325 | dmult_2 = mips64 and "0000001cST", | ||
| 326 | dmultu_2 = mips64 and "0000001dST", | ||
| 327 | ddiv_2 = mips64 and "0000001eST", | ||
| 328 | ddivu_2 = mips64 and "0000001fST", | ||
| 329 | add_3 = "00000020DST", | 292 | add_3 = "00000020DST", |
| 330 | move_2 = mips64 and "00000025DS" or "00000021DS", | 293 | move_2 = mips64 and "00000025DS" or "00000021DS", |
| 331 | addu_3 = "00000021DST", | 294 | addu_3 = "00000021DST", |
| @@ -369,32 +332,9 @@ local map_op = { | |||
| 369 | bgez_2 = "04010000SB", | 332 | bgez_2 = "04010000SB", |
| 370 | bltzl_2 = "04020000SB", | 333 | bltzl_2 = "04020000SB", |
| 371 | bgezl_2 = "04030000SB", | 334 | bgezl_2 = "04030000SB", |
| 372 | tgei_2 = "04080000SI", | ||
| 373 | tgeiu_2 = "04090000SI", | ||
| 374 | tlti_2 = "040a0000SI", | ||
| 375 | tltiu_2 = "040b0000SI", | ||
| 376 | teqi_2 = "040c0000SI", | ||
| 377 | tnei_2 = "040e0000SI", | ||
| 378 | bltzal_2 = "04100000SB", | ||
| 379 | bal_1 = "04110000B", | 335 | bal_1 = "04110000B", |
| 380 | bgezal_2 = "04110000SB", | ||
| 381 | bltzall_2 = "04120000SB", | ||
| 382 | bgezall_2 = "04130000SB", | ||
| 383 | synci_1 = "041f0000O", | 336 | synci_1 = "041f0000O", |
| 384 | 337 | ||
| 385 | -- Opcode SPECIAL2. | ||
| 386 | madd_2 = "70000000ST", | ||
| 387 | maddu_2 = "70000001ST", | ||
| 388 | mul_3 = "70000002DST", | ||
| 389 | msub_2 = "70000004ST", | ||
| 390 | msubu_2 = "70000005ST", | ||
| 391 | clz_2 = "70000020DS=", | ||
| 392 | clo_2 = "70000021DS=", | ||
| 393 | dclz_2 = mips64 and "70000024DS=", | ||
| 394 | dclo_2 = mips64 and "70000025DS=", | ||
| 395 | sdbbp_0 = "7000003f", | ||
| 396 | sdbbp_1 = "7000003fY", | ||
| 397 | |||
| 398 | -- Opcode SPECIAL3. | 338 | -- Opcode SPECIAL3. |
| 399 | ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 | 339 | ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 |
| 400 | dextm_4 = mips64 and "7c000001TSAM", -- Args: pos | size-1-32 | 340 | dextm_4 = mips64 and "7c000001TSAM", -- Args: pos | size-1-32 |
| @@ -445,15 +385,6 @@ local map_op = { | |||
| 445 | ctc1_2 = "44c00000TG", | 385 | ctc1_2 = "44c00000TG", |
| 446 | mthc1_2 = "44e00000TG", | 386 | mthc1_2 = "44e00000TG", |
| 447 | 387 | ||
| 448 | bc1f_1 = "45000000B", | ||
| 449 | bc1f_2 = "45000000CB", | ||
| 450 | bc1t_1 = "45010000B", | ||
| 451 | bc1t_2 = "45010000CB", | ||
| 452 | bc1fl_1 = "45020000B", | ||
| 453 | bc1fl_2 = "45020000CB", | ||
| 454 | bc1tl_1 = "45030000B", | ||
| 455 | bc1tl_2 = "45030000CB", | ||
| 456 | |||
| 457 | ["add.s_3"] = "46000000FGH", | 388 | ["add.s_3"] = "46000000FGH", |
| 458 | ["sub.s_3"] = "46000001FGH", | 389 | ["sub.s_3"] = "46000001FGH", |
| 459 | ["mul.s_3"] = "46000002FGH", | 390 | ["mul.s_3"] = "46000002FGH", |
| @@ -470,51 +401,11 @@ local map_op = { | |||
| 470 | ["trunc.w.s_2"] = "4600000dFG", | 401 | ["trunc.w.s_2"] = "4600000dFG", |
| 471 | ["ceil.w.s_2"] = "4600000eFG", | 402 | ["ceil.w.s_2"] = "4600000eFG", |
| 472 | ["floor.w.s_2"] = "4600000fFG", | 403 | ["floor.w.s_2"] = "4600000fFG", |
| 473 | ["movf.s_2"] = "46000011FG", | ||
| 474 | ["movf.s_3"] = "46000011FGC", | ||
| 475 | ["movt.s_2"] = "46010011FG", | ||
| 476 | ["movt.s_3"] = "46010011FGC", | ||
| 477 | ["movz.s_3"] = "46000012FGT", | ||
| 478 | ["movn.s_3"] = "46000013FGT", | ||
| 479 | ["recip.s_2"] = "46000015FG", | 404 | ["recip.s_2"] = "46000015FG", |
| 480 | ["rsqrt.s_2"] = "46000016FG", | 405 | ["rsqrt.s_2"] = "46000016FG", |
| 481 | ["cvt.d.s_2"] = "46000021FG", | 406 | ["cvt.d.s_2"] = "46000021FG", |
| 482 | ["cvt.w.s_2"] = "46000024FG", | 407 | ["cvt.w.s_2"] = "46000024FG", |
| 483 | ["cvt.l.s_2"] = "46000025FG", | 408 | ["cvt.l.s_2"] = "46000025FG", |
| 484 | ["cvt.ps.s_3"] = "46000026FGH", | ||
| 485 | ["c.f.s_2"] = "46000030GH", | ||
| 486 | ["c.f.s_3"] = "46000030VGH", | ||
| 487 | ["c.un.s_2"] = "46000031GH", | ||
| 488 | ["c.un.s_3"] = "46000031VGH", | ||
| 489 | ["c.eq.s_2"] = "46000032GH", | ||
| 490 | ["c.eq.s_3"] = "46000032VGH", | ||
| 491 | ["c.ueq.s_2"] = "46000033GH", | ||
| 492 | ["c.ueq.s_3"] = "46000033VGH", | ||
| 493 | ["c.olt.s_2"] = "46000034GH", | ||
| 494 | ["c.olt.s_3"] = "46000034VGH", | ||
| 495 | ["c.ult.s_2"] = "46000035GH", | ||
| 496 | ["c.ult.s_3"] = "46000035VGH", | ||
| 497 | ["c.ole.s_2"] = "46000036GH", | ||
| 498 | ["c.ole.s_3"] = "46000036VGH", | ||
| 499 | ["c.ule.s_2"] = "46000037GH", | ||
| 500 | ["c.ule.s_3"] = "46000037VGH", | ||
| 501 | ["c.sf.s_2"] = "46000038GH", | ||
| 502 | ["c.sf.s_3"] = "46000038VGH", | ||
| 503 | ["c.ngle.s_2"] = "46000039GH", | ||
| 504 | ["c.ngle.s_3"] = "46000039VGH", | ||
| 505 | ["c.seq.s_2"] = "4600003aGH", | ||
| 506 | ["c.seq.s_3"] = "4600003aVGH", | ||
| 507 | ["c.ngl.s_2"] = "4600003bGH", | ||
| 508 | ["c.ngl.s_3"] = "4600003bVGH", | ||
| 509 | ["c.lt.s_2"] = "4600003cGH", | ||
| 510 | ["c.lt.s_3"] = "4600003cVGH", | ||
| 511 | ["c.nge.s_2"] = "4600003dGH", | ||
| 512 | ["c.nge.s_3"] = "4600003dVGH", | ||
| 513 | ["c.le.s_2"] = "4600003eGH", | ||
| 514 | ["c.le.s_3"] = "4600003eVGH", | ||
| 515 | ["c.ngt.s_2"] = "4600003fGH", | ||
| 516 | ["c.ngt.s_3"] = "4600003fVGH", | ||
| 517 | |||
| 518 | ["add.d_3"] = "46200000FGH", | 409 | ["add.d_3"] = "46200000FGH", |
| 519 | ["sub.d_3"] = "46200001FGH", | 410 | ["sub.d_3"] = "46200001FGH", |
| 520 | ["mul.d_3"] = "46200002FGH", | 411 | ["mul.d_3"] = "46200002FGH", |
| @@ -531,130 +422,410 @@ local map_op = { | |||
| 531 | ["trunc.w.d_2"] = "4620000dFG", | 422 | ["trunc.w.d_2"] = "4620000dFG", |
| 532 | ["ceil.w.d_2"] = "4620000eFG", | 423 | ["ceil.w.d_2"] = "4620000eFG", |
| 533 | ["floor.w.d_2"] = "4620000fFG", | 424 | ["floor.w.d_2"] = "4620000fFG", |
| 534 | ["movf.d_2"] = "46200011FG", | ||
| 535 | ["movf.d_3"] = "46200011FGC", | ||
| 536 | ["movt.d_2"] = "46210011FG", | ||
| 537 | ["movt.d_3"] = "46210011FGC", | ||
| 538 | ["movz.d_3"] = "46200012FGT", | ||
| 539 | ["movn.d_3"] = "46200013FGT", | ||
| 540 | ["recip.d_2"] = "46200015FG", | 425 | ["recip.d_2"] = "46200015FG", |
| 541 | ["rsqrt.d_2"] = "46200016FG", | 426 | ["rsqrt.d_2"] = "46200016FG", |
| 542 | ["cvt.s.d_2"] = "46200020FG", | 427 | ["cvt.s.d_2"] = "46200020FG", |
| 543 | ["cvt.w.d_2"] = "46200024FG", | 428 | ["cvt.w.d_2"] = "46200024FG", |
| 544 | ["cvt.l.d_2"] = "46200025FG", | 429 | ["cvt.l.d_2"] = "46200025FG", |
| 545 | ["c.f.d_2"] = "46200030GH", | ||
| 546 | ["c.f.d_3"] = "46200030VGH", | ||
| 547 | ["c.un.d_2"] = "46200031GH", | ||
| 548 | ["c.un.d_3"] = "46200031VGH", | ||
| 549 | ["c.eq.d_2"] = "46200032GH", | ||
| 550 | ["c.eq.d_3"] = "46200032VGH", | ||
| 551 | ["c.ueq.d_2"] = "46200033GH", | ||
| 552 | ["c.ueq.d_3"] = "46200033VGH", | ||
| 553 | ["c.olt.d_2"] = "46200034GH", | ||
| 554 | ["c.olt.d_3"] = "46200034VGH", | ||
| 555 | ["c.ult.d_2"] = "46200035GH", | ||
| 556 | ["c.ult.d_3"] = "46200035VGH", | ||
| 557 | ["c.ole.d_2"] = "46200036GH", | ||
| 558 | ["c.ole.d_3"] = "46200036VGH", | ||
| 559 | ["c.ule.d_2"] = "46200037GH", | ||
| 560 | ["c.ule.d_3"] = "46200037VGH", | ||
| 561 | ["c.sf.d_2"] = "46200038GH", | ||
| 562 | ["c.sf.d_3"] = "46200038VGH", | ||
| 563 | ["c.ngle.d_2"] = "46200039GH", | ||
| 564 | ["c.ngle.d_3"] = "46200039VGH", | ||
| 565 | ["c.seq.d_2"] = "4620003aGH", | ||
| 566 | ["c.seq.d_3"] = "4620003aVGH", | ||
| 567 | ["c.ngl.d_2"] = "4620003bGH", | ||
| 568 | ["c.ngl.d_3"] = "4620003bVGH", | ||
| 569 | ["c.lt.d_2"] = "4620003cGH", | ||
| 570 | ["c.lt.d_3"] = "4620003cVGH", | ||
| 571 | ["c.nge.d_2"] = "4620003dGH", | ||
| 572 | ["c.nge.d_3"] = "4620003dVGH", | ||
| 573 | ["c.le.d_2"] = "4620003eGH", | ||
| 574 | ["c.le.d_3"] = "4620003eVGH", | ||
| 575 | ["c.ngt.d_2"] = "4620003fGH", | ||
| 576 | ["c.ngt.d_3"] = "4620003fVGH", | ||
| 577 | |||
| 578 | ["add.ps_3"] = "46c00000FGH", | ||
| 579 | ["sub.ps_3"] = "46c00001FGH", | ||
| 580 | ["mul.ps_3"] = "46c00002FGH", | ||
| 581 | ["abs.ps_2"] = "46c00005FG", | ||
| 582 | ["mov.ps_2"] = "46c00006FG", | ||
| 583 | ["neg.ps_2"] = "46c00007FG", | ||
| 584 | ["movf.ps_2"] = "46c00011FG", | ||
| 585 | ["movf.ps_3"] = "46c00011FGC", | ||
| 586 | ["movt.ps_2"] = "46c10011FG", | ||
| 587 | ["movt.ps_3"] = "46c10011FGC", | ||
| 588 | ["movz.ps_3"] = "46c00012FGT", | ||
| 589 | ["movn.ps_3"] = "46c00013FGT", | ||
| 590 | ["cvt.s.pu_2"] = "46c00020FG", | ||
| 591 | ["cvt.s.pl_2"] = "46c00028FG", | ||
| 592 | ["pll.ps_3"] = "46c0002cFGH", | ||
| 593 | ["plu.ps_3"] = "46c0002dFGH", | ||
| 594 | ["pul.ps_3"] = "46c0002eFGH", | ||
| 595 | ["puu.ps_3"] = "46c0002fFGH", | ||
| 596 | ["c.f.ps_2"] = "46c00030GH", | ||
| 597 | ["c.f.ps_3"] = "46c00030VGH", | ||
| 598 | ["c.un.ps_2"] = "46c00031GH", | ||
| 599 | ["c.un.ps_3"] = "46c00031VGH", | ||
| 600 | ["c.eq.ps_2"] = "46c00032GH", | ||
| 601 | ["c.eq.ps_3"] = "46c00032VGH", | ||
| 602 | ["c.ueq.ps_2"] = "46c00033GH", | ||
| 603 | ["c.ueq.ps_3"] = "46c00033VGH", | ||
| 604 | ["c.olt.ps_2"] = "46c00034GH", | ||
| 605 | ["c.olt.ps_3"] = "46c00034VGH", | ||
| 606 | ["c.ult.ps_2"] = "46c00035GH", | ||
| 607 | ["c.ult.ps_3"] = "46c00035VGH", | ||
| 608 | ["c.ole.ps_2"] = "46c00036GH", | ||
| 609 | ["c.ole.ps_3"] = "46c00036VGH", | ||
| 610 | ["c.ule.ps_2"] = "46c00037GH", | ||
| 611 | ["c.ule.ps_3"] = "46c00037VGH", | ||
| 612 | ["c.sf.ps_2"] = "46c00038GH", | ||
| 613 | ["c.sf.ps_3"] = "46c00038VGH", | ||
| 614 | ["c.ngle.ps_2"] = "46c00039GH", | ||
| 615 | ["c.ngle.ps_3"] = "46c00039VGH", | ||
| 616 | ["c.seq.ps_2"] = "46c0003aGH", | ||
| 617 | ["c.seq.ps_3"] = "46c0003aVGH", | ||
| 618 | ["c.ngl.ps_2"] = "46c0003bGH", | ||
| 619 | ["c.ngl.ps_3"] = "46c0003bVGH", | ||
| 620 | ["c.lt.ps_2"] = "46c0003cGH", | ||
| 621 | ["c.lt.ps_3"] = "46c0003cVGH", | ||
| 622 | ["c.nge.ps_2"] = "46c0003dGH", | ||
| 623 | ["c.nge.ps_3"] = "46c0003dVGH", | ||
| 624 | ["c.le.ps_2"] = "46c0003eGH", | ||
| 625 | ["c.le.ps_3"] = "46c0003eVGH", | ||
| 626 | ["c.ngt.ps_2"] = "46c0003fGH", | ||
| 627 | ["c.ngt.ps_3"] = "46c0003fVGH", | ||
| 628 | |||
| 629 | ["cvt.s.w_2"] = "46800020FG", | 430 | ["cvt.s.w_2"] = "46800020FG", |
| 630 | ["cvt.d.w_2"] = "46800021FG", | 431 | ["cvt.d.w_2"] = "46800021FG", |
| 631 | |||
| 632 | ["cvt.s.l_2"] = "46a00020FG", | 432 | ["cvt.s.l_2"] = "46a00020FG", |
| 633 | ["cvt.d.l_2"] = "46a00021FG", | 433 | ["cvt.d.l_2"] = "46a00021FG", |
| 634 | |||
| 635 | -- Opcode COP1X. | ||
| 636 | lwxc1_2 = "4c000000FX", | ||
| 637 | ldxc1_2 = "4c000001FX", | ||
| 638 | luxc1_2 = "4c000005FX", | ||
| 639 | swxc1_2 = "4c000008FX", | ||
| 640 | sdxc1_2 = "4c000009FX", | ||
| 641 | suxc1_2 = "4c00000dFX", | ||
| 642 | prefx_2 = "4c00000fMX", | ||
| 643 | ["alnv.ps_4"] = "4c00001eFGHS", | ||
| 644 | ["madd.s_4"] = "4c000020FRGH", | ||
| 645 | ["madd.d_4"] = "4c000021FRGH", | ||
| 646 | ["madd.ps_4"] = "4c000026FRGH", | ||
| 647 | ["msub.s_4"] = "4c000028FRGH", | ||
| 648 | ["msub.d_4"] = "4c000029FRGH", | ||
| 649 | ["msub.ps_4"] = "4c00002eFRGH", | ||
| 650 | ["nmadd.s_4"] = "4c000030FRGH", | ||
| 651 | ["nmadd.d_4"] = "4c000031FRGH", | ||
| 652 | ["nmadd.ps_4"] = "4c000036FRGH", | ||
| 653 | ["nmsub.s_4"] = "4c000038FRGH", | ||
| 654 | ["nmsub.d_4"] = "4c000039FRGH", | ||
| 655 | ["nmsub.ps_4"] = "4c00003eFRGH", | ||
| 656 | } | 434 | } |
| 657 | 435 | ||
| 436 | if mipsr6 then -- Instructions added with MIPSR6. | ||
| 437 | |||
| 438 | for k,v in pairs({ | ||
| 439 | |||
| 440 | -- Add immediate to upper bits. | ||
| 441 | aui_3 = "3c000000TSI", | ||
| 442 | daui_3 = mips64 and "74000000TSI", | ||
| 443 | dahi_2 = mips64 and "04060000SI", | ||
| 444 | dati_2 = mips64 and "041e0000SI", | ||
| 445 | |||
| 446 | -- TODO: addiupc, auipc, aluipc, lwpc, lwupc, ldpc. | ||
| 447 | |||
| 448 | -- Compact branches. | ||
| 449 | blezalc_2 = "18000000TB", -- rt != 0. | ||
| 450 | bgezalc_2 = "18000000T=SB", -- rt != 0. | ||
| 451 | bgtzalc_2 = "1c000000TB", -- rt != 0. | ||
| 452 | bltzalc_2 = "1c000000T=SB", -- rt != 0. | ||
| 453 | |||
| 454 | blezc_2 = "58000000TB", -- rt != 0. | ||
| 455 | bgezc_2 = "58000000T=SB", -- rt != 0. | ||
| 456 | bgec_3 = "58000000STB", -- rs != rt. | ||
| 457 | blec_3 = "58000000TSB", -- rt != rs. | ||
| 458 | |||
| 459 | bgtzc_2 = "5c000000TB", -- rt != 0. | ||
| 460 | bltzc_2 = "5c000000T=SB", -- rt != 0. | ||
| 461 | bltc_3 = "5c000000STB", -- rs != rt. | ||
| 462 | bgtc_3 = "5c000000TSB", -- rt != rs. | ||
| 463 | |||
| 464 | bgeuc_3 = "18000000STB", -- rs != rt. | ||
| 465 | bleuc_3 = "18000000TSB", -- rt != rs. | ||
| 466 | bltuc_3 = "1c000000STB", -- rs != rt. | ||
| 467 | bgtuc_3 = "1c000000TSB", -- rt != rs. | ||
| 468 | |||
| 469 | beqzalc_2 = "20000000TB", -- rt != 0. | ||
| 470 | bnezalc_2 = "60000000TB", -- rt != 0. | ||
| 471 | beqc_3 = "20000000STB", -- rs < rt. | ||
| 472 | bnec_3 = "60000000STB", -- rs < rt. | ||
| 473 | bovc_3 = "20000000STB", -- rs >= rt. | ||
| 474 | bnvc_3 = "60000000STB", -- rs >= rt. | ||
| 475 | |||
| 476 | beqzc_2 = "d8000000SK", -- rs != 0. | ||
| 477 | bnezc_2 = "f8000000SK", -- rs != 0. | ||
| 478 | jic_2 = "d8000000TI", | ||
| 479 | jialc_2 = "f8000000TI", | ||
| 480 | bc_1 = "c8000000L", | ||
| 481 | balc_1 = "e8000000L", | ||
| 482 | |||
| 483 | -- Opcode SPECIAL. | ||
| 484 | jr_1 = "00000009S", | ||
| 485 | sdbbp_0 = "0000000e", | ||
| 486 | sdbbp_1 = "0000000eY", | ||
| 487 | lsa_4 = "00000005DSTA", | ||
| 488 | dlsa_4 = mips64 and "00000015DSTA", | ||
| 489 | seleqz_3 = "00000035DST", | ||
| 490 | selnez_3 = "00000037DST", | ||
| 491 | clz_2 = "00000050DS", | ||
| 492 | clo_2 = "00000051DS", | ||
| 493 | dclz_2 = mips64 and "00000052DS", | ||
| 494 | dclo_2 = mips64 and "00000053DS", | ||
| 495 | mul_3 = "00000098DST", | ||
| 496 | muh_3 = "000000d8DST", | ||
| 497 | mulu_3 = "00000099DST", | ||
| 498 | muhu_3 = "000000d9DST", | ||
| 499 | div_3 = "0000009aDST", | ||
| 500 | mod_3 = "000000daDST", | ||
| 501 | divu_3 = "0000009bDST", | ||
| 502 | modu_3 = "000000dbDST", | ||
| 503 | dmul_3 = mips64 and "0000009cDST", | ||
| 504 | dmuh_3 = mips64 and "000000dcDST", | ||
| 505 | dmulu_3 = mips64 and "0000009dDST", | ||
| 506 | dmuhu_3 = mips64 and "000000ddDST", | ||
| 507 | ddiv_3 = mips64 and "0000009eDST", | ||
| 508 | dmod_3 = mips64 and "000000deDST", | ||
| 509 | ddivu_3 = mips64 and "0000009fDST", | ||
| 510 | dmodu_3 = mips64 and "000000dfDST", | ||
| 511 | |||
| 512 | -- Opcode SPECIAL3. | ||
| 513 | align_4 = "7c000220DSTA", | ||
| 514 | dalign_4 = mips64 and "7c000224DSTA", | ||
| 515 | bitswap_2 = "7c000020DT", | ||
| 516 | dbitswap_2 = mips64 and "7c000024DT", | ||
| 517 | |||
| 518 | -- Opcode COP1. | ||
| 519 | bc1eqz_2 = "45200000HB", | ||
| 520 | bc1nez_2 = "45a00000HB", | ||
| 521 | |||
| 522 | ["sel.s_3"] = "46000010FGH", | ||
| 523 | ["seleqz.s_3"] = "46000014FGH", | ||
| 524 | ["selnez.s_3"] = "46000017FGH", | ||
| 525 | ["maddf.s_3"] = "46000018FGH", | ||
| 526 | ["msubf.s_3"] = "46000019FGH", | ||
| 527 | ["rint.s_2"] = "4600001aFG", | ||
| 528 | ["class.s_2"] = "4600001bFG", | ||
| 529 | ["min.s_3"] = "4600001cFGH", | ||
| 530 | ["mina.s_3"] = "4600001dFGH", | ||
| 531 | ["max.s_3"] = "4600001eFGH", | ||
| 532 | ["maxa.s_3"] = "4600001fFGH", | ||
| 533 | ["cmp.af.s_3"] = "46800000FGH", | ||
| 534 | ["cmp.un.s_3"] = "46800001FGH", | ||
| 535 | ["cmp.or.s_3"] = "46800011FGH", | ||
| 536 | ["cmp.eq.s_3"] = "46800002FGH", | ||
| 537 | ["cmp.une.s_3"] = "46800012FGH", | ||
| 538 | ["cmp.ueq.s_3"] = "46800003FGH", | ||
| 539 | ["cmp.ne.s_3"] = "46800013FGH", | ||
| 540 | ["cmp.lt.s_3"] = "46800004FGH", | ||
| 541 | ["cmp.ult.s_3"] = "46800005FGH", | ||
| 542 | ["cmp.le.s_3"] = "46800006FGH", | ||
| 543 | ["cmp.ule.s_3"] = "46800007FGH", | ||
| 544 | ["cmp.saf.s_3"] = "46800008FGH", | ||
| 545 | ["cmp.sun.s_3"] = "46800009FGH", | ||
| 546 | ["cmp.sor.s_3"] = "46800019FGH", | ||
| 547 | ["cmp.seq.s_3"] = "4680000aFGH", | ||
| 548 | ["cmp.sune.s_3"] = "4680001aFGH", | ||
| 549 | ["cmp.sueq.s_3"] = "4680000bFGH", | ||
| 550 | ["cmp.sne.s_3"] = "4680001bFGH", | ||
| 551 | ["cmp.slt.s_3"] = "4680000cFGH", | ||
| 552 | ["cmp.sult.s_3"] = "4680000dFGH", | ||
| 553 | ["cmp.sle.s_3"] = "4680000eFGH", | ||
| 554 | ["cmp.sule.s_3"] = "4680000fFGH", | ||
| 555 | |||
| 556 | ["sel.d_3"] = "46200010FGH", | ||
| 557 | ["seleqz.d_3"] = "46200014FGH", | ||
| 558 | ["selnez.d_3"] = "46200017FGH", | ||
| 559 | ["maddf.d_3"] = "46200018FGH", | ||
| 560 | ["msubf.d_3"] = "46200019FGH", | ||
| 561 | ["rint.d_2"] = "4620001aFG", | ||
| 562 | ["class.d_2"] = "4620001bFG", | ||
| 563 | ["min.d_3"] = "4620001cFGH", | ||
| 564 | ["mina.d_3"] = "4620001dFGH", | ||
| 565 | ["max.d_3"] = "4620001eFGH", | ||
| 566 | ["maxa.d_3"] = "4620001fFGH", | ||
| 567 | ["cmp.af.d_3"] = "46a00000FGH", | ||
| 568 | ["cmp.un.d_3"] = "46a00001FGH", | ||
| 569 | ["cmp.or.d_3"] = "46a00011FGH", | ||
| 570 | ["cmp.eq.d_3"] = "46a00002FGH", | ||
| 571 | ["cmp.une.d_3"] = "46a00012FGH", | ||
| 572 | ["cmp.ueq.d_3"] = "46a00003FGH", | ||
| 573 | ["cmp.ne.d_3"] = "46a00013FGH", | ||
| 574 | ["cmp.lt.d_3"] = "46a00004FGH", | ||
| 575 | ["cmp.ult.d_3"] = "46a00005FGH", | ||
| 576 | ["cmp.le.d_3"] = "46a00006FGH", | ||
| 577 | ["cmp.ule.d_3"] = "46a00007FGH", | ||
| 578 | ["cmp.saf.d_3"] = "46a00008FGH", | ||
| 579 | ["cmp.sun.d_3"] = "46a00009FGH", | ||
| 580 | ["cmp.sor.d_3"] = "46a00019FGH", | ||
| 581 | ["cmp.seq.d_3"] = "46a0000aFGH", | ||
| 582 | ["cmp.sune.d_3"] = "46a0001aFGH", | ||
| 583 | ["cmp.sueq.d_3"] = "46a0000bFGH", | ||
| 584 | ["cmp.sne.d_3"] = "46a0001bFGH", | ||
| 585 | ["cmp.slt.d_3"] = "46a0000cFGH", | ||
| 586 | ["cmp.sult.d_3"] = "46a0000dFGH", | ||
| 587 | ["cmp.sle.d_3"] = "46a0000eFGH", | ||
| 588 | ["cmp.sule.d_3"] = "46a0000fFGH", | ||
| 589 | |||
| 590 | }) do map_op[k] = v end | ||
| 591 | |||
| 592 | else -- Instructions removed by MIPSR6. | ||
| 593 | |||
| 594 | for k,v in pairs({ | ||
| 595 | -- Traps, don't use. | ||
| 596 | addi_3 = "20000000TSI", | ||
| 597 | daddi_3 = mips64 and "60000000TSI", | ||
| 598 | |||
| 599 | -- Branch on likely, don't use. | ||
| 600 | beqzl_2 = "50000000SB", | ||
| 601 | beql_3 = "50000000STB", | ||
| 602 | bnezl_2 = "54000000SB", | ||
| 603 | bnel_3 = "54000000STB", | ||
| 604 | blezl_2 = "58000000SB", | ||
| 605 | bgtzl_2 = "5c000000SB", | ||
| 606 | |||
| 607 | lwl_2 = "88000000TO", | ||
| 608 | lwr_2 = "98000000TO", | ||
| 609 | swl_2 = "a8000000TO", | ||
| 610 | sdl_2 = mips64 and "b0000000TO", | ||
| 611 | sdr_2 = mips64 and "b1000000TO", | ||
| 612 | swr_2 = "b8000000TO", | ||
| 613 | cache_2 = "bc000000NO", | ||
| 614 | ll_2 = "c0000000TO", | ||
| 615 | pref_2 = "cc000000NO", | ||
| 616 | sc_2 = "e0000000TO", | ||
| 617 | scd_2 = mips64 and "f0000000TO", | ||
| 618 | |||
| 619 | -- Opcode SPECIAL. | ||
| 620 | movf_2 = "00000001DS", | ||
| 621 | movf_3 = "00000001DSC", | ||
| 622 | movt_2 = "00010001DS", | ||
| 623 | movt_3 = "00010001DSC", | ||
| 624 | jr_1 = "00000008S", | ||
| 625 | movz_3 = "0000000aDST", | ||
| 626 | movn_3 = "0000000bDST", | ||
| 627 | mfhi_1 = "00000010D", | ||
| 628 | mthi_1 = "00000011S", | ||
| 629 | mflo_1 = "00000012D", | ||
| 630 | mtlo_1 = "00000013S", | ||
| 631 | mult_2 = "00000018ST", | ||
| 632 | multu_2 = "00000019ST", | ||
| 633 | div_3 = "0000001aST", | ||
| 634 | divu_3 = "0000001bST", | ||
| 635 | ddiv_3 = mips64 and "0000001eST", | ||
| 636 | ddivu_3 = mips64 and "0000001fST", | ||
| 637 | dmult_2 = mips64 and "0000001cST", | ||
| 638 | dmultu_2 = mips64 and "0000001dST", | ||
| 639 | |||
| 640 | -- Opcode REGIMM. | ||
| 641 | tgei_2 = "04080000SI", | ||
| 642 | tgeiu_2 = "04090000SI", | ||
| 643 | tlti_2 = "040a0000SI", | ||
| 644 | tltiu_2 = "040b0000SI", | ||
| 645 | teqi_2 = "040c0000SI", | ||
| 646 | tnei_2 = "040e0000SI", | ||
| 647 | bltzal_2 = "04100000SB", | ||
| 648 | bgezal_2 = "04110000SB", | ||
| 649 | bltzall_2 = "04120000SB", | ||
| 650 | bgezall_2 = "04130000SB", | ||
| 651 | |||
| 652 | -- Opcode SPECIAL2. | ||
| 653 | madd_2 = "70000000ST", | ||
| 654 | maddu_2 = "70000001ST", | ||
| 655 | mul_3 = "70000002DST", | ||
| 656 | msub_2 = "70000004ST", | ||
| 657 | msubu_2 = "70000005ST", | ||
| 658 | clz_2 = "70000020D=TS", | ||
| 659 | clo_2 = "70000021D=TS", | ||
| 660 | dclz_2 = mips64 and "70000024D=TS", | ||
| 661 | dclo_2 = mips64 and "70000025D=TS", | ||
| 662 | sdbbp_0 = "7000003f", | ||
| 663 | sdbbp_1 = "7000003fY", | ||
| 664 | |||
| 665 | -- Opcode COP1. | ||
| 666 | bc1f_1 = "45000000B", | ||
| 667 | bc1f_2 = "45000000CB", | ||
| 668 | bc1t_1 = "45010000B", | ||
| 669 | bc1t_2 = "45010000CB", | ||
| 670 | bc1fl_1 = "45020000B", | ||
| 671 | bc1fl_2 = "45020000CB", | ||
| 672 | bc1tl_1 = "45030000B", | ||
| 673 | bc1tl_2 = "45030000CB", | ||
| 674 | |||
| 675 | ["movf.s_2"] = "46000011FG", | ||
| 676 | ["movf.s_3"] = "46000011FGC", | ||
| 677 | ["movt.s_2"] = "46010011FG", | ||
| 678 | ["movt.s_3"] = "46010011FGC", | ||
| 679 | ["movz.s_3"] = "46000012FGT", | ||
| 680 | ["movn.s_3"] = "46000013FGT", | ||
| 681 | ["cvt.ps.s_3"] = "46000026FGH", | ||
| 682 | ["c.f.s_2"] = "46000030GH", | ||
| 683 | ["c.f.s_3"] = "46000030VGH", | ||
| 684 | ["c.un.s_2"] = "46000031GH", | ||
| 685 | ["c.un.s_3"] = "46000031VGH", | ||
| 686 | ["c.eq.s_2"] = "46000032GH", | ||
| 687 | ["c.eq.s_3"] = "46000032VGH", | ||
| 688 | ["c.ueq.s_2"] = "46000033GH", | ||
| 689 | ["c.ueq.s_3"] = "46000033VGH", | ||
| 690 | ["c.olt.s_2"] = "46000034GH", | ||
| 691 | ["c.olt.s_3"] = "46000034VGH", | ||
| 692 | ["c.ult.s_2"] = "46000035GH", | ||
| 693 | ["c.ult.s_3"] = "46000035VGH", | ||
| 694 | ["c.ole.s_2"] = "46000036GH", | ||
| 695 | ["c.ole.s_3"] = "46000036VGH", | ||
| 696 | ["c.ule.s_2"] = "46000037GH", | ||
| 697 | ["c.ule.s_3"] = "46000037VGH", | ||
| 698 | ["c.sf.s_2"] = "46000038GH", | ||
| 699 | ["c.sf.s_3"] = "46000038VGH", | ||
| 700 | ["c.ngle.s_2"] = "46000039GH", | ||
| 701 | ["c.ngle.s_3"] = "46000039VGH", | ||
| 702 | ["c.seq.s_2"] = "4600003aGH", | ||
| 703 | ["c.seq.s_3"] = "4600003aVGH", | ||
| 704 | ["c.ngl.s_2"] = "4600003bGH", | ||
| 705 | ["c.ngl.s_3"] = "4600003bVGH", | ||
| 706 | ["c.lt.s_2"] = "4600003cGH", | ||
| 707 | ["c.lt.s_3"] = "4600003cVGH", | ||
| 708 | ["c.nge.s_2"] = "4600003dGH", | ||
| 709 | ["c.nge.s_3"] = "4600003dVGH", | ||
| 710 | ["c.le.s_2"] = "4600003eGH", | ||
| 711 | ["c.le.s_3"] = "4600003eVGH", | ||
| 712 | ["c.ngt.s_2"] = "4600003fGH", | ||
| 713 | ["c.ngt.s_3"] = "4600003fVGH", | ||
| 714 | ["movf.d_2"] = "46200011FG", | ||
| 715 | ["movf.d_3"] = "46200011FGC", | ||
| 716 | ["movt.d_2"] = "46210011FG", | ||
| 717 | ["movt.d_3"] = "46210011FGC", | ||
| 718 | ["movz.d_3"] = "46200012FGT", | ||
| 719 | ["movn.d_3"] = "46200013FGT", | ||
| 720 | ["c.f.d_2"] = "46200030GH", | ||
| 721 | ["c.f.d_3"] = "46200030VGH", | ||
| 722 | ["c.un.d_2"] = "46200031GH", | ||
| 723 | ["c.un.d_3"] = "46200031VGH", | ||
| 724 | ["c.eq.d_2"] = "46200032GH", | ||
| 725 | ["c.eq.d_3"] = "46200032VGH", | ||
| 726 | ["c.ueq.d_2"] = "46200033GH", | ||
| 727 | ["c.ueq.d_3"] = "46200033VGH", | ||
| 728 | ["c.olt.d_2"] = "46200034GH", | ||
| 729 | ["c.olt.d_3"] = "46200034VGH", | ||
| 730 | ["c.ult.d_2"] = "46200035GH", | ||
| 731 | ["c.ult.d_3"] = "46200035VGH", | ||
| 732 | ["c.ole.d_2"] = "46200036GH", | ||
| 733 | ["c.ole.d_3"] = "46200036VGH", | ||
| 734 | ["c.ule.d_2"] = "46200037GH", | ||
| 735 | ["c.ule.d_3"] = "46200037VGH", | ||
| 736 | ["c.sf.d_2"] = "46200038GH", | ||
| 737 | ["c.sf.d_3"] = "46200038VGH", | ||
| 738 | ["c.ngle.d_2"] = "46200039GH", | ||
| 739 | ["c.ngle.d_3"] = "46200039VGH", | ||
| 740 | ["c.seq.d_2"] = "4620003aGH", | ||
| 741 | ["c.seq.d_3"] = "4620003aVGH", | ||
| 742 | ["c.ngl.d_2"] = "4620003bGH", | ||
| 743 | ["c.ngl.d_3"] = "4620003bVGH", | ||
| 744 | ["c.lt.d_2"] = "4620003cGH", | ||
| 745 | ["c.lt.d_3"] = "4620003cVGH", | ||
| 746 | ["c.nge.d_2"] = "4620003dGH", | ||
| 747 | ["c.nge.d_3"] = "4620003dVGH", | ||
| 748 | ["c.le.d_2"] = "4620003eGH", | ||
| 749 | ["c.le.d_3"] = "4620003eVGH", | ||
| 750 | ["c.ngt.d_2"] = "4620003fGH", | ||
| 751 | ["c.ngt.d_3"] = "4620003fVGH", | ||
| 752 | ["add.ps_3"] = "46c00000FGH", | ||
| 753 | ["sub.ps_3"] = "46c00001FGH", | ||
| 754 | ["mul.ps_3"] = "46c00002FGH", | ||
| 755 | ["abs.ps_2"] = "46c00005FG", | ||
| 756 | ["mov.ps_2"] = "46c00006FG", | ||
| 757 | ["neg.ps_2"] = "46c00007FG", | ||
| 758 | ["movf.ps_2"] = "46c00011FG", | ||
| 759 | ["movf.ps_3"] = "46c00011FGC", | ||
| 760 | ["movt.ps_2"] = "46c10011FG", | ||
| 761 | ["movt.ps_3"] = "46c10011FGC", | ||
| 762 | ["movz.ps_3"] = "46c00012FGT", | ||
| 763 | ["movn.ps_3"] = "46c00013FGT", | ||
| 764 | ["cvt.s.pu_2"] = "46c00020FG", | ||
| 765 | ["cvt.s.pl_2"] = "46c00028FG", | ||
| 766 | ["pll.ps_3"] = "46c0002cFGH", | ||
| 767 | ["plu.ps_3"] = "46c0002dFGH", | ||
| 768 | ["pul.ps_3"] = "46c0002eFGH", | ||
| 769 | ["puu.ps_3"] = "46c0002fFGH", | ||
| 770 | ["c.f.ps_2"] = "46c00030GH", | ||
| 771 | ["c.f.ps_3"] = "46c00030VGH", | ||
| 772 | ["c.un.ps_2"] = "46c00031GH", | ||
| 773 | ["c.un.ps_3"] = "46c00031VGH", | ||
| 774 | ["c.eq.ps_2"] = "46c00032GH", | ||
| 775 | ["c.eq.ps_3"] = "46c00032VGH", | ||
| 776 | ["c.ueq.ps_2"] = "46c00033GH", | ||
| 777 | ["c.ueq.ps_3"] = "46c00033VGH", | ||
| 778 | ["c.olt.ps_2"] = "46c00034GH", | ||
| 779 | ["c.olt.ps_3"] = "46c00034VGH", | ||
| 780 | ["c.ult.ps_2"] = "46c00035GH", | ||
| 781 | ["c.ult.ps_3"] = "46c00035VGH", | ||
| 782 | ["c.ole.ps_2"] = "46c00036GH", | ||
| 783 | ["c.ole.ps_3"] = "46c00036VGH", | ||
| 784 | ["c.ule.ps_2"] = "46c00037GH", | ||
| 785 | ["c.ule.ps_3"] = "46c00037VGH", | ||
| 786 | ["c.sf.ps_2"] = "46c00038GH", | ||
| 787 | ["c.sf.ps_3"] = "46c00038VGH", | ||
| 788 | ["c.ngle.ps_2"] = "46c00039GH", | ||
| 789 | ["c.ngle.ps_3"] = "46c00039VGH", | ||
| 790 | ["c.seq.ps_2"] = "46c0003aGH", | ||
| 791 | ["c.seq.ps_3"] = "46c0003aVGH", | ||
| 792 | ["c.ngl.ps_2"] = "46c0003bGH", | ||
| 793 | ["c.ngl.ps_3"] = "46c0003bVGH", | ||
| 794 | ["c.lt.ps_2"] = "46c0003cGH", | ||
| 795 | ["c.lt.ps_3"] = "46c0003cVGH", | ||
| 796 | ["c.nge.ps_2"] = "46c0003dGH", | ||
| 797 | ["c.nge.ps_3"] = "46c0003dVGH", | ||
| 798 | ["c.le.ps_2"] = "46c0003eGH", | ||
| 799 | ["c.le.ps_3"] = "46c0003eVGH", | ||
| 800 | ["c.ngt.ps_2"] = "46c0003fGH", | ||
| 801 | ["c.ngt.ps_3"] = "46c0003fVGH", | ||
| 802 | |||
| 803 | -- Opcode COP1X. | ||
| 804 | lwxc1_2 = "4c000000FX", | ||
| 805 | ldxc1_2 = "4c000001FX", | ||
| 806 | luxc1_2 = "4c000005FX", | ||
| 807 | swxc1_2 = "4c000008FX", | ||
| 808 | sdxc1_2 = "4c000009FX", | ||
| 809 | suxc1_2 = "4c00000dFX", | ||
| 810 | prefx_2 = "4c00000fMX", | ||
| 811 | ["alnv.ps_4"] = "4c00001eFGHS", | ||
| 812 | ["madd.s_4"] = "4c000020FRGH", | ||
| 813 | ["madd.d_4"] = "4c000021FRGH", | ||
| 814 | ["madd.ps_4"] = "4c000026FRGH", | ||
| 815 | ["msub.s_4"] = "4c000028FRGH", | ||
| 816 | ["msub.d_4"] = "4c000029FRGH", | ||
| 817 | ["msub.ps_4"] = "4c00002eFRGH", | ||
| 818 | ["nmadd.s_4"] = "4c000030FRGH", | ||
| 819 | ["nmadd.d_4"] = "4c000031FRGH", | ||
| 820 | ["nmadd.ps_4"] = "4c000036FRGH", | ||
| 821 | ["nmsub.s_4"] = "4c000038FRGH", | ||
| 822 | ["nmsub.d_4"] = "4c000039FRGH", | ||
| 823 | ["nmsub.ps_4"] = "4c00003eFRGH", | ||
| 824 | |||
| 825 | }) do map_op[k] = v end | ||
| 826 | |||
| 827 | end | ||
| 828 | |||
| 658 | ------------------------------------------------------------------------------ | 829 | ------------------------------------------------------------------------------ |
| 659 | 830 | ||
| 660 | local function parse_gpr(expr) | 831 | local function parse_gpr(expr) |
| @@ -808,9 +979,11 @@ map_op[".template__"] = function(params, template, nparams) | |||
| 808 | op = op + parse_disp(params[n]); n = n + 1 | 979 | op = op + parse_disp(params[n]); n = n + 1 |
| 809 | elseif p == "X" then | 980 | elseif p == "X" then |
| 810 | op = op + parse_index(params[n]); n = n + 1 | 981 | op = op + parse_index(params[n]); n = n + 1 |
| 811 | elseif p == "B" or p == "J" then | 982 | elseif p == "B" or p == "J" or p == "K" or p == "L" then |
| 812 | local mode, m, s = parse_label(params[n], false) | 983 | local mode, m, s = parse_label(params[n], false) |
| 813 | if p == "B" then m = m + 2048 end | 984 | if p == "J" then m = m + 0xa800 |
| 985 | elseif p == "K" then m = m + 0x5000 | ||
| 986 | elseif p == "L" then m = m + 0xa000 end | ||
| 814 | waction("REL_"..mode, m, s, 1) | 987 | waction("REL_"..mode, m, s, 1) |
| 815 | n = n + 1 | 988 | n = n + 1 |
| 816 | elseif p == "A" then | 989 | elseif p == "A" then |
| @@ -833,7 +1006,7 @@ map_op[".template__"] = function(params, template, nparams) | |||
| 833 | elseif p == "Z" then | 1006 | elseif p == "Z" then |
| 834 | op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1 | 1007 | op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1 |
| 835 | elseif p == "=" then | 1008 | elseif p == "=" then |
| 836 | op = op + shl(band(op, 0xf800), 5) -- Copy D to T for clz, clo. | 1009 | n = n - 1 -- Re-use previous parameter for next template char. |
| 837 | else | 1010 | else |
| 838 | assert(false) | 1011 | assert(false) |
| 839 | end | 1012 | end |
diff --git a/dynasm/dynasm.lua b/dynasm/dynasm.lua index 5ec21a79..46ebfca8 100644 --- a/dynasm/dynasm.lua +++ b/dynasm/dynasm.lua | |||
| @@ -630,6 +630,7 @@ end | |||
| 630 | -- Load architecture-specific module. | 630 | -- Load architecture-specific module. |
| 631 | local function loadarch(arch) | 631 | local function loadarch(arch) |
| 632 | if not match(arch, "^[%w_]+$") then return "bad arch name" end | 632 | if not match(arch, "^[%w_]+$") then return "bad arch name" end |
| 633 | _G._map_def = map_def | ||
| 633 | local ok, m_arch = pcall(require, "dasm_"..arch) | 634 | local ok, m_arch = pcall(require, "dasm_"..arch) |
| 634 | if not ok then return "cannot load module: "..m_arch end | 635 | if not ok then return "cannot load module: "..m_arch end |
| 635 | g_arch = m_arch | 636 | g_arch = m_arch |
