[llvm-commits] [llvm] r75512 - in /llvm/trunk/lib/Target/X86/AsmPrinter: X86ATTAsmPrinter.cpp X86ATTAsmPrinter.h

Chris Lattner sabre at nondot.org
Mon Jul 13 14:41:08 PDT 2009


Author: lattner
Date: Mon Jul 13 16:41:08 2009
New Revision: 75512

URL: http://llvm.org/viewvc/llvm-project?rev=75512&view=rev
Log:
refactor symbol printing so the whole "mem" thing is handled in fewer places.


Modified:
    llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
    llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h

Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp?rev=75512&r1=75511&r2=75512&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp Mon Jul 13 16:41:08 2009
@@ -372,56 +372,26 @@
   }
 }
 
-void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
-                                    const char *Modifier) {
-  const MachineOperand &MO = MI->getOperand(OpNo);
-  switch (MO.getType()) {
-  default: LLVM_UNREACHABLE( "unknown operand type!");
-  case MachineOperand::MO_Register: {
-    assert(TargetRegisterInfo::isPhysicalRegister(MO.getReg()) &&
-           "Virtual registers should not make it this far!");
-    O << '%';
-    unsigned Reg = MO.getReg();
-    if (Modifier && strncmp(Modifier, "subreg", strlen("subreg")) == 0) {
-      MVT VT = (strcmp(Modifier+6,"64") == 0) ?
-        MVT::i64 : ((strcmp(Modifier+6, "32") == 0) ? MVT::i32 :
-                    ((strcmp(Modifier+6,"16") == 0) ? MVT::i16 : MVT::i8));
-      Reg = getX86SubSuperRegister(Reg, VT);
-    }
-    O << TRI->getAsmName(Reg);
-    return;
-  }
 
-  case MachineOperand::MO_Immediate:
-    if (!Modifier || strcmp(Modifier, "mem"))
-      O << '$';
-    O << MO.getImm();
-    return;
+void X86ATTAsmPrinter::printSymbolOperand(const MachineOperand &MO) {
+  switch (MO.getType()) {
+  default: LLVM_UNREACHABLE("unknown symbol type!");
   case MachineOperand::MO_JumpTableIndex: {
-    bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
-    if (!isMemOp) O << '$';
     O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() << '_'
       << MO.getIndex();
     break;
   }
   case MachineOperand::MO_ConstantPoolIndex: {
-    bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
-    if (!isMemOp) O << '$';
     O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
       << MO.getIndex();
-
     printOffset(MO.getOffset());
     break;
   }
   case MachineOperand::MO_GlobalAddress: {
-    bool isMemOp = Modifier && !strcmp(Modifier, "mem");
-    if (!isMemOp)
-      O << '$';
-    
     const GlobalValue *GV = MO.getGlobal();
     std::string Name = Mang->getValueName(GV);
     decorateName(Name, GV);
-
+    
     bool needCloseParen = false;
     if (Name[0] == '$') {
       // The name begins with a dollar-sign. In order to avoid having it look
@@ -429,7 +399,7 @@
       O << '(';
       needCloseParen = true;
     }
-
+    
     // Handle dllimport linkage.
     if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) {
       O << "__imp_" << Name;
@@ -447,7 +417,7 @@
     } else {
       O << Name;
     }
-
+    
     if (needCloseParen)
       O << ')';
     
@@ -463,9 +433,6 @@
     /// by _GLOBAL_OFFSET_TABLE_ on X86-32.  All others are call operands, which
     /// are pcrel_imm's.
     assert(!Subtarget->is64Bit());
-    // These are never used as memory operands.
-    assert(Modifier == 0 || strcmp(Modifier, "mem"));
-    O << '$';
     O << TAI->getGlobalPrefix();
     O << MO.getSymbolName();
     break;
@@ -503,6 +470,44 @@
   }
 }
 
+
+void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
+                                    const char *Modifier) {
+  const MachineOperand &MO = MI->getOperand(OpNo);
+  switch (MO.getType()) {
+  default: LLVM_UNREACHABLE("unknown operand type!");
+  case MachineOperand::MO_Register: {
+    assert(TargetRegisterInfo::isPhysicalRegister(MO.getReg()) &&
+           "Virtual registers should not make it this far!");
+    O << '%';
+    unsigned Reg = MO.getReg();
+    if (Modifier && strncmp(Modifier, "subreg", strlen("subreg")) == 0) {
+      MVT VT = (strcmp(Modifier+6,"64") == 0) ?
+        MVT::i64 : ((strcmp(Modifier+6, "32") == 0) ? MVT::i32 :
+                    ((strcmp(Modifier+6,"16") == 0) ? MVT::i16 : MVT::i8));
+      Reg = getX86SubSuperRegister(Reg, VT);
+    }
+    O << TRI->getAsmName(Reg);
+    return;
+  }
+
+  case MachineOperand::MO_Immediate:
+    O << '$' << MO.getImm();
+    return;
+
+  case MachineOperand::MO_JumpTableIndex:
+  case MachineOperand::MO_ConstantPoolIndex:
+  case MachineOperand::MO_GlobalAddress: 
+  case MachineOperand::MO_ExternalSymbol: {
+    bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
+    if (!isMemOp) O << '$';
+    
+    printSymbolOperand(MO);
+    break;
+  }
+  }
+}
+
 void X86ATTAsmPrinter::printSSECC(const MachineInstr *MI, unsigned Op) {
   unsigned char value = MI->getOperand(Op).getImm();
   assert(value <= 7 && "Invalid ssecc argument!");
@@ -659,7 +664,10 @@
     switch (ExtraCode[0]) {
     default: return true;  // Unknown modifier.
     case 'c': // Don't print "$" before a global var name or constant.
-      printOperand(MI, OpNo, "mem");
+      if (MI->getOperand(OpNo).isImm())
+        O << MI->getOperand(OpNo).getImm();
+      else
+        printOperand(MI, OpNo, "mem");
       return false;
 
     case 'A': // Print '*' before a register (it must be a register)

Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h?rev=75512&r1=75511&r2=75512&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h (original)
+++ llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.h Mon Jul 13 16:41:08 2009
@@ -73,6 +73,7 @@
   // New MCInst printing stuff.
   bool printInstruction(const MCInst *MI);
 
+  void printSymbolOperand(const MachineOperand &MO);
   void printOperand(const MCInst *MI, unsigned OpNo,
                     const char *Modifier = 0);
   void printMemReference(const MCInst *MI, unsigned Op);





More information about the llvm-commits mailing list