From 67dfa25696c883eaae4cb3f7994aa1a636d56d0b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 14 Jun 2026 19:22:17 +0100 Subject: [PATCH] Minimize MIPS decode table --- core/rexcode/mips/decoding_tables.odin | 528 +++++++----------- core/rexcode/mips/encoding_table.odin | 2 +- .../rexcode/mips/tools/gen_decode_tables.odin | 6 +- 3 files changed, 211 insertions(+), 325 deletions(-) diff --git a/core/rexcode/mips/decoding_tables.odin b/core/rexcode/mips/decoding_tables.odin index 353eb7b90..1393c2d32 100644 --- a/core/rexcode/mips/decoding_tables.odin +++ b/core/rexcode/mips/decoding_tables.odin @@ -814,345 +814,233 @@ DECODE_ENTRIES := [783]Decode_Entry{ } @(rodata) DECODE_INDEX_PRIMARY := [64]Decode_Index{ - /* [00] */ {0, 84}, - /* [01] */ {84, 20}, - /* [02] */ {104, 1}, - /* [03] */ {105, 1}, - /* [04] */ {106, 1}, - /* [05] */ {107, 1}, - /* [06] */ {108, 1}, - /* [07] */ {109, 1}, - /* [08] */ {110, 1}, - /* [09] */ {111, 1}, - /* [10] */ {112, 1}, - /* [11] */ {113, 1}, - /* [12] */ {114, 1}, - /* [13] */ {115, 1}, - /* [14] */ {116, 1}, - /* [15] */ {117, 2}, - /* [16] */ {119, 13}, - /* [17] */ {132, 114}, - /* [18] */ {246, 36}, - /* [19] */ {282, 5}, - /* [20] */ {287, 1}, - /* [21] */ {288, 1}, - /* [22] */ {289, 1}, - /* [23] */ {290, 1}, - /* [24] */ {291, 13}, - /* [25] */ {304, 15}, - /* [26] */ {319, 1}, - /* [27] */ {320, 13}, - /* [28] */ {333, 109}, - /* [29] */ {442, 1}, - /* [30] */ {443, 117}, - /* [31] */ {560, 78}, - /* [32] */ {638, 1}, - /* [33] */ {639, 1}, - /* [34] */ {640, 1}, - /* [35] */ {641, 1}, - /* [36] */ {642, 1}, - /* [37] */ {643, 1}, - /* [38] */ {644, 1}, - /* [39] */ {645, 1}, - /* [40] */ {646, 1}, - /* [41] */ {647, 1}, - /* [42] */ {648, 1}, - /* [43] */ {649, 1}, - /* [44] */ {650, 1}, - /* [45] */ {651, 1}, - /* [46] */ {652, 1}, - /* [47] */ {653, 1}, - /* [48] */ {654, 1}, - /* [49] */ {655, 1}, - /* [50] */ {656, 3}, - /* [51] */ {659, 1}, - /* [52] */ {660, 63}, - /* [53] */ {723, 3}, - /* [54] */ {726, 5}, - /* [55] */ {731, 6}, - /* [56] */ {737, 1}, - /* [57] */ {738, 1}, - /* [58] */ {739, 3}, - /* [59] */ {742, 2}, - /* [60] */ {744, 27}, - /* [61] */ {771, 3}, - /* [62] */ {774, 5}, - /* [63] */ {779, 4}, + 0x00 = {0, 84}, + 0x01 = {84, 20}, + 0x02 = {104, 1}, + 0x03 = {105, 1}, + 0x04 = {106, 1}, + 0x05 = {107, 1}, + 0x06 = {108, 1}, + 0x07 = {109, 1}, + 0x08 = {110, 1}, + 0x09 = {111, 1}, + 0x0A = {112, 1}, + 0x0B = {113, 1}, + 0x0C = {114, 1}, + 0x0D = {115, 1}, + 0x0E = {116, 1}, + 0x0F = {117, 2}, + 0x10 = {119, 13}, + 0x11 = {132, 114}, + 0x12 = {246, 36}, + 0x13 = {282, 5}, + 0x14 = {287, 1}, + 0x15 = {288, 1}, + 0x16 = {289, 1}, + 0x17 = {290, 1}, + 0x18 = {291, 13}, + 0x19 = {304, 15}, + 0x1A = {319, 1}, + 0x1B = {320, 13}, + 0x1C = {333, 109}, + 0x1D = {442, 1}, + 0x1E = {443, 117}, + 0x1F = {560, 78}, + 0x20 = {638, 1}, + 0x21 = {639, 1}, + 0x22 = {640, 1}, + 0x23 = {641, 1}, + 0x24 = {642, 1}, + 0x25 = {643, 1}, + 0x26 = {644, 1}, + 0x27 = {645, 1}, + 0x28 = {646, 1}, + 0x29 = {647, 1}, + 0x2A = {648, 1}, + 0x2B = {649, 1}, + 0x2C = {650, 1}, + 0x2D = {651, 1}, + 0x2E = {652, 1}, + 0x2F = {653, 1}, + 0x30 = {654, 1}, + 0x31 = {655, 1}, + 0x32 = {656, 3}, + 0x33 = {659, 1}, + 0x34 = {660, 63}, + 0x35 = {723, 3}, + 0x36 = {726, 5}, + 0x37 = {731, 6}, + 0x38 = {737, 1}, + 0x39 = {738, 1}, + 0x3A = {739, 3}, + 0x3B = {742, 2}, + 0x3C = {744, 27}, + 0x3D = {771, 3}, + 0x3E = {774, 5}, + 0x3F = {779, 4}, } @(rodata) DECODE_INDEX_SPECIAL := [64]Decode_Index{ - /* [00] */ {0, 5}, - /* [01] */ {5, 2}, - /* [02] */ {7, 2}, - /* [03] */ {9, 1}, - /* [04] */ {10, 1}, - /* [05] */ {11, 1}, - /* [06] */ {12, 2}, - /* [07] */ {14, 1}, - /* [08] */ {15, 1}, - /* [09] */ {16, 1}, - /* [10] */ {17, 1}, - /* [11] */ {18, 1}, - /* [12] */ {19, 1}, - /* [13] */ {20, 1}, - /* [14] */ {0, 0}, - /* [15] */ {21, 1}, - /* [16] */ {22, 1}, - /* [17] */ {23, 1}, - /* [18] */ {24, 1}, - /* [19] */ {25, 1}, - /* [20] */ {26, 1}, - /* [21] */ {27, 1}, - /* [22] */ {28, 2}, - /* [23] */ {30, 1}, - /* [24] */ {31, 2}, - /* [25] */ {33, 3}, - /* [26] */ {36, 2}, - /* [27] */ {38, 2}, - /* [28] */ {40, 3}, - /* [29] */ {43, 3}, - /* [30] */ {46, 3}, - /* [31] */ {49, 3}, - /* [32] */ {52, 1}, - /* [33] */ {53, 1}, - /* [34] */ {54, 1}, - /* [35] */ {55, 1}, - /* [36] */ {56, 1}, - /* [37] */ {57, 1}, - /* [38] */ {58, 1}, - /* [39] */ {59, 1}, - /* [40] */ {60, 1}, - /* [41] */ {61, 1}, - /* [42] */ {62, 1}, - /* [43] */ {63, 1}, - /* [44] */ {64, 1}, - /* [45] */ {65, 1}, - /* [46] */ {66, 1}, - /* [47] */ {67, 1}, - /* [48] */ {68, 1}, - /* [49] */ {69, 1}, - /* [50] */ {70, 1}, - /* [51] */ {71, 1}, - /* [52] */ {72, 1}, - /* [53] */ {73, 1}, - /* [54] */ {74, 1}, - /* [55] */ {75, 1}, - /* [56] */ {76, 1}, - /* [57] */ {0, 0}, - /* [58] */ {77, 2}, - /* [59] */ {79, 1}, - /* [60] */ {80, 1}, - /* [61] */ {0, 0}, - /* [62] */ {81, 2}, - /* [63] */ {83, 1}, + 0x00 = {0, 5}, + 0x01 = {5, 2}, + 0x02 = {7, 2}, + 0x03 = {9, 1}, + 0x04 = {10, 1}, + 0x05 = {11, 1}, + 0x06 = {12, 2}, + 0x07 = {14, 1}, + 0x08 = {15, 1}, + 0x09 = {16, 1}, + 0x0A = {17, 1}, + 0x0B = {18, 1}, + 0x0C = {19, 1}, + 0x0D = {20, 1}, + 0x0F = {21, 1}, + 0x10 = {22, 1}, + 0x11 = {23, 1}, + 0x12 = {24, 1}, + 0x13 = {25, 1}, + 0x14 = {26, 1}, + 0x15 = {27, 1}, + 0x16 = {28, 2}, + 0x17 = {30, 1}, + 0x18 = {31, 2}, + 0x19 = {33, 3}, + 0x1A = {36, 2}, + 0x1B = {38, 2}, + 0x1C = {40, 3}, + 0x1D = {43, 3}, + 0x1E = {46, 3}, + 0x1F = {49, 3}, + 0x20 = {52, 1}, + 0x21 = {53, 1}, + 0x22 = {54, 1}, + 0x23 = {55, 1}, + 0x24 = {56, 1}, + 0x25 = {57, 1}, + 0x26 = {58, 1}, + 0x27 = {59, 1}, + 0x28 = {60, 1}, + 0x29 = {61, 1}, + 0x2A = {62, 1}, + 0x2B = {63, 1}, + 0x2C = {64, 1}, + 0x2D = {65, 1}, + 0x2E = {66, 1}, + 0x2F = {67, 1}, + 0x30 = {68, 1}, + 0x31 = {69, 1}, + 0x32 = {70, 1}, + 0x33 = {71, 1}, + 0x34 = {72, 1}, + 0x35 = {73, 1}, + 0x36 = {74, 1}, + 0x37 = {75, 1}, + 0x38 = {76, 1}, + 0x3A = {77, 2}, + 0x3B = {79, 1}, + 0x3C = {80, 1}, + 0x3E = {81, 2}, + 0x3F = {83, 1}, } @(rodata) DECODE_INDEX_REGIMM := [32]Decode_Index{ - /* [00] */ {84, 1}, - /* [01] */ {85, 1}, - /* [02] */ {86, 1}, - /* [03] */ {87, 1}, - /* [04] */ {0, 0}, - /* [05] */ {0, 0}, - /* [06] */ {88, 1}, - /* [07] */ {0, 0}, - /* [08] */ {89, 1}, - /* [09] */ {90, 1}, - /* [10] */ {91, 1}, - /* [11] */ {92, 1}, - /* [12] */ {93, 1}, - /* [13] */ {0, 0}, - /* [14] */ {94, 1}, - /* [15] */ {0, 0}, - /* [16] */ {95, 1}, - /* [17] */ {96, 1}, - /* [18] */ {97, 1}, - /* [19] */ {98, 1}, - /* [20] */ {0, 0}, - /* [21] */ {0, 0}, - /* [22] */ {0, 0}, - /* [23] */ {99, 1}, - /* [24] */ {100, 1}, - /* [25] */ {101, 1}, - /* [26] */ {0, 0}, - /* [27] */ {0, 0}, - /* [28] */ {102, 1}, - /* [29] */ {0, 0}, - /* [30] */ {103, 1}, - /* [31] */ {0, 0}, + 0x00 = {84, 1}, + 0x01 = {85, 1}, + 0x02 = {86, 1}, + 0x03 = {87, 1}, + 0x06 = {88, 1}, + 0x08 = {89, 1}, + 0x09 = {90, 1}, + 0x0A = {91, 1}, + 0x0B = {92, 1}, + 0x0C = {93, 1}, + 0x0E = {94, 1}, + 0x10 = {95, 1}, + 0x11 = {96, 1}, + 0x12 = {97, 1}, + 0x13 = {98, 1}, + 0x17 = {99, 1}, + 0x18 = {100, 1}, + 0x19 = {101, 1}, + 0x1C = {102, 1}, + 0x1E = {103, 1}, } @(rodata) DECODE_INDEX_COP1 := [32]Decode_Index{ - /* [00] */ {132, 1}, - /* [01] */ {133, 1}, - /* [02] */ {134, 1}, - /* [03] */ {135, 1}, - /* [04] */ {136, 1}, - /* [05] */ {137, 1}, - /* [06] */ {138, 1}, - /* [07] */ {139, 1}, - /* [08] */ {140, 4}, - /* [09] */ {144, 1}, - /* [10] */ {0, 0}, - /* [11] */ {0, 0}, - /* [12] */ {0, 0}, - /* [13] */ {145, 1}, - /* [14] */ {0, 0}, - /* [15] */ {0, 0}, - /* [16] */ {146, 37}, - /* [17] */ {183, 37}, - /* [18] */ {0, 0}, - /* [19] */ {0, 0}, - /* [20] */ {220, 2}, - /* [21] */ {222, 2}, - /* [22] */ {224, 22}, - /* [23] */ {0, 0}, - /* [24] */ {0, 0}, - /* [25] */ {0, 0}, - /* [26] */ {0, 0}, - /* [27] */ {0, 0}, - /* [28] */ {0, 0}, - /* [29] */ {0, 0}, - /* [30] */ {0, 0}, - /* [31] */ {0, 0}, + 0x00 = {132, 1}, + 0x01 = {133, 1}, + 0x02 = {134, 1}, + 0x03 = {135, 1}, + 0x04 = {136, 1}, + 0x05 = {137, 1}, + 0x06 = {138, 1}, + 0x07 = {139, 1}, + 0x08 = {140, 4}, + 0x09 = {144, 1}, + 0x0D = {145, 1}, + 0x10 = {146, 37}, + 0x11 = {183, 37}, + 0x14 = {220, 2}, + 0x15 = {222, 2}, + 0x16 = {224, 22}, } @(rodata) DECODE_INDEX_SPECIAL2 := [64]Decode_Index{ - /* [00] */ {333, 1}, - /* [01] */ {334, 1}, - /* [02] */ {335, 1}, - /* [03] */ {0, 0}, - /* [04] */ {336, 2}, - /* [05] */ {338, 1}, - /* [06] */ {0, 0}, - /* [07] */ {0, 0}, - /* [08] */ {339, 25}, - /* [09] */ {364, 26}, - /* [10] */ {0, 0}, - /* [11] */ {0, 0}, - /* [12] */ {0, 0}, - /* [13] */ {0, 0}, - /* [14] */ {0, 0}, - /* [15] */ {0, 0}, - /* [16] */ {390, 1}, - /* [17] */ {391, 1}, - /* [18] */ {392, 1}, - /* [19] */ {393, 1}, - /* [20] */ {0, 0}, - /* [21] */ {0, 0}, - /* [22] */ {0, 0}, - /* [23] */ {0, 0}, - /* [24] */ {394, 1}, - /* [25] */ {395, 1}, - /* [26] */ {396, 1}, - /* [27] */ {397, 1}, - /* [28] */ {0, 0}, - /* [29] */ {0, 0}, - /* [30] */ {0, 0}, - /* [31] */ {0, 0}, - /* [32] */ {398, 2}, - /* [33] */ {400, 2}, - /* [34] */ {0, 0}, - /* [35] */ {0, 0}, - /* [36] */ {402, 1}, - /* [37] */ {403, 1}, - /* [38] */ {0, 0}, - /* [39] */ {0, 0}, - /* [40] */ {404, 17}, - /* [41] */ {421, 8}, - /* [42] */ {0, 0}, - /* [43] */ {0, 0}, - /* [44] */ {0, 0}, - /* [45] */ {0, 0}, - /* [46] */ {0, 0}, - /* [47] */ {0, 0}, - /* [48] */ {429, 5}, - /* [49] */ {434, 1}, - /* [50] */ {0, 0}, - /* [51] */ {0, 0}, - /* [52] */ {435, 1}, - /* [53] */ {0, 0}, - /* [54] */ {436, 1}, - /* [55] */ {437, 1}, - /* [56] */ {0, 0}, - /* [57] */ {0, 0}, - /* [58] */ {0, 0}, - /* [59] */ {0, 0}, - /* [60] */ {438, 1}, - /* [61] */ {0, 0}, - /* [62] */ {439, 1}, - /* [63] */ {440, 2}, + 0x00 = {333, 1}, + 0x01 = {334, 1}, + 0x02 = {335, 1}, + 0x04 = {336, 2}, + 0x05 = {338, 1}, + 0x08 = {339, 25}, + 0x09 = {364, 26}, + 0x10 = {390, 1}, + 0x11 = {391, 1}, + 0x12 = {392, 1}, + 0x13 = {393, 1}, + 0x18 = {394, 1}, + 0x19 = {395, 1}, + 0x1A = {396, 1}, + 0x1B = {397, 1}, + 0x20 = {398, 2}, + 0x21 = {400, 2}, + 0x24 = {402, 1}, + 0x25 = {403, 1}, + 0x28 = {404, 17}, + 0x29 = {421, 8}, + 0x30 = {429, 5}, + 0x31 = {434, 1}, + 0x34 = {435, 1}, + 0x36 = {436, 1}, + 0x37 = {437, 1}, + 0x3C = {438, 1}, + 0x3E = {439, 1}, + 0x3F = {440, 2}, } @(rodata) DECODE_INDEX_SPECIAL3 := [64]Decode_Index{ - /* [00] */ {560, 2}, - /* [01] */ {562, 1}, - /* [02] */ {563, 1}, - /* [03] */ {564, 1}, - /* [04] */ {565, 1}, - /* [05] */ {566, 1}, - /* [06] */ {567, 1}, - /* [07] */ {568, 1}, - /* [08] */ {0, 0}, - /* [09] */ {0, 0}, - /* [10] */ {569, 3}, - /* [11] */ {0, 0}, - /* [12] */ {572, 1}, - /* [13] */ {0, 0}, - /* [14] */ {0, 0}, - /* [15] */ {573, 8}, - /* [16] */ {581, 12}, - /* [17] */ {0, 0}, - /* [18] */ {593, 9}, - /* [19] */ {602, 9}, - /* [20] */ {0, 0}, - /* [21] */ {0, 0}, - /* [22] */ {0, 0}, - /* [23] */ {0, 0}, - /* [24] */ {0, 0}, - /* [25] */ {0, 0}, - /* [26] */ {0, 0}, - /* [27] */ {0, 0}, - /* [28] */ {0, 0}, - /* [29] */ {0, 0}, - /* [30] */ {0, 0}, - /* [31] */ {0, 0}, - /* [32] */ {611, 5}, - /* [33] */ {0, 0}, - /* [34] */ {0, 0}, - /* [35] */ {0, 0}, - /* [36] */ {616, 4}, - /* [37] */ {0, 0}, - /* [38] */ {0, 0}, - /* [39] */ {0, 0}, - /* [40] */ {0, 0}, - /* [41] */ {0, 0}, - /* [42] */ {0, 0}, - /* [43] */ {0, 0}, - /* [44] */ {0, 0}, - /* [45] */ {0, 0}, - /* [46] */ {0, 0}, - /* [47] */ {0, 0}, - /* [48] */ {620, 9}, - /* [49] */ {0, 0}, - /* [50] */ {0, 0}, - /* [51] */ {0, 0}, - /* [52] */ {0, 0}, - /* [53] */ {0, 0}, - /* [54] */ {0, 0}, - /* [55] */ {0, 0}, - /* [56] */ {629, 9}, - /* [57] */ {0, 0}, - /* [58] */ {0, 0}, - /* [59] */ {0, 0}, - /* [60] */ {0, 0}, - /* [61] */ {0, 0}, - /* [62] */ {0, 0}, - /* [63] */ {0, 0}, + 0x00 = {560, 2}, + 0x01 = {562, 1}, + 0x02 = {563, 1}, + 0x03 = {564, 1}, + 0x04 = {565, 1}, + 0x05 = {566, 1}, + 0x06 = {567, 1}, + 0x07 = {568, 1}, + 0x0A = {569, 3}, + 0x0C = {572, 1}, + 0x0F = {573, 8}, + 0x10 = {581, 12}, + 0x12 = {593, 9}, + 0x13 = {602, 9}, + 0x20 = {611, 5}, + 0x24 = {616, 4}, + 0x30 = {620, 9}, + 0x38 = {629, 9}, } diff --git a/core/rexcode/mips/encoding_table.odin b/core/rexcode/mips/encoding_table.odin index b4b61de10..8466accf8 100644 --- a/core/rexcode/mips/encoding_table.odin +++ b/core/rexcode/mips/encoding_table.odin @@ -27,7 +27,7 @@ package rexcode_mips // 10. PS2 EE MMI [§ MMI] // 11. PSP Allegrex VFPU [§ VFPU] @(rodata) -ENCODING_TABLE: [Mnemonic][]Encoding = #partial { +ENCODING_TABLE := #partial [Mnemonic][]Encoding{ .INVALID = {}, // ========================================================================= diff --git a/core/rexcode/mips/tools/gen_decode_tables.odin b/core/rexcode/mips/tools/gen_decode_tables.odin index 5429dcc9e..ddefd3fbc 100644 --- a/core/rexcode/mips/tools/gen_decode_tables.odin +++ b/core/rexcode/mips/tools/gen_decode_tables.odin @@ -238,10 +238,8 @@ emit_range_table :: proc(sb: ^strings.Builder, name: string, ranges: []Range) { fmt.sbprintfln(sb, "@(rodata)") fmt.sbprintfln(sb, "%s := [%d]Decode_Index{{", name, len(ranges)) for r, i in ranges { - if r.count == 0 { - fmt.sbprintfln(sb, "\t/* [%2d] */ {{0, 0}},", i) - } else { - fmt.sbprintfln(sb, "\t/* [%2d] */ {{%d, %d}},", i, r.start, r.count) + if r.count != 0 { + fmt.sbprintfln(sb, "\t0x%02X = {{%d, %d}},", i, r.start, r.count) } } strings.write_string(sb, "}\n\n")