aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
diff options
context:
space:
mode:
authorPaul Bowen-Huggett <paulhuggett@mac.com>2025-03-28 19:18:21 +0100
committerGitHub <noreply@github.com>2025-03-28 11:18:21 -0700
commitbc37fea107dd21ea92efee20032a844e09d4e504 (patch)
tree60ec56241b1b5a471701a2ac08cd0f84d06791b8 /llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
parentd6d559cc090b775649f1de6f6bfcc029184d4fb5 (diff)
downloadllvm-bc37fea107dd21ea92efee20032a844e09d4e504.zip
llvm-bc37fea107dd21ea92efee20032a844e09d4e504.tar.gz
llvm-bc37fea107dd21ea92efee20032a844e09d4e504.tar.bz2
[RISCV] Fix the disassembler's handling of C.LUI when imm=0 (#133450)
Fix for #133446. According to the RISC-V spec: "C.LUI is valid only when rd≠{x0,x2}, and when the immediate is not equal to zero. The code points with imm=0 are reserved". This change makes the disassembler consider code points with imm=0 as illegal. It introduces a test which exercises every C.LUI opcode including the illegal ones but excluding those assigned to C.ADDI16SP). Output for +c, +c +Zcmop, and +c +no-rvc-hints is checked.
Diffstat (limited to 'llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp')
-rw-r--r--llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
index 15f9ea0..e2a98e8 100644
--- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
+++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
@@ -453,9 +453,10 @@ static DecodeStatus decodeCLUIImmOperand(MCInst &Inst, uint32_t Imm,
int64_t Address,
const MCDisassembler *Decoder) {
assert(isUInt<6>(Imm) && "Invalid immediate");
- if (Imm > 31) {
+ if (Imm == 0)
+ return MCDisassembler::Fail;
+ if (Imm > 31)
Imm = (SignExtend64<6>(Imm) & 0xfffff);
- }
Inst.addOperand(MCOperand::createImm(Imm));
return MCDisassembler::Success;
}