From 06c1e7eacb11edd1671eabfc11291b7716be2608 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 1 Aug 2006 12:58:43 +0000 Subject: [PATCH] implement LowerConstantPool and LowerGlobalAddress git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29433 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMAsmPrinter.cpp | 4 ++-- lib/Target/ARM/ARMISelDAGToDAG.cpp | 25 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 91d7d70d6fd..02028329300 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -168,8 +168,8 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int opNum) { abort(); break; case MachineOperand::MO_ConstantPoolIndex: - assert(0 && "not implemented"); - abort(); + O << PrivateGlobalPrefix << "CPI" << getFunctionNumber() + << '_' << MO.getConstantPoolIndex(); break; default: O << ""; abort (); break; diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp index 59704cb4149..1f75cff7ffb 100644 --- a/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -41,7 +41,9 @@ namespace { ARMTargetLowering::ARMTargetLowering(TargetMachine &TM) : TargetLowering(TM) { - setOperationAction(ISD::RET, MVT::Other, Custom); + setOperationAction(ISD::RET, MVT::Other, Custom); + setOperationAction(ISD::GlobalAddress, MVT::i32, Custom); + setOperationAction(ISD::ConstantPool, MVT::i32, Custom); } namespace llvm { @@ -218,6 +220,23 @@ static SDOperand LowerFORMAL_ARGUMENT(SDOperand Op, SelectionDAG &DAG, } } +static SDOperand LowerConstantPool(SDOperand Op, SelectionDAG &DAG) { + MVT::ValueType PtrVT = Op.getValueType(); + ConstantPoolSDNode *CP = cast(Op); + Constant *C = CP->get(); + SDOperand CPI = DAG.getTargetConstantPool(C, PtrVT, CP->getAlignment()); + + return CPI; +} + +static SDOperand LowerGlobalAddress(SDOperand Op, + SelectionDAG &DAG) { + GlobalValue *GV = cast(Op)->getGlobal(); + SDOperand CPAddr = DAG.getConstantPool(GV, MVT::i32, 2); + return DAG.getLoad(MVT::i32, DAG.getEntryNode(), CPAddr, + DAG.getSrcValue(NULL)); +} + static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG) { std::vector ArgValues; SDOperand Root = Op.getOperand(0); @@ -244,6 +263,10 @@ SDOperand ARMTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) { default: assert(0 && "Should not custom lower this!"); abort(); + case ISD::ConstantPool: + return LowerConstantPool(Op, DAG); + case ISD::GlobalAddress: + return LowerGlobalAddress(Op, DAG); case ISD::FORMAL_ARGUMENTS: return LowerFORMAL_ARGUMENTS(Op, DAG); case ISD::CALL: -- 2.11.0