diff options
Diffstat (limited to 'llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp')
-rw-r--r-- | llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp index 8b262bd0248e..fee1acdbbe8a 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp @@ -81,6 +81,9 @@ void HexagonMCChecker::initReg(MCInst const &MCI, unsigned R, unsigned &PredReg, if (!MCSubRegIterator(*SRI, &RI).isValid()) // Skip super-registers used indirectly. Uses.insert(*SRI); + + if (HexagonMCInstrInfo::IsReverseVecRegPair(R)) + ReversePairs.insert(R); } void HexagonMCChecker::init(MCInst const &MCI) { @@ -133,6 +136,9 @@ void HexagonMCChecker::init(MCInst const &MCI) { if (R == Hexagon::C8) R = Hexagon::USR; + if (HexagonMCInstrInfo::IsReverseVecRegPair(R)) + ReversePairs.insert(R); + // Note register definitions, direct ones as well as indirect side-effects. // Super-registers are not tracked directly, but their components. for (MCRegAliasIterator SRI(R, &RI, !MCSubRegIterator(R, &RI).isValid()); @@ -192,7 +198,7 @@ HexagonMCChecker::HexagonMCChecker(MCContext &Context, MCInstrInfo const &MCII, MCSubtargetInfo const &STI, MCInst &mcb, MCRegisterInfo const &ri, bool ReportErrors) : Context(Context), MCB(mcb), RI(ri), MCII(MCII), STI(STI), - ReportErrors(ReportErrors) { + ReportErrors(ReportErrors), ReversePairs() { init(); } @@ -200,7 +206,10 @@ HexagonMCChecker::HexagonMCChecker(HexagonMCChecker const &Other, MCSubtargetInfo const &STI, bool CopyReportErrors) : Context(Other.Context), MCB(Other.MCB), RI(Other.RI), MCII(Other.MCII), - STI(STI), ReportErrors(CopyReportErrors ? Other.ReportErrors : false) {} + STI(STI), ReportErrors(CopyReportErrors ? Other.ReportErrors : false), + ReversePairs() { + init(); +} bool HexagonMCChecker::check(bool FullCheck) { bool chkP = checkPredicates(); @@ -218,8 +227,9 @@ bool HexagonMCChecker::check(bool FullCheck) { bool chkAXOK = checkAXOK(); bool chkCofMax1 = checkCOFMax1(); bool chkHWLoop = checkHWLoop(); + bool chkLegalVecRegPair = checkLegalVecRegPair(); bool chk = chkP && chkNV && chkR && chkRRO && chkS && chkSh && chkSl && - chkAXOK && chkCofMax1 && chkHWLoop; + chkAXOK && chkCofMax1 && chkHWLoop && chkLegalVecRegPair; return chk; } @@ -381,7 +391,7 @@ bool HexagonMCChecker::checkPredicates() { for (const auto &I : NewPreds) { unsigned P = I; - if (!Defs.count(P) || LatePreds.count(P)) { + if (!Defs.count(P) || LatePreds.count(P) || Defs.count(Hexagon::P3_0)) { // Error out if the new predicate register is not defined, // or defined "late" // (e.g., "{ if (p3.new)... ; p3 = sp1loop0(#r7:2, Rs) }"). @@ -729,3 +739,16 @@ void HexagonMCChecker::reportWarning(Twine const &Msg) { if (ReportErrors) Context.reportWarning(MCB.getLoc(), Msg); } + +bool HexagonMCChecker::checkLegalVecRegPair() { + const bool IsPermitted = STI.getFeatureBits()[Hexagon::ArchV67]; + const bool HasReversePairs = ReversePairs.size() != 0; + + if (!IsPermitted && HasReversePairs) { + for (auto R : ReversePairs) + reportError("register pair `" + Twine(RI.getName(R)) + + "' is not permitted for this architecture"); + return false; + } + return true; +} |