aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/X86/X86IntelAsmPrinter.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-04-28 23:11:40 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-04-28 23:11:40 +0000
commit62f2700bcfdd91dd9cdd7f9a224b3e000a3b2235 (patch)
tree12ce2247064412332c57fc0faee021408b8e175c /lib/Target/X86/X86IntelAsmPrinter.cpp
parent94046b4d103cb72734611708d24674e438e16aae (diff)
downloadexternal_llvm-62f2700bcfdd91dd9cdd7f9a224b3e000a3b2235.zip
external_llvm-62f2700bcfdd91dd9cdd7f9a224b3e000a3b2235.tar.gz
external_llvm-62f2700bcfdd91dd9cdd7f9a224b3e000a3b2235.tar.bz2
Implemented x86 inline asm b, h, w, k modifiers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28020 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86IntelAsmPrinter.cpp')
-rwxr-xr-xlib/Target/X86/X86IntelAsmPrinter.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/lib/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp
index bf4dba7..c6052d9 100755
--- a/lib/Target/X86/X86IntelAsmPrinter.cpp
+++ b/lib/Target/X86/X86IntelAsmPrinter.cpp
@@ -242,6 +242,123 @@ void X86IntelAsmPrinter::printPICLabel(const MachineInstr *MI, unsigned Op) {
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 @@ bool X86IntelAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
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]);
}
}