aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/X86/X86InstrInfo.cpp18
-rw-r--r--llvm/test/TableGen/x86-instr-mapping.inc48
-rw-r--r--llvm/utils/TableGen/X86InstrMappingEmitter.cpp18
3 files changed, 51 insertions, 33 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp
index 999b767..24002cb 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.cpp
+++ b/llvm/lib/Target/X86/X86InstrInfo.cpp
@@ -3304,10 +3304,28 @@ static unsigned getNewOpcFromTable(ArrayRef<X86TableEntry> Table,
return (I == Table.end() || I->OldOpc != Opc) ? 0U : I->NewOpc;
}
unsigned X86::getNFVariant(unsigned Opc) {
+#if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG)
+ // Make sure the tables are sorted.
+ static std::atomic<bool> NFTableChecked(false);
+ if (!NFTableChecked.load(std::memory_order_relaxed)) {
+ assert(llvm::is_sorted(X86NFTransformTable) &&
+ "X86NFTransformTable is not sorted!");
+ NFTableChecked.store(true, std::memory_order_relaxed);
+ }
+#endif
return getNewOpcFromTable(X86NFTransformTable, Opc);
}
unsigned X86::getNonNDVariant(unsigned Opc) {
+#if defined(EXPENSIVE_CHECKS) && !defined(NDEBUG)
+ // Make sure the tables are sorted.
+ static std::atomic<bool> NDTableChecked(false);
+ if (!NDTableChecked.load(std::memory_order_relaxed)) {
+ assert(llvm::is_sorted(X86ND2NonNDTable) &&
+ "X86ND2NonNDTableis not sorted!");
+ NDTableChecked.store(true, std::memory_order_relaxed);
+ }
+#endif
return getNewOpcFromTable(X86ND2NonNDTable, Opc);
}
diff --git a/llvm/test/TableGen/x86-instr-mapping.inc b/llvm/test/TableGen/x86-instr-mapping.inc
index 4f64d4b..1629e0e 100644
--- a/llvm/test/TableGen/x86-instr-mapping.inc
+++ b/llvm/test/TableGen/x86-instr-mapping.inc
@@ -1575,29 +1575,29 @@ static bool checkPredicate(unsigned Opc, const X86Subtarget *Subtarget) {
#ifdef GET_X86_NF_TRANSFORM_TABLE
static const X86TableEntry X86NFTransformTable[] = {
+ { X86::ADD16mi, X86::ADD16mi_NF },
{ X86::ADD16mi8, X86::ADD16mi8_NF },
{ X86::ADD16mi8_ND, X86::ADD16mi8_NF_ND },
- { X86::ADD16mi, X86::ADD16mi_NF },
{ X86::ADD16mi_ND, X86::ADD16mi_NF_ND },
{ X86::ADD16mr, X86::ADD16mr_NF },
{ X86::ADD16mr_ND, X86::ADD16mr_NF_ND },
+ { X86::ADD16ri, X86::ADD16ri_NF },
{ X86::ADD16ri8, X86::ADD16ri8_NF },
{ X86::ADD16ri8_ND, X86::ADD16ri8_NF_ND },
- { X86::ADD16ri, X86::ADD16ri_NF },
{ X86::ADD16ri_ND, X86::ADD16ri_NF_ND },
{ X86::ADD16rm, X86::ADD16rm_NF },
{ X86::ADD16rm_ND, X86::ADD16rm_NF_ND },
{ X86::ADD16rr, X86::ADD16rr_NF },
{ X86::ADD16rr_ND, X86::ADD16rr_NF_ND },
+ { X86::ADD32mi, X86::ADD32mi_NF },
{ X86::ADD32mi8, X86::ADD32mi8_NF },
{ X86::ADD32mi8_ND, X86::ADD32mi8_NF_ND },
- { X86::ADD32mi, X86::ADD32mi_NF },
{ X86::ADD32mi_ND, X86::ADD32mi_NF_ND },
{ X86::ADD32mr, X86::ADD32mr_NF },
{ X86::ADD32mr_ND, X86::ADD32mr_NF_ND },
+ { X86::ADD32ri, X86::ADD32ri_NF },
{ X86::ADD32ri8, X86::ADD32ri8_NF },
{ X86::ADD32ri8_ND, X86::ADD32ri8_NF_ND },
- { X86::ADD32ri, X86::ADD32ri_NF },
{ X86::ADD32ri_ND, X86::ADD32ri_NF_ND },
{ X86::ADD32rm, X86::ADD32rm_NF },
{ X86::ADD32rm_ND, X86::ADD32rm_NF_ND },
@@ -1627,29 +1627,29 @@ static const X86TableEntry X86NFTransformTable[] = {
{ X86::ADD8rm_ND, X86::ADD8rm_NF_ND },
{ X86::ADD8rr, X86::ADD8rr_NF },
{ X86::ADD8rr_ND, X86::ADD8rr_NF_ND },
+ { X86::AND16mi, X86::AND16mi_NF },
{ X86::AND16mi8, X86::AND16mi8_NF },
{ X86::AND16mi8_ND, X86::AND16mi8_NF_ND },
- { X86::AND16mi, X86::AND16mi_NF },
{ X86::AND16mi_ND, X86::AND16mi_NF_ND },
{ X86::AND16mr, X86::AND16mr_NF },
{ X86::AND16mr_ND, X86::AND16mr_NF_ND },
+ { X86::AND16ri, X86::AND16ri_NF },
{ X86::AND16ri8, X86::AND16ri8_NF },
{ X86::AND16ri8_ND, X86::AND16ri8_NF_ND },
- { X86::AND16ri, X86::AND16ri_NF },
{ X86::AND16ri_ND, X86::AND16ri_NF_ND },
{ X86::AND16rm, X86::AND16rm_NF },
{ X86::AND16rm_ND, X86::AND16rm_NF_ND },
{ X86::AND16rr, X86::AND16rr_NF },
{ X86::AND16rr_ND, X86::AND16rr_NF_ND },
+ { X86::AND32mi, X86::AND32mi_NF },
{ X86::AND32mi8, X86::AND32mi8_NF },
{ X86::AND32mi8_ND, X86::AND32mi8_NF_ND },
- { X86::AND32mi, X86::AND32mi_NF },
{ X86::AND32mi_ND, X86::AND32mi_NF_ND },
{ X86::AND32mr, X86::AND32mr_NF },
{ X86::AND32mr_ND, X86::AND32mr_NF_ND },
+ { X86::AND32ri, X86::AND32ri_NF },
{ X86::AND32ri8, X86::AND32ri8_NF },
{ X86::AND32ri8_ND, X86::AND32ri8_NF_ND },
- { X86::AND32ri, X86::AND32ri_NF },
{ X86::AND32ri_ND, X86::AND32ri_NF_ND },
{ X86::AND32rm, X86::AND32rm_NF },
{ X86::AND32rm_ND, X86::AND32rm_NF_ND },
@@ -1739,22 +1739,22 @@ static const X86TableEntry X86NFTransformTable[] = {
{ X86::IMUL16r, X86::IMUL16r_NF },
{ X86::IMUL16rm, X86::IMUL16rm_NF },
{ X86::IMUL16rm_ND, X86::IMUL16rm_NF_ND },
- { X86::IMUL16rmi8, X86::IMUL16rmi8_NF },
{ X86::IMUL16rmi, X86::IMUL16rmi_NF },
+ { X86::IMUL16rmi8, X86::IMUL16rmi8_NF },
{ X86::IMUL16rr, X86::IMUL16rr_NF },
{ X86::IMUL16rr_ND, X86::IMUL16rr_NF_ND },
- { X86::IMUL16rri8, X86::IMUL16rri8_NF },
{ X86::IMUL16rri, X86::IMUL16rri_NF },
+ { X86::IMUL16rri8, X86::IMUL16rri8_NF },
{ X86::IMUL32m, X86::IMUL32m_NF },
{ X86::IMUL32r, X86::IMUL32r_NF },
{ X86::IMUL32rm, X86::IMUL32rm_NF },
{ X86::IMUL32rm_ND, X86::IMUL32rm_NF_ND },
- { X86::IMUL32rmi8, X86::IMUL32rmi8_NF },
{ X86::IMUL32rmi, X86::IMUL32rmi_NF },
+ { X86::IMUL32rmi8, X86::IMUL32rmi8_NF },
{ X86::IMUL32rr, X86::IMUL32rr_NF },
{ X86::IMUL32rr_ND, X86::IMUL32rr_NF_ND },
- { X86::IMUL32rri8, X86::IMUL32rri8_NF },
{ X86::IMUL32rri, X86::IMUL32rri_NF },
+ { X86::IMUL32rri8, X86::IMUL32rri8_NF },
{ X86::IMUL64m, X86::IMUL64m_NF },
{ X86::IMUL64r, X86::IMUL64r_NF },
{ X86::IMUL64rm, X86::IMUL64rm_NF },
@@ -1813,29 +1813,29 @@ static const X86TableEntry X86NFTransformTable[] = {
{ X86::NEG8m_ND, X86::NEG8m_NF_ND },
{ X86::NEG8r, X86::NEG8r_NF },
{ X86::NEG8r_ND, X86::NEG8r_NF_ND },
+ { X86::OR16mi, X86::OR16mi_NF },
{ X86::OR16mi8, X86::OR16mi8_NF },
{ X86::OR16mi8_ND, X86::OR16mi8_NF_ND },
- { X86::OR16mi, X86::OR16mi_NF },
{ X86::OR16mi_ND, X86::OR16mi_NF_ND },
{ X86::OR16mr, X86::OR16mr_NF },
{ X86::OR16mr_ND, X86::OR16mr_NF_ND },
+ { X86::OR16ri, X86::OR16ri_NF },
{ X86::OR16ri8, X86::OR16ri8_NF },
{ X86::OR16ri8_ND, X86::OR16ri8_NF_ND },
- { X86::OR16ri, X86::OR16ri_NF },
{ X86::OR16ri_ND, X86::OR16ri_NF_ND },
{ X86::OR16rm, X86::OR16rm_NF },
{ X86::OR16rm_ND, X86::OR16rm_NF_ND },
{ X86::OR16rr, X86::OR16rr_NF },
{ X86::OR16rr_ND, X86::OR16rr_NF_ND },
+ { X86::OR32mi, X86::OR32mi_NF },
{ X86::OR32mi8, X86::OR32mi8_NF },
{ X86::OR32mi8_ND, X86::OR32mi8_NF_ND },
- { X86::OR32mi, X86::OR32mi_NF },
{ X86::OR32mi_ND, X86::OR32mi_NF_ND },
{ X86::OR32mr, X86::OR32mr_NF },
{ X86::OR32mr_ND, X86::OR32mr_NF_ND },
+ { X86::OR32ri, X86::OR32ri_NF },
{ X86::OR32ri8, X86::OR32ri8_NF },
{ X86::OR32ri8_ND, X86::OR32ri8_NF_ND },
- { X86::OR32ri, X86::OR32ri_NF },
{ X86::OR32ri_ND, X86::OR32ri_NF_ND },
{ X86::OR32rm, X86::OR32rm_NF },
{ X86::OR32rm_ND, X86::OR32rm_NF_ND },
@@ -2159,29 +2159,29 @@ static const X86TableEntry X86NFTransformTable[] = {
{ X86::SHRD64rrCL_ND, X86::SHRD64rrCL_NF_ND },
{ X86::SHRD64rri8, X86::SHRD64rri8_NF },
{ X86::SHRD64rri8_ND, X86::SHRD64rri8_NF_ND },
+ { X86::SUB16mi, X86::SUB16mi_NF },
{ X86::SUB16mi8, X86::SUB16mi8_NF },
{ X86::SUB16mi8_ND, X86::SUB16mi8_NF_ND },
- { X86::SUB16mi, X86::SUB16mi_NF },
{ X86::SUB16mi_ND, X86::SUB16mi_NF_ND },
{ X86::SUB16mr, X86::SUB16mr_NF },
{ X86::SUB16mr_ND, X86::SUB16mr_NF_ND },
+ { X86::SUB16ri, X86::SUB16ri_NF },
{ X86::SUB16ri8, X86::SUB16ri8_NF },
{ X86::SUB16ri8_ND, X86::SUB16ri8_NF_ND },
- { X86::SUB16ri, X86::SUB16ri_NF },
{ X86::SUB16ri_ND, X86::SUB16ri_NF_ND },
{ X86::SUB16rm, X86::SUB16rm_NF },
{ X86::SUB16rm_ND, X86::SUB16rm_NF_ND },
{ X86::SUB16rr, X86::SUB16rr_NF },
{ X86::SUB16rr_ND, X86::SUB16rr_NF_ND },
+ { X86::SUB32mi, X86::SUB32mi_NF },
{ X86::SUB32mi8, X86::SUB32mi8_NF },
{ X86::SUB32mi8_ND, X86::SUB32mi8_NF_ND },
- { X86::SUB32mi, X86::SUB32mi_NF },
{ X86::SUB32mi_ND, X86::SUB32mi_NF_ND },
{ X86::SUB32mr, X86::SUB32mr_NF },
{ X86::SUB32mr_ND, X86::SUB32mr_NF_ND },
+ { X86::SUB32ri, X86::SUB32ri_NF },
{ X86::SUB32ri8, X86::SUB32ri8_NF },
{ X86::SUB32ri8_ND, X86::SUB32ri8_NF_ND },
- { X86::SUB32ri, X86::SUB32ri_NF },
{ X86::SUB32ri_ND, X86::SUB32ri_NF_ND },
{ X86::SUB32rm, X86::SUB32rm_NF },
{ X86::SUB32rm_ND, X86::SUB32rm_NF_ND },
@@ -2217,29 +2217,29 @@ static const X86TableEntry X86NFTransformTable[] = {
{ X86::TZCNT32rr, X86::TZCNT32rr_NF },
{ X86::TZCNT64rm, X86::TZCNT64rm_NF },
{ X86::TZCNT64rr, X86::TZCNT64rr_NF },
+ { X86::XOR16mi, X86::XOR16mi_NF },
{ X86::XOR16mi8, X86::XOR16mi8_NF },
{ X86::XOR16mi8_ND, X86::XOR16mi8_NF_ND },
- { X86::XOR16mi, X86::XOR16mi_NF },
{ X86::XOR16mi_ND, X86::XOR16mi_NF_ND },
{ X86::XOR16mr, X86::XOR16mr_NF },
{ X86::XOR16mr_ND, X86::XOR16mr_NF_ND },
+ { X86::XOR16ri, X86::XOR16ri_NF },
{ X86::XOR16ri8, X86::XOR16ri8_NF },
{ X86::XOR16ri8_ND, X86::XOR16ri8_NF_ND },
- { X86::XOR16ri, X86::XOR16ri_NF },
{ X86::XOR16ri_ND, X86::XOR16ri_NF_ND },
{ X86::XOR16rm, X86::XOR16rm_NF },
{ X86::XOR16rm_ND, X86::XOR16rm_NF_ND },
{ X86::XOR16rr, X86::XOR16rr_NF },
{ X86::XOR16rr_ND, X86::XOR16rr_NF_ND },
+ { X86::XOR32mi, X86::XOR32mi_NF },
{ X86::XOR32mi8, X86::XOR32mi8_NF },
{ X86::XOR32mi8_ND, X86::XOR32mi8_NF_ND },
- { X86::XOR32mi, X86::XOR32mi_NF },
{ X86::XOR32mi_ND, X86::XOR32mi_NF_ND },
{ X86::XOR32mr, X86::XOR32mr_NF },
{ X86::XOR32mr_ND, X86::XOR32mr_NF_ND },
+ { X86::XOR32ri, X86::XOR32ri_NF },
{ X86::XOR32ri8, X86::XOR32ri8_NF },
{ X86::XOR32ri8_ND, X86::XOR32ri8_NF_ND },
- { X86::XOR32ri, X86::XOR32ri_NF },
{ X86::XOR32ri_ND, X86::XOR32ri_NF_ND },
{ X86::XOR32rm, X86::XOR32rm_NF },
{ X86::XOR32rm_ND, X86::XOR32rm_NF_ND },
diff --git a/llvm/utils/TableGen/X86InstrMappingEmitter.cpp b/llvm/utils/TableGen/X86InstrMappingEmitter.cpp
index df43f39..5a10aba 100644
--- a/llvm/utils/TableGen/X86InstrMappingEmitter.cpp
+++ b/llvm/utils/TableGen/X86InstrMappingEmitter.cpp
@@ -275,26 +275,26 @@ void X86InstrMappingEmitter::emitNFTransformTable(
const Record *Rec = Inst->TheDef;
if (!isInteresting(Rec))
continue;
- std::string Name = Rec->getName().str();
- auto Pos = Name.find("_NF");
- if (Pos == std::string::npos)
+ StringRef Name = Rec->getName();
+ if (Name.contains("_NF"))
continue;
- if (auto *NewRec = Records.getDef(Name.erase(Pos, 3))) {
+ if (auto *NewRec = Name.consume_back("_ND")
+ ? Records.getDef(Name.str() + "_NF_ND")
+ : Records.getDef(Name.str() + "_NF")) {
#ifndef NDEBUG
auto ClobberEFLAGS = [](const Record *R) {
return llvm::any_of(
R->getValueAsListOfDefs("Defs"),
[](const Record *Def) { return Def->getName() == "EFLAGS"; });
};
- if (ClobberEFLAGS(Rec))
+ if (ClobberEFLAGS(NewRec))
report_fatal_error("EFLAGS should not be clobbered by " +
- Rec->getName());
- if (!ClobberEFLAGS(NewRec))
- report_fatal_error("EFLAGS should be clobbered by " +
NewRec->getName());
+ if (!ClobberEFLAGS(Rec))
+ report_fatal_error("EFLAGS should be clobbered by " + Rec->getName());
#endif
- Table.emplace_back(&Target.getInstruction(NewRec), Inst);
+ Table.emplace_back(Inst, &Target.getInstruction(NewRec));
}
}
printTable(Table, "X86NFTransformTable", "GET_X86_NF_TRANSFORM_TABLE", OS);