diff --git a/clang/test/Preprocessor/riscv-target-features.c b/clang/test/Preprocessor/riscv-target-features.c --- a/clang/test/Preprocessor/riscv-target-features.c +++ b/clang/test/Preprocessor/riscv-target-features.c @@ -45,6 +45,7 @@ // CHECK-NOT: __riscv_zk // CHECK-NOT: __riscv_zicbom // CHECK-NOT: __riscv_zicboz +// CHECK-NOT: __riscv_zcmt // RUN: %clang -target riscv32-unknown-linux-gnu -march=rv32im -x c -E -dM %s \ // RUN: -o - | FileCheck --check-prefix=CHECK-M-EXT %s @@ -462,3 +463,10 @@ // RUN: %clang -target riscv64 -march=rv64izicbop -x c -E -dM %s \ // RUN: -o - | FileCheck --check-prefix=CHECK-ZICBOP-EXT %s // CHECK-ZICBOP-EXT: __riscv_zicbop 1000000{{$}} + +// RUN: %clang -target riscv32 -march=rv32izcmt0p70 -menable-experimental-extensions \ +// RUN: -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-ZCMT-EXT %s +// RUN: %clang -target riscv64 -march=rv64izcmt0p70 -menable-experimental-extensions \ +// RUN: -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-ZCMT-EXT %s +// CHECK-ZCMT-EXT: __riscv_zca 70000{{$}} +// CHECK-ZCMT-EXT: __riscv_zcmt 70000{{$}} diff --git a/llvm/docs/RISCVUsage.rst b/llvm/docs/RISCVUsage.rst new file mode 100644 --- /dev/null +++ b/llvm/docs/RISCVUsage.rst @@ -0,0 +1,157 @@ +============================= +User Guide for RISC-V Target +============================= + +.. contents:: + :local: + +Introduction +============ + +The RISC-V target provides code generation for processors implementing +supported variations of the RISC-V specification. It lives in the +``llvm/lib/Target/RISCV`` directory. + +Base ISAs +========= + +The specification defines four base instruction sets: RV32I, RV32E, RV64I, +and RV128I. Currently, LLVM fully supports RV32I, and RV64I. RV32E is +supported by the assembly-based tools only. RV128I is not supported. + +To specify the target triple: + + .. table:: RISC-V Architectures + + ============ ============================================================== + Architecture Description + ============ ============================================================== + ``riscv32`` RISC-V with XLEN=32 (i.e. RV32I or RV32E) + ``riscv64`` RISC-V with XLEN=64 (i.e. RV64I) + ============ ============================================================== + +To select an E variant ISA (e.g. RV32E instead of RV32I), use the base +architecture string (e.g. ``riscv32``) with the extension ``e``. + +.. _riscv-extensions: + +Extensions +========== + +The following table provides a status summary for extensions which have been +ratified and thus have finalized specifications. When relevant, detailed notes +on support follow. + + .. table:: Ratified Extensions by Status + + =============== ========================================================= + Extension Status + =============== ========================================================= + ``A`` Supported + ``C`` Supported + ``D`` Supported + ``F`` Supported + ``M`` Supported + ``V`` Supported + ``Zba`` Supported + ``Zbb`` Supported + ``Zbc`` Supported + ``Zbkb`` Supported (`See note <#riscv-scalar-crypto-note1>`__) + ``Zbkc`` Supported + ``Zbkx`` Supported (`See note <#riscv-scalar-crypto-note1>`__) + ``Zbs`` Supported + ``Zdinx`` Assembly Support + ``Zfh`` Supported + ``Zfhmin`` Supported + ``Zfinx`` Assembly Support + ``Zhinx`` Assembly Support + ``Zhinxmin`` Assembly Support + ``Zicbom`` Assembly Support + ``Zicbop`` Assembly Support + ``Zicboz`` Assembly Support + ``Zihintpause`` Assembly Support + ``Zkn`` Supported + ``Zknd`` Supported (`See note <#riscv-scalar-crypto-note2>`__) + ``Zkne`` Supported (`See note <#riscv-scalar-crypto-note2>`__) + ``Zknh`` Supported (`See note <#riscv-scalar-crypto-note2>`__) + ``Zksed`` Supported (`See note <#riscv-scalar-crypto-note2>`__) + ``Zksh`` Supported (`See note <#riscv-scalar-crypto-note2>`__) + ``Zk`` Supported + ``Zkr`` Supported + ``Zks`` Supported + ``Zkt`` Supported + ``Zmmul`` Supported + ``Zve32x`` (`Partially <#riscv-vlen-32-note>`__) Supported + ``Zve32f`` (`Partially <#riscv-vlen-32-note>`__) Supported + ``Zve64x`` Supported + ``Zve64f`` Supported + ``Zve64d`` Supported + ``Zvl32b`` (`Partially <#riscv-vlen-32-note>`__) Supported + ``Zvl64b`` Supported + ``Zvl128b`` Supported + ``Zvl256b`` Supported + ``Zvl512b`` Supported + ``Zvl1024b`` Supported + ``Zvl2048b`` Supported + ``Zvl4096b`` Supported + ``Zvl8192b`` Supported + ``Zvl16384b`` Supported + ``Zvl32768b`` Supported + ``Zvl65536b`` Supported + =============== ========================================================= + +Assembly Support + LLVM supports the associated instructions in assembly. All assembly related tools (e.g. assembler, disassembler, llvm-objdump, etc..) are supported. Compiler and linker will accept extension names, and linked binaries will contain appropriate ELF flags and attributes to reflect use of named extension. + +Supported + Fully supported by the compiler. This includes everything in Assembly Support, along with - if relevant - C language intrinsics for the instructions and pattern matching by the compiler to recognize idiomatic patterns which can be lowered to the associated instructions. + +.. _riscv-scalar-crypto-note1: + +``Zbkb``, ``Zbkx`` + Pattern matching support for these instructions is incomplete. + +.. _riscv-scalar-crypto-note2: + +``Zknd``, ``Zkne``, ``Zknh``, ``Zksed``, ``Zksh`` + No pattern matching exists. As a result, these instructions can only be used from assembler or via intrinsic calls. + +.. _riscv-vlen-32-note: + +``Zve32x``, ``Zve32f``, ``Zvl32b`` + LLVM currently assumes a minimum VLEN (vector register width) of 64 bits during compilation, and as a result ``Zve32x`` and ``Zve32f`` are supported only for VLEN>=64. Assembly support doesn't have this restriction. + +Experimental Extensions +======================= + +LLVM supports (to various degrees) a number of experimental extensions. All experimental extensions have ``experimental-`` as a prefix. There is explicitly no compatibility promised between versions of the toolchain, and regular users are strongly advised *not* to make use of experimental extensions before they reach ratification. + +The primary goal of experimental support is to assist in the process of ratification by providing an existence proof of an implementation, and simplifying efforts to validate the value of a proposed extension against large code bases. Experimental extensions are expected to either transition to ratified status, or be eventually removed. The decision on whether to accept an experimental extension is currently done on an entirely case by case basis; if you want to propose one, attending the bi-weekly RISC-V sync-up call is strongly advised. + +``experimental-zbe``, ``experimental-zbf``, ``experimental-zbm``, ``experimental-zbp``, ``experimental-zbr``, ``experimental-zbt`` + LLVM implements the `latest state of the bitmanip working branch `_, which is largely similar to the 0.93 draft specification but with some instruction naming changes. These are individual portions of the bitmanip efforts which did *not* get ratified. Given ratification for these sub-extensions appears stalled; they are a likely candidate for removal in the future. + +``experimental-zca`` + LLVM implements the `0.70 draft specification `_. + +``experimental-zcmt`` + LLVM implements the `1.0.0-RC5.7 draft specification `_. + +``experimental-zihintntl`` + LLVM implements the `0.2 draft specification `_. + +``experimental-ztso`` + LLVM implements the `v0.1 proposed specification `_ (see Chapter 25). Using will set appropriate ELF flags and attributes, but does not yet change code generation. + +``experimental-zvfh`` + LLVM implements `this draft text `_. + +To use an experimental extension from `clang`, you must add `-menable-experimental-extensions` to the command line, and specify the exact version of the experimental extension you are using. To use an experimental extension with LLVM's internal developer tools (e.g. `llc`, `llvm-objdump`, `llvm-mc`), you must prefix the extension name with `experimental-`. Note that you don't need to specify the version with internal tools, and shouldn't include the `experimental-` prefix with `clang`. + +Specification Documents +======================= +For ratified specifications, please refer to the `official RISC-V International +page `_. Make sure to check the +`wiki for not yet integrated extensions +`_. + diff --git a/llvm/lib/Support/RISCVISAInfo.cpp b/llvm/lib/Support/RISCVISAInfo.cpp --- a/llvm/lib/Support/RISCVISAInfo.cpp +++ b/llvm/lib/Support/RISCVISAInfo.cpp @@ -113,6 +113,7 @@ {"zbr", RISCVExtensionVersion{0, 93}}, {"zbt", RISCVExtensionVersion{0, 93}}, {"zca", RISCVExtensionVersion{0, 70}}, + {"zcmt", RISCVExtensionVersion{0, 70}}, {"zvfh", RISCVExtensionVersion{0, 1}}, }; @@ -700,6 +701,7 @@ Error RISCVISAInfo::checkDependency() { bool IsRv32 = XLen == 32; + bool HasC = Exts.count("c") != 0; bool HasE = Exts.count("e") != 0; bool HasD = Exts.count("d") != 0; bool HasF = Exts.count("f") != 0; @@ -709,6 +711,7 @@ bool HasZve32f = Exts.count("zve32f") != 0; bool HasZve64d = Exts.count("zve64d") != 0; bool HasZvl = MinVLen != 0; + bool HasZcmt = Exts.count("zcmt") != 0; if (HasE && !IsRv32) return createStringError( @@ -745,6 +748,10 @@ errc::invalid_argument, "zvl*b requires v or zve* extension to also be specified"); + if (HasZcmt && HasC) + return createStringError(errc::invalid_argument, + "zcmt is not allowed when c is specified"); + // Additional dependency checks. // TODO: The 'q' extension requires rv64. // TODO: It is illegal to specify 'e' extensions with 'f' and 'd'. @@ -778,6 +785,7 @@ static const char *ImpliedExtsZkn[] = {"zbkb", "zbkc", "zbkx", "zkne", "zknd", "zknh"}; static const char *ImpliedExtsZks[] = {"zbkb", "zbkc", "zbkx", "zksed", "zksh"}; static const char *ImpliedExtsZvfh[] = {"zve32f"}; +static const char *ImpliedExtsZcmt[] = {"zca"}; struct ImpliedExtsEntry { StringLiteral Name; @@ -793,6 +801,7 @@ // Note: The table needs to be sorted by name. static constexpr ImpliedExtsEntry ImpliedExts[] = { {{"v"}, {ImpliedExtsV}}, + {{"zcmt"}, {ImpliedExtsZcmt}}, {{"zdinx"}, {ImpliedExtsZdinx}}, {{"zfh"}, {ImpliedExtsZfh}}, {{"zfhmin"}, {ImpliedExtsZfhmin}}, diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -568,6 +568,7 @@ bool isUImm3() { return IsUImm<3>(); } bool isUImm5() { return IsUImm<5>(); } bool isUImm7() { return IsUImm<7>(); } + bool isUImm8() { return IsUImm<8>(); } bool isRnumArg() const { int64_t Imm; @@ -1175,6 +1176,8 @@ return generateImmOutOfRangeError( Operands, ErrorInfo, 0, (1 << 7) - 4, "immediate must be a multiple of 4 bytes in the range"); + case Match_InvalidUImm8: + return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 8) - 1); case Match_InvalidUImm8Lsb00: return generateImmOutOfRangeError( Operands, ErrorInfo, 0, (1 << 8) - 4, diff --git a/llvm/lib/Target/RISCV/RISCV.td b/llvm/lib/Target/RISCV/RISCV.td --- a/llvm/lib/Target/RISCV/RISCV.td +++ b/llvm/lib/Target/RISCV/RISCV.td @@ -360,6 +360,14 @@ "'C' (Compressed Instructions) or " "'Zca' (part of the C extension, excluding compressed floating point loads/stores)">; +def FeatureExtZcmt + : SubtargetFeature<"experimental-zcmt", "HasStdExtZcmt", "true", + "'Zcmt' (table jump instuctions for code-size reduction)", + [FeatureExtZca]>; // TODO: add Zicsr as another dependence +def HasStdExtZcmt : Predicate<"Subtarget->hasStdExtZcmt() && !Subtarget->hasStdExtC()">, + AssemblerPredicate<(all_of FeatureExtZcmt, (not FeatureStdExtC)), + "'Zcmt' (table jump instuctions for code-size reduction)">; + def FeatureNoRVCHints : SubtargetFeature<"no-rvc-hints", "EnableRVCHintInstrs", "false", "Disable RVC Hint Instructions.">; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -5,6 +5,12 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// +// +// This file describes the RISC-V instructions from the standard 'C', Compressed +// Instructions extension, and 'Zc*'-1.0.0-RC5.7 family, the code size reduction +// extensions. +// +//===----------------------------------------------------------------------===// include "RISCVInstrFormatsC.td" @@ -118,6 +124,18 @@ }]; } +def uimm8 : Operand, + ImmLeaf(Imm);}]> { + let ParserMatchClass = UImmAsmOperand<8>; + let EncoderMethod = "getImmOpValue"; + let DecoderMethod = "decodeUImmOperand<8>"; + let MCOperandPredicate = [{ + int64_t Imm; + if (!MCOp.evaluateAsConstantImm(Imm)) + return false; + }]; +} + // A 8-bit unsigned immediate where the least significant two bits are zero. def uimm8_lsb00 : Operand, ImmLeaf(Imm);}]> { @@ -599,6 +617,25 @@ } // Predicates = [HasStdExtCOrZca] +let Predicates = [HasStdExtZcmt], +hasSideEffects = 0, mayLoad = 0, mayStore = 0 in { +def CM_JT : RVInst16CJ<0b101, 0b10, (outs), (ins uimm5:$index), + "cm.jt", "$index">{ + bits<5> index; + + let Inst{12-7} = 0b000000; + let Inst{6-2} = index; +} + +def CM_JALT : RVInst16CJ<0b101, 0b10, (outs), (ins uimm8:$index), + "cm.jalt", "$index">{ + bits<8> index; + + let Inst{12-10} = 0b000; + let Inst{9-2} = index; +} +} // Predicates = [HasStdExtZcmt] + //===----------------------------------------------------------------------===// // HINT Instructions //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/RISCV/RISCVSchedRocket.td b/llvm/lib/Target/RISCV/RISCVSchedRocket.td --- a/llvm/lib/Target/RISCV/RISCVSchedRocket.td +++ b/llvm/lib/Target/RISCV/RISCVSchedRocket.td @@ -18,9 +18,9 @@ let MispredictPenalty = 3; let CompleteModel = false; let UnsupportedFeatures = [HasStdExtZbkb, HasStdExtZbkc, HasStdExtZbkx, - HasStdExtZknd, HasStdExtZkne, HasStdExtZknh, - HasStdExtZksed, HasStdExtZksh, HasStdExtZkr, - HasVInstructions, HasVInstructionsI64]; + HasStdExtZcmt, HasStdExtZknd, HasStdExtZkne, + HasStdExtZknh, HasStdExtZksed, HasStdExtZksh, + HasStdExtZkr, HasVInstructions, HasVInstructionsI64]; } //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td --- a/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td +++ b/llvm/lib/Target/RISCV/RISCVSchedSiFive7.td @@ -16,9 +16,9 @@ let MispredictPenalty = 3; let CompleteModel = 0; let UnsupportedFeatures = [HasStdExtZbkb, HasStdExtZbkc, HasStdExtZbkx, - HasStdExtZknd, HasStdExtZkne, HasStdExtZknh, - HasStdExtZksed, HasStdExtZksh, HasStdExtZkr, - HasVInstructions]; + HasStdExtZcmt, HasStdExtZknd, HasStdExtZkne, + HasStdExtZknh, HasStdExtZksed, HasStdExtZksh, + HasStdExtZkr, HasVInstructions]; } // The SiFive7 microarchitecture has two pipelines: A and B. diff --git a/llvm/lib/Target/RISCV/RISCVSubtarget.h b/llvm/lib/Target/RISCV/RISCVSubtarget.h --- a/llvm/lib/Target/RISCV/RISCVSubtarget.h +++ b/llvm/lib/Target/RISCV/RISCVSubtarget.h @@ -62,6 +62,7 @@ bool HasStdExtZbs = false; bool HasStdExtZbt = false; bool HasStdExtZca = false; + bool HasStdExtZcmt = false; bool HasStdExtV = false; bool HasStdExtZve32x = false; bool HasStdExtZve32f = false; @@ -171,6 +172,7 @@ bool hasStdExtZbs() const { return HasStdExtZbs; } bool hasStdExtZbt() const { return HasStdExtZbt; } bool hasStdExtZca() const { return HasStdExtZca; } + bool hasStdExtZcmt() const { return HasStdExtZcmt; } bool hasStdExtZvl() const { return ZvlLen != 0; } bool hasStdExtZvfh() const { return HasStdExtZvfh; } bool hasStdExtZfhmin() const { return HasStdExtZfhmin; } diff --git a/llvm/lib/Target/RISCV/RISCVSystemOperands.td b/llvm/lib/Target/RISCV/RISCVSystemOperands.td --- a/llvm/lib/Target/RISCV/RISCVSystemOperands.td +++ b/llvm/lib/Target/RISCV/RISCVSystemOperands.td @@ -378,3 +378,9 @@ //===----------------------------------------------- def SEED : SysReg<"seed", 0x015>; + +//===----------------------------------------------- +// Jump Vector Table CSR +//===----------------------------------------------- + +def : SysReg<"jvt", 0x017>; diff --git a/llvm/test/CodeGen/RISCV/attributes.ll b/llvm/test/CodeGen/RISCV/attributes.ll --- a/llvm/test/CodeGen/RISCV/attributes.ll +++ b/llvm/test/CodeGen/RISCV/attributes.ll @@ -42,6 +42,7 @@ ; RUN: llc -mtriple=riscv32 -mattr=+zicbom %s -o - | FileCheck --check-prefix=RV32ZICBOM %s ; RUN: llc -mtriple=riscv32 -mattr=+zicboz %s -o - | FileCheck --check-prefix=RV32ZICBOZ %s ; RUN: llc -mtriple=riscv32 -mattr=+zicbop %s -o - | FileCheck --check-prefix=RV32ZICBOP %s +; RUN: llc -mtriple=riscv32 -mattr=+experimental-zcmt %s -o - | FileCheck --check-prefix=RV32ZCMT %s ; RUN: llc -mtriple=riscv64 -mattr=+m %s -o - | FileCheck --check-prefix=RV64M %s ; RUN: llc -mtriple=riscv64 -mattr=+zmmul %s -o - | FileCheck --check-prefix=RV64ZMMUL %s ; RUN: llc -mtriple=riscv64 -mattr=+m,+zmmul %s -o - | FileCheck --check-prefix=RV64MZMMUL %s @@ -84,6 +85,7 @@ ; RUN: llc -mtriple=riscv64 -mattr=+zicbom %s -o - | FileCheck --check-prefix=RV64ZICBOM %s ; RUN: llc -mtriple=riscv64 -mattr=+zicboz %s -o - | FileCheck --check-prefix=RV64ZICBOZ %s ; RUN: llc -mtriple=riscv64 -mattr=+zicbop %s -o - | FileCheck --check-prefix=RV64ZICBOP %s +; RUN: llc -mtriple=riscv64 -mattr=+experimental-zcmt %s -o - | FileCheck --check-prefix=RV64ZCMT %s ; RV32M: .attribute 5, "rv32i2p0_m2p0" ; RV32ZMMUL: .attribute 5, "rv32i2p0_zmmul1p0" @@ -127,6 +129,7 @@ ; RV32ZICBOM: .attribute 5, "rv32i2p0_zicbom1p0" ; RV32ZICBOZ: .attribute 5, "rv32i2p0_zicboz1p0" ; RV32ZICBOP: .attribute 5, "rv32i2p0_zicbop1p0" +; RV32ZCMT: .attribute 5, "rv32i2p0_zca0p70_zcmt0p70" ; RV64M: .attribute 5, "rv64i2p0_m2p0" ; RV64ZMMUL: .attribute 5, "rv64i2p0_zmmul1p0" @@ -170,6 +173,7 @@ ; RV64ZICBOM: .attribute 5, "rv64i2p0_zicbom1p0" ; RV64ZICBOZ: .attribute 5, "rv64i2p0_zicboz1p0" ; RV64ZICBOP: .attribute 5, "rv64i2p0_zicbop1p0" +; RV64ZCMT: .attribute 5, "rv64i2p0_zca0p70_zcmt0p70" define i32 @addi(i32 %a) { %1 = add i32 %a, 1 diff --git a/llvm/test/MC/RISCV/attribute-arch.s b/llvm/test/MC/RISCV/attribute-arch.s --- a/llvm/test/MC/RISCV/attribute-arch.s +++ b/llvm/test/MC/RISCV/attribute-arch.s @@ -196,3 +196,6 @@ .attribute arch, "rv32izca0p70" # CHECK: attribute 5, "rv32i2p0_zca0p70" + +.attribute arch, "rv32izcmt0p70" +# CHECK: attribute 5, "rv32i2p0_zca0p70_zcmt0p70" diff --git a/llvm/test/MC/RISCV/rv32zcmt-invalid.s b/llvm/test/MC/RISCV/rv32zcmt-invalid.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/RISCV/rv32zcmt-invalid.s @@ -0,0 +1,10 @@ +# RUN: not llvm-mc -triple=riscv32 -mattr=+experimental-zcmt -riscv-no-aliases -show-encoding < %s 2>&1 \ +# RUN: | FileCheck -check-prefixes=CHECK-ERROR %s +# RUN: not llvm-mc -triple=riscv64 -mattr=+experimental-zcmt -riscv-no-aliases -show-encoding < %s 2>&1 \ +# RUN: | FileCheck -check-prefixes=CHECK-ERROR %s + +# CHECK-ERROR: error: immediate must be an integer in the range [0, 31] +cm.jt 64 + +# CHECK-ERROR: error: immediate must be an integer in the range [0, 255] +cm.jalt 256 diff --git a/llvm/test/MC/RISCV/rv32zcmt-valid.s b/llvm/test/MC/RISCV/rv32zcmt-valid.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/RISCV/rv32zcmt-valid.s @@ -0,0 +1,39 @@ +# RUN: llvm-mc %s -triple=riscv32 -mattr=+experimental-zcmt\ +# RUN: -riscv-no-aliases -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s +# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+experimental-zcmt\ +# RUN: -mattr=m < %s \ +# RUN: | llvm-objdump --mattr=+experimental-zcmt\ +# RUN: -M no-aliases -d -r - \ +# RUN: | FileCheck --check-prefixes=CHECK-OBJ,CHECK-ASM-AND-OBJ %s +# RUN: llvm-mc %s -triple=riscv64 -mattr=+experimental-zcmt\ +# RUN: -riscv-no-aliases -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s +# RUN: llvm-mc -filetype=obj -triple=riscv64 -mattr=+experimental-zcmt\ +# RUN: -mattr=m < %s \ +# RUN: | llvm-objdump --mattr=+experimental-zcmt\ +# RUN: -M no-aliases -d -r - \ +# RUN: | FileCheck --check-prefixes=CHECK-OBJ,CHECK-ASM-AND-OBJ %s +# +# RUN: not llvm-mc -triple riscv32 \ +# RUN: -riscv-no-aliases -show-encoding < %s 2>&1 \ +# RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s +# RUN: not llvm-mc -triple riscv64 \ +# RUN: -riscv-no-aliases -show-encoding < %s 2>&1 \ +# RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s + +# CHECK-ASM-AND-OBJ: cm.jt 1 +# CHECK-ASM: encoding: [0x06,0xa0] +# CHECK-NO-EXT: error: instruction requires the following: 'Zcmt' (table jump instuctions for code-size reduction){{$}} +cm.jt 1 + +# CHECK-ASM: cm.jalt 1 +# CHECK-OBJ: cm.jt 1 +# CHECK-ASM: encoding: [0x06,0xa0] +# CHECK-NO-EXT: error: instruction requires the following: 'Zcmt' (table jump instuctions for code-size reduction){{$}} +cm.jalt 1 + +# CHECK-ASM-AND-OBJ: cm.jalt 32 +# CHECK-ASM: encoding: [0x82,0xa0] +# CHECK-NO-EXT: error: instruction requires the following: 'Zcmt' (table jump instuctions for code-size reduction){{$}} +cm.jalt 32 diff --git a/llvm/test/MC/RISCV/rvzcmt-user-csr-name.s b/llvm/test/MC/RISCV/rvzcmt-user-csr-name.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/RISCV/rvzcmt-user-csr-name.s @@ -0,0 +1,29 @@ +# RUN: llvm-mc %s -triple=riscv32 -riscv-no-aliases -mattr=+experimental-zcmt -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK-INST,CHECK-ENC %s +# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+experimental-zcmt < %s \ +# RUN: | llvm-objdump -d --mattr=+experimental-zcmt - \ +# RUN: | FileCheck -check-prefix=CHECK-INST-ALIAS %s +# +# RUN: llvm-mc %s -triple=riscv64 -riscv-no-aliases -mattr=+experimental-zcmt -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK-INST,CHECK-ENC %s +# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+experimental-zcmt < %s \ +# RUN: | llvm-objdump -d --mattr=+experimental-zcmt - \ +# RUN: | FileCheck -check-prefix=CHECK-INST-ALIAS %s + +################################## +# Jump Vector Table CSR +################################## + +# jvt +# name +# CHECK-INST: csrrs t1, jvt, zero +# CHECK-ENC: encoding: [0x73,0x23,0x70,0x01] +# CHECK-INST-ALIAS: csrr t1, jvt +# uimm12 +# CHECK-INST: csrrs t2, jvt, zero +# CHECK-ENC: encoding: [0xf3,0x23,0x70,0x01] +# CHECK-INST-ALIAS: csrr t2, jvt +# name +csrrs t1, jvt, zero +# uimm12 +csrrs t2, 0x017, zero