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 bool Check(DecodeStatus &Out, DecodeStatus In);
239 #include "AArch64GenDisassemblerTables.inc"
240 #include "AArch64GenInstrInfo.inc"
242 static bool Check(DecodeStatus &Out, DecodeStatus In) {
244 case MCDisassembler::Success:
245 // Out stays the same.
247 case MCDisassembler::SoftFail:
250 case MCDisassembler::Fail:
254 llvm_unreachable("Invalid DecodeStatus!");
257 DecodeStatus AArch64Disassembler::getInstruction(MCInst &MI, uint64_t &Size,
258 const MemoryObject &Region,
261 raw_ostream &cs) const {
266 // We want to read exactly 4 bytes of data.
267 if (Region.readBytes(Address, 4, bytes) == -1) {
269 return MCDisassembler::Fail;
272 // Encoded as a small-endian 32-bit word in the stream.
273 uint32_t insn = (bytes[3] << 24) |
278 // Calling the auto-generated decoder function.
279 DecodeStatus result = decodeInstruction(DecoderTableA6432, MI, insn, Address,
281 if (result != MCDisassembler::Fail) {
288 return MCDisassembler::Fail;
291 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
292 const AArch64Disassembler *Dis = static_cast<const AArch64Disassembler*>(D);
293 return Dis->getRegInfo()->getRegClass(RC).getRegister(RegNo);
296 static DecodeStatus DecodeGPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
297 uint64_t Address, const void *Decoder) {
299 return MCDisassembler::Fail;
301 uint16_t Register = getReg(Decoder, AArch64::GPR64RegClassID, RegNo);
302 Inst.addOperand(MCOperand::CreateReg(Register));
303 return MCDisassembler::Success;
307 DecodeGPR64xspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
308 uint64_t Address, const void *Decoder) {
310 return MCDisassembler::Fail;
312 uint16_t Register = getReg(Decoder, AArch64::GPR64xspRegClassID, RegNo);
313 Inst.addOperand(MCOperand::CreateReg(Register));
314 return MCDisassembler::Success;
317 static DecodeStatus DecodeGPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
319 const void *Decoder) {
321 return MCDisassembler::Fail;
323 uint16_t Register = getReg(Decoder, AArch64::GPR32RegClassID, RegNo);
324 Inst.addOperand(MCOperand::CreateReg(Register));
325 return MCDisassembler::Success;
329 DecodeGPR32wspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
330 uint64_t Address, const void *Decoder) {
332 return MCDisassembler::Fail;
334 uint16_t Register = getReg(Decoder, AArch64::GPR32wspRegClassID, RegNo);
335 Inst.addOperand(MCOperand::CreateReg(Register));
336 return MCDisassembler::Success;
340 DecodeFPR8RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
341 uint64_t Address, const void *Decoder) {
343 return MCDisassembler::Fail;
345 uint16_t Register = getReg(Decoder, AArch64::FPR8RegClassID, RegNo);
346 Inst.addOperand(MCOperand::CreateReg(Register));
347 return MCDisassembler::Success;
351 DecodeFPR16RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
352 uint64_t Address, const void *Decoder) {
354 return MCDisassembler::Fail;
356 uint16_t Register = getReg(Decoder, AArch64::FPR16RegClassID, RegNo);
357 Inst.addOperand(MCOperand::CreateReg(Register));
358 return MCDisassembler::Success;
363 DecodeFPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
364 uint64_t Address, const void *Decoder) {
366 return MCDisassembler::Fail;
368 uint16_t Register = getReg(Decoder, AArch64::FPR32RegClassID, RegNo);
369 Inst.addOperand(MCOperand::CreateReg(Register));
370 return MCDisassembler::Success;
374 DecodeFPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
375 uint64_t Address, const void *Decoder) {
377 return MCDisassembler::Fail;
379 uint16_t Register = getReg(Decoder, AArch64::FPR64RegClassID, RegNo);
380 Inst.addOperand(MCOperand::CreateReg(Register));
381 return MCDisassembler::Success;
385 DecodeFPR64LoRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
386 uint64_t Address, const void *Decoder) {
388 return MCDisassembler::Fail;
390 return DecodeFPR64RegisterClass(Inst, RegNo, Address, Decoder);
394 DecodeFPR128RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
395 uint64_t Address, const void *Decoder) {
397 return MCDisassembler::Fail;
399 uint16_t Register = getReg(Decoder, AArch64::FPR128RegClassID, RegNo);
400 Inst.addOperand(MCOperand::CreateReg(Register));
401 return MCDisassembler::Success;
405 DecodeFPR128LoRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
406 uint64_t Address, const void *Decoder) {
408 return MCDisassembler::Fail;
410 return DecodeFPR128RegisterClass(Inst, RegNo, Address, Decoder);
413 static DecodeStatus DecodeGPR64noxzrRegisterClass(llvm::MCInst &Inst,
416 const void *Decoder) {
418 return MCDisassembler::Fail;
420 uint16_t Register = getReg(Decoder, AArch64::GPR64noxzrRegClassID, RegNo);
421 Inst.addOperand(MCOperand::CreateReg(Register));
422 return MCDisassembler::Success;
425 static DecodeStatus DecodeRegisterClassByID(llvm::MCInst &Inst, unsigned RegNo,
427 const void *Decoder) {
429 return MCDisassembler::Fail;
431 uint16_t Register = getReg(Decoder, RegID, RegNo);
432 Inst.addOperand(MCOperand::CreateReg(Register));
433 return MCDisassembler::Success;
436 static DecodeStatus DecodeDPairRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
438 const void *Decoder) {
439 return DecodeRegisterClassByID(Inst, RegNo, AArch64::DPairRegClassID,
443 static DecodeStatus DecodeQPairRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
445 const void *Decoder) {
446 return DecodeRegisterClassByID(Inst, RegNo, AArch64::QPairRegClassID,
450 static DecodeStatus DecodeDTripleRegisterClass(llvm::MCInst &Inst,
451 unsigned RegNo, uint64_t Address,
452 const void *Decoder) {
453 return DecodeRegisterClassByID(Inst, RegNo, AArch64::DTripleRegClassID,
457 static DecodeStatus DecodeQTripleRegisterClass(llvm::MCInst &Inst,
458 unsigned RegNo, uint64_t Address,
459 const void *Decoder) {
460 return DecodeRegisterClassByID(Inst, RegNo, AArch64::QTripleRegClassID,
464 static DecodeStatus DecodeDQuadRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
466 const void *Decoder) {
467 return DecodeRegisterClassByID(Inst, RegNo, AArch64::DQuadRegClassID,
471 static DecodeStatus DecodeQQuadRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
473 const void *Decoder) {
474 return DecodeRegisterClassByID(Inst, RegNo, AArch64::QQuadRegClassID,
478 static DecodeStatus DecodeAddrRegExtendOperand(llvm::MCInst &Inst,
481 const void *Decoder) {
482 // Option{1} must be 1. OptionHiS is made up of {Option{2}, Option{1},
483 // S}. Hence we want to check bit 1.
484 if (!(OptionHiS & 2))
485 return MCDisassembler::Fail;
487 Inst.addOperand(MCOperand::CreateImm(OptionHiS));
488 return MCDisassembler::Success;
491 static DecodeStatus DecodeBitfield32ImmOperand(llvm::MCInst &Inst,
494 const void *Decoder) {
495 // In the 32-bit variant, bit 6 must be zero. I.e. the immediate must be
498 return MCDisassembler::Fail;
500 Inst.addOperand(MCOperand::CreateImm(Imm6Bits));
501 return MCDisassembler::Success;
504 static DecodeStatus DecodeCVT32FixedPosOperand(llvm::MCInst &Inst,
507 const void *Decoder) {
508 // 1 <= Imm <= 32. Encoded as 64 - Imm so: 63 >= Encoded >= 32.
510 return MCDisassembler::Fail;
512 Inst.addOperand(MCOperand::CreateImm(Imm6Bits));
513 return MCDisassembler::Success;
516 static DecodeStatus DecodeFPZeroOperand(llvm::MCInst &Inst,
519 const void *Decoder) {
520 // Any bits are valid in the instruction (they're architecturally ignored),
521 // but a code generator should insert 0.
522 Inst.addOperand(MCOperand::CreateImm(0));
523 return MCDisassembler::Success;
526 static DecodeStatus DecodeShiftRightImm8(MCInst &Inst, unsigned Val,
528 const void *Decoder) {
529 Inst.addOperand(MCOperand::CreateImm(8 - Val));
530 return MCDisassembler::Success;
533 static DecodeStatus DecodeShiftRightImm16(MCInst &Inst, unsigned Val,
535 const void *Decoder) {
536 Inst.addOperand(MCOperand::CreateImm(16 - Val));
537 return MCDisassembler::Success;
540 static DecodeStatus DecodeShiftRightImm32(MCInst &Inst, unsigned Val,
542 const void *Decoder) {
543 Inst.addOperand(MCOperand::CreateImm(32 - Val));
544 return MCDisassembler::Success;
547 static DecodeStatus DecodeShiftRightImm64(MCInst &Inst, unsigned Val,
549 const void *Decoder) {
550 Inst.addOperand(MCOperand::CreateImm(64 - Val));
551 return MCDisassembler::Success;
554 static DecodeStatus DecodeShiftLeftImm8(MCInst &Inst, unsigned Val,
556 const void *Decoder) {
558 return MCDisassembler::Fail;
560 Inst.addOperand(MCOperand::CreateImm(Val));
561 return MCDisassembler::Success;
564 static DecodeStatus DecodeShiftLeftImm16(MCInst &Inst, unsigned Val,
566 const void *Decoder) {
568 return MCDisassembler::Fail;
570 Inst.addOperand(MCOperand::CreateImm(Val));
571 return MCDisassembler::Success;
574 static DecodeStatus DecodeShiftLeftImm32(MCInst &Inst, unsigned Val,
576 const void *Decoder) {
578 return MCDisassembler::Fail;
580 Inst.addOperand(MCOperand::CreateImm(Val));
581 return MCDisassembler::Success;
584 static DecodeStatus DecodeShiftLeftImm64(MCInst &Inst, unsigned Val,
586 const void *Decoder) {
588 return MCDisassembler::Fail;
590 Inst.addOperand(MCOperand::CreateImm(Val));
591 return MCDisassembler::Success;
594 template<int RegWidth>
595 static DecodeStatus DecodeMoveWideImmOperand(llvm::MCInst &Inst,
598 const void *Decoder) {
599 unsigned Imm16 = FullImm & 0xffff;
600 unsigned Shift = FullImm >> 16;
602 if (RegWidth == 32 && Shift > 1) return MCDisassembler::Fail;
604 Inst.addOperand(MCOperand::CreateImm(Imm16));
605 Inst.addOperand(MCOperand::CreateImm(Shift));
606 return MCDisassembler::Success;
609 template<int RegWidth>
610 static DecodeStatus DecodeLogicalImmOperand(llvm::MCInst &Inst,
613 const void *Decoder) {
615 if (!A64Imms::isLogicalImmBits(RegWidth, Bits, Imm))
616 return MCDisassembler::Fail;
618 Inst.addOperand(MCOperand::CreateImm(Bits));
619 return MCDisassembler::Success;
623 static DecodeStatus DecodeRegExtendOperand(llvm::MCInst &Inst,
624 unsigned ShiftAmount,
626 const void *Decoder) {
627 // Only values 0-4 are valid for this 3-bit field
629 return MCDisassembler::Fail;
631 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
632 return MCDisassembler::Success;
635 static DecodeStatus Decode32BitShiftOperand(llvm::MCInst &Inst,
636 unsigned ShiftAmount,
638 const void *Decoder) {
639 // Only values below 32 are valid for a 32-bit register
640 if (ShiftAmount > 31)
641 return MCDisassembler::Fail;
643 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
644 return MCDisassembler::Success;
647 static DecodeStatus DecodeBitfieldInstruction(llvm::MCInst &Inst, unsigned Insn,
649 const void *Decoder) {
650 unsigned Rd = fieldFromInstruction(Insn, 0, 5);
651 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
652 unsigned ImmS = fieldFromInstruction(Insn, 10, 6);
653 unsigned ImmR = fieldFromInstruction(Insn, 16, 6);
654 unsigned SF = fieldFromInstruction(Insn, 31, 1);
656 // Undef for 0b11 just in case it occurs. Don't want the compiler to optimise
657 // out assertions that it thinks should never be hit.
658 enum OpcTypes { SBFM = 0, BFM, UBFM, Undef } Opc;
659 Opc = (OpcTypes)fieldFromInstruction(Insn, 29, 2);
662 // ImmR and ImmS must be between 0 and 31 for 32-bit instructions.
663 if (ImmR > 31 || ImmS > 31)
664 return MCDisassembler::Fail;
668 DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
669 // BFM MCInsts use Rd as a source too.
670 if (Opc == BFM) DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
671 DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
673 DecodeGPR32RegisterClass(Inst, Rd, Address, Decoder);
674 // BFM MCInsts use Rd as a source too.
675 if (Opc == BFM) DecodeGPR32RegisterClass(Inst, Rd, Address, Decoder);
676 DecodeGPR32RegisterClass(Inst, Rn, Address, Decoder);
679 // ASR and LSR have more specific patterns so they won't get here:
680 assert(!(ImmS == 31 && !SF && Opc != BFM)
681 && "shift should have used auto decode");
682 assert(!(ImmS == 63 && SF && Opc != BFM)
683 && "shift should have used auto decode");
685 // Extension instructions similarly:
686 if (Opc == SBFM && ImmR == 0) {
687 assert((ImmS != 7 && ImmS != 15) && "extension got here");
688 assert((ImmS != 31 || SF == 0) && "extension got here");
689 } else if (Opc == UBFM && ImmR == 0) {
690 assert((SF != 0 || (ImmS != 7 && ImmS != 15)) && "extension got here");
694 // It might be a LSL instruction, which actually takes the shift amount
695 // itself as an MCInst operand.
696 if (SF && (ImmS + 1) % 64 == ImmR) {
697 Inst.setOpcode(AArch64::LSLxxi);
698 Inst.addOperand(MCOperand::CreateImm(63 - ImmS));
699 return MCDisassembler::Success;
700 } else if (!SF && (ImmS + 1) % 32 == ImmR) {
701 Inst.setOpcode(AArch64::LSLwwi);
702 Inst.addOperand(MCOperand::CreateImm(31 - ImmS));
703 return MCDisassembler::Success;
707 // Otherwise it's definitely either an extract or an insert depending on which
708 // of ImmR or ImmS is larger.
709 unsigned ExtractOp, InsertOp;
711 default: llvm_unreachable("unexpected instruction trying to decode bitfield");
713 ExtractOp = SF ? AArch64::SBFXxxii : AArch64::SBFXwwii;
714 InsertOp = SF ? AArch64::SBFIZxxii : AArch64::SBFIZwwii;
717 ExtractOp = SF ? AArch64::BFXILxxii : AArch64::BFXILwwii;
718 InsertOp = SF ? AArch64::BFIxxii : AArch64::BFIwwii;
721 ExtractOp = SF ? AArch64::UBFXxxii : AArch64::UBFXwwii;
722 InsertOp = SF ? AArch64::UBFIZxxii : AArch64::UBFIZwwii;
726 // Otherwise it's a boring insert or extract
727 Inst.addOperand(MCOperand::CreateImm(ImmR));
728 Inst.addOperand(MCOperand::CreateImm(ImmS));
732 Inst.setOpcode(InsertOp);
734 Inst.setOpcode(ExtractOp);
736 return MCDisassembler::Success;
739 static DecodeStatus DecodeFMOVLaneInstruction(llvm::MCInst &Inst, unsigned Insn,
741 const void *Decoder) {
742 // This decoder exists to add the dummy Lane operand to the MCInst, which must
743 // be 1 in assembly but has no other real manifestation.
744 unsigned Rd = fieldFromInstruction(Insn, 0, 5);
745 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
746 unsigned IsToVec = fieldFromInstruction(Insn, 16, 1);
749 DecodeFPR128RegisterClass(Inst, Rd, Address, Decoder);
750 DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
752 DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
753 DecodeFPR128RegisterClass(Inst, Rn, Address, Decoder);
757 Inst.addOperand(MCOperand::CreateImm(1));
759 return MCDisassembler::Success;
763 static DecodeStatus DecodeLDSTPairInstruction(llvm::MCInst &Inst,
766 const void *Decoder) {
767 DecodeStatus Result = MCDisassembler::Success;
768 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
769 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
770 unsigned Rt2 = fieldFromInstruction(Insn, 10, 5);
771 unsigned SImm7 = fieldFromInstruction(Insn, 15, 7);
772 unsigned L = fieldFromInstruction(Insn, 22, 1);
773 unsigned V = fieldFromInstruction(Insn, 26, 1);
774 unsigned Opc = fieldFromInstruction(Insn, 30, 2);
776 // Not an official name, but it turns out that bit 23 distinguishes indexed
777 // from non-indexed operations.
778 unsigned Indexed = fieldFromInstruction(Insn, 23, 1);
780 if (Indexed && L == 0) {
781 // The MCInst for an indexed store has an out operand and 4 ins:
782 // Rn_wb, Rt, Rt2, Rn, Imm
783 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
786 // You shouldn't load to the same register twice in an instruction...
788 Result = MCDisassembler::SoftFail;
790 // ... or do any operation that writes-back to a transfer register. But note
791 // that "stp xzr, xzr, [sp], #4" is fine because xzr and sp are different.
792 if (Indexed && V == 0 && Rn != 31 && (Rt == Rn || Rt2 == Rn))
793 Result = MCDisassembler::SoftFail;
795 // Exactly how we decode the MCInst's registers depends on the Opc and V
796 // fields of the instruction. These also obviously determine the size of the
797 // operation so we can fill in that information while we're at it.
799 // The instruction operates on the FP/SIMD registers
801 default: return MCDisassembler::Fail;
803 DecodeFPR32RegisterClass(Inst, Rt, Address, Decoder);
804 DecodeFPR32RegisterClass(Inst, Rt2, Address, Decoder);
807 DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
808 DecodeFPR64RegisterClass(Inst, Rt2, Address, Decoder);
811 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
812 DecodeFPR128RegisterClass(Inst, Rt2, Address, Decoder);
817 default: return MCDisassembler::Fail;
819 DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder);
820 DecodeGPR32RegisterClass(Inst, Rt2, Address, Decoder);
823 assert(L && "unexpected \"store signed\" attempt");
824 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
825 DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder);
828 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
829 DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder);
834 if (Indexed && L == 1) {
835 // The MCInst for an indexed load has 3 out operands and an 3 ins:
836 // Rt, Rt2, Rn_wb, Rt2, Rn, Imm
837 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
841 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
842 Inst.addOperand(MCOperand::CreateImm(SImm7));
847 static DecodeStatus DecodeLoadPairExclusiveInstruction(llvm::MCInst &Inst,
850 const void *Decoder) {
851 unsigned Rt = fieldFromInstruction(Val, 0, 5);
852 unsigned Rn = fieldFromInstruction(Val, 5, 5);
853 unsigned Rt2 = fieldFromInstruction(Val, 10, 5);
854 unsigned MemSize = fieldFromInstruction(Val, 30, 2);
856 DecodeStatus S = MCDisassembler::Success;
857 if (Rt == Rt2) S = MCDisassembler::SoftFail;
861 if (!Check(S, DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder)))
862 return MCDisassembler::Fail;
863 if (!Check(S, DecodeGPR32RegisterClass(Inst, Rt2, Address, Decoder)))
864 return MCDisassembler::Fail;
867 if (!Check(S, DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder)))
868 return MCDisassembler::Fail;
869 if (!Check(S, DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder)))
870 return MCDisassembler::Fail;
873 llvm_unreachable("Invalid MemSize in DecodeLoadPairExclusiveInstruction");
876 if (!Check(S, DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder)))
877 return MCDisassembler::Fail;
882 template<typename SomeNamedImmMapper>
883 static DecodeStatus DecodeNamedImmOperand(llvm::MCInst &Inst,
886 const void *Decoder) {
887 SomeNamedImmMapper Mapper;
889 Mapper.toString(Val, ValidNamed);
890 if (ValidNamed || Mapper.validImm(Val)) {
891 Inst.addOperand(MCOperand::CreateImm(Val));
892 return MCDisassembler::Success;
895 return MCDisassembler::Fail;
898 static DecodeStatus DecodeSysRegOperand(const A64SysReg::SysRegMapper &Mapper,
902 const void *Decoder) {
904 Mapper.toString(Val, ValidNamed);
906 Inst.addOperand(MCOperand::CreateImm(Val));
908 return ValidNamed ? MCDisassembler::Success : MCDisassembler::Fail;
911 static DecodeStatus DecodeMRSOperand(llvm::MCInst &Inst,
914 const void *Decoder) {
915 return DecodeSysRegOperand(A64SysReg::MRSMapper(), Inst, Val, Address,
919 static DecodeStatus DecodeMSROperand(llvm::MCInst &Inst,
922 const void *Decoder) {
923 return DecodeSysRegOperand(A64SysReg::MSRMapper(), Inst, Val, Address,
927 static DecodeStatus DecodeSingleIndexedInstruction(llvm::MCInst &Inst,
930 const void *Decoder) {
931 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
932 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
933 unsigned Imm9 = fieldFromInstruction(Insn, 12, 9);
935 unsigned Opc = fieldFromInstruction(Insn, 22, 2);
936 unsigned V = fieldFromInstruction(Insn, 26, 1);
937 unsigned Size = fieldFromInstruction(Insn, 30, 2);
939 if (Opc == 0 || (V == 1 && Opc == 2)) {
940 // It's a store, the MCInst gets: Rn_wb, Rt, Rn, Imm
941 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
944 if (V == 0 && (Opc == 2 || Size == 3)) {
945 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
947 DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder);
948 } else if (V == 1 && (Opc & 2)) {
949 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
953 DecodeFPR8RegisterClass(Inst, Rt, Address, Decoder);
956 DecodeFPR16RegisterClass(Inst, Rt, Address, Decoder);
959 DecodeFPR32RegisterClass(Inst, Rt, Address, Decoder);
962 DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
967 if (Opc != 0 && (V != 1 || Opc != 2)) {
968 // It's a load, the MCInst gets: Rt, Rn_wb, Rn, Imm
969 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
972 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
974 Inst.addOperand(MCOperand::CreateImm(Imm9));
976 // N.b. The official documentation says undpredictable if Rt == Rn, but this
977 // takes place at the architectural rather than encoding level:
979 // "STR xzr, [sp], #4" is perfectly valid.
980 if (V == 0 && Rt == Rn && Rn != 31)
981 return MCDisassembler::SoftFail;
983 return MCDisassembler::Success;
986 static MCDisassembler *createAArch64Disassembler(const Target &T,
987 const MCSubtargetInfo &STI) {
988 return new AArch64Disassembler(STI, T.createMCRegInfo(""));
991 extern "C" void LLVMInitializeAArch64Disassembler() {
992 TargetRegistry::RegisterMCDisassembler(TheAArch64Target,
993 createAArch64Disassembler);
996 template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf>
998 DecodeNeonMovImmShiftOperand(llvm::MCInst &Inst, unsigned ShiftAmount,
999 uint64_t Address, const void *Decoder) {
1001 if (Ext == A64SE::LSL)
1003 else if (Ext != A64SE::MSL)
1004 return MCDisassembler::Fail;
1006 // MSL and LSLH accepts encoded shift amount 0 or 1.
1007 if ((!IsLSL || (IsLSL && IsHalf)) && ShiftAmount != 0 && ShiftAmount != 1)
1008 return MCDisassembler::Fail;
1010 // LSL accepts encoded shift amount 0, 1, 2 or 3.
1011 if (IsLSL && ShiftAmount > 3)
1012 return MCDisassembler::Fail;
1014 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
1015 return MCDisassembler::Success;
1018 // Decode post-index vector load/store instructions.
1019 // This is necessary as we need to decode Rm: if Rm == 0b11111, the last
1020 // operand is an immediate equal the the length of vector list in bytes,
1021 // or Rm is decoded to a GPR64noxzr register.
1022 static DecodeStatus DecodeVLDSTPostInstruction(MCInst &Inst, unsigned Insn,
1024 const void *Decoder) {
1025 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
1026 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
1027 unsigned Rm = fieldFromInstruction(Insn, 16, 5);
1028 unsigned Opcode = fieldFromInstruction(Insn, 12, 4);
1029 unsigned IsLoad = fieldFromInstruction(Insn, 22, 1);
1030 // 0 for 64bit vector list, 1 for 128bit vector list
1031 unsigned Is128BitVec = fieldFromInstruction(Insn, 30, 1);
1036 case 2: // ld1/st1 with 4 vectors
1039 case 6: // ld1/st1 with 3 vectors
1041 case 7: // ld1/st1 with 1 vector
1044 case 10: // ld1/st1 with 2 vectors
1047 llvm_unreachable("Invalid opcode for post-index load/store instructions");
1050 // Decode vector list of 1/2/3/4 vectors for load instructions.
1054 Is128BitVec ? DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder)
1055 : DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
1058 Is128BitVec ? DecodeQPairRegisterClass(Inst, Rt, Address, Decoder)
1059 : DecodeDPairRegisterClass(Inst, Rt, Address, Decoder);
1062 Is128BitVec ? DecodeQTripleRegisterClass(Inst, Rt, Address, Decoder)
1063 : DecodeDTripleRegisterClass(Inst, Rt, Address, Decoder);
1066 Is128BitVec ? DecodeQQuadRegisterClass(Inst, Rt, Address, Decoder)
1067 : DecodeDQuadRegisterClass(Inst, Rt, Address, Decoder);
1072 // Decode write back register, which is equal to Rn.
1073 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
1074 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
1076 if (Rm == 31) // If Rm is 0x11111, add the vector list length in byte
1077 Inst.addOperand(MCOperand::CreateImm(NumVecs * (Is128BitVec ? 16 : 8)));
1079 DecodeGPR64noxzrRegisterClass(Inst, Rm, Address, Decoder);
1081 // Decode vector list of 1/2/3/4 vectors for load instructions.
1085 Is128BitVec ? DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder)
1086 : DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
1089 Is128BitVec ? DecodeQPairRegisterClass(Inst, Rt, Address, Decoder)
1090 : DecodeDPairRegisterClass(Inst, Rt, Address, Decoder);
1093 Is128BitVec ? DecodeQTripleRegisterClass(Inst, Rt, Address, Decoder)
1094 : DecodeDTripleRegisterClass(Inst, Rt, Address, Decoder);
1097 Is128BitVec ? DecodeQQuadRegisterClass(Inst, Rt, Address, Decoder)
1098 : DecodeDQuadRegisterClass(Inst, Rt, Address, Decoder);
1103 return MCDisassembler::Success;