From e1fbc7e8ba9d122db73e505c52221a002817df36 Mon Sep 17 00:00:00 2001 From: Colin LeMahieu Date: Fri, 13 Nov 2015 01:12:25 +0000 Subject: [PATCH] [Hexagon] Adding relaxation functionality to backend and test. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252989 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../MCTargetDesc/HexagonAsmBackend.cpp | 34 +++++++++++++++++-- test/MC/Hexagon/jumpdoublepound.s | 13 +++++++ test/MC/Hexagon/two_ext.s | 12 +++++++ 3 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 test/MC/Hexagon/jumpdoublepound.s create mode 100644 test/MC/Hexagon/two_ext.s diff --git a/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp b/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp index 99ea2fabf86..dae0654ef48 100644 --- a/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp +++ b/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp @@ -276,9 +276,37 @@ public: llvm_unreachable("Handled by fixupNeedsRelaxationAdvanced"); } - void relaxInstruction(MCInst const & /*Inst*/, - MCInst & /*Res*/) const override { - llvm_unreachable("relaxInstruction() unimplemented"); + void relaxInstruction(MCInst const & Inst, + MCInst & Res) const override { + assert(HexagonMCInstrInfo::isBundle(Inst) && + "Hexagon relaxInstruction only works on bundles"); + + Res.setOpcode(Hexagon::BUNDLE); + Res.addOperand(MCOperand::createImm(0)); + // Copy the results into the bundle. + bool Update = false; + for (auto &I : HexagonMCInstrInfo::bundleInstructions(Inst)) { + MCInst &CrntHMI = const_cast(*I.getInst()); + + // if immediate extender needed, add it in + if (*RelaxTarget == &CrntHMI) { + Update = true; + assert((HexagonMCInstrInfo::bundleSize(Res) < HEXAGON_PACKET_SIZE) && + "No room to insert extender for relaxation"); + + MCInst *HMIx = + new MCInst(HexagonMCInstrInfo::deriveExtender( + *MCII, CrntHMI, + HexagonMCInstrInfo::getExtendableOperand(*MCII, CrntHMI))); + + Res.addOperand(MCOperand::createInst(HMIx)); + *RelaxTarget = nullptr; + } + // now copy over the original instruction(the one we may have extended) + Res.addOperand(MCOperand::createInst(I.getInst())); + } + (void)Update; + assert(Update && "Didn't find relaxation target"); } bool writeNopData(uint64_t Count, diff --git a/test/MC/Hexagon/jumpdoublepound.s b/test/MC/Hexagon/jumpdoublepound.s new file mode 100644 index 00000000000..6b829360a90 --- /dev/null +++ b/test/MC/Hexagon/jumpdoublepound.s @@ -0,0 +1,13 @@ +# RUN: llvm-mc -triple=hexagon -filetype=obj %s -o - | llvm-objdump -d - | FileCheck %s + +# Verify that jump encodes correctly + + +mylabel: +# CHECK: if (p0) jump +if (p0) jump ##mylabel + +# CHECK: if (cmp.gtu(r5.new, r4)) jump:t +{ r5 = r4 + if (cmp.gtu(r5.new, r4)) jump:t ##mylabel } + diff --git a/test/MC/Hexagon/two_ext.s b/test/MC/Hexagon/two_ext.s new file mode 100644 index 00000000000..c55bcc8cd9f --- /dev/null +++ b/test/MC/Hexagon/two_ext.s @@ -0,0 +1,12 @@ +# RUN: llvm-mc -triple=hexagon -filetype=obj %s | llvm-objdump -d - | FileCheck %s + +# verify two extenders generated during relaxation +{ + if (p1) call foo_a + if (!p1) call foo_b +} +# CHECK: 00004000 { immext(#0) +# CHECK: 5d004100 if (p1) call 0x0 +# CHECK: 00004000 immext(#0) +# CHECK: 5d20c100 if (!p1) call 0x0 } + -- 2.34.1