mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-19 02:25:01 +00:00
Pseudo-ize the ARM 'B' instruction.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127510 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -945,6 +945,17 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
|||||||
unsigned Opc = MI->getOpcode();
|
unsigned Opc = MI->getOpcode();
|
||||||
switch (Opc) {
|
switch (Opc) {
|
||||||
default: break;
|
default: break;
|
||||||
|
case ARM::B: {
|
||||||
|
// B is just a Bcc with an 'always' predicate.
|
||||||
|
MCInst TmpInst;
|
||||||
|
LowerARMMachineInstrToMCInst(MI, TmpInst, *this);
|
||||||
|
TmpInst.setOpcode(ARM::Bcc);
|
||||||
|
// Add predicate operands.
|
||||||
|
TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
|
||||||
|
TmpInst.addOperand(MCOperand::CreateReg(0));
|
||||||
|
OutStreamer.EmitInstruction(TmpInst);
|
||||||
|
return;
|
||||||
|
}
|
||||||
case ARM::LDMIA_RET: {
|
case ARM::LDMIA_RET: {
|
||||||
// LDMIA_RET is just a normal LDMIA_UPD instruction that targets PC and as
|
// LDMIA_RET is just a normal LDMIA_UPD instruction that targets PC and as
|
||||||
// such has additional code-gen properties and scheduling information.
|
// such has additional code-gen properties and scheduling information.
|
||||||
|
@@ -1485,15 +1485,11 @@ let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let isBranch = 1, isTerminator = 1 in {
|
let isBranch = 1, isTerminator = 1 in {
|
||||||
// B is "predicable" since it can be xformed into a Bcc.
|
// B is "predicable" since it's just a Bcc with an 'always' condition.
|
||||||
let isBarrier = 1 in {
|
let isBarrier = 1 in {
|
||||||
let isPredicable = 1 in
|
let isPredicable = 1 in
|
||||||
def B : ABXI<0b1010, (outs), (ins brtarget:$target), IIC_Br,
|
def B : ARMPseudoInst<(outs), (ins brtarget:$target), Size4Bytes, IIC_Br,
|
||||||
"b\t$target", [(br bb:$target)]> {
|
[(br bb:$target)]>;
|
||||||
bits<24> target;
|
|
||||||
let Inst{31-28} = 0b1110;
|
|
||||||
let Inst{23-0} = target;
|
|
||||||
}
|
|
||||||
|
|
||||||
let isNotDuplicable = 1, isIndirectBranch = 1 in {
|
let isNotDuplicable = 1, isIndirectBranch = 1 in {
|
||||||
def BR_JTr : ARMPseudoInst<(outs),
|
def BR_JTr : ARMPseudoInst<(outs),
|
||||||
|
@@ -1592,9 +1592,6 @@ ARMDEBackend::populateInstruction(const CodeGenInstruction &CGI,
|
|||||||
// better off using the generic RSCri and RSCrs instructions.
|
// better off using the generic RSCri and RSCrs instructions.
|
||||||
if (Name == "RSCSri" || Name == "RSCSrs") return false;
|
if (Name == "RSCSri" || Name == "RSCSrs") return false;
|
||||||
|
|
||||||
// Bcc is in a more generic form than B. Ignore B when decoding.
|
|
||||||
if (Name == "B") return false;
|
|
||||||
|
|
||||||
// Ignore the non-Darwin BL instructions and the TPsoft (TLS) instruction.
|
// Ignore the non-Darwin BL instructions and the TPsoft (TLS) instruction.
|
||||||
if (Name == "BL" || Name == "BL_pred" || Name == "BLX" ||
|
if (Name == "BL" || Name == "BL_pred" || Name == "BLX" ||
|
||||||
Name == "BLX_pred" || Name == "TPsoft")
|
Name == "BLX_pred" || Name == "TPsoft")
|
||||||
|
Reference in New Issue
Block a user