lower the ARM::CONSTPOOL_ENTRY pseudo op, giving us constant pool entries
authorChris Lattner <sabre@nondot.org>
Mon, 19 Oct 2009 22:33:05 +0000 (22:33 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 19 Oct 2009 22:33:05 +0000 (22:33 +0000)
like:

@ BB#1:
.align 2
LCPI1_0:
.long L_.str-(LPC0+8)

Note that proper indentation of the label :)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84558 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
lib/Target/ARM/AsmPrinter/ARMInstPrinter.h

index 139477221a482a0bfcc8ac7a0e79f8c13f7e7cbd..7e89b9f5e92ea65a5d068bb9417c217f9dd3db94 100644 (file)
@@ -1029,16 +1029,16 @@ bool ARMAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
 void ARMAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
   ++EmittedInsts;
 
-  int Opc = MI->getOpcode();
-  if (Opc == ARM::CONSTPOOL_ENTRY)
-    EmitAlignment(2);
-
   // Call the autogenerated instruction printer routines.
   processDebugLoc(MI, true);
   
   if (EnableMCInst) {
     printInstructionThroughMCStreamer(MI);
   } else {
+    int Opc = MI->getOpcode();
+    if (Opc == ARM::CONSTPOOL_ENTRY)
+      EmitAlignment(2);
+    
     printInstruction(MI);
   }
   
@@ -1337,7 +1337,7 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {
     // Emit the label.
     // FIXME: MOVE TO SHARED PLACE.
     SmallString<60> Name;
-    int Id = (int)MI->getOperand(2).getImm();
+    unsigned Id = (unsigned)MI->getOperand(2).getImm();
     raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "PC" << Id;
     OutStreamer.EmitLabel(OutContext.GetOrCreateSymbol(Name.str()));
     
@@ -1351,6 +1351,27 @@ void ARMAsmPrinter::printInstructionThroughMCStreamer(const MachineInstr *MI) {
     printMCInst(&AddInst);
     return;
   }
+  case ARM::CONSTPOOL_ENTRY: { // FIXME: Remove asm string from td file.
+    /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool
+    /// in the function.  The first operand is the ID# for this instruction, the
+    /// second is the index into the MachineConstantPool that this is, the third
+    /// is the size in bytes of this constant pool entry.
+    unsigned LabelId = (unsigned)MI->getOperand(0).getImm();
+    unsigned CPIdx   = (unsigned)MI->getOperand(1).getIndex();
+
+    EmitAlignment(2);
+
+    O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
+      << '_' << LabelId << ":\n";
+
+    const MachineConstantPoolEntry &MCPE = MCP->getConstants()[CPIdx];
+    if (MCPE.isMachineConstantPoolEntry())
+      EmitMachineConstantPoolValue(MCPE.Val.MachineCPVal);
+    else
+      EmitGlobalConstant(MCPE.Val.ConstVal);
+    
+    return;
+  }
   }
       
   MCInst TmpInst;
index 4d9c592e64b5f5e55594d986e7e4eaf4a8fcab91..3a500db8479f06ceaaff60f56d95d3346410b7aa 100644 (file)
@@ -159,6 +159,11 @@ void ARMInstPrinter::printRegisterList(const MCInst *MI, unsigned OpNum) {
 }
 
 
+void ARMInstPrinter::printCPInstOperand(const MCInst *MI, unsigned OpNum,
+                                        const char *Modifier) {
+  // FIXME: remove this.
+  abort();
+}
 
 void ARMInstPrinter::printPCLabel(const MCInst *MI, unsigned OpNum) {
   // FIXME: remove this.
index d4f6033152c5a68d886ef4af19d164b848a607d9..41e59e9937c01eded2696763fd3222020b109d41 100644 (file)
@@ -73,7 +73,7 @@ public:
   void printSBitModifierOperand(const MCInst *MI, unsigned OpNum) {}
   void printRegisterList(const MCInst *MI, unsigned OpNum);
   void printCPInstOperand(const MCInst *MI, unsigned OpNum,
-                          const char *Modifier) {}
+                          const char *Modifier);
   void printJTBlockOperand(const MCInst *MI, unsigned OpNum) {}
   void printJT2BlockOperand(const MCInst *MI, unsigned OpNum) {}
   void printTBAddrMode(const MCInst *MI, unsigned OpNum) {}