diff options
author | Paul Bowen-Huggett <paulhuggett@mac.com> | 2025-03-28 19:18:21 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-28 11:18:21 -0700 |
commit | bc37fea107dd21ea92efee20032a844e09d4e504 (patch) | |
tree | 60ec56241b1b5a471701a2ac08cd0f84d06791b8 /llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | |
parent | d6d559cc090b775649f1de6f6bfcc029184d4fb5 (diff) | |
download | llvm-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.cpp | 5 |
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; } |