From b06d38389bddf9fc5962aecbe1b31292a71b80a5 Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Mon, 23 May 2022 16:51:46 -0700 Subject: [PATCH] DSP: Remove some magic numbers for register IDs --- Source/Core/Core/DSP/DSPAssembler.cpp | 30 +++++------ Source/Core/Core/DSP/DSPCore.h | 16 ++++-- Source/Core/Core/DSP/DSPTables.cpp | 74 +++++++++++++-------------- Source/Core/Core/DSP/DSPTables.h | 31 +++++------ 4 files changed, 80 insertions(+), 71 deletions(-) diff --git a/Source/Core/Core/DSP/DSPAssembler.cpp b/Source/Core/Core/DSP/DSPAssembler.cpp index 48165eb83f..67077f8675 100644 --- a/Source/Core/Core/DSP/DSPAssembler.cpp +++ b/Source/Core/Core/DSP/DSPAssembler.cpp @@ -22,6 +22,7 @@ #include "Common/FileUtil.h" #include "Common/StringUtil.h" +#include "Core/DSP/DSPCore.h" #include "Core/DSP/DSPDisassembler.h" #include "Core/DSP/DSPTables.h" @@ -483,17 +484,15 @@ bool DSPAssembler::VerifyParams(const DSPOPCTemplate* opc, param_t* par, size_t if ((opc->params[i].type & P_REG) && (par[i].type & P_REG)) { - // Just a temp. Should be replaced with more purposeful vars. - int value; - // modified by Hermes: test the register range - switch ((unsigned)opc->params[i].type) + switch (opc->params[i].type) { case P_REG18: case P_REG19: case P_REG1A: case P_REG1C: - value = (opc->params[i].type >> 8) & 31; + { + int value = (opc->params[i].type >> 8) & 0x1f; if ((int)par[i].val < value || (int)par[i].val > value + get_mask_shifted_down(opc->params[i].mask)) { @@ -504,8 +503,9 @@ bool DSPAssembler::VerifyParams(const DSPOPCTemplate* opc, param_t* par, size_t ShowError(AssemblerError::InvalidRegister); } break; + } case P_PRG: - if ((int)par[i].val < 0 || (int)par[i].val > 0x3) + if ((int)par[i].val < DSP_REG_AR0 || (int)par[i].val > DSP_REG_AR3) { if (type == OpcodeType::Extension) fprintf(stderr, "(ext) "); @@ -515,12 +515,12 @@ bool DSPAssembler::VerifyParams(const DSPOPCTemplate* opc, param_t* par, size_t } break; case P_ACC: - if ((int)par[i].val < 0x20 || (int)par[i].val > 0x21) + if ((int)par[i].val < DSP_REG_ACC0_FULL || (int)par[i].val > DSP_REG_ACC1_FULL) { if (type == OpcodeType::Extension) fprintf(stderr, "(ext) "); - if (par[i].val >= 0x1e && par[i].val <= 0x1f) + if (par[i].val >= DSP_REG_ACM0 && par[i].val <= DSP_REG_ACM1) { fprintf(stderr, "%i : %s ", m_code_line, m_cur_line.c_str()); fprintf(stderr, @@ -529,7 +529,7 @@ bool DSPAssembler::VerifyParams(const DSPOPCTemplate* opc, param_t* par, size_t (par[i].val & 1), (par[i].val & 1), m_code_line, current_param, static_cast(type)); } - else if (par[i].val >= 0x1c && par[i].val <= 0x1d) + else if (par[i].val >= DSP_REG_ACL0 && par[i].val <= DSP_REG_ACL1) { fprintf( stderr, @@ -543,19 +543,19 @@ bool DSPAssembler::VerifyParams(const DSPOPCTemplate* opc, param_t* par, size_t } break; case P_ACCM: - if ((int)par[i].val < 0x1e || (int)par[i].val > 0x1f) + if ((int)par[i].val < DSP_REG_ACM0 || (int)par[i].val > DSP_REG_ACM1) { if (type == OpcodeType::Extension) fprintf(stderr, "(ext) "); - if (par[i].val >= 0x1c && par[i].val <= 0x1d) + if (par[i].val >= DSP_REG_ACL0 && par[i].val <= DSP_REG_ACL1) { fprintf( stderr, "WARNING: $ACL%d register used instead of $ACM%d register Line: %d Param: %zu\n", (par[i].val & 1), (par[i].val & 1), m_code_line, current_param); } - else if (par[i].val >= 0x20 && par[i].val <= 0x21) + else if (par[i].val >= DSP_REG_ACC0_FULL && par[i].val <= DSP_REG_ACC1_FULL) { fprintf( stderr, @@ -570,12 +570,12 @@ bool DSPAssembler::VerifyParams(const DSPOPCTemplate* opc, param_t* par, size_t break; case P_ACCL: - if ((int)par[i].val < 0x1c || (int)par[i].val > 0x1d) + if ((int)par[i].val < DSP_REG_ACL0 || (int)par[i].val > DSP_REG_ACL1) { if (type == OpcodeType::Extension) fprintf(stderr, "(ext) "); - if (par[i].val >= 0x1e && par[i].val <= 0x1f) + if (par[i].val >= DSP_REG_ACM0 && par[i].val <= DSP_REG_ACM1) { fprintf(stderr, "%s ", m_cur_line.c_str()); fprintf( @@ -583,7 +583,7 @@ bool DSPAssembler::VerifyParams(const DSPOPCTemplate* opc, param_t* par, size_t "WARNING: $ACM%d register used instead of $ACL%d register Line: %d Param: %zu\n", (par[i].val & 1), (par[i].val & 1), m_code_line, current_param); } - else if (par[i].val >= 0x20 && par[i].val <= 0x21) + else if (par[i].val >= DSP_REG_ACC0_FULL && par[i].val <= DSP_REG_ACC1_FULL) { fprintf(stderr, "%s ", m_cur_line.c_str()); fprintf( diff --git a/Source/Core/Core/DSP/DSPCore.h b/Source/Core/Core/DSP/DSPCore.h index c61ac3940e..4c293fecf7 100644 --- a/Source/Core/Core/DSP/DSPCore.h +++ b/Source/Core/Core/DSP/DSPCore.h @@ -122,15 +122,23 @@ enum : int DSP_REG_AXH1 = 0x1b, // Accumulator (global) - DSP_REG_ACC0 = 0x1c, - DSP_REG_ACC1 = 0x1d, - DSP_REG_ACL0 = 0x1c, // Low accumulator DSP_REG_ACL1 = 0x1d, DSP_REG_ACM0 = 0x1e, // Mid accumulator DSP_REG_ACM1 = 0x1f, DSP_REG_ACH0 = 0x10, // Sign extended 8 bit register 0 - DSP_REG_ACH1 = 0x11 // Sign extended 8 bit register 1 + DSP_REG_ACH1 = 0x11, // Sign extended 8 bit register 1 +}; + +enum : int +{ + // Magic values used by DSPTables.h + // These do not correspond to real registers like above, but instead combined versions of the + // registers. + DSP_REG_ACC0_FULL = 0x20, + DSP_REG_ACC1_FULL = 0x21, + DSP_REG_AX0_FULL = 0x22, + DSP_REG_AX1_FULL = 0x23, }; // Hardware registers address diff --git a/Source/Core/Core/DSP/DSPTables.cpp b/Source/Core/Core/DSP/DSPTables.cpp index 9ec8aba5bc..5b93beea8e 100644 --- a/Source/Core/Core/DSP/DSPTables.cpp +++ b/Source/Core/Core/DSP/DSPTables.cpp @@ -13,7 +13,7 @@ #include "Common/CommonTypes.h" #include "Common/Logging/Log.h" -#include "Core/DSP/Interpreter/DSPIntTables.h" +#include "Core/DSP/DSPCore.h" namespace DSP { @@ -451,44 +451,44 @@ const std::array pdlabels = const std::array regnames = {{ - {0x00, "AR0", "Addr Reg 00",}, - {0x01, "AR1", "Addr Reg 01",}, - {0x02, "AR2", "Addr Reg 02",}, - {0x03, "AR3", "Addr Reg 03",}, - {0x04, "IX0", "Index Reg 0",}, - {0x05, "IX1", "Index Reg 1",}, - {0x06, "IX2", "Index Reg 2",}, - {0x07, "IX3", "Index Reg 3",}, - {0x08, "WR0", "Wrapping Register 0",}, - {0x09, "WR1", "Wrapping Register 1",}, - {0x0a, "WR2", "Wrapping Register 2",}, - {0x0b, "WR3", "Wrapping Register 3",}, - {0x0c, "ST0", "Call stack",}, - {0x0d, "ST1", "Data stack",}, - {0x0e, "ST2", "Loop addr stack",}, - {0x0f, "ST3", "Loop counter stack",}, - {0x10, "AC0.H", "Accu High 0",}, - {0x11, "AC1.H", "Accu High 1",}, - {0x12, "CR", "Config Register",}, - {0x13, "SR", "Special Register",}, - {0x14, "PROD.L", "Prod L",}, - {0x15, "PROD.M1", "Prod M1",}, - {0x16, "PROD.H", "Prod H",}, - {0x17, "PROD.M2", "Prod M2",}, - {0x18, "AX0.L", "Extra Accu L 0",}, - {0x19, "AX1.L", "Extra Accu L 1",}, - {0x1a, "AX0.H", "Extra Accu H 0",}, - {0x1b, "AX1.H", "Extra Accu H 1",}, - {0x1c, "AC0.L", "Accu Low 0",}, - {0x1d, "AC1.L", "Accu Low 1",}, - {0x1e, "AC0.M", "Accu Mid 0",}, - {0x1f, "AC1.M", "Accu Mid 1",}, + {DSP_REG_AR0, "AR0", "Addr Reg 00",}, + {DSP_REG_AR1, "AR1", "Addr Reg 01",}, + {DSP_REG_AR2, "AR2", "Addr Reg 02",}, + {DSP_REG_AR3, "AR3", "Addr Reg 03",}, + {DSP_REG_IX0, "IX0", "Index Reg 0",}, + {DSP_REG_IX1, "IX1", "Index Reg 1",}, + {DSP_REG_IX2, "IX2", "Index Reg 2",}, + {DSP_REG_IX3, "IX3", "Index Reg 3",}, + {DSP_REG_WR0, "WR0", "Wrapping Register 0",}, + {DSP_REG_WR1, "WR1", "Wrapping Register 1",}, + {DSP_REG_WR2, "WR2", "Wrapping Register 2",}, + {DSP_REG_WR3, "WR3", "Wrapping Register 3",}, + {DSP_REG_ST0, "ST0", "Call stack",}, + {DSP_REG_ST1, "ST1", "Data stack",}, + {DSP_REG_ST2, "ST2", "Loop addr stack",}, + {DSP_REG_ST3, "ST3", "Loop counter stack",}, + {DSP_REG_ACH0, "AC0.H", "Accu High 0",}, + {DSP_REG_ACH1, "AC1.H", "Accu High 1",}, + {DSP_REG_CR, "CR", "Config Register",}, + {DSP_REG_SR, "SR", "Special Register",}, + {DSP_REG_PRODL, "PROD.L", "Prod L",}, + {DSP_REG_PRODM, "PROD.M1", "Prod M1",}, + {DSP_REG_PRODH, "PROD.H", "Prod H",}, + {DSP_REG_PRODM2, "PROD.M2", "Prod M2",}, + {DSP_REG_AXL0, "AX0.L", "Extra Accu L 0",}, + {DSP_REG_AXL1, "AX1.L", "Extra Accu L 1",}, + {DSP_REG_AXH0, "AX0.H", "Extra Accu H 0",}, + {DSP_REG_AXH1, "AX1.H", "Extra Accu H 1",}, + {DSP_REG_ACL0, "AC0.L", "Accu Low 0",}, + {DSP_REG_ACL1, "AC1.L", "Accu Low 1",}, + {DSP_REG_ACM0, "AC0.M", "Accu Mid 0",}, + {DSP_REG_ACM1, "AC1.M", "Accu Mid 1",}, // To resolve combined register names. - {0x20, "ACC0", "Accu Full 0",}, - {0x21, "ACC1", "Accu Full 1",}, - {0x22, "AX0", "Extra Accu 0",}, - {0x23, "AX1", "Extra Accu 1",}, + {DSP_REG_ACC0_FULL, "ACC0", "Accu Full 0",}, + {DSP_REG_ACC1_FULL, "ACC1", "Accu Full 1",}, + {DSP_REG_AX0_FULL, "AX0", "Extra Accu 0",}, + {DSP_REG_AX1_FULL, "AX1", "Extra Accu 1",}, }}; // clang-format on diff --git a/Source/Core/Core/DSP/DSPTables.h b/Source/Core/Core/DSP/DSPTables.h index 2dead9094e..e2a90d8e7f 100644 --- a/Source/Core/Core/DSP/DSPTables.h +++ b/Source/Core/Core/DSP/DSPTables.h @@ -11,6 +11,7 @@ #include #include "Core/DSP/DSPCommon.h" +#include "Core/DSP/DSPCore.h" namespace DSP { @@ -31,23 +32,23 @@ enum partype_t P_ADDR_I = 0x0005, P_ADDR_D = 0x0006, P_REG = 0x8000, - P_REG04 = P_REG | 0x0400, // IX - P_REG08 = P_REG | 0x0800, - P_REG18 = P_REG | 0x1800, - P_REGM18 = P_REG | 0x1810, // used in multiply instructions - P_REG19 = P_REG | 0x1900, - P_REGM19 = P_REG | 0x1910, // used in multiply instructions - P_REG1A = P_REG | 0x1a80, + P_REG04 = P_REG | DSP_REG_IX0 << 8, + P_REG08 = P_REG | DSP_REG_WR0 << 8, + P_REG18 = P_REG | DSP_REG_AXL0 << 8, + P_REGM18 = P_REG | DSP_REG_AXL0 << 8 | 0x10, // used in multiply instructions + P_REG19 = P_REG | DSP_REG_AXL1 << 8, + P_REGM19 = P_REG | DSP_REG_AXL1 << 8 | 0x10, // used in multiply instructions + P_REG1A = P_REG | DSP_REG_AXH0 << 8 | 0x80, // P_ACC = P_REG | 0x1c10, // used for global accum (gcdsptool's value) - P_ACCL = P_REG | 0x1c00, // used for low part of accum - P_REG1C = P_REG | 0x1c10, // gcdsptool calls this P_ACCLM - P_ACCM = P_REG | 0x1e00, // used for mid part of accum + P_ACCL = P_REG | DSP_REG_ACL0 << 8, // used for low part of accum + P_REG1C = P_REG | DSP_REG_ACL0 << 8 | 0x10, // gcdsptool calls this P_ACCLM + P_ACCM = P_REG | DSP_REG_ACM0 << 8, // used for mid part of accum // The following are not in gcdsptool - P_ACCM_D = P_REG | 0x1e80, - P_ACC = P_REG | 0x2000, // used for full accum. - P_ACCH = P_REG | 0x1000, // used for high part of accum - P_ACC_D = P_REG | 0x2080, - P_AX = P_REG | 0x2200, + P_ACCM_D = P_REG | DSP_REG_ACM0 << 8 | 0x80, + P_ACC = P_REG | DSP_REG_ACC0_FULL << 8, // used for full accum. + P_ACCH = P_REG | DSP_REG_ACH0 << 8, // used for high part of accum + P_ACC_D = P_REG | DSP_REG_ACC0_FULL << 8 | 0x80, + P_AX = P_REG | DSP_REG_AX0_FULL << 8, P_REGS_MASK = 0x03f80, // gcdsptool's value = 0x01f80 P_REF = P_REG | 0x4000, P_PRG = P_REF | P_REG,