diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2015-03-30 13:47:23 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2015-03-30 13:47:23 +0000 |
commit | 48fa39e4a1ad5e9670482530fba50ae288076e84 (patch) | |
tree | 00d5aa8865600882db556ab75632d021bcf1b185 | |
parent | b8d76fb7ca255e7885d754a4df8c4715a4aa7a3f (diff) | |
download | bcm5719-llvm-48fa39e4a1ad5e9670482530fba50ae288076e84.tar.gz bcm5719-llvm-48fa39e4a1ad5e9670482530fba50ae288076e84.zip |
[mips] Add support for 'ZC' inline assembly memory constraint.
Summary: Also add tests for 'R' and 'm'.
Reviewers: atanasyan
Reviewed By: atanasyan
Subscribers: cfe-commits
Differential Revision: http://reviews.llvm.org/D8449
llvm-svn: 233542
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 21 | ||||
-rw-r--r-- | clang/test/CodeGen/mips-inline-asm.c | 19 |
2 files changed, 40 insertions, 0 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index c8fa0cce25f..7cb6480c2c7 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -5857,7 +5857,28 @@ public: case 'R': // An address that can be used in a non-macro load or store Info.setAllowsMemory(); return true; + case 'Z': + if (Name[1] == 'C') { // An address usable by ll, and sc. + Info.setAllowsMemory(); + Name++; // Skip over 'Z'. + return true; + } + return false; + } + } + + std::string convertConstraint(const char *&Constraint) const override { + std::string R; + switch (*Constraint) { + case 'Z': // Two-character constraint; add "^" hint for later parsing. + if (Constraint[1] == 'C') { + R = std::string("^") + std::string(Constraint, 2); + Constraint++; + return R; + } + break; } + return TargetInfo::convertConstraint(Constraint); } const char *getClobbers() const override { diff --git a/clang/test/CodeGen/mips-inline-asm.c b/clang/test/CodeGen/mips-inline-asm.c new file mode 100644 index 00000000000..2cfa41c98de --- /dev/null +++ b/clang/test/CodeGen/mips-inline-asm.c @@ -0,0 +1,19 @@ +// REQUIRES: mips-registered-target +// RUN: %clang_cc1 -triple mips-linux-gnu -emit-llvm -o - %s | FileCheck %s + +int data; + +void m () { + asm("lw $1, %0" :: "m"(data)); + // CHECK: call void asm sideeffect "lw $$1, $0", "*m,~{$1}"(i32* @data) +} + +void ZC () { + asm("ll $1, %0" :: "ZC"(data)); + // CHECK: call void asm sideeffect "ll $$1, $0", "*^ZC,~{$1}"(i32* @data) +} + +void R () { + asm("lw $1, %0" :: "R"(data)); + // CHECK: call void asm sideeffect "lw $$1, $0", "*R,~{$1}"(i32* @data) +} |