From: Richard Osborne Date: Tue, 16 Jul 2013 12:48:34 +0000 (+0000) Subject: [XCore] Fix printing of inline asm operands. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=6e2dc6d669dcbd2129bbc939088d30c7a751bd94;p=oota-llvm.git [XCore] Fix printing of inline asm operands. Previously an asm operand with no operand modifier would give the error "invalid operand in inline asm". git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186407 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/XCore/XCoreAsmPrinter.cpp b/lib/Target/XCore/XCoreAsmPrinter.cpp index e802c1b5165..435062b47d2 100644 --- a/lib/Target/XCore/XCoreAsmPrinter.cpp +++ b/lib/Target/XCore/XCoreAsmPrinter.cpp @@ -240,18 +240,14 @@ void XCoreAsmPrinter::printOperand(const MachineInstr *MI, int opNum, bool XCoreAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant,const char *ExtraCode, raw_ostream &O) { - // 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: - // See if this is a generic print operand - return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O); - } + // Print the operand if there is no operand modifier. + if (!ExtraCode || !ExtraCode[0]) { + printOperand(MI, OpNo, O); + return false; + } - printOperand(MI, OpNo, O); - return false; + // Otherwise fallback on the default implementation. + return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O); } void XCoreAsmPrinter::EmitInstruction(const MachineInstr *MI) { diff --git a/test/CodeGen/XCore/inline-asm.ll b/test/CodeGen/XCore/inline-asm.ll new file mode 100644 index 00000000000..af3edd1544a --- /dev/null +++ b/test/CodeGen/XCore/inline-asm.ll @@ -0,0 +1,32 @@ +; RUN: llc < %s -march=xcore | FileCheck %s +; CHECK-LABEL: f1: +; CHECK: foo r0 +define i32 @f1() nounwind { +entry: + %asmtmp = tail call i32 asm sideeffect "foo $0", "=r"() nounwind + ret i32 %asmtmp +} + +; CHECK-LABEL: f2: +; CHECK: foo 5 +define void @f2() nounwind { +entry: + tail call void asm sideeffect "foo $0", "i"(i32 5) nounwind + ret void +} + +; CHECK-LABEL: f3: +; CHECK: foo 42 +define void @f3() nounwind { +entry: + tail call void asm sideeffect "foo ${0:c}", "i"(i32 42) nounwind + ret void +} + +; CHECK-LABEL: f4: +; CHECK: foo -99 +define void @f4() nounwind { +entry: + tail call void asm sideeffect "foo ${0:n}", "i"(i32 99) nounwind + ret void +}