From: Bill Wendling Date: Mon, 7 Mar 2011 22:47:14 +0000 (+0000) Subject: When we adjust the inline ASM type, we need to take into account an early X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0507be662df482b5c67b7905ed7ca368cb5c6b69;p=clang When we adjust the inline ASM type, we need to take into account an early clobber with the 'y' constraint. Otherwise, we get the wrong return type and an assert, because it created a '<1 x i64>' vector type instead of the x86_mmx type. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@127185 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 2ffc840b9f..bd88192856 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -358,7 +358,7 @@ bool UseX86_MMXType(const llvm::Type *IRType) { static const llvm::Type* X86AdjustInlineAsmType(CodeGen::CodeGenFunction &CGF, llvm::StringRef Constraint, const llvm::Type* Ty) { - if (Constraint=="y" && Ty->isVectorTy()) + if ((Constraint == "y" || Constraint == "&y") && Ty->isVectorTy()) return llvm::Type::getX86_MMXTy(CGF.getLLVMContext()); return Ty; } diff --git a/test/CodeGen/mmx-inline-asm.c b/test/CodeGen/mmx-inline-asm.c new file mode 100644 index 0000000000..c473a930ec --- /dev/null +++ b/test/CodeGen/mmx-inline-asm.c @@ -0,0 +1,22 @@ +// RUN: %clang -mmmx -ccc-host-triple i386-unknown-unknown -emit-llvm -S %s -o - | FileCheck %s +// +#include + +// CHECK: type { x86_mmx, x86_mmx, x86_mmx, x86_mmx, x86_mmx, x86_mmx, x86_mmx } + +void foo(long long fill) { + __m64 vfill = _mm_cvtsi64_m64(fill); + __m64 v1, v2, v3, v4, v5, v6, v7; + + __asm__ __volatile__ ( + "\tmovq %7, %0\n" + "\tmovq %7, %1\n" + "\tmovq %7, %2\n" + "\tmovq %7, %3\n" + "\tmovq %7, %4\n" + "\tmovq %7, %5\n" + "\tmovq %7, %6" + : "=&y" (v1), "=&y" (v2), "=&y" (v3), + "=&y" (v4), "=&y" (v5), "=&y" (v6), "=y" (v7) + : "y" (vfill)); +}