From 1bad2546d02073ae5d4b84840d3151f04b8fc19e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 23 Feb 2006 19:31:10 +0000 Subject: [PATCH] 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 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 32 ++++++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index 714a36d1e7df..76ca25683274 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -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. ///