[llvm-commits] CVS: llvm/lib/Target/X86/X86ATTAsmPrinter.cpp X86ATTAsmPrinter.h X86IntelAsmPrinter.cpp X86IntelAsmPrinter.h

Evan Cheng evan.cheng at apple.com
Fri Apr 28 16:11:53 PDT 2006



Changes in directory llvm/lib/Target/X86:

X86ATTAsmPrinter.cpp updated: 1.35 -> 1.36
X86ATTAsmPrinter.h updated: 1.11 -> 1.12
X86IntelAsmPrinter.cpp updated: 1.28 -> 1.29
X86IntelAsmPrinter.h updated: 1.12 -> 1.13
---
Log message:

Implemented x86 inline asm b, h, w, k modifiers.


---
Diffs of the changes:  (+249 -1)

 X86ATTAsmPrinter.cpp   |  123 +++++++++++++++++++++++++++++++++++++++++++++++++
 X86ATTAsmPrinter.h     |    4 +
 X86IntelAsmPrinter.cpp |  122 ++++++++++++++++++++++++++++++++++++++++++++++++
 X86IntelAsmPrinter.h   |    1 
 4 files changed, 249 insertions(+), 1 deletion(-)


Index: llvm/lib/Target/X86/X86ATTAsmPrinter.cpp
diff -u llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.35 llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.36
--- llvm/lib/Target/X86/X86ATTAsmPrinter.cpp:1.35	Fri Apr 28 16:19:05 2006
+++ llvm/lib/Target/X86/X86ATTAsmPrinter.cpp	Fri Apr 28 18:11:40 2006
@@ -264,6 +264,124 @@
   O << "\"L" << getFunctionNumber() << "$pb\":";
 }
 
+
+bool X86ATTAsmPrinter::printAsmMRegsiter(const MachineOperand &MO,
+                                         const char Mode) {
+  const MRegisterInfo &RI = *TM.getRegisterInfo();
+  unsigned Reg = MO.getReg();
+  const char *Name = RI.get(Reg).Name;
+  switch (Mode) {
+  default: return true;  // Unknown mode.
+  case 'b': // Print QImode register
+    switch (Reg) {
+    default: return true;
+    case X86::AH: case X86::AL: case X86::AX: case X86::EAX:
+      Name = "al";
+      break;
+    case X86::DH: case X86::DL: case X86::DX: case X86::EDX:
+      Name = "dl";
+      break;
+    case X86::CH: case X86::CL: case X86::CX: case X86::ECX:
+      Name = "cl";
+      break;
+    case X86::BH: case X86::BL: case X86::BX: case X86::EBX:
+      Name = "bl";
+      break;
+    case X86::ESI:
+      Name = "sil";
+      break;
+    case X86::EDI:
+      Name = "dil";
+      break;
+    case X86::EBP:
+      Name = "bpl";
+      break;
+    case X86::ESP:
+      Name = "spl";
+      break;
+    }
+    break;
+  case 'h': // Print QImode high register
+    switch (Reg) {
+    default: return true;
+    case X86::AH: case X86::AL: case X86::AX: case X86::EAX:
+      Name = "al";
+      break;
+    case X86::DH: case X86::DL: case X86::DX: case X86::EDX:
+      Name = "dl";
+      break;
+    case X86::CH: case X86::CL: case X86::CX: case X86::ECX:
+      Name = "cl";
+      break;
+    case X86::BH: case X86::BL: case X86::BX: case X86::EBX:
+      Name = "bl";
+      break;
+    }
+    break;
+  case 'w': // Print HImode register
+    switch (Reg) {
+    default: return true;
+    case X86::AH: case X86::AL: case X86::AX: case X86::EAX:
+      Name = "ax";
+      break;
+    case X86::DH: case X86::DL: case X86::DX: case X86::EDX:
+      Name = "dx";
+      break;
+    case X86::CH: case X86::CL: case X86::CX: case X86::ECX:
+      Name = "cx";
+      break;
+    case X86::BH: case X86::BL: case X86::BX: case X86::EBX:
+      Name = "bx";
+      break;
+    case X86::ESI:
+      Name = "si";
+      break;
+    case X86::EDI:
+      Name = "di";
+      break;
+    case X86::EBP:
+      Name = "bp";
+      break;
+    case X86::ESP:
+      Name = "sp";
+      break;
+    }
+    break;
+  case 'k': // Print SImode register
+    switch (Reg) {
+    default: return true;
+    case X86::AH: case X86::AL: case X86::AX: case X86::EAX:
+      Name = "eax";
+      break;
+    case X86::DH: case X86::DL: case X86::DX: case X86::EDX:
+      Name = "edx";
+      break;
+    case X86::CH: case X86::CL: case X86::CX: case X86::ECX:
+      Name = "ecx";
+      break;
+    case X86::BH: case X86::BL: case X86::BX: case X86::EBX:
+      Name = "ebx";
+      break;
+    case X86::ESI:
+      Name = "esi";
+      break;
+    case X86::EDI:
+      Name = "edi";
+      break;
+    case X86::EBP:
+      Name = "ebp";
+      break;
+    case X86::ESP:
+      Name = "esp";
+      break;
+    }
+    break;
+  }
+
+  O << '%' << Name;
+  return false;
+}
+
 /// PrintAsmOperand - Print out an operand for an inline asm expression.
 ///
 bool X86ATTAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
@@ -275,6 +393,11 @@
     
     switch (ExtraCode[0]) {
     default: return true;  // Unknown modifier.
+    case 'b': // Print QImode register
+    case 'h': // Print QImode high register
+    case 'w': // Print HImode register
+    case 'k': // Print SImode register
+      return printAsmMRegsiter(MI->getOperand(OpNo), ExtraCode[0]);
     }
   }
   


Index: llvm/lib/Target/X86/X86ATTAsmPrinter.h
diff -u llvm/lib/Target/X86/X86ATTAsmPrinter.h:1.11 llvm/lib/Target/X86/X86ATTAsmPrinter.h:1.12
--- llvm/lib/Target/X86/X86ATTAsmPrinter.h:1.11	Fri Apr 28 16:19:05 2006
+++ llvm/lib/Target/X86/X86ATTAsmPrinter.h	Fri Apr 28 18:11:40 2006
@@ -61,11 +61,13 @@
     printMemReference(MI, OpNo);
   }
   
+  bool printAsmMRegsiter(const MachineOperand &MO, const char Mode);
   bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
                        unsigned AsmVariant, const char *ExtraCode);
   bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
                              unsigned AsmVariant, const char *ExtraCode);
-    void printMachineInstruction(const MachineInstr *MI);
+  
+  void printMachineInstruction(const MachineInstr *MI);
   void printSSECC(const MachineInstr *MI, unsigned Op);
   void printMemReference(const MachineInstr *MI, unsigned Op);
   void printPICLabel(const MachineInstr *MI, unsigned Op);


Index: llvm/lib/Target/X86/X86IntelAsmPrinter.cpp
diff -u llvm/lib/Target/X86/X86IntelAsmPrinter.cpp:1.28 llvm/lib/Target/X86/X86IntelAsmPrinter.cpp:1.29
--- llvm/lib/Target/X86/X86IntelAsmPrinter.cpp:1.28	Fri Apr 28 16:19:05 2006
+++ llvm/lib/Target/X86/X86IntelAsmPrinter.cpp	Fri Apr 28 18:11:40 2006
@@ -242,6 +242,123 @@
   O << "\"L" << getFunctionNumber() << "$pb\":";
 }
 
+bool X86IntelAsmPrinter::printAsmMRegsiter(const MachineOperand &MO,
+                                           const char Mode) {
+  const MRegisterInfo &RI = *TM.getRegisterInfo();
+  unsigned Reg = MO.getReg();
+  const char *Name = RI.get(Reg).Name;
+  switch (Mode) {
+  default: return true;  // Unknown mode.
+  case 'b': // Print QImode register
+    switch (Reg) {
+    default: return true;
+    case X86::AH: case X86::AL: case X86::AX: case X86::EAX:
+      Name = "AL";
+      break;
+    case X86::DH: case X86::DL: case X86::DX: case X86::EDX:
+      Name = "DL";
+      break;
+    case X86::CH: case X86::CL: case X86::CX: case X86::ECX:
+      Name = "CL";
+      break;
+    case X86::BH: case X86::BL: case X86::BX: case X86::EBX:
+      Name = "BL";
+      break;
+    case X86::ESI:
+      Name = "SIL";
+      break;
+    case X86::EDI:
+      Name = "DIL";
+      break;
+    case X86::EBP:
+      Name = "BPL";
+      break;
+    case X86::ESP:
+      Name = "SPL";
+      break;
+    }
+    break;
+  case 'h': // Print QImode high register
+    switch (Reg) {
+    default: return true;
+    case X86::AH: case X86::AL: case X86::AX: case X86::EAX:
+      Name = "AL";
+      break;
+    case X86::DH: case X86::DL: case X86::DX: case X86::EDX:
+      Name = "DL";
+      break;
+    case X86::CH: case X86::CL: case X86::CX: case X86::ECX:
+      Name = "CL";
+      break;
+    case X86::BH: case X86::BL: case X86::BX: case X86::EBX:
+      Name = "BL";
+      break;
+    }
+    break;
+  case 'w': // Print HImode register
+    switch (Reg) {
+    default: return true;
+    case X86::AH: case X86::AL: case X86::AX: case X86::EAX:
+      Name = "AX";
+      break;
+    case X86::DH: case X86::DL: case X86::DX: case X86::EDX:
+      Name = "DX";
+      break;
+    case X86::CH: case X86::CL: case X86::CX: case X86::ECX:
+      Name = "CX";
+      break;
+    case X86::BH: case X86::BL: case X86::BX: case X86::EBX:
+      Name = "BX";
+      break;
+    case X86::ESI:
+      Name = "SI";
+      break;
+    case X86::EDI:
+      Name = "DI";
+      break;
+    case X86::EBP:
+      Name = "BP";
+      break;
+    case X86::ESP:
+      Name = "SP";
+      break;
+    }
+    break;
+  case 'k': // Print SImode register
+    switch (Reg) {
+    default: return true;
+    case X86::AH: case X86::AL: case X86::AX: case X86::EAX:
+      Name = "EAX";
+      break;
+    case X86::DH: case X86::DL: case X86::DX: case X86::EDX:
+      Name = "EDX";
+      break;
+    case X86::CH: case X86::CL: case X86::CX: case X86::ECX:
+      Name = "ECX";
+      break;
+    case X86::BH: case X86::BL: case X86::BX: case X86::EBX:
+      Name = "EBX";
+      break;
+    case X86::ESI:
+      Name = "ESI";
+      break;
+    case X86::EDI:
+      Name = "EDI";
+      break;
+    case X86::EBP:
+      Name = "EBP";
+      break;
+    case X86::ESP:
+      Name = "ESP";
+      break;
+    }
+    break;
+  }
+
+  O << '%' << Name;
+  return false;
+}
+
 /// PrintAsmOperand - Print out an operand for an inline asm expression.
 ///
 bool X86IntelAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
@@ -253,6 +370,11 @@
     
     switch (ExtraCode[0]) {
     default: return true;  // Unknown modifier.
+    case 'b': // Print QImode register
+    case 'h': // Print QImode high register
+    case 'w': // Print HImode register
+    case 'k': // Print SImode register
+      return printAsmMRegsiter(MI->getOperand(OpNo), ExtraCode[0]);
     }
   }
   


Index: llvm/lib/Target/X86/X86IntelAsmPrinter.h
diff -u llvm/lib/Target/X86/X86IntelAsmPrinter.h:1.12 llvm/lib/Target/X86/X86IntelAsmPrinter.h:1.13
--- llvm/lib/Target/X86/X86IntelAsmPrinter.h:1.12	Fri Apr 28 16:19:05 2006
+++ llvm/lib/Target/X86/X86IntelAsmPrinter.h	Fri Apr 28 18:11:40 2006
@@ -80,6 +80,7 @@
     printMemReference(MI, OpNo);
   }
 
+  bool printAsmMRegsiter(const MachineOperand &MO, const char Mode);
   bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
                        unsigned AsmVariant, const char *ExtraCode);
   bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,






More information about the llvm-commits mailing list