diff options
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 18 | ||||
| -rw-r--r-- | llvm/test/TableGen/x86-instr-mapping.inc | 48 | ||||
| -rw-r--r-- | llvm/utils/TableGen/X86InstrMappingEmitter.cpp | 18 |
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); |
