]> granicus.if.org Git - clang/commitdiff
Clang support for ARM Uv/Uy/Uq inline-asm constraints.
authorStuart Hastings <stuart@apple.com>
Tue, 7 Jun 2011 23:45:05 +0000 (23:45 +0000)
committerStuart Hastings <stuart@apple.com>
Tue, 7 Jun 2011 23:45:05 +0000 (23:45 +0000)
rdar://problem/9037836

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

include/clang/Basic/TargetInfo.h
lib/Basic/Targets.cpp
lib/CodeGen/CGStmt.cpp
test/CodeGen/arm-asm.c [new file with mode: 0644]

index b830bf2f82cd2a1d05a4069ffffd030bc5bb50b8..5b6d745f154f3d53ba13fa0a10aca0cb8dea3bfc 100644 (file)
@@ -368,11 +368,11 @@ public:
                            ConstraintInfo *OutputConstraints,
                            unsigned NumOutputs, unsigned &Index) const;
 
-  virtual std::string convertConstraint(const char Constraint) const {
+  virtual std::string convertConstraint(const char *&Constraint) const {
     // 'p' defaults to 'r', but can be overridden by targets.
-    if (Constraint == 'p')
+    if (*Constraint == 'p')
       return std::string("r");
-    return std::string(1, Constraint);
+    return std::string(1, *Constraint);
   }
 
   // Returns a string of target-specific clobbers, in LLVM format.
index 779c99532cb2c507a9ed5e5dc8f504748e5845a2..82f5df1cf1f711b3486a2c851e8574c16061c7ce 100644 (file)
@@ -1121,7 +1121,7 @@ public:
   }
   virtual bool validateAsmConstraint(const char *&Name,
                                      TargetInfo::ConstraintInfo &info) const;
-  virtual std::string convertConstraint(const char Constraint) const;
+  virtual std::string convertConstraint(const char *&Constraint) const;
   virtual const char *getClobbers() const {
     return "~{dirflag},~{fpsr},~{flags}";
   }
@@ -1449,8 +1449,8 @@ X86TargetInfo::validateAsmConstraint(const char *&Name,
 
 
 std::string
-X86TargetInfo::convertConstraint(const char Constraint) const {
-  switch (Constraint) {
+X86TargetInfo::convertConstraint(const char *&Constraint) const {
+  switch (*Constraint) {
   case 'a': return std::string("{ax}");
   case 'b': return std::string("{bx}");
   case 'c': return std::string("{cx}");
@@ -1464,7 +1464,7 @@ X86TargetInfo::convertConstraint(const char Constraint) const {
   case 'u': // second from top of floating point stack.
     return std::string("{st(1)}"); // second from top of floating point stack.
   default:
-    return std::string(1, Constraint);
+    return std::string(1, *Constraint);
   }
 }
 } // end anonymous namespace
@@ -2037,9 +2037,31 @@ public:
     case 'P': // VFP Floating point register double precision
       Info.setAllowsRegister();
       return true;
+    case 'U': // a memory reference...
+      switch (Name[1]) {
+      case 'q': // ...ARMV4 ldrsb
+      case 'v': // ...VFP load/store (reg+constant offset)
+      case 'y': // ...iWMMXt load/store
+        Info.setAllowsMemory();
+        Name++;
+        return true;
+      }
     }
     return false;
   }
+  std::string
+  virtual convertConstraint(const char *&Constraint) const {
+    std::string R;
+    switch (*Constraint) {
+    case 'U':   // Two-character constraint; add "^" hint for later parsing.
+      R = std::string("^") + Constraint;
+      Constraint++;
+      break;
+    default:
+      return std::string(1, *Constraint);
+    }
+    return R;
+  }
   virtual const char *getClobbers() const {
     // FIXME: Is this really right?
     return "";
index 782ff061606bd810ad5b17740a7eb1b1e11db690..a982621be79afa18d64b8ff8e46bce26ee727b10 100644 (file)
@@ -1222,7 +1222,7 @@ SimplifyConstraint(const char *Constraint, const TargetInfo &Target,
   while (*Constraint) {
     switch (*Constraint) {
     default:
-      Result += Target.convertConstraint(*Constraint);
+      Result += Target.convertConstraint(Constraint);
       break;
     // Ignore these
     case '*':
diff --git a/test/CodeGen/arm-asm.c b/test/CodeGen/arm-asm.c
new file mode 100644 (file)
index 0000000..9b1082a
--- /dev/null
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 -triple thumb %s -emit-llvm -o - | FileCheck %s
+int t1() {
+    static float k = 1.0f;
+    // CHECK: flds s15
+    __asm__ volatile ("flds s15, %[k] \n" :: [k] "Uv" (k) : "s15");
+    return 0;
+}