diff options
Diffstat (limited to 'llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp')
-rw-r--r-- | llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp b/llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp index 3a96ab6c6cb..ecb51cf695f 100644 --- a/llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp +++ b/llvm/lib/Target/AArch64/Disassembler/AArch64Disassembler.cpp @@ -207,6 +207,9 @@ static DecodeStatus DecodeSVELogicalImmInstruction(llvm::MCInst &Inst, template<int Bits> static DecodeStatus DecodeSImm(llvm::MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder); +template <int ElementWidth> +static DecodeStatus DecodeImm8OptLsl(MCInst &Inst, unsigned Imm, + uint64_t Addr, const void *Decoder); static bool Check(DecodeStatus &Out, DecodeStatus In) { switch (In) { @@ -1775,3 +1778,15 @@ static DecodeStatus DecodeSImm(llvm::MCInst &Inst, uint64_t Imm, return Success; } +// Decode 8-bit signed/unsigned immediate for a given element width. +template <int ElementWidth> +static DecodeStatus DecodeImm8OptLsl(MCInst &Inst, unsigned Imm, + uint64_t Addr, const void *Decoder) { + unsigned Val = (uint8_t)Imm; + unsigned Shift = (Imm & 0x100) ? 8 : 0; + if (ElementWidth == 8 && Shift) + return Fail; + Inst.addOperand(MCOperand::createImm(Val)); + Inst.addOperand(MCOperand::createImm(Shift)); + return Success; +} |