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
This commit is contained in:
Evan Cheng
2006-04-28 23:11:40 +00:00
parent 94046b4d10
commit 62f2700bcf
4 changed files with 249 additions and 1 deletions

View File

@@ -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]);
}
}