summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Basic/Targets.cpp15
-rw-r--r--clang/test/CodeGen/ppc64-inline-asm.c26
2 files changed, 41 insertions, 0 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 4a87717693a..1a59ec62086 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -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 "";
}
diff --git a/clang/test/CodeGen/ppc64-inline-asm.c b/clang/test/CodeGen/ppc64-inline-asm.c
new file mode 100644
index 00000000000..552fe280e00
--- /dev/null
+++ b/clang/test/CodeGen/ppc64-inline-asm.c
@@ -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)
+}
+
OpenPOWER on IntegriCloud