diff options
author | Sam Elliott <quic_aelliott@quicinc.com> | 2025-03-27 17:43:26 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-27 17:43:26 -0700 |
commit | 75ca080daba6585d0a6522187aab4bc781ba4103 (patch) | |
tree | c4efb41d47abe8e58dde819b243636f3db1cab56 /llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | |
parent | d7c53a91c2c11439429bbd50bb1d0a202c553a47 (diff) | |
download | llvm-75ca080daba6585d0a6522187aab4bc781ba4103.zip llvm-75ca080daba6585d0a6522187aab4bc781ba4103.tar.gz llvm-75ca080daba6585d0a6522187aab4bc781ba4103.tar.bz2 |
[RISCV][Xqccmp] Correctly Parse/Disassemble pushfp (#133188)
In the `qc.cm.pushfp` instruction, it is like `cm.pushfp` except in one
important way - `qc.cm.pushfp {ra}, -N*16` is not a valid encoding,
because this would update `s0`/`fp`/`x8` without saving it.
This change now correctly rejects this variant of the instruction, both
during parsing and during disassembly. I also implemented validation for
immediates that represent register lists (both kinds), which may help to
catch bugs in the future.
Diffstat (limited to 'llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp')
-rw-r--r-- | llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp index 46b0141..15f9ea0 100644 --- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp +++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp @@ -507,6 +507,9 @@ static DecodeStatus decodeXTHeadMemPair(MCInst &Inst, uint32_t Insn, static DecodeStatus decodeZcmpRlist(MCInst &Inst, uint32_t Imm, uint64_t Address, const void *Decoder); +static DecodeStatus decodeXqccmpRlistS0(MCInst &Inst, uint32_t Imm, + uint64_t Address, const void *Decoder); + static DecodeStatus decodeZcmpSpimm(MCInst &Inst, uint32_t Imm, uint64_t Address, const void *Decoder); @@ -612,7 +615,15 @@ static DecodeStatus decodeXTHeadMemPair(MCInst &Inst, uint32_t Insn, static DecodeStatus decodeZcmpRlist(MCInst &Inst, uint32_t Imm, uint64_t Address, const void *Decoder) { - if (Imm <= 3) + if (Imm < RISCVZC::RA) + return MCDisassembler::Fail; + Inst.addOperand(MCOperand::createImm(Imm)); + return MCDisassembler::Success; +} + +static DecodeStatus decodeXqccmpRlistS0(MCInst &Inst, uint32_t Imm, + uint64_t Address, const void *Decoder) { + if (Imm < RISCVZC::RA_S0) return MCDisassembler::Fail; Inst.addOperand(MCOperand::createImm(Imm)); return MCDisassembler::Success; |