From ff2bf13121f5cad9a843dfebcace474d121f8c5b Mon Sep 17 00:00:00 2001 From: Brendan Punsky Date: Thu, 18 Jun 2026 04:05:32 -0400 Subject: [PATCH] rexcode/mips: R6 PC-relative loads LWPC/LWUPC/LDPC New REL19/REL18 operand types + BRANCH_19/BRANCH_18 encodings + REL_PC19/ REL_PC18 relocations (R6 PC-relative semantics: offset is relative to the instruction's own address, no delay-slot adjustment; LDPC aligns the PC down to 8 and scales by 8). LWPC (mips32r6), LWUPC/LDPC (mips64r6). Byte-exact vs llvm-mc and decode-clean; 281 tests green. --- core/rexcode/mips/decoder.odin | 12 + core/rexcode/mips/encoder.odin | 44 +- core/rexcode/mips/encoding_types.odin | 4 + core/rexcode/mips/mnemonic_builders.odin | 12 + core/rexcode/mips/reloc.odin | 2 + .../rexcode/mips/tablegen/encoding_table.odin | 3 + .../tablegen/generated/decode_tables.odin | 15 +- .../tablegen/generated/encode_tables.odin | 1654 +++++++++-------- core/rexcode/mips/tablegen/specgen.lua | 26 +- .../rexcode/mips/tables/mips.encode_forms.bin | Bin 20100 -> 20160 bytes core/rexcode/mips/tables/mips.encode_runs.bin | Bin 8224 -> 8224 bytes core/rexcode/mips/tables/mips.entries.bin | Bin 20100 -> 20160 bytes core/rexcode/mips/tables/mips.idx_primary.bin | Bin 256 -> 256 bytes .../mips/tools/gen_mnemonic_builders.odin | 10 +- 14 files changed, 935 insertions(+), 847 deletions(-) diff --git a/core/rexcode/mips/decoder.odin b/core/rexcode/mips/decoder.odin index 254256d04..48b8b4b9e 100644 --- a/core/rexcode/mips/decoder.odin +++ b/core/rexcode/mips/decoder.odin @@ -267,6 +267,18 @@ extract_operand_inline :: #force_inline proc "contextless" ( if rel26 & (1 << 25) != 0 { rel26 |= ~i32(0x3FFFFFF) } target := u32(i32(pc) + 4 + (rel26 << 2)) return Operand{relative = i64(target), kind = .RELATIVE, size = 4} + case .BRANCH_19: + // R6 PC-relative load: relative to this instruction (no +4), << 2. + rel19 := i32(word & 0x7FFFF) + if rel19 & (1 << 18) != 0 { rel19 |= ~i32(0x7FFFF) } + target := u32(i32(pc) + (rel19 << 2)) + return Operand{relative = i64(target), kind = .RELATIVE, size = 4} + case .BRANCH_18: + // LDPC: relative to this instruction aligned down to 8, << 3. + rel18 := i32(word & 0x3FFFF) + if rel18 & (1 << 17) != 0 { rel18 |= ~i32(0x3FFFF) } + target := u32((i32(pc) &~ i32(7)) + (rel18 << 3)) + return Operand{relative = i64(target), kind = .RELATIVE, size = 4} // Misc small immediates ------------------------------------------------- case .FCC_BC: diff --git a/core/rexcode/mips/encoder.odin b/core/rexcode/mips/encoder.odin index 7c98ff30f..ca38f3641 100644 --- a/core/rexcode/mips/encoder.odin +++ b/core/rexcode/mips/encoder.odin @@ -225,7 +225,7 @@ operand_matches_inline :: #force_inline proc "contextless" ( case .IMM5, .IMM16S, .IMM16U, .IMM20, .IMM26, .SEL, .FCC, .GTE_SF, .GTE_MX, .GTE_V, .GTE_CV, .GTE_LM: return op.kind == .IMMEDIATE - case .REL16, .REL21, .REL26, .REL_J26: + case .REL16, .REL21, .REL26, .REL_J26, .REL19, .REL18: return op.kind == .RELATIVE case .MEM: return op.kind == .MEMORY @@ -310,6 +310,18 @@ pack_operand_inline :: #force_inline proc( type = .REL26, size = 4, inst_idx = inst_idx, }) return 0 + case .BRANCH_19: + append(relocs, Relocation{ + offset = pc, label_id = u32(op.relative), + type = .REL_PC19, size = 4, inst_idx = inst_idx, + }) + return 0 + case .BRANCH_18: + append(relocs, Relocation{ + offset = pc, label_id = u32(op.relative), + type = .REL_PC18, size = 4, inst_idx = inst_idx, + }) + return 0 // FP condition-code field (BC1*, MOVF/MOVT, C.cond.fmt). case .FCC_BC: @@ -492,6 +504,36 @@ resolve_relocation_inline :: #force_inline proc( } word = (word &~ 0x3FFFFFF) | (u32(rel) & 0x3FFFFFF) + case .REL_PC19: + // R6 PC-relative load: offset is relative to the instruction's own + // address (no delay-slot adjustment), scaled by 4, 19-bit signed. + rel := i32(target) - i32(relocation.offset) + if rel & 3 != 0 { + append(errors, Error{inst_idx = u32(relocation.inst_idx), code = .LABEL_OUT_OF_RANGE}) + return true + } + rel >>= 2 + if rel < -(1<<18) || rel > (1<<18)-1 { + append(errors, Error{inst_idx = u32(relocation.inst_idx), code = .LABEL_OUT_OF_RANGE}) + return true + } + word = (word &~ 0x7FFFF) | (u32(rel) & 0x7FFFF) + + case .REL_PC18: + // LDPC: relative to the instruction's address aligned down to 8, scaled + // by 8, 18-bit signed. + rel := i32(target) - (i32(relocation.offset) &~ i32(7)) + if rel & 7 != 0 { + append(errors, Error{inst_idx = u32(relocation.inst_idx), code = .LABEL_OUT_OF_RANGE}) + return true + } + rel >>= 3 + if rel < -(1<<17) || rel > (1<<17)-1 { + append(errors, Error{inst_idx = u32(relocation.inst_idx), code = .LABEL_OUT_OF_RANGE}) + return true + } + word = (word &~ 0x3FFFF) | (u32(rel) & 0x3FFFF) + case .J26: // J/JAL: target = ((PC+4)[31:28] << 28) | (encoded_field << 2) if target & 3 != 0 { diff --git a/core/rexcode/mips/encoding_types.odin b/core/rexcode/mips/encoding_types.odin index ce2954acc..ad9515987 100644 --- a/core/rexcode/mips/encoding_types.odin +++ b/core/rexcode/mips/encoding_types.odin @@ -125,6 +125,8 @@ Operand_Type :: enum u8 { REL_J26, // 26-bit region jump (J / JAL) REL21, // R6 21-bit compact branch (BC1EQZ/NEZ) REL26, // R6 26-bit compact branch (BC/BALC) + REL19, // R6 PC-relative load (LWPC/LWUPC, 19-bit << 2) + REL18, // R6 PC-relative load (LDPC, 18-bit << 3) // Memory: base GPR + 16-bit signed displacement MEM, @@ -164,6 +166,8 @@ Operand_Encoding :: enum u8 { BRANCH_16, // bits 15-0 as PC-relative word offset (delay-slot adjusted) BRANCH_21, // R6 compact branch: bits 20-0 BRANCH_26, // R6 compact branch: bits 25-0 + BRANCH_19, // R6 PC-relative load: bits 18-0 (LWPC/LWUPC) + BRANCH_18, // R6 PC-relative load: bits 17-0 (LDPC) // FP condition code FCC_BC, // bits 20-18 (FP branches, MOVF/MOVT) diff --git a/core/rexcode/mips/mnemonic_builders.odin b/core/rexcode/mips/mnemonic_builders.odin index df72e74af..a65cd6cc7 100644 --- a/core/rexcode/mips/mnemonic_builders.odin +++ b/core/rexcode/mips/mnemonic_builders.odin @@ -412,6 +412,12 @@ inst_lsa_r_r_r_i5 :: #force_inline proc "contextless" (dst: GPR, src: G emit_lsa_r_r_r_i5 :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: GPR, src: GPR, src2: GPR, imm: i64) { append(instructions, inst_lsa_r_r_r_i5(dst, src, src2, imm)) } inst_dlsa_r_r_r_i5 :: #force_inline proc "contextless" (dst: GPR, src: GPR, src2: GPR, imm: i64) -> Instruction { return Instruction{mnemonic = .DLSA, operand_count = 4, length = 4, ops = {op_gpr(dst), op_gpr(src), op_gpr(src2), op_imm(imm, 1)}} } emit_dlsa_r_r_r_i5 :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: GPR, src: GPR, src2: GPR, imm: i64) { append(instructions, inst_dlsa_r_r_r_i5(dst, src, src2, imm)) } +inst_lwpc_r_rel :: #force_inline proc "contextless" (dst: GPR, target: u32) -> Instruction { return Instruction{mnemonic = .LWPC, operand_count = 2, length = 4, ops = {op_gpr(dst), op_label(target), {}, {}}} } +emit_lwpc_r_rel :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: GPR, target: u32) { append(instructions, inst_lwpc_r_rel(dst, target)) } +inst_lwupc_r_rel :: #force_inline proc "contextless" (dst: GPR, target: u32) -> Instruction { return Instruction{mnemonic = .LWUPC, operand_count = 2, length = 4, ops = {op_gpr(dst), op_label(target), {}, {}}} } +emit_lwupc_r_rel :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: GPR, target: u32) { append(instructions, inst_lwupc_r_rel(dst, target)) } +inst_ldpc_r_rel :: #force_inline proc "contextless" (dst: GPR, target: u32) -> Instruction { return Instruction{mnemonic = .LDPC, operand_count = 2, length = 4, ops = {op_gpr(dst), op_label(target), {}, {}}} } +emit_ldpc_r_rel :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: GPR, target: u32) { append(instructions, inst_ldpc_r_rel(dst, target)) } inst_seleqz_r_r_r :: #force_inline proc "contextless" (dst: GPR, src: GPR, src2: GPR) -> Instruction { return Instruction{mnemonic = .SELEQZ, operand_count = 3, length = 4, ops = {op_gpr(dst), op_gpr(src), op_gpr(src2), {}}} } emit_seleqz_r_r_r :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: GPR, src: GPR, src2: GPR) { append(instructions, inst_seleqz_r_r_r(dst, src, src2)) } inst_selnez_r_r_r :: #force_inline proc "contextless" (dst: GPR, src: GPR, src2: GPR) -> Instruction { return Instruction{mnemonic = .SELNEZ, operand_count = 3, length = 4, ops = {op_gpr(dst), op_gpr(src), op_gpr(src2), {}}} } @@ -2427,6 +2433,12 @@ inst_lsa :: inst_lsa_r_r_r_i5 emit_lsa :: emit_lsa_r_r_r_i5 inst_dlsa :: inst_dlsa_r_r_r_i5 emit_dlsa :: emit_dlsa_r_r_r_i5 +inst_lwpc :: inst_lwpc_r_rel +emit_lwpc :: emit_lwpc_r_rel +inst_lwupc :: inst_lwupc_r_rel +emit_lwupc :: emit_lwupc_r_rel +inst_ldpc :: inst_ldpc_r_rel +emit_ldpc :: emit_ldpc_r_rel inst_seleqz :: inst_seleqz_r_r_r emit_seleqz :: emit_seleqz_r_r_r inst_selnez :: inst_selnez_r_r_r diff --git a/core/rexcode/mips/reloc.odin b/core/rexcode/mips/reloc.odin index b408e779a..ac8a4eac3 100644 --- a/core/rexcode/mips/reloc.odin +++ b/core/rexcode/mips/reloc.odin @@ -17,6 +17,8 @@ Relocation_Type :: enum u8 { REL16, // 16-bit signed PC-rel branch offset (BEQ/BNE/BLEZ/BGTZ/...) REL21, // 21-bit signed PC-rel compact branch (R6 BEQZC/BNEZC) REL26, // 26-bit signed PC-rel compact branch (R6 BC/BALC) + REL_PC19, // 19-bit R6 PC-relative load offset ((target - PC) >> 2) (LWPC/LWUPC) + REL_PC18, // 18-bit R6 PC-relative load offset ((target - (PC & ~7)) >> 3) (LDPC) J26, // 26-bit J-type region target ((target_addr >> 2) & 0x3FFFFFF) HI16, // upper 16 of 32-bit absolute (LUI rt, %hi(sym)+0x8000 if LO16 paired) LO16, // lower 16 of 32-bit absolute (ADDIU rt, rt, %lo(sym)) diff --git a/core/rexcode/mips/tablegen/encoding_table.odin b/core/rexcode/mips/tablegen/encoding_table.odin index 226b7b910..94508f1c3 100644 --- a/core/rexcode/mips/tablegen/encoding_table.odin +++ b/core/rexcode/mips/tablegen/encoding_table.odin @@ -1680,5 +1680,8 @@ ENCODING_TABLE := #partial [Mnemonic][]Encoding{ .BNZ_W = { {.BNZ_W, {.MSA_VEC,.REL16,.NONE,.NONE}, {.WT,.BRANCH_16,.NONE,.NONE}, 0x47C00000, 0xFFE00000, .MSA, {}} }, .BNZ_D = { {.BNZ_D, {.MSA_VEC,.REL16,.NONE,.NONE}, {.WT,.BRANCH_16,.NONE,.NONE}, 0x47E00000, 0xFFE00000, .MSA, {}} }, .BNZ_V = { {.BNZ_V, {.MSA_VEC,.REL16,.NONE,.NONE}, {.WT,.BRANCH_16,.NONE,.NONE}, 0x45E00000, 0xFFE00000, .MSA, {}} }, + .LWPC = { {.LWPC, {.GPR,.REL19,.NONE,.NONE}, {.RS,.BRANCH_19,.NONE,.NONE}, 0xEC080000, 0xFC180000, .MIPS32_R6, {}} }, + .LWUPC = { {.LWUPC, {.GPR,.REL19,.NONE,.NONE}, {.RS,.BRANCH_19,.NONE,.NONE}, 0xEC100000, 0xFC180000, .MIPS64_R6, {}} }, + .LDPC = { {.LDPC, {.GPR,.REL18,.NONE,.NONE}, {.RS,.BRANCH_18,.NONE,.NONE}, 0xEC180000, 0xFC1C0000, .MIPS64_R6, {}} }, // SPECGEN:END } diff --git a/core/rexcode/mips/tablegen/generated/decode_tables.odin b/core/rexcode/mips/tablegen/generated/decode_tables.odin index 4f4fd8775..7f4c0a5c7 100644 --- a/core/rexcode/mips/tablegen/generated/decode_tables.odin +++ b/core/rexcode/mips/tablegen/generated/decode_tables.odin @@ -8,7 +8,7 @@ package rexcode_mips_generated import lib "../.." @(rodata) -DECODE_ENTRIES := [1005]lib.Decode_Entry{ +DECODE_ENTRIES := [1008]lib.Decode_Entry{ { .NOP, {.NONE,.NONE,.NONE,.NONE}, {.NONE,.NONE,.NONE,.NONE}, 0x00000000, 0xFFFFFFFF, .MIPS_I, {} }, { .SSNOP, {.NONE,.NONE,.NONE,.NONE}, {.NONE,.NONE,.NONE,.NONE}, 0x00000040, 0xFFFFFFFF, .MIPS32_R1, {} }, { .EHB, {.NONE,.NONE,.NONE,.NONE}, {.NONE,.NONE,.NONE,.NONE}, 0x000000C0, 0xFFFFFFFF, .MIPS32_R2, {} }, @@ -975,6 +975,9 @@ DECODE_ENTRIES := [1005]lib.Decode_Entry{ { .SV_S, {.VFPU_S,.MEM,.NONE,.NONE}, {.VFPU_VT_MEM,.VFPU_OFFSET_BASE,.NONE,.NONE}, 0xE8000000, 0xFC000000, .VFPU_PSP, {} }, { .AUIPC, {.GPR,.IMM16S,.NONE,.NONE}, {.RS,.IMM_16,.NONE,.NONE}, 0xEC1E0000, 0xFC1F0000, .MIPS32_R6, {} }, { .ALUIPC, {.GPR,.IMM16S,.NONE,.NONE}, {.RS,.IMM_16,.NONE,.NONE}, 0xEC1F0000, 0xFC1F0000, .MIPS32_R6, {} }, + { .LDPC, {.GPR,.REL18,.NONE,.NONE}, {.RS,.BRANCH_18,.NONE,.NONE}, 0xEC180000, 0xFC1C0000, .MIPS64_R6, {} }, + { .LWPC, {.GPR,.REL19,.NONE,.NONE}, {.RS,.BRANCH_19,.NONE,.NONE}, 0xEC080000, 0xFC180000, .MIPS32_R6, {} }, + { .LWUPC, {.GPR,.REL19,.NONE,.NONE}, {.RS,.BRANCH_19,.NONE,.NONE}, 0xEC100000, 0xFC180000, .MIPS64_R6, {} }, { .VMIDT_P, {.VFPU_M_P,.NONE,.NONE,.NONE}, {.VFPU_VD,.NONE,.NONE,.NONE}, 0xF3830080, 0xFFFFFF80, .VFPU_PSP, {} }, { .VMIDT_T, {.VFPU_M_T,.NONE,.NONE,.NONE}, {.VFPU_VD,.NONE,.NONE,.NONE}, 0xF3838000, 0xFFFFFF80, .VFPU_PSP, {} }, { .VMIDT_Q, {.VFPU_M_Q,.NONE,.NONE,.NONE}, {.VFPU_VD,.NONE,.NONE,.NONE}, 0xF3838080, 0xFFFFFF80, .VFPU_PSP, {} }, @@ -1077,11 +1080,11 @@ DECODE_INDEX_PRIMARY := [64]lib.Decode_Index{ 0x38 = { 959, 1}, 0x39 = { 960, 1}, 0x3A = { 961, 3}, - 0x3B = { 964, 2}, - 0x3C = { 966, 27}, - 0x3D = { 993, 3}, - 0x3E = { 996, 5}, - 0x3F = {1001, 4}, + 0x3B = { 964, 5}, + 0x3C = { 969, 27}, + 0x3D = { 996, 3}, + 0x3E = { 999, 5}, + 0x3F = {1004, 4}, } @(rodata) diff --git a/core/rexcode/mips/tablegen/generated/encode_tables.odin b/core/rexcode/mips/tablegen/generated/encode_tables.odin index ae8bf4633..ae27c1221 100644 --- a/core/rexcode/mips/tablegen/generated/encode_tables.odin +++ b/core/rexcode/mips/tablegen/generated/encode_tables.odin @@ -8,7 +8,7 @@ package rexcode_mips_generated import lib "../.." @(rodata) -ENCODE_FORMS := [1005]lib.Encoding{ +ENCODE_FORMS := [1008]lib.Encoding{ // .ADD { .ADD, {.GPR,.GPR,.GPR,.NONE}, {.RD,.RS,.RT,.NONE}, 0x00000020, 0xFC0007FF, .MIPS_I, {} }, // .ADDU @@ -393,6 +393,12 @@ ENCODE_FORMS := [1005]lib.Encoding{ { .LSA, {.GPR,.GPR,.GPR,.IMM5}, {.RD,.RS,.RT,.IMM_5}, 0x00000005, 0xFC00071F, .MIPS32_R6, {} }, // .DLSA { .DLSA, {.GPR,.GPR,.GPR,.IMM5}, {.RD,.RS,.RT,.IMM_5}, 0x00000015, 0xFC00071F, .MIPS64_R6, {only_64=true} }, + // .LWPC + { .LWPC, {.GPR,.REL19,.NONE,.NONE}, {.RS,.BRANCH_19,.NONE,.NONE}, 0xEC080000, 0xFC180000, .MIPS32_R6, {} }, + // .LWUPC + { .LWUPC, {.GPR,.REL19,.NONE,.NONE}, {.RS,.BRANCH_19,.NONE,.NONE}, 0xEC100000, 0xFC180000, .MIPS64_R6, {} }, + // .LDPC + { .LDPC, {.GPR,.REL18,.NONE,.NONE}, {.RS,.BRANCH_18,.NONE,.NONE}, 0xEC180000, 0xFC1C0000, .MIPS64_R6, {} }, // .SELEQZ { .SELEQZ, {.GPR,.GPR,.GPR,.NONE}, {.RD,.RS,.RT,.NONE}, 0x00000035, 0xFC0007FF, .MIPS32_R6, {} }, // .SELNEZ @@ -2228,827 +2234,827 @@ ENCODE_RUNS := [lib.Mnemonic]lib.Encode_Run{ .DBITSWAP = { 189, 1}, .LSA = { 190, 1}, .DLSA = { 191, 1}, - .LWPC = { 192, 0}, - .LWUPC = { 192, 0}, - .LDPC = { 192, 0}, - .SELEQZ = { 192, 1}, - .SELNEZ = { 193, 1}, - .CRC32B = { 194, 1}, - .CRC32H = { 195, 1}, - .CRC32W = { 196, 1}, - .CRC32D = { 197, 1}, - .CRC32CB = { 198, 1}, - .CRC32CH = { 199, 1}, - .CRC32CW = { 200, 1}, - .CRC32CD = { 201, 1}, - .SIGRIE = { 202, 1}, - .MFC1 = { 203, 1}, - .MTC1 = { 204, 1}, - .DMFC1 = { 205, 1}, - .DMTC1 = { 206, 1}, - .CFC1 = { 207, 1}, - .CTC1 = { 208, 1}, - .MFHC1 = { 209, 1}, - .MTHC1 = { 210, 1}, - .LWC1 = { 211, 1}, - .SWC1 = { 212, 1}, - .LDC1 = { 213, 1}, - .SDC1 = { 214, 1}, - .ADD_S = { 215, 1}, - .ADD_D = { 216, 1}, - .ADD_PS = { 217, 1}, - .SUB_S = { 218, 1}, - .SUB_D = { 219, 1}, - .SUB_PS = { 220, 1}, - .MUL_S = { 221, 1}, - .MUL_D = { 222, 1}, - .MUL_PS = { 223, 1}, - .DIV_S = { 224, 1}, - .DIV_D = { 225, 1}, - .SQRT_S = { 226, 1}, - .SQRT_D = { 227, 1}, - .ABS_S = { 228, 1}, - .ABS_D = { 229, 1}, - .ABS_PS = { 230, 1}, - .NEG_S = { 231, 1}, - .NEG_D = { 232, 1}, - .NEG_PS = { 233, 1}, - .MOV_S = { 234, 1}, - .MOV_D = { 235, 1}, - .MOV_PS = { 236, 1}, - .RECIP_S = { 237, 1}, - .RECIP_D = { 238, 1}, - .RSQRT_S = { 239, 1}, - .RSQRT_D = { 240, 1}, - .MADD_S = { 241, 1}, - .MADD_D = { 242, 1}, - .MADD_PS = { 243, 1}, - .MSUB_S = { 244, 1}, - .MSUB_D = { 245, 1}, - .MSUB_PS = { 246, 1}, - .NMADD_S = { 247, 1}, - .NMADD_D = { 248, 1}, - .NMADD_PS = { 249, 1}, - .NMSUB_S = { 250, 1}, - .NMSUB_D = { 251, 1}, - .NMSUB_PS = { 252, 1}, - .MOVN_S = { 253, 1}, - .MOVN_D = { 254, 1}, - .MOVN_PS = { 255, 1}, - .MOVZ_S = { 256, 1}, - .MOVZ_D = { 257, 1}, - .MOVZ_PS = { 258, 1}, - .MOVF_S = { 259, 1}, - .MOVF_D = { 260, 1}, - .MOVF_PS = { 261, 1}, - .MOVT_S = { 262, 1}, - .MOVT_D = { 263, 1}, - .MOVT_PS = { 264, 1}, - .CVT_S_D = { 265, 1}, - .CVT_S_W = { 266, 1}, - .CVT_S_L = { 267, 1}, - .CVT_D_S = { 268, 1}, - .CVT_D_W = { 269, 1}, - .CVT_D_L = { 270, 1}, - .CVT_W_S = { 271, 1}, - .CVT_W_D = { 272, 1}, - .CVT_L_S = { 273, 1}, - .CVT_L_D = { 274, 1}, - .CVT_PS_S = { 275, 1}, - .CVT_S_PU = { 276, 1}, - .CVT_S_PL = { 277, 1}, - .PLL_PS = { 278, 1}, - .PLU_PS = { 279, 1}, - .PUL_PS = { 280, 1}, - .PUU_PS = { 281, 1}, - .ROUND_W_S = { 282, 1}, - .ROUND_W_D = { 283, 1}, - .ROUND_L_S = { 284, 1}, - .ROUND_L_D = { 285, 1}, - .TRUNC_W_S = { 286, 1}, - .TRUNC_W_D = { 287, 1}, - .TRUNC_L_S = { 288, 1}, - .TRUNC_L_D = { 289, 1}, - .CEIL_W_S = { 290, 1}, - .CEIL_W_D = { 291, 1}, - .CEIL_L_S = { 292, 1}, - .CEIL_L_D = { 293, 1}, - .FLOOR_W_S = { 294, 1}, - .FLOOR_W_D = { 295, 1}, - .FLOOR_L_S = { 296, 1}, - .FLOOR_L_D = { 297, 1}, - .C_F_S = { 298, 1}, - .C_F_D = { 299, 1}, - .C_F_PS = { 300, 1}, - .C_UN_S = { 301, 1}, - .C_UN_D = { 302, 1}, - .C_UN_PS = { 303, 1}, - .C_EQ_S = { 304, 1}, - .C_EQ_D = { 305, 1}, - .C_EQ_PS = { 306, 1}, - .C_UEQ_S = { 307, 1}, - .C_UEQ_D = { 308, 1}, - .C_UEQ_PS = { 309, 1}, - .C_OLT_S = { 310, 1}, - .C_OLT_D = { 311, 1}, - .C_OLT_PS = { 312, 1}, - .C_ULT_S = { 313, 1}, - .C_ULT_D = { 314, 1}, - .C_ULT_PS = { 315, 1}, - .C_OLE_S = { 316, 1}, - .C_OLE_D = { 317, 1}, - .C_OLE_PS = { 318, 1}, - .C_ULE_S = { 319, 1}, - .C_ULE_D = { 320, 1}, - .C_ULE_PS = { 321, 1}, - .C_SF_S = { 322, 1}, - .C_SF_D = { 323, 1}, - .C_SF_PS = { 324, 1}, - .C_NGLE_S = { 325, 1}, - .C_NGLE_D = { 326, 1}, - .C_NGLE_PS = { 327, 1}, - .C_SEQ_S = { 328, 1}, - .C_SEQ_D = { 329, 1}, - .C_SEQ_PS = { 330, 1}, - .C_NGL_S = { 331, 1}, - .C_NGL_D = { 332, 1}, - .C_NGL_PS = { 333, 1}, - .C_LT_S = { 334, 1}, - .C_LT_D = { 335, 1}, - .C_LT_PS = { 336, 1}, - .C_NGE_S = { 337, 1}, - .C_NGE_D = { 338, 1}, - .C_NGE_PS = { 339, 1}, - .C_LE_S = { 340, 1}, - .C_LE_D = { 341, 1}, - .C_LE_PS = { 342, 1}, - .C_NGT_S = { 343, 1}, - .C_NGT_D = { 344, 1}, - .C_NGT_PS = { 345, 1}, - .BC1F = { 346, 1}, - .BC1T = { 347, 1}, - .BC1FL = { 348, 1}, - .BC1TL = { 349, 1}, - .MFC0 = { 350, 1}, - .MTC0 = { 351, 1}, - .DMFC0 = { 352, 1}, - .DMTC0 = { 353, 1}, - .MFHC0 = { 354, 1}, - .MTHC0 = { 355, 1}, - .TLBP = { 356, 1}, - .TLBR = { 357, 1}, - .TLBWI = { 358, 1}, - .TLBWR = { 359, 1}, - .CACHE = { 360, 1}, - .MFC2 = { 361, 1}, - .MTC2 = { 362, 1}, - .CFC2 = { 363, 1}, - .CTC2 = { 364, 1}, - .LWC2 = { 365, 1}, - .SWC2 = { 366, 1}, - .LDC2 = { 367, 1}, - .SDC2 = { 368, 1}, - .RTPS = { 369, 1}, - .RTPT = { 370, 1}, - .DPCS = { 371, 1}, - .DPCT = { 372, 1}, - .INTPL = { 373, 1}, - .MVMVA = { 374, 1}, - .NCDS = { 375, 1}, - .NCDT = { 376, 1}, - .NCCS = { 377, 1}, - .NCCT = { 378, 1}, - .NCS = { 379, 1}, - .NCT = { 380, 1}, - .CDP = { 381, 1}, - .CC = { 382, 1}, - .NCLIP = { 383, 1}, - .AVSZ3 = { 384, 1}, - .AVSZ4 = { 385, 1}, - .OP_GTE = { 386, 1}, - .GPF = { 387, 1}, - .GPL = { 388, 1}, - .SQR_GTE = { 389, 1}, - .DCPL = { 390, 1}, - .LQ = { 391, 1}, - .SQ = { 392, 1}, - .LQC2 = { 393, 1}, - .SQC2 = { 394, 1}, - .MFHI1 = { 395, 1}, - .MFLO1 = { 396, 1}, - .MTHI1 = { 397, 1}, - .MTLO1 = { 398, 1}, - .MULT1 = { 399, 1}, - .MULTU1 = { 400, 1}, - .DIV1 = { 401, 1}, - .DIVU1 = { 402, 1}, - .MADD_EE = { 403, 0}, - .MADDU_EE = { 403, 0}, - .MSUB_EE = { 403, 0}, - .MSUBU_EE = { 403, 0}, - .MADD1 = { 403, 1}, - .MADDU1 = { 404, 1}, - .MSUB1 = { 405, 0}, - .MSUBU1 = { 405, 0}, - .PMFHL_LW = { 405, 1}, - .PMFHL_UW = { 406, 1}, - .PMFHL_LH = { 407, 1}, - .PMFHL_SH = { 408, 1}, - .PMFHL_SLW = { 409, 1}, - .PMTHL_LW = { 410, 1}, - .PADDB = { 411, 1}, - .PADDH = { 412, 1}, - .PADDW = { 413, 1}, - .PADDSB = { 414, 1}, - .PADDSH = { 415, 1}, - .PADDSW = { 416, 1}, - .PADDUB = { 417, 1}, - .PADDUH = { 418, 1}, - .PADDUW = { 419, 1}, - .PSUBB = { 420, 1}, - .PSUBH = { 421, 1}, - .PSUBW = { 422, 1}, - .PSUBSB = { 423, 1}, - .PSUBSH = { 424, 1}, - .PSUBSW = { 425, 1}, - .PSUBUB = { 426, 1}, - .PSUBUH = { 427, 1}, - .PSUBUW = { 428, 1}, - .PSLLH = { 429, 1}, - .PSRLH = { 430, 1}, - .PSRAH = { 431, 1}, - .PSLLW = { 432, 1}, - .PSRLW = { 433, 1}, - .PSRAW = { 434, 1}, - .PSLLVW = { 435, 1}, - .PSRLVW = { 436, 1}, - .PSRAVW = { 437, 1}, - .QFSRV = { 438, 1}, - .PAND = { 439, 1}, - .POR = { 440, 1}, - .PXOR = { 441, 1}, - .PNOR = { 442, 1}, - .PCEQB = { 443, 1}, - .PCEQH = { 444, 1}, - .PCEQW = { 445, 1}, - .PCGTB = { 446, 1}, - .PCGTH = { 447, 1}, - .PCGTW = { 448, 1}, - .PMULTW = { 449, 1}, - .PMULTUW = { 450, 1}, - .PMULTH = { 451, 1}, - .PMADDW = { 452, 1}, - .PMADDUW = { 453, 1}, - .PMADDH = { 454, 1}, - .PMSUBW = { 455, 1}, - .PMSUBH = { 456, 1}, - .PHMADH = { 457, 1}, - .PHMSBH = { 458, 1}, - .PDIVW = { 459, 1}, - .PDIVUW = { 460, 1}, - .PDIVBW = { 461, 1}, - .PCPYLD = { 462, 1}, - .PCPYUD = { 463, 1}, - .PCPYH = { 464, 1}, - .PINTH = { 465, 1}, - .PINTOH = { 466, 1}, - .PEXEH = { 467, 1}, - .PEXEW = { 468, 1}, - .PEXCH = { 469, 1}, - .PEXCW = { 470, 1}, - .PROT3W = { 471, 1}, - .PPACB = { 472, 1}, - .PPACH = { 473, 1}, - .PPACW = { 474, 1}, - .PPAC5 = { 475, 1}, - .PEXT5 = { 476, 1}, - .PEXTLB = { 477, 1}, - .PEXTLH = { 478, 1}, - .PEXTLW = { 479, 1}, - .PEXTUB = { 480, 1}, - .PEXTUH = { 481, 1}, - .PEXTUW = { 482, 1}, - .PMFHI = { 483, 1}, - .PMFLO = { 484, 1}, - .PMTHI = { 485, 1}, - .PMTLO = { 486, 1}, - .PLZCW = { 487, 1}, - .PABSH = { 488, 1}, - .PABSW = { 489, 1}, - .PMAXH = { 490, 1}, - .PMAXW = { 491, 1}, - .PMINH = { 492, 1}, - .PMINW = { 493, 1}, - .MFSA = { 494, 1}, - .MTSA = { 495, 1}, - .MTSAB = { 496, 1}, - .MTSAH = { 497, 1}, - .ADDQ_PH = { 498, 1}, - .ADDQ_S_PH = { 499, 1}, - .ADDQ_S_W = { 500, 1}, - .SUBQ_PH = { 501, 1}, - .SUBQ_S_PH = { 502, 1}, - .SUBQ_S_W = { 503, 1}, - .ADDU_QB = { 504, 1}, - .ADDU_S_QB = { 505, 1}, - .ADDU_PH = { 506, 1}, - .ADDU_S_PH = { 507, 1}, - .SUBU_QB = { 508, 1}, - .SUBU_S_QB = { 509, 1}, - .SUBU_PH = { 510, 1}, - .SUBU_S_PH = { 511, 1}, - .ADDSC = { 512, 1}, - .ADDWC = { 513, 1}, - .MULEU_S_PH_QBL = { 514, 1}, - .MULEU_S_PH_QBR = { 515, 1}, - .MULEQ_S_W_PHL = { 516, 1}, - .MULEQ_S_W_PHR = { 517, 1}, - .MULQ_RS_PH = { 518, 1}, - .MULQ_S_PH = { 519, 1}, - .MULSAQ_S_W_PH = { 520, 1}, - .DPAQ_S_W_PH = { 521, 1}, - .DPSQ_S_W_PH = { 522, 1}, - .DPAQ_SA_L_W = { 523, 1}, - .DPSQ_SA_L_W = { 524, 1}, - .DPAU_H_QBL = { 525, 1}, - .DPAU_H_QBR = { 526, 1}, - .DPSU_H_QBL = { 527, 1}, - .DPSU_H_QBR = { 528, 1}, - .DPA_W_PH = { 529, 1}, - .DPS_W_PH = { 530, 1}, - .DPAX_W_PH = { 531, 1}, - .DPSX_W_PH = { 532, 1}, - .MAQ_S_W_PHL = { 533, 1}, - .MAQ_S_W_PHR = { 534, 1}, - .MAQ_SA_W_PHL = { 535, 1}, - .MAQ_SA_W_PHR = { 536, 1}, - .EXTR_W = { 537, 1}, - .EXTR_R_W = { 538, 1}, - .EXTR_RS_W = { 539, 1}, - .EXTR_S_H = { 540, 1}, - .EXTRV_W = { 541, 1}, - .EXTRV_R_W = { 542, 1}, - .EXTRV_RS_W = { 543, 1}, - .EXTRV_S_H = { 544, 1}, - .EXTP = { 545, 1}, - .EXTPV = { 546, 1}, - .EXTPDP = { 547, 1}, - .EXTPDPV = { 548, 1}, - .SHILO = { 549, 1}, - .SHILOV = { 550, 1}, - .MTHLIP = { 551, 1}, - .WRDSP = { 552, 1}, - .RDDSP = { 553, 1}, - .PRECRQ_QB_PH = { 554, 1}, - .PRECRQ_PH_W = { 555, 1}, - .PRECRQU_S_QB_PH = { 556, 1}, - .PRECEQ_W_PHL = { 557, 1}, - .PRECEQ_W_PHR = { 558, 1}, - .PRECEQU_PH_QBL = { 559, 1}, - .PRECEQU_PH_QBR = { 560, 1}, - .PRECEQU_PH_QBLA = { 561, 1}, - .PRECEQU_PH_QBRA = { 562, 1}, - .PRECEU_PH_QBL = { 563, 1}, - .PRECEU_PH_QBR = { 564, 1}, - .PRECEU_PH_QBLA = { 565, 1}, - .PRECEU_PH_QBRA = { 566, 1}, - .PRECRQ_RS_PH_W = { 567, 1}, - .CMPU_EQ_QB = { 568, 1}, - .CMPU_LT_QB = { 569, 1}, - .CMPU_LE_QB = { 570, 1}, - .CMP_EQ_PH = { 571, 1}, - .CMP_LT_PH = { 572, 1}, - .CMP_LE_PH = { 573, 1}, - .CMPGU_EQ_QB = { 574, 1}, - .CMPGU_LT_QB = { 575, 1}, - .CMPGU_LE_QB = { 576, 1}, - .PICK_QB = { 577, 1}, - .PICK_PH = { 578, 1}, - .SHLL_QB = { 579, 1}, - .SHLL_PH = { 580, 1}, - .SHLL_S_PH = { 581, 1}, - .SHLL_S_W = { 582, 1}, - .SHLLV_QB = { 583, 1}, - .SHLLV_PH = { 584, 1}, - .SHLLV_S_PH = { 585, 1}, - .SHLLV_S_W = { 586, 1}, - .SHRL_QB = { 587, 1}, - .SHRL_PH = { 588, 1}, - .SHRLV_QB = { 589, 1}, - .SHRLV_PH = { 590, 1}, - .SHRA_QB = { 591, 1}, - .SHRA_R_QB = { 592, 1}, - .SHRA_PH = { 593, 1}, - .SHRA_R_PH = { 594, 1}, - .SHRA_R_W = { 595, 1}, - .SHRAV_QB = { 596, 1}, - .SHRAV_R_QB = { 597, 1}, - .SHRAV_PH = { 598, 1}, - .SHRAV_R_PH = { 599, 1}, - .SHRAV_R_W = { 600, 1}, - .LBUX = { 601, 1}, - .LHX = { 602, 1}, - .LWX = { 603, 1}, - .BPOSGE32 = { 604, 1}, - .BPOSGE64 = { 605, 0}, - .INSV = { 605, 1}, - .BITREV = { 606, 1}, - .ABSQ_S_PH = { 607, 1}, - .ABSQ_S_W = { 608, 1}, - .REPL_PH = { 609, 1}, - .REPLV_PH = { 610, 1}, - .REPL_QB = { 611, 1}, - .REPLV_QB = { 612, 1}, - .ADDV_B = { 613, 1}, - .ADDV_H = { 614, 1}, - .ADDV_W = { 615, 1}, - .ADDV_D = { 616, 1}, - .SUBV_B = { 617, 1}, - .SUBV_H = { 618, 1}, - .SUBV_W = { 619, 1}, - .SUBV_D = { 620, 1}, - .ADDS_S_B = { 621, 1}, - .ADDS_S_H = { 622, 1}, - .ADDS_S_W = { 623, 1}, - .ADDS_S_D = { 624, 1}, - .ADDS_U_B = { 625, 1}, - .ADDS_U_H = { 626, 1}, - .ADDS_U_W = { 627, 1}, - .ADDS_U_D = { 628, 1}, - .SUBS_S_B = { 629, 1}, - .SUBS_S_H = { 630, 1}, - .SUBS_S_W = { 631, 1}, - .SUBS_S_D = { 632, 1}, - .SUBS_U_B = { 633, 1}, - .SUBS_U_H = { 634, 1}, - .SUBS_U_W = { 635, 1}, - .SUBS_U_D = { 636, 1}, - .MULV_B = { 637, 1}, - .MULV_H = { 638, 1}, - .MULV_W = { 639, 1}, - .MULV_D = { 640, 1}, - .DIV_S_B = { 641, 1}, - .DIV_S_H = { 642, 1}, - .DIV_S_W = { 643, 1}, - .DIV_S_D = { 644, 1}, - .DIV_U_B = { 645, 1}, - .DIV_U_H = { 646, 1}, - .DIV_U_W = { 647, 1}, - .DIV_U_D = { 648, 1}, - .MOD_S_B = { 649, 1}, - .MOD_S_H = { 650, 1}, - .MOD_S_W = { 651, 1}, - .MOD_S_D = { 652, 1}, - .MOD_U_B = { 653, 1}, - .MOD_U_H = { 654, 1}, - .MOD_U_W = { 655, 1}, - .MOD_U_D = { 656, 1}, - .MADDV_B = { 657, 1}, - .MADDV_H = { 658, 1}, - .MADDV_W = { 659, 1}, - .MADDV_D = { 660, 1}, - .MSUBV_B = { 661, 1}, - .MSUBV_H = { 662, 1}, - .MSUBV_W = { 663, 1}, - .MSUBV_D = { 664, 1}, - .DOTP_S_H = { 665, 1}, - .DOTP_S_W = { 666, 1}, - .DOTP_S_D = { 667, 1}, - .DOTP_U_H = { 668, 1}, - .DOTP_U_W = { 669, 1}, - .DOTP_U_D = { 670, 1}, - .AND_V = { 671, 1}, - .OR_V = { 672, 1}, - .NOR_V = { 673, 1}, - .XOR_V = { 674, 1}, - .ANDI_B = { 675, 1}, - .ORI_B = { 676, 1}, - .NORI_B = { 677, 1}, - .XORI_B = { 678, 1}, - .BSEL_V = { 679, 1}, - .BSELI_B = { 680, 1}, - .BMNZ_V = { 681, 1}, - .BMNZI_B = { 682, 1}, - .BMZ_V = { 683, 1}, - .BMZI_B = { 684, 1}, - .CEQ_B = { 685, 1}, - .CEQ_H = { 686, 1}, - .CEQ_W = { 687, 1}, - .CEQ_D = { 688, 1}, - .CLT_S_B = { 689, 1}, - .CLT_S_H = { 690, 1}, - .CLT_S_W = { 691, 1}, - .CLT_S_D = { 692, 1}, - .CLT_U_B = { 693, 1}, - .CLT_U_H = { 694, 1}, - .CLT_U_W = { 695, 1}, - .CLT_U_D = { 696, 1}, - .CLE_S_B = { 697, 1}, - .CLE_S_H = { 698, 1}, - .CLE_S_W = { 699, 1}, - .CLE_S_D = { 700, 1}, - .CLE_U_B = { 701, 1}, - .CLE_U_H = { 702, 1}, - .CLE_U_W = { 703, 1}, - .CLE_U_D = { 704, 1}, - .MIN_S_B = { 705, 1}, - .MIN_S_H = { 706, 1}, - .MIN_S_W = { 707, 1}, - .MIN_S_D = { 708, 1}, - .MIN_U_B = { 709, 1}, - .MIN_U_H = { 710, 1}, - .MIN_U_W = { 711, 1}, - .MIN_U_D = { 712, 1}, - .MAX_S_B = { 713, 1}, - .MAX_S_H = { 714, 1}, - .MAX_S_W = { 715, 1}, - .MAX_S_D = { 716, 1}, - .MAX_U_B = { 717, 1}, - .MAX_U_H = { 718, 1}, - .MAX_U_W = { 719, 1}, - .MAX_U_D = { 720, 1}, - .SLL_B = { 721, 1}, - .SLL_H = { 722, 1}, - .SLL_W = { 723, 1}, - .SLL_D = { 724, 1}, - .SRL_B = { 725, 1}, - .SRL_H = { 726, 1}, - .SRL_W = { 727, 1}, - .SRL_D = { 728, 1}, - .SRA_B = { 729, 1}, - .SRA_H = { 730, 1}, - .SRA_W = { 731, 1}, - .SRA_D = { 732, 1}, - .SLLI_B = { 733, 1}, - .SLLI_H = { 734, 1}, - .SLLI_W = { 735, 1}, - .SLLI_D = { 736, 1}, - .SRLI_B = { 737, 1}, - .SRLI_H = { 738, 1}, - .SRLI_W = { 739, 1}, - .SRLI_D = { 740, 1}, - .SRAI_B = { 741, 1}, - .SRAI_H = { 742, 1}, - .SRAI_W = { 743, 1}, - .SRAI_D = { 744, 1}, - .FADD_W = { 745, 1}, - .FADD_D = { 746, 1}, - .FSUB_W = { 747, 1}, - .FSUB_D = { 748, 1}, - .FMUL_W = { 749, 1}, - .FMUL_D = { 750, 1}, - .FDIV_W = { 751, 1}, - .FDIV_D = { 752, 1}, - .FSQRT_W = { 753, 1}, - .FSQRT_D = { 754, 1}, - .FRSQRT_W = { 755, 1}, - .FRSQRT_D = { 756, 1}, - .FRCP_W = { 757, 1}, - .FRCP_D = { 758, 1}, - .FRINT_W = { 759, 1}, - .FRINT_D = { 760, 1}, - .FMAX_W = { 761, 1}, - .FMAX_D = { 762, 1}, - .FMIN_W = { 763, 1}, - .FMIN_D = { 764, 1}, - .FCEQ_W = { 765, 1}, - .FCEQ_D = { 766, 1}, - .FCNE_W = { 767, 1}, - .FCNE_D = { 768, 1}, - .FCLT_W = { 769, 1}, - .FCLT_D = { 770, 1}, - .FCLE_W = { 771, 1}, - .FCLE_D = { 772, 1}, - .FFINT_S_W = { 773, 1}, - .FFINT_S_D = { 774, 1}, - .FFINT_U_W = { 775, 1}, - .FFINT_U_D = { 776, 1}, - .FTRUNC_S_W = { 777, 1}, - .FTRUNC_S_D = { 778, 1}, - .FTRUNC_U_W = { 779, 1}, - .FTRUNC_U_D = { 780, 1}, - .FCVT_S_W = { 781, 1}, - .FCVT_S_D = { 782, 1}, - .FCVT_D_W = { 783, 1}, - .LD_B = { 784, 1}, - .LD_H = { 785, 1}, - .LD_W = { 786, 1}, - .LD_D = { 787, 1}, - .ST_B = { 788, 1}, - .ST_H = { 789, 1}, - .ST_W = { 790, 1}, - .ST_D = { 791, 1}, - .LDI_B = { 792, 1}, - .LDI_H = { 793, 1}, - .LDI_W = { 794, 1}, - .LDI_D = { 795, 1}, - .COPY_S_B = { 796, 1}, - .COPY_S_H = { 797, 1}, - .COPY_S_W = { 798, 1}, - .COPY_U_B = { 799, 1}, - .COPY_U_H = { 800, 1}, - .COPY_U_W = { 801, 1}, - .INSERT_B = { 802, 1}, - .INSERT_H = { 803, 1}, - .INSERT_W = { 804, 1}, - .INSERT_D = { 805, 1}, - .INSVE_B = { 806, 1}, - .INSVE_H = { 807, 1}, - .INSVE_W = { 808, 1}, - .INSVE_D = { 809, 1}, - .SHF_B = { 810, 1}, - .SHF_H = { 811, 1}, - .SHF_W = { 812, 1}, - .VSHF_B = { 813, 1}, - .VSHF_H = { 814, 1}, - .VSHF_W = { 815, 1}, - .VSHF_D = { 816, 1}, - .SLD_B = { 817, 1}, - .SLD_H = { 818, 1}, - .SLD_W = { 819, 1}, - .SLD_D = { 820, 1}, - .SLDI_B = { 821, 1}, - .SLDI_H = { 822, 1}, - .SLDI_W = { 823, 1}, - .SLDI_D = { 824, 1}, - .SPLAT_B = { 825, 1}, - .SPLAT_H = { 826, 1}, - .SPLAT_W = { 827, 1}, - .SPLAT_D = { 828, 1}, - .SPLATI_B = { 829, 1}, - .SPLATI_H = { 830, 1}, - .SPLATI_W = { 831, 1}, - .SPLATI_D = { 832, 1}, - .BZ_V = { 833, 1}, - .BNZ_V = { 834, 1}, - .BZ_B = { 835, 1}, - .BZ_H = { 836, 1}, - .BZ_W = { 837, 1}, - .BZ_D = { 838, 1}, - .BNZ_B = { 839, 1}, - .BNZ_H = { 840, 1}, - .BNZ_W = { 841, 1}, - .BNZ_D = { 842, 1}, - .NLOC_B = { 843, 1}, - .NLOC_H = { 844, 1}, - .NLOC_W = { 845, 1}, - .NLOC_D = { 846, 1}, - .NLZC_B = { 847, 1}, - .NLZC_H = { 848, 1}, - .NLZC_W = { 849, 1}, - .NLZC_D = { 850, 1}, - .PCNT_B = { 851, 1}, - .PCNT_H = { 852, 1}, - .PCNT_W = { 853, 1}, - .PCNT_D = { 854, 1}, - .VMOV_S = { 855, 1}, - .VMOV_P = { 856, 1}, - .VMOV_T = { 857, 1}, - .VMOV_Q = { 858, 1}, - .LV_S = { 859, 1}, - .LV_Q = { 860, 1}, - .SV_S = { 861, 1}, - .SV_Q = { 862, 1}, - .LVL_Q = { 863, 1}, - .LVR_Q = { 864, 1}, - .SVL_Q = { 865, 1}, - .SVR_Q = { 866, 1}, - .VIIM_S = { 867, 1}, - .VFIM_S = { 868, 1}, - .VADD_S = { 869, 1}, - .VADD_P = { 870, 1}, - .VADD_T = { 871, 1}, - .VADD_Q = { 872, 1}, - .VSUB_S = { 873, 1}, - .VSUB_P = { 874, 1}, - .VSUB_T = { 875, 1}, - .VSUB_Q = { 876, 1}, - .VMUL_S = { 877, 1}, - .VMUL_P = { 878, 1}, - .VMUL_T = { 879, 1}, - .VMUL_Q = { 880, 1}, - .VDIV_S = { 881, 1}, - .VDIV_P = { 882, 1}, - .VDIV_T = { 883, 1}, - .VDIV_Q = { 884, 1}, - .VABS_S = { 885, 1}, - .VABS_P = { 886, 1}, - .VABS_T = { 887, 1}, - .VABS_Q = { 888, 1}, - .VNEG_S = { 889, 1}, - .VNEG_P = { 890, 1}, - .VNEG_T = { 891, 1}, - .VNEG_Q = { 892, 1}, - .VSQRT_S = { 893, 1}, - .VRCP_S = { 894, 1}, - .VRCP_P = { 895, 1}, - .VRCP_T = { 896, 1}, - .VRCP_Q = { 897, 1}, - .VRSQ_S = { 898, 1}, - .VRSQ_P = { 899, 1}, - .VRSQ_T = { 900, 1}, - .VRSQ_Q = { 901, 1}, - .VDOT_P = { 902, 1}, - .VDOT_T = { 903, 1}, - .VDOT_Q = { 904, 1}, - .VSCL_P = { 905, 1}, - .VSCL_T = { 906, 1}, - .VSCL_Q = { 907, 1}, - .VHDP_P = { 908, 1}, - .VHDP_T = { 909, 1}, - .VHDP_Q = { 910, 1}, - .VAVG_P = { 911, 1}, - .VAVG_T = { 912, 1}, - .VAVG_Q = { 913, 1}, - .VFAD_P = { 914, 1}, - .VFAD_T = { 915, 1}, - .VFAD_Q = { 916, 1}, - .VMMUL_P = { 917, 1}, - .VMMUL_T = { 918, 1}, - .VMMUL_Q = { 919, 1}, - .VTFM2_P = { 920, 1}, - .VTFM3_T = { 921, 1}, - .VTFM4_Q = { 922, 1}, - .VHTFM2_P = { 923, 1}, - .VHTFM3_T = { 924, 1}, - .VHTFM4_Q = { 925, 1}, - .VMSCL_P = { 926, 1}, - .VMSCL_T = { 927, 1}, - .VMSCL_Q = { 928, 1}, - .VMMOV_P = { 929, 1}, - .VMMOV_T = { 930, 1}, - .VMMOV_Q = { 931, 1}, - .VMIDT_P = { 932, 1}, - .VMIDT_T = { 933, 1}, - .VMIDT_Q = { 934, 1}, - .VMZERO_P = { 935, 1}, - .VMZERO_T = { 936, 1}, - .VMZERO_Q = { 937, 1}, - .VMONE_P = { 938, 1}, - .VMONE_T = { 939, 1}, - .VMONE_Q = { 940, 1}, - .VCRS_T = { 941, 1}, - .VCRSP_T = { 942, 1}, - .VQMUL_Q = { 943, 1}, - .VCMP_S = { 944, 1}, - .VCMP_P = { 945, 1}, - .VCMP_T = { 946, 1}, - .VCMP_Q = { 947, 1}, - .VMIN_S = { 948, 1}, - .VMIN_P = { 949, 1}, - .VMIN_T = { 950, 1}, - .VMIN_Q = { 951, 1}, - .VMAX_S = { 952, 1}, - .VMAX_P = { 953, 1}, - .VMAX_T = { 954, 1}, - .VMAX_Q = { 955, 1}, - .VSIN_S = { 956, 1}, - .VCOS_S = { 957, 1}, - .VEXP2_S = { 958, 1}, - .VLOG2_S = { 959, 1}, - .VASIN_S = { 960, 1}, - .VNRCP_S = { 961, 1}, - .VNSIN_S = { 962, 1}, - .VREXP2_S = { 963, 1}, - .VSGN_S = { 964, 1}, - .VI2F_S = { 965, 1}, - .VI2F_P = { 966, 1}, - .VI2F_T = { 967, 1}, - .VI2F_Q = { 968, 1}, - .VF2IN_S = { 969, 1}, - .VF2IN_P = { 970, 1}, - .VF2IN_T = { 971, 1}, - .VF2IN_Q = { 972, 1}, - .VF2IZ_S = { 973, 1}, - .VF2IZ_P = { 974, 1}, - .VF2IZ_T = { 975, 1}, - .VF2IZ_Q = { 976, 1}, - .VF2IU_S = { 977, 1}, - .VF2IU_P = { 978, 1}, - .VF2IU_T = { 979, 1}, - .VF2IU_Q = { 980, 1}, - .VF2ID_S = { 981, 1}, - .VF2ID_P = { 982, 1}, - .VF2ID_T = { 983, 1}, - .VF2ID_Q = { 984, 1}, - .VF2H_P = { 985, 1}, - .VH2F_S = { 986, 1}, - .VFLUSH = { 987, 1}, - .VSYNC = { 988, 1}, - .VNOP = { 989, 1}, - .VPFXS = { 990, 1}, - .VPFXT = { 991, 1}, - .VPFXD = { 992, 1}, - .VCST_S = { 993, 1}, - .VCST_P = { 994, 1}, - .VCST_T = { 995, 1}, - .VCST_Q = { 996, 1}, - .MFV = { 997, 1}, - .MTV = { 998, 1}, - .MFVC = { 999, 1}, - .MTVC = { 1000, 1}, - .BVF = { 1001, 1}, - .BVT = { 1002, 1}, - .BVFL = { 1003, 1}, - .BVTL = { 1004, 1}, + .LWPC = { 192, 1}, + .LWUPC = { 193, 1}, + .LDPC = { 194, 1}, + .SELEQZ = { 195, 1}, + .SELNEZ = { 196, 1}, + .CRC32B = { 197, 1}, + .CRC32H = { 198, 1}, + .CRC32W = { 199, 1}, + .CRC32D = { 200, 1}, + .CRC32CB = { 201, 1}, + .CRC32CH = { 202, 1}, + .CRC32CW = { 203, 1}, + .CRC32CD = { 204, 1}, + .SIGRIE = { 205, 1}, + .MFC1 = { 206, 1}, + .MTC1 = { 207, 1}, + .DMFC1 = { 208, 1}, + .DMTC1 = { 209, 1}, + .CFC1 = { 210, 1}, + .CTC1 = { 211, 1}, + .MFHC1 = { 212, 1}, + .MTHC1 = { 213, 1}, + .LWC1 = { 214, 1}, + .SWC1 = { 215, 1}, + .LDC1 = { 216, 1}, + .SDC1 = { 217, 1}, + .ADD_S = { 218, 1}, + .ADD_D = { 219, 1}, + .ADD_PS = { 220, 1}, + .SUB_S = { 221, 1}, + .SUB_D = { 222, 1}, + .SUB_PS = { 223, 1}, + .MUL_S = { 224, 1}, + .MUL_D = { 225, 1}, + .MUL_PS = { 226, 1}, + .DIV_S = { 227, 1}, + .DIV_D = { 228, 1}, + .SQRT_S = { 229, 1}, + .SQRT_D = { 230, 1}, + .ABS_S = { 231, 1}, + .ABS_D = { 232, 1}, + .ABS_PS = { 233, 1}, + .NEG_S = { 234, 1}, + .NEG_D = { 235, 1}, + .NEG_PS = { 236, 1}, + .MOV_S = { 237, 1}, + .MOV_D = { 238, 1}, + .MOV_PS = { 239, 1}, + .RECIP_S = { 240, 1}, + .RECIP_D = { 241, 1}, + .RSQRT_S = { 242, 1}, + .RSQRT_D = { 243, 1}, + .MADD_S = { 244, 1}, + .MADD_D = { 245, 1}, + .MADD_PS = { 246, 1}, + .MSUB_S = { 247, 1}, + .MSUB_D = { 248, 1}, + .MSUB_PS = { 249, 1}, + .NMADD_S = { 250, 1}, + .NMADD_D = { 251, 1}, + .NMADD_PS = { 252, 1}, + .NMSUB_S = { 253, 1}, + .NMSUB_D = { 254, 1}, + .NMSUB_PS = { 255, 1}, + .MOVN_S = { 256, 1}, + .MOVN_D = { 257, 1}, + .MOVN_PS = { 258, 1}, + .MOVZ_S = { 259, 1}, + .MOVZ_D = { 260, 1}, + .MOVZ_PS = { 261, 1}, + .MOVF_S = { 262, 1}, + .MOVF_D = { 263, 1}, + .MOVF_PS = { 264, 1}, + .MOVT_S = { 265, 1}, + .MOVT_D = { 266, 1}, + .MOVT_PS = { 267, 1}, + .CVT_S_D = { 268, 1}, + .CVT_S_W = { 269, 1}, + .CVT_S_L = { 270, 1}, + .CVT_D_S = { 271, 1}, + .CVT_D_W = { 272, 1}, + .CVT_D_L = { 273, 1}, + .CVT_W_S = { 274, 1}, + .CVT_W_D = { 275, 1}, + .CVT_L_S = { 276, 1}, + .CVT_L_D = { 277, 1}, + .CVT_PS_S = { 278, 1}, + .CVT_S_PU = { 279, 1}, + .CVT_S_PL = { 280, 1}, + .PLL_PS = { 281, 1}, + .PLU_PS = { 282, 1}, + .PUL_PS = { 283, 1}, + .PUU_PS = { 284, 1}, + .ROUND_W_S = { 285, 1}, + .ROUND_W_D = { 286, 1}, + .ROUND_L_S = { 287, 1}, + .ROUND_L_D = { 288, 1}, + .TRUNC_W_S = { 289, 1}, + .TRUNC_W_D = { 290, 1}, + .TRUNC_L_S = { 291, 1}, + .TRUNC_L_D = { 292, 1}, + .CEIL_W_S = { 293, 1}, + .CEIL_W_D = { 294, 1}, + .CEIL_L_S = { 295, 1}, + .CEIL_L_D = { 296, 1}, + .FLOOR_W_S = { 297, 1}, + .FLOOR_W_D = { 298, 1}, + .FLOOR_L_S = { 299, 1}, + .FLOOR_L_D = { 300, 1}, + .C_F_S = { 301, 1}, + .C_F_D = { 302, 1}, + .C_F_PS = { 303, 1}, + .C_UN_S = { 304, 1}, + .C_UN_D = { 305, 1}, + .C_UN_PS = { 306, 1}, + .C_EQ_S = { 307, 1}, + .C_EQ_D = { 308, 1}, + .C_EQ_PS = { 309, 1}, + .C_UEQ_S = { 310, 1}, + .C_UEQ_D = { 311, 1}, + .C_UEQ_PS = { 312, 1}, + .C_OLT_S = { 313, 1}, + .C_OLT_D = { 314, 1}, + .C_OLT_PS = { 315, 1}, + .C_ULT_S = { 316, 1}, + .C_ULT_D = { 317, 1}, + .C_ULT_PS = { 318, 1}, + .C_OLE_S = { 319, 1}, + .C_OLE_D = { 320, 1}, + .C_OLE_PS = { 321, 1}, + .C_ULE_S = { 322, 1}, + .C_ULE_D = { 323, 1}, + .C_ULE_PS = { 324, 1}, + .C_SF_S = { 325, 1}, + .C_SF_D = { 326, 1}, + .C_SF_PS = { 327, 1}, + .C_NGLE_S = { 328, 1}, + .C_NGLE_D = { 329, 1}, + .C_NGLE_PS = { 330, 1}, + .C_SEQ_S = { 331, 1}, + .C_SEQ_D = { 332, 1}, + .C_SEQ_PS = { 333, 1}, + .C_NGL_S = { 334, 1}, + .C_NGL_D = { 335, 1}, + .C_NGL_PS = { 336, 1}, + .C_LT_S = { 337, 1}, + .C_LT_D = { 338, 1}, + .C_LT_PS = { 339, 1}, + .C_NGE_S = { 340, 1}, + .C_NGE_D = { 341, 1}, + .C_NGE_PS = { 342, 1}, + .C_LE_S = { 343, 1}, + .C_LE_D = { 344, 1}, + .C_LE_PS = { 345, 1}, + .C_NGT_S = { 346, 1}, + .C_NGT_D = { 347, 1}, + .C_NGT_PS = { 348, 1}, + .BC1F = { 349, 1}, + .BC1T = { 350, 1}, + .BC1FL = { 351, 1}, + .BC1TL = { 352, 1}, + .MFC0 = { 353, 1}, + .MTC0 = { 354, 1}, + .DMFC0 = { 355, 1}, + .DMTC0 = { 356, 1}, + .MFHC0 = { 357, 1}, + .MTHC0 = { 358, 1}, + .TLBP = { 359, 1}, + .TLBR = { 360, 1}, + .TLBWI = { 361, 1}, + .TLBWR = { 362, 1}, + .CACHE = { 363, 1}, + .MFC2 = { 364, 1}, + .MTC2 = { 365, 1}, + .CFC2 = { 366, 1}, + .CTC2 = { 367, 1}, + .LWC2 = { 368, 1}, + .SWC2 = { 369, 1}, + .LDC2 = { 370, 1}, + .SDC2 = { 371, 1}, + .RTPS = { 372, 1}, + .RTPT = { 373, 1}, + .DPCS = { 374, 1}, + .DPCT = { 375, 1}, + .INTPL = { 376, 1}, + .MVMVA = { 377, 1}, + .NCDS = { 378, 1}, + .NCDT = { 379, 1}, + .NCCS = { 380, 1}, + .NCCT = { 381, 1}, + .NCS = { 382, 1}, + .NCT = { 383, 1}, + .CDP = { 384, 1}, + .CC = { 385, 1}, + .NCLIP = { 386, 1}, + .AVSZ3 = { 387, 1}, + .AVSZ4 = { 388, 1}, + .OP_GTE = { 389, 1}, + .GPF = { 390, 1}, + .GPL = { 391, 1}, + .SQR_GTE = { 392, 1}, + .DCPL = { 393, 1}, + .LQ = { 394, 1}, + .SQ = { 395, 1}, + .LQC2 = { 396, 1}, + .SQC2 = { 397, 1}, + .MFHI1 = { 398, 1}, + .MFLO1 = { 399, 1}, + .MTHI1 = { 400, 1}, + .MTLO1 = { 401, 1}, + .MULT1 = { 402, 1}, + .MULTU1 = { 403, 1}, + .DIV1 = { 404, 1}, + .DIVU1 = { 405, 1}, + .MADD_EE = { 406, 0}, + .MADDU_EE = { 406, 0}, + .MSUB_EE = { 406, 0}, + .MSUBU_EE = { 406, 0}, + .MADD1 = { 406, 1}, + .MADDU1 = { 407, 1}, + .MSUB1 = { 408, 0}, + .MSUBU1 = { 408, 0}, + .PMFHL_LW = { 408, 1}, + .PMFHL_UW = { 409, 1}, + .PMFHL_LH = { 410, 1}, + .PMFHL_SH = { 411, 1}, + .PMFHL_SLW = { 412, 1}, + .PMTHL_LW = { 413, 1}, + .PADDB = { 414, 1}, + .PADDH = { 415, 1}, + .PADDW = { 416, 1}, + .PADDSB = { 417, 1}, + .PADDSH = { 418, 1}, + .PADDSW = { 419, 1}, + .PADDUB = { 420, 1}, + .PADDUH = { 421, 1}, + .PADDUW = { 422, 1}, + .PSUBB = { 423, 1}, + .PSUBH = { 424, 1}, + .PSUBW = { 425, 1}, + .PSUBSB = { 426, 1}, + .PSUBSH = { 427, 1}, + .PSUBSW = { 428, 1}, + .PSUBUB = { 429, 1}, + .PSUBUH = { 430, 1}, + .PSUBUW = { 431, 1}, + .PSLLH = { 432, 1}, + .PSRLH = { 433, 1}, + .PSRAH = { 434, 1}, + .PSLLW = { 435, 1}, + .PSRLW = { 436, 1}, + .PSRAW = { 437, 1}, + .PSLLVW = { 438, 1}, + .PSRLVW = { 439, 1}, + .PSRAVW = { 440, 1}, + .QFSRV = { 441, 1}, + .PAND = { 442, 1}, + .POR = { 443, 1}, + .PXOR = { 444, 1}, + .PNOR = { 445, 1}, + .PCEQB = { 446, 1}, + .PCEQH = { 447, 1}, + .PCEQW = { 448, 1}, + .PCGTB = { 449, 1}, + .PCGTH = { 450, 1}, + .PCGTW = { 451, 1}, + .PMULTW = { 452, 1}, + .PMULTUW = { 453, 1}, + .PMULTH = { 454, 1}, + .PMADDW = { 455, 1}, + .PMADDUW = { 456, 1}, + .PMADDH = { 457, 1}, + .PMSUBW = { 458, 1}, + .PMSUBH = { 459, 1}, + .PHMADH = { 460, 1}, + .PHMSBH = { 461, 1}, + .PDIVW = { 462, 1}, + .PDIVUW = { 463, 1}, + .PDIVBW = { 464, 1}, + .PCPYLD = { 465, 1}, + .PCPYUD = { 466, 1}, + .PCPYH = { 467, 1}, + .PINTH = { 468, 1}, + .PINTOH = { 469, 1}, + .PEXEH = { 470, 1}, + .PEXEW = { 471, 1}, + .PEXCH = { 472, 1}, + .PEXCW = { 473, 1}, + .PROT3W = { 474, 1}, + .PPACB = { 475, 1}, + .PPACH = { 476, 1}, + .PPACW = { 477, 1}, + .PPAC5 = { 478, 1}, + .PEXT5 = { 479, 1}, + .PEXTLB = { 480, 1}, + .PEXTLH = { 481, 1}, + .PEXTLW = { 482, 1}, + .PEXTUB = { 483, 1}, + .PEXTUH = { 484, 1}, + .PEXTUW = { 485, 1}, + .PMFHI = { 486, 1}, + .PMFLO = { 487, 1}, + .PMTHI = { 488, 1}, + .PMTLO = { 489, 1}, + .PLZCW = { 490, 1}, + .PABSH = { 491, 1}, + .PABSW = { 492, 1}, + .PMAXH = { 493, 1}, + .PMAXW = { 494, 1}, + .PMINH = { 495, 1}, + .PMINW = { 496, 1}, + .MFSA = { 497, 1}, + .MTSA = { 498, 1}, + .MTSAB = { 499, 1}, + .MTSAH = { 500, 1}, + .ADDQ_PH = { 501, 1}, + .ADDQ_S_PH = { 502, 1}, + .ADDQ_S_W = { 503, 1}, + .SUBQ_PH = { 504, 1}, + .SUBQ_S_PH = { 505, 1}, + .SUBQ_S_W = { 506, 1}, + .ADDU_QB = { 507, 1}, + .ADDU_S_QB = { 508, 1}, + .ADDU_PH = { 509, 1}, + .ADDU_S_PH = { 510, 1}, + .SUBU_QB = { 511, 1}, + .SUBU_S_QB = { 512, 1}, + .SUBU_PH = { 513, 1}, + .SUBU_S_PH = { 514, 1}, + .ADDSC = { 515, 1}, + .ADDWC = { 516, 1}, + .MULEU_S_PH_QBL = { 517, 1}, + .MULEU_S_PH_QBR = { 518, 1}, + .MULEQ_S_W_PHL = { 519, 1}, + .MULEQ_S_W_PHR = { 520, 1}, + .MULQ_RS_PH = { 521, 1}, + .MULQ_S_PH = { 522, 1}, + .MULSAQ_S_W_PH = { 523, 1}, + .DPAQ_S_W_PH = { 524, 1}, + .DPSQ_S_W_PH = { 525, 1}, + .DPAQ_SA_L_W = { 526, 1}, + .DPSQ_SA_L_W = { 527, 1}, + .DPAU_H_QBL = { 528, 1}, + .DPAU_H_QBR = { 529, 1}, + .DPSU_H_QBL = { 530, 1}, + .DPSU_H_QBR = { 531, 1}, + .DPA_W_PH = { 532, 1}, + .DPS_W_PH = { 533, 1}, + .DPAX_W_PH = { 534, 1}, + .DPSX_W_PH = { 535, 1}, + .MAQ_S_W_PHL = { 536, 1}, + .MAQ_S_W_PHR = { 537, 1}, + .MAQ_SA_W_PHL = { 538, 1}, + .MAQ_SA_W_PHR = { 539, 1}, + .EXTR_W = { 540, 1}, + .EXTR_R_W = { 541, 1}, + .EXTR_RS_W = { 542, 1}, + .EXTR_S_H = { 543, 1}, + .EXTRV_W = { 544, 1}, + .EXTRV_R_W = { 545, 1}, + .EXTRV_RS_W = { 546, 1}, + .EXTRV_S_H = { 547, 1}, + .EXTP = { 548, 1}, + .EXTPV = { 549, 1}, + .EXTPDP = { 550, 1}, + .EXTPDPV = { 551, 1}, + .SHILO = { 552, 1}, + .SHILOV = { 553, 1}, + .MTHLIP = { 554, 1}, + .WRDSP = { 555, 1}, + .RDDSP = { 556, 1}, + .PRECRQ_QB_PH = { 557, 1}, + .PRECRQ_PH_W = { 558, 1}, + .PRECRQU_S_QB_PH = { 559, 1}, + .PRECEQ_W_PHL = { 560, 1}, + .PRECEQ_W_PHR = { 561, 1}, + .PRECEQU_PH_QBL = { 562, 1}, + .PRECEQU_PH_QBR = { 563, 1}, + .PRECEQU_PH_QBLA = { 564, 1}, + .PRECEQU_PH_QBRA = { 565, 1}, + .PRECEU_PH_QBL = { 566, 1}, + .PRECEU_PH_QBR = { 567, 1}, + .PRECEU_PH_QBLA = { 568, 1}, + .PRECEU_PH_QBRA = { 569, 1}, + .PRECRQ_RS_PH_W = { 570, 1}, + .CMPU_EQ_QB = { 571, 1}, + .CMPU_LT_QB = { 572, 1}, + .CMPU_LE_QB = { 573, 1}, + .CMP_EQ_PH = { 574, 1}, + .CMP_LT_PH = { 575, 1}, + .CMP_LE_PH = { 576, 1}, + .CMPGU_EQ_QB = { 577, 1}, + .CMPGU_LT_QB = { 578, 1}, + .CMPGU_LE_QB = { 579, 1}, + .PICK_QB = { 580, 1}, + .PICK_PH = { 581, 1}, + .SHLL_QB = { 582, 1}, + .SHLL_PH = { 583, 1}, + .SHLL_S_PH = { 584, 1}, + .SHLL_S_W = { 585, 1}, + .SHLLV_QB = { 586, 1}, + .SHLLV_PH = { 587, 1}, + .SHLLV_S_PH = { 588, 1}, + .SHLLV_S_W = { 589, 1}, + .SHRL_QB = { 590, 1}, + .SHRL_PH = { 591, 1}, + .SHRLV_QB = { 592, 1}, + .SHRLV_PH = { 593, 1}, + .SHRA_QB = { 594, 1}, + .SHRA_R_QB = { 595, 1}, + .SHRA_PH = { 596, 1}, + .SHRA_R_PH = { 597, 1}, + .SHRA_R_W = { 598, 1}, + .SHRAV_QB = { 599, 1}, + .SHRAV_R_QB = { 600, 1}, + .SHRAV_PH = { 601, 1}, + .SHRAV_R_PH = { 602, 1}, + .SHRAV_R_W = { 603, 1}, + .LBUX = { 604, 1}, + .LHX = { 605, 1}, + .LWX = { 606, 1}, + .BPOSGE32 = { 607, 1}, + .BPOSGE64 = { 608, 0}, + .INSV = { 608, 1}, + .BITREV = { 609, 1}, + .ABSQ_S_PH = { 610, 1}, + .ABSQ_S_W = { 611, 1}, + .REPL_PH = { 612, 1}, + .REPLV_PH = { 613, 1}, + .REPL_QB = { 614, 1}, + .REPLV_QB = { 615, 1}, + .ADDV_B = { 616, 1}, + .ADDV_H = { 617, 1}, + .ADDV_W = { 618, 1}, + .ADDV_D = { 619, 1}, + .SUBV_B = { 620, 1}, + .SUBV_H = { 621, 1}, + .SUBV_W = { 622, 1}, + .SUBV_D = { 623, 1}, + .ADDS_S_B = { 624, 1}, + .ADDS_S_H = { 625, 1}, + .ADDS_S_W = { 626, 1}, + .ADDS_S_D = { 627, 1}, + .ADDS_U_B = { 628, 1}, + .ADDS_U_H = { 629, 1}, + .ADDS_U_W = { 630, 1}, + .ADDS_U_D = { 631, 1}, + .SUBS_S_B = { 632, 1}, + .SUBS_S_H = { 633, 1}, + .SUBS_S_W = { 634, 1}, + .SUBS_S_D = { 635, 1}, + .SUBS_U_B = { 636, 1}, + .SUBS_U_H = { 637, 1}, + .SUBS_U_W = { 638, 1}, + .SUBS_U_D = { 639, 1}, + .MULV_B = { 640, 1}, + .MULV_H = { 641, 1}, + .MULV_W = { 642, 1}, + .MULV_D = { 643, 1}, + .DIV_S_B = { 644, 1}, + .DIV_S_H = { 645, 1}, + .DIV_S_W = { 646, 1}, + .DIV_S_D = { 647, 1}, + .DIV_U_B = { 648, 1}, + .DIV_U_H = { 649, 1}, + .DIV_U_W = { 650, 1}, + .DIV_U_D = { 651, 1}, + .MOD_S_B = { 652, 1}, + .MOD_S_H = { 653, 1}, + .MOD_S_W = { 654, 1}, + .MOD_S_D = { 655, 1}, + .MOD_U_B = { 656, 1}, + .MOD_U_H = { 657, 1}, + .MOD_U_W = { 658, 1}, + .MOD_U_D = { 659, 1}, + .MADDV_B = { 660, 1}, + .MADDV_H = { 661, 1}, + .MADDV_W = { 662, 1}, + .MADDV_D = { 663, 1}, + .MSUBV_B = { 664, 1}, + .MSUBV_H = { 665, 1}, + .MSUBV_W = { 666, 1}, + .MSUBV_D = { 667, 1}, + .DOTP_S_H = { 668, 1}, + .DOTP_S_W = { 669, 1}, + .DOTP_S_D = { 670, 1}, + .DOTP_U_H = { 671, 1}, + .DOTP_U_W = { 672, 1}, + .DOTP_U_D = { 673, 1}, + .AND_V = { 674, 1}, + .OR_V = { 675, 1}, + .NOR_V = { 676, 1}, + .XOR_V = { 677, 1}, + .ANDI_B = { 678, 1}, + .ORI_B = { 679, 1}, + .NORI_B = { 680, 1}, + .XORI_B = { 681, 1}, + .BSEL_V = { 682, 1}, + .BSELI_B = { 683, 1}, + .BMNZ_V = { 684, 1}, + .BMNZI_B = { 685, 1}, + .BMZ_V = { 686, 1}, + .BMZI_B = { 687, 1}, + .CEQ_B = { 688, 1}, + .CEQ_H = { 689, 1}, + .CEQ_W = { 690, 1}, + .CEQ_D = { 691, 1}, + .CLT_S_B = { 692, 1}, + .CLT_S_H = { 693, 1}, + .CLT_S_W = { 694, 1}, + .CLT_S_D = { 695, 1}, + .CLT_U_B = { 696, 1}, + .CLT_U_H = { 697, 1}, + .CLT_U_W = { 698, 1}, + .CLT_U_D = { 699, 1}, + .CLE_S_B = { 700, 1}, + .CLE_S_H = { 701, 1}, + .CLE_S_W = { 702, 1}, + .CLE_S_D = { 703, 1}, + .CLE_U_B = { 704, 1}, + .CLE_U_H = { 705, 1}, + .CLE_U_W = { 706, 1}, + .CLE_U_D = { 707, 1}, + .MIN_S_B = { 708, 1}, + .MIN_S_H = { 709, 1}, + .MIN_S_W = { 710, 1}, + .MIN_S_D = { 711, 1}, + .MIN_U_B = { 712, 1}, + .MIN_U_H = { 713, 1}, + .MIN_U_W = { 714, 1}, + .MIN_U_D = { 715, 1}, + .MAX_S_B = { 716, 1}, + .MAX_S_H = { 717, 1}, + .MAX_S_W = { 718, 1}, + .MAX_S_D = { 719, 1}, + .MAX_U_B = { 720, 1}, + .MAX_U_H = { 721, 1}, + .MAX_U_W = { 722, 1}, + .MAX_U_D = { 723, 1}, + .SLL_B = { 724, 1}, + .SLL_H = { 725, 1}, + .SLL_W = { 726, 1}, + .SLL_D = { 727, 1}, + .SRL_B = { 728, 1}, + .SRL_H = { 729, 1}, + .SRL_W = { 730, 1}, + .SRL_D = { 731, 1}, + .SRA_B = { 732, 1}, + .SRA_H = { 733, 1}, + .SRA_W = { 734, 1}, + .SRA_D = { 735, 1}, + .SLLI_B = { 736, 1}, + .SLLI_H = { 737, 1}, + .SLLI_W = { 738, 1}, + .SLLI_D = { 739, 1}, + .SRLI_B = { 740, 1}, + .SRLI_H = { 741, 1}, + .SRLI_W = { 742, 1}, + .SRLI_D = { 743, 1}, + .SRAI_B = { 744, 1}, + .SRAI_H = { 745, 1}, + .SRAI_W = { 746, 1}, + .SRAI_D = { 747, 1}, + .FADD_W = { 748, 1}, + .FADD_D = { 749, 1}, + .FSUB_W = { 750, 1}, + .FSUB_D = { 751, 1}, + .FMUL_W = { 752, 1}, + .FMUL_D = { 753, 1}, + .FDIV_W = { 754, 1}, + .FDIV_D = { 755, 1}, + .FSQRT_W = { 756, 1}, + .FSQRT_D = { 757, 1}, + .FRSQRT_W = { 758, 1}, + .FRSQRT_D = { 759, 1}, + .FRCP_W = { 760, 1}, + .FRCP_D = { 761, 1}, + .FRINT_W = { 762, 1}, + .FRINT_D = { 763, 1}, + .FMAX_W = { 764, 1}, + .FMAX_D = { 765, 1}, + .FMIN_W = { 766, 1}, + .FMIN_D = { 767, 1}, + .FCEQ_W = { 768, 1}, + .FCEQ_D = { 769, 1}, + .FCNE_W = { 770, 1}, + .FCNE_D = { 771, 1}, + .FCLT_W = { 772, 1}, + .FCLT_D = { 773, 1}, + .FCLE_W = { 774, 1}, + .FCLE_D = { 775, 1}, + .FFINT_S_W = { 776, 1}, + .FFINT_S_D = { 777, 1}, + .FFINT_U_W = { 778, 1}, + .FFINT_U_D = { 779, 1}, + .FTRUNC_S_W = { 780, 1}, + .FTRUNC_S_D = { 781, 1}, + .FTRUNC_U_W = { 782, 1}, + .FTRUNC_U_D = { 783, 1}, + .FCVT_S_W = { 784, 1}, + .FCVT_S_D = { 785, 1}, + .FCVT_D_W = { 786, 1}, + .LD_B = { 787, 1}, + .LD_H = { 788, 1}, + .LD_W = { 789, 1}, + .LD_D = { 790, 1}, + .ST_B = { 791, 1}, + .ST_H = { 792, 1}, + .ST_W = { 793, 1}, + .ST_D = { 794, 1}, + .LDI_B = { 795, 1}, + .LDI_H = { 796, 1}, + .LDI_W = { 797, 1}, + .LDI_D = { 798, 1}, + .COPY_S_B = { 799, 1}, + .COPY_S_H = { 800, 1}, + .COPY_S_W = { 801, 1}, + .COPY_U_B = { 802, 1}, + .COPY_U_H = { 803, 1}, + .COPY_U_W = { 804, 1}, + .INSERT_B = { 805, 1}, + .INSERT_H = { 806, 1}, + .INSERT_W = { 807, 1}, + .INSERT_D = { 808, 1}, + .INSVE_B = { 809, 1}, + .INSVE_H = { 810, 1}, + .INSVE_W = { 811, 1}, + .INSVE_D = { 812, 1}, + .SHF_B = { 813, 1}, + .SHF_H = { 814, 1}, + .SHF_W = { 815, 1}, + .VSHF_B = { 816, 1}, + .VSHF_H = { 817, 1}, + .VSHF_W = { 818, 1}, + .VSHF_D = { 819, 1}, + .SLD_B = { 820, 1}, + .SLD_H = { 821, 1}, + .SLD_W = { 822, 1}, + .SLD_D = { 823, 1}, + .SLDI_B = { 824, 1}, + .SLDI_H = { 825, 1}, + .SLDI_W = { 826, 1}, + .SLDI_D = { 827, 1}, + .SPLAT_B = { 828, 1}, + .SPLAT_H = { 829, 1}, + .SPLAT_W = { 830, 1}, + .SPLAT_D = { 831, 1}, + .SPLATI_B = { 832, 1}, + .SPLATI_H = { 833, 1}, + .SPLATI_W = { 834, 1}, + .SPLATI_D = { 835, 1}, + .BZ_V = { 836, 1}, + .BNZ_V = { 837, 1}, + .BZ_B = { 838, 1}, + .BZ_H = { 839, 1}, + .BZ_W = { 840, 1}, + .BZ_D = { 841, 1}, + .BNZ_B = { 842, 1}, + .BNZ_H = { 843, 1}, + .BNZ_W = { 844, 1}, + .BNZ_D = { 845, 1}, + .NLOC_B = { 846, 1}, + .NLOC_H = { 847, 1}, + .NLOC_W = { 848, 1}, + .NLOC_D = { 849, 1}, + .NLZC_B = { 850, 1}, + .NLZC_H = { 851, 1}, + .NLZC_W = { 852, 1}, + .NLZC_D = { 853, 1}, + .PCNT_B = { 854, 1}, + .PCNT_H = { 855, 1}, + .PCNT_W = { 856, 1}, + .PCNT_D = { 857, 1}, + .VMOV_S = { 858, 1}, + .VMOV_P = { 859, 1}, + .VMOV_T = { 860, 1}, + .VMOV_Q = { 861, 1}, + .LV_S = { 862, 1}, + .LV_Q = { 863, 1}, + .SV_S = { 864, 1}, + .SV_Q = { 865, 1}, + .LVL_Q = { 866, 1}, + .LVR_Q = { 867, 1}, + .SVL_Q = { 868, 1}, + .SVR_Q = { 869, 1}, + .VIIM_S = { 870, 1}, + .VFIM_S = { 871, 1}, + .VADD_S = { 872, 1}, + .VADD_P = { 873, 1}, + .VADD_T = { 874, 1}, + .VADD_Q = { 875, 1}, + .VSUB_S = { 876, 1}, + .VSUB_P = { 877, 1}, + .VSUB_T = { 878, 1}, + .VSUB_Q = { 879, 1}, + .VMUL_S = { 880, 1}, + .VMUL_P = { 881, 1}, + .VMUL_T = { 882, 1}, + .VMUL_Q = { 883, 1}, + .VDIV_S = { 884, 1}, + .VDIV_P = { 885, 1}, + .VDIV_T = { 886, 1}, + .VDIV_Q = { 887, 1}, + .VABS_S = { 888, 1}, + .VABS_P = { 889, 1}, + .VABS_T = { 890, 1}, + .VABS_Q = { 891, 1}, + .VNEG_S = { 892, 1}, + .VNEG_P = { 893, 1}, + .VNEG_T = { 894, 1}, + .VNEG_Q = { 895, 1}, + .VSQRT_S = { 896, 1}, + .VRCP_S = { 897, 1}, + .VRCP_P = { 898, 1}, + .VRCP_T = { 899, 1}, + .VRCP_Q = { 900, 1}, + .VRSQ_S = { 901, 1}, + .VRSQ_P = { 902, 1}, + .VRSQ_T = { 903, 1}, + .VRSQ_Q = { 904, 1}, + .VDOT_P = { 905, 1}, + .VDOT_T = { 906, 1}, + .VDOT_Q = { 907, 1}, + .VSCL_P = { 908, 1}, + .VSCL_T = { 909, 1}, + .VSCL_Q = { 910, 1}, + .VHDP_P = { 911, 1}, + .VHDP_T = { 912, 1}, + .VHDP_Q = { 913, 1}, + .VAVG_P = { 914, 1}, + .VAVG_T = { 915, 1}, + .VAVG_Q = { 916, 1}, + .VFAD_P = { 917, 1}, + .VFAD_T = { 918, 1}, + .VFAD_Q = { 919, 1}, + .VMMUL_P = { 920, 1}, + .VMMUL_T = { 921, 1}, + .VMMUL_Q = { 922, 1}, + .VTFM2_P = { 923, 1}, + .VTFM3_T = { 924, 1}, + .VTFM4_Q = { 925, 1}, + .VHTFM2_P = { 926, 1}, + .VHTFM3_T = { 927, 1}, + .VHTFM4_Q = { 928, 1}, + .VMSCL_P = { 929, 1}, + .VMSCL_T = { 930, 1}, + .VMSCL_Q = { 931, 1}, + .VMMOV_P = { 932, 1}, + .VMMOV_T = { 933, 1}, + .VMMOV_Q = { 934, 1}, + .VMIDT_P = { 935, 1}, + .VMIDT_T = { 936, 1}, + .VMIDT_Q = { 937, 1}, + .VMZERO_P = { 938, 1}, + .VMZERO_T = { 939, 1}, + .VMZERO_Q = { 940, 1}, + .VMONE_P = { 941, 1}, + .VMONE_T = { 942, 1}, + .VMONE_Q = { 943, 1}, + .VCRS_T = { 944, 1}, + .VCRSP_T = { 945, 1}, + .VQMUL_Q = { 946, 1}, + .VCMP_S = { 947, 1}, + .VCMP_P = { 948, 1}, + .VCMP_T = { 949, 1}, + .VCMP_Q = { 950, 1}, + .VMIN_S = { 951, 1}, + .VMIN_P = { 952, 1}, + .VMIN_T = { 953, 1}, + .VMIN_Q = { 954, 1}, + .VMAX_S = { 955, 1}, + .VMAX_P = { 956, 1}, + .VMAX_T = { 957, 1}, + .VMAX_Q = { 958, 1}, + .VSIN_S = { 959, 1}, + .VCOS_S = { 960, 1}, + .VEXP2_S = { 961, 1}, + .VLOG2_S = { 962, 1}, + .VASIN_S = { 963, 1}, + .VNRCP_S = { 964, 1}, + .VNSIN_S = { 965, 1}, + .VREXP2_S = { 966, 1}, + .VSGN_S = { 967, 1}, + .VI2F_S = { 968, 1}, + .VI2F_P = { 969, 1}, + .VI2F_T = { 970, 1}, + .VI2F_Q = { 971, 1}, + .VF2IN_S = { 972, 1}, + .VF2IN_P = { 973, 1}, + .VF2IN_T = { 974, 1}, + .VF2IN_Q = { 975, 1}, + .VF2IZ_S = { 976, 1}, + .VF2IZ_P = { 977, 1}, + .VF2IZ_T = { 978, 1}, + .VF2IZ_Q = { 979, 1}, + .VF2IU_S = { 980, 1}, + .VF2IU_P = { 981, 1}, + .VF2IU_T = { 982, 1}, + .VF2IU_Q = { 983, 1}, + .VF2ID_S = { 984, 1}, + .VF2ID_P = { 985, 1}, + .VF2ID_T = { 986, 1}, + .VF2ID_Q = { 987, 1}, + .VF2H_P = { 988, 1}, + .VH2F_S = { 989, 1}, + .VFLUSH = { 990, 1}, + .VSYNC = { 991, 1}, + .VNOP = { 992, 1}, + .VPFXS = { 993, 1}, + .VPFXT = { 994, 1}, + .VPFXD = { 995, 1}, + .VCST_S = { 996, 1}, + .VCST_P = { 997, 1}, + .VCST_T = { 998, 1}, + .VCST_Q = { 999, 1}, + .MFV = { 1000, 1}, + .MTV = { 1001, 1}, + .MFVC = { 1002, 1}, + .MTVC = { 1003, 1}, + .BVF = { 1004, 1}, + .BVT = { 1005, 1}, + .BVFL = { 1006, 1}, + .BVTL = { 1007, 1}, } diff --git a/core/rexcode/mips/tablegen/specgen.lua b/core/rexcode/mips/tablegen/specgen.lua index d797376ac..6ed10233c 100644 --- a/core/rexcode/mips/tablegen/specgen.lua +++ b/core/rexcode/mips/tablegen/specgen.lua @@ -350,27 +350,23 @@ end -- ---- Branches: derive bits/regs, then mark the PC-relative offset variable. -- Compact (R6) branches need the r6 ISA, so each family passes its own mattr. -local function bword(line, mattr) - local p = io.popen(string.format("printf '%%s\\n' '%s' | llvm-mc --assemble --triple=mips --mattr=%s --show-encoding 2>/dev/null", line, mattr)) - local out = p:read("*a"); p:close() - local b1,b2,b3,b4 = out:match("0x(%x%x),0x(%x%x),0x(%x%x),0x(%x%x)") - if not b1 then return nil end - return tonumber(b1..b2..b3..b4, 16) -end -local function branch_block(mnem, ops, enc, feat, asm, maxes, offbits, mattr) +local function branch_block(mnem, ops, enc, feat, asm, maxes, offbits, cmd) local zero={}; for i=1,#maxes do zero[i]=0 end - local b0 = bword(asm(zero), mattr) + local b0 = word(asm(zero), cmd) if not b0 then skips[#skips+1]=mnem; return end local vs={} for i=1,#maxes do local v={}; for j=1,#maxes do v[j]=0 end; v[i]=maxes[i] - local w=bword(asm(v), mattr); if not w then skips[#skips+1]=mnem; return end; vs[#vs+1]=w + local w=word(asm(v), cmd); if not w then skips[#skips+1]=mnem; return end; vs[#vs+1]=w end local m = bit.band(mask_of(b0,vs), bit.bnot((2^offbits)-1)) -- offset field = variable n_forms=n_forms+1 sections[#sections+1]=string.format(" .%s = { {.%s, %s, %s, 0x%s, 0x%s, .%s, {}} },", mnem, mnem, ops, enc, bit.tohex(b0):upper(), bit.tohex(m):upper(), feat) end +local LLVM_MSA = "llvm-mc --assemble --triple=mips --mattr=+msa --show-encoding" +local LLVM_R6 = "llvm-mc --assemble --triple=mips --mattr=+mips32r6 --show-encoding" +local LLVM_64R6 = "llvm-mc --assemble --triple=mips64 --mattr=+mips64r6 --show-encoding" -- NOTE: the R6 two-/one-register compact branches (BEQC/BNEC/BLTC/BGEC/BLTUC/ -- BGEUC/BLEZC/BGTZC/BGEZC/BLTZC) are intentionally NOT generated here. They @@ -381,10 +377,18 @@ end for _, b in ipairs({{"BZ","bz"},{"BNZ","bnz"}}) do for _, d in ipairs({{"B","b"},{"H","h"},{"W","w"},{"D","d"},{"V","v"}}) do branch_block(b[1].."_"..d[1], "{.MSA_VEC,.REL16,.NONE,.NONE}", "{.WT,.BRANCH_16,.NONE,.NONE}", "MSA", - function(v) return string.format("%s.%s $w%d,0", b[2], d[2], v[1]) end, {31}, 16, "+msa") + function(v) return string.format("%s.%s $w%d,0", b[2], d[2], v[1]) end, {31}, 16, LLVM_MSA) end end +-- ---- R6 PC-relative loads (offset is a 19-/18-bit PC-relative label) -------- +branch_block("LWPC", "{.GPR,.REL19,.NONE,.NONE}", "{.RS,.BRANCH_19,.NONE,.NONE}", "MIPS32_R6", + function(v) return string.format("lwpc $%d,0", v[1]) end, {31}, 19, LLVM_R6) +branch_block("LWUPC", "{.GPR,.REL19,.NONE,.NONE}", "{.RS,.BRANCH_19,.NONE,.NONE}", "MIPS64_R6", + function(v) return string.format("lwupc $%d,0", v[1]) end, {31}, 19, LLVM_64R6) +branch_block("LDPC", "{.GPR,.REL18,.NONE,.NONE}", "{.RS,.BRANCH_18,.NONE,.NONE}", "MIPS64_R6", + function(v) return string.format("ldpc $%d,0", v[1]) end, {31}, 18, LLVM_64R6) + -- ---- splice into the SoT --------------------------------------------------- local region = " // SPECGEN:BEGIN\n" .. table.concat(sections, "\n") .. "\n // SPECGEN:END" local fh = assert(io.open(TABLE, "r")); local src = fh:read("*a"); fh:close() diff --git a/core/rexcode/mips/tables/mips.encode_forms.bin b/core/rexcode/mips/tables/mips.encode_forms.bin index 5494d3e7059d4fdd219d35fe91de9612102e15e8..50798a046f633af722facf3f05cd2ab07d759f9b 100644 GIT binary patch literal 20160 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 QqM{60$o~BUatjj+07bnE{Qv*} literal 20100 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 Vi-FFj0f~w-WFh bool { return true case .IMM5, .IMM16S, .IMM16U, .IMM20, .SEL, .FCC: return true - case .REL16, .REL21, .REL26, .REL_J26: + case .REL16, .REL21, .REL26, .REL_J26, .REL19, .REL18: return true case .MEM: return true @@ -313,7 +313,7 @@ operand_suffix :: proc(op: mips.Operand_Type) -> string { case .IMM20: return "i20" case .SEL: return "sel" case .FCC: return "cc" - case .REL16: return "rel" + case .REL16, .REL19, .REL18: return "rel" case .REL21: return "rel21" case .REL26: return "rel26" case .REL_J26: return "j" @@ -338,7 +338,7 @@ operand_param_type :: proc(op: mips.Operand_Type) -> string { return "Register" case .IMM5, .IMM16S, .IMM16U, .IMM20, .SEL, .FCC: return "i64" - case .REL16, .REL21, .REL26, .REL_J26: + case .REL16, .REL21, .REL26, .REL_J26, .REL19, .REL18: return "u32" case .MEM: return "Memory" } @@ -377,7 +377,7 @@ write_op_expr :: proc(sb: ^strings.Builder, op: mips.Operand_Type, name: string) fmt.sbprintf(sb, "op_reg(%s)", name) case .IMM5, .IMM16S, .IMM16U, .IMM20, .SEL, .FCC: fmt.sbprintf(sb, "op_imm(%s, %d)", name, operand_imm_size(op)) - case .REL16, .REL21, .REL26, .REL_J26: + case .REL16, .REL21, .REL26, .REL_J26, .REL19, .REL18: fmt.sbprintf(sb, "op_label(%s)", name) case .MEM: fmt.sbprintf(sb, "op_mem(%s, 4)", name) @@ -403,7 +403,7 @@ param_names :: proc(sig: Operand_Signature) -> [4]string { case .IMM5, .IMM16S, .IMM16U, .IMM20, .SEL, .FCC: result[i] = imm_n == 0 ? "imm" : fmt.tprintf("imm%d", imm_n + 1) imm_n += 1 - case .REL16, .REL21, .REL26, .REL_J26: + case .REL16, .REL21, .REL26, .REL_J26, .REL19, .REL18: result[i] = rel_n == 0 ? "target" : fmt.tprintf("target%d", rel_n + 1) rel_n += 1 case .MEM: