r202658 - Add a PPC inline asm constraint type for single CR bits

Hal Finkel hfinkel at anl.gov
Sun Mar 2 10:24:18 PST 2014


Author: hfinkel
Date: Sun Mar  2 12:24:18 2014
New Revision: 202658

URL: http://llvm.org/viewvc/llvm-project?rev=202658&view=rev
Log:
Add a PPC inline asm constraint type for single CR bits

This adds support for the PPC "wc" inline asm constraint (used for allocating
individual CR bits). Support for this constraint type was recently added to the
LLVM PowerPC backend. Although gcc does not currently support allocating
individual CR bits, this identifier choice has been coordinated with the gcc
PowerPC team, and will be marked as reserved for this purpose in the gcc
constraints.md file.

Prior to this change, none of the multi-character PPC constraints were handled
correctly (the '^' escape character was not being added as required by the
parsing code in LLVM). This should now be fixed. I'll add tests for these other
constraints as support is added for them in the backend.

Added:
    cfe/trunk/test/CodeGen/ppc64-inline-asm.c
Modified:
    cfe/trunk/lib/Basic/Targets.cpp

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=202658&r1=202657&r2=202658&view=diff
==============================================================================
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Sun Mar  2 12:24:18 2014
@@ -788,6 +788,7 @@ public:
         case 'f':// VSX vector register to hold vector float data
         case 's':// VSX vector register to hold scalar float data
         case 'a':// Any VSX register
+        case 'c':// An individual CR bit
           break;
         default:
           return false;
@@ -863,6 +864,20 @@ public:
     }
     return true;
   }
+  virtual std::string convertConstraint(const char *&Constraint) const {
+    std::string R;
+    switch (*Constraint) {
+    case 'e':
+    case 'w':
+      // Two-character constraint; add "^" hint for later parsing.
+      R = std::string("^") + std::string(Constraint, 2);
+      Constraint++;
+      break;
+    default:
+      return TargetInfo::convertConstraint(Constraint);
+    }
+    return R;
+  }
   virtual const char *getClobbers() const {
     return "";
   }

Added: cfe/trunk/test/CodeGen/ppc64-inline-asm.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ppc64-inline-asm.c?rev=202658&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/ppc64-inline-asm.c (added)
+++ cfe/trunk/test/CodeGen/ppc64-inline-asm.c Sun Mar  2 12:24:18 2014
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -triple powerpc64-unknown-linux-gnu -O2 -emit-llvm -o - %s | FileCheck %s
+
+_Bool test_wc_i1(_Bool b1, _Bool b2) {
+  _Bool o;
+  asm("crand %0, %1, %2" : "=wc"(o) : "wc"(b1), "wc"(b2) : );
+  return o;
+// CHECK-LABEL: define zeroext i1 @test_wc_i1(i1 zeroext %b1, i1 zeroext %b2)
+// CHECK: call i8 asm "crand $0, $1, $2", "=^wc,^wc,^wc"(i1 %b1, i1 %b2)
+}
+
+int test_wc_i32(int b1, int b2) {
+  int o;
+  asm("crand %0, %1, %2" : "=wc"(o) : "wc"(b1), "wc"(b2) : );
+  return o;
+// CHECK-LABEL: signext i32 @test_wc_i32(i32 signext %b1, i32 signext %b2)
+// CHECK: call i32 asm "crand $0, $1, $2", "=^wc,^wc,^wc"(i32 %b1, i32 %b2)
+}
+
+unsigned char test_wc_i8(unsigned char b1, unsigned char b2) {
+  unsigned char o;
+  asm("crand %0, %1, %2" : "=wc"(o) : "wc"(b1), "wc"(b2) : );
+  return o;
+// CHECK-LABEL: zeroext i8 @test_wc_i8(i8 zeroext %b1, i8 zeroext %b2)
+// CHECK: call i8 asm "crand $0, $1, $2", "=^wc,^wc,^wc"(i8 %b1, i8 %b2)
+}
+





More information about the cfe-commits mailing list