From 7400d285e85f169b1db89d96e388af916fc8cc77 Mon Sep 17 00:00:00 2001 From: Lewis Revill Date: Tue, 11 Jun 2019 12:44:01 +0000 Subject: [PATCH] [RISCV] Add inline asm constraints I, J & K for RISC-V This allows the constraints I, J & K to be used in inline asm for RISC-V, with the following semantics (equivalent to GCC): I: Any 12-bit signed immediate. J: Integer zero only. K: Any 5-bit unsigned immediate. See the GCC definitions here: https://gcc.gnu.org/onlinedocs/gccint/Machine-Constraints.html Differential Revision: https://reviews.llvm.org/D54091 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@363055 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets/RISCV.cpp | 20 ++++++++++++++++++++ lib/Basic/Targets/RISCV.h | 4 +--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/Basic/Targets/RISCV.cpp b/lib/Basic/Targets/RISCV.cpp index 1eb36d167c..f800bb0b25 100644 --- a/lib/Basic/Targets/RISCV.cpp +++ b/lib/Basic/Targets/RISCV.cpp @@ -39,6 +39,26 @@ ArrayRef RISCVTargetInfo::getGCCRegAliases() const { return llvm::makeArrayRef(GCCRegAliases); } +bool RISCVTargetInfo::validateAsmConstraint( + const char *&Name, TargetInfo::ConstraintInfo &Info) const { + switch (*Name) { + default: + return false; + case 'I': + // A 12-bit signed immediate. + Info.setRequiresImmediate(-2048, 2047); + return true; + case 'J': + // Integer zero. + Info.setRequiresImmediate(0); + return true; + case 'K': + // A 5-bit unsigned immediate for CSR access instructions. + Info.setRequiresImmediate(0, 31); + return true; + } +} + void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { Builder.defineMacro("__ELF__"); diff --git a/lib/Basic/Targets/RISCV.h b/lib/Basic/Targets/RISCV.h index cc513cf728..c2d0f73b1a 100644 --- a/lib/Basic/Targets/RISCV.h +++ b/lib/Basic/Targets/RISCV.h @@ -61,9 +61,7 @@ public: ArrayRef getGCCRegAliases() const override; bool validateAsmConstraint(const char *&Name, - TargetInfo::ConstraintInfo &Info) const override { - return false; - } + TargetInfo::ConstraintInfo &Info) const override; bool hasFeature(StringRef Feature) const override; -- 2.50.1