summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLewis Revill <lewis.revill@embecosm.com>2019-08-16 10:23:56 +0000
committerLewis Revill <lewis.revill@embecosm.com>2019-08-16 10:23:56 +0000
commit1653ebee3f04f0591a0f31017cdd5059828ef6e5 (patch)
treeb777ed4c3460678ed2e281150dcc331ce10bd2e8
parent8b593480d33f8e8f5c4ec1f921a2c692bd0b7f45 (diff)
downloadbcm5719-llvm-1653ebee3f04f0591a0f31017cdd5059828ef6e5.tar.gz
bcm5719-llvm-1653ebee3f04f0591a0f31017cdd5059828ef6e5.zip
[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 llvm-svn: 369093
-rw-r--r--clang/lib/Basic/Targets/RISCV.cpp4
-rw-r--r--clang/test/CodeGen/riscv-inline-asm.c6
2 files changed, 10 insertions, 0 deletions
diff --git a/clang/lib/Basic/Targets/RISCV.cpp b/clang/lib/Basic/Targets/RISCV.cpp
index a634ba69f3c..d1166d90df4 100644
--- a/clang/lib/Basic/Targets/RISCV.cpp
+++ b/clang/lib/Basic/Targets/RISCV.cpp
@@ -75,6 +75,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;
}
}
diff --git a/clang/test/CodeGen/riscv-inline-asm.c b/clang/test/CodeGen/riscv-inline-asm.c
index f79527337bd..2c92d15ca90 100644
--- a/clang/test/CodeGen/riscv-inline-asm.c
+++ b/clang/test/CodeGen/riscv-inline-asm.c
@@ -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));
+}
OpenPOWER on IntegriCloud