diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp b/contrib/llvm-project/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp index 8f1e5c1c3a97..e7069819fa57 100644 --- a/contrib/llvm-project/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp +++ b/contrib/llvm-project/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp @@ -22,6 +22,7 @@ #include "llvm/MC/MCInstrInfo.h" #include "llvm/MC/MCObjectWriter.h" #include "llvm/Support/Debug.h" +#include "llvm/Support/EndianStream.h" #include "llvm/Support/TargetRegistry.h" #include <sstream> @@ -43,6 +44,7 @@ class HexagonAsmBackend : public MCAsmBackend { std::unique_ptr <MCInstrInfo> MCII; std::unique_ptr <MCInst *> RelaxTarget; MCInst * Extender; + unsigned MaxPacketSize; void ReplaceInstruction(MCCodeEmitter &E, MCRelaxableFragment &RF, MCInst &HMB) const { @@ -62,7 +64,8 @@ public: StringRef CPU) : MCAsmBackend(support::little), OSABI(OSABI), CPU(CPU), relaxedCnt(0), MCII(T.createMCInstrInfo()), RelaxTarget(new MCInst *), - Extender(nullptr) {} + Extender(nullptr), MaxPacketSize(HexagonMCInstrInfo::packetSize(CPU)) + {} std::unique_ptr<MCObjectTargetWriter> createObjectTargetWriter() const override { @@ -648,11 +651,12 @@ public: llvm_unreachable("Handled by fixupNeedsRelaxationAdvanced"); } - void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo &STI, - MCInst &Res) const override { + void relaxInstruction(MCInst &Inst, + const MCSubtargetInfo &STI) const override { assert(HexagonMCInstrInfo::isBundle(Inst) && "Hexagon relaxInstruction only works on bundles"); + MCInst Res; Res.setOpcode(Hexagon::BUNDLE); Res.addOperand(MCOperand::createImm(Inst.getOperand(0).getImm())); // Copy the results into the bundle. @@ -676,6 +680,8 @@ public: // now copy over the original instruction(the one we may have extended) Res.addOperand(MCOperand::createInst(I.getInst())); } + + Inst = std::move(Res); (void)Update; assert(Update && "Didn't find relaxation target"); } @@ -685,7 +691,7 @@ public: ParseIn = 0x00004000, // In packet parse-bits. ParseEnd = 0x0000c000; // End of packet parse-bits. - while(Count % HEXAGON_INSTR_SIZE) { + while (Count % HEXAGON_INSTR_SIZE) { LLVM_DEBUG(dbgs() << "Alignment not a multiple of the instruction size:" << Count % HEXAGON_INSTR_SIZE << "/" << HEXAGON_INSTR_SIZE << "\n"); @@ -693,11 +699,11 @@ public: OS << '\0'; } - while(Count) { + while (Count) { Count -= HEXAGON_INSTR_SIZE; // Close the packet whenever a multiple of the maximum packet size remains - uint32_t ParseBits = (Count % (HEXAGON_PACKET_SIZE * HEXAGON_INSTR_SIZE))? - ParseIn: ParseEnd; + uint32_t ParseBits = (Count % (MaxPacketSize * HEXAGON_INSTR_SIZE)) ? + ParseIn : ParseEnd; support::endian::write<uint32_t>(OS, Nopcode | ParseBits, Endian); } return true; @@ -728,7 +734,8 @@ public: MCContext &Context = Asm.getContext(); auto &RF = cast<MCRelaxableFragment>(*K); auto &Inst = const_cast<MCInst &>(RF.getInst()); - while (Size > 0 && HexagonMCInstrInfo::bundleSize(Inst) < 4) { + while (Size > 0 && + HexagonMCInstrInfo::bundleSize(Inst) < MaxPacketSize) { MCInst *Nop = new (Context) MCInst; Nop->setOpcode(Hexagon::A2_nop); Inst.addOperand(MCOperand::createInst(Nop)); |