diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp index 89df9d82f8780..61b86abdc4ca9 100644 --- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp +++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp @@ -255,6 +255,15 @@ static DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, uint32_t RegNo, return MCDisassembler::Success; } +static DecodeStatus +DecodeGPRPairNoX0RegisterClass(MCInst &Inst, uint32_t RegNo, uint64_t Address, + const MCDisassembler *Decoder) { + if (RegNo == 0) + return MCDisassembler::Fail; + + return DecodeGPRPairRegisterClass(Inst, RegNo, Address, Decoder); +} + static DecodeStatus DecodeGPRPairCRegisterClass(MCInst &Inst, uint32_t RegNo, uint64_t Address, const MCDisassembler *Decoder) { diff --git a/llvm/lib/Target/RISCV/RISCVRegisterInfo.td b/llvm/lib/Target/RISCV/RISCVRegisterInfo.td index ccb39e8f42916..82e768d7c1d16 100644 --- a/llvm/lib/Target/RISCV/RISCVRegisterInfo.td +++ b/llvm/lib/Target/RISCV/RISCVRegisterInfo.td @@ -358,8 +358,7 @@ let RegAltNameIndices = [ABIRegAltName] in { } } -let RegInfos = XLenPairRI, CopyCost = 2, - DecoderMethod = "DecodeGPRPairRegisterClass" in { +let RegInfos = XLenPairRI, CopyCost = 2 in { def GPRPair : RISCVRegisterClass<[XLenPairVT, XLenPairFVT], 64, (add X10_X11, X12_X13, X14_X15, X16_X17, X6_X7, @@ -370,12 +369,11 @@ def GPRPair : RISCVRegisterClass<[XLenPairVT, XLenPairFVT], 64, (add )>; def GPRPairNoX0 : RISCVRegisterClass<[XLenPairVT, XLenPairFVT], 64, (sub GPRPair, X0_Pair)>; -} // let RegInfos = XLenPairRI, DecoderMethod = "DecodeGPRPairRegisterClass" -let RegInfos = XLenPairRI, CopyCost = 2 in def GPRPairC : RISCVRegisterClass<[XLenPairVT, XLenPairFVT], 64, (add X10_X11, X12_X13, X14_X15, X8_X9 )>; +} // let RegInfos = XLenPairRI, CopyCost = 2 //===----------------------------------------------------------------------===// // Floating Point registers diff --git a/llvm/test/MC/Disassembler/RISCV/zclsd-invalid-pair.txt b/llvm/test/MC/Disassembler/RISCV/zclsd-invalid-pair.txt new file mode 100644 index 0000000000000..7f666ffdfa259 --- /dev/null +++ b/llvm/test/MC/Disassembler/RISCV/zclsd-invalid-pair.txt @@ -0,0 +1,12 @@ +# RUN: not llvm-mc -disassemble -triple=riscv32 -mattr=+zclsd -M no-aliases %s \ +# RUN: | FileCheck -check-prefixes=CHECK %s + + +[0x00,0x00] +# CHECK: unimp + +[0x52,0x70] +# CHECK-NOT: c.ldsp zero, {{[0-9]+}}(sp) + +[0x00,0x00] +# CHECK: unimp