diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 2b3cfef0b..0c42618b3 100644 --- a/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -5571,22 +5571,6 @@ void OpDispatchBuilder::InstallHostSpecificOpcodeHandlers() { } void InstallOpcodeHandlers(Context::OperatingMode Mode) { - constexpr std::tuple SecondaryModRMExtensionOpTable[] = { - // REG /1 - {((0 << 3) | 0), 1, &OpDispatchBuilder::UnimplementedOp}, - {((0 << 3) | 1), 1, &OpDispatchBuilder::UnimplementedOp}, - - // REG /2 - {((1 << 3) | 0), 1, &OpDispatchBuilder::XGetBVOp}, - - // REG /3 - {((2 << 3) | 7), 1, &OpDispatchBuilder::PermissionRestrictedOp}, - - // REG /7 - {((3 << 3) | 0), 1, &OpDispatchBuilder::PermissionRestrictedOp}, - {((3 << 3) | 1), 1, &OpDispatchBuilder::RDTSCPOp}, - - }; // Top bit indicating if it needs to be repeated with {0x40, 0x80} or'd in // All OPDReg versions need it #define OPDReg(op, reg) ((1 << 15) | ((op - 0xD8) << 8) | (reg << 3)) @@ -6266,8 +6250,6 @@ void InstallOpcodeHandlers(Context::OperatingMode Mode) { } }; - InstallToTable(FEXCore::X86Tables::SecondModRMTableOps, SecondaryModRMExtensionOpTable); - FEX_CONFIG_OPT(ReducedPrecision, X87REDUCEDPRECISION); if (ReducedPrecision) { InstallToX87Table(FEXCore::X86Tables::X87Ops, X87F64OpTable); diff --git a/FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryModRMTables.h b/FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryModRMTables.h new file mode 100644 index 000000000..ceb49a05c --- /dev/null +++ b/FEXCore/Source/Interface/Core/OpcodeDispatcher/SecondaryModRMTables.h @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +#pragma once +#include "Interface/Core/OpcodeDispatcher.h" + +namespace FEXCore::IR { +constexpr inline void InstallToTable(auto& FinalTable, auto& LocalTable) { + for (auto Op : LocalTable) { + auto OpNum = std::get<0>(Op); + auto Dispatcher = std::get<2>(Op); + for (uint8_t i = 0; i < std::get<1>(Op); ++i) { + auto& TableOp = FinalTable[OpNum + i]; + if (TableOp.OpcodeDispatcher) { + LOGMAN_MSG_A_FMT("Duplicate Entry {} 0x{:x}", TableOp.Name, OpNum + i); + } + + TableOp.OpcodeDispatcher = Dispatcher; + } + } +} + +consteval inline void SecondaryModRMTables_Install(auto& FinalTable) { + constexpr std::tuple Table[] = { + // REG /1 + {((0 << 3) | 0), 1, &OpDispatchBuilder::UnimplementedOp}, + {((0 << 3) | 1), 1, &OpDispatchBuilder::UnimplementedOp}, + + // REG /2 + {((1 << 3) | 0), 1, &OpDispatchBuilder::XGetBVOp}, + + // REG /3 + {((2 << 3) | 7), 1, &OpDispatchBuilder::PermissionRestrictedOp}, + + // REG /7 + {((3 << 3) | 0), 1, &OpDispatchBuilder::PermissionRestrictedOp}, + {((3 << 3) | 1), 1, &OpDispatchBuilder::RDTSCPOp}, + }; + + InstallToTable(FinalTable, Table); +} + +} // namespace FEXCore::IR diff --git a/FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp b/FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp index 2cdc8aa86..f638444ad 100644 --- a/FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp +++ b/FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp @@ -6,6 +6,7 @@ $end_info$ */ #include "Interface/Core/X86Tables/X86Tables.h" +#include "Interface/Core/OpcodeDispatcher/SecondaryModRMTables.h" #include @@ -56,6 +57,8 @@ std::array SecondModRMTableOps = []() }; GenerateTable(&Table.at(0), SecondaryModRMExtensionOpTable, std::size(SecondaryModRMExtensionOpTable)); + + FEXCore::IR::SecondaryModRMTables_Install(Table); return Table; }();