forked from OSchip/llvm-project
Thumb2 ldm/stm updating w/ one register in the list are LDR/STR.
rdar://10429490 llvm-svn: 144338
This commit is contained in:
parent
afad053141
commit
d9a9be269c
|
@ -4590,6 +4590,38 @@ processInstruction(MCInst &Inst,
|
|||
Inst = TmpInst;
|
||||
return true;
|
||||
}
|
||||
case ARM::t2LDMIA_UPD: {
|
||||
// If this is a load of a single register, then we should use
|
||||
// a post-indexed LDR instruction instead, per the ARM ARM.
|
||||
if (Inst.getNumOperands() != 5)
|
||||
return false;
|
||||
MCInst TmpInst;
|
||||
TmpInst.setOpcode(ARM::t2LDR_POST);
|
||||
TmpInst.addOperand(Inst.getOperand(4)); // Rt
|
||||
TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
|
||||
TmpInst.addOperand(Inst.getOperand(1)); // Rn
|
||||
TmpInst.addOperand(MCOperand::CreateImm(4));
|
||||
TmpInst.addOperand(Inst.getOperand(2)); // CondCode
|
||||
TmpInst.addOperand(Inst.getOperand(3));
|
||||
Inst = TmpInst;
|
||||
return true;
|
||||
}
|
||||
case ARM::t2STMDB_UPD: {
|
||||
// If this is a store of a single register, then we should use
|
||||
// a pre-indexed STR instruction instead, per the ARM ARM.
|
||||
if (Inst.getNumOperands() != 5)
|
||||
return false;
|
||||
MCInst TmpInst;
|
||||
TmpInst.setOpcode(ARM::t2STR_PRE);
|
||||
TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
|
||||
TmpInst.addOperand(Inst.getOperand(4)); // Rt
|
||||
TmpInst.addOperand(Inst.getOperand(1)); // Rn
|
||||
TmpInst.addOperand(MCOperand::CreateImm(-4));
|
||||
TmpInst.addOperand(Inst.getOperand(2)); // CondCode
|
||||
TmpInst.addOperand(Inst.getOperand(3));
|
||||
Inst = TmpInst;
|
||||
return true;
|
||||
}
|
||||
case ARM::LDMIA_UPD:
|
||||
// If this is a load of a single register via a 'pop', then we should use
|
||||
// a post-indexed LDR instruction instead, per the ARM ARM.
|
||||
|
|
Loading…
Reference in New Issue