summaryrefslogtreecommitdiffstats
path: root/llvm/utils/TableGen
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/TableGen')
-rw-r--r--llvm/utils/TableGen/X86DisassemblerTables.cpp187
-rw-r--r--llvm/utils/TableGen/X86RecognizableInstr.cpp29
-rw-r--r--llvm/utils/TableGen/X86RecognizableInstr.h2
3 files changed, 161 insertions, 57 deletions
diff --git a/llvm/utils/TableGen/X86DisassemblerTables.cpp b/llvm/utils/TableGen/X86DisassemblerTables.cpp
index 8c69dfb01a2..027cca74b52 100644
--- a/llvm/utils/TableGen/X86DisassemblerTables.cpp
+++ b/llvm/utils/TableGen/X86DisassemblerTables.cpp
@@ -357,87 +357,192 @@ static inline bool inheritsFrom(InstructionContext child,
case IC_EVEX_L2_W_OPSIZE_KZ:
return false;
case IC_EVEX_B:
- return false;
- case IC_EVEX_L_K_B:
- case IC_EVEX_L_KZ_B:
- case IC_EVEX_L_B:
- return false;
- case IC_EVEX_XS_K_B:
- case IC_EVEX_XS_KZ_B:
- return false;
- case IC_EVEX_XD_K_B:
- case IC_EVEX_XD_KZ_B:
- return false;
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_B));
case IC_EVEX_XS_B:
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_B));
case IC_EVEX_XD_B:
- case IC_EVEX_K_B:
- return false;
- case IC_EVEX_KZ_B:
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_B));
case IC_EVEX_OPSIZE_B:
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_B));
+ case IC_EVEX_K_B:
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_K_B));
+ case IC_EVEX_XS_K_B:
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_K_B));
+ case IC_EVEX_XD_K_B:
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_K_B));
case IC_EVEX_OPSIZE_K_B:
+ return (VEX_LIG && VEX_WIG &&
+ inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K_B)) ||
+ (VEX_LIG && VEX_WIG &&
+ inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_K_B));
+ case IC_EVEX_KZ_B:
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_KZ_B));
+ case IC_EVEX_XS_KZ_B:
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XS_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XS_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XS_KZ_B));
+ case IC_EVEX_XD_KZ_B:
+ return (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ_B)) ||
+ (VEX_LIG && VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_XD_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_XD_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_XD_KZ_B));
case IC_EVEX_OPSIZE_KZ_B:
- return false;
+ return (VEX_LIG && VEX_WIG &&
+ inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ_B)) ||
+ (VEX_LIG && VEX_WIG &&
+ inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ_B)) ||
+ (VEX_WIG && inheritsFrom(child, IC_EVEX_W_OPSIZE_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L_OPSIZE_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_OPSIZE_KZ_B));
case IC_EVEX_W_B:
- case IC_EVEX_W_K_B:
- case IC_EVEX_W_KZ_B:
- case IC_EVEX_W_OPSIZE_B:
- case IC_EVEX_W_OPSIZE_K_B:
- return false;
- case IC_EVEX_L_XD_B:
- case IC_EVEX_L_XD_K_B:
- case IC_EVEX_L_OPSIZE_B:
- case IC_EVEX_L_OPSIZE_K_B:
- return false;
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_B));
case IC_EVEX_W_XS_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_B));
case IC_EVEX_W_XD_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_B));
+ case IC_EVEX_W_OPSIZE_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_B));
+ case IC_EVEX_W_K_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_K_B));
case IC_EVEX_W_XS_K_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K_B));
case IC_EVEX_W_XD_K_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K_B));
+ case IC_EVEX_W_OPSIZE_K_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K_B));
+ case IC_EVEX_W_KZ_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_KZ_B));
case IC_EVEX_W_XS_KZ_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ_B));
case IC_EVEX_W_XD_KZ_B:
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ_B));
case IC_EVEX_W_OPSIZE_KZ_B:
- return false;
+ return (VEX_LIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ_B)) ||
+ (VEX_LIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ_B));
+ case IC_EVEX_L_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_B);
case IC_EVEX_L_XS_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_B);
+ case IC_EVEX_L_XD_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_B);
+ case IC_EVEX_L_OPSIZE_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_B);
+ case IC_EVEX_L_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_K_B);
case IC_EVEX_L_XS_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_K_B);
+ case IC_EVEX_L_XD_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_K_B);
+ case IC_EVEX_L_OPSIZE_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_K_B);
+ case IC_EVEX_L_KZ_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_KZ_B);
case IC_EVEX_L_XS_KZ_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XS_KZ_B);
case IC_EVEX_L_XD_KZ_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_XD_KZ_B);
case IC_EVEX_L_OPSIZE_KZ_B:
- return false;
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L_W_OPSIZE_KZ_B);
case IC_EVEX_L_W_B:
- case IC_EVEX_L_W_K_B:
case IC_EVEX_L_W_XS_B:
- case IC_EVEX_L_W_XS_K_B:
- case IC_EVEX_L_W_XS_KZ_B:
+ case IC_EVEX_L_W_XD_B:
case IC_EVEX_L_W_OPSIZE_B:
+ return false;
+ case IC_EVEX_L_W_K_B:
+ case IC_EVEX_L_W_XS_K_B:
+ case IC_EVEX_L_W_XD_K_B:
case IC_EVEX_L_W_OPSIZE_K_B:
+ return false;
case IC_EVEX_L_W_KZ_B:
- case IC_EVEX_L_W_XD_B:
- case IC_EVEX_L_W_XD_K_B:
+ case IC_EVEX_L_W_XS_KZ_B:
case IC_EVEX_L_W_XD_KZ_B:
case IC_EVEX_L_W_OPSIZE_KZ_B:
return false;
case IC_EVEX_L2_B:
- case IC_EVEX_L2_K_B:
- case IC_EVEX_L2_KZ_B:
- case IC_EVEX_L2_XS_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_B);
case IC_EVEX_L2_XS_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_B);
case IC_EVEX_L2_XD_B:
- case IC_EVEX_L2_XD_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_B);
case IC_EVEX_L2_OPSIZE_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_B);
+ case IC_EVEX_L2_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_K_B);
+ case IC_EVEX_L2_XS_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_K_B);
+ case IC_EVEX_L2_XD_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_K_B);
case IC_EVEX_L2_OPSIZE_K_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_K_B);
+ case IC_EVEX_L2_KZ_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_KZ_B);
case IC_EVEX_L2_XS_KZ_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XS_KZ_B);
case IC_EVEX_L2_XD_KZ_B:
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_XD_KZ_B);
case IC_EVEX_L2_OPSIZE_KZ_B:
- return false;
+ return VEX_WIG && inheritsFrom(child, IC_EVEX_L2_W_OPSIZE_KZ_B);
case IC_EVEX_L2_W_B:
- case IC_EVEX_L2_W_K_B:
- case IC_EVEX_L2_W_KZ_B:
case IC_EVEX_L2_W_XS_B:
- case IC_EVEX_L2_W_XS_K_B:
case IC_EVEX_L2_W_XD_B:
case IC_EVEX_L2_W_OPSIZE_B:
+ return false;
+ case IC_EVEX_L2_W_K_B:
+ case IC_EVEX_L2_W_XS_K_B:
+ case IC_EVEX_L2_W_XD_K_B:
case IC_EVEX_L2_W_OPSIZE_K_B:
+ return false;
+ case IC_EVEX_L2_W_KZ_B:
case IC_EVEX_L2_W_XS_KZ_B:
- case IC_EVEX_L2_W_XD_K_B:
case IC_EVEX_L2_W_XD_KZ_B:
case IC_EVEX_L2_W_OPSIZE_KZ_B:
return false;
diff --git a/llvm/utils/TableGen/X86RecognizableInstr.cpp b/llvm/utils/TableGen/X86RecognizableInstr.cpp
index ec8580234d1..4f5b03d7801 100644
--- a/llvm/utils/TableGen/X86RecognizableInstr.cpp
+++ b/llvm/utils/TableGen/X86RecognizableInstr.cpp
@@ -100,6 +100,9 @@ RecognizableInstr::RecognizableInstr(DisassemblerTables &tables,
HasVEX_LPrefix = Rec->getValueAsBit("hasVEX_L");
+ EncodeRC = HasEVEX_B &&
+ (Form == X86Local::MRMDestReg || Form == X86Local::MRMSrcReg);
+
// Check for 64-bit inst which does not require REX
Is32Bit = false;
Is64Bit = false;
@@ -161,7 +164,7 @@ InstructionContext RecognizableInstr::insnContext() const {
llvm_unreachable("Don't support VEX.L if EVEX_L2 is enabled");
}
// VEX_L & VEX_W
- if (HasVEX_LPrefix && VEX_WPrefix == X86Local::VEX_W1) {
+ if (!EncodeRC && HasVEX_LPrefix && VEX_WPrefix == X86Local::VEX_W1) {
if (OpPrefix == X86Local::PD)
insnContext = EVEX_KB(IC_EVEX_L_W_OPSIZE);
else if (OpPrefix == X86Local::XS)
@@ -174,7 +177,7 @@ InstructionContext RecognizableInstr::insnContext() const {
errs() << "Instruction does not use a prefix: " << Name << "\n";
llvm_unreachable("Invalid prefix");
}
- } else if (HasVEX_LPrefix) {
+ } else if (!EncodeRC && HasVEX_LPrefix) {
// VEX_L
if (OpPrefix == X86Local::PD)
insnContext = EVEX_KB(IC_EVEX_L_OPSIZE);
@@ -188,8 +191,8 @@ InstructionContext RecognizableInstr::insnContext() const {
errs() << "Instruction does not use a prefix: " << Name << "\n";
llvm_unreachable("Invalid prefix");
}
- }
- else if (HasEVEX_L2Prefix && VEX_WPrefix == X86Local::VEX_W1) {
+ } else if (!EncodeRC && HasEVEX_L2Prefix &&
+ VEX_WPrefix == X86Local::VEX_W1) {
// EVEX_L2 & VEX_W
if (OpPrefix == X86Local::PD)
insnContext = EVEX_KB(IC_EVEX_L2_W_OPSIZE);
@@ -203,7 +206,7 @@ InstructionContext RecognizableInstr::insnContext() const {
errs() << "Instruction does not use a prefix: " << Name << "\n";
llvm_unreachable("Invalid prefix");
}
- } else if (HasEVEX_L2Prefix) {
+ } else if (!EncodeRC && HasEVEX_L2Prefix) {
// EVEX_L2
if (OpPrefix == X86Local::PD)
insnContext = EVEX_KB(IC_EVEX_L2_OPSIZE);
@@ -796,18 +799,12 @@ void RecognizableInstr::emitDecodePath(DisassemblerTables &tables) const {
for (currentOpcode = opcodeToSet;
currentOpcode < opcodeToSet + 8;
++currentOpcode)
- tables.setTableFields(opcodeType,
- insnContext(),
- currentOpcode,
- *filter,
- UID, Is32Bit, IgnoresVEX_L,
+ tables.setTableFields(opcodeType, insnContext(), currentOpcode, *filter,
+ UID, Is32Bit, IgnoresVEX_L || EncodeRC,
VEX_WPrefix == X86Local::VEX_WIG, AddressSize);
} else {
- tables.setTableFields(opcodeType,
- insnContext(),
- opcodeToSet,
- *filter,
- UID, Is32Bit, IgnoresVEX_L,
+ tables.setTableFields(opcodeType, insnContext(), opcodeToSet, *filter, UID,
+ Is32Bit, IgnoresVEX_L || EncodeRC,
VEX_WPrefix == X86Local::VEX_WIG, AddressSize);
}
@@ -964,7 +961,7 @@ RecognizableInstr::immediateEncodingFromString(const std::string &s,
ENCODING("XOPCC", ENCODING_IB)
ENCODING("AVXCC", ENCODING_IB)
ENCODING("AVX512ICC", ENCODING_IB)
- ENCODING("AVX512RC", ENCODING_IB)
+ ENCODING("AVX512RC", ENCODING_IRC)
ENCODING("i16imm", ENCODING_Iv)
ENCODING("i16i8imm", ENCODING_IB)
ENCODING("i32imm", ENCODING_Iv)
diff --git a/llvm/utils/TableGen/X86RecognizableInstr.h b/llvm/utils/TableGen/X86RecognizableInstr.h
index ea99935f879..24509d16d63 100644
--- a/llvm/utils/TableGen/X86RecognizableInstr.h
+++ b/llvm/utils/TableGen/X86RecognizableInstr.h
@@ -191,6 +191,8 @@ private:
bool HasEVEX_KZ;
/// The hasEVEX_B field from the record
bool HasEVEX_B;
+ /// Indicates that the instruction uses the L and L' fields for RC.
+ bool EncodeRC;
/// The isCodeGenOnly field from the record
bool IsCodeGenOnly;
/// The ForceDisassemble field from the record
OpenPOWER on IntegriCloud