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 DecodeFPR128RegisterClass(llvm::MCInst &Inst,
86 unsigned RegNo, uint64_t Address,
88 static DecodeStatus DecodeFPR128LoRegisterClass(llvm::MCInst &Inst,
89 unsigned RegNo, uint64_t Address,
92 static DecodeStatus DecodeAddrRegExtendOperand(llvm::MCInst &Inst,
98 static DecodeStatus DecodeBitfield32ImmOperand(llvm::MCInst &Inst,
101 const void *Decoder);
103 static DecodeStatus DecodeCVT32FixedPosOperand(llvm::MCInst &Inst,
106 const void *Decoder);
108 static DecodeStatus DecodeFPZeroOperand(llvm::MCInst &Inst,
111 const void *Decoder);
113 static DecodeStatus DecodeShiftRightImm8(MCInst &Inst, unsigned Val,
114 uint64_t Address, const void *Decoder);
115 static DecodeStatus DecodeShiftRightImm16(MCInst &Inst, unsigned Val,
117 const void *Decoder);
118 static DecodeStatus DecodeShiftRightImm32(MCInst &Inst, unsigned Val,
120 const void *Decoder);
121 static DecodeStatus DecodeShiftRightImm64(MCInst &Inst, unsigned Val,
123 const void *Decoder);
125 template<int RegWidth>
126 static DecodeStatus DecodeMoveWideImmOperand(llvm::MCInst &Inst,
129 const void *Decoder);
131 template<int RegWidth>
132 static DecodeStatus DecodeLogicalImmOperand(llvm::MCInst &Inst,
135 const void *Decoder);
137 static DecodeStatus DecodeRegExtendOperand(llvm::MCInst &Inst,
138 unsigned ShiftAmount,
140 const void *Decoder);
141 template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf>
143 DecodeNeonMovImmShiftOperand(llvm::MCInst &Inst, unsigned ShiftAmount,
144 uint64_t Address, const void *Decoder);
146 static DecodeStatus Decode32BitShiftOperand(llvm::MCInst &Inst,
147 unsigned ShiftAmount,
149 const void *Decoder);
150 static DecodeStatus DecodeBitfieldInstruction(llvm::MCInst &Inst, unsigned Insn,
152 const void *Decoder);
154 static DecodeStatus DecodeFMOVLaneInstruction(llvm::MCInst &Inst, unsigned Insn,
156 const void *Decoder);
158 static DecodeStatus DecodeLDSTPairInstruction(llvm::MCInst &Inst,
161 const void *Decoder);
163 static DecodeStatus DecodeLoadPairExclusiveInstruction(llvm::MCInst &Inst,
166 const void *Decoder);
168 template<typename SomeNamedImmMapper>
169 static DecodeStatus DecodeNamedImmOperand(llvm::MCInst &Inst,
172 const void *Decoder);
175 DecodeSysRegOperand(const A64SysReg::SysRegMapper &InstMapper,
176 llvm::MCInst &Inst, unsigned Val,
177 uint64_t Address, const void *Decoder);
179 static DecodeStatus DecodeMRSOperand(llvm::MCInst &Inst,
182 const void *Decoder);
184 static DecodeStatus DecodeMSROperand(llvm::MCInst &Inst,
187 const void *Decoder);
190 static DecodeStatus DecodeSingleIndexedInstruction(llvm::MCInst &Inst,
193 const void *Decoder);
196 static bool Check(DecodeStatus &Out, DecodeStatus In);
198 #include "AArch64GenDisassemblerTables.inc"
199 #include "AArch64GenInstrInfo.inc"
201 static bool Check(DecodeStatus &Out, DecodeStatus In) {
203 case MCDisassembler::Success:
204 // Out stays the same.
206 case MCDisassembler::SoftFail:
209 case MCDisassembler::Fail:
213 llvm_unreachable("Invalid DecodeStatus!");
216 DecodeStatus AArch64Disassembler::getInstruction(MCInst &MI, uint64_t &Size,
217 const MemoryObject &Region,
220 raw_ostream &cs) const {
225 // We want to read exactly 4 bytes of data.
226 if (Region.readBytes(Address, 4, bytes) == -1) {
228 return MCDisassembler::Fail;
231 // Encoded as a small-endian 32-bit word in the stream.
232 uint32_t insn = (bytes[3] << 24) |
237 // Calling the auto-generated decoder function.
238 DecodeStatus result = decodeInstruction(DecoderTableA6432, MI, insn, Address,
240 if (result != MCDisassembler::Fail) {
247 return MCDisassembler::Fail;
250 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
251 const AArch64Disassembler *Dis = static_cast<const AArch64Disassembler*>(D);
252 return Dis->getRegInfo()->getRegClass(RC).getRegister(RegNo);
255 static DecodeStatus DecodeGPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
256 uint64_t Address, const void *Decoder) {
258 return MCDisassembler::Fail;
260 uint16_t Register = getReg(Decoder, AArch64::GPR64RegClassID, RegNo);
261 Inst.addOperand(MCOperand::CreateReg(Register));
262 return MCDisassembler::Success;
266 DecodeGPR64xspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
267 uint64_t Address, const void *Decoder) {
269 return MCDisassembler::Fail;
271 uint16_t Register = getReg(Decoder, AArch64::GPR64xspRegClassID, RegNo);
272 Inst.addOperand(MCOperand::CreateReg(Register));
273 return MCDisassembler::Success;
276 static DecodeStatus DecodeGPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
278 const void *Decoder) {
280 return MCDisassembler::Fail;
282 uint16_t Register = getReg(Decoder, AArch64::GPR32RegClassID, RegNo);
283 Inst.addOperand(MCOperand::CreateReg(Register));
284 return MCDisassembler::Success;
288 DecodeGPR32wspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
289 uint64_t Address, const void *Decoder) {
291 return MCDisassembler::Fail;
293 uint16_t Register = getReg(Decoder, AArch64::GPR32wspRegClassID, RegNo);
294 Inst.addOperand(MCOperand::CreateReg(Register));
295 return MCDisassembler::Success;
299 DecodeFPR8RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
300 uint64_t Address, const void *Decoder) {
302 return MCDisassembler::Fail;
304 uint16_t Register = getReg(Decoder, AArch64::FPR8RegClassID, RegNo);
305 Inst.addOperand(MCOperand::CreateReg(Register));
306 return MCDisassembler::Success;
310 DecodeFPR16RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
311 uint64_t Address, const void *Decoder) {
313 return MCDisassembler::Fail;
315 uint16_t Register = getReg(Decoder, AArch64::FPR16RegClassID, RegNo);
316 Inst.addOperand(MCOperand::CreateReg(Register));
317 return MCDisassembler::Success;
322 DecodeFPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
323 uint64_t Address, const void *Decoder) {
325 return MCDisassembler::Fail;
327 uint16_t Register = getReg(Decoder, AArch64::FPR32RegClassID, RegNo);
328 Inst.addOperand(MCOperand::CreateReg(Register));
329 return MCDisassembler::Success;
333 DecodeFPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
334 uint64_t Address, const void *Decoder) {
336 return MCDisassembler::Fail;
338 uint16_t Register = getReg(Decoder, AArch64::FPR64RegClassID, RegNo);
339 Inst.addOperand(MCOperand::CreateReg(Register));
340 return MCDisassembler::Success;
345 DecodeFPR128RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
346 uint64_t Address, const void *Decoder) {
348 return MCDisassembler::Fail;
350 uint16_t Register = getReg(Decoder, AArch64::FPR128RegClassID, RegNo);
351 Inst.addOperand(MCOperand::CreateReg(Register));
352 return MCDisassembler::Success;
356 DecodeFPR128LoRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
357 uint64_t Address, const void *Decoder) {
359 return MCDisassembler::Fail;
361 return DecodeFPR128RegisterClass(Inst, RegNo, Address, Decoder);
364 static DecodeStatus DecodeRegisterClassByID(llvm::MCInst &Inst, unsigned RegNo,
366 const void *Decoder) {
368 return MCDisassembler::Fail;
370 uint16_t Register = getReg(Decoder, RegID, RegNo);
371 Inst.addOperand(MCOperand::CreateReg(Register));
372 return MCDisassembler::Success;
375 static DecodeStatus DecodeDPairRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
377 const void *Decoder) {
378 return DecodeRegisterClassByID(Inst, RegNo, AArch64::DPairRegClassID,
382 static DecodeStatus DecodeQPairRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
384 const void *Decoder) {
385 return DecodeRegisterClassByID(Inst, RegNo, AArch64::QPairRegClassID,
389 static DecodeStatus DecodeDTripleRegisterClass(llvm::MCInst &Inst,
390 unsigned RegNo, uint64_t Address,
391 const void *Decoder) {
392 return DecodeRegisterClassByID(Inst, RegNo, AArch64::DTripleRegClassID,
396 static DecodeStatus DecodeQTripleRegisterClass(llvm::MCInst &Inst,
397 unsigned RegNo, uint64_t Address,
398 const void *Decoder) {
399 return DecodeRegisterClassByID(Inst, RegNo, AArch64::QTripleRegClassID,
403 static DecodeStatus DecodeDQuadRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
405 const void *Decoder) {
406 return DecodeRegisterClassByID(Inst, RegNo, AArch64::DQuadRegClassID,
410 static DecodeStatus DecodeQQuadRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
412 const void *Decoder) {
413 return DecodeRegisterClassByID(Inst, RegNo, AArch64::QQuadRegClassID,
417 static DecodeStatus DecodeAddrRegExtendOperand(llvm::MCInst &Inst,
420 const void *Decoder) {
421 // Option{1} must be 1. OptionHiS is made up of {Option{2}, Option{1},
422 // S}. Hence we want to check bit 1.
423 if (!(OptionHiS & 2))
424 return MCDisassembler::Fail;
426 Inst.addOperand(MCOperand::CreateImm(OptionHiS));
427 return MCDisassembler::Success;
430 static DecodeStatus DecodeBitfield32ImmOperand(llvm::MCInst &Inst,
433 const void *Decoder) {
434 // In the 32-bit variant, bit 6 must be zero. I.e. the immediate must be
437 return MCDisassembler::Fail;
439 Inst.addOperand(MCOperand::CreateImm(Imm6Bits));
440 return MCDisassembler::Success;
443 static DecodeStatus DecodeCVT32FixedPosOperand(llvm::MCInst &Inst,
446 const void *Decoder) {
447 // 1 <= Imm <= 32. Encoded as 64 - Imm so: 63 >= Encoded >= 32.
449 return MCDisassembler::Fail;
451 Inst.addOperand(MCOperand::CreateImm(Imm6Bits));
452 return MCDisassembler::Success;
455 static DecodeStatus DecodeFPZeroOperand(llvm::MCInst &Inst,
458 const void *Decoder) {
459 // Any bits are valid in the instruction (they're architecturally ignored),
460 // but a code generator should insert 0.
461 Inst.addOperand(MCOperand::CreateImm(0));
462 return MCDisassembler::Success;
465 static DecodeStatus DecodeShiftRightImm8(MCInst &Inst, unsigned Val,
467 const void *Decoder) {
468 Inst.addOperand(MCOperand::CreateImm(8 - Val));
469 return MCDisassembler::Success;
472 static DecodeStatus DecodeShiftRightImm16(MCInst &Inst, unsigned Val,
474 const void *Decoder) {
475 Inst.addOperand(MCOperand::CreateImm(16 - Val));
476 return MCDisassembler::Success;
479 static DecodeStatus DecodeShiftRightImm32(MCInst &Inst, unsigned Val,
481 const void *Decoder) {
482 Inst.addOperand(MCOperand::CreateImm(32 - Val));
483 return MCDisassembler::Success;
486 static DecodeStatus DecodeShiftRightImm64(MCInst &Inst, unsigned Val,
488 const void *Decoder) {
489 Inst.addOperand(MCOperand::CreateImm(64 - Val));
490 return MCDisassembler::Success;
493 template<int RegWidth>
494 static DecodeStatus DecodeMoveWideImmOperand(llvm::MCInst &Inst,
497 const void *Decoder) {
498 unsigned Imm16 = FullImm & 0xffff;
499 unsigned Shift = FullImm >> 16;
501 if (RegWidth == 32 && Shift > 1) return MCDisassembler::Fail;
503 Inst.addOperand(MCOperand::CreateImm(Imm16));
504 Inst.addOperand(MCOperand::CreateImm(Shift));
505 return MCDisassembler::Success;
508 template<int RegWidth>
509 static DecodeStatus DecodeLogicalImmOperand(llvm::MCInst &Inst,
512 const void *Decoder) {
514 if (!A64Imms::isLogicalImmBits(RegWidth, Bits, Imm))
515 return MCDisassembler::Fail;
517 Inst.addOperand(MCOperand::CreateImm(Bits));
518 return MCDisassembler::Success;
522 static DecodeStatus DecodeRegExtendOperand(llvm::MCInst &Inst,
523 unsigned ShiftAmount,
525 const void *Decoder) {
526 // Only values 0-4 are valid for this 3-bit field
528 return MCDisassembler::Fail;
530 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
531 return MCDisassembler::Success;
534 static DecodeStatus Decode32BitShiftOperand(llvm::MCInst &Inst,
535 unsigned ShiftAmount,
537 const void *Decoder) {
538 // Only values below 32 are valid for a 32-bit register
539 if (ShiftAmount > 31)
540 return MCDisassembler::Fail;
542 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
543 return MCDisassembler::Success;
546 static DecodeStatus DecodeBitfieldInstruction(llvm::MCInst &Inst, unsigned Insn,
548 const void *Decoder) {
549 unsigned Rd = fieldFromInstruction(Insn, 0, 5);
550 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
551 unsigned ImmS = fieldFromInstruction(Insn, 10, 6);
552 unsigned ImmR = fieldFromInstruction(Insn, 16, 6);
553 unsigned SF = fieldFromInstruction(Insn, 31, 1);
555 // Undef for 0b11 just in case it occurs. Don't want the compiler to optimise
556 // out assertions that it thinks should never be hit.
557 enum OpcTypes { SBFM = 0, BFM, UBFM, Undef } Opc;
558 Opc = (OpcTypes)fieldFromInstruction(Insn, 29, 2);
561 // ImmR and ImmS must be between 0 and 31 for 32-bit instructions.
562 if (ImmR > 31 || ImmS > 31)
563 return MCDisassembler::Fail;
567 DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
568 // BFM MCInsts use Rd as a source too.
569 if (Opc == BFM) DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
570 DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
572 DecodeGPR32RegisterClass(Inst, Rd, Address, Decoder);
573 // BFM MCInsts use Rd as a source too.
574 if (Opc == BFM) DecodeGPR32RegisterClass(Inst, Rd, Address, Decoder);
575 DecodeGPR32RegisterClass(Inst, Rn, Address, Decoder);
578 // ASR and LSR have more specific patterns so they won't get here:
579 assert(!(ImmS == 31 && !SF && Opc != BFM)
580 && "shift should have used auto decode");
581 assert(!(ImmS == 63 && SF && Opc != BFM)
582 && "shift should have used auto decode");
584 // Extension instructions similarly:
585 if (Opc == SBFM && ImmR == 0) {
586 assert((ImmS != 7 && ImmS != 15) && "extension got here");
587 assert((ImmS != 31 || SF == 0) && "extension got here");
588 } else if (Opc == UBFM && ImmR == 0) {
589 assert((SF != 0 || (ImmS != 7 && ImmS != 15)) && "extension got here");
593 // It might be a LSL instruction, which actually takes the shift amount
594 // itself as an MCInst operand.
595 if (SF && (ImmS + 1) % 64 == ImmR) {
596 Inst.setOpcode(AArch64::LSLxxi);
597 Inst.addOperand(MCOperand::CreateImm(63 - ImmS));
598 return MCDisassembler::Success;
599 } else if (!SF && (ImmS + 1) % 32 == ImmR) {
600 Inst.setOpcode(AArch64::LSLwwi);
601 Inst.addOperand(MCOperand::CreateImm(31 - ImmS));
602 return MCDisassembler::Success;
606 // Otherwise it's definitely either an extract or an insert depending on which
607 // of ImmR or ImmS is larger.
608 unsigned ExtractOp, InsertOp;
610 default: llvm_unreachable("unexpected instruction trying to decode bitfield");
612 ExtractOp = SF ? AArch64::SBFXxxii : AArch64::SBFXwwii;
613 InsertOp = SF ? AArch64::SBFIZxxii : AArch64::SBFIZwwii;
616 ExtractOp = SF ? AArch64::BFXILxxii : AArch64::BFXILwwii;
617 InsertOp = SF ? AArch64::BFIxxii : AArch64::BFIwwii;
620 ExtractOp = SF ? AArch64::UBFXxxii : AArch64::UBFXwwii;
621 InsertOp = SF ? AArch64::UBFIZxxii : AArch64::UBFIZwwii;
625 // Otherwise it's a boring insert or extract
626 Inst.addOperand(MCOperand::CreateImm(ImmR));
627 Inst.addOperand(MCOperand::CreateImm(ImmS));
631 Inst.setOpcode(InsertOp);
633 Inst.setOpcode(ExtractOp);
635 return MCDisassembler::Success;
638 static DecodeStatus DecodeFMOVLaneInstruction(llvm::MCInst &Inst, unsigned Insn,
640 const void *Decoder) {
641 // This decoder exists to add the dummy Lane operand to the MCInst, which must
642 // be 1 in assembly but has no other real manifestation.
643 unsigned Rd = fieldFromInstruction(Insn, 0, 5);
644 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
645 unsigned IsToVec = fieldFromInstruction(Insn, 16, 1);
648 DecodeFPR128RegisterClass(Inst, Rd, Address, Decoder);
649 DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
651 DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
652 DecodeFPR128RegisterClass(Inst, Rn, Address, Decoder);
656 Inst.addOperand(MCOperand::CreateImm(1));
658 return MCDisassembler::Success;
662 static DecodeStatus DecodeLDSTPairInstruction(llvm::MCInst &Inst,
665 const void *Decoder) {
666 DecodeStatus Result = MCDisassembler::Success;
667 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
668 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
669 unsigned Rt2 = fieldFromInstruction(Insn, 10, 5);
670 unsigned SImm7 = fieldFromInstruction(Insn, 15, 7);
671 unsigned L = fieldFromInstruction(Insn, 22, 1);
672 unsigned V = fieldFromInstruction(Insn, 26, 1);
673 unsigned Opc = fieldFromInstruction(Insn, 30, 2);
675 // Not an official name, but it turns out that bit 23 distinguishes indexed
676 // from non-indexed operations.
677 unsigned Indexed = fieldFromInstruction(Insn, 23, 1);
679 if (Indexed && L == 0) {
680 // The MCInst for an indexed store has an out operand and 4 ins:
681 // Rn_wb, Rt, Rt2, Rn, Imm
682 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
685 // You shouldn't load to the same register twice in an instruction...
687 Result = MCDisassembler::SoftFail;
689 // ... or do any operation that writes-back to a transfer register. But note
690 // that "stp xzr, xzr, [sp], #4" is fine because xzr and sp are different.
691 if (Indexed && V == 0 && Rn != 31 && (Rt == Rn || Rt2 == Rn))
692 Result = MCDisassembler::SoftFail;
694 // Exactly how we decode the MCInst's registers depends on the Opc and V
695 // fields of the instruction. These also obviously determine the size of the
696 // operation so we can fill in that information while we're at it.
698 // The instruction operates on the FP/SIMD registers
700 default: return MCDisassembler::Fail;
702 DecodeFPR32RegisterClass(Inst, Rt, Address, Decoder);
703 DecodeFPR32RegisterClass(Inst, Rt2, Address, Decoder);
706 DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
707 DecodeFPR64RegisterClass(Inst, Rt2, Address, Decoder);
710 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
711 DecodeFPR128RegisterClass(Inst, Rt2, Address, Decoder);
716 default: return MCDisassembler::Fail;
718 DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder);
719 DecodeGPR32RegisterClass(Inst, Rt2, Address, Decoder);
722 assert(L && "unexpected \"store signed\" attempt");
723 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
724 DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder);
727 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
728 DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder);
733 if (Indexed && L == 1) {
734 // The MCInst for an indexed load has 3 out operands and an 3 ins:
735 // Rt, Rt2, Rn_wb, Rt2, Rn, Imm
736 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
740 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
741 Inst.addOperand(MCOperand::CreateImm(SImm7));
746 static DecodeStatus DecodeLoadPairExclusiveInstruction(llvm::MCInst &Inst,
749 const void *Decoder) {
750 unsigned Rt = fieldFromInstruction(Val, 0, 5);
751 unsigned Rn = fieldFromInstruction(Val, 5, 5);
752 unsigned Rt2 = fieldFromInstruction(Val, 10, 5);
753 unsigned MemSize = fieldFromInstruction(Val, 30, 2);
755 DecodeStatus S = MCDisassembler::Success;
756 if (Rt == Rt2) S = MCDisassembler::SoftFail;
760 if (!Check(S, DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder)))
761 return MCDisassembler::Fail;
762 if (!Check(S, DecodeGPR32RegisterClass(Inst, Rt2, Address, Decoder)))
763 return MCDisassembler::Fail;
766 if (!Check(S, DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder)))
767 return MCDisassembler::Fail;
768 if (!Check(S, DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder)))
769 return MCDisassembler::Fail;
772 llvm_unreachable("Invalid MemSize in DecodeLoadPairExclusiveInstruction");
775 if (!Check(S, DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder)))
776 return MCDisassembler::Fail;
781 template<typename SomeNamedImmMapper>
782 static DecodeStatus DecodeNamedImmOperand(llvm::MCInst &Inst,
785 const void *Decoder) {
786 SomeNamedImmMapper Mapper;
788 Mapper.toString(Val, ValidNamed);
789 if (ValidNamed || Mapper.validImm(Val)) {
790 Inst.addOperand(MCOperand::CreateImm(Val));
791 return MCDisassembler::Success;
794 return MCDisassembler::Fail;
797 static DecodeStatus DecodeSysRegOperand(const A64SysReg::SysRegMapper &Mapper,
801 const void *Decoder) {
803 Mapper.toString(Val, ValidNamed);
805 Inst.addOperand(MCOperand::CreateImm(Val));
807 return ValidNamed ? MCDisassembler::Success : MCDisassembler::Fail;
810 static DecodeStatus DecodeMRSOperand(llvm::MCInst &Inst,
813 const void *Decoder) {
814 return DecodeSysRegOperand(A64SysReg::MRSMapper(), Inst, Val, Address,
818 static DecodeStatus DecodeMSROperand(llvm::MCInst &Inst,
821 const void *Decoder) {
822 return DecodeSysRegOperand(A64SysReg::MSRMapper(), Inst, Val, Address,
826 static DecodeStatus DecodeSingleIndexedInstruction(llvm::MCInst &Inst,
829 const void *Decoder) {
830 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
831 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
832 unsigned Imm9 = fieldFromInstruction(Insn, 12, 9);
834 unsigned Opc = fieldFromInstruction(Insn, 22, 2);
835 unsigned V = fieldFromInstruction(Insn, 26, 1);
836 unsigned Size = fieldFromInstruction(Insn, 30, 2);
838 if (Opc == 0 || (V == 1 && Opc == 2)) {
839 // It's a store, the MCInst gets: Rn_wb, Rt, Rn, Imm
840 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
843 if (V == 0 && (Opc == 2 || Size == 3)) {
844 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
846 DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder);
847 } else if (V == 1 && (Opc & 2)) {
848 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
852 DecodeFPR8RegisterClass(Inst, Rt, Address, Decoder);
855 DecodeFPR16RegisterClass(Inst, Rt, Address, Decoder);
858 DecodeFPR32RegisterClass(Inst, Rt, Address, Decoder);
861 DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
866 if (Opc != 0 && (V != 1 || Opc != 2)) {
867 // It's a load, the MCInst gets: Rt, Rn_wb, Rn, Imm
868 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
871 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
873 Inst.addOperand(MCOperand::CreateImm(Imm9));
875 // N.b. The official documentation says undpredictable if Rt == Rn, but this
876 // takes place at the architectural rather than encoding level:
878 // "STR xzr, [sp], #4" is perfectly valid.
879 if (V == 0 && Rt == Rn && Rn != 31)
880 return MCDisassembler::SoftFail;
882 return MCDisassembler::Success;
885 static MCDisassembler *createAArch64Disassembler(const Target &T,
886 const MCSubtargetInfo &STI) {
887 return new AArch64Disassembler(STI, T.createMCRegInfo(""));
890 extern "C" void LLVMInitializeAArch64Disassembler() {
891 TargetRegistry::RegisterMCDisassembler(TheAArch64Target,
892 createAArch64Disassembler);
895 template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf>
897 DecodeNeonMovImmShiftOperand(llvm::MCInst &Inst, unsigned ShiftAmount,
898 uint64_t Address, const void *Decoder) {
900 if (Ext == A64SE::LSL)
902 else if (Ext != A64SE::MSL)
903 return MCDisassembler::Fail;
905 // MSL and LSLH accepts encoded shift amount 0 or 1.
906 if ((!IsLSL || (IsLSL && IsHalf)) && ShiftAmount != 0 && ShiftAmount != 1)
907 return MCDisassembler::Fail;
909 // LSL accepts encoded shift amount 0, 1, 2 or 3.
910 if (IsLSL && ShiftAmount > 3)
911 return MCDisassembler::Fail;
913 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
914 return MCDisassembler::Success;