From 32bd5f4f6a374f9ab0fcbd2cf6a8561019a6fd56 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 17 Oct 2006 18:04:53 +0000 Subject: [PATCH] initial implementation of addressing mode 5 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31002 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMAsmPrinter.cpp | 19 +++++++++++++++++++ lib/Target/ARM/ARMISelDAGToDAG.cpp | 9 +++++++++ lib/Target/ARM/ARMInstrInfo.td | 29 +++++++++++++++++++---------- test/CodeGen/ARM/fpmem.ll | 14 ++++++++++++++ 4 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 test/CodeGen/ARM/fpmem.ll diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 8a0f113c5d9..f67f39aa7d0 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -55,6 +55,7 @@ namespace { } 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::printAddrMode1(const MachineInstr *MI, int opNum) { } } +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(); diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp index 905d9620e20..13dd33cc902 100644 --- a/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -737,6 +737,7 @@ public: 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 @@ bool ARMDAGToDAGISel::SelectAddrMode1(SDOperand N, 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) { diff --git a/lib/Target/ARM/ARMInstrInfo.td b/lib/Target/ARM/ARMInstrInfo.td index ff9d9e7a036..42919cfc81e 100644 --- a/lib/Target/ARM/ARMInstrInfo.td +++ b/lib/Target/ARM/ARMInstrInfo.td @@ -19,6 +19,12 @@ def op_addr_mode1 : Operand { let MIOperandInfo = (ops ptr_rc, ptr_rc, i32imm); } +def op_addr_mode5 : Operand { + let PrintMethod = "printAddrMode5"; + let NumMIOperands = 2; + let MIOperandInfo = (ops ptr_rc, i32imm); +} + def memri : Operand { let PrintMethod = "printMemRegImm"; let NumMIOperands = 2; @@ -30,6 +36,9 @@ def memri : Operand { def addr_mode1 : ComplexPattern; +//Addressing Mode 5: VFP load/store +def addr_mode5 : ComplexPattern; + //register plus/minus 12 bit offset def iaddr : ComplexPattern; //register plus scaled register @@ -285,22 +294,22 @@ def FDIVS : FPBinOp<"fdivs", fdiv>; 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 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, IntRegs:$addr), - "fldd $dst, [$addr]", - [(set DFPRegs:$dst, (load IntRegs:$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)>; diff --git a/test/CodeGen/ARM/fpmem.ll b/test/CodeGen/ARM/fpmem.ll new file mode 100644 index 00000000000..e1ea410ab00 --- /dev/null +++ b/test/CodeGen/ARM/fpmem.ll @@ -0,0 +1,14 @@ +; RUN: llvm-as < %s | llc -march=arm && +; RUN: llvm-as < %s | llc -march=arm | grep flds | wc -l | grep 2 && +; RUN: llvm-as < %s | llc -march=arm | grep "flds.*\[" | wc -l | grep 1 + +float %g(float %a) { +entry: + ret float 0.000000e+00 +} + +float %g(float* %v) { +entry: + %tmp = load float* %v + ret float %tmp +} -- 2.34.1