]> granicus.if.org Git - clang/commitdiff
Merging r369093:
authorHans Wennborg <hans@hanshq.net>
Thu, 22 Aug 2019 13:42:47 +0000 (13:42 +0000)
committerHans Wennborg <hans@hanshq.net>
Thu, 22 Aug 2019 13:42:47 +0000 (13:42 +0000)
------------------------------------------------------------------------
r369093 | lewis-revill | 2019-08-16 12:23:56 +0200 (Fri, 16 Aug 2019) | 11 lines

[RISCV] Add inline asm constraint A for RISC-V

This allows the constraint A to be used in inline asm for RISC-V, which
allows an address held in a register to be used.

This patch adds the minimal amount of code required to get operands with
the right constraints to compile.

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

------------------------------------------------------------------------

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

lib/Basic/Targets/RISCV.cpp
test/CodeGen/riscv-inline-asm.c

index 939ac46d671bef507eaaf856604054d2e86b2dad..930b825e94d2782d53e0ed0e57419eca4461d0cd 100644 (file)
@@ -60,6 +60,10 @@ bool RISCVTargetInfo::validateAsmConstraint(
     // A floating-point register.
     Info.setAllowsRegister();
     return true;
+  case 'A':
+    // An address that is held in a general-purpose register.
+    Info.setAllowsMemory();
+    return true;
   }
 }
 
index f79527337bdfb4520f2c7cead3f621b7260a1912..2c92d15ca90acfe22771a758ccb912257f421bf5 100644 (file)
@@ -38,3 +38,9 @@ void test_f() {
 // CHECK: call void asm sideeffect "", "f"(double [[FLT_ARG]])
   asm volatile ("" :: "f"(d));
 }
+
+void test_A(int *p) {
+// CHECK-LABEL: define void @test_A(i32* %p)
+// CHECK: call void asm sideeffect "", "*A"(i32* %p)
+  asm volatile("" :: "A"(*p));
+}