[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