implement LowerConstantPool and LowerGlobalAddress
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 1 Aug 2006 12:58:43 +0000 (12:58 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 1 Aug 2006 12:58:43 +0000 (12:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29433 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMAsmPrinter.cpp
lib/Target/ARM/ARMISelDAGToDAG.cpp

index 91d7d70d6fd0c05b8476408f6c4942e7071ffc9c..0202832930069bdf136a06e923957a8b58f8b3d5 100644 (file)
@@ -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;
index 59704cb41497b15699e8a13788e281ed61a5781d..1f75cff7ffba5f52ce3884f377ff6dd2fc79371f 100644 (file)
@@ -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: