diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-04-28 23:11:40 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-04-28 23:11:40 +0000 |
commit | 62f2700bcfdd91dd9cdd7f9a224b3e000a3b2235 (patch) | |
tree | 12ce2247064412332c57fc0faee021408b8e175c /lib/Target/X86/X86IntelAsmPrinter.cpp | |
parent | 94046b4d103cb72734611708d24674e438e16aae (diff) | |
download | external_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-x | lib/Target/X86/X86IntelAsmPrinter.cpp | 122 |
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]); } } |