Add support for the printImplicitDefsBefore flag
authorChris Lattner <sabre@nondot.org>
Tue, 13 Apr 2004 17:18:39 +0000 (17:18 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 13 Apr 2004 17:18:39 +0000 (17:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12893 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/Printer.cpp
lib/Target/X86/X86.td
lib/Target/X86/X86AsmPrinter.cpp
lib/Target/X86/X86InstrInfo.h

index e2f06846d95a770b9c26d3f0a5cd637b4fc23ef8..76968f5d1998ba4f3bbcfe1d32ce5d4fbb4fb0b4 100644 (file)
@@ -105,6 +105,7 @@ namespace {
     }
 
     void printImplUsesBefore(const TargetInstrDescriptor &Desc);
+    bool printImplDefsBefore(const TargetInstrDescriptor &Desc);
     bool printImplUsesAfter(const TargetInstrDescriptor &Desc, const bool LC);
     bool printImplDefsAfter(const TargetInstrDescriptor &Desc, const bool LC);
     void printMachineInstruction(const MachineInstr *MI);
@@ -544,6 +545,30 @@ void Printer::printImplUsesBefore(const TargetInstrDescriptor &Desc) {
   }
 }
 
+/// printImplDefsBefore - Emit the implicit-def registers for the instruction
+/// described by DESC, if its PrintImplUsesBefore flag is set.  Return true if
+/// we printed any registers.
+///
+bool Printer::printImplDefsBefore(const TargetInstrDescriptor &Desc) {
+  bool Printed = false;
+  const MRegisterInfo &RI = *TM.getRegisterInfo();
+  if (Desc.TSFlags & X86II::PrintImplDefsBefore) {
+    const unsigned *p = Desc.ImplicitDefs;
+    if (*p) {
+      O << (Printed ? ", %" : "%") << RI.get (*p).Name;
+      Printed = true;
+      ++p;
+    }
+    while (*p) {
+      // Bug Workaround: See note in Printer::doInitialization about %.
+      O << ", %" << RI.get(*p).Name;
+      ++p;
+    }
+  }
+  return Printed;
+}
+
+
 /// printImplUsesAfter - Emit the implicit-use registers for the instruction
 /// described by DESC, if its PrintImplUsesAfter flag is set.
 ///
@@ -655,22 +680,25 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
 
   case X86II::RawFrm:
   {
-    bool LeadingComma = false;
-
     // The accepted forms of Raw instructions are:
     //   1. nop     - No operand required
     //   2. jmp foo - PC relative displacement operand
     //   3. call bar - GlobalAddress Operand or External Symbol Operand
+    //   4. in AL, imm - Immediate operand
     //
     assert(MI->getNumOperands() == 0 ||
            (MI->getNumOperands() == 1 &&
            (MI->getOperand(0).isPCRelativeDisp() ||
             MI->getOperand(0).isGlobalAddress() ||
-            MI->getOperand(0).isExternalSymbol())) &&
+            MI->getOperand(0).isExternalSymbol() ||
+             MI->getOperand(0).isImmediate())) &&
            "Illegal raw instruction!");
     O << TII.getName(MI->getOpcode()) << " ";
 
+    bool LeadingComma = printImplDefsBefore(Desc);
+
     if (MI->getNumOperands() == 1) {
+      if (LeadingComma) O << ", ";
       printOp(MI->getOperand(0), true); // Don't print "OFFSET"...
       LeadingComma = true;
     }
index 3cb54b6dc950132084e8466cc64b61717f19faf8..ac0141bcb17880d4b78d0002114a2c4333f78bc5 100644 (file)
@@ -41,6 +41,7 @@ def X86InstrInfo : InstrInfo {
                        "FPFormBits",
                        "printImplicitUsesAfter", 
                        "printImplicitUsesBefore",
+                       "printImplicitDefsBefore",
                        "printImplicitDefsAfter",
                        "Opcode"];
   let TSFlagsShifts = [0,
@@ -52,7 +53,8 @@ def X86InstrInfo : InstrInfo {
                        18,
                        19,
                        20,
-                       21];
+                       21,
+                       22];
 }
 
 def X86 : Target {
index e2f06846d95a770b9c26d3f0a5cd637b4fc23ef8..76968f5d1998ba4f3bbcfe1d32ce5d4fbb4fb0b4 100644 (file)
@@ -105,6 +105,7 @@ namespace {
     }
 
     void printImplUsesBefore(const TargetInstrDescriptor &Desc);
+    bool printImplDefsBefore(const TargetInstrDescriptor &Desc);
     bool printImplUsesAfter(const TargetInstrDescriptor &Desc, const bool LC);
     bool printImplDefsAfter(const TargetInstrDescriptor &Desc, const bool LC);
     void printMachineInstruction(const MachineInstr *MI);
@@ -544,6 +545,30 @@ void Printer::printImplUsesBefore(const TargetInstrDescriptor &Desc) {
   }
 }
 
+/// printImplDefsBefore - Emit the implicit-def registers for the instruction
+/// described by DESC, if its PrintImplUsesBefore flag is set.  Return true if
+/// we printed any registers.
+///
+bool Printer::printImplDefsBefore(const TargetInstrDescriptor &Desc) {
+  bool Printed = false;
+  const MRegisterInfo &RI = *TM.getRegisterInfo();
+  if (Desc.TSFlags & X86II::PrintImplDefsBefore) {
+    const unsigned *p = Desc.ImplicitDefs;
+    if (*p) {
+      O << (Printed ? ", %" : "%") << RI.get (*p).Name;
+      Printed = true;
+      ++p;
+    }
+    while (*p) {
+      // Bug Workaround: See note in Printer::doInitialization about %.
+      O << ", %" << RI.get(*p).Name;
+      ++p;
+    }
+  }
+  return Printed;
+}
+
+
 /// printImplUsesAfter - Emit the implicit-use registers for the instruction
 /// described by DESC, if its PrintImplUsesAfter flag is set.
 ///
@@ -655,22 +680,25 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
 
   case X86II::RawFrm:
   {
-    bool LeadingComma = false;
-
     // The accepted forms of Raw instructions are:
     //   1. nop     - No operand required
     //   2. jmp foo - PC relative displacement operand
     //   3. call bar - GlobalAddress Operand or External Symbol Operand
+    //   4. in AL, imm - Immediate operand
     //
     assert(MI->getNumOperands() == 0 ||
            (MI->getNumOperands() == 1 &&
            (MI->getOperand(0).isPCRelativeDisp() ||
             MI->getOperand(0).isGlobalAddress() ||
-            MI->getOperand(0).isExternalSymbol())) &&
+            MI->getOperand(0).isExternalSymbol() ||
+             MI->getOperand(0).isImmediate())) &&
            "Illegal raw instruction!");
     O << TII.getName(MI->getOpcode()) << " ";
 
+    bool LeadingComma = printImplDefsBefore(Desc);
+
     if (MI->getNumOperands() == 1) {
+      if (LeadingComma) O << ", ";
       printOp(MI->getOperand(0), true); // Don't print "OFFSET"...
       LeadingComma = true;
     }
index 90e8d524efc18d79a9420108fb03812aac26dd24..cc44d2686e7d1aea4d80b9daf064b68d798b88de 100644 (file)
@@ -171,11 +171,12 @@ namespace X86II {
 
     // PrintImplDefsAfter - Print out implicit defs in the assembly output
     // after the normal operands.
-    PrintImplDefsAfter = 1 << 20,
+    PrintImplDefsBefore = 1 << 20,
+    PrintImplDefsAfter  = 1 << 21,
 
-    OpcodeShift   = 21,
+    OpcodeShift   = 22,
     OpcodeMask    = 0xFF << OpcodeShift,
-    // Bits 26 -> 31 are unused
+    // Bits 27 -> 31 are unused
   };
 }