[llvm-commits] CVS: llvm/lib/Target/ARM/ARMAsmPrinter.cpp ARMISelDAGToDAG.cpp ARMInstrInfo.td
Rafael Espindola
rafael.espindola at gmail.com
Tue Oct 17 11:05:11 PDT 2006
Changes in directory llvm/lib/Target/ARM:
ARMAsmPrinter.cpp updated: 1.23 -> 1.24
ARMISelDAGToDAG.cpp updated: 1.71 -> 1.72
ARMInstrInfo.td updated: 1.60 -> 1.61
---
Log message:
initial implementation of addressing mode 5
---
Diffs of the changes: (+48 -11)
ARMAsmPrinter.cpp | 19 +++++++++++++++++++
ARMISelDAGToDAG.cpp | 9 +++++++++
ARMInstrInfo.td | 31 ++++++++++++++++++++-----------
3 files changed, 48 insertions(+), 11 deletions(-)
Index: llvm/lib/Target/ARM/ARMAsmPrinter.cpp
diff -u llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.23 llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.24
--- llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.23 Mon Oct 16 16:10:32 2006
+++ llvm/lib/Target/ARM/ARMAsmPrinter.cpp Tue Oct 17 13:04:52 2006
@@ -55,6 +55,7 @@
}
void printAddrMode1(const MachineInstr *MI, int opNum);
+ void printAddrMode5(const MachineInstr *MI, int opNum);
void printMemRegImm(const MachineInstr *MI, int opNum,
const char *Modifier = NULL) {
@@ -193,6 +194,24 @@
}
}
+void ARMAsmPrinter::printAddrMode5(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::printOperand(const MachineInstr *MI, int opNum) {
const MachineOperand &MO = MI->getOperand (opNum);
const MRegisterInfo &RI = *TM.getRegisterInfo();
Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.71 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.72
--- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.71 Mon Oct 16 16:10:32 2006
+++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Tue Oct 17 13:04:52 2006
@@ -737,6 +737,7 @@
bool SelectAddrRegImm(SDOperand N, SDOperand &Offset, SDOperand &Base);
bool SelectAddrMode1(SDOperand N, SDOperand &Arg, SDOperand &Shift,
SDOperand &ShiftType);
+ bool SelectAddrMode5(SDOperand N, SDOperand &Arg, SDOperand &Offset);
// Include the pieces autogenerated from the target description.
#include "ARMGenDAGISel.inc"
@@ -835,6 +836,14 @@
return true;
}
+bool ARMDAGToDAGISel::SelectAddrMode5(SDOperand N, SDOperand &Arg,
+ SDOperand &Offset) {
+ //TODO: detect offset
+ Offset = CurDAG->getTargetConstant(0, MVT::i32);
+ Arg = N;
+ return true;
+}
+
//register plus/minus 12 bit offset
bool ARMDAGToDAGISel::SelectAddrRegImm(SDOperand N, SDOperand &Offset,
SDOperand &Base) {
Index: llvm/lib/Target/ARM/ARMInstrInfo.td
diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.60 llvm/lib/Target/ARM/ARMInstrInfo.td:1.61
--- llvm/lib/Target/ARM/ARMInstrInfo.td:1.60 Tue Oct 17 08:36:07 2006
+++ llvm/lib/Target/ARM/ARMInstrInfo.td Tue Oct 17 13:04:52 2006
@@ -19,6 +19,12 @@
let MIOperandInfo = (ops ptr_rc, ptr_rc, i32imm);
}
+def op_addr_mode5 : Operand<iPTR> {
+ let PrintMethod = "printAddrMode5";
+ let NumMIOperands = 2;
+ let MIOperandInfo = (ops ptr_rc, i32imm);
+}
+
def memri : Operand<iPTR> {
let PrintMethod = "printMemRegImm";
let NumMIOperands = 2;
@@ -30,6 +36,9 @@
def addr_mode1 : ComplexPattern<iPTR, 3, "SelectAddrMode1", [imm, sra, shl, srl],
[]>;
+//Addressing Mode 5: VFP load/store
+def addr_mode5 : ComplexPattern<iPTR, 2, "SelectAddrMode5", [], []>;
+
//register plus/minus 12 bit offset
def iaddr : ComplexPattern<iPTR, 2, "SelectAddrRegImm", [frameindex], []>;
//register plus scaled register
@@ -285,22 +294,22 @@
def FDIVD : DFPBinOp<"fdivd", fdiv>;
// Floating Point Load
-def FLDS : InstARM<(ops FPRegs:$dst, IntRegs:$addr),
- "flds $dst, [$addr]",
- [(set FPRegs:$dst, (load IntRegs:$addr))]>;
-
-def FLDD : InstARM<(ops DFPRegs:$dst, IntRegs:$addr),
- "fldd $dst, [$addr]",
- [(set DFPRegs:$dst, (load IntRegs:$addr))]>;
+def FLDS : InstARM<(ops FPRegs:$dst, op_addr_mode5:$addr),
+ "flds $dst, $addr",
+ [(set FPRegs:$dst, (load addr_mode5:$addr))]>;
+
+def FLDD : InstARM<(ops DFPRegs:$dst, op_addr_mode5:$addr),
+ "fldd $dst, $addr",
+ [(set DFPRegs:$dst, (load addr_mode5:$addr))]>;
// Floating Point Store
-def FSTS : InstARM<(ops FPRegs:$src, IntRegs:$addr),
+def FSTS : InstARM<(ops FPRegs:$src, op_addr_mode5:$addr),
"fsts $src, [$addr]",
- [(store FPRegs:$src, IntRegs:$addr)]>;
+ [(store FPRegs:$src, addr_mode5:$addr)]>;
-def FSTD : InstARM<(ops DFPRegs:$src, IntRegs:$addr),
+def FSTD : InstARM<(ops DFPRegs:$src, op_addr_mode5:$addr),
"fstd $src, [$addr]",
- [(store DFPRegs:$src, IntRegs:$addr)]>;
+ [(store DFPRegs:$src, addr_mode5:$addr)]>;
def : Pat<(ARMcall tglobaladdr:$dst),
(bl tglobaladdr:$dst)>;
More information about the llvm-commits
mailing list