mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-04 22:07:27 +00:00
Fix ldrd / strd address mode matching code. It allows for +/- 8 bit offset. Also change the printer to make the scale 4 explicit.
Note, we are not yet generating these instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75181 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7b9547089f
commit
5c874172ac
@ -661,7 +661,8 @@ bool ARMDAGToDAGISel::SelectT2AddrModeImm8s4(SDValue Op, SDValue N,
|
||||
if (N.getOpcode() == ISD::ADD) {
|
||||
if (ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(N.getOperand(1))) {
|
||||
int RHSC = (int)RHS->getZExtValue();
|
||||
if (((RHSC & 0x3) == 0) && (RHSC < 0 && RHSC > -0x400)) { // 8 bits.
|
||||
if (((RHSC & 0x3) == 0) &&
|
||||
((RHSC >= 0 && RHSC < 0x400) || (RHSC < 0 && RHSC > -0x400))) { // 8 bits.
|
||||
Base = N.getOperand(0);
|
||||
OffImm = CurDAG->getTargetConstant(RHSC, MVT::i32);
|
||||
return true;
|
||||
|
@ -111,10 +111,10 @@ def t2am_imm8_offset : Operand<i32>,
|
||||
let PrintMethod = "printT2AddrModeImm8OffsetOperand";
|
||||
}
|
||||
|
||||
// t2addrmode_imm8s4 := reg + (imm8 << 2)
|
||||
// t2addrmode_imm8s4 := reg +/- (imm8 << 2)
|
||||
def t2addrmode_imm8s4 : Operand<i32>,
|
||||
ComplexPattern<i32, 2, "SelectT2AddrModeImm8s4", []> {
|
||||
let PrintMethod = "printT2AddrModeImm8Operand";
|
||||
let PrintMethod = "printT2AddrModeImm8s4Operand";
|
||||
let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
|
||||
}
|
||||
|
||||
@ -661,6 +661,7 @@ def t2PICSTRH : T2I_picst<"strh", BinOpFrag<(truncstorei16 node:$LHS, node:$RHS
|
||||
def t2PICSTRB : T2I_picst<"strb", BinOpFrag<(truncstorei8 node:$LHS, node:$RHS)>>;
|
||||
} // isNotDuplicable = 1, AddedComplexity = 10
|
||||
|
||||
// FIXME: ldrd / strd pre / post variants
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Load / store multiple Instructions.
|
||||
|
@ -122,6 +122,7 @@ namespace {
|
||||
void printT2SOOperand(const MachineInstr *MI, int OpNum);
|
||||
void printT2AddrModeImm12Operand(const MachineInstr *MI, int OpNum);
|
||||
void printT2AddrModeImm8Operand(const MachineInstr *MI, int OpNum);
|
||||
void printT2AddrModeImm8s4Operand(const MachineInstr *MI, int OpNum);
|
||||
void printT2AddrModeImm8OffsetOperand(const MachineInstr *MI, int OpNum);
|
||||
void printT2AddrModeSoRegOperand(const MachineInstr *MI, int OpNum);
|
||||
|
||||
@ -739,6 +740,22 @@ void ARMAsmPrinter::printT2AddrModeImm8Operand(const MachineInstr *MI,
|
||||
O << "]";
|
||||
}
|
||||
|
||||
void ARMAsmPrinter::printT2AddrModeImm8s4Operand(const MachineInstr *MI,
|
||||
int OpNum) {
|
||||
const MachineOperand &MO1 = MI->getOperand(OpNum);
|
||||
const MachineOperand &MO2 = MI->getOperand(OpNum+1);
|
||||
|
||||
O << "[" << TM.getRegisterInfo()->get(MO1.getReg()).AsmName;
|
||||
|
||||
int32_t OffImm = (int32_t)MO2.getImm() / 4;
|
||||
// Don't print +0.
|
||||
if (OffImm < 0)
|
||||
O << ", #-" << -OffImm << " * 4";
|
||||
else if (OffImm > 0)
|
||||
O << ", #+" << OffImm << " * 4";
|
||||
O << "]";
|
||||
}
|
||||
|
||||
void ARMAsmPrinter::printT2AddrModeImm8OffsetOperand(const MachineInstr *MI,
|
||||
int OpNum) {
|
||||
const MachineOperand &MO1 = MI->getOperand(OpNum);
|
||||
|
Loading…
Reference in New Issue
Block a user