Files
FEX-Emu--FEX/Source/Interface/Core/X86Tables.cpp
T
Ryan Houdek 7da7880a41 Splits X86Table definitions in to multiple files
Allows YouCompleteMe to handle these files and makes recompiling less of
a pain when one line is changed.
2020-03-06 07:55:36 +02:00

126 lines
3.5 KiB
C++

#include "LogManager.h"
#include <FEXCore/Debug/X86Tables.h>
#include <array>
#include <cstdint>
#include <tuple>
#include <vector>
namespace FEXCore::X86Tables {
X86InstInfo BaseOps[MAX_PRIMARY_TABLE_SIZE];
X86InstInfo SecondBaseOps[MAX_SECOND_TABLE_SIZE];
X86InstInfo RepModOps[MAX_REP_MOD_TABLE_SIZE];
X86InstInfo RepNEModOps[MAX_REPNE_MOD_TABLE_SIZE];
X86InstInfo OpSizeModOps[MAX_OPSIZE_MOD_TABLE_SIZE];
X86InstInfo PrimaryInstGroupOps[MAX_INST_GROUP_TABLE_SIZE];
X86InstInfo SecondInstGroupOps[MAX_INST_SECOND_GROUP_TABLE_SIZE];
X86InstInfo SecondModRMTableOps[MAX_SECOND_MODRM_TABLE_SIZE];
X86InstInfo X87Ops[MAX_X87_TABLE_SIZE];
X86InstInfo DDDNowOps[MAX_3DNOW_TABLE_SIZE];
X86InstInfo H0F38TableOps[MAX_0F_38_TABLE_SIZE];
X86InstInfo H0F3ATableOps[MAX_0F_3A_TABLE_SIZE];
X86InstInfo VEXTableOps[MAX_VEX_TABLE_SIZE];
X86InstInfo VEXTableGroupOps[MAX_VEX_GROUP_TABLE_SIZE];
X86InstInfo XOPTableOps[MAX_XOP_TABLE_SIZE];
X86InstInfo XOPTableGroupOps[MAX_XOP_GROUP_TABLE_SIZE];
X86InstInfo EVEXTableOps[MAX_EVEX_TABLE_SIZE];
void InitializeBaseTables();
void InitializeSecondaryTables();
void InitializePrimaryGroupTables();
void InitializeSecondaryGroupTables();
void InitializeSecondaryModRMTables();
void InitializeX87Tables();
void InitializeDDDTables();
void InitializeH0F38Tables();
void InitializeH0F3ATables();
void InitializeVEXTables();
void InitializeXOPTables();
void InitializeEVEXTables();
#ifndef NDEBUG
uint64_t Total{};
uint64_t NumInsts{};
#endif
void InitializeInfoTables() {
using namespace FEXCore::X86Tables::InstFlags;
auto UnknownOp = X86InstInfo{"UND", TYPE_UNKNOWN, FLAGS_NONE, 0, nullptr};
for (auto &BaseOp : BaseOps)
BaseOp = UnknownOp;
for (auto &BaseOp : SecondBaseOps)
BaseOp = UnknownOp;
for (auto &BaseOp : RepModOps)
BaseOp = UnknownOp;
for (auto &BaseOp : RepNEModOps)
BaseOp = UnknownOp;
for (auto &BaseOp : OpSizeModOps)
BaseOp = UnknownOp;
for (auto &BaseOp : PrimaryInstGroupOps)
BaseOp = UnknownOp;
for (auto &BaseOp : SecondInstGroupOps)
BaseOp = UnknownOp;
for (auto &BaseOp : SecondModRMTableOps)
BaseOp = UnknownOp;
for (auto &BaseOp : X87Ops)
BaseOp = UnknownOp;
for (auto &BaseOp : DDDNowOps)
BaseOp = UnknownOp;
for (auto &BaseOp : H0F38TableOps)
BaseOp = UnknownOp;
for (auto &BaseOp : H0F3ATableOps)
BaseOp = UnknownOp;
for (auto &BaseOp : VEXTableOps)
BaseOp = UnknownOp;
for (auto &BaseOp : VEXTableGroupOps)
BaseOp = UnknownOp;
for (auto &BaseOp : XOPTableOps)
BaseOp = UnknownOp;
for (auto &BaseOp : XOPTableGroupOps)
BaseOp = UnknownOp;
for (auto &BaseOp : EVEXTableOps)
BaseOp = UnknownOp;
InitializeBaseTables();
InitializeSecondaryTables();
InitializePrimaryGroupTables();
InitializeSecondaryGroupTables();
InitializeSecondaryModRMTables();
InitializeX87Tables();
InitializeDDDTables();
InitializeH0F38Tables();
InitializeH0F3ATables();
InitializeVEXTables();
InitializeXOPTables();
InitializeEVEXTables();
#ifndef NDEBUG
auto CheckTable = [&UnknownOp](auto& FinalTable) {
for (size_t i = 0; i < FinalTable.size(); ++i) {
auto const &Op = FinalTable.at(i);
if (Op == UnknownOp) {
LogMan::Msg::A("Unknown Op: 0x%lx", i);
}
}
};
// CheckTable(BaseOps);
// CheckTable(SecondBaseOps);
// CheckTable(RepModOps);
// CheckTable(RepNEModOps);
// CheckTable(OpSizeModOps);
// CheckTable(X87Ops);
X86InstDebugInfo::InstallDebugInfo();
LogMan::Msg::D("X86Tables had %ld total insts, and %ld labeled as understood\n", Total, NumInsts);
#endif
}
}