diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-02-06 19:35:46 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-02-06 19:35:46 +0000 |
commit | 8cdfe8ecf3dd14d128148c5ff0b01d74b082e3c2 (patch) | |
tree | ba950e8b8b9317ce70869505053968f6b8722ac2 /llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp | |
parent | 11d0b8df5fd8aa115fb150d296ea5706014286a1 (diff) | |
download | bcm5719-llvm-8cdfe8ecf3dd14d128148c5ff0b01d74b082e3c2.tar.gz bcm5719-llvm-8cdfe8ecf3dd14d128148c5ff0b01d74b082e3c2.zip |
[Hexagon] Update MCTargetDesc
Changes include:
- Updates to the instruction descriptor flags.
- Improvements to the packet shuffler and checker.
- Updates to the handling of certain relocations.
- Better handling of duplex instructions.
llvm-svn: 294226
Diffstat (limited to 'llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp')
-rw-r--r-- | llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp index 9a09a17767a..ffa980ca656 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp @@ -14,6 +14,7 @@ #include "Hexagon.h" #include "MCTargetDesc/HexagonBaseInfo.h" #include "MCTargetDesc/HexagonMCInstrInfo.h" +#include "MCTargetDesc/HexagonMCShuffler.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCInst.h" #include "llvm/Support/Debug.h" @@ -396,7 +397,7 @@ static bool lookForCompound(MCInstrInfo const &MCII, MCContext &Context, /// is found update the contents fo the bundle with the compound insn. /// If a compound instruction is found then the bundle will have one /// additional slot. -void HexagonMCInstrInfo::tryCompound(MCInstrInfo const &MCII, +void HexagonMCInstrInfo::tryCompound(MCInstrInfo const &MCII, MCSubtargetInfo const &STI, MCContext &Context, MCInst &MCI) { assert(HexagonMCInstrInfo::isBundle(MCI) && "Non-Bundle where Bundle expected"); @@ -405,8 +406,23 @@ void HexagonMCInstrInfo::tryCompound(MCInstrInfo const &MCII, if (MCI.size() < 2) return; + bool StartedValid = llvm::HexagonMCShuffle(false, MCII, STI, MCI); + + // Create a vector, needed to keep the order of jump instructions. + MCInst CheckList(MCI); + // Look for compounds until none are found, only update the bundle when // a compound is found. - while (lookForCompound(MCII, Context, MCI)) - ; + while (lookForCompound(MCII, Context, CheckList)) { + // Keep the original bundle around in case the shuffle fails. + MCInst OriginalBundle(MCI); + + // Need to update the bundle. + MCI = CheckList; + + if (StartedValid && !llvm::HexagonMCShuffle(false, MCII, STI, MCI)) { + DEBUG(dbgs() << "Found ERROR\n"); + MCI = OriginalBundle; + } + } } |