From 62f2700bcfdd91dd9cdd7f9a224b3e000a3b2235 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 28 Apr 2006 23:11:40 +0000 Subject: [PATCH] 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 --- lib/Target/X86/X86ATTAsmPrinter.cpp | 123 ++++++++++++++++++++++++++ lib/Target/X86/X86ATTAsmPrinter.h | 4 +- lib/Target/X86/X86IntelAsmPrinter.cpp | 122 +++++++++++++++++++++++++ lib/Target/X86/X86IntelAsmPrinter.h | 1 + 4 files changed, 249 insertions(+), 1 deletion(-) diff --git a/lib/Target/X86/X86ATTAsmPrinter.cpp b/lib/Target/X86/X86ATTAsmPrinter.cpp index 3afa1f7a8ed..becb9db27ae 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.cpp +++ b/lib/Target/X86/X86ATTAsmPrinter.cpp @@ -264,6 +264,124 @@ void X86ATTAsmPrinter::printPICLabel(const MachineInstr *MI, unsigned Op) { 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 @@ bool X86ATTAsmPrinter::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]); } } diff --git a/lib/Target/X86/X86ATTAsmPrinter.h b/lib/Target/X86/X86ATTAsmPrinter.h index d8196fe6bb4..4addc2fb9bf 100755 --- a/lib/Target/X86/X86ATTAsmPrinter.h +++ b/lib/Target/X86/X86ATTAsmPrinter.h @@ -61,11 +61,13 @@ struct X86ATTAsmPrinter : public X86SharedAsmPrinter { 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); diff --git a/lib/Target/X86/X86IntelAsmPrinter.cpp b/lib/Target/X86/X86IntelAsmPrinter.cpp index bf4dba73934..c6052d93b02 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]); } } diff --git a/lib/Target/X86/X86IntelAsmPrinter.h b/lib/Target/X86/X86IntelAsmPrinter.h index 41900f5006e..59ca0e81851 100755 --- a/lib/Target/X86/X86IntelAsmPrinter.h +++ b/lib/Target/X86/X86IntelAsmPrinter.h @@ -80,6 +80,7 @@ struct X86IntelAsmPrinter : public X86SharedAsmPrinter { 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,