From 5758c65983943266f02760fa95e4b9c04cafc571 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 13 Oct 2021 11:31:13 -0400 Subject: [PATCH 1/2] X86Tables: Make flag helper functions constexpr These only perform bit arithmetic, so we can allow them to be used in constexpr contexts. This allows clang to collapse quite a bit of code for the table initializing functions. For example, in InitializeVEXTables(), with these as inline (but not constexpr) functions, clang will individually put all of the table entries onto the stack. With these as constexpr functions, clang will be able to deduce that it can construct the tables at compile time and reduces the amount of generated code quite a bit. --- .../FEXCore/include/FEXCore/Debug/X86Tables.h | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/External/FEXCore/include/FEXCore/Debug/X86Tables.h b/External/FEXCore/include/FEXCore/Debug/X86Tables.h index 8d6e1d2a8..ad9a22977 100644 --- a/External/FEXCore/include/FEXCore/Debug/X86Tables.h +++ b/External/FEXCore/include/FEXCore/Debug/X86Tables.h @@ -59,13 +59,15 @@ constexpr uint32_t FLAG_OPADDR_MASK = (((1 << FLAG_OPADDR_STACKSIZE) - 1) << FLA constexpr uint32_t FLAG_OPERAND_SIZE_LAST = 0b01; constexpr uint32_t FLAG_WIDENING_SIZE_LAST = 0b10; -inline uint32_t GetSizeDstFlags(uint32_t Flags) { return (Flags >> FLAG_SIZE_DST_OFF) & SIZE_MASK; } -inline uint32_t GetSizeSrcFlags(uint32_t Flags) { return (Flags >> FLAG_SIZE_SRC_OFF) & SIZE_MASK; } +constexpr uint32_t GetSizeDstFlags(uint32_t Flags) { return (Flags >> FLAG_SIZE_DST_OFF) & SIZE_MASK; } +constexpr uint32_t GetSizeSrcFlags(uint32_t Flags) { return (Flags >> FLAG_SIZE_SRC_OFF) & SIZE_MASK; } -inline uint32_t GenSizeDstSize(uint32_t Size) { return Size << FLAG_SIZE_DST_OFF; } -inline uint32_t GenSizeSrcSize(uint32_t Size) { return Size << FLAG_SIZE_SRC_OFF; } +constexpr uint32_t GenSizeDstSize(uint32_t Size) { return Size << FLAG_SIZE_DST_OFF; } +constexpr uint32_t GenSizeSrcSize(uint32_t Size) { return Size << FLAG_SIZE_SRC_OFF; } -inline uint32_t GetOpAddr(uint32_t Flags, int Index) { return (((Flags & FLAG_OPADDR_MASK) >> FLAG_OPADDR_OFF) >> (Index * 2)) & ((1 << FLAG_OPADDR_FLAG_SIZE) - 1); } +constexpr uint32_t GetOpAddr(uint32_t Flags, uint32_t Index) { + return (((Flags & FLAG_OPADDR_MASK) >> FLAG_OPADDR_OFF) >> (Index * 2)) & ((1 << FLAG_OPADDR_FLAG_SIZE) - 1); +} inline void PushOpAddr(uint32_t *Flags, uint32_t Flag) { uint32_t TmpFlags = *Flags; @@ -349,14 +351,13 @@ constexpr uint32_t SIZE_128BIT = 0b101; constexpr uint32_t SIZE_256BIT = 0b110; constexpr uint32_t SIZE_64BITDEF = 0b111; // Default mode is 64bit instead of typical 32bit -inline uint32_t GetSizeDstFlags(uint32_t Flags) { return (Flags >> FLAGS_SIZE_DST_OFF) & SIZE_MASK; } -inline uint32_t GetSizeSrcFlags(uint32_t Flags) { return (Flags >> FLAGS_SIZE_SRC_OFF) & SIZE_MASK; } - -inline uint32_t GenFlagsDstSize(uint32_t Size) { return Size << FLAGS_SIZE_DST_OFF; } -inline uint32_t GenFlagsSrcSize(uint32_t Size) { return Size << FLAGS_SIZE_SRC_OFF; } -inline uint32_t GenFlagsSameSize(uint32_t Size) {return (Size << FLAGS_SIZE_DST_OFF) | (Size << FLAGS_SIZE_SRC_OFF); } -inline uint32_t GenFlagsSizes(uint32_t Dest, uint32_t Src) {return (Dest << FLAGS_SIZE_DST_OFF) | (Src << FLAGS_SIZE_SRC_OFF); } +constexpr uint32_t GetSizeDstFlags(uint32_t Flags) { return (Flags >> FLAGS_SIZE_DST_OFF) & SIZE_MASK; } +constexpr uint32_t GetSizeSrcFlags(uint32_t Flags) { return (Flags >> FLAGS_SIZE_SRC_OFF) & SIZE_MASK; } +constexpr uint32_t GenFlagsDstSize(uint32_t Size) { return Size << FLAGS_SIZE_DST_OFF; } +constexpr uint32_t GenFlagsSrcSize(uint32_t Size) { return Size << FLAGS_SIZE_SRC_OFF; } +constexpr uint32_t GenFlagsSameSize(uint32_t Size) { return (Size << FLAGS_SIZE_DST_OFF) | (Size << FLAGS_SIZE_SRC_OFF); } +constexpr uint32_t GenFlagsSizes(uint32_t Dest, uint32_t Src) { return (Dest << FLAGS_SIZE_DST_OFF) | (Src << FLAGS_SIZE_SRC_OFF); } // If it has an xmm subflag #define HAS_XMM_SUBFLAG(x, flag) (((x) & (FEXCore::X86Tables::InstFlags::FLAGS_XMM_FLAGS | (flag))) == (FEXCore::X86Tables::InstFlags::FLAGS_XMM_FLAGS | (flag))) @@ -365,7 +366,7 @@ inline uint32_t GenFlagsSizes(uint32_t Dest, uint32_t Src) {return (Dest << FLAG #define HAS_NON_XMM_SUBFLAG(x, flag) (((x) & (FEXCore::X86Tables::InstFlags::FLAGS_XMM_FLAGS | (flag))) == (flag)) } -auto OpToIndex = [](uint8_t Op) constexpr -> uint8_t { +constexpr uint8_t OpToIndex(uint8_t Op) { switch (Op) { // Group 1 case 0x80: return 0; @@ -391,7 +392,7 @@ auto OpToIndex = [](uint8_t Op) constexpr -> uint8_t { case 0xC7: return 1; } return 0; -}; +} using DecodedOp = DecodedInst const*; using OpDispatchPtr = void (IR::OpDispatchBuilder::*)(DecodedOp); From 8df16460d14eebeda00e3a0b3cf47c7649305400 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Wed, 13 Oct 2021 12:07:31 -0400 Subject: [PATCH 2/2] X86Tables: Mark initialization instruction tables as static constexpr While the previous change eliminated much of the codegen caused by constructing everything individually on the stack, it didn't eliminate a memcpy of all the elements onto the stack. This eliminates the memcpys by allowing the compiler to place all the data into RO and just reference that data. --- .../Source/Interface/Core/X86Tables/BaseTables.cpp | 6 +++--- .../Source/Interface/Core/X86Tables/DDDTables.cpp | 2 +- .../Source/Interface/Core/X86Tables/EVEXTables.cpp | 2 +- .../Source/Interface/Core/X86Tables/H0F38Tables.cpp | 2 +- .../Source/Interface/Core/X86Tables/H0F3ATables.cpp | 4 ++-- .../Core/X86Tables/SecondaryGroupTables.cpp | 2 +- .../Core/X86Tables/SecondaryModRMTables.cpp | 2 +- .../Interface/Core/X86Tables/SecondaryTables.cpp | 12 ++++++------ .../Source/Interface/Core/X86Tables/VEXTables.cpp | 4 ++-- .../Source/Interface/Core/X86Tables/X87Tables.cpp | 2 +- .../Source/Interface/Core/X86Tables/XOPTables.cpp | 4 ++-- 11 files changed, 21 insertions(+), 21 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/BaseTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/BaseTables.cpp index 2f9fefd2e..a7b46514a 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/BaseTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/BaseTables.cpp @@ -15,7 +15,7 @@ namespace FEXCore::X86Tables { using namespace InstFlags; void InitializeBaseTables(Context::OperatingMode Mode) { - const U8U8InfoStruct BaseOpTable[] = { + static constexpr U8U8InfoStruct BaseOpTable[] = { // Prefixes // Operand size overide {0x66, 1, X86InstInfo{"", TYPE_PREFIX, FLAGS_NONE, 0, nullptr}}, @@ -234,7 +234,7 @@ void InitializeBaseTables(Context::OperatingMode Mode) { {0xC4, 2, X86InstInfo{"", TYPE_VEX_TABLE_PREFIX, FLAGS_NONE, 0, nullptr}}, }; - const U8U8InfoStruct BaseOpTable_64[] = { + static constexpr U8U8InfoStruct BaseOpTable_64[] = { {0x06, 2, X86InstInfo{"[INV]", TYPE_INVALID, FLAGS_NONE, 0, nullptr}}, {0x0E, 1, X86InstInfo{"[INV]", TYPE_INVALID, FLAGS_NONE, 0, nullptr}}, {0x16, 2, X86InstInfo{"[INV]", TYPE_INVALID, FLAGS_NONE, 0, nullptr}}, @@ -258,7 +258,7 @@ void InitializeBaseTables(Context::OperatingMode Mode) { {0xEA, 1, X86InstInfo{"[INV]", TYPE_INVALID, FLAGS_NONE, 0, nullptr}}, }; - const U8U8InfoStruct BaseOpTable_32[] = { + static constexpr U8U8InfoStruct BaseOpTable_32[] = { {0x06, 1, X86InstInfo{"PUSH ES", TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_DEBUG_MEM_ACCESS, 0, nullptr}}, {0x07, 1, X86InstInfo{"POP ES", TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_DEF) | FLAGS_DEBUG_MEM_ACCESS, 0, nullptr}}, {0x0E, 1, X86InstInfo{"PUSH CS", TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_DEBUG_MEM_ACCESS, 0, nullptr}}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/DDDTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/DDDTables.cpp index e8ba17db3..27fb624b4 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/DDDTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/DDDTables.cpp @@ -14,7 +14,7 @@ namespace FEXCore::X86Tables { using namespace InstFlags; void InitializeDDDTables() { - const U8U8InfoStruct DDDNowOpTable[] = { + static constexpr U8U8InfoStruct DDDNowOpTable[] = { {0x0C, 1, X86InstInfo{"PI2FW", TYPE_3DNOW_INST, FLAGS_MODRM, 0, nullptr}}, {0x0D, 1, X86InstInfo{"PI2FD", TYPE_3DNOW_INST, FLAGS_MODRM, 0, nullptr}}, {0x1C, 1, X86InstInfo{"PF2IW", TYPE_3DNOW_INST, FLAGS_MODRM, 0, nullptr}}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/EVEXTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/EVEXTables.cpp index 25a0776a9..ea696e9c1 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/EVEXTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/EVEXTables.cpp @@ -14,7 +14,7 @@ namespace FEXCore::X86Tables { using namespace InstFlags; void InitializeEVEXTables() { - const U16U8InfoStruct EVEXTable[] = { + static constexpr U16U8InfoStruct EVEXTable[] = { {0x10, 1, X86InstInfo{"VMOVUPS", TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, {0x11, 1, X86InstInfo{"VMOVUPS", TYPE_INST, FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_XMM_FLAGS, 0, nullptr}}, {0x18, 1, X86InstInfo{"VBROADCASTSS", TYPE_INST, FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/H0F38Tables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/H0F38Tables.cpp index 5d9503251..9747c8ee8 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/H0F38Tables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/H0F38Tables.cpp @@ -19,7 +19,7 @@ void InitializeH0F38Tables() { constexpr uint16_t PF_38_66 = 1; constexpr uint16_t PF_38_F2 = 2; - const U16U8InfoStruct H0F38Table[] = { + static constexpr U16U8InfoStruct H0F38Table[] = { {OPD(PF_38_NONE, 0x00), 1, X86InstInfo{"PSHUFB", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0, nullptr}}, {OPD(PF_38_66, 0x00), 1, X86InstInfo{"PSHUFB", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, {OPD(PF_38_NONE, 0x01), 1, X86InstInfo{"PHADDW", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 0, nullptr}}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/H0F3ATables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/H0F3ATables.cpp index f77005f5e..1c4ed399f 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/H0F3ATables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/H0F3ATables.cpp @@ -20,7 +20,7 @@ void InitializeH0F3ATables(Context::OperatingMode Mode) { constexpr uint16_t PF_3A_NONE = 0; constexpr uint16_t PF_3A_66 = 1; - const U16U8InfoStruct H0F3ATable[] = { + static constexpr U16U8InfoStruct H0F3ATable[] = { {OPD(0, PF_3A_NONE, 0x0F), 1, X86InstInfo{"PALIGNR", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_MMX, 1, nullptr}}, {OPD(0, PF_3A_66, 0x08), 1, X86InstInfo{"ROUNDPS", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1, nullptr}}, {OPD(0, PF_3A_66, 0x09), 1, X86InstInfo{"ROUNDPD", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1, nullptr}}, @@ -52,7 +52,7 @@ void InitializeH0F3ATables(Context::OperatingMode Mode) { {OPD(0, PF_3A_66, 0xDF), 1, X86InstInfo{"AESKEYGENASSIST", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1, nullptr}}, }; - const U16U8InfoStruct H0F3ATable_64[] = { + static constexpr U16U8InfoStruct H0F3ATable_64[] = { {OPD(1, PF_3A_66, 0x0F), 1, X86InstInfo{"PALIGNR", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 1, nullptr}}, {OPD(1, PF_3A_66, 0x16), 1, X86InstInfo{"PEXTRQ", TYPE_INST, GenFlagsSizes(SIZE_64BIT, SIZE_128BIT) | FLAGS_MODRM | FLAGS_SF_MOD_DST | FLAGS_SF_DST_GPR | FLAGS_XMM_FLAGS, 1, nullptr}}, {OPD(1, PF_3A_66, 0x22), 1, X86InstInfo{"PINSRQ", TYPE_INST, GenFlagsSizes(SIZE_128BIT, SIZE_64BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS | FLAGS_SF_SRC_GPR, 1, nullptr}}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryGroupTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryGroupTables.cpp index 631f8cb9d..d2db69866 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryGroupTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryGroupTables.cpp @@ -21,7 +21,7 @@ void InitializeSecondaryGroupTables() { constexpr uint16_t PF_66 = 2; constexpr uint16_t PF_F2 = 3; - const U16U8InfoStruct SecondaryExtensionOpTable[] = { + static constexpr U16U8InfoStruct SecondaryExtensionOpTable[] = { // GROUP 1 // GROUP 2 // GROUP 3 diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp index 296396b0f..bb77a346f 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryModRMTables.cpp @@ -14,7 +14,7 @@ namespace FEXCore::X86Tables { using namespace InstFlags; void InitializeSecondaryModRMTables() { - const U8U8InfoStruct SecondaryModRMExtensionOpTable[] = { + static constexpr U8U8InfoStruct SecondaryModRMExtensionOpTable[] = { // REG /1 {((0 << 3) | 0), 1, X86InstInfo{"MONITOR", TYPE_PRIV, FLAGS_NONE, 0, nullptr}}, {((0 << 3) | 1), 1, X86InstInfo{"MWAIT", TYPE_PRIV, FLAGS_NONE, 0, nullptr}}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryTables.cpp index b467eb816..7e92d58a8 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/SecondaryTables.cpp @@ -15,7 +15,7 @@ namespace FEXCore::X86Tables { using namespace InstFlags; void InitializeSecondaryTables(Context::OperatingMode Mode) { - const U8U8InfoStruct TwoByteOpTable[] = { + static constexpr U8U8InfoStruct TwoByteOpTable[] = { // Instructions {0x00, 1, X86InstInfo{"", TYPE_GROUP_6, FLAGS_MODRM | FLAGS_NO_OVERLAY, 0, nullptr}}, {0x01, 1, X86InstInfo{"", TYPE_GROUP_7, FLAGS_NO_OVERLAY, 0, nullptr}}, @@ -266,7 +266,7 @@ void InitializeSecondaryTables(Context::OperatingMode Mode) { {0x3F, 1, X86InstInfo{"ALTINST", TYPE_INST, FLAGS_BLOCK_END | FLAGS_NO_OVERLAY | FLAGS_SETS_RIP, 0, nullptr}}, }; - const U8U8InfoStruct TwoByteOpTable_32[] = { + static constexpr U8U8InfoStruct TwoByteOpTable_32[] = { {0xA0, 1, X86InstInfo{"PUSH FS", TYPE_INST, GenFlagsSrcSize(SIZE_16BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, nullptr}}, {0xA1, 1, X86InstInfo{"POP FS", TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_DEF) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, nullptr}}, @@ -274,7 +274,7 @@ void InitializeSecondaryTables(Context::OperatingMode Mode) { {0xA9, 1, X86InstInfo{"POP GS", TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_DEF) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, nullptr}}, }; - const U8U8InfoStruct TwoByteOpTable_64[] = { + static constexpr U8U8InfoStruct TwoByteOpTable_64[] = { {0xA0, 1, X86InstInfo{"PUSH FS", TYPE_INST, GenFlagsSameSize(SIZE_64BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, nullptr}}, {0xA1, 1, X86InstInfo{"POP FS", TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_64BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, nullptr}}, @@ -282,7 +282,7 @@ void InitializeSecondaryTables(Context::OperatingMode Mode) { {0xA9, 1, X86InstInfo{"POP GS", TYPE_INST, GenFlagsSizes(SIZE_16BIT, SIZE_64BIT) | FLAGS_DEBUG_MEM_ACCESS | FLAGS_NO_OVERLAY, 0, nullptr}}, }; - const U8U8InfoStruct RepModOpTable[] = { + static constexpr U8U8InfoStruct RepModOpTable[] = { {0x0, 16, X86InstInfo{"", TYPE_COPY_OTHER, FLAGS_NONE, 0, nullptr}}, {0x10, 1, X86InstInfo{"MOVSS", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, @@ -362,7 +362,7 @@ void InitializeSecondaryTables(Context::OperatingMode Mode) { {0xFF, 1, X86InstInfo{"", TYPE_COPY_OTHER, FLAGS_NONE, 0, nullptr}}, }; - const U8U8InfoStruct RepNEModOpTable[] = { + static constexpr U8U8InfoStruct RepNEModOpTable[] = { {0x0, 16, X86InstInfo{"", TYPE_COPY_OTHER, FLAGS_NONE, 0, nullptr}}, {0x10, 1, X86InstInfo{"MOVSD", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, @@ -435,7 +435,7 @@ void InitializeSecondaryTables(Context::OperatingMode Mode) { {0xF8, 8, X86InstInfo{"", TYPE_INVALID, FLAGS_NONE, 0, nullptr}}, }; - const U8U8InfoStruct OpSizeModOpTable[] = { + static constexpr U8U8InfoStruct OpSizeModOpTable[] = { {0x0, 16, X86InstInfo{"", TYPE_COPY_OTHER, FLAGS_NONE, 0, nullptr}}, {0x10, 1, X86InstInfo{"MOVUPD", TYPE_INST, GenFlagsSameSize(SIZE_128BIT) | FLAGS_MODRM | FLAGS_XMM_FLAGS, 0, nullptr}}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp index f284524d0..6ee0958b8 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/VEXTables.cpp @@ -14,7 +14,7 @@ using namespace InstFlags; void InitializeVEXTables() { #define OPD(map_select, pp, opcode) (((map_select - 1) << 10) | (pp << 8) | (opcode)) - const U16U8InfoStruct VEXTable[] = { + static constexpr U16U8InfoStruct VEXTable[] = { // Map 0 (Reserved) // VEX Map 1 {OPD(1, 0b00, 0x10), 1, X86InstInfo{"VMOVUPS", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, @@ -486,7 +486,7 @@ void InitializeVEXTables() { #undef OPD #define OPD(group, pp, opcode) (((group - TYPE_VEX_GROUP_12) << 4) | (pp << 3) | (opcode)) - const U8U8InfoStruct VEXGroupTable[] = { + static constexpr U8U8InfoStruct VEXGroupTable[] = { {OPD(TYPE_VEX_GROUP_12, 1, 0b010), 1, X86InstInfo{"VPSRLW", TYPE_UNDEC, FLAGS_MODRM, 0, nullptr}}, {OPD(TYPE_VEX_GROUP_12, 1, 0b100), 1, X86InstInfo{"VPSRAW", TYPE_UNDEC, FLAGS_MODRM, 0, nullptr}}, {OPD(TYPE_VEX_GROUP_12, 1, 0b110), 1, X86InstInfo{"VPSLLW", TYPE_UNDEC, FLAGS_MODRM, 0, nullptr}}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/X87Tables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/X87Tables.cpp index b326bd596..d9d70e1c9 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/X87Tables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/X87Tables.cpp @@ -15,7 +15,7 @@ using namespace InstFlags; void InitializeX87Tables() { #define OPD(op, modrmop) (((op - 0xD8) << 8) | modrmop) #define OPDReg(op, reg) (((op - 0xD8) << 8) | (reg << 3)) - const U16U8InfoStruct X87OpTable[] = { + static constexpr U16U8InfoStruct X87OpTable[] = { // 0xD8 {OPDReg(0xD8, 0), 1, X86InstInfo{"FADD", TYPE_X87, FLAGS_MODRM, 0, nullptr}}, {OPDReg(0xD8, 1), 1, X86InstInfo{"FMUL", TYPE_X87, FLAGS_MODRM, 0, nullptr}}, diff --git a/External/FEXCore/Source/Interface/Core/X86Tables/XOPTables.cpp b/External/FEXCore/Source/Interface/Core/X86Tables/XOPTables.cpp index ca5fe4b6d..fb049ff62 100644 --- a/External/FEXCore/Source/Interface/Core/X86Tables/XOPTables.cpp +++ b/External/FEXCore/Source/Interface/Core/X86Tables/XOPTables.cpp @@ -20,7 +20,7 @@ void InitializeXOPTables() { constexpr uint16_t XOP_GROUP_9 = 1; constexpr uint16_t XOP_GROUP_A = 2; - const U16U8InfoStruct XOPTable[] = { + static constexpr U16U8InfoStruct XOPTable[] = { // Group 8 {OPD(XOP_GROUP_8, 0, 0x85), 1, X86InstInfo{"VPMAXSSWW", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, {OPD(XOP_GROUP_8, 0, 0x86), 1, X86InstInfo{"VPMACSSWD", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, @@ -106,7 +106,7 @@ void InitializeXOPTables() { #undef OPD #define OPD(subgroup, opcode) (((subgroup - 1) << 3) | (opcode)) - const U8U8InfoStruct XOPGroupTable[] = { + static constexpr U8U8InfoStruct XOPGroupTable[] = { // Group 1 {OPD(1, 1), 1, X86InstInfo{"BLCFILL", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}}, {OPD(1, 2), 1, X86InstInfo{"BLSFILL", TYPE_UNDEC, FLAGS_NONE, 0, nullptr}},