https://github.com/tclin914 updated https://github.com/llvm/llvm-project/pull/135110
>From 1615cb987f60d8c6123f7c95bc7bd7f22d897ea1 Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Wed, 9 Apr 2025 09:44:47 +0800 Subject: [PATCH 01/11] [RISCV] Add Andes XAndesperf (Andes Performance) extension. The spec can be found at: https://github.com/andestech/andes-v5-isa/releases/tag/ast-v5_4_0-release. This patch only supports assembler. Relocation and fixup for the branch and gp-implied instructions will be added in a later patch. --- .../Driver/print-supported-extensions-riscv.c | 1 + llvm/docs/RISCVUsage.rst | 3 + llvm/docs/ReleaseNotes.md | 1 + .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 56 ++- .../RISCV/Disassembler/RISCVDisassembler.cpp | 22 +- .../RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp | 23 +- llvm/lib/Target/RISCV/RISCVFeatures.td | 9 + llvm/lib/Target/RISCV/RISCVInstrInfo.td | 1 + llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td | 358 ++++++++++++++++++ llvm/test/CodeGen/RISCV/attributes.ll | 4 + llvm/test/CodeGen/RISCV/features-info.ll | 1 + llvm/test/MC/RISCV/xandesperf-invalid.s | 56 +++ llvm/test/MC/RISCV/xandesperf-rv64-invalid.s | 20 + llvm/test/MC/RISCV/xandesperf-rv64-valid.s | 34 ++ llvm/test/MC/RISCV/xandesperf-valid.s | 105 +++++ .../TargetParser/RISCVISAInfoTest.cpp | 1 + 16 files changed, 673 insertions(+), 22 deletions(-) create mode 100644 llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td create mode 100644 llvm/test/MC/RISCV/xandesperf-invalid.s create mode 100644 llvm/test/MC/RISCV/xandesperf-rv64-invalid.s create mode 100644 llvm/test/MC/RISCV/xandesperf-rv64-valid.s create mode 100644 llvm/test/MC/RISCV/xandesperf-valid.s diff --git a/clang/test/Driver/print-supported-extensions-riscv.c b/clang/test/Driver/print-supported-extensions-riscv.c index d06cedac5b1eb..f65bfcc2e44d6 100644 --- a/clang/test/Driver/print-supported-extensions-riscv.c +++ b/clang/test/Driver/print-supported-extensions-riscv.c @@ -154,6 +154,7 @@ // CHECK-NEXT: svnapot 1.0 'Svnapot' (NAPOT Translation Contiguity) // CHECK-NEXT: svpbmt 1.0 'Svpbmt' (Page-Based Memory Types) // CHECK-NEXT: svvptc 1.0 'Svvptc' (Obviating Memory-Management Instructions after Marking PTEs Valid) +// CHECK-NEXT: xandesperf 5.0 'XAndesPerf' (Andes Performance Extension) // CHECK-NEXT: xcvalu 1.0 'XCValu' (CORE-V ALU Operations) // CHECK-NEXT: xcvbi 1.0 'XCVbi' (CORE-V Immediate Branching) // CHECK-NEXT: xcvbitmanip 1.0 'XCVbitmanip' (CORE-V Bit Manipulation) diff --git a/llvm/docs/RISCVUsage.rst b/llvm/docs/RISCVUsage.rst index cda7e5fec8488..118f45abc1c31 100644 --- a/llvm/docs/RISCVUsage.rst +++ b/llvm/docs/RISCVUsage.rst @@ -503,6 +503,9 @@ The current vendor extensions supported are: ``experimental-XRivosVizip`` LLVM implements `version 0.1 of the Rivos Vector Register Zips extension specification <https://github.com/rivosinc/rivos-custom-extensions>`__. +``XAndesPerf`` + LLVM implements `version 5.0.0 of the Andes Performance Extension specification <https://github.com/andestech/andes-v5-isa/releases/download/ast-v5_4_0-release/AndeStar_V5_ISA_Spec_UM165-v1.5.08-20250317.pdf>` by Andes Technology. All instructions are prefixed with `nds.` as described in the specification. + Experimental C Intrinsics ========================= diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 526d6b4002bba..6c219a5af8398 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -159,6 +159,7 @@ Changes to the RISC-V Backend * Adds assembler support for ``.option exact``, which disables automatic compression, and branch and linker relaxation. This can be disabled with ``.option noexact``, which is also the default. +* Adds assembler support for the Andes `XAndesperf` (Andes Performance extension). Changes to the WebAssembly Backend ---------------------------------- diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index c57c123ab01dc..3dafc21b84c21 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -536,19 +536,24 @@ struct RISCVOperand final : public MCParsedAsmOperand { } // True if operand is a symbol with no modifiers, or a constant with no - // modifiers and isShiftedInt<N-1, 1>(Op). - template <int N> bool isBareSimmNLsb0() const { - int64_t Imm; - RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; + // modifiers and isShiftedInt<N-K, K>(Op). + template <unsigned N, unsigned K> bool isBareSimmNLsbK() const { if (!isImm()) return false; - bool IsConstantImm = evaluateConstantImm(getImm(), Imm); - bool IsValid; - if (!IsConstantImm) - IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK); - else - IsValid = isShiftedInt<N - 1, 1>(fixImmediateForRV32(Imm, isRV64Imm())); - return IsValid && VK == RISCVMCExpr::VK_None; + + int64_t Imm; + if (evaluateConstantImm(getImm(), Imm)) + return isShiftedInt<N - K, K>(fixImmediateForRV32(Imm, isRV64Imm())); + + RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; + return RISCVAsmParser::classifySymbolRef(getImm(), VK) && + VK == RISCVMCExpr::VK_None; + } + + // True if operand is a symbol with no modifiers, or a constant with no + // modifiers and isShiftedInt<N-1, 1>(Op). + template <int N> bool isBareSimmNLsb0() const { + return isBareSimmNLsbK<N, 1>(); } // True if operand is a symbol with no modifiers, or a constant with no @@ -856,6 +861,8 @@ struct RISCVOperand final : public MCParsedAsmOperand { return SignExtend64<32>(Imm); } + bool isSImm11Lsb0() const { return isBareSimmNLsb0<11>(); } + bool isSImm12() const { if (!isImm()) return false; @@ -940,6 +947,14 @@ struct RISCVOperand final : public MCParsedAsmOperand { [](int64_t Imm) { return Imm != INT64_MIN && isInt<5>(Imm - 1); }); } + bool isSImm18() const { return isBareSimmNLsbK<18, 0>(); } + + bool isSImm18Lsb0() const { return isBareSimmNLsb0<18>(); } + + bool isSImm19Lsb00() const { return isBareSimmNLsbK<19, 2>(); } + + bool isSImm20Lsb000() const { return isBareSimmNLsbK<20, 3>(); } + bool isSImm32Lsb0() const { return isSImmPred([](int64_t Imm) { return isShiftedInt<31, 1>(Imm); }); } @@ -1511,6 +1526,10 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, case Match_InvalidSImm11: return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 10), (1 << 10) - 1); + case Match_InvalidSImm11Lsb0: + return generateImmOutOfRangeError( + Operands, ErrorInfo, -(1 << 10), (1 << 10) - 2, + "immediate must be a multiple of 2 bytes in the range"); case Match_InvalidUImm10: return generateImmOutOfRangeError(Operands, ErrorInfo, 0, (1 << 10) - 1); case Match_InvalidUImm11: @@ -1583,6 +1602,21 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, (1 << 4), "immediate must be in the range"); } + case Match_InvalidSImm18: + return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 17), + (1 << 17) - 1); + case Match_InvalidSImm18Lsb0: + return generateImmOutOfRangeError( + Operands, ErrorInfo, -(1 << 17), (1 << 17) - 2, + "immediate must be a multiple of 2 bytes in the range"); + case Match_InvalidSImm19Lsb00: + return generateImmOutOfRangeError( + Operands, ErrorInfo, -(1 << 18), (1 << 18) - 4, + "immediate must be a multiple of 4 bytes in the range"); + case Match_InvalidSImm20Lsb000: + return generateImmOutOfRangeError( + Operands, ErrorInfo, -(1 << 19), (1 << 19) - 8, + "immediate must be a multiple of 8 bytes in the range"); case Match_InvalidSImm26: return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 25), (1 << 25) - 1); diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp index 366291b53bebb..c793bf2fa75f2 100644 --- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp +++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp @@ -447,18 +447,25 @@ static DecodeStatus decodeSImmNonZeroOperand(MCInst &Inst, uint32_t Imm, return decodeSImmOperand<N>(Inst, Imm, Address, Decoder); } -template <unsigned N> -static DecodeStatus decodeSImmOperandAndLsl1(MCInst &Inst, uint32_t Imm, +template <unsigned T, unsigned N> +static DecodeStatus decodeSImmOperandAndLslN(MCInst &Inst, uint64_t Imm, int64_t Address, const MCDisassembler *Decoder) { - assert(isUInt<N>(Imm) && "Invalid immediate"); - // Sign-extend the number in the bottom N bits of Imm after accounting for - // the fact that the N bit immediate is stored in N-1 bits (the LSB is + assert(isUInt<T - N + 1>(Imm) && "Invalid immediate"); + // Sign-extend the number in the bottom T bits of Imm after accounting for + // the fact that the T bit immediate is stored in T-N bits (the LSB is // always zero) - Inst.addOperand(MCOperand::createImm(SignExtend64<N>(Imm << 1))); + Inst.addOperand(MCOperand::createImm(SignExtend64<T>(Imm << N))); return MCDisassembler::Success; } +template <unsigned T> +static DecodeStatus decodeSImmOperandAndLsl1(MCInst &Inst, uint32_t Imm, + int64_t Address, + const MCDisassembler *Decoder) { + return decodeSImmOperandAndLslN<T, 1>(Inst, Imm, Address, Decoder); +} + static DecodeStatus decodeCLUIImmOperand(MCInst &Inst, uint32_t Imm, int64_t Address, const MCDisassembler *Decoder) { @@ -727,6 +734,8 @@ static constexpr FeatureBitset XTHeadGroup = { RISCV::FeatureVendorXTHeadMemPair, RISCV::FeatureVendorXTHeadSync, RISCV::FeatureVendorXTHeadVdot}; +static constexpr FeatureBitset XAndesGroup = {RISCV::FeatureVendorXAndesPerf}; + static constexpr DecoderListEntry DecoderList32[]{ // Vendor Extensions {DecoderTableXVentana32, @@ -740,6 +749,7 @@ static constexpr DecoderListEntry DecoderList32[]{ {DecoderTableXmipscmove32, {RISCV::FeatureVendorXMIPSCMove}, "MIPS mips.ccmov"}, + {DecoderTableXAndes32, XAndesGroup, "Andes extensions"}, // Standard Extensions {DecoderTableXCV32, XCVFeatureGroup, "CORE-V extensions"}, {DecoderTableXqci32, XqciFeatureGroup, "Qualcomm uC Extensions"}, diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp index 95858da45f202..ed56a92d08af8 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp @@ -96,6 +96,11 @@ class RISCVMCCodeEmitter : public MCCodeEmitter { SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI) const; + template <unsigned N> + unsigned getImmOpValueAsrN(const MCInst &MI, unsigned OpNo, + SmallVectorImpl<MCFixup> &Fixups, + const MCSubtargetInfo &STI) const; + uint64_t getImmOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI) const; @@ -535,21 +540,29 @@ RISCVMCCodeEmitter::getImmOpValueSlist(const MCInst &MI, unsigned OpNo, } } -uint64_t -RISCVMCCodeEmitter::getImmOpValueAsr1(const MCInst &MI, unsigned OpNo, +template <unsigned N> +unsigned +RISCVMCCodeEmitter::getImmOpValueAsrN(const MCInst &MI, unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI) const { const MCOperand &MO = MI.getOperand(OpNo); if (MO.isImm()) { - uint64_t Res = MO.getImm(); - assert((Res & 1) == 0 && "LSB is non-zero"); - return Res >> 1; + unsigned Res = MO.getImm(); + assert((Res & ((1 << N) - 1)) == 0 && "LSB is non-zero"); + return Res >> N; } return getImmOpValue(MI, OpNo, Fixups, STI); } +uint64_t +RISCVMCCodeEmitter::getImmOpValueAsr1(const MCInst &MI, unsigned OpNo, + SmallVectorImpl<MCFixup> &Fixups, + const MCSubtargetInfo &STI) const { + return getImmOpValueAsrN<1>(MI, OpNo, Fixups, STI); +} + uint64_t RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI) const { diff --git a/llvm/lib/Target/RISCV/RISCVFeatures.td b/llvm/lib/Target/RISCV/RISCVFeatures.td index 60d3c0f397371..19bf35359e49e 100644 --- a/llvm/lib/Target/RISCV/RISCVFeatures.td +++ b/llvm/lib/Target/RISCV/RISCVFeatures.td @@ -1479,6 +1479,15 @@ def HasVendorXRivosVizip AssemblerPredicate<(all_of FeatureVendorXRivosVizip), "'XRivosVizip' (Rivos Vector Register Zips)">; +// Andes Extension(s) + +def FeatureVendorXAndesPerf + : RISCVExtension<5, 0, "Andes Performance Extension">; +def HasVendorXAndesPerf + : Predicate<"Subtarget->hasVendorXAndesPerf()">, + AssemblerPredicate<(all_of FeatureVendorXAndesPerf), + "'XAndesPerf' (Andes Performance Extension)">; + //===----------------------------------------------------------------------===// // LLVM specific features and extensions //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index c87452171f090..f1d455987c713 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -2182,6 +2182,7 @@ include "RISCVInstrInfoXqci.td" include "RISCVInstrInfoXqccmp.td" include "RISCVInstrInfoXMips.td" include "RISCVInstrInfoXRivos.td" +include "RISCVInstrInfoXAndes.td" //===----------------------------------------------------------------------===// // Global ISel diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td new file mode 100644 index 0000000000000..afe6e784dbfb0 --- /dev/null +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td @@ -0,0 +1,358 @@ +//===-- RISCVInstrInfoXAndes.td ----------------------------*- tablegen -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file describes the vendor extensions defined by Andes Technology. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +// Operand and SDNode transformation definitions. +//===----------------------------------------------------------------------===// + +// A 11-bit signed immediate where the least significant bit is zero. +def simm11_lsb0 : Operand<OtherVT> { + let ParserMatchClass = SImmAsmOperand<11, "Lsb0">; + let PrintMethod = "printBranchOperand"; + let EncoderMethod = "getImmOpValueAsr1"; + let DecoderMethod = "decodeSImmOperandAndLsl1<11>"; + let MCOperandPredicate = [{ + int64_t Imm; + if (MCOp.evaluateAsConstantImm(Imm)) + return isShiftedInt<10, 1>(Imm); + return MCOp.isBareSymbolRef(); + }]; + let OperandType = "OPERAND_PCREL"; +} + +def simm18 : Operand<XLenVT> { + let ParserMatchClass = SImmAsmOperand<18>; + let EncoderMethod = "getImmOpValue"; + let DecoderMethod = "decodeSImmOperand<18>"; +} + +def simm18_lsb0 : Operand<XLenVT> { + let ParserMatchClass = SImmAsmOperand<18, "Lsb0">; + let EncoderMethod = "getImmOpValueAsr1"; + let DecoderMethod = "decodeSImmOperandAndLsl1<18>"; +} + +def simm19_lsb00 : Operand<XLenVT> { + let ParserMatchClass = SImmAsmOperand<19, "Lsb00">; + let EncoderMethod = "getImmOpValueAsrN<2>"; + let DecoderMethod = "decodeSImmOperandAndLslN<19, 2>"; +} + +def simm20_lsb000 : Operand<XLenVT> { + let ParserMatchClass = SImmAsmOperand<20, "Lsb000">; + let EncoderMethod = "getImmOpValueAsrN<3>"; + let DecoderMethod = "decodeSImmOperandAndLslN<20, 3>"; +} + +//===----------------------------------------------------------------------===// +// Instruction Class Templates +//===----------------------------------------------------------------------===// + +class NDSRVInstBB<bit cs, string opcodestr> + : RVInst<(outs), (ins GPR:$rs1, uimmlog2xlen:$cimm, simm11_lsb0:$imm10), + opcodestr, "$rs1, $cimm, $imm10", [], InstFormatOther>, + Sched<[WriteJmp, ReadIALU]> { + bits<10> imm10; + bits<5> rs1; + bits<6> cimm; + + let Inst{31} = imm10{9}; + let Inst{30} = cs; + let Inst{29-25} = imm10{8-4}; + let Inst{24-20} = cimm{4-0}; + let Inst{19-15} = rs1; + let Inst{14-12} = 0b111; + let Inst{11-8} = imm10{3-0}; + let Inst{7} = cimm{5}; + let Inst{6-0} = OPC_CUSTOM_2.Value; + let hasSideEffects = 0; + let mayLoad = 0; + let mayStore = 0; + let isBranch = 1; + let isTerminator = 1; +} + +class NDSRVInstBC<bits<3> funct3, string opcodestr> + : RVInst<(outs), (ins GPR:$rs1, uimm7:$cimm, simm11_lsb0:$imm10), + opcodestr, "$rs1, $cimm, $imm10", [], InstFormatOther>, + Sched<[WriteJmp, ReadIALU]> { + bits<10> imm10; + bits<5> rs1; + bits<7> cimm; + + let Inst{31} = imm10{9}; + let Inst{30} = cimm{6}; + let Inst{29-25} = imm10{8-4}; + let Inst{24-20} = cimm{4-0}; + let Inst{19-15} = rs1; + let Inst{14-12} = funct3; + let Inst{11-8} = imm10{3-0}; + let Inst{7} = cimm{5}; + let Inst{6-0} = OPC_CUSTOM_2.Value; + let hasSideEffects = 0; + let mayLoad = 0; + let mayStore = 0; + let isBranch = 1; + let isTerminator = 1; +} + +class NDSRVInstBFO<bits<3> funct3, string opcodestr> + : RVInst<(outs GPR:$rd), (ins GPR:$rs1, uimmlog2xlen:$msb, uimmlog2xlen:$lsb), + opcodestr, "$rd, $rs1, $msb, $lsb", [], InstFormatOther>, + Sched<[WriteIALU, ReadIALU]> { + bits<5> rd; + bits<5> rs1; + bits<6> msb; + bits<6> lsb; + + let Inst{31-26} = msb; + let Inst{25-20} = lsb; + let Inst{19-15} = rs1; + let Inst{14-12} = funct3; + let Inst{11-7} = rd; + let Inst{6-0} = OPC_CUSTOM_2.Value; + let hasSideEffects = 0; + let mayLoad = 0; + let mayStore = 0; +} + +let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in +class NDSRVInstRR<bits<7> funct7, string opcodestr> + : RVInstR<funct7, 0b000, OPC_CUSTOM_2, + (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2), + opcodestr, "$rd, $rs1, $rs2">, + Sched<[WriteIALU, ReadIALU, ReadIALU]> { + let hasSideEffects = 0; + let mayLoad = 0; + let mayStore = 0; +} + +// GP: ADDI, LB, LBU +class NDSRVInstLBGP<bits<2> funct2, string opcodestr> + : RVInst<(outs GPR:$rd), (ins simm18:$imm18), + opcodestr, "$rd, ${imm18}", [], InstFormatOther> { + bits<18> imm18; + bits<5> rd; + + let Inst{31} = imm18{17}; + let Inst{30-21} = imm18{10-1}; + let Inst{20} = imm18{11}; + let Inst{19-17} = imm18{14-12}; + let Inst{16-15} = imm18{16-15}; + let Inst{14} = imm18{0}; + let Inst{13-12} = funct2; + let Inst{11-7} = rd; + let Inst{6-0} = OPC_CUSTOM_0.Value; + let hasSideEffects = 0; + let mayLoad = 1; + let mayStore = 0; +} + +// GP: LH, LHU +class NDSRVInstLHGP<bits<3> funct3, string opcodestr> + : RVInst<(outs GPR:$rd), (ins simm18_lsb0:$imm17), + opcodestr, "$rd, ${imm17}", [], InstFormatOther> { + bits<17> imm17; + bits<5> rd; + + let Inst{31} = imm17{16}; + let Inst{30-21} = imm17{9-0}; + let Inst{20} = imm17{10}; + let Inst{19-17} = imm17{13-11}; + let Inst{16-15} = imm17{15-14}; + let Inst{14-12} = funct3; + let Inst{11-7} = rd; + let Inst{6-0} = OPC_CUSTOM_1.Value; + let hasSideEffects = 0; + let mayLoad = 1; + let mayStore = 0; +} + +class NDSRVInstLWGP<bits<3> funct3, string opcodestr> + : RVInst<(outs GPR:$rd), (ins simm19_lsb00:$imm17), + opcodestr, "$rd, ${imm17}", [], InstFormatOther> { + bits<17> imm17; + bits<5> rd; + + let Inst{31} = imm17{16}; + let Inst{30-22} = imm17{8-0}; + let Inst{21} = imm17{15}; + let Inst{20} = imm17{9}; + let Inst{19-17} = imm17{12-10}; + let Inst{16-15} = imm17{14-13}; + let Inst{14-12} = funct3; + let Inst{11-7} = rd; + let Inst{6-0} = OPC_CUSTOM_1.Value; + let hasSideEffects = 0; + let mayLoad = 1; + let mayStore = 0; +} + +// GP: LD +class NDSRVInstLDGP<bits<3> funct3, string opcodestr> + : RVInst<(outs GPR:$rd), (ins simm20_lsb000:$imm17), + opcodestr, "$rd, ${imm17}", [], InstFormatOther> { + bits<17> imm17; + bits<5> rd; + + let Inst{31} = imm17{16}; + let Inst{30-23} = imm17{7-0}; + let Inst{22-21} = imm17{15-14}; + let Inst{20} = imm17{8}; + let Inst{19-17} = imm17{11-9}; + let Inst{16-15} = imm17{13-12}; + let Inst{14-12} = funct3; + let Inst{11-7} = rd; + let Inst{6-0} = OPC_CUSTOM_1.Value; + let hasSideEffects = 0; + let mayLoad = 1; + let mayStore = 0; +} + +// GP: SB +class NDSRVInstSBGP<bits<2> funct2, string opcodestr> + : RVInst<(outs), (ins GPR:$rs2, simm18:$imm18), + opcodestr, "$rs2, ${imm18}", [], InstFormatOther> { + bits<18> imm18; + bits<5> rs2; + + let Inst{31} = imm18{17}; + let Inst{30-25} = imm18{10-5}; + let Inst{24-20} = rs2; + let Inst{19-17} = imm18{14-12}; + let Inst{16-15} = imm18{16-15}; + let Inst{14} = imm18{0}; + let Inst{13-12} = funct2; + let Inst{11-8} = imm18{4-1}; + let Inst{7} = imm18{11}; + let Inst{6-0} = OPC_CUSTOM_0.Value; + let hasSideEffects = 0; + let mayLoad = 0; + let mayStore = 1; +} + +// GP: SH +class NDSRVInstSHGP<bits<3> funct3, string opcodestr> + : RVInst<(outs), (ins GPR:$rs2, simm18_lsb0:$imm17), + opcodestr, "$rs2, ${imm17}", [], InstFormatOther> { + bits<17> imm17; + bits<5> rs2; + + let Inst{31} = imm17{16}; + let Inst{30-25} = imm17{9-4}; + let Inst{24-20} = rs2; + let Inst{19-17} = imm17{13-11}; + let Inst{16-15} = imm17{15-14}; + let Inst{14-12} = funct3; + let Inst{11-8} = imm17{3-0}; + let Inst{7} = imm17{10}; + let Inst{6-0} = OPC_CUSTOM_1.Value; + let hasSideEffects = 0; + let mayLoad = 0; + let mayStore = 1; +} + +// GP: SW +class NDSRVInstSWGP<bits<3> funct3, string opcodestr> + : RVInst<(outs), (ins GPR:$rs2, simm19_lsb00:$imm17), + opcodestr, "$rs2, ${imm17}", [], InstFormatOther> { + bits<17> imm17; + bits<5> rs2; + + let Inst{31} = imm17{16}; + let Inst{30-25} = imm17{8-3}; + let Inst{24-20} = rs2; + let Inst{19-17} = imm17{12-10}; + let Inst{16-15} = imm17{14-13}; + let Inst{14-12} = funct3; + let Inst{11-9} = imm17{2-0}; + let Inst{8} = imm17{15}; + let Inst{7} = imm17{9}; + let Inst{6-0} = OPC_CUSTOM_1.Value; + let hasSideEffects = 0; + let mayLoad = 0; + let mayStore = 1; +} + +// GP: SD +class NDSRVInstSDGP<bits<3> funct3, string opcodestr> + : RVInst<(outs), (ins GPR:$rs2, simm20_lsb000:$imm17), + opcodestr, "$rs2, ${imm17}", [], InstFormatOther> { + bits<17> imm17; + bits<5> rs2; + + let Inst{31} = imm17{16}; + let Inst{30-25} = imm17{7-2}; + let Inst{24-20} = rs2; + let Inst{19-17} = imm17{11-9}; + let Inst{16-15} = imm17{13-12}; + let Inst{14-12} = funct3; + let Inst{11-10} = imm17{1-0}; + let Inst{9-8} = imm17{15-14}; + let Inst{7} = imm17{8}; + let Inst{6-0} = OPC_CUSTOM_1.Value; + let hasSideEffects = 0; + let mayLoad = 0; + let mayStore = 1; +} + +//===----------------------------------------------------------------------===// +// XAndesPerf +//===----------------------------------------------------------------------===// + +let DecoderNamespace = "XAndes" in { + +let Predicates = [HasVendorXAndesPerf] in { +def NDS_BBC : NDSRVInstBB<0, "nds.bbc">; +def NDS_BBS : NDSRVInstBB<1, "nds.bbs">; + +def NDS_BEQC : NDSRVInstBC<0b101, "nds.beqc">; +def NDS_BNEC : NDSRVInstBC<0b110, "nds.bnec">; + +def NDS_BFOS : NDSRVInstBFO<0b011, "nds.bfos">; +def NDS_BFOZ : NDSRVInstBFO<0b010, "nds.bfoz">; + +def NDS_LEA_H : NDSRVInstRR<0b0000101, "nds.lea.h">; +def NDS_LEA_W : NDSRVInstRR<0b0000110, "nds.lea.w">; +def NDS_LEA_D : NDSRVInstRR<0b0000111, "nds.lea.d">; + +let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in +def NDS_ADDIGP : NDSRVInstLBGP<0b01, "nds.addigp">; + +def NDS_LBGP : NDSRVInstLBGP<0b00, "nds.lbgp">; +def NDS_LBUGP : NDSRVInstLBGP<0b10, "nds.lbugp">; +def NDS_LHGP : NDSRVInstLHGP<0b001, "nds.lhgp">; +def NDS_LHUGP : NDSRVInstLHGP<0b101, "nds.lhugp">; +def NDS_LWGP : NDSRVInstLWGP<0b010, "nds.lwgp">; + +def NDS_SBGP : NDSRVInstSBGP<0b11, "nds.sbgp">; +def NDS_SHGP : NDSRVInstSHGP<0b000, "nds.shgp">; +def NDS_SWGP : NDSRVInstSWGP<0b100, "nds.swgp">; + +def NDS_FFB : NDSRVInstRR<0b0010000, "nds.ffb">; +def NDS_FFZMISM : NDSRVInstRR<0b0010001, "nds.ffzmism">; +def NDS_FFMISM : NDSRVInstRR<0b0010010, "nds.ffmism">; +def NDS_FLMISM : NDSRVInstRR<0b0010011, "nds.flmism">; +} // Predicates = [HasVendorXAndesPerf] + +let Predicates = [HasVendorXAndesPerf, IsRV64] in { +def NDS_LEA_B_ZE : NDSRVInstRR<0b0001000, "nds.lea.b.ze">; +def NDS_LEA_H_ZE : NDSRVInstRR<0b0001001, "nds.lea.h.ze">; +def NDS_LEA_W_ZE : NDSRVInstRR<0b0001010, "nds.lea.w.ze">; +def NDS_LEA_D_ZE : NDSRVInstRR<0b0001011, "nds.lea.d.ze">; + +def NDS_LWUGP : NDSRVInstLWGP<0b110, "nds.lwugp">; +def NDS_LDGP : NDSRVInstLDGP<0b011, "nds.ldgp">; + +def NDS_SDGP : NDSRVInstSDGP<0b111, "nds.sdgp">; +} // Predicates = [HasVendorXAndesPerf, IsRV64] +} // DecoderNamespace = "XAndes" diff --git a/llvm/test/CodeGen/RISCV/attributes.ll b/llvm/test/CodeGen/RISCV/attributes.ll index 4bb3eb81f3dfb..5a181dc94e0f1 100644 --- a/llvm/test/CodeGen/RISCV/attributes.ll +++ b/llvm/test/CodeGen/RISCV/attributes.ll @@ -103,6 +103,7 @@ ; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcisim %s -o - | FileCheck --check-prefix=RV32XQCISIM %s ; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcisync %s -o - | FileCheck --check-prefix=RV32XQCISYNC %s ; RUN: llc -mtriple=riscv32 -mattr=+experimental-xqcisls %s -o - | FileCheck --check-prefix=RV32XQCISLS %s +; RUN: llc -mtriple=riscv32 -mattr=+xandesperf %s -o - | FileCheck --check-prefix=RV32XANDESPERF %s ; RUN: llc -mtriple=riscv32 -mattr=+zaamo %s -o - | FileCheck --check-prefix=RV32ZAAMO %s ; RUN: llc -mtriple=riscv32 -mattr=+zalrsc %s -o - | FileCheck --check-prefix=RV32ZALRSC %s ; RUN: llc -mtriple=riscv32 -mattr=+zca %s -o - | FileCheck --check-prefixes=CHECK,RV32ZCA %s @@ -251,6 +252,7 @@ ; RUN: llc -mtriple=riscv64 -mattr=+xtheadmempair %s -o - | FileCheck --check-prefix=RV64XTHEADMEMPAIR %s ; RUN: llc -mtriple=riscv64 -mattr=+xtheadsync %s -o - | FileCheck --check-prefix=RV64XTHEADSYNC %s ; RUN: llc -mtriple=riscv64 -mattr=+xtheadvdot %s -o - | FileCheck --check-prefixes=CHECK,RV64XTHEADVDOT %s +; RUN: llc -mtriple=riscv64 -mattr=+xandesperf %s -o - | FileCheck --check-prefix=RV64XANDESPERF %s ; RUN: llc -mtriple=riscv64 -mattr=+za64rs %s -o - | FileCheck --check-prefixes=CHECK,RV64ZA64RS %s ; RUN: llc -mtriple=riscv64 -mattr=+za128rs %s -o - | FileCheck --check-prefixes=CHECK,RV64ZA128RS %s ; RUN: llc -mtriple=riscv64 -mattr=+zama16b %s -o - | FileCheck --check-prefixes=CHECK,RV64ZAMA16B %s @@ -441,6 +443,7 @@ ; RV32XQCISIM: attribute 5, "rv32i2p1_zca1p0_xqcisim0p2" ; RV32XQCISYNC: attribute 5, "rv32i2p1_zca1p0_xqcisync0p2" ; RV32XQCISLS: .attribute 5, "rv32i2p1_xqcisls0p2" +; RV32XANDESPERF: .attribute 5, "rv32i2p1_xandesperf5p0" ; RV32ZAAMO: .attribute 5, "rv32i2p1_zaamo1p0" ; RV32ZALRSC: .attribute 5, "rv32i2p1_zalrsc1p0" ; RV32ZCA: .attribute 5, "rv32i2p1_zca1p0" @@ -590,6 +593,7 @@ ; RV64XTHEADMEMPAIR: .attribute 5, "rv64i2p1_xtheadmempair1p0" ; RV64XTHEADSYNC: .attribute 5, "rv64i2p1_xtheadsync1p0" ; RV64XTHEADVDOT: .attribute 5, "rv64i2p1_f2p2_d2p2_v1p0_zicsr2p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0_xtheadvdot1p0" +; RV64XANDESPERF: .attribute 5, "rv64i2p1_xandesperf5p0" ; RV64ZTSO: .attribute 5, "rv64i2p1_ztso1p0" ; RV64ZAAMO: .attribute 5, "rv64i2p1_zaamo1p0" ; RV64ZALRSC: .attribute 5, "rv64i2p1_zalrsc1p0" diff --git a/llvm/test/CodeGen/RISCV/features-info.ll b/llvm/test/CodeGen/RISCV/features-info.ll index 5d2f0881048bd..a00d3b375ff29 100644 --- a/llvm/test/CodeGen/RISCV/features-info.ll +++ b/llvm/test/CodeGen/RISCV/features-info.ll @@ -167,6 +167,7 @@ ; CHECK-NEXT: v - 'V' (Vector Extension for Application Processors). ; CHECK-NEXT: ventana-veyron - Ventana Veyron-Series processors. ; CHECK-NEXT: vxrm-pipeline-flush - VXRM writes causes pipeline flush. +; CHECK-NEXT: xandesperf - 'XAndesPerf' (Andes Performance Extension). ; CHECK-NEXT: xcvalu - 'XCValu' (CORE-V ALU Operations). ; CHECK-NEXT: xcvbi - 'XCVbi' (CORE-V Immediate Branching). ; CHECK-NEXT: xcvbitmanip - 'XCVbitmanip' (CORE-V Bit Manipulation). diff --git a/llvm/test/MC/RISCV/xandesperf-invalid.s b/llvm/test/MC/RISCV/xandesperf-invalid.s new file mode 100644 index 0000000000000..4c5a8d5a20277 --- /dev/null +++ b/llvm/test/MC/RISCV/xandesperf-invalid.s @@ -0,0 +1,56 @@ +# XAndesPerf - Andes Performance Extension +# RUN: not llvm-mc -triple riscv32 -mattr=+xandesperf < %s 2>&1 \ +# RUN: | FileCheck %s +# RUN: not llvm-mc -triple riscv64 -mattr=+xandesperf < %s 2>&1 \ +# RUN: | FileCheck %s -check-prefix=CHECK-64 + +# Out of range immediates +## uimm5 +nds.bbc t0, 33, 256 # CHECK: :[[@LINE]]:13: error: immediate must be an integer in the range [0, 31] +nds.bbs t1, 33, 256 # CHECK: :[[@LINE]]:13: error: immediate must be an integer in the range [0, 31] +nds.bbc t0, 64, 256 # CHECK-64: :[[@LINE]]:13: error: immediate must be an integer in the range [0, 63] +nds.bbs t1, 64, 256 # CHECK-64: :[[@LINE]]:13: error: immediate must be an integer in the range [0, 63] + +## uimm7 +nds.beqc t0, 1024, 13 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 127] +nds.bnec t1, -1, -13 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be an integer in the range [0, 127] + +## simm11_lsb0 +nds.bbc t0, 7, 1024 # CHECK, CHECK-64: :[[@LINE]]:16: error: immediate must be a multiple of 2 bytes in the range [-1024, 1022] +nds.bbs t1, 21, -1200 # CHECK, CHECK-64: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [-1024, 1022] +nds.beqc t0, 7, 13 # CHECK, CHECK-64: :[[@LINE]]:17: error: immediate must be a multiple of 2 bytes in the range [-1024, 1022] +nds.bnec t1, 21, -13 # CHECK, CHECK-64: :[[@LINE]]:18: error: immediate must be a multiple of 2 bytes in the range [-1024, 1022] + +## uimmlog2xlen +nds.bfos a0, a1, 35, 3 # CHECK: :[[@LINE]]:18: error: immediate must be an integer in the range [0, 31] +nds.bfoz t0, t1, 6, 40 # CHECK: :[[@LINE]]:21: error: immediate must be an integer in the range [0, 31] +nds.bfos a0, a1, 64, 3 # CHECK-64: :[[@LINE]]:18: error: immediate must be an integer in the range [0, 63] +nds.bfoz t0, t1, 6, 64 # CHECK-64: :[[@LINE]]:21: error: immediate must be an integer in the range [0, 63] + +## simm18 +nds.addigp t0, 0x20000 # CHECK, CHECK-64: :[[@LINE]]:16: error: immediate must be an integer in the range [-131072, 131071] +nds.addigp t0, -0x20001 # CHECK, CHECK-64: :[[@LINE]]:16: error: immediate must be an integer in the range [-131072, 131071] +nds.lbgp t0, 0x20000 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be an integer in the range [-131072, 131071] +nds.lbugp t0, -0x20001 # CHECK, CHECK-64: :[[@LINE]]:15: error: immediate must be an integer in the range [-131072, 131071] +nds.sbgp t0, 0x20000 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be an integer in the range [-131072, 131071] +nds.sbgp t0, -0x20001 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be an integer in the range [-131072, 131071] + +## simm18_lsb0 +nds.lhgp t0, 0x1ffff # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-131072, 131070] +nds.lhgp t0, 0x3 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-131072, 131070] +nds.lhugp t0, -0x20001 # CHECK, CHECK-64: :[[@LINE]]:15: error: immediate must be a multiple of 2 bytes in the range [-131072, 131070] +nds.lhugp t0, -0x3 # CHECK, CHECK-64: :[[@LINE]]:15: error: immediate must be a multiple of 2 bytes in the range [-131072, 131070] +nds.shgp t0, 0x1ffff # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-131072, 131070] +nds.shgp t0, 0x3 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-131072, 131070] +nds.shgp t0, -0x20001 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-131072, 131070] +nds.shgp t0, -0x3 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 2 bytes in the range [-131072, 131070] + +## simm19_lsb00 +nds.lwgp t0, 0x3fffd # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.lwgp t0, 0x7 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.lwgp t0, -0x40001 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.lwgp t0, -0x7 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.swgp t0, 0x3fffd # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.swgp t0, 0x7 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.swgp t0, -0x40001 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.swgp t0, -0x7 # CHECK, CHECK-64: :[[@LINE]]:14: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] diff --git a/llvm/test/MC/RISCV/xandesperf-rv64-invalid.s b/llvm/test/MC/RISCV/xandesperf-rv64-invalid.s new file mode 100644 index 0000000000000..04a91ab4734c0 --- /dev/null +++ b/llvm/test/MC/RISCV/xandesperf-rv64-invalid.s @@ -0,0 +1,20 @@ +# XAndesPerf - Andes Performance Extension +# RUN: not llvm-mc -triple riscv64 -mattr=+xandesperf < %s 2>&1 \ +# RUN: | FileCheck %s + +# Out of range immediates +## simm19_lsb00 +nds.lwugp t0, 0x3fffd # CHECK: :[[@LINE]]:15: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.lwugp t0, 0x7 # CHECK: :[[@LINE]]:15: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.lwugp t0, -0x40001 # CHECK: :[[@LINE]]:15: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] +nds.lwugp t0, -0x7 # CHECK: :[[@LINE]]:15: error: immediate must be a multiple of 4 bytes in the range [-262144, 262140] + +## simm20_lsb000 +nds.ldgp t0, 0x7fff9 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 8 bytes in the range [-524288, 524280] +nds.ldgp t0, 0x14 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 8 bytes in the range [-524288, 524280] +nds.ldgp t0, -0x80001 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 8 bytes in the range [-524288, 524280] +nds.ldgp t0, -0x14 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 8 bytes in the range [-524288, 524280] +nds.sdgp t0, 0x7fff9 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 8 bytes in the range [-524288, 524280] +nds.sdgp t0, 0x14 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 8 bytes in the range [-524288, 524280] +nds.sdgp t0, -0x80001 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 8 bytes in the range [-524288, 524280] +nds.sdgp t0, -0x14 # CHECK: :[[@LINE]]:14: error: immediate must be a multiple of 8 bytes in the range [-524288, 524280] diff --git a/llvm/test/MC/RISCV/xandesperf-rv64-valid.s b/llvm/test/MC/RISCV/xandesperf-rv64-valid.s new file mode 100644 index 0000000000000..8da7cbcddb8d9 --- /dev/null +++ b/llvm/test/MC/RISCV/xandesperf-rv64-valid.s @@ -0,0 +1,34 @@ +# XAndesPerf - Andes Performance Extension +# RUN: llvm-mc %s -triple=riscv64 -mattr=+xandesperf -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s +# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+xandesperf < %s \ +# RUN: | llvm-objdump --mattr=+xandesperf -M no-aliases --no-print-imm-hex -d -r - \ +# RUN: | FileCheck -check-prefixes=CHECK-ASM-AND-OBJ %s + +# CHECK-ASM-AND-OBJ: lea.b.ze t0, t1, t3 +# CHECK-ASM: encoding: [0xdb,0x02,0xc3,0x11] +nds.lea.b.ze t0, t1, t3 + +# CHECK-ASM-AND-OBJ: lea.h.ze a0, a1, a3 +# CHECK-ASM: encoding: [0x5b,0x85,0xd5,0x12] +nds.lea.h.ze a0, a1, a3 + +# CHECK-ASM-AND-OBJ: lea.w.ze s0, s1, s3 +# CHECK-ASM: encoding: [0x5b,0x84,0x34,0x15] +nds.lea.w.ze s0, s1, s3 + +# CHECK-ASM-AND-OBJ: lea.d.ze a3, a4, a5 +# CHECK-ASM: encoding: [0xdb,0x06,0xf7,0x16] +nds.lea.d.ze a3, a4, a5 + +# CHECK-ASM-AND-OBJ: lwugp t0, 9568 +# CHECK-ASM: encoding: [0xab,0x62,0x04,0x56] +nds.lwugp t0, 0x2560 + +# CHECK-ASM-AND-OBJ: ldgp t0, -9568 +# CHECK-ASM: encoding: [0xab,0xb2,0x7b,0xaa] +nds.ldgp t0, -0x2560 + +# CHECK-ASM-AND-OBJ: sdgp t0, 9568 +# CHECK-ASM: encoding: [0x2b,0x70,0x54,0x56] +nds.sdgp t0, 0x2560 diff --git a/llvm/test/MC/RISCV/xandesperf-valid.s b/llvm/test/MC/RISCV/xandesperf-valid.s new file mode 100644 index 0000000000000..f7c6b861a5098 --- /dev/null +++ b/llvm/test/MC/RISCV/xandesperf-valid.s @@ -0,0 +1,105 @@ +# XAndesPerf - Andes Performance Extension +# RUN: llvm-mc %s -triple=riscv32 -mattr=+xandesperf -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s +# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+xandesperf < %s \ +# RUN: | llvm-objdump --mattr=+xandesperf -M no-aliases --no-print-imm-hex -d -r - \ +# RUN: | FileCheck -check-prefixes=CHECK-OBJ,CHECK-OBJ32,CHECK-ASM-AND-OBJ %s +# RUN: llvm-mc %s -triple=riscv64 -mattr=+xandesperf -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s +# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+xandesperf < %s \ +# RUN: | llvm-objdump --mattr=+xandesperf -M no-aliases --no-print-imm-hex -d -r - \ +# RUN: | FileCheck -check-prefixes=CHECK-OBJ,CHECK-OBJ64,CHECK-ASM-AND-OBJ %s + +# CHECK-OBJ: nds.bbc a0, 16, 0x200 +# CHECK-ASM: nds.bbc a0, 16, 512 +# CHECK-ASM: encoding: [0x5b,0x70,0x05,0x21] +nds.bbc a0, 16, 512 + +# CHECK-OBJ32: nds.bbs a1, 21, 0xffffff04 +# CHECK-OBJ64: nds.bbs a1, 21, 0xffffffffffffff04 +# CHECK-ASM: nds.bbs a1, 21, -256 +# CHECK-ASM: encoding: [0x5b,0xf0,0x55,0xf1] +nds.bbs a1, 21, -256 + +# CHECK-OBJ: beqc t0, 23, 0x108 +# CHECK-ASM: beqc t0, 23, 256 +# CHECK-ASM: encoding: [0x5b,0xd0,0x72,0x11] +nds.beqc t0, 23, 256 + +# CHECK-OBJ32: bnec t1, 9, 0xffffff8c +# CHECK-OBJ64: bnec t1, 9, 0xffffffffffffff8c +# CHECK-ASM: bnec t1, 9, -128 +# CHECK-ASM: encoding: [0x5b,0x60,0x93,0xb8] +nds.bnec t1, 9, -128 + +# CHECK-ASM-AND-OBJ: bfoz a0, a1, 9, 13 +# CHECK-ASM: encoding: [0x5b,0xa5,0xd5,0x24] +nds.bfoz a0, a1, 9, 13 + +# CHECK-ASM-AND-OBJ: bfos t0, t1, 23, 3 +# CHECK-ASM: encoding: [0xdb,0x32,0x33,0x5c] +nds.bfos t0, t1, 23, 3 + +# CHECK-ASM-AND-OBJ: lea.h t0, t1, t3 +# CHECK-ASM: encoding: [0xdb,0x02,0xc3,0x0b] +nds.lea.h t0, t1, t3 + +# CHECK-ASM-AND-OBJ: lea.w a0, a1, a3 +# CHECK-ASM: encoding: [0x5b,0x85,0xd5,0x0c] +nds.lea.w a0, a1, a3 + +# CHECK-ASM-AND-OBJ: lea.d s0, s1, s3 +# CHECK-ASM: encoding: [0x5b,0x84,0x34,0x0f] +nds.lea.d s0, s1, s3 + +# CHECK-ASM-AND-OBJ: addigp t0, 9568 +# CHECK-ASM: encoding: [0x8b,0x12,0x04,0x56] +nds.addigp t0, 0x2560 + +# CHECK-ASM-AND-OBJ: lbgp t0, -9568 +# CHECK-ASM: encoding: [0x8b,0x82,0x1b,0xaa] +nds.lbgp t0, -0x2560 + +# CHECK-ASM-AND-OBJ: lbugp t0, 9568 +# CHECK-ASM: encoding: [0x8b,0x22,0x04,0x56] +nds.lbugp t0, 0x2560 + +# CHECK-ASM-AND-OBJ: lhgp t0, -9568 +# CHECK-ASM: encoding: [0xab,0x92,0x1b,0xaa] +nds.lhgp t0, -0x2560 + +# CHECK-ASM-AND-OBJ: lhugp t0, 9568 +# CHECK-ASM: encoding: [0xab,0x52,0x04,0x56] +nds.lhugp t0, 0x2560 + +# CHECK-ASM-AND-OBJ: lwgp t0, -9568 +# CHECK-ASM: encoding: [0xab,0xa2,0x3b,0xaa] +nds.lwgp t0, -0x2560 + +# CHECK-ASM-AND-OBJ: sbgp t0, 9568 +# CHECK-ASM: encoding: [0x0b,0x30,0x54,0x56] +nds.sbgp t0, 0x2560 + +# CHECK-ASM-AND-OBJ: shgp t0, -9568 +# CHECK-ASM: encoding: [0xab,0x80,0x5b,0xaa] +nds.shgp t0, -0x2560 + +# CHECK-ASM-AND-OBJ: swgp t0, 9568 +# CHECK-ASM: encoding: [0x2b,0x40,0x54,0x56] +nds.swgp t0, 0x2560 + +# CHECK-ASM-AND-OBJ: ffb t0, t1, t3 +# CHECK-ASM: encoding: [0xdb,0x02,0xc3,0x21] +nds.ffb t0, t1, t3 + +# CHECK-ASM-AND-OBJ: ffzmism a0, a1, a3 +# CHECK-ASM: encoding: [0x5b,0x85,0xd5,0x22] +nds.ffzmism a0, a1, a3 + +# CHECK-ASM-AND-OBJ: ffmism s0, s1, s3 +# CHECK-ASM: encoding: [0x5b,0x84,0x34,0x25] +nds.ffmism s0, s1, s3 + +# CHECK-ASM-AND-OBJ: flmism s0, s1, s3 +# CHECK-ASM: encoding: [0x5b,0x84,0x34,0x27] +nds.flmism s0, s1, s3 diff --git a/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp b/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp index 2ec27ba9d91b7..3966754496536 100644 --- a/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp +++ b/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp @@ -1107,6 +1107,7 @@ R"(All available -march extensions for RISC-V svnapot 1.0 svpbmt 1.0 svvptc 1.0 + xandesperf 5.0 xcvalu 1.0 xcvbi 1.0 xcvbitmanip 1.0 >From 2b379d71ae0ed229176ab72e90fb6dab64ff5dcf Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Fri, 11 Apr 2025 09:03:01 +0800 Subject: [PATCH 02/11] Typo: unsigned -> uint64_t --- llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp index ed56a92d08af8..97e33662b62b7 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp @@ -548,7 +548,7 @@ RISCVMCCodeEmitter::getImmOpValueAsrN(const MCInst &MI, unsigned OpNo, const MCOperand &MO = MI.getOperand(OpNo); if (MO.isImm()) { - unsigned Res = MO.getImm(); + uint64_t Res = MO.getImm(); assert((Res & ((1 << N) - 1)) == 0 && "LSB is non-zero"); return Res >> N; } >From 3f0e3bf1fc3576b1afa273e1704767e26971bccc Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Fri, 11 Apr 2025 09:22:23 +0800 Subject: [PATCH 03/11] Use isBareSimm.. as operand instead --- .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 26 +++--------- llvm/lib/Target/RISCV/RISCVInstrInfo.td | 17 +++++++- llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td | 41 ++++++++++--------- llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td | 5 --- 4 files changed, 42 insertions(+), 47 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 3dafc21b84c21..03777a5b9053d 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -550,12 +550,6 @@ struct RISCVOperand final : public MCParsedAsmOperand { VK == RISCVMCExpr::VK_None; } - // True if operand is a symbol with no modifiers, or a constant with no - // modifiers and isShiftedInt<N-1, 1>(Op). - template <int N> bool isBareSimmNLsb0() const { - return isBareSimmNLsbK<N, 1>(); - } - // True if operand is a symbol with no modifiers, or a constant with no // modifiers and isInt<N>(Op). template <int N> bool isBareSimmN() const { @@ -861,8 +855,6 @@ struct RISCVOperand final : public MCParsedAsmOperand { return SignExtend64<32>(Imm); } - bool isSImm11Lsb0() const { return isBareSimmNLsb0<11>(); } - bool isSImm12() const { if (!isImm()) return false; @@ -947,14 +939,6 @@ struct RISCVOperand final : public MCParsedAsmOperand { [](int64_t Imm) { return Imm != INT64_MIN && isInt<5>(Imm - 1); }); } - bool isSImm18() const { return isBareSimmNLsbK<18, 0>(); } - - bool isSImm18Lsb0() const { return isBareSimmNLsb0<18>(); } - - bool isSImm19Lsb00() const { return isBareSimmNLsbK<19, 2>(); } - - bool isSImm20Lsb000() const { return isBareSimmNLsbK<20, 3>(); } - bool isSImm32Lsb0() const { return isSImmPred([](int64_t Imm) { return isShiftedInt<31, 1>(Imm); }); } @@ -1526,7 +1510,7 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, case Match_InvalidSImm11: return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 10), (1 << 10) - 1); - case Match_InvalidSImm11Lsb0: + case Match_InvalidBareSImm11Lsb0: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 10), (1 << 10) - 2, "immediate must be a multiple of 2 bytes in the range"); @@ -1602,18 +1586,18 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, (1 << 4), "immediate must be in the range"); } - case Match_InvalidSImm18: + case Match_InvalidBareSImm18: return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 17), (1 << 17) - 1); - case Match_InvalidSImm18Lsb0: + case Match_InvalidBareSImm18Lsb0: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 17), (1 << 17) - 2, "immediate must be a multiple of 2 bytes in the range"); - case Match_InvalidSImm19Lsb00: + case Match_InvalidBareSImm19Lsb00: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 18), (1 << 18) - 4, "immediate must be a multiple of 4 bytes in the range"); - case Match_InvalidSImm20Lsb000: + case Match_InvalidBareSImm20Lsb000: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 19), (1 << 19) - 8, "immediate must be a multiple of 8 bytes in the range"); diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index f1d455987c713..c933f74daf3cc 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -163,7 +163,22 @@ class UImmAsmOperand<int width, string suffix = ""> class BareSImmNLsb0AsmOperand<int width> : ImmAsmOperand<"BareS", width, "Lsb0"> { - let PredicateMethod = "isBareSimmNLsb0<" # width # ">"; + let PredicateMethod = "isBareSimmNLsbK<" # width # ", 1>"; +} + +class BareSImmNLsb00AsmOperand<int width> + : ImmAsmOperand<"BareS", width, "Lsb00"> { + let PredicateMethod = "isBareSimmNLsbK<" # width # ", 2>"; +} + +class BareSImmNLsb000AsmOperand<int width> + : ImmAsmOperand<"BareS", width, "Lsb000"> { + let PredicateMethod = "isBareSimmNLsbK<" # width # ", 3>"; +} + +class BareSImmNAsmOperand<int width> + : ImmAsmOperand<"BareS", width, ""> { + let PredicateMethod = "isBareSimmN<" # width # ">"; } class RISCVOp<ValueType vt = XLenVT> : Operand<vt> { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td index afe6e784dbfb0..570c06518e2cd 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td @@ -15,8 +15,8 @@ //===----------------------------------------------------------------------===// // A 11-bit signed immediate where the least significant bit is zero. -def simm11_lsb0 : Operand<OtherVT> { - let ParserMatchClass = SImmAsmOperand<11, "Lsb0">; +def bare_simm11_lsb0 : Operand<OtherVT> { + let ParserMatchClass = BareSImmNLsb0AsmOperand<11>; let PrintMethod = "printBranchOperand"; let EncoderMethod = "getImmOpValueAsr1"; let DecoderMethod = "decodeSImmOperandAndLsl1<11>"; @@ -29,26 +29,26 @@ def simm11_lsb0 : Operand<OtherVT> { let OperandType = "OPERAND_PCREL"; } -def simm18 : Operand<XLenVT> { - let ParserMatchClass = SImmAsmOperand<18>; +def bare_simm18 : Operand<XLenVT> { + let ParserMatchClass = BareSImmNAsmOperand<18>; let EncoderMethod = "getImmOpValue"; let DecoderMethod = "decodeSImmOperand<18>"; } -def simm18_lsb0 : Operand<XLenVT> { - let ParserMatchClass = SImmAsmOperand<18, "Lsb0">; +def bare_simm18_lsb0 : Operand<XLenVT> { + let ParserMatchClass = BareSImmNLsb0AsmOperand<18>; let EncoderMethod = "getImmOpValueAsr1"; let DecoderMethod = "decodeSImmOperandAndLsl1<18>"; } -def simm19_lsb00 : Operand<XLenVT> { - let ParserMatchClass = SImmAsmOperand<19, "Lsb00">; +def bare_simm19_lsb00 : Operand<XLenVT> { + let ParserMatchClass = BareSImmNLsb00AsmOperand<19>; let EncoderMethod = "getImmOpValueAsrN<2>"; let DecoderMethod = "decodeSImmOperandAndLslN<19, 2>"; } -def simm20_lsb000 : Operand<XLenVT> { - let ParserMatchClass = SImmAsmOperand<20, "Lsb000">; +def bare_simm20_lsb000 : Operand<XLenVT> { + let ParserMatchClass = BareSImmNLsb000AsmOperand<20>; let EncoderMethod = "getImmOpValueAsrN<3>"; let DecoderMethod = "decodeSImmOperandAndLslN<20, 3>"; } @@ -58,7 +58,7 @@ def simm20_lsb000 : Operand<XLenVT> { //===----------------------------------------------------------------------===// class NDSRVInstBB<bit cs, string opcodestr> - : RVInst<(outs), (ins GPR:$rs1, uimmlog2xlen:$cimm, simm11_lsb0:$imm10), + : RVInst<(outs), (ins GPR:$rs1, uimmlog2xlen:$cimm, bare_simm11_lsb0:$imm10), opcodestr, "$rs1, $cimm, $imm10", [], InstFormatOther>, Sched<[WriteJmp, ReadIALU]> { bits<10> imm10; @@ -82,7 +82,7 @@ class NDSRVInstBB<bit cs, string opcodestr> } class NDSRVInstBC<bits<3> funct3, string opcodestr> - : RVInst<(outs), (ins GPR:$rs1, uimm7:$cimm, simm11_lsb0:$imm10), + : RVInst<(outs), (ins GPR:$rs1, uimm7:$cimm, bare_simm11_lsb0:$imm10), opcodestr, "$rs1, $cimm, $imm10", [], InstFormatOther>, Sched<[WriteJmp, ReadIALU]> { bits<10> imm10; @@ -138,7 +138,7 @@ class NDSRVInstRR<bits<7> funct7, string opcodestr> // GP: ADDI, LB, LBU class NDSRVInstLBGP<bits<2> funct2, string opcodestr> - : RVInst<(outs GPR:$rd), (ins simm18:$imm18), + : RVInst<(outs GPR:$rd), (ins bare_simm18:$imm18), opcodestr, "$rd, ${imm18}", [], InstFormatOther> { bits<18> imm18; bits<5> rd; @@ -159,7 +159,7 @@ class NDSRVInstLBGP<bits<2> funct2, string opcodestr> // GP: LH, LHU class NDSRVInstLHGP<bits<3> funct3, string opcodestr> - : RVInst<(outs GPR:$rd), (ins simm18_lsb0:$imm17), + : RVInst<(outs GPR:$rd), (ins bare_simm18_lsb0:$imm17), opcodestr, "$rd, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rd; @@ -177,8 +177,9 @@ class NDSRVInstLHGP<bits<3> funct3, string opcodestr> let mayStore = 0; } +// GP: LW class NDSRVInstLWGP<bits<3> funct3, string opcodestr> - : RVInst<(outs GPR:$rd), (ins simm19_lsb00:$imm17), + : RVInst<(outs GPR:$rd), (ins bare_simm19_lsb00:$imm17), opcodestr, "$rd, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rd; @@ -199,7 +200,7 @@ class NDSRVInstLWGP<bits<3> funct3, string opcodestr> // GP: LD class NDSRVInstLDGP<bits<3> funct3, string opcodestr> - : RVInst<(outs GPR:$rd), (ins simm20_lsb000:$imm17), + : RVInst<(outs GPR:$rd), (ins bare_simm20_lsb000:$imm17), opcodestr, "$rd, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rd; @@ -220,7 +221,7 @@ class NDSRVInstLDGP<bits<3> funct3, string opcodestr> // GP: SB class NDSRVInstSBGP<bits<2> funct2, string opcodestr> - : RVInst<(outs), (ins GPR:$rs2, simm18:$imm18), + : RVInst<(outs), (ins GPR:$rs2, bare_simm18:$imm18), opcodestr, "$rs2, ${imm18}", [], InstFormatOther> { bits<18> imm18; bits<5> rs2; @@ -242,7 +243,7 @@ class NDSRVInstSBGP<bits<2> funct2, string opcodestr> // GP: SH class NDSRVInstSHGP<bits<3> funct3, string opcodestr> - : RVInst<(outs), (ins GPR:$rs2, simm18_lsb0:$imm17), + : RVInst<(outs), (ins GPR:$rs2, bare_simm18_lsb0:$imm17), opcodestr, "$rs2, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rs2; @@ -263,7 +264,7 @@ class NDSRVInstSHGP<bits<3> funct3, string opcodestr> // GP: SW class NDSRVInstSWGP<bits<3> funct3, string opcodestr> - : RVInst<(outs), (ins GPR:$rs2, simm19_lsb00:$imm17), + : RVInst<(outs), (ins GPR:$rs2, bare_simm19_lsb00:$imm17), opcodestr, "$rs2, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rs2; @@ -285,7 +286,7 @@ class NDSRVInstSWGP<bits<3> funct3, string opcodestr> // GP: SD class NDSRVInstSDGP<bits<3> funct3, string opcodestr> - : RVInst<(outs), (ins GPR:$rs2, simm20_lsb000:$imm17), + : RVInst<(outs), (ins GPR:$rs2, bare_simm20_lsb000:$imm17), opcodestr, "$rs2, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rs2; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td index 78bf6337b4a00..042245b978cd7 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td @@ -118,11 +118,6 @@ def simm20_li : RISCVOp<XLenVT> { def simm26 : RISCVSImmLeafOp<26>; -class BareSImmNAsmOperand<int width> - : ImmAsmOperand<"BareS", width, ""> { - let PredicateMethod = "isBareSimmN<" # width # ">"; -} - // 32-bit Immediate, used by RV32 Instructions in 32-bit operations, so no // sign-/zero-extension. This is represented internally as a signed 32-bit value. def bare_simm32 : RISCVOp<XLenVT> { >From 9a6c24d6042a0d3b1ba726425dd522253d021a45 Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Fri, 11 Apr 2025 09:23:33 +0800 Subject: [PATCH 04/11] Remove duplicated `let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in` --- llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td index 570c06518e2cd..926bcd4f75c7d 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td @@ -125,7 +125,6 @@ class NDSRVInstBFO<bits<3> funct3, string opcodestr> let mayStore = 0; } -let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in class NDSRVInstRR<bits<7> funct7, string opcodestr> : RVInstR<funct7, 0b000, OPC_CUSTOM_2, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2), >From f22e87b9f3c266a103c293ce529485a4acabbe84 Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Fri, 11 Apr 2025 13:31:05 +0800 Subject: [PATCH 05/11] Revert "Use isBareSimm.. as operand instead" This reverts commit 3f0e3bf1fc3576b1afa273e1704767e26971bccc. --- .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 26 +++++++++--- llvm/lib/Target/RISCV/RISCVInstrInfo.td | 17 +------- llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td | 41 +++++++++---------- llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td | 5 +++ 4 files changed, 47 insertions(+), 42 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 03777a5b9053d..3dafc21b84c21 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -550,6 +550,12 @@ struct RISCVOperand final : public MCParsedAsmOperand { VK == RISCVMCExpr::VK_None; } + // True if operand is a symbol with no modifiers, or a constant with no + // modifiers and isShiftedInt<N-1, 1>(Op). + template <int N> bool isBareSimmNLsb0() const { + return isBareSimmNLsbK<N, 1>(); + } + // True if operand is a symbol with no modifiers, or a constant with no // modifiers and isInt<N>(Op). template <int N> bool isBareSimmN() const { @@ -855,6 +861,8 @@ struct RISCVOperand final : public MCParsedAsmOperand { return SignExtend64<32>(Imm); } + bool isSImm11Lsb0() const { return isBareSimmNLsb0<11>(); } + bool isSImm12() const { if (!isImm()) return false; @@ -939,6 +947,14 @@ struct RISCVOperand final : public MCParsedAsmOperand { [](int64_t Imm) { return Imm != INT64_MIN && isInt<5>(Imm - 1); }); } + bool isSImm18() const { return isBareSimmNLsbK<18, 0>(); } + + bool isSImm18Lsb0() const { return isBareSimmNLsb0<18>(); } + + bool isSImm19Lsb00() const { return isBareSimmNLsbK<19, 2>(); } + + bool isSImm20Lsb000() const { return isBareSimmNLsbK<20, 3>(); } + bool isSImm32Lsb0() const { return isSImmPred([](int64_t Imm) { return isShiftedInt<31, 1>(Imm); }); } @@ -1510,7 +1526,7 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, case Match_InvalidSImm11: return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 10), (1 << 10) - 1); - case Match_InvalidBareSImm11Lsb0: + case Match_InvalidSImm11Lsb0: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 10), (1 << 10) - 2, "immediate must be a multiple of 2 bytes in the range"); @@ -1586,18 +1602,18 @@ bool RISCVAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, (1 << 4), "immediate must be in the range"); } - case Match_InvalidBareSImm18: + case Match_InvalidSImm18: return generateImmOutOfRangeError(Operands, ErrorInfo, -(1 << 17), (1 << 17) - 1); - case Match_InvalidBareSImm18Lsb0: + case Match_InvalidSImm18Lsb0: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 17), (1 << 17) - 2, "immediate must be a multiple of 2 bytes in the range"); - case Match_InvalidBareSImm19Lsb00: + case Match_InvalidSImm19Lsb00: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 18), (1 << 18) - 4, "immediate must be a multiple of 4 bytes in the range"); - case Match_InvalidBareSImm20Lsb000: + case Match_InvalidSImm20Lsb000: return generateImmOutOfRangeError( Operands, ErrorInfo, -(1 << 19), (1 << 19) - 8, "immediate must be a multiple of 8 bytes in the range"); diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index c933f74daf3cc..f1d455987c713 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -163,22 +163,7 @@ class UImmAsmOperand<int width, string suffix = ""> class BareSImmNLsb0AsmOperand<int width> : ImmAsmOperand<"BareS", width, "Lsb0"> { - let PredicateMethod = "isBareSimmNLsbK<" # width # ", 1>"; -} - -class BareSImmNLsb00AsmOperand<int width> - : ImmAsmOperand<"BareS", width, "Lsb00"> { - let PredicateMethod = "isBareSimmNLsbK<" # width # ", 2>"; -} - -class BareSImmNLsb000AsmOperand<int width> - : ImmAsmOperand<"BareS", width, "Lsb000"> { - let PredicateMethod = "isBareSimmNLsbK<" # width # ", 3>"; -} - -class BareSImmNAsmOperand<int width> - : ImmAsmOperand<"BareS", width, ""> { - let PredicateMethod = "isBareSimmN<" # width # ">"; + let PredicateMethod = "isBareSimmNLsb0<" # width # ">"; } class RISCVOp<ValueType vt = XLenVT> : Operand<vt> { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td index 926bcd4f75c7d..bf45ade786056 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td @@ -15,8 +15,8 @@ //===----------------------------------------------------------------------===// // A 11-bit signed immediate where the least significant bit is zero. -def bare_simm11_lsb0 : Operand<OtherVT> { - let ParserMatchClass = BareSImmNLsb0AsmOperand<11>; +def simm11_lsb0 : Operand<OtherVT> { + let ParserMatchClass = SImmAsmOperand<11, "Lsb0">; let PrintMethod = "printBranchOperand"; let EncoderMethod = "getImmOpValueAsr1"; let DecoderMethod = "decodeSImmOperandAndLsl1<11>"; @@ -29,26 +29,26 @@ def bare_simm11_lsb0 : Operand<OtherVT> { let OperandType = "OPERAND_PCREL"; } -def bare_simm18 : Operand<XLenVT> { - let ParserMatchClass = BareSImmNAsmOperand<18>; +def simm18 : Operand<XLenVT> { + let ParserMatchClass = SImmAsmOperand<18>; let EncoderMethod = "getImmOpValue"; let DecoderMethod = "decodeSImmOperand<18>"; } -def bare_simm18_lsb0 : Operand<XLenVT> { - let ParserMatchClass = BareSImmNLsb0AsmOperand<18>; +def simm18_lsb0 : Operand<XLenVT> { + let ParserMatchClass = SImmAsmOperand<18, "Lsb0">; let EncoderMethod = "getImmOpValueAsr1"; let DecoderMethod = "decodeSImmOperandAndLsl1<18>"; } -def bare_simm19_lsb00 : Operand<XLenVT> { - let ParserMatchClass = BareSImmNLsb00AsmOperand<19>; +def simm19_lsb00 : Operand<XLenVT> { + let ParserMatchClass = SImmAsmOperand<19, "Lsb00">; let EncoderMethod = "getImmOpValueAsrN<2>"; let DecoderMethod = "decodeSImmOperandAndLslN<19, 2>"; } -def bare_simm20_lsb000 : Operand<XLenVT> { - let ParserMatchClass = BareSImmNLsb000AsmOperand<20>; +def simm20_lsb000 : Operand<XLenVT> { + let ParserMatchClass = SImmAsmOperand<20, "Lsb000">; let EncoderMethod = "getImmOpValueAsrN<3>"; let DecoderMethod = "decodeSImmOperandAndLslN<20, 3>"; } @@ -58,7 +58,7 @@ def bare_simm20_lsb000 : Operand<XLenVT> { //===----------------------------------------------------------------------===// class NDSRVInstBB<bit cs, string opcodestr> - : RVInst<(outs), (ins GPR:$rs1, uimmlog2xlen:$cimm, bare_simm11_lsb0:$imm10), + : RVInst<(outs), (ins GPR:$rs1, uimmlog2xlen:$cimm, simm11_lsb0:$imm10), opcodestr, "$rs1, $cimm, $imm10", [], InstFormatOther>, Sched<[WriteJmp, ReadIALU]> { bits<10> imm10; @@ -82,7 +82,7 @@ class NDSRVInstBB<bit cs, string opcodestr> } class NDSRVInstBC<bits<3> funct3, string opcodestr> - : RVInst<(outs), (ins GPR:$rs1, uimm7:$cimm, bare_simm11_lsb0:$imm10), + : RVInst<(outs), (ins GPR:$rs1, uimm7:$cimm, simm11_lsb0:$imm10), opcodestr, "$rs1, $cimm, $imm10", [], InstFormatOther>, Sched<[WriteJmp, ReadIALU]> { bits<10> imm10; @@ -137,7 +137,7 @@ class NDSRVInstRR<bits<7> funct7, string opcodestr> // GP: ADDI, LB, LBU class NDSRVInstLBGP<bits<2> funct2, string opcodestr> - : RVInst<(outs GPR:$rd), (ins bare_simm18:$imm18), + : RVInst<(outs GPR:$rd), (ins simm18:$imm18), opcodestr, "$rd, ${imm18}", [], InstFormatOther> { bits<18> imm18; bits<5> rd; @@ -158,7 +158,7 @@ class NDSRVInstLBGP<bits<2> funct2, string opcodestr> // GP: LH, LHU class NDSRVInstLHGP<bits<3> funct3, string opcodestr> - : RVInst<(outs GPR:$rd), (ins bare_simm18_lsb0:$imm17), + : RVInst<(outs GPR:$rd), (ins simm18_lsb0:$imm17), opcodestr, "$rd, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rd; @@ -176,9 +176,8 @@ class NDSRVInstLHGP<bits<3> funct3, string opcodestr> let mayStore = 0; } -// GP: LW class NDSRVInstLWGP<bits<3> funct3, string opcodestr> - : RVInst<(outs GPR:$rd), (ins bare_simm19_lsb00:$imm17), + : RVInst<(outs GPR:$rd), (ins simm19_lsb00:$imm17), opcodestr, "$rd, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rd; @@ -199,7 +198,7 @@ class NDSRVInstLWGP<bits<3> funct3, string opcodestr> // GP: LD class NDSRVInstLDGP<bits<3> funct3, string opcodestr> - : RVInst<(outs GPR:$rd), (ins bare_simm20_lsb000:$imm17), + : RVInst<(outs GPR:$rd), (ins simm20_lsb000:$imm17), opcodestr, "$rd, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rd; @@ -220,7 +219,7 @@ class NDSRVInstLDGP<bits<3> funct3, string opcodestr> // GP: SB class NDSRVInstSBGP<bits<2> funct2, string opcodestr> - : RVInst<(outs), (ins GPR:$rs2, bare_simm18:$imm18), + : RVInst<(outs), (ins GPR:$rs2, simm18:$imm18), opcodestr, "$rs2, ${imm18}", [], InstFormatOther> { bits<18> imm18; bits<5> rs2; @@ -242,7 +241,7 @@ class NDSRVInstSBGP<bits<2> funct2, string opcodestr> // GP: SH class NDSRVInstSHGP<bits<3> funct3, string opcodestr> - : RVInst<(outs), (ins GPR:$rs2, bare_simm18_lsb0:$imm17), + : RVInst<(outs), (ins GPR:$rs2, simm18_lsb0:$imm17), opcodestr, "$rs2, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rs2; @@ -263,7 +262,7 @@ class NDSRVInstSHGP<bits<3> funct3, string opcodestr> // GP: SW class NDSRVInstSWGP<bits<3> funct3, string opcodestr> - : RVInst<(outs), (ins GPR:$rs2, bare_simm19_lsb00:$imm17), + : RVInst<(outs), (ins GPR:$rs2, simm19_lsb00:$imm17), opcodestr, "$rs2, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rs2; @@ -285,7 +284,7 @@ class NDSRVInstSWGP<bits<3> funct3, string opcodestr> // GP: SD class NDSRVInstSDGP<bits<3> funct3, string opcodestr> - : RVInst<(outs), (ins GPR:$rs2, bare_simm20_lsb000:$imm17), + : RVInst<(outs), (ins GPR:$rs2, simm20_lsb000:$imm17), opcodestr, "$rs2, ${imm17}", [], InstFormatOther> { bits<17> imm17; bits<5> rs2; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td index 042245b978cd7..78bf6337b4a00 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td @@ -118,6 +118,11 @@ def simm20_li : RISCVOp<XLenVT> { def simm26 : RISCVSImmLeafOp<26>; +class BareSImmNAsmOperand<int width> + : ImmAsmOperand<"BareS", width, ""> { + let PredicateMethod = "isBareSimmN<" # width # ">"; +} + // 32-bit Immediate, used by RV32 Instructions in 32-bit operations, so no // sign-/zero-extension. This is represented internally as a signed 32-bit value. def bare_simm32 : RISCVOp<XLenVT> { >From 7f3d5d6bf42f1de78a12ff19cc4af180a6b78f48 Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Fri, 11 Apr 2025 14:21:30 +0800 Subject: [PATCH 06/11] Only support immediate operand for the branch and GP-relative instructions Parsing bare symbel would be supported in a follow-up patch. --- .../Target/RISCV/AsmParser/RISCVAsmParser.cpp | 32 +++++++++++-------- llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td | 6 ++-- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index 3dafc21b84c21..9b149d006fc30 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -536,26 +536,20 @@ struct RISCVOperand final : public MCParsedAsmOperand { } // True if operand is a symbol with no modifiers, or a constant with no - // modifiers and isShiftedInt<N-K, K>(Op). - template <unsigned N, unsigned K> bool isBareSimmNLsbK() const { + // modifiers and isShiftedInt<N-1, 1>(Op). + template <int N> bool isBareSimmNLsb0() const { if (!isImm()) return false; int64_t Imm; if (evaluateConstantImm(getImm(), Imm)) - return isShiftedInt<N - K, K>(fixImmediateForRV32(Imm, isRV64Imm())); + return isShiftedInt<N - 1, 1>(fixImmediateForRV32(Imm, isRV64Imm())); RISCVMCExpr::Specifier VK = RISCVMCExpr::VK_None; return RISCVAsmParser::classifySymbolRef(getImm(), VK) && VK == RISCVMCExpr::VK_None; } - // True if operand is a symbol with no modifiers, or a constant with no - // modifiers and isShiftedInt<N-1, 1>(Op). - template <int N> bool isBareSimmNLsb0() const { - return isBareSimmNLsbK<N, 1>(); - } - // True if operand is a symbol with no modifiers, or a constant with no // modifiers and isInt<N>(Op). template <int N> bool isBareSimmN() const { @@ -861,7 +855,9 @@ struct RISCVOperand final : public MCParsedAsmOperand { return SignExtend64<32>(Imm); } - bool isSImm11Lsb0() const { return isBareSimmNLsb0<11>(); } + bool isSImm11Lsb0() const { + return isSImmPred([](int64_t Imm) { return isShiftedInt<10, 1>(Imm); }); + } bool isSImm12() const { if (!isImm()) @@ -947,13 +943,21 @@ struct RISCVOperand final : public MCParsedAsmOperand { [](int64_t Imm) { return Imm != INT64_MIN && isInt<5>(Imm - 1); }); } - bool isSImm18() const { return isBareSimmNLsbK<18, 0>(); } + bool isSImm18() const { + return isSImmPred([](int64_t Imm) { return isInt<18>(Imm); }); + } - bool isSImm18Lsb0() const { return isBareSimmNLsb0<18>(); } + bool isSImm18Lsb0() const { + return isSImmPred([](int64_t Imm) { return isShiftedInt<17, 1>(Imm); }); + } - bool isSImm19Lsb00() const { return isBareSimmNLsbK<19, 2>(); } + bool isSImm19Lsb00() const { + return isSImmPred([](int64_t Imm) { return isShiftedInt<17, 2>(Imm); }); + } - bool isSImm20Lsb000() const { return isBareSimmNLsbK<20, 3>(); } + bool isSImm20Lsb000() const { + return isSImmPred([](int64_t Imm) { return isShiftedInt<17, 3>(Imm); }); + } bool isSImm32Lsb0() const { return isSImmPred([](int64_t Imm) { return isShiftedInt<31, 1>(Imm); }); diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td index bf45ade786056..8ecbe267d3b11 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td @@ -22,9 +22,9 @@ def simm11_lsb0 : Operand<OtherVT> { let DecoderMethod = "decodeSImmOperandAndLsl1<11>"; let MCOperandPredicate = [{ int64_t Imm; - if (MCOp.evaluateAsConstantImm(Imm)) - return isShiftedInt<10, 1>(Imm); - return MCOp.isBareSymbolRef(); + if (!MCOp.evaluateAsConstantImm(Imm)) + return false; + return isShiftedInt<10, 1>(Imm); }]; let OperandType = "OPERAND_PCREL"; } >From 2d51b9898615db04c1e2e9235a037de9ba7bd5cb Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Mon, 14 Apr 2025 13:10:01 +0800 Subject: [PATCH 07/11] Add comment for NDSRVInstLWGP --- llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td | 1 + 1 file changed, 1 insertion(+) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td index 8ecbe267d3b11..261d1a37d3f90 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td @@ -176,6 +176,7 @@ class NDSRVInstLHGP<bits<3> funct3, string opcodestr> let mayStore = 0; } +// GP: LW, LWU class NDSRVInstLWGP<bits<3> funct3, string opcodestr> : RVInst<(outs GPR:$rd), (ins simm19_lsb00:$imm17), opcodestr, "$rd, ${imm17}", [], InstFormatOther> { >From 12a32e9a04023c59d007f300fb1cf2d06e5bece0 Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Mon, 14 Apr 2025 15:55:07 +0800 Subject: [PATCH 08/11] Add missing `nds.` prefix --- llvm/test/MC/RISCV/xandesperf-rv64-valid.s | 14 +++---- llvm/test/MC/RISCV/xandesperf-valid.s | 44 +++++++++++----------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/llvm/test/MC/RISCV/xandesperf-rv64-valid.s b/llvm/test/MC/RISCV/xandesperf-rv64-valid.s index 8da7cbcddb8d9..5c7689db9177c 100644 --- a/llvm/test/MC/RISCV/xandesperf-rv64-valid.s +++ b/llvm/test/MC/RISCV/xandesperf-rv64-valid.s @@ -5,30 +5,30 @@ # RUN: | llvm-objdump --mattr=+xandesperf -M no-aliases --no-print-imm-hex -d -r - \ # RUN: | FileCheck -check-prefixes=CHECK-ASM-AND-OBJ %s -# CHECK-ASM-AND-OBJ: lea.b.ze t0, t1, t3 +# CHECK-ASM-AND-OBJ: nds.lea.b.ze t0, t1, t3 # CHECK-ASM: encoding: [0xdb,0x02,0xc3,0x11] nds.lea.b.ze t0, t1, t3 -# CHECK-ASM-AND-OBJ: lea.h.ze a0, a1, a3 +# CHECK-ASM-AND-OBJ: nds.lea.h.ze a0, a1, a3 # CHECK-ASM: encoding: [0x5b,0x85,0xd5,0x12] nds.lea.h.ze a0, a1, a3 -# CHECK-ASM-AND-OBJ: lea.w.ze s0, s1, s3 +# CHECK-ASM-AND-OBJ: nds.lea.w.ze s0, s1, s3 # CHECK-ASM: encoding: [0x5b,0x84,0x34,0x15] nds.lea.w.ze s0, s1, s3 -# CHECK-ASM-AND-OBJ: lea.d.ze a3, a4, a5 +# CHECK-ASM-AND-OBJ: nds.lea.d.ze a3, a4, a5 # CHECK-ASM: encoding: [0xdb,0x06,0xf7,0x16] nds.lea.d.ze a3, a4, a5 -# CHECK-ASM-AND-OBJ: lwugp t0, 9568 +# CHECK-ASM-AND-OBJ: nds.lwugp t0, 9568 # CHECK-ASM: encoding: [0xab,0x62,0x04,0x56] nds.lwugp t0, 0x2560 -# CHECK-ASM-AND-OBJ: ldgp t0, -9568 +# CHECK-ASM-AND-OBJ: nds.ldgp t0, -9568 # CHECK-ASM: encoding: [0xab,0xb2,0x7b,0xaa] nds.ldgp t0, -0x2560 -# CHECK-ASM-AND-OBJ: sdgp t0, 9568 +# CHECK-ASM-AND-OBJ: nds.sdgp t0, 9568 # CHECK-ASM: encoding: [0x2b,0x70,0x54,0x56] nds.sdgp t0, 0x2560 diff --git a/llvm/test/MC/RISCV/xandesperf-valid.s b/llvm/test/MC/RISCV/xandesperf-valid.s index f7c6b861a5098..6839685f2404c 100644 --- a/llvm/test/MC/RISCV/xandesperf-valid.s +++ b/llvm/test/MC/RISCV/xandesperf-valid.s @@ -21,85 +21,85 @@ nds.bbc a0, 16, 512 # CHECK-ASM: encoding: [0x5b,0xf0,0x55,0xf1] nds.bbs a1, 21, -256 -# CHECK-OBJ: beqc t0, 23, 0x108 -# CHECK-ASM: beqc t0, 23, 256 +# CHECK-OBJ: nds.beqc t0, 23, 0x108 +# CHECK-ASM: nds.beqc t0, 23, 256 # CHECK-ASM: encoding: [0x5b,0xd0,0x72,0x11] nds.beqc t0, 23, 256 -# CHECK-OBJ32: bnec t1, 9, 0xffffff8c -# CHECK-OBJ64: bnec t1, 9, 0xffffffffffffff8c +# CHECK-OBJ32: nds.bnec t1, 9, 0xffffff8c +# CHECK-OBJ64: nds.bnec t1, 9, 0xffffffffffffff8c # CHECK-ASM: bnec t1, 9, -128 # CHECK-ASM: encoding: [0x5b,0x60,0x93,0xb8] nds.bnec t1, 9, -128 -# CHECK-ASM-AND-OBJ: bfoz a0, a1, 9, 13 +# CHECK-ASM-AND-OBJ: nds.bfoz a0, a1, 9, 13 # CHECK-ASM: encoding: [0x5b,0xa5,0xd5,0x24] nds.bfoz a0, a1, 9, 13 -# CHECK-ASM-AND-OBJ: bfos t0, t1, 23, 3 +# CHECK-ASM-AND-OBJ: nds.bfos t0, t1, 23, 3 # CHECK-ASM: encoding: [0xdb,0x32,0x33,0x5c] nds.bfos t0, t1, 23, 3 -# CHECK-ASM-AND-OBJ: lea.h t0, t1, t3 +# CHECK-ASM-AND-OBJ: nds.lea.h t0, t1, t3 # CHECK-ASM: encoding: [0xdb,0x02,0xc3,0x0b] nds.lea.h t0, t1, t3 -# CHECK-ASM-AND-OBJ: lea.w a0, a1, a3 +# CHECK-ASM-AND-OBJ: nds.lea.w a0, a1, a3 # CHECK-ASM: encoding: [0x5b,0x85,0xd5,0x0c] nds.lea.w a0, a1, a3 -# CHECK-ASM-AND-OBJ: lea.d s0, s1, s3 +# CHECK-ASM-AND-OBJ: nds.lea.d s0, s1, s3 # CHECK-ASM: encoding: [0x5b,0x84,0x34,0x0f] nds.lea.d s0, s1, s3 -# CHECK-ASM-AND-OBJ: addigp t0, 9568 +# CHECK-ASM-AND-OBJ: nds.addigp t0, 9568 # CHECK-ASM: encoding: [0x8b,0x12,0x04,0x56] nds.addigp t0, 0x2560 -# CHECK-ASM-AND-OBJ: lbgp t0, -9568 +# CHECK-ASM-AND-OBJ: nds.lbgp t0, -9568 # CHECK-ASM: encoding: [0x8b,0x82,0x1b,0xaa] nds.lbgp t0, -0x2560 -# CHECK-ASM-AND-OBJ: lbugp t0, 9568 +# CHECK-ASM-AND-OBJ: nds.lbugp t0, 9568 # CHECK-ASM: encoding: [0x8b,0x22,0x04,0x56] nds.lbugp t0, 0x2560 -# CHECK-ASM-AND-OBJ: lhgp t0, -9568 +# CHECK-ASM-AND-OBJ: nds.lhgp t0, -9568 # CHECK-ASM: encoding: [0xab,0x92,0x1b,0xaa] nds.lhgp t0, -0x2560 -# CHECK-ASM-AND-OBJ: lhugp t0, 9568 +# CHECK-ASM-AND-OBJ: nds.lhugp t0, 9568 # CHECK-ASM: encoding: [0xab,0x52,0x04,0x56] nds.lhugp t0, 0x2560 -# CHECK-ASM-AND-OBJ: lwgp t0, -9568 +# CHECK-ASM-AND-OBJ: nds.lwgp t0, -9568 # CHECK-ASM: encoding: [0xab,0xa2,0x3b,0xaa] nds.lwgp t0, -0x2560 -# CHECK-ASM-AND-OBJ: sbgp t0, 9568 +# CHECK-ASM-AND-OBJ: nds.sbgp t0, 9568 # CHECK-ASM: encoding: [0x0b,0x30,0x54,0x56] nds.sbgp t0, 0x2560 -# CHECK-ASM-AND-OBJ: shgp t0, -9568 +# CHECK-ASM-AND-OBJ: nds.shgp t0, -9568 # CHECK-ASM: encoding: [0xab,0x80,0x5b,0xaa] nds.shgp t0, -0x2560 -# CHECK-ASM-AND-OBJ: swgp t0, 9568 +# CHECK-ASM-AND-OBJ: nds.swgp t0, 9568 # CHECK-ASM: encoding: [0x2b,0x40,0x54,0x56] nds.swgp t0, 0x2560 -# CHECK-ASM-AND-OBJ: ffb t0, t1, t3 +# CHECK-ASM-AND-OBJ: nds.ffb t0, t1, t3 # CHECK-ASM: encoding: [0xdb,0x02,0xc3,0x21] nds.ffb t0, t1, t3 -# CHECK-ASM-AND-OBJ: ffzmism a0, a1, a3 +# CHECK-ASM-AND-OBJ: nds.ffzmism a0, a1, a3 # CHECK-ASM: encoding: [0x5b,0x85,0xd5,0x22] nds.ffzmism a0, a1, a3 -# CHECK-ASM-AND-OBJ: ffmism s0, s1, s3 +# CHECK-ASM-AND-OBJ: nds.ffmism s0, s1, s3 # CHECK-ASM: encoding: [0x5b,0x84,0x34,0x25] nds.ffmism s0, s1, s3 -# CHECK-ASM-AND-OBJ: flmism s0, s1, s3 +# CHECK-ASM-AND-OBJ: nds.flmism s0, s1, s3 # CHECK-ASM: encoding: [0x5b,0x84,0x34,0x27] nds.flmism s0, s1, s3 >From ffd70855a4cc0a19b3f896c102dfe63abb71260a Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Wed, 16 Apr 2025 09:03:22 +0800 Subject: [PATCH 09/11] Use getImmOpValueAsrN<1> and remove getImmOpValueAsr1 --- .../Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp | 11 ----------- llvm/lib/Target/RISCV/RISCVInstrInfo.td | 4 ++-- llvm/lib/Target/RISCV/RISCVInstrInfoC.td | 4 ++-- llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td | 4 ++-- llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td | 2 +- 5 files changed, 7 insertions(+), 18 deletions(-) diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp index 97e33662b62b7..3a4cf77dabbb6 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCCodeEmitter.cpp @@ -92,10 +92,6 @@ class RISCVMCCodeEmitter : public MCCodeEmitter { SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI) const; - uint64_t getImmOpValueAsr1(const MCInst &MI, unsigned OpNo, - SmallVectorImpl<MCFixup> &Fixups, - const MCSubtargetInfo &STI) const; - template <unsigned N> unsigned getImmOpValueAsrN(const MCInst &MI, unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups, @@ -556,13 +552,6 @@ RISCVMCCodeEmitter::getImmOpValueAsrN(const MCInst &MI, unsigned OpNo, return getImmOpValue(MI, OpNo, Fixups, STI); } -uint64_t -RISCVMCCodeEmitter::getImmOpValueAsr1(const MCInst &MI, unsigned OpNo, - SmallVectorImpl<MCFixup> &Fixups, - const MCSubtargetInfo &STI) const { - return getImmOpValueAsrN<1>(MI, OpNo, Fixups, STI); -} - uint64_t RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups, const MCSubtargetInfo &STI) const { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index f1d455987c713..422dea5e89461 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -279,7 +279,7 @@ def simm12_no6 : ImmLeaf<XLenVT, [{ def bare_simm13_lsb0 : Operand<OtherVT> { let ParserMatchClass = BareSImmNLsb0AsmOperand<13>; let PrintMethod = "printBranchOperand"; - let EncoderMethod = "getImmOpValueAsr1"; + let EncoderMethod = "getImmOpValueAsrN<1>"; let DecoderMethod = "decodeSImmOperandAndLsl1<13>"; let MCOperandPredicate = [{ int64_t Imm; @@ -316,7 +316,7 @@ def Simm21Lsb0JALAsmOperand : BareSImmNLsb0AsmOperand<21> { def simm21_lsb0_jal : Operand<OtherVT> { let ParserMatchClass = Simm21Lsb0JALAsmOperand; let PrintMethod = "printBranchOperand"; - let EncoderMethod = "getImmOpValueAsr1"; + let EncoderMethod = "getImmOpValueAsrN<1>"; let DecoderMethod = "decodeSImmOperandAndLsl1<21>"; let MCOperandPredicate = [{ int64_t Imm; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td index fc036f6516116..f848401e1df00 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -142,7 +142,7 @@ def bare_simm9_lsb0 : Operand<OtherVT>, ImmLeaf<XLenVT, [{return isShiftedInt<8, 1>(Imm);}]> { let ParserMatchClass = BareSImmNLsb0AsmOperand<9>; let PrintMethod = "printBranchOperand"; - let EncoderMethod = "getImmOpValueAsr1"; + let EncoderMethod = "getImmOpValueAsrN<1>"; let DecoderMethod = "decodeSImmOperandAndLsl1<9>"; let MCOperandPredicate = [{ int64_t Imm; @@ -206,7 +206,7 @@ def bare_simm12_lsb0 : Operand<OtherVT>, ImmLeaf<XLenVT, [{return isShiftedInt<11, 1>(Imm);}]> { let ParserMatchClass = BareSImmNLsb0AsmOperand<12>; let PrintMethod = "printBranchOperand"; - let EncoderMethod = "getImmOpValueAsr1"; + let EncoderMethod = "getImmOpValueAsrN<1>"; let DecoderMethod = "decodeSImmOperandAndLsl1<12>"; let MCOperandPredicate = [{ int64_t Imm; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td index 261d1a37d3f90..4f0824ec26e28 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td @@ -18,7 +18,7 @@ def simm11_lsb0 : Operand<OtherVT> { let ParserMatchClass = SImmAsmOperand<11, "Lsb0">; let PrintMethod = "printBranchOperand"; - let EncoderMethod = "getImmOpValueAsr1"; + let EncoderMethod = "getImmOpValueAsrN<1>"; let DecoderMethod = "decodeSImmOperandAndLsl1<11>"; let MCOperandPredicate = [{ int64_t Imm; @@ -37,7 +37,7 @@ def simm18 : Operand<XLenVT> { def simm18_lsb0 : Operand<XLenVT> { let ParserMatchClass = SImmAsmOperand<18, "Lsb0">; - let EncoderMethod = "getImmOpValueAsr1"; + let EncoderMethod = "getImmOpValueAsrN<1>"; let DecoderMethod = "decodeSImmOperandAndLsl1<18>"; } diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td index 78bf6337b4a00..5f1fc150985f2 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td @@ -142,7 +142,7 @@ def bare_simm32 : RISCVOp<XLenVT> { def simm32_lsb0 : Operand<OtherVT> { let ParserMatchClass = SImmAsmOperand<32, "Lsb0">; let PrintMethod = "printBranchOperand"; - let EncoderMethod = "getImmOpValueAsr1"; + let EncoderMethod = "getImmOpValueAsrN<1>"; let DecoderMethod = "decodeSImmOperandAndLsl1<32>"; let MCOperandPredicate = [{ int64_t Imm; >From 94882d56f215a9eb6017fdeb916091a75c1de01c Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Wed, 16 Apr 2025 09:10:38 +0800 Subject: [PATCH 10/11] Use decodeSImmOperandAndLslN<18, 1> and remove decodeSImmOperandAndLsl1 --- llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | 7 ------- llvm/lib/Target/RISCV/RISCVInstrInfo.td | 4 ++-- llvm/lib/Target/RISCV/RISCVInstrInfoC.td | 4 ++-- llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td | 4 ++-- llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td | 2 +- 5 files changed, 7 insertions(+), 14 deletions(-) diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp index c793bf2fa75f2..caa94ecf7142f 100644 --- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp +++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp @@ -459,13 +459,6 @@ static DecodeStatus decodeSImmOperandAndLslN(MCInst &Inst, uint64_t Imm, return MCDisassembler::Success; } -template <unsigned T> -static DecodeStatus decodeSImmOperandAndLsl1(MCInst &Inst, uint32_t Imm, - int64_t Address, - const MCDisassembler *Decoder) { - return decodeSImmOperandAndLslN<T, 1>(Inst, Imm, Address, Decoder); -} - static DecodeStatus decodeCLUIImmOperand(MCInst &Inst, uint32_t Imm, int64_t Address, const MCDisassembler *Decoder) { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index 422dea5e89461..5b415ab3f1b41 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -280,7 +280,7 @@ def bare_simm13_lsb0 : Operand<OtherVT> { let ParserMatchClass = BareSImmNLsb0AsmOperand<13>; let PrintMethod = "printBranchOperand"; let EncoderMethod = "getImmOpValueAsrN<1>"; - let DecoderMethod = "decodeSImmOperandAndLsl1<13>"; + let DecoderMethod = "decodeSImmOperandAndLslN<13, 1>"; let MCOperandPredicate = [{ int64_t Imm; if (MCOp.evaluateAsConstantImm(Imm)) @@ -317,7 +317,7 @@ def simm21_lsb0_jal : Operand<OtherVT> { let ParserMatchClass = Simm21Lsb0JALAsmOperand; let PrintMethod = "printBranchOperand"; let EncoderMethod = "getImmOpValueAsrN<1>"; - let DecoderMethod = "decodeSImmOperandAndLsl1<21>"; + let DecoderMethod = "decodeSImmOperandAndLslN<21, 1>"; let MCOperandPredicate = [{ int64_t Imm; if (MCOp.evaluateAsConstantImm(Imm)) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td index f848401e1df00..4a4f17f936b4d 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -143,7 +143,7 @@ def bare_simm9_lsb0 : Operand<OtherVT>, let ParserMatchClass = BareSImmNLsb0AsmOperand<9>; let PrintMethod = "printBranchOperand"; let EncoderMethod = "getImmOpValueAsrN<1>"; - let DecoderMethod = "decodeSImmOperandAndLsl1<9>"; + let DecoderMethod = "decodeSImmOperandAndLslN<9, 1>"; let MCOperandPredicate = [{ int64_t Imm; if (MCOp.evaluateAsConstantImm(Imm)) @@ -207,7 +207,7 @@ def bare_simm12_lsb0 : Operand<OtherVT>, let ParserMatchClass = BareSImmNLsb0AsmOperand<12>; let PrintMethod = "printBranchOperand"; let EncoderMethod = "getImmOpValueAsrN<1>"; - let DecoderMethod = "decodeSImmOperandAndLsl1<12>"; + let DecoderMethod = "decodeSImmOperandAndLslN<12, 1>"; let MCOperandPredicate = [{ int64_t Imm; if (MCOp.evaluateAsConstantImm(Imm)) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td index 4f0824ec26e28..2ec768435259c 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXAndes.td @@ -19,7 +19,7 @@ def simm11_lsb0 : Operand<OtherVT> { let ParserMatchClass = SImmAsmOperand<11, "Lsb0">; let PrintMethod = "printBranchOperand"; let EncoderMethod = "getImmOpValueAsrN<1>"; - let DecoderMethod = "decodeSImmOperandAndLsl1<11>"; + let DecoderMethod = "decodeSImmOperandAndLslN<11, 1>"; let MCOperandPredicate = [{ int64_t Imm; if (!MCOp.evaluateAsConstantImm(Imm)) @@ -38,7 +38,7 @@ def simm18 : Operand<XLenVT> { def simm18_lsb0 : Operand<XLenVT> { let ParserMatchClass = SImmAsmOperand<18, "Lsb0">; let EncoderMethod = "getImmOpValueAsrN<1>"; - let DecoderMethod = "decodeSImmOperandAndLsl1<18>"; + let DecoderMethod = "decodeSImmOperandAndLslN<18, 1>"; } def simm19_lsb00 : Operand<XLenVT> { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td index 5f1fc150985f2..4415547f69643 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td @@ -143,7 +143,7 @@ def simm32_lsb0 : Operand<OtherVT> { let ParserMatchClass = SImmAsmOperand<32, "Lsb0">; let PrintMethod = "printBranchOperand"; let EncoderMethod = "getImmOpValueAsrN<1>"; - let DecoderMethod = "decodeSImmOperandAndLsl1<32>"; + let DecoderMethod = "decodeSImmOperandAndLslN<32, 1>"; let MCOperandPredicate = [{ int64_t Imm; if (!MCOp.evaluateAsConstantImm(Imm)) >From ade192d0a530e920a6d210d04dd73a2b1e61abe0 Mon Sep 17 00:00:00 2001 From: Jim Lin <j...@andestech.com> Date: Wed, 16 Apr 2025 09:14:20 +0800 Subject: [PATCH 11/11] uint64_t -> uint32_t for decodeSImmOperandAndLslN Typo. --- llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp index caa94ecf7142f..0c00d132c76e0 100644 --- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp +++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp @@ -448,7 +448,7 @@ static DecodeStatus decodeSImmNonZeroOperand(MCInst &Inst, uint32_t Imm, } template <unsigned T, unsigned N> -static DecodeStatus decodeSImmOperandAndLslN(MCInst &Inst, uint64_t Imm, +static DecodeStatus decodeSImmOperandAndLslN(MCInst &Inst, uint32_t Imm, int64_t Address, const MCDisassembler *Decoder) { assert(isUInt<T - N + 1>(Imm) && "Invalid immediate"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits