diff options
author | Shiva Chen <shiva0217@gmail.com> | 2018-02-22 15:02:28 +0000 |
---|---|---|
committer | Shiva Chen <shiva0217@gmail.com> | 2018-02-22 15:02:28 +0000 |
commit | 7c17242b9215d6ac1eacf4a7ed397c672a2b07e9 (patch) | |
tree | 3255323376aff1207390cb6326948a230def435d /llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | |
parent | 6c1e6bbe0c609489ef49f9d64f1370a43e05c19c (diff) | |
download | bcm5719-llvm-7c17242b9215d6ac1eacf4a7ed397c672a2b07e9.tar.gz bcm5719-llvm-7c17242b9215d6ac1eacf4a7ed397c672a2b07e9.zip |
[RISCV] Implement c.lui immediate operand constraint
Implement c.lui immediate constraint to [1, 31] and [0xfffe0, 0xfffff].
The RISC-V ISA describes the constraint as [1, 63], with that value
being loaded in to bits 17-12 of the destination register and sign extended
from bit 17. Therefore, this 6-bit immediate can represent values in the
ranges [1, 31] and [0xfffe0, 0xfffff].
Differential Revision: https://reviews.llvm.org/D42834
llvm-svn: 325792
Diffstat (limited to 'llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp')
-rw-r--r-- | llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp index 563edc9e29d..91c72aa191d 100644 --- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp +++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp @@ -232,6 +232,17 @@ static DecodeStatus decodeSImmOperandAndLsl1(MCInst &Inst, uint64_t Imm, return MCDisassembler::Success; } +static DecodeStatus decodeCLUIImmOperand(MCInst &Inst, uint64_t Imm, + int64_t Address, + const void *Decoder) { + assert(isUInt<6>(Imm) && "Invalid immediate"); + if (Imm > 31) { + Imm = (SignExtend64<6>(Imm) & 0xfffff); + } + Inst.addOperand(MCOperand::createImm(Imm)); + return MCDisassembler::Success; +} + #include "RISCVGenDisassemblerTables.inc" DecodeStatus RISCVDisassembler::getInstruction(MCInst &MI, uint64_t &Size, |