mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
Implement the PPC inline asm "L" modifier. This allows us to compile:
long long test(long long X) { __asm__("foo %0 %L0 %1 %L1" : "=r"(X): "r"(X)); return X; } to: foo r2 r3 r2 r3 llvm-svn: 26333
This commit is contained in:
parent
b4951fbe82
commit
cdbd9d6d4c
@ -97,10 +97,7 @@ namespace {
|
||||
}
|
||||
|
||||
bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
|
||||
unsigned AsmVariant, const char *ExtraCode) {
|
||||
printOperand(MI, OpNo);
|
||||
return false;
|
||||
}
|
||||
unsigned AsmVariant, const char *ExtraCode);
|
||||
|
||||
void printU5ImmOperand(const MachineInstr *MI, unsigned OpNo) {
|
||||
unsigned char value = MI->getOperand(OpNo).getImmedValue();
|
||||
@ -396,6 +393,33 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) {
|
||||
}
|
||||
}
|
||||
|
||||
/// PrintAsmOperand - Print out an operand for an inline asm expression.
|
||||
///
|
||||
bool PPCAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
|
||||
unsigned AsmVariant,
|
||||
const char *ExtraCode) {
|
||||
// Does this asm operand have a single letter operand modifier?
|
||||
if (ExtraCode && ExtraCode[0]) {
|
||||
if (ExtraCode[1] != 0) return true; // Unknown modifier.
|
||||
|
||||
switch (ExtraCode[0]) {
|
||||
default: return true; // Unknown modifier.
|
||||
case 'L': // Write second word of DImode reference.
|
||||
// Verify that this operand has two consecutive registers.
|
||||
if (!MI->getOperand(OpNo).isRegister() ||
|
||||
OpNo+1 == MI->getNumOperands() ||
|
||||
!MI->getOperand(OpNo+1).isRegister())
|
||||
return true;
|
||||
++OpNo; // Return the high-part.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printOperand(MI, OpNo);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// printMachineInstruction -- Print out a single PowerPC MI in Darwin syntax to
|
||||
/// the current output stream.
|
||||
///
|
||||
|
Loading…
Reference in New Issue
Block a user