1 //===- AArch64Disassembler.cpp - Disassembler for AArch64 ISA -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the functions necessary to decode AArch64 instruction
11 // bitpatterns into MCInsts (with the help of TableGenerated information from
12 // the instruction definitions).
14 //===----------------------------------------------------------------------===//
16 #define DEBUG_TYPE "arm-disassembler"
19 #include "AArch64RegisterInfo.h"
20 #include "AArch64Subtarget.h"
21 #include "Utils/AArch64BaseInfo.h"
22 #include "llvm/MC/MCInst.h"
23 #include "llvm/MC/MCInstrDesc.h"
24 #include "llvm/MC/MCExpr.h"
25 #include "llvm/MC/MCContext.h"
26 #include "llvm/MC/MCDisassembler.h"
27 #include "llvm/MC/MCFixedLenDisassembler.h"
28 #include "llvm/Support/Debug.h"
29 #include "llvm/Support/MemoryObject.h"
30 #include "llvm/Support/ErrorHandling.h"
31 #include "llvm/Support/TargetRegistry.h"
32 #include "llvm/Support/raw_ostream.h"
36 typedef MCDisassembler::DecodeStatus DecodeStatus;
39 /// AArch64 disassembler for all AArch64 platforms.
40 class AArch64Disassembler : public MCDisassembler {
41 OwningPtr<const MCRegisterInfo> RegInfo;
43 /// Initializes the disassembler.
45 AArch64Disassembler(const MCSubtargetInfo &STI, const MCRegisterInfo *Info)
46 : MCDisassembler(STI), RegInfo(Info) {
49 ~AArch64Disassembler() {}
51 /// See MCDisassembler.
52 DecodeStatus getInstruction(MCInst &instr,
54 const MemoryObject ®ion,
57 raw_ostream &cStream) const;
59 const MCRegisterInfo *getRegInfo() const { return RegInfo.get(); }
64 // Forward-declarations used in the auto-generated files.
65 static DecodeStatus DecodeGPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
66 uint64_t Address, const void *Decoder);
68 DecodeGPR64xspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
69 uint64_t Address, const void *Decoder);
71 static DecodeStatus DecodeGPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
72 uint64_t Address, const void *Decoder);
74 DecodeGPR32wspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
75 uint64_t Address, const void *Decoder);
77 static DecodeStatus DecodeFPR8RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
78 uint64_t Address, const void *Decoder);
79 static DecodeStatus DecodeFPR16RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
80 uint64_t Address, const void *Decoder);
81 static DecodeStatus DecodeFPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
82 uint64_t Address, const void *Decoder);
83 static DecodeStatus DecodeFPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
84 uint64_t Address, const void *Decoder);
85 static DecodeStatus DecodeFPR64LoRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
86 uint64_t Address, const void *Decoder);
87 static DecodeStatus DecodeFPR128RegisterClass(llvm::MCInst &Inst,
88 unsigned RegNo, uint64_t Address,
90 static DecodeStatus DecodeFPR128LoRegisterClass(llvm::MCInst &Inst,
91 unsigned RegNo, uint64_t Address,
94 static DecodeStatus DecodeGPR64noxzrRegisterClass(llvm::MCInst &Inst,
99 static DecodeStatus DecodeDPairRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
101 const void *Decoder);
102 static DecodeStatus DecodeQPairRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
104 const void *Decoder);
105 static DecodeStatus DecodeDTripleRegisterClass(llvm::MCInst &Inst,
106 unsigned RegNo, uint64_t Address,
107 const void *Decoder);
108 static DecodeStatus DecodeQTripleRegisterClass(llvm::MCInst &Inst,
109 unsigned RegNo, uint64_t Address,
110 const void *Decoder);
111 static DecodeStatus DecodeDQuadRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
113 const void *Decoder);
114 static DecodeStatus DecodeQQuadRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
116 const void *Decoder);
118 static DecodeStatus DecodeAddrRegExtendOperand(llvm::MCInst &Inst,
121 const void *Decoder);
124 static DecodeStatus DecodeBitfield32ImmOperand(llvm::MCInst &Inst,
127 const void *Decoder);
129 static DecodeStatus DecodeCVT32FixedPosOperand(llvm::MCInst &Inst,
132 const void *Decoder);
134 static DecodeStatus DecodeFPZeroOperand(llvm::MCInst &Inst,
137 const void *Decoder);
139 static DecodeStatus DecodeShiftRightImm8(MCInst &Inst, unsigned Val,
140 uint64_t Address, const void *Decoder);
141 static DecodeStatus DecodeShiftRightImm16(MCInst &Inst, unsigned Val,
143 const void *Decoder);
144 static DecodeStatus DecodeShiftRightImm32(MCInst &Inst, unsigned Val,
146 const void *Decoder);
147 static DecodeStatus DecodeShiftRightImm64(MCInst &Inst, unsigned Val,
149 const void *Decoder);
151 static DecodeStatus DecodeShiftLeftImm8(MCInst &Inst, unsigned Val,
152 uint64_t Address, const void *Decoder);
153 static DecodeStatus DecodeShiftLeftImm16(MCInst &Inst, unsigned Val,
155 const void *Decoder);
156 static DecodeStatus DecodeShiftLeftImm32(MCInst &Inst, unsigned Val,
158 const void *Decoder);
159 static DecodeStatus DecodeShiftLeftImm64(MCInst &Inst, unsigned Val,
161 const void *Decoder);
163 template<int RegWidth>
164 static DecodeStatus DecodeMoveWideImmOperand(llvm::MCInst &Inst,
167 const void *Decoder);
169 template<int RegWidth>
170 static DecodeStatus DecodeLogicalImmOperand(llvm::MCInst &Inst,
173 const void *Decoder);
175 static DecodeStatus DecodeRegExtendOperand(llvm::MCInst &Inst,
176 unsigned ShiftAmount,
178 const void *Decoder);
179 template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf>
181 DecodeNeonMovImmShiftOperand(llvm::MCInst &Inst, unsigned ShiftAmount,
182 uint64_t Address, const void *Decoder);
184 static DecodeStatus Decode32BitShiftOperand(llvm::MCInst &Inst,
185 unsigned ShiftAmount,
187 const void *Decoder);
188 static DecodeStatus DecodeBitfieldInstruction(llvm::MCInst &Inst, unsigned Insn,
190 const void *Decoder);
192 static DecodeStatus DecodeFMOVLaneInstruction(llvm::MCInst &Inst, unsigned Insn,
194 const void *Decoder);
196 static DecodeStatus DecodeLDSTPairInstruction(llvm::MCInst &Inst,
199 const void *Decoder);
201 static DecodeStatus DecodeLoadPairExclusiveInstruction(llvm::MCInst &Inst,
204 const void *Decoder);
206 template<typename SomeNamedImmMapper>
207 static DecodeStatus DecodeNamedImmOperand(llvm::MCInst &Inst,
210 const void *Decoder);
213 DecodeSysRegOperand(const A64SysReg::SysRegMapper &InstMapper,
214 llvm::MCInst &Inst, unsigned Val,
215 uint64_t Address, const void *Decoder);
217 static DecodeStatus DecodeMRSOperand(llvm::MCInst &Inst,
220 const void *Decoder);
222 static DecodeStatus DecodeMSROperand(llvm::MCInst &Inst,
225 const void *Decoder);
228 static DecodeStatus DecodeSingleIndexedInstruction(llvm::MCInst &Inst,
231 const void *Decoder);
233 static DecodeStatus DecodeVLDSTPostInstruction(MCInst &Inst, unsigned Val,
235 const void *Decoder);
237 static DecodeStatus DecodeVLDSTLanePostInstruction(MCInst &Inst, unsigned Insn,
239 const void *Decoder);
241 static DecodeStatus DecodeSHLLInstruction(MCInst &Inst, unsigned Insn,
243 const void *Decoder);
245 static bool Check(DecodeStatus &Out, DecodeStatus In);
247 #include "AArch64GenDisassemblerTables.inc"
248 #include "AArch64GenInstrInfo.inc"
250 static bool Check(DecodeStatus &Out, DecodeStatus In) {
252 case MCDisassembler::Success:
253 // Out stays the same.
255 case MCDisassembler::SoftFail:
258 case MCDisassembler::Fail:
262 llvm_unreachable("Invalid DecodeStatus!");
265 DecodeStatus AArch64Disassembler::getInstruction(MCInst &MI, uint64_t &Size,
266 const MemoryObject &Region,
269 raw_ostream &cs) const {
274 // We want to read exactly 4 bytes of data.
275 if (Region.readBytes(Address, 4, bytes) == -1) {
277 return MCDisassembler::Fail;
280 // Encoded as a small-endian 32-bit word in the stream.
281 uint32_t insn = (bytes[3] << 24) |
286 // Calling the auto-generated decoder function.
287 DecodeStatus result = decodeInstruction(DecoderTableA6432, MI, insn, Address,
289 if (result != MCDisassembler::Fail) {
296 return MCDisassembler::Fail;
299 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
300 const AArch64Disassembler *Dis = static_cast<const AArch64Disassembler*>(D);
301 return Dis->getRegInfo()->getRegClass(RC).getRegister(RegNo);
304 static DecodeStatus DecodeGPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
305 uint64_t Address, const void *Decoder) {
307 return MCDisassembler::Fail;
309 uint16_t Register = getReg(Decoder, AArch64::GPR64RegClassID, RegNo);
310 Inst.addOperand(MCOperand::CreateReg(Register));
311 return MCDisassembler::Success;
315 DecodeGPR64xspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
316 uint64_t Address, const void *Decoder) {
318 return MCDisassembler::Fail;
320 uint16_t Register = getReg(Decoder, AArch64::GPR64xspRegClassID, RegNo);
321 Inst.addOperand(MCOperand::CreateReg(Register));
322 return MCDisassembler::Success;
325 static DecodeStatus DecodeGPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
327 const void *Decoder) {
329 return MCDisassembler::Fail;
331 uint16_t Register = getReg(Decoder, AArch64::GPR32RegClassID, RegNo);
332 Inst.addOperand(MCOperand::CreateReg(Register));
333 return MCDisassembler::Success;
337 DecodeGPR32wspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
338 uint64_t Address, const void *Decoder) {
340 return MCDisassembler::Fail;
342 uint16_t Register = getReg(Decoder, AArch64::GPR32wspRegClassID, RegNo);
343 Inst.addOperand(MCOperand::CreateReg(Register));
344 return MCDisassembler::Success;
348 DecodeFPR8RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
349 uint64_t Address, const void *Decoder) {
351 return MCDisassembler::Fail;
353 uint16_t Register = getReg(Decoder, AArch64::FPR8RegClassID, RegNo);
354 Inst.addOperand(MCOperand::CreateReg(Register));
355 return MCDisassembler::Success;
359 DecodeFPR16RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
360 uint64_t Address, const void *Decoder) {
362 return MCDisassembler::Fail;
364 uint16_t Register = getReg(Decoder, AArch64::FPR16RegClassID, RegNo);
365 Inst.addOperand(MCOperand::CreateReg(Register));
366 return MCDisassembler::Success;
371 DecodeFPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
372 uint64_t Address, const void *Decoder) {
374 return MCDisassembler::Fail;
376 uint16_t Register = getReg(Decoder, AArch64::FPR32RegClassID, RegNo);
377 Inst.addOperand(MCOperand::CreateReg(Register));
378 return MCDisassembler::Success;
382 DecodeFPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
383 uint64_t Address, const void *Decoder) {
385 return MCDisassembler::Fail;
387 uint16_t Register = getReg(Decoder, AArch64::FPR64RegClassID, RegNo);
388 Inst.addOperand(MCOperand::CreateReg(Register));
389 return MCDisassembler::Success;
393 DecodeFPR64LoRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
394 uint64_t Address, const void *Decoder) {
396 return MCDisassembler::Fail;
398 return DecodeFPR64RegisterClass(Inst, RegNo, Address, Decoder);
402 DecodeFPR128RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
403 uint64_t Address, const void *Decoder) {
405 return MCDisassembler::Fail;
407 uint16_t Register = getReg(Decoder, AArch64::FPR128RegClassID, RegNo);
408 Inst.addOperand(MCOperand::CreateReg(Register));
409 return MCDisassembler::Success;
413 DecodeFPR128LoRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
414 uint64_t Address, const void *Decoder) {
416 return MCDisassembler::Fail;
418 return DecodeFPR128RegisterClass(Inst, RegNo, Address, Decoder);
421 static DecodeStatus DecodeGPR64noxzrRegisterClass(llvm::MCInst &Inst,
424 const void *Decoder) {
426 return MCDisassembler::Fail;
428 uint16_t Register = getReg(Decoder, AArch64::GPR64noxzrRegClassID, RegNo);
429 Inst.addOperand(MCOperand::CreateReg(Register));
430 return MCDisassembler::Success;
433 static DecodeStatus DecodeRegisterClassByID(llvm::MCInst &Inst, unsigned RegNo,
435 const void *Decoder) {
437 return MCDisassembler::Fail;
439 uint16_t Register = getReg(Decoder, RegID, RegNo);
440 Inst.addOperand(MCOperand::CreateReg(Register));
441 return MCDisassembler::Success;
444 static DecodeStatus DecodeDPairRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
446 const void *Decoder) {
447 return DecodeRegisterClassByID(Inst, RegNo, AArch64::DPairRegClassID,
451 static DecodeStatus DecodeQPairRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
453 const void *Decoder) {
454 return DecodeRegisterClassByID(Inst, RegNo, AArch64::QPairRegClassID,
458 static DecodeStatus DecodeDTripleRegisterClass(llvm::MCInst &Inst,
459 unsigned RegNo, uint64_t Address,
460 const void *Decoder) {
461 return DecodeRegisterClassByID(Inst, RegNo, AArch64::DTripleRegClassID,
465 static DecodeStatus DecodeQTripleRegisterClass(llvm::MCInst &Inst,
466 unsigned RegNo, uint64_t Address,
467 const void *Decoder) {
468 return DecodeRegisterClassByID(Inst, RegNo, AArch64::QTripleRegClassID,
472 static DecodeStatus DecodeDQuadRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
474 const void *Decoder) {
475 return DecodeRegisterClassByID(Inst, RegNo, AArch64::DQuadRegClassID,
479 static DecodeStatus DecodeQQuadRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
481 const void *Decoder) {
482 return DecodeRegisterClassByID(Inst, RegNo, AArch64::QQuadRegClassID,
486 static DecodeStatus DecodeAddrRegExtendOperand(llvm::MCInst &Inst,
489 const void *Decoder) {
490 // Option{1} must be 1. OptionHiS is made up of {Option{2}, Option{1},
491 // S}. Hence we want to check bit 1.
492 if (!(OptionHiS & 2))
493 return MCDisassembler::Fail;
495 Inst.addOperand(MCOperand::CreateImm(OptionHiS));
496 return MCDisassembler::Success;
499 static DecodeStatus DecodeBitfield32ImmOperand(llvm::MCInst &Inst,
502 const void *Decoder) {
503 // In the 32-bit variant, bit 6 must be zero. I.e. the immediate must be
506 return MCDisassembler::Fail;
508 Inst.addOperand(MCOperand::CreateImm(Imm6Bits));
509 return MCDisassembler::Success;
512 static DecodeStatus DecodeCVT32FixedPosOperand(llvm::MCInst &Inst,
515 const void *Decoder) {
516 // 1 <= Imm <= 32. Encoded as 64 - Imm so: 63 >= Encoded >= 32.
518 return MCDisassembler::Fail;
520 Inst.addOperand(MCOperand::CreateImm(Imm6Bits));
521 return MCDisassembler::Success;
524 static DecodeStatus DecodeFPZeroOperand(llvm::MCInst &Inst,
527 const void *Decoder) {
528 // Any bits are valid in the instruction (they're architecturally ignored),
529 // but a code generator should insert 0.
530 Inst.addOperand(MCOperand::CreateImm(0));
531 return MCDisassembler::Success;
534 static DecodeStatus DecodeShiftRightImm8(MCInst &Inst, unsigned Val,
536 const void *Decoder) {
537 Inst.addOperand(MCOperand::CreateImm(8 - Val));
538 return MCDisassembler::Success;
541 static DecodeStatus DecodeShiftRightImm16(MCInst &Inst, unsigned Val,
543 const void *Decoder) {
544 Inst.addOperand(MCOperand::CreateImm(16 - Val));
545 return MCDisassembler::Success;
548 static DecodeStatus DecodeShiftRightImm32(MCInst &Inst, unsigned Val,
550 const void *Decoder) {
551 Inst.addOperand(MCOperand::CreateImm(32 - Val));
552 return MCDisassembler::Success;
555 static DecodeStatus DecodeShiftRightImm64(MCInst &Inst, unsigned Val,
557 const void *Decoder) {
558 Inst.addOperand(MCOperand::CreateImm(64 - Val));
559 return MCDisassembler::Success;
562 static DecodeStatus DecodeShiftLeftImm8(MCInst &Inst, unsigned Val,
564 const void *Decoder) {
566 return MCDisassembler::Fail;
568 Inst.addOperand(MCOperand::CreateImm(Val));
569 return MCDisassembler::Success;
572 static DecodeStatus DecodeShiftLeftImm16(MCInst &Inst, unsigned Val,
574 const void *Decoder) {
576 return MCDisassembler::Fail;
578 Inst.addOperand(MCOperand::CreateImm(Val));
579 return MCDisassembler::Success;
582 static DecodeStatus DecodeShiftLeftImm32(MCInst &Inst, unsigned Val,
584 const void *Decoder) {
586 return MCDisassembler::Fail;
588 Inst.addOperand(MCOperand::CreateImm(Val));
589 return MCDisassembler::Success;
592 static DecodeStatus DecodeShiftLeftImm64(MCInst &Inst, unsigned Val,
594 const void *Decoder) {
596 return MCDisassembler::Fail;
598 Inst.addOperand(MCOperand::CreateImm(Val));
599 return MCDisassembler::Success;
602 template<int RegWidth>
603 static DecodeStatus DecodeMoveWideImmOperand(llvm::MCInst &Inst,
606 const void *Decoder) {
607 unsigned Imm16 = FullImm & 0xffff;
608 unsigned Shift = FullImm >> 16;
610 if (RegWidth == 32 && Shift > 1) return MCDisassembler::Fail;
612 Inst.addOperand(MCOperand::CreateImm(Imm16));
613 Inst.addOperand(MCOperand::CreateImm(Shift));
614 return MCDisassembler::Success;
617 template<int RegWidth>
618 static DecodeStatus DecodeLogicalImmOperand(llvm::MCInst &Inst,
621 const void *Decoder) {
623 if (!A64Imms::isLogicalImmBits(RegWidth, Bits, Imm))
624 return MCDisassembler::Fail;
626 Inst.addOperand(MCOperand::CreateImm(Bits));
627 return MCDisassembler::Success;
631 static DecodeStatus DecodeRegExtendOperand(llvm::MCInst &Inst,
632 unsigned ShiftAmount,
634 const void *Decoder) {
635 // Only values 0-4 are valid for this 3-bit field
637 return MCDisassembler::Fail;
639 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
640 return MCDisassembler::Success;
643 static DecodeStatus Decode32BitShiftOperand(llvm::MCInst &Inst,
644 unsigned ShiftAmount,
646 const void *Decoder) {
647 // Only values below 32 are valid for a 32-bit register
648 if (ShiftAmount > 31)
649 return MCDisassembler::Fail;
651 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
652 return MCDisassembler::Success;
655 static DecodeStatus DecodeBitfieldInstruction(llvm::MCInst &Inst, unsigned Insn,
657 const void *Decoder) {
658 unsigned Rd = fieldFromInstruction(Insn, 0, 5);
659 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
660 unsigned ImmS = fieldFromInstruction(Insn, 10, 6);
661 unsigned ImmR = fieldFromInstruction(Insn, 16, 6);
662 unsigned SF = fieldFromInstruction(Insn, 31, 1);
664 // Undef for 0b11 just in case it occurs. Don't want the compiler to optimise
665 // out assertions that it thinks should never be hit.
666 enum OpcTypes { SBFM = 0, BFM, UBFM, Undef } Opc;
667 Opc = (OpcTypes)fieldFromInstruction(Insn, 29, 2);
670 // ImmR and ImmS must be between 0 and 31 for 32-bit instructions.
671 if (ImmR > 31 || ImmS > 31)
672 return MCDisassembler::Fail;
676 DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
677 // BFM MCInsts use Rd as a source too.
678 if (Opc == BFM) DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
679 DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
681 DecodeGPR32RegisterClass(Inst, Rd, Address, Decoder);
682 // BFM MCInsts use Rd as a source too.
683 if (Opc == BFM) DecodeGPR32RegisterClass(Inst, Rd, Address, Decoder);
684 DecodeGPR32RegisterClass(Inst, Rn, Address, Decoder);
687 // ASR and LSR have more specific patterns so they won't get here:
688 assert(!(ImmS == 31 && !SF && Opc != BFM)
689 && "shift should have used auto decode");
690 assert(!(ImmS == 63 && SF && Opc != BFM)
691 && "shift should have used auto decode");
693 // Extension instructions similarly:
694 if (Opc == SBFM && ImmR == 0) {
695 assert((ImmS != 7 && ImmS != 15) && "extension got here");
696 assert((ImmS != 31 || SF == 0) && "extension got here");
697 } else if (Opc == UBFM && ImmR == 0) {
698 assert((SF != 0 || (ImmS != 7 && ImmS != 15)) && "extension got here");
702 // It might be a LSL instruction, which actually takes the shift amount
703 // itself as an MCInst operand.
704 if (SF && (ImmS + 1) % 64 == ImmR) {
705 Inst.setOpcode(AArch64::LSLxxi);
706 Inst.addOperand(MCOperand::CreateImm(63 - ImmS));
707 return MCDisassembler::Success;
708 } else if (!SF && (ImmS + 1) % 32 == ImmR) {
709 Inst.setOpcode(AArch64::LSLwwi);
710 Inst.addOperand(MCOperand::CreateImm(31 - ImmS));
711 return MCDisassembler::Success;
715 // Otherwise it's definitely either an extract or an insert depending on which
716 // of ImmR or ImmS is larger.
717 unsigned ExtractOp, InsertOp;
719 default: llvm_unreachable("unexpected instruction trying to decode bitfield");
721 ExtractOp = SF ? AArch64::SBFXxxii : AArch64::SBFXwwii;
722 InsertOp = SF ? AArch64::SBFIZxxii : AArch64::SBFIZwwii;
725 ExtractOp = SF ? AArch64::BFXILxxii : AArch64::BFXILwwii;
726 InsertOp = SF ? AArch64::BFIxxii : AArch64::BFIwwii;
729 ExtractOp = SF ? AArch64::UBFXxxii : AArch64::UBFXwwii;
730 InsertOp = SF ? AArch64::UBFIZxxii : AArch64::UBFIZwwii;
734 // Otherwise it's a boring insert or extract
735 Inst.addOperand(MCOperand::CreateImm(ImmR));
736 Inst.addOperand(MCOperand::CreateImm(ImmS));
740 Inst.setOpcode(InsertOp);
742 Inst.setOpcode(ExtractOp);
744 return MCDisassembler::Success;
747 static DecodeStatus DecodeFMOVLaneInstruction(llvm::MCInst &Inst, unsigned Insn,
749 const void *Decoder) {
750 // This decoder exists to add the dummy Lane operand to the MCInst, which must
751 // be 1 in assembly but has no other real manifestation.
752 unsigned Rd = fieldFromInstruction(Insn, 0, 5);
753 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
754 unsigned IsToVec = fieldFromInstruction(Insn, 16, 1);
757 DecodeFPR128RegisterClass(Inst, Rd, Address, Decoder);
758 DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
760 DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
761 DecodeFPR128RegisterClass(Inst, Rn, Address, Decoder);
765 Inst.addOperand(MCOperand::CreateImm(1));
767 return MCDisassembler::Success;
771 static DecodeStatus DecodeLDSTPairInstruction(llvm::MCInst &Inst,
774 const void *Decoder) {
775 DecodeStatus Result = MCDisassembler::Success;
776 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
777 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
778 unsigned Rt2 = fieldFromInstruction(Insn, 10, 5);
779 unsigned SImm7 = fieldFromInstruction(Insn, 15, 7);
780 unsigned L = fieldFromInstruction(Insn, 22, 1);
781 unsigned V = fieldFromInstruction(Insn, 26, 1);
782 unsigned Opc = fieldFromInstruction(Insn, 30, 2);
784 // Not an official name, but it turns out that bit 23 distinguishes indexed
785 // from non-indexed operations.
786 unsigned Indexed = fieldFromInstruction(Insn, 23, 1);
788 if (Indexed && L == 0) {
789 // The MCInst for an indexed store has an out operand and 4 ins:
790 // Rn_wb, Rt, Rt2, Rn, Imm
791 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
794 // You shouldn't load to the same register twice in an instruction...
796 Result = MCDisassembler::SoftFail;
798 // ... or do any operation that writes-back to a transfer register. But note
799 // that "stp xzr, xzr, [sp], #4" is fine because xzr and sp are different.
800 if (Indexed && V == 0 && Rn != 31 && (Rt == Rn || Rt2 == Rn))
801 Result = MCDisassembler::SoftFail;
803 // Exactly how we decode the MCInst's registers depends on the Opc and V
804 // fields of the instruction. These also obviously determine the size of the
805 // operation so we can fill in that information while we're at it.
807 // The instruction operates on the FP/SIMD registers
809 default: return MCDisassembler::Fail;
811 DecodeFPR32RegisterClass(Inst, Rt, Address, Decoder);
812 DecodeFPR32RegisterClass(Inst, Rt2, Address, Decoder);
815 DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
816 DecodeFPR64RegisterClass(Inst, Rt2, Address, Decoder);
819 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
820 DecodeFPR128RegisterClass(Inst, Rt2, Address, Decoder);
825 default: return MCDisassembler::Fail;
827 DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder);
828 DecodeGPR32RegisterClass(Inst, Rt2, Address, Decoder);
831 assert(L && "unexpected \"store signed\" attempt");
832 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
833 DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder);
836 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
837 DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder);
842 if (Indexed && L == 1) {
843 // The MCInst for an indexed load has 3 out operands and an 3 ins:
844 // Rt, Rt2, Rn_wb, Rt2, Rn, Imm
845 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
849 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
850 Inst.addOperand(MCOperand::CreateImm(SImm7));
855 static DecodeStatus DecodeLoadPairExclusiveInstruction(llvm::MCInst &Inst,
858 const void *Decoder) {
859 unsigned Rt = fieldFromInstruction(Val, 0, 5);
860 unsigned Rn = fieldFromInstruction(Val, 5, 5);
861 unsigned Rt2 = fieldFromInstruction(Val, 10, 5);
862 unsigned MemSize = fieldFromInstruction(Val, 30, 2);
864 DecodeStatus S = MCDisassembler::Success;
865 if (Rt == Rt2) S = MCDisassembler::SoftFail;
869 if (!Check(S, DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder)))
870 return MCDisassembler::Fail;
871 if (!Check(S, DecodeGPR32RegisterClass(Inst, Rt2, Address, Decoder)))
872 return MCDisassembler::Fail;
875 if (!Check(S, DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder)))
876 return MCDisassembler::Fail;
877 if (!Check(S, DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder)))
878 return MCDisassembler::Fail;
881 llvm_unreachable("Invalid MemSize in DecodeLoadPairExclusiveInstruction");
884 if (!Check(S, DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder)))
885 return MCDisassembler::Fail;
890 template<typename SomeNamedImmMapper>
891 static DecodeStatus DecodeNamedImmOperand(llvm::MCInst &Inst,
894 const void *Decoder) {
895 SomeNamedImmMapper Mapper;
897 Mapper.toString(Val, ValidNamed);
898 if (ValidNamed || Mapper.validImm(Val)) {
899 Inst.addOperand(MCOperand::CreateImm(Val));
900 return MCDisassembler::Success;
903 return MCDisassembler::Fail;
906 static DecodeStatus DecodeSysRegOperand(const A64SysReg::SysRegMapper &Mapper,
910 const void *Decoder) {
912 Mapper.toString(Val, ValidNamed);
914 Inst.addOperand(MCOperand::CreateImm(Val));
916 return ValidNamed ? MCDisassembler::Success : MCDisassembler::Fail;
919 static DecodeStatus DecodeMRSOperand(llvm::MCInst &Inst,
922 const void *Decoder) {
923 return DecodeSysRegOperand(A64SysReg::MRSMapper(), Inst, Val, Address,
927 static DecodeStatus DecodeMSROperand(llvm::MCInst &Inst,
930 const void *Decoder) {
931 return DecodeSysRegOperand(A64SysReg::MSRMapper(), Inst, Val, Address,
935 static DecodeStatus DecodeSingleIndexedInstruction(llvm::MCInst &Inst,
938 const void *Decoder) {
939 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
940 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
941 unsigned Imm9 = fieldFromInstruction(Insn, 12, 9);
943 unsigned Opc = fieldFromInstruction(Insn, 22, 2);
944 unsigned V = fieldFromInstruction(Insn, 26, 1);
945 unsigned Size = fieldFromInstruction(Insn, 30, 2);
947 if (Opc == 0 || (V == 1 && Opc == 2)) {
948 // It's a store, the MCInst gets: Rn_wb, Rt, Rn, Imm
949 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
952 if (V == 0 && (Opc == 2 || Size == 3)) {
953 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
955 DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder);
956 } else if (V == 1 && (Opc & 2)) {
957 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
961 DecodeFPR8RegisterClass(Inst, Rt, Address, Decoder);
964 DecodeFPR16RegisterClass(Inst, Rt, Address, Decoder);
967 DecodeFPR32RegisterClass(Inst, Rt, Address, Decoder);
970 DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
975 if (Opc != 0 && (V != 1 || Opc != 2)) {
976 // It's a load, the MCInst gets: Rt, Rn_wb, Rn, Imm
977 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
980 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
982 Inst.addOperand(MCOperand::CreateImm(Imm9));
984 // N.b. The official documentation says undpredictable if Rt == Rn, but this
985 // takes place at the architectural rather than encoding level:
987 // "STR xzr, [sp], #4" is perfectly valid.
988 if (V == 0 && Rt == Rn && Rn != 31)
989 return MCDisassembler::SoftFail;
991 return MCDisassembler::Success;
994 static MCDisassembler *createAArch64Disassembler(const Target &T,
995 const MCSubtargetInfo &STI) {
996 return new AArch64Disassembler(STI, T.createMCRegInfo(""));
999 extern "C" void LLVMInitializeAArch64Disassembler() {
1000 TargetRegistry::RegisterMCDisassembler(TheAArch64Target,
1001 createAArch64Disassembler);
1004 template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf>
1006 DecodeNeonMovImmShiftOperand(llvm::MCInst &Inst, unsigned ShiftAmount,
1007 uint64_t Address, const void *Decoder) {
1009 if (Ext == A64SE::LSL)
1011 else if (Ext != A64SE::MSL)
1012 return MCDisassembler::Fail;
1014 // MSL and LSLH accepts encoded shift amount 0 or 1.
1015 if ((!IsLSL || (IsLSL && IsHalf)) && ShiftAmount != 0 && ShiftAmount != 1)
1016 return MCDisassembler::Fail;
1018 // LSL accepts encoded shift amount 0, 1, 2 or 3.
1019 if (IsLSL && ShiftAmount > 3)
1020 return MCDisassembler::Fail;
1022 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
1023 return MCDisassembler::Success;
1026 // Decode post-index vector load/store instructions.
1027 // This is necessary as we need to decode Rm: if Rm == 0b11111, the last
1028 // operand is an immediate equal the the length of vector list in bytes,
1029 // or Rm is decoded to a GPR64noxzr register.
1030 static DecodeStatus DecodeVLDSTPostInstruction(MCInst &Inst, unsigned Insn,
1032 const void *Decoder) {
1033 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
1034 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
1035 unsigned Rm = fieldFromInstruction(Insn, 16, 5);
1036 unsigned Opcode = fieldFromInstruction(Insn, 12, 4);
1037 unsigned IsLoad = fieldFromInstruction(Insn, 22, 1);
1038 // 0 for 64bit vector list, 1 for 128bit vector list
1039 unsigned Is128BitVec = fieldFromInstruction(Insn, 30, 1);
1044 case 2: // ld1/st1 with 4 vectors
1047 case 6: // ld1/st1 with 3 vectors
1049 case 7: // ld1/st1 with 1 vector
1052 case 10: // ld1/st1 with 2 vectors
1055 llvm_unreachable("Invalid opcode for post-index load/store instructions");
1058 // Decode vector list of 1/2/3/4 vectors for load instructions.
1062 Is128BitVec ? DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder)
1063 : DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
1066 Is128BitVec ? DecodeQPairRegisterClass(Inst, Rt, Address, Decoder)
1067 : DecodeDPairRegisterClass(Inst, Rt, Address, Decoder);
1070 Is128BitVec ? DecodeQTripleRegisterClass(Inst, Rt, Address, Decoder)
1071 : DecodeDTripleRegisterClass(Inst, Rt, Address, Decoder);
1074 Is128BitVec ? DecodeQQuadRegisterClass(Inst, Rt, Address, Decoder)
1075 : DecodeDQuadRegisterClass(Inst, Rt, Address, Decoder);
1080 // Decode write back register, which is equal to Rn.
1081 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
1082 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
1084 if (Rm == 31) // If Rm is 0x11111, add the vector list length in byte
1085 Inst.addOperand(MCOperand::CreateImm(NumVecs * (Is128BitVec ? 16 : 8)));
1087 DecodeGPR64noxzrRegisterClass(Inst, Rm, Address, Decoder);
1089 // Decode vector list of 1/2/3/4 vectors for load instructions.
1093 Is128BitVec ? DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder)
1094 : DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
1097 Is128BitVec ? DecodeQPairRegisterClass(Inst, Rt, Address, Decoder)
1098 : DecodeDPairRegisterClass(Inst, Rt, Address, Decoder);
1101 Is128BitVec ? DecodeQTripleRegisterClass(Inst, Rt, Address, Decoder)
1102 : DecodeDTripleRegisterClass(Inst, Rt, Address, Decoder);
1105 Is128BitVec ? DecodeQQuadRegisterClass(Inst, Rt, Address, Decoder)
1106 : DecodeDQuadRegisterClass(Inst, Rt, Address, Decoder);
1111 return MCDisassembler::Success;
1114 // Decode post-index vector load/store lane instructions.
1115 // This is necessary as we need to decode Rm: if Rm == 0b11111, the last
1116 // operand is an immediate equal the the length of the changed bytes,
1117 // or Rm is decoded to a GPR64noxzr register.
1118 static DecodeStatus DecodeVLDSTLanePostInstruction(MCInst &Inst, unsigned Insn,
1120 const void *Decoder) {
1121 bool Is64bitVec = false;
1122 bool IsLoadDup = false;
1123 bool IsLoad = false;
1124 // The total number of bytes transferred.
1125 // TransferBytes = NumVecs * OneLaneBytes
1126 unsigned TransferBytes = 0;
1127 unsigned NumVecs = 0;
1128 unsigned Opc = Inst.getOpcode();
1130 case AArch64::LD1R_WB_8B_fixed: case AArch64::LD1R_WB_8B_register:
1131 case AArch64::LD1R_WB_4H_fixed: case AArch64::LD1R_WB_4H_register:
1132 case AArch64::LD1R_WB_2S_fixed: case AArch64::LD1R_WB_2S_register:
1133 case AArch64::LD1R_WB_1D_fixed: case AArch64::LD1R_WB_1D_register: {
1135 case AArch64::LD1R_WB_8B_fixed: case AArch64::LD1R_WB_8B_register:
1136 TransferBytes = 1; break;
1137 case AArch64::LD1R_WB_4H_fixed: case AArch64::LD1R_WB_4H_register:
1138 TransferBytes = 2; break;
1139 case AArch64::LD1R_WB_2S_fixed: case AArch64::LD1R_WB_2S_register:
1140 TransferBytes = 4; break;
1141 case AArch64::LD1R_WB_1D_fixed: case AArch64::LD1R_WB_1D_register:
1142 TransferBytes = 8; break;
1150 case AArch64::LD1R_WB_16B_fixed: case AArch64::LD1R_WB_16B_register:
1151 case AArch64::LD1R_WB_8H_fixed: case AArch64::LD1R_WB_8H_register:
1152 case AArch64::LD1R_WB_4S_fixed: case AArch64::LD1R_WB_4S_register:
1153 case AArch64::LD1R_WB_2D_fixed: case AArch64::LD1R_WB_2D_register: {
1155 case AArch64::LD1R_WB_16B_fixed: case AArch64::LD1R_WB_16B_register:
1156 TransferBytes = 1; break;
1157 case AArch64::LD1R_WB_8H_fixed: case AArch64::LD1R_WB_8H_register:
1158 TransferBytes = 2; break;
1159 case AArch64::LD1R_WB_4S_fixed: case AArch64::LD1R_WB_4S_register:
1160 TransferBytes = 4; break;
1161 case AArch64::LD1R_WB_2D_fixed: case AArch64::LD1R_WB_2D_register:
1162 TransferBytes = 8; break;
1169 case AArch64::LD2R_WB_8B_fixed: case AArch64::LD2R_WB_8B_register:
1170 case AArch64::LD2R_WB_4H_fixed: case AArch64::LD2R_WB_4H_register:
1171 case AArch64::LD2R_WB_2S_fixed: case AArch64::LD2R_WB_2S_register:
1172 case AArch64::LD2R_WB_1D_fixed: case AArch64::LD2R_WB_1D_register: {
1174 case AArch64::LD2R_WB_8B_fixed: case AArch64::LD2R_WB_8B_register:
1175 TransferBytes = 2; break;
1176 case AArch64::LD2R_WB_4H_fixed: case AArch64::LD2R_WB_4H_register:
1177 TransferBytes = 4; break;
1178 case AArch64::LD2R_WB_2S_fixed: case AArch64::LD2R_WB_2S_register:
1179 TransferBytes = 8; break;
1180 case AArch64::LD2R_WB_1D_fixed: case AArch64::LD2R_WB_1D_register:
1181 TransferBytes = 16; break;
1189 case AArch64::LD2R_WB_16B_fixed: case AArch64::LD2R_WB_16B_register:
1190 case AArch64::LD2R_WB_8H_fixed: case AArch64::LD2R_WB_8H_register:
1191 case AArch64::LD2R_WB_4S_fixed: case AArch64::LD2R_WB_4S_register:
1192 case AArch64::LD2R_WB_2D_fixed: case AArch64::LD2R_WB_2D_register: {
1194 case AArch64::LD2R_WB_16B_fixed: case AArch64::LD2R_WB_16B_register:
1195 TransferBytes = 2; break;
1196 case AArch64::LD2R_WB_8H_fixed: case AArch64::LD2R_WB_8H_register:
1197 TransferBytes = 4; break;
1198 case AArch64::LD2R_WB_4S_fixed: case AArch64::LD2R_WB_4S_register:
1199 TransferBytes = 8; break;
1200 case AArch64::LD2R_WB_2D_fixed: case AArch64::LD2R_WB_2D_register:
1201 TransferBytes = 16; break;
1208 case AArch64::LD3R_WB_8B_fixed: case AArch64::LD3R_WB_8B_register:
1209 case AArch64::LD3R_WB_4H_fixed: case AArch64::LD3R_WB_4H_register:
1210 case AArch64::LD3R_WB_2S_fixed: case AArch64::LD3R_WB_2S_register:
1211 case AArch64::LD3R_WB_1D_fixed: case AArch64::LD3R_WB_1D_register: {
1213 case AArch64::LD3R_WB_8B_fixed: case AArch64::LD3R_WB_8B_register:
1214 TransferBytes = 3; break;
1215 case AArch64::LD3R_WB_4H_fixed: case AArch64::LD3R_WB_4H_register:
1216 TransferBytes = 6; break;
1217 case AArch64::LD3R_WB_2S_fixed: case AArch64::LD3R_WB_2S_register:
1218 TransferBytes = 12; break;
1219 case AArch64::LD3R_WB_1D_fixed: case AArch64::LD3R_WB_1D_register:
1220 TransferBytes = 24; break;
1228 case AArch64::LD3R_WB_16B_fixed: case AArch64::LD3R_WB_16B_register:
1229 case AArch64::LD3R_WB_4S_fixed: case AArch64::LD3R_WB_8H_register:
1230 case AArch64::LD3R_WB_8H_fixed: case AArch64::LD3R_WB_4S_register:
1231 case AArch64::LD3R_WB_2D_fixed: case AArch64::LD3R_WB_2D_register: {
1233 case AArch64::LD3R_WB_16B_fixed: case AArch64::LD3R_WB_16B_register:
1234 TransferBytes = 3; break;
1235 case AArch64::LD3R_WB_8H_fixed: case AArch64::LD3R_WB_8H_register:
1236 TransferBytes = 6; break;
1237 case AArch64::LD3R_WB_4S_fixed: case AArch64::LD3R_WB_4S_register:
1238 TransferBytes = 12; break;
1239 case AArch64::LD3R_WB_2D_fixed: case AArch64::LD3R_WB_2D_register:
1240 TransferBytes = 24; break;
1247 case AArch64::LD4R_WB_8B_fixed: case AArch64::LD4R_WB_8B_register:
1248 case AArch64::LD4R_WB_4H_fixed: case AArch64::LD4R_WB_4H_register:
1249 case AArch64::LD4R_WB_2S_fixed: case AArch64::LD4R_WB_2S_register:
1250 case AArch64::LD4R_WB_1D_fixed: case AArch64::LD4R_WB_1D_register: {
1252 case AArch64::LD4R_WB_8B_fixed: case AArch64::LD4R_WB_8B_register:
1253 TransferBytes = 4; break;
1254 case AArch64::LD4R_WB_4H_fixed: case AArch64::LD4R_WB_4H_register:
1255 TransferBytes = 8; break;
1256 case AArch64::LD4R_WB_2S_fixed: case AArch64::LD4R_WB_2S_register:
1257 TransferBytes = 16; break;
1258 case AArch64::LD4R_WB_1D_fixed: case AArch64::LD4R_WB_1D_register:
1259 TransferBytes = 32; break;
1267 case AArch64::LD4R_WB_16B_fixed: case AArch64::LD4R_WB_16B_register:
1268 case AArch64::LD4R_WB_4S_fixed: case AArch64::LD4R_WB_8H_register:
1269 case AArch64::LD4R_WB_8H_fixed: case AArch64::LD4R_WB_4S_register:
1270 case AArch64::LD4R_WB_2D_fixed: case AArch64::LD4R_WB_2D_register: {
1272 case AArch64::LD4R_WB_16B_fixed: case AArch64::LD4R_WB_16B_register:
1273 TransferBytes = 4; break;
1274 case AArch64::LD4R_WB_8H_fixed: case AArch64::LD4R_WB_8H_register:
1275 TransferBytes = 8; break;
1276 case AArch64::LD4R_WB_4S_fixed: case AArch64::LD4R_WB_4S_register:
1277 TransferBytes = 16; break;
1278 case AArch64::LD4R_WB_2D_fixed: case AArch64::LD4R_WB_2D_register:
1279 TransferBytes = 32; break;
1286 case AArch64::LD1LN_WB_B_fixed: case AArch64::LD1LN_WB_B_register:
1287 case AArch64::LD1LN_WB_H_fixed: case AArch64::LD1LN_WB_H_register:
1288 case AArch64::LD1LN_WB_S_fixed: case AArch64::LD1LN_WB_S_register:
1289 case AArch64::LD1LN_WB_D_fixed: case AArch64::LD1LN_WB_D_register: {
1291 case AArch64::LD1LN_WB_B_fixed: case AArch64::LD1LN_WB_B_register:
1292 TransferBytes = 1; break;
1293 case AArch64::LD1LN_WB_H_fixed: case AArch64::LD1LN_WB_H_register:
1294 TransferBytes = 2; break;
1295 case AArch64::LD1LN_WB_S_fixed: case AArch64::LD1LN_WB_S_register:
1296 TransferBytes = 4; break;
1297 case AArch64::LD1LN_WB_D_fixed: case AArch64::LD1LN_WB_D_register:
1298 TransferBytes = 8; break;
1305 case AArch64::LD2LN_WB_B_fixed: case AArch64::LD2LN_WB_B_register:
1306 case AArch64::LD2LN_WB_H_fixed: case AArch64::LD2LN_WB_H_register:
1307 case AArch64::LD2LN_WB_S_fixed: case AArch64::LD2LN_WB_S_register:
1308 case AArch64::LD2LN_WB_D_fixed: case AArch64::LD2LN_WB_D_register: {
1310 case AArch64::LD2LN_WB_B_fixed: case AArch64::LD2LN_WB_B_register:
1311 TransferBytes = 2; break;
1312 case AArch64::LD2LN_WB_H_fixed: case AArch64::LD2LN_WB_H_register:
1313 TransferBytes = 4; break;
1314 case AArch64::LD2LN_WB_S_fixed: case AArch64::LD2LN_WB_S_register:
1315 TransferBytes = 8; break;
1316 case AArch64::LD2LN_WB_D_fixed: case AArch64::LD2LN_WB_D_register:
1317 TransferBytes = 16; break;
1324 case AArch64::LD3LN_WB_B_fixed: case AArch64::LD3LN_WB_B_register:
1325 case AArch64::LD3LN_WB_H_fixed: case AArch64::LD3LN_WB_H_register:
1326 case AArch64::LD3LN_WB_S_fixed: case AArch64::LD3LN_WB_S_register:
1327 case AArch64::LD3LN_WB_D_fixed: case AArch64::LD3LN_WB_D_register: {
1329 case AArch64::LD3LN_WB_B_fixed: case AArch64::LD3LN_WB_B_register:
1330 TransferBytes = 3; break;
1331 case AArch64::LD3LN_WB_H_fixed: case AArch64::LD3LN_WB_H_register:
1332 TransferBytes = 6; break;
1333 case AArch64::LD3LN_WB_S_fixed: case AArch64::LD3LN_WB_S_register:
1334 TransferBytes = 12; break;
1335 case AArch64::LD3LN_WB_D_fixed: case AArch64::LD3LN_WB_D_register:
1336 TransferBytes = 24; break;
1343 case AArch64::LD4LN_WB_B_fixed: case AArch64::LD4LN_WB_B_register:
1344 case AArch64::LD4LN_WB_H_fixed: case AArch64::LD4LN_WB_H_register:
1345 case AArch64::LD4LN_WB_S_fixed: case AArch64::LD4LN_WB_S_register:
1346 case AArch64::LD4LN_WB_D_fixed: case AArch64::LD4LN_WB_D_register: {
1348 case AArch64::LD4LN_WB_B_fixed: case AArch64::LD4LN_WB_B_register:
1349 TransferBytes = 4; break;
1350 case AArch64::LD4LN_WB_H_fixed: case AArch64::LD4LN_WB_H_register:
1351 TransferBytes = 8; break;
1352 case AArch64::LD4LN_WB_S_fixed: case AArch64::LD4LN_WB_S_register:
1353 TransferBytes = 16; break;
1354 case AArch64::LD4LN_WB_D_fixed: case AArch64::LD4LN_WB_D_register:
1355 TransferBytes = 32; break;
1362 case AArch64::ST1LN_WB_B_fixed: case AArch64::ST1LN_WB_B_register:
1363 case AArch64::ST1LN_WB_H_fixed: case AArch64::ST1LN_WB_H_register:
1364 case AArch64::ST1LN_WB_S_fixed: case AArch64::ST1LN_WB_S_register:
1365 case AArch64::ST1LN_WB_D_fixed: case AArch64::ST1LN_WB_D_register: {
1367 case AArch64::ST1LN_WB_B_fixed: case AArch64::ST1LN_WB_B_register:
1368 TransferBytes = 1; break;
1369 case AArch64::ST1LN_WB_H_fixed: case AArch64::ST1LN_WB_H_register:
1370 TransferBytes = 2; break;
1371 case AArch64::ST1LN_WB_S_fixed: case AArch64::ST1LN_WB_S_register:
1372 TransferBytes = 4; break;
1373 case AArch64::ST1LN_WB_D_fixed: case AArch64::ST1LN_WB_D_register:
1374 TransferBytes = 8; break;
1380 case AArch64::ST2LN_WB_B_fixed: case AArch64::ST2LN_WB_B_register:
1381 case AArch64::ST2LN_WB_H_fixed: case AArch64::ST2LN_WB_H_register:
1382 case AArch64::ST2LN_WB_S_fixed: case AArch64::ST2LN_WB_S_register:
1383 case AArch64::ST2LN_WB_D_fixed: case AArch64::ST2LN_WB_D_register: {
1385 case AArch64::ST2LN_WB_B_fixed: case AArch64::ST2LN_WB_B_register:
1386 TransferBytes = 2; break;
1387 case AArch64::ST2LN_WB_H_fixed: case AArch64::ST2LN_WB_H_register:
1388 TransferBytes = 4; break;
1389 case AArch64::ST2LN_WB_S_fixed: case AArch64::ST2LN_WB_S_register:
1390 TransferBytes = 8; break;
1391 case AArch64::ST2LN_WB_D_fixed: case AArch64::ST2LN_WB_D_register:
1392 TransferBytes = 16; break;
1398 case AArch64::ST3LN_WB_B_fixed: case AArch64::ST3LN_WB_B_register:
1399 case AArch64::ST3LN_WB_H_fixed: case AArch64::ST3LN_WB_H_register:
1400 case AArch64::ST3LN_WB_S_fixed: case AArch64::ST3LN_WB_S_register:
1401 case AArch64::ST3LN_WB_D_fixed: case AArch64::ST3LN_WB_D_register: {
1403 case AArch64::ST3LN_WB_B_fixed: case AArch64::ST3LN_WB_B_register:
1404 TransferBytes = 3; break;
1405 case AArch64::ST3LN_WB_H_fixed: case AArch64::ST3LN_WB_H_register:
1406 TransferBytes = 6; break;
1407 case AArch64::ST3LN_WB_S_fixed: case AArch64::ST3LN_WB_S_register:
1408 TransferBytes = 12; break;
1409 case AArch64::ST3LN_WB_D_fixed: case AArch64::ST3LN_WB_D_register:
1410 TransferBytes = 24; break;
1416 case AArch64::ST4LN_WB_B_fixed: case AArch64::ST4LN_WB_B_register:
1417 case AArch64::ST4LN_WB_H_fixed: case AArch64::ST4LN_WB_H_register:
1418 case AArch64::ST4LN_WB_S_fixed: case AArch64::ST4LN_WB_S_register:
1419 case AArch64::ST4LN_WB_D_fixed: case AArch64::ST4LN_WB_D_register: {
1421 case AArch64::ST4LN_WB_B_fixed: case AArch64::ST4LN_WB_B_register:
1422 TransferBytes = 4; break;
1423 case AArch64::ST4LN_WB_H_fixed: case AArch64::ST4LN_WB_H_register:
1424 TransferBytes = 8; break;
1425 case AArch64::ST4LN_WB_S_fixed: case AArch64::ST4LN_WB_S_register:
1426 TransferBytes = 16; break;
1427 case AArch64::ST4LN_WB_D_fixed: case AArch64::ST4LN_WB_D_register:
1428 TransferBytes = 32; break;
1435 return MCDisassembler::Fail;
1436 } // End of switch (Opc)
1438 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
1439 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
1440 unsigned Rm = fieldFromInstruction(Insn, 16, 5);
1442 // Decode post-index of load duplicate lane
1446 Is64bitVec ? DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder)
1447 : DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
1450 Is64bitVec ? DecodeDPairRegisterClass(Inst, Rt, Address, Decoder)
1451 : DecodeQPairRegisterClass(Inst, Rt, Address, Decoder);
1454 Is64bitVec ? DecodeDTripleRegisterClass(Inst, Rt, Address, Decoder)
1455 : DecodeQTripleRegisterClass(Inst, Rt, Address, Decoder);
1458 Is64bitVec ? DecodeDQuadRegisterClass(Inst, Rt, Address, Decoder)
1459 : DecodeQQuadRegisterClass(Inst, Rt, Address, Decoder);
1462 // Decode write back register, which is equal to Rn.
1463 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
1464 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
1466 if (Rm == 31) // If Rm is 0x11111, add the number of transferred bytes
1467 Inst.addOperand(MCOperand::CreateImm(TransferBytes));
1469 DecodeGPR64noxzrRegisterClass(Inst, Rm, Address, Decoder);
1471 return MCDisassembler::Success;
1474 // Decode post-index of load/store lane
1475 // Loads have a vector list as output.
1479 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
1482 DecodeQPairRegisterClass(Inst, Rt, Address, Decoder);
1485 DecodeQTripleRegisterClass(Inst, Rt, Address, Decoder);
1488 DecodeQQuadRegisterClass(Inst, Rt, Address, Decoder);
1492 // Decode write back register, which is equal to Rn.
1493 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
1494 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
1496 if (Rm == 31) // If Rm is 0x11111, add the number of transferred bytes
1497 Inst.addOperand(MCOperand::CreateImm(TransferBytes));
1499 DecodeGPR64noxzrRegisterClass(Inst, Rm, Address, Decoder);
1501 // Decode the source vector list.
1504 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
1507 DecodeQPairRegisterClass(Inst, Rt, Address, Decoder);
1510 DecodeQTripleRegisterClass(Inst, Rt, Address, Decoder);
1513 DecodeQQuadRegisterClass(Inst, Rt, Address, Decoder);
1517 unsigned Q = fieldFromInstruction(Insn, 30, 1);
1518 unsigned S = fieldFromInstruction(Insn, 10, 3);
1520 // Calculate the number of lanes by number of vectors and transfered bytes.
1521 // NumLanes = 16 bytes / bytes of each lane
1522 unsigned NumLanes = 16 / (TransferBytes / NumVecs);
1524 case 16: // A vector has 16 lanes, each lane is 1 bytes.
1525 lane = (Q << 3) | S;
1528 lane = (Q << 2) | (S >> 1);
1531 lane = (Q << 1) | (S >> 2);
1537 Inst.addOperand(MCOperand::CreateImm(lane));
1539 return MCDisassembler::Success;
1542 static DecodeStatus DecodeSHLLInstruction(MCInst &Inst, unsigned Insn,
1544 const void *Decoder) {
1545 unsigned Rd = fieldFromInstruction(Insn, 0, 5);
1546 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
1547 unsigned size = fieldFromInstruction(Insn, 22, 2);
1548 unsigned Q = fieldFromInstruction(Insn, 30, 1);
1550 DecodeFPR128RegisterClass(Inst, Rd, Address, Decoder);
1553 DecodeFPR128RegisterClass(Inst, Rn, Address, Decoder);
1555 DecodeFPR64RegisterClass(Inst, Rn, Address, Decoder);
1559 Inst.addOperand(MCOperand::CreateImm(8));
1562 Inst.addOperand(MCOperand::CreateImm(16));
1565 Inst.addOperand(MCOperand::CreateImm(32));
1568 return MCDisassembler::Fail;
1570 return MCDisassembler::Success;