diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp index 8c07d87680d65..830dc28a22175 100644 --- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp +++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp @@ -328,6 +328,19 @@ static DecodeStatus decodeUImmOperand(MCInst &Inst, uint32_t Imm, return MCDisassembler::Success; } +template +static DecodeStatus decodeUImmOperandGE(MCInst &Inst, uint32_t Imm, + int64_t Address, + const MCDisassembler *Decoder) { + assert(isUInt(Imm) && "Invalid immediate"); + + if (Imm < LowerBound) + return MCDisassembler::Fail; + + Inst.addOperand(MCOperand::createImm(Imm)); + return MCDisassembler::Success; +} + static DecodeStatus decodeUImmLog2XLenOperand(MCInst &Inst, uint32_t Imm, int64_t Address, const MCDisassembler *Decoder) { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td index 3a8039fce1f49..d5bc1b20b510d 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoXqci.td @@ -24,7 +24,7 @@ def uimm5nonzero : RISCVOp, def uimm5gt3 : RISCVOp, ImmLeaf 3) && isUInt<5>(Imm);}]> { let ParserMatchClass = UImmAsmOperand<5, "GT3">; - let DecoderMethod = "decodeUImmOperand<5>"; + let DecoderMethod = "decodeUImmOperandGE<5, 4>"; let OperandType = "OPERAND_UIMM5_GT3"; } diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZc.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZc.td index 9dfbcf678d6eb..1740ebb239217 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoZc.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZc.td @@ -31,7 +31,7 @@ def uimm2_lsb0 : RISCVOp, def uimm8ge32 : RISCVOp { let ParserMatchClass = UImmAsmOperand<8, "GE32">; - let DecoderMethod = "decodeUImmOperand<8>"; + let DecoderMethod = "decodeUImmOperandGE<8, 32>"; let OperandType = "OPERAND_UIMM8_GE32"; } diff --git a/llvm/test/MC/Disassembler/RISCV/xqci-invalid.txt b/llvm/test/MC/Disassembler/RISCV/xqci-invalid.txt new file mode 100644 index 0000000000000..da0c485a2ddd1 --- /dev/null +++ b/llvm/test/MC/Disassembler/RISCV/xqci-invalid.txt @@ -0,0 +1,10 @@ +# RUN: not llvm-mc -disassemble -triple=riscv32 -mattr=+experimental-xqciac %s | FileCheck %s + +[0x00,0x00] +# CHECK: unimp + +[0x8b,0x30,0x31,0x46] +# CHECK-NOT: qc.shladd x1, x2, x3, {{[0-9]+}} + +[0x00,0x00] +# CHECK: unimp