]> granicus.if.org Git - clang/commitdiff
[ARM] Support inline assembler constraints for MVE.
authorSimon Tatham <simon.tatham@arm.com>
Tue, 25 Jun 2019 16:49:32 +0000 (16:49 +0000)
committerSimon Tatham <simon.tatham@arm.com>
Tue, 25 Jun 2019 16:49:32 +0000 (16:49 +0000)
"To" selects an odd-numbered GPR, and "Te" an even one. There are some
8.1-M instructions that have one too few bits in their register fields
and require registers of particular parity, without necessarily using
a consecutive even/odd pair.

Also, the constraint letter "t" should select an MVE q-register, when
MVE is present. This didn't need any source changes, but some extra
tests have been added.

Reviewers: dmgreen, samparker, SjoerdMeijer

Subscribers: javed.absar, eraman, kristof.beyls, hiraditya, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D60709

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

lib/Basic/Targets/ARM.cpp
test/CodeGen/arm-asm.c

index 7ed2158a4771122cd9a7fb38cb9bc817f25af408..ceab4e7f95c1b83089c2e157319418ab164e7fb8 100644 (file)
@@ -900,6 +900,16 @@ bool ARMTargetInfo::validateAsmConstraint(
   case 'Q': // A memory address that is a single base register.
     Info.setAllowsMemory();
     return true;
+  case 'T':
+    switch (Name[1]) {
+    default:
+      break;
+    case 'e': // Even general-purpose register
+    case 'o': // Odd general-purpose register
+      Info.setAllowsRegister();
+      Name++;
+      return true;
+    }
   case 'U': // a memory reference...
     switch (Name[1]) {
     case 'q': // ...ARMV4 ldrsb
@@ -923,6 +933,7 @@ std::string ARMTargetInfo::convertConstraint(const char *&Constraint) const {
   std::string R;
   switch (*Constraint) {
   case 'U': // Two-character constraint; add "^" hint for later parsing.
+  case 'T':
     R = std::string("^") + std::string(Constraint, 2);
     Constraint++;
     break;
index bd2fe11993691c6dae4cdddb3b1dc3fbf88d3ea4..d2ae1ed762308e501f5332d207c5494d9ff4a880 100644 (file)
@@ -6,3 +6,21 @@ int t1() {
     __asm__ volatile ("flds s15, %[k] \n" :: [k] "Uv" (k) : "s15");
     return 0;
 }
+
+// CHECK-LABEL: @even_reg_constraint_Te
+int even_reg_constraint_Te(void) {
+  int acc = 0;
+  // CHECK: vaddv{{.*\^Te}}
+  asm("vaddv.s8 %0, Q0"
+      : "+Te" (acc));
+  return acc;
+}
+
+// CHECK-LABEL: @odd_reg_constraint_To
+int odd_reg_constraint_To(void) {
+  int eacc = 0, oacc = 0;
+  // CHECK: vaddlv{{.*\^To}}
+  asm("vaddlv.s8 %0, %1, Q0"
+      : "+Te" (eacc), "+To" (oacc));
+  return oacc;
+}