forked from OSchip/llvm-project
Simple branch relaxation for Thumb2 Bcc instructions.
Not right yet, as the rules for when to relax in the MCAssembler aren't (yet) correct for ARM. This is a step in the proper direction, though. llvm-svn: 145871
This commit is contained in:
parent
78309c47c7
commit
34a7c6dfd7
|
@ -124,14 +124,35 @@ public:
|
||||||
};
|
};
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
|
||||||
|
static unsigned getRelaxedOpcode(unsigned Op) {
|
||||||
|
switch (Op) {
|
||||||
|
default: return Op;
|
||||||
|
case ARM::tBcc: return ARM::t2Bcc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool ARMAsmBackend::MayNeedRelaxation(const MCInst &Inst) const {
|
bool ARMAsmBackend::MayNeedRelaxation(const MCInst &Inst) const {
|
||||||
// FIXME: Thumb targets, different move constant targets..
|
if (getRelaxedOpcode(Inst.getOpcode()) != Inst.getOpcode())
|
||||||
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARMAsmBackend::RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
|
void ARMAsmBackend::RelaxInstruction(const MCInst &Inst, MCInst &Res) const {
|
||||||
assert(0 && "ARMAsmBackend::RelaxInstruction() unimplemented");
|
unsigned RelaxedOp = getRelaxedOpcode(Inst.getOpcode());
|
||||||
return;
|
|
||||||
|
// Sanity check w/ diagnostic if we get here w/ a bogus instruction.
|
||||||
|
if (RelaxedOp == Inst.getOpcode()) {
|
||||||
|
SmallString<256> Tmp;
|
||||||
|
raw_svector_ostream OS(Tmp);
|
||||||
|
Inst.dump_pretty(OS);
|
||||||
|
OS << "\n";
|
||||||
|
report_fatal_error("unexpected instruction to relax: " + OS.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// The instructions we're relaxing have (so far) the same operands.
|
||||||
|
// We just need to update to the proper opcode.
|
||||||
|
Res = Inst;
|
||||||
|
Res.setOpcode(RelaxedOp);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ARMAsmBackend::WriteNopData(uint64_t Count, MCObjectWriter *OW) const {
|
bool ARMAsmBackend::WriteNopData(uint64_t Count, MCObjectWriter *OW) const {
|
||||||
|
|
Loading…
Reference in New Issue