From 2f5d548471f88b60e1b9c81f383af8d3802bade2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 14 Jun 2026 19:35:30 +0100 Subject: [PATCH] Minimize rsp decoding tables --- core/rexcode/rsp/decoding_tables.odin | 403 +++++------------- core/rexcode/rsp/encoding_table.odin | 2 +- core/rexcode/rsp/tools/gen_decode_tables.odin | 6 +- 3 files changed, 118 insertions(+), 293 deletions(-) diff --git a/core/rexcode/rsp/decoding_tables.odin b/core/rexcode/rsp/decoding_tables.odin index 76c0f7834..64868e81d 100644 --- a/core/rexcode/rsp/decoding_tables.odin +++ b/core/rexcode/rsp/decoding_tables.odin @@ -147,313 +147,140 @@ DECODE_ENTRIES := [116]Decode_Entry{ @(rodata) DECODE_INDEX_PRIMARY := [64]Decode_Index{ - /* [00] */ {0, 20}, - /* [01] */ {20, 4}, - /* [02] */ {24, 1}, - /* [03] */ {25, 1}, - /* [04] */ {26, 1}, - /* [05] */ {27, 1}, - /* [06] */ {28, 1}, - /* [07] */ {29, 1}, - /* [08] */ {30, 1}, - /* [09] */ {31, 1}, - /* [10] */ {32, 1}, - /* [11] */ {33, 1}, - /* [12] */ {34, 1}, - /* [13] */ {35, 1}, - /* [14] */ {36, 1}, - /* [15] */ {37, 1}, - /* [16] */ {38, 2}, - /* [17] */ {0, 0}, - /* [18] */ {40, 44}, - /* [19] */ {0, 0}, - /* [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] */ {84, 1}, - /* [33] */ {85, 1}, - /* [34] */ {0, 0}, - /* [35] */ {86, 1}, - /* [36] */ {87, 1}, - /* [37] */ {88, 1}, - /* [38] */ {0, 0}, - /* [39] */ {0, 0}, - /* [40] */ {89, 1}, - /* [41] */ {90, 1}, - /* [42] */ {0, 0}, - /* [43] */ {91, 1}, - /* [44] */ {0, 0}, - /* [45] */ {0, 0}, - /* [46] */ {0, 0}, - /* [47] */ {0, 0}, - /* [48] */ {0, 0}, - /* [49] */ {0, 0}, - /* [50] */ {92, 12}, - /* [51] */ {0, 0}, - /* [52] */ {0, 0}, - /* [53] */ {0, 0}, - /* [54] */ {0, 0}, - /* [55] */ {0, 0}, - /* [56] */ {0, 0}, - /* [57] */ {0, 0}, - /* [58] */ {104, 12}, - /* [59] */ {0, 0}, - /* [60] */ {0, 0}, - /* [61] */ {0, 0}, - /* [62] */ {0, 0}, - /* [63] */ {0, 0}, + 0x00 = {0, 20}, + 0x01 = {20, 4}, + 0x02 = {24, 1}, + 0x03 = {25, 1}, + 0x04 = {26, 1}, + 0x05 = {27, 1}, + 0x06 = {28, 1}, + 0x07 = {29, 1}, + 0x08 = {30, 1}, + 0x09 = {31, 1}, + 0x0A = {32, 1}, + 0x0B = {33, 1}, + 0x0C = {34, 1}, + 0x0D = {35, 1}, + 0x0E = {36, 1}, + 0x0F = {37, 1}, + 0x10 = {38, 2}, + 0x12 = {40, 44}, + 0x20 = {84, 1}, + 0x21 = {85, 1}, + 0x23 = {86, 1}, + 0x24 = {87, 1}, + 0x25 = {88, 1}, + 0x28 = {89, 1}, + 0x29 = {90, 1}, + 0x2B = {91, 1}, + 0x32 = {92, 12}, + 0x3A = {104, 12}, } @(rodata) DECODE_INDEX_SPECIAL := [64]Decode_Index{ - /* [00] */ {0, 2}, - /* [01] */ {0, 0}, - /* [02] */ {2, 1}, - /* [03] */ {3, 1}, - /* [04] */ {4, 1}, - /* [05] */ {0, 0}, - /* [06] */ {5, 1}, - /* [07] */ {6, 1}, - /* [08] */ {7, 1}, - /* [09] */ {8, 1}, - /* [10] */ {0, 0}, - /* [11] */ {0, 0}, - /* [12] */ {0, 0}, - /* [13] */ {9, 1}, - /* [14] */ {0, 0}, - /* [15] */ {0, 0}, - /* [16] */ {0, 0}, - /* [17] */ {0, 0}, - /* [18] */ {0, 0}, - /* [19] */ {0, 0}, - /* [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] */ {10, 1}, - /* [33] */ {11, 1}, - /* [34] */ {12, 1}, - /* [35] */ {13, 1}, - /* [36] */ {14, 1}, - /* [37] */ {15, 1}, - /* [38] */ {16, 1}, - /* [39] */ {17, 1}, - /* [40] */ {0, 0}, - /* [41] */ {0, 0}, - /* [42] */ {18, 1}, - /* [43] */ {19, 1}, - /* [44] */ {0, 0}, - /* [45] */ {0, 0}, - /* [46] */ {0, 0}, - /* [47] */ {0, 0}, - /* [48] */ {0, 0}, - /* [49] */ {0, 0}, - /* [50] */ {0, 0}, - /* [51] */ {0, 0}, - /* [52] */ {0, 0}, - /* [53] */ {0, 0}, - /* [54] */ {0, 0}, - /* [55] */ {0, 0}, - /* [56] */ {0, 0}, - /* [57] */ {0, 0}, - /* [58] */ {0, 0}, - /* [59] */ {0, 0}, - /* [60] */ {0, 0}, - /* [61] */ {0, 0}, - /* [62] */ {0, 0}, - /* [63] */ {0, 0}, + 0x00 = {0, 2}, + 0x02 = {2, 1}, + 0x03 = {3, 1}, + 0x04 = {4, 1}, + 0x06 = {5, 1}, + 0x07 = {6, 1}, + 0x08 = {7, 1}, + 0x09 = {8, 1}, + 0x0D = {9, 1}, + 0x20 = {10, 1}, + 0x21 = {11, 1}, + 0x22 = {12, 1}, + 0x23 = {13, 1}, + 0x24 = {14, 1}, + 0x25 = {15, 1}, + 0x26 = {16, 1}, + 0x27 = {17, 1}, + 0x2A = {18, 1}, + 0x2B = {19, 1}, } @(rodata) DECODE_INDEX_REGIMM := [32]Decode_Index{ - /* [00] */ {20, 1}, - /* [01] */ {21, 1}, - /* [02] */ {0, 0}, - /* [03] */ {0, 0}, - /* [04] */ {0, 0}, - /* [05] */ {0, 0}, - /* [06] */ {0, 0}, - /* [07] */ {0, 0}, - /* [08] */ {0, 0}, - /* [09] */ {0, 0}, - /* [10] */ {0, 0}, - /* [11] */ {0, 0}, - /* [12] */ {0, 0}, - /* [13] */ {0, 0}, - /* [14] */ {0, 0}, - /* [15] */ {0, 0}, - /* [16] */ {22, 1}, - /* [17] */ {23, 1}, - /* [18] */ {0, 0}, - /* [19] */ {0, 0}, - /* [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}, + 0x00 = {20, 1}, + 0x01 = {21, 1}, + 0x10 = {22, 1}, + 0x11 = {23, 1}, } @(rodata) DECODE_INDEX_COP2 := [64]Decode_Index{ - /* [00] */ {40, 5}, - /* [01] */ {45, 1}, - /* [02] */ {0, 0}, - /* [03] */ {0, 0}, - /* [04] */ {46, 1}, - /* [05] */ {47, 1}, - /* [06] */ {48, 1}, - /* [07] */ {49, 1}, - /* [08] */ {50, 1}, - /* [09] */ {51, 1}, - /* [10] */ {0, 0}, - /* [11] */ {0, 0}, - /* [12] */ {52, 1}, - /* [13] */ {53, 1}, - /* [14] */ {54, 1}, - /* [15] */ {55, 1}, - /* [16] */ {56, 1}, - /* [17] */ {57, 1}, - /* [18] */ {0, 0}, - /* [19] */ {58, 1}, - /* [20] */ {59, 1}, - /* [21] */ {60, 1}, - /* [22] */ {0, 0}, - /* [23] */ {0, 0}, - /* [24] */ {0, 0}, - /* [25] */ {0, 0}, - /* [26] */ {0, 0}, - /* [27] */ {0, 0}, - /* [28] */ {0, 0}, - /* [29] */ {61, 1}, - /* [30] */ {0, 0}, - /* [31] */ {0, 0}, - /* [32] */ {62, 1}, - /* [33] */ {63, 1}, - /* [34] */ {64, 1}, - /* [35] */ {65, 1}, - /* [36] */ {66, 1}, - /* [37] */ {67, 1}, - /* [38] */ {68, 1}, - /* [39] */ {69, 1}, - /* [40] */ {70, 1}, - /* [41] */ {71, 1}, - /* [42] */ {72, 1}, - /* [43] */ {73, 1}, - /* [44] */ {74, 1}, - /* [45] */ {75, 1}, - /* [46] */ {0, 0}, - /* [47] */ {0, 0}, - /* [48] */ {76, 1}, - /* [49] */ {77, 1}, - /* [50] */ {78, 1}, - /* [51] */ {79, 1}, - /* [52] */ {80, 1}, - /* [53] */ {81, 1}, - /* [54] */ {82, 1}, - /* [55] */ {83, 1}, - /* [56] */ {0, 0}, - /* [57] */ {0, 0}, - /* [58] */ {0, 0}, - /* [59] */ {0, 0}, - /* [60] */ {0, 0}, - /* [61] */ {0, 0}, - /* [62] */ {0, 0}, - /* [63] */ {0, 0}, + 0x00 = {40, 5}, + 0x01 = {45, 1}, + 0x04 = {46, 1}, + 0x05 = {47, 1}, + 0x06 = {48, 1}, + 0x07 = {49, 1}, + 0x08 = {50, 1}, + 0x09 = {51, 1}, + 0x0C = {52, 1}, + 0x0D = {53, 1}, + 0x0E = {54, 1}, + 0x0F = {55, 1}, + 0x10 = {56, 1}, + 0x11 = {57, 1}, + 0x13 = {58, 1}, + 0x14 = {59, 1}, + 0x15 = {60, 1}, + 0x1D = {61, 1}, + 0x20 = {62, 1}, + 0x21 = {63, 1}, + 0x22 = {64, 1}, + 0x23 = {65, 1}, + 0x24 = {66, 1}, + 0x25 = {67, 1}, + 0x26 = {68, 1}, + 0x27 = {69, 1}, + 0x28 = {70, 1}, + 0x29 = {71, 1}, + 0x2A = {72, 1}, + 0x2B = {73, 1}, + 0x2C = {74, 1}, + 0x2D = {75, 1}, + 0x30 = {76, 1}, + 0x31 = {77, 1}, + 0x32 = {78, 1}, + 0x33 = {79, 1}, + 0x34 = {80, 1}, + 0x35 = {81, 1}, + 0x36 = {82, 1}, + 0x37 = {83, 1}, } @(rodata) DECODE_INDEX_LWC2 := [32]Decode_Index{ - /* [00] */ {92, 1}, - /* [01] */ {93, 1}, - /* [02] */ {94, 1}, - /* [03] */ {95, 1}, - /* [04] */ {96, 1}, - /* [05] */ {97, 1}, - /* [06] */ {98, 1}, - /* [07] */ {99, 1}, - /* [08] */ {100, 1}, - /* [09] */ {101, 1}, - /* [10] */ {102, 1}, - /* [11] */ {103, 1}, - /* [12] */ {0, 0}, - /* [13] */ {0, 0}, - /* [14] */ {0, 0}, - /* [15] */ {0, 0}, - /* [16] */ {0, 0}, - /* [17] */ {0, 0}, - /* [18] */ {0, 0}, - /* [19] */ {0, 0}, - /* [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}, + 0x00 = {92, 1}, + 0x01 = {93, 1}, + 0x02 = {94, 1}, + 0x03 = {95, 1}, + 0x04 = {96, 1}, + 0x05 = {97, 1}, + 0x06 = {98, 1}, + 0x07 = {99, 1}, + 0x08 = {100, 1}, + 0x09 = {101, 1}, + 0x0A = {102, 1}, + 0x0B = {103, 1}, } @(rodata) DECODE_INDEX_SWC2 := [32]Decode_Index{ - /* [00] */ {104, 1}, - /* [01] */ {105, 1}, - /* [02] */ {106, 1}, - /* [03] */ {107, 1}, - /* [04] */ {108, 1}, - /* [05] */ {109, 1}, - /* [06] */ {110, 1}, - /* [07] */ {111, 1}, - /* [08] */ {112, 1}, - /* [09] */ {113, 1}, - /* [10] */ {114, 1}, - /* [11] */ {115, 1}, - /* [12] */ {0, 0}, - /* [13] */ {0, 0}, - /* [14] */ {0, 0}, - /* [15] */ {0, 0}, - /* [16] */ {0, 0}, - /* [17] */ {0, 0}, - /* [18] */ {0, 0}, - /* [19] */ {0, 0}, - /* [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}, + 0x00 = {104, 1}, + 0x01 = {105, 1}, + 0x02 = {106, 1}, + 0x03 = {107, 1}, + 0x04 = {108, 1}, + 0x05 = {109, 1}, + 0x06 = {110, 1}, + 0x07 = {111, 1}, + 0x08 = {112, 1}, + 0x09 = {113, 1}, + 0x0A = {114, 1}, + 0x0B = {115, 1}, } diff --git a/core/rexcode/rsp/encoding_table.odin b/core/rexcode/rsp/encoding_table.odin index ba3568e53..a96791005 100644 --- a/core/rexcode/rsp/encoding_table.odin +++ b/core/rexcode/rsp/encoding_table.odin @@ -12,7 +12,7 @@ package rexcode_rsp // Vector L/S — opcode 0x32 (LWC2) or 0x3A (SWC2) with op2 selector // at bits 15-11 and 7-bit signed offset at 6-0. @(rodata) -ENCODING_TABLE: [Mnemonic][]Encoding = #partial { +ENCODING_TABLE:= #partial [Mnemonic][]Encoding{ .INVALID = {}, // ========================================================================= diff --git a/core/rexcode/rsp/tools/gen_decode_tables.odin b/core/rexcode/rsp/tools/gen_decode_tables.odin index f683b4bdd..161a4522b 100644 --- a/core/rexcode/rsp/tools/gen_decode_tables.odin +++ b/core/rexcode/rsp/tools/gen_decode_tables.odin @@ -211,10 +211,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, " /* [%2d] */ {{0, 0}},", i) - } else { - fmt.sbprintfln(sb, " /* [%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")