diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2006-08-01 12:58:43 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2006-08-01 12:58:43 +0000 |
commit | 06c1e7eacb11edd1671eabfc11291b7716be2608 (patch) | |
tree | 06b0cc45e03f3875ce8567f841e013bf61a1421b | |
parent | abf41f2e0a71274011220ec3db6d1299afd1b2c1 (diff) | |
download | external_llvm-06c1e7eacb11edd1671eabfc11291b7716be2608.zip external_llvm-06c1e7eacb11edd1671eabfc11291b7716be2608.tar.gz external_llvm-06c1e7eacb11edd1671eabfc11291b7716be2608.tar.bz2 |
implement LowerConstantPool and LowerGlobalAddress
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29433 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/ARMAsmPrinter.cpp | 4 | ||||
-rw-r--r-- | 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 91d7d70..0202832 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 << "<unknown operand type>"; abort (); break; diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp index 59704cb..1f75cff 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<ConstantPoolSDNode>(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<GlobalAddressSDNode>(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<SDOperand> 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: |