]> granicus.if.org Git - clang/commitdiff
[Hexagon] Recognize "q" and "v" in inline-asm as register constraints
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>
Wed, 18 May 2016 14:56:14 +0000 (14:56 +0000)
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>
Wed, 18 May 2016 14:56:14 +0000 (14:56 +0000)
Clang follow-up to r269933.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@269934 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Targets.cpp
test/CodeGen/hexagon-inline-asm.c [new file with mode: 0644]

index 91e00c03ba787b83be4aa587eb9360009dd45f0c..b63eac907ebd643d5721971703257386b20a2a99 100644 (file)
@@ -6016,7 +6016,16 @@ public:
 
   bool validateAsmConstraint(const char *&Name,
                              TargetInfo::ConstraintInfo &Info) const override {
-    return true;
+    switch (*Name) {
+      case 'v':
+      case 'q':
+        if (HasHVX) {
+          Info.setAllowsRegister();
+          return true;
+        }
+        break;
+    }
+    return false;
   }
 
   void getTargetDefines(const LangOptions &Opts,
diff --git a/test/CodeGen/hexagon-inline-asm.c b/test/CodeGen/hexagon-inline-asm.c
new file mode 100644 (file)
index 0000000..1ef4b77
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -triple hexagon-unknown-elf -target-feature +hvx -emit-llvm -o - %s | FileCheck %s
+
+typedef int v64 __attribute__((__vector_size__(64)))
+    __attribute__((aligned(64)));
+
+void foo(v64 v0, v64 v1, v64 *p) {
+  v64 q0;
+  asm ("%0 = vgtw(%1.w,%2.w)" : "=q"(q0) : "v"(v0), "v"(v1));
+// CHECK: call <16 x i32> asm "$0 = vgtw($1.w,$2.w)", "=q,v,v"(<16 x i32>{{.*}}, <16 x i32>{{.*}})
+  *p = q0;
+}