[cfe-commits] r127185 - in /cfe/trunk: lib/CodeGen/TargetInfo.cpp test/CodeGen/mmx-inline-asm.c

Bill Wendling isanbard at gmail.com
Mon Mar 7 14:47:15 PST 2011


Author: void
Date: Mon Mar  7 16:47:14 2011
New Revision: 127185

URL: http://llvm.org/viewvc/llvm-project?rev=127185&view=rev
Log:
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.

Added:
    cfe/trunk/test/CodeGen/mmx-inline-asm.c
Modified:
    cfe/trunk/lib/CodeGen/TargetInfo.cpp

Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=127185&r1=127184&r2=127185&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Mon Mar  7 16:47:14 2011
@@ -358,7 +358,7 @@
 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;
 }

Added: cfe/trunk/test/CodeGen/mmx-inline-asm.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/mmx-inline-asm.c?rev=127185&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/mmx-inline-asm.c (added)
+++ cfe/trunk/test/CodeGen/mmx-inline-asm.c Mon Mar  7 16:47:14 2011
@@ -0,0 +1,22 @@
+// RUN: %clang -mmmx -ccc-host-triple i386-unknown-unknown -emit-llvm -S %s -o - | FileCheck %s
+// <rdar://problem/9091220>
+#include <mmintrin.h>
+
+// 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));
+}





More information about the cfe-commits mailing list