Changes in directory llvm/lib/Target/ARM:
ARMAsmPrinter.cpp updated: 1.27 -> 1.28 ARMISelDAGToDAG.cpp updated: 1.82 -> 1.83 ARMInstrInfo.td updated: 1.73 -> 1.74 ARMRegisterInfo.cpp updated: 1.24 -> 1.25 --- Log message: initial implementation of addressing mode 2 TODO: fix lea_addri --- Diffs of the changes: (+72 -15) ARMAsmPrinter.cpp | 19 +++++++++++++++++++ ARMISelDAGToDAG.cpp | 32 +++++++++++++++++++++++++++++++- ARMInstrInfo.td | 18 +++++++++++++----- ARMRegisterInfo.cpp | 18 +++++++++--------- 4 files changed, 72 insertions(+), 15 deletions(-) Index: llvm/lib/Target/ARM/ARMAsmPrinter.cpp diff -u llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.27 llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.28 --- llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.27 Thu Nov 2 09:00:02 2006 +++ llvm/lib/Target/ARM/ARMAsmPrinter.cpp Wed Nov 8 11:07:31 2006 @@ -76,6 +76,7 @@ } void printAddrMode1(const MachineInstr *MI, int opNum); + void printAddrMode2(const MachineInstr *MI, int opNum); void printAddrMode5(const MachineInstr *MI, int opNum); void printMemRegImm(const MachineInstr *MI, int opNum, @@ -215,6 +216,24 @@ } } +void ARMAsmPrinter::printAddrMode2(const MachineInstr *MI, int opNum) { + const MachineOperand &Arg = MI->getOperand(opNum); + const MachineOperand &Offset = MI->getOperand(opNum + 1); + assert(Offset.isImmediate()); + + if (Arg.isConstantPoolIndex()) { + assert(Offset.getImmedValue() == 0); + printOperand(MI, opNum); + } else { + assert(Arg.isRegister()); + O << '['; + printOperand(MI, opNum); + O << ", "; + printOperand(MI, opNum + 1); + O << ']'; + } +} + void ARMAsmPrinter::printAddrMode5(const MachineInstr *MI, int opNum) { const MachineOperand &Arg = MI->getOperand(opNum); const MachineOperand &Offset = MI->getOperand(opNum + 1); Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.82 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.83 --- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.82 Thu Nov 2 09:00:02 2006 +++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Wed Nov 8 11:07:32 2006 @@ -754,6 +754,7 @@ bool SelectAddrRegImm(SDOperand N, SDOperand &Offset, SDOperand &Base); bool SelectAddrMode1(SDOperand N, SDOperand &Arg, SDOperand &Shift, SDOperand &ShiftType); + bool SelectAddrMode2(SDOperand N, SDOperand &Arg, SDOperand &Offset); bool SelectAddrMode5(SDOperand N, SDOperand &Arg, SDOperand &Offset); // Include the pieces autogenerated from the target description. @@ -820,7 +821,7 @@ int alignment = 2; SDOperand Addr = CurDAG->getTargetConstantPool(C, MVT::i32, alignment); SDOperand Z = CurDAG->getTargetConstant(0, MVT::i32); - SDNode *n = CurDAG->getTargetNode(ARM::ldr, MVT::i32, Z, Addr); + SDNode *n = CurDAG->getTargetNode(ARM::LDR, MVT::i32, Addr, Z); Arg = SDOperand(n, 0); } else Arg = CurDAG->getTargetConstant(val, MVT::i32); @@ -852,6 +853,35 @@ return true; } +bool ARMDAGToDAGISel::SelectAddrMode2(SDOperand N, SDOperand &Arg, + SDOperand &Offset) { + //TODO: complete and cleanup! + SDOperand Zero = CurDAG->getTargetConstant(0, MVT::i32); + if (FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N)) { + Arg = CurDAG->getTargetFrameIndex(FIN->getIndex(), MVT::i32); + Offset = Zero; + return true; + } + if (N.getOpcode() == ISD::ADD) { + short imm = 0; + if (isInt12Immediate(N.getOperand(1), imm)) { + Offset = CurDAG->getTargetConstant(imm, MVT::i32); + if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N.getOperand(0))) { + Arg = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType()); + } else { + Arg = N.getOperand(0); + } + return true; // [r+i] + } + } + Offset = Zero; + if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N)) + Arg = CurDAG->getTargetFrameIndex(FI->getIndex(), N.getValueType()); + else + Arg = N; + return true; +} + bool ARMDAGToDAGISel::SelectAddrMode5(SDOperand N, SDOperand &Arg, SDOperand &Offset) { //TODO: detect offset Index: llvm/lib/Target/ARM/ARMInstrInfo.td diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.73 llvm/lib/Target/ARM/ARMInstrInfo.td:1.74 --- llvm/lib/Target/ARM/ARMInstrInfo.td:1.73 Fri Nov 3 17:47:46 2006 +++ llvm/lib/Target/ARM/ARMInstrInfo.td Wed Nov 8 11:07:32 2006 @@ -18,6 +18,11 @@ let MIOperandInfo = (ops ptr_rc, ptr_rc, i32imm); } +def op_addr_mode2 : Operand<iPTR> { + let PrintMethod = "printAddrMode2"; + let MIOperandInfo = (ops ptr_rc, i32imm); +} + def op_addr_mode5 : Operand<iPTR> { let PrintMethod = "printAddrMode5"; let MIOperandInfo = (ops ptr_rc, i32imm); @@ -33,6 +38,9 @@ def addr_mode1 : ComplexPattern<iPTR, 3, "SelectAddrMode1", [imm, sra, shl, srl], []>; +//Addressing Mode 2: Load and Store Word or Unsigned Byte +def addr_mode2 : ComplexPattern<iPTR, 2, "SelectAddrMode2", [], []>; + //Addressing Mode 5: VFP load/store def addr_mode5 : ComplexPattern<iPTR, 2, "SelectAddrMode5", [], []>; @@ -157,9 +165,9 @@ def blx : InstARM<(ops IntRegs:$func, variable_ops), "blx $func", [(ARMcall IntRegs:$func)]>; } -def ldr : InstARM<(ops IntRegs:$dst, memri:$addr), +def LDR : InstARM<(ops IntRegs:$dst, op_addr_mode2:$addr), "ldr $dst, $addr", - [(set IntRegs:$dst, (load iaddr:$addr))]>; + [(set IntRegs:$dst, (load addr_mode2:$addr))]>; def LDRB : InstARM<(ops IntRegs:$dst, IntRegs:$addr), "ldrb $dst, [$addr]", @@ -177,9 +185,9 @@ "ldrsh $dst, [$addr]", [(set IntRegs:$dst, (sextloadi16 IntRegs:$addr))]>; -def str : InstARM<(ops IntRegs:$src, memri:$addr), - "str $src, $addr", - [(store IntRegs:$src, iaddr:$addr)]>; +def STR : InstARM<(ops IntRegs:$src, op_addr_mode2:$addr), + "str $src, $addr", + [(store IntRegs:$src, addr_mode2:$addr)]>; def STRB : InstARM<(ops IntRegs:$src, IntRegs:$addr), "strb $src, [$addr]", Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.24 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.25 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.24 Tue Oct 31 07:03:26 2006 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Wed Nov 8 11:07:32 2006 @@ -44,7 +44,7 @@ unsigned SrcReg, int FI, const TargetRegisterClass *RC) const { assert (RC == ARM::IntRegsRegisterClass); - BuildMI(MBB, I, ARM::str, 3).addReg(SrcReg).addImm(0).addFrameIndex(FI); + BuildMI(MBB, I, ARM::STR, 3).addReg(SrcReg).addFrameIndex(FI).addImm(0); } void ARMRegisterInfo:: @@ -52,7 +52,7 @@ unsigned DestReg, int FI, const TargetRegisterClass *RC) const { assert (RC == ARM::IntRegsRegisterClass); - BuildMI(MBB, I, ARM::ldr, 2, DestReg).addImm(0).addFrameIndex(FI); + BuildMI(MBB, I, ARM::LDR, 2, DestReg).addFrameIndex(FI).addImm(0); } void ARMRegisterInfo::copyRegToReg(MachineBasicBlock &MBB, @@ -128,12 +128,12 @@ MachineBasicBlock &MBB = *MI.getParent(); MachineFunction &MF = *MBB.getParent(); - assert (MI.getOpcode() == ARM::ldr || - MI.getOpcode() == ARM::str || + assert (MI.getOpcode() == ARM::LDR || + MI.getOpcode() == ARM::STR || MI.getOpcode() == ARM::lea_addri); - unsigned FrameIdx = 2; - unsigned OffIdx = 1; + unsigned FrameIdx = MI.getOpcode() == ARM::lea_addri ? 2 : 1; + unsigned OffIdx = MI.getOpcode() == ARM::lea_addri ? 1 : 2; int FrameIndex = MI.getOperand(FrameIdx).getFrameIndex(); @@ -195,8 +195,8 @@ .addImm(0).addImm(ARMShift::LSL); if (HasFP) { - BuildMI(MBB, MBBI, ARM::str, 3) - .addReg(ARM::R11).addImm(0).addReg(ARM::R13); + BuildMI(MBB, MBBI, ARM::STR, 3) + .addReg(ARM::R11).addReg(ARM::R13).addImm(0); BuildMI(MBB, MBBI, ARM::MOV, 3, ARM::R11).addReg(ARM::R13).addImm(0). addImm(ARMShift::LSL); } @@ -214,7 +214,7 @@ if (hasFP(MF)) { BuildMI(MBB, MBBI, ARM::MOV, 3, ARM::R13).addReg(ARM::R11).addImm(0). addImm(ARMShift::LSL); - BuildMI(MBB, MBBI, ARM::ldr, 2, ARM::R11).addImm(0).addReg(ARM::R13); + BuildMI(MBB, MBBI, ARM::LDR, 2, ARM::R11).addReg(ARM::R13).addImm(0); } //add sp, sp, #NumBytes _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits