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 DecodeVPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
91 static DecodeStatus DecodeVPR128RegisterClass(llvm::MCInst &Inst,
92 unsigned RegNo, uint64_t Address,
95 static DecodeStatus DecodeAddrRegExtendOperand(llvm::MCInst &Inst,
101 static DecodeStatus DecodeBitfield32ImmOperand(llvm::MCInst &Inst,
104 const void *Decoder);
106 static DecodeStatus DecodeCVT32FixedPosOperand(llvm::MCInst &Inst,
109 const void *Decoder);
111 static DecodeStatus DecodeFPZeroOperand(llvm::MCInst &Inst,
114 const void *Decoder);
116 template<int RegWidth>
117 static DecodeStatus DecodeMoveWideImmOperand(llvm::MCInst &Inst,
120 const void *Decoder);
122 template<int RegWidth>
123 static DecodeStatus DecodeLogicalImmOperand(llvm::MCInst &Inst,
126 const void *Decoder);
128 static DecodeStatus DecodeRegExtendOperand(llvm::MCInst &Inst,
129 unsigned ShiftAmount,
131 const void *Decoder);
132 template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf>
134 DecodeNeonMovImmShiftOperand(llvm::MCInst &Inst, unsigned ShiftAmount,
135 uint64_t Address, const void *Decoder);
137 static DecodeStatus Decode32BitShiftOperand(llvm::MCInst &Inst,
138 unsigned ShiftAmount,
140 const void *Decoder);
141 static DecodeStatus DecodeBitfieldInstruction(llvm::MCInst &Inst, unsigned Insn,
143 const void *Decoder);
145 static DecodeStatus DecodeFMOVLaneInstruction(llvm::MCInst &Inst, unsigned Insn,
147 const void *Decoder);
149 static DecodeStatus DecodeLDSTPairInstruction(llvm::MCInst &Inst,
152 const void *Decoder);
154 static DecodeStatus DecodeLoadPairExclusiveInstruction(llvm::MCInst &Inst,
157 const void *Decoder);
159 template<typename SomeNamedImmMapper>
160 static DecodeStatus DecodeNamedImmOperand(llvm::MCInst &Inst,
163 const void *Decoder);
166 DecodeSysRegOperand(const A64SysReg::SysRegMapper &InstMapper,
167 llvm::MCInst &Inst, unsigned Val,
168 uint64_t Address, const void *Decoder);
170 static DecodeStatus DecodeMRSOperand(llvm::MCInst &Inst,
173 const void *Decoder);
175 static DecodeStatus DecodeMSROperand(llvm::MCInst &Inst,
178 const void *Decoder);
181 static DecodeStatus DecodeSingleIndexedInstruction(llvm::MCInst &Inst,
184 const void *Decoder);
187 static bool Check(DecodeStatus &Out, DecodeStatus In);
189 #include "AArch64GenDisassemblerTables.inc"
190 #include "AArch64GenInstrInfo.inc"
192 static bool Check(DecodeStatus &Out, DecodeStatus In) {
194 case MCDisassembler::Success:
195 // Out stays the same.
197 case MCDisassembler::SoftFail:
200 case MCDisassembler::Fail:
204 llvm_unreachable("Invalid DecodeStatus!");
207 DecodeStatus AArch64Disassembler::getInstruction(MCInst &MI, uint64_t &Size,
208 const MemoryObject &Region,
211 raw_ostream &cs) const {
216 // We want to read exactly 4 bytes of data.
217 if (Region.readBytes(Address, 4, bytes) == -1) {
219 return MCDisassembler::Fail;
222 // Encoded as a small-endian 32-bit word in the stream.
223 uint32_t insn = (bytes[3] << 24) |
228 // Calling the auto-generated decoder function.
229 DecodeStatus result = decodeInstruction(DecoderTableA6432, MI, insn, Address,
231 if (result != MCDisassembler::Fail) {
238 return MCDisassembler::Fail;
241 static unsigned getReg(const void *D, unsigned RC, unsigned RegNo) {
242 const AArch64Disassembler *Dis = static_cast<const AArch64Disassembler*>(D);
243 return Dis->getRegInfo()->getRegClass(RC).getRegister(RegNo);
246 static DecodeStatus DecodeGPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
247 uint64_t Address, const void *Decoder) {
249 return MCDisassembler::Fail;
251 uint16_t Register = getReg(Decoder, AArch64::GPR64RegClassID, RegNo);
252 Inst.addOperand(MCOperand::CreateReg(Register));
253 return MCDisassembler::Success;
257 DecodeGPR64xspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
258 uint64_t Address, const void *Decoder) {
260 return MCDisassembler::Fail;
262 uint16_t Register = getReg(Decoder, AArch64::GPR64xspRegClassID, RegNo);
263 Inst.addOperand(MCOperand::CreateReg(Register));
264 return MCDisassembler::Success;
267 static DecodeStatus DecodeGPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
269 const void *Decoder) {
271 return MCDisassembler::Fail;
273 uint16_t Register = getReg(Decoder, AArch64::GPR32RegClassID, RegNo);
274 Inst.addOperand(MCOperand::CreateReg(Register));
275 return MCDisassembler::Success;
279 DecodeGPR32wspRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
280 uint64_t Address, const void *Decoder) {
282 return MCDisassembler::Fail;
284 uint16_t Register = getReg(Decoder, AArch64::GPR32wspRegClassID, RegNo);
285 Inst.addOperand(MCOperand::CreateReg(Register));
286 return MCDisassembler::Success;
290 DecodeFPR8RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
291 uint64_t Address, const void *Decoder) {
293 return MCDisassembler::Fail;
295 uint16_t Register = getReg(Decoder, AArch64::FPR8RegClassID, RegNo);
296 Inst.addOperand(MCOperand::CreateReg(Register));
297 return MCDisassembler::Success;
301 DecodeFPR16RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
302 uint64_t Address, const void *Decoder) {
304 return MCDisassembler::Fail;
306 uint16_t Register = getReg(Decoder, AArch64::FPR16RegClassID, RegNo);
307 Inst.addOperand(MCOperand::CreateReg(Register));
308 return MCDisassembler::Success;
313 DecodeFPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
314 uint64_t Address, const void *Decoder) {
316 return MCDisassembler::Fail;
318 uint16_t Register = getReg(Decoder, AArch64::FPR32RegClassID, RegNo);
319 Inst.addOperand(MCOperand::CreateReg(Register));
320 return MCDisassembler::Success;
324 DecodeFPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
325 uint64_t Address, const void *Decoder) {
327 return MCDisassembler::Fail;
329 uint16_t Register = getReg(Decoder, AArch64::FPR64RegClassID, RegNo);
330 Inst.addOperand(MCOperand::CreateReg(Register));
331 return MCDisassembler::Success;
336 DecodeFPR128RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
337 uint64_t Address, const void *Decoder) {
339 return MCDisassembler::Fail;
341 uint16_t Register = getReg(Decoder, AArch64::FPR128RegClassID, RegNo);
342 Inst.addOperand(MCOperand::CreateReg(Register));
343 return MCDisassembler::Success;
346 static DecodeStatus DecodeVPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
348 const void *Decoder) {
350 return MCDisassembler::Fail;
352 uint16_t Register = getReg(Decoder, AArch64::VPR64RegClassID, RegNo);
353 Inst.addOperand(MCOperand::CreateReg(Register));
354 return MCDisassembler::Success;
358 DecodeVPR128RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
359 uint64_t Address, const void *Decoder) {
361 return MCDisassembler::Fail;
363 uint16_t Register = getReg(Decoder, AArch64::VPR128RegClassID, RegNo);
364 Inst.addOperand(MCOperand::CreateReg(Register));
365 return MCDisassembler::Success;
368 static DecodeStatus DecodeAddrRegExtendOperand(llvm::MCInst &Inst,
371 const void *Decoder) {
372 // Option{1} must be 1. OptionHiS is made up of {Option{2}, Option{1},
373 // S}. Hence we want to check bit 1.
374 if (!(OptionHiS & 2))
375 return MCDisassembler::Fail;
377 Inst.addOperand(MCOperand::CreateImm(OptionHiS));
378 return MCDisassembler::Success;
381 static DecodeStatus DecodeBitfield32ImmOperand(llvm::MCInst &Inst,
384 const void *Decoder) {
385 // In the 32-bit variant, bit 6 must be zero. I.e. the immediate must be
388 return MCDisassembler::Fail;
390 Inst.addOperand(MCOperand::CreateImm(Imm6Bits));
391 return MCDisassembler::Success;
394 static DecodeStatus DecodeCVT32FixedPosOperand(llvm::MCInst &Inst,
397 const void *Decoder) {
398 // 1 <= Imm <= 32. Encoded as 64 - Imm so: 63 >= Encoded >= 32.
400 return MCDisassembler::Fail;
402 Inst.addOperand(MCOperand::CreateImm(Imm6Bits));
403 return MCDisassembler::Success;
406 static DecodeStatus DecodeFPZeroOperand(llvm::MCInst &Inst,
409 const void *Decoder) {
410 // Any bits are valid in the instruction (they're architecturally ignored),
411 // but a code generator should insert 0.
412 Inst.addOperand(MCOperand::CreateImm(0));
413 return MCDisassembler::Success;
418 template<int RegWidth>
419 static DecodeStatus DecodeMoveWideImmOperand(llvm::MCInst &Inst,
422 const void *Decoder) {
423 unsigned Imm16 = FullImm & 0xffff;
424 unsigned Shift = FullImm >> 16;
426 if (RegWidth == 32 && Shift > 1) return MCDisassembler::Fail;
428 Inst.addOperand(MCOperand::CreateImm(Imm16));
429 Inst.addOperand(MCOperand::CreateImm(Shift));
430 return MCDisassembler::Success;
433 template<int RegWidth>
434 static DecodeStatus DecodeLogicalImmOperand(llvm::MCInst &Inst,
437 const void *Decoder) {
439 if (!A64Imms::isLogicalImmBits(RegWidth, Bits, Imm))
440 return MCDisassembler::Fail;
442 Inst.addOperand(MCOperand::CreateImm(Bits));
443 return MCDisassembler::Success;
447 static DecodeStatus DecodeRegExtendOperand(llvm::MCInst &Inst,
448 unsigned ShiftAmount,
450 const void *Decoder) {
451 // Only values 0-4 are valid for this 3-bit field
453 return MCDisassembler::Fail;
455 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
456 return MCDisassembler::Success;
459 static DecodeStatus Decode32BitShiftOperand(llvm::MCInst &Inst,
460 unsigned ShiftAmount,
462 const void *Decoder) {
463 // Only values below 32 are valid for a 32-bit register
464 if (ShiftAmount > 31)
465 return MCDisassembler::Fail;
467 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
468 return MCDisassembler::Success;
471 static DecodeStatus DecodeBitfieldInstruction(llvm::MCInst &Inst, unsigned Insn,
473 const void *Decoder) {
474 unsigned Rd = fieldFromInstruction(Insn, 0, 5);
475 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
476 unsigned ImmS = fieldFromInstruction(Insn, 10, 6);
477 unsigned ImmR = fieldFromInstruction(Insn, 16, 6);
478 unsigned SF = fieldFromInstruction(Insn, 31, 1);
480 // Undef for 0b11 just in case it occurs. Don't want the compiler to optimise
481 // out assertions that it thinks should never be hit.
482 enum OpcTypes { SBFM = 0, BFM, UBFM, Undef } Opc;
483 Opc = (OpcTypes)fieldFromInstruction(Insn, 29, 2);
486 // ImmR and ImmS must be between 0 and 31 for 32-bit instructions.
487 if (ImmR > 31 || ImmS > 31)
488 return MCDisassembler::Fail;
492 DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
493 // BFM MCInsts use Rd as a source too.
494 if (Opc == BFM) DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
495 DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
497 DecodeGPR32RegisterClass(Inst, Rd, Address, Decoder);
498 // BFM MCInsts use Rd as a source too.
499 if (Opc == BFM) DecodeGPR32RegisterClass(Inst, Rd, Address, Decoder);
500 DecodeGPR32RegisterClass(Inst, Rn, Address, Decoder);
503 // ASR and LSR have more specific patterns so they won't get here:
504 assert(!(ImmS == 31 && !SF && Opc != BFM)
505 && "shift should have used auto decode");
506 assert(!(ImmS == 63 && SF && Opc != BFM)
507 && "shift should have used auto decode");
509 // Extension instructions similarly:
510 if (Opc == SBFM && ImmR == 0) {
511 assert((ImmS != 7 && ImmS != 15) && "extension got here");
512 assert((ImmS != 31 || SF == 0) && "extension got here");
513 } else if (Opc == UBFM && ImmR == 0) {
514 assert((SF != 0 || (ImmS != 7 && ImmS != 15)) && "extension got here");
518 // It might be a LSL instruction, which actually takes the shift amount
519 // itself as an MCInst operand.
520 if (SF && (ImmS + 1) % 64 == ImmR) {
521 Inst.setOpcode(AArch64::LSLxxi);
522 Inst.addOperand(MCOperand::CreateImm(63 - ImmS));
523 return MCDisassembler::Success;
524 } else if (!SF && (ImmS + 1) % 32 == ImmR) {
525 Inst.setOpcode(AArch64::LSLwwi);
526 Inst.addOperand(MCOperand::CreateImm(31 - ImmS));
527 return MCDisassembler::Success;
531 // Otherwise it's definitely either an extract or an insert depending on which
532 // of ImmR or ImmS is larger.
533 unsigned ExtractOp, InsertOp;
535 default: llvm_unreachable("unexpected instruction trying to decode bitfield");
537 ExtractOp = SF ? AArch64::SBFXxxii : AArch64::SBFXwwii;
538 InsertOp = SF ? AArch64::SBFIZxxii : AArch64::SBFIZwwii;
541 ExtractOp = SF ? AArch64::BFXILxxii : AArch64::BFXILwwii;
542 InsertOp = SF ? AArch64::BFIxxii : AArch64::BFIwwii;
545 ExtractOp = SF ? AArch64::UBFXxxii : AArch64::UBFXwwii;
546 InsertOp = SF ? AArch64::UBFIZxxii : AArch64::UBFIZwwii;
550 // Otherwise it's a boring insert or extract
551 Inst.addOperand(MCOperand::CreateImm(ImmR));
552 Inst.addOperand(MCOperand::CreateImm(ImmS));
556 Inst.setOpcode(InsertOp);
558 Inst.setOpcode(ExtractOp);
560 return MCDisassembler::Success;
563 static DecodeStatus DecodeFMOVLaneInstruction(llvm::MCInst &Inst, unsigned Insn,
565 const void *Decoder) {
566 // This decoder exists to add the dummy Lane operand to the MCInst, which must
567 // be 1 in assembly but has no other real manifestation.
568 unsigned Rd = fieldFromInstruction(Insn, 0, 5);
569 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
570 unsigned IsToVec = fieldFromInstruction(Insn, 16, 1);
573 DecodeVPR128RegisterClass(Inst, Rd, Address, Decoder);
574 DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
576 DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
577 DecodeVPR128RegisterClass(Inst, Rn, Address, Decoder);
581 Inst.addOperand(MCOperand::CreateImm(1));
583 return MCDisassembler::Success;
587 static DecodeStatus DecodeLDSTPairInstruction(llvm::MCInst &Inst,
590 const void *Decoder) {
591 DecodeStatus Result = MCDisassembler::Success;
592 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
593 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
594 unsigned Rt2 = fieldFromInstruction(Insn, 10, 5);
595 unsigned SImm7 = fieldFromInstruction(Insn, 15, 7);
596 unsigned L = fieldFromInstruction(Insn, 22, 1);
597 unsigned V = fieldFromInstruction(Insn, 26, 1);
598 unsigned Opc = fieldFromInstruction(Insn, 30, 2);
600 // Not an official name, but it turns out that bit 23 distinguishes indexed
601 // from non-indexed operations.
602 unsigned Indexed = fieldFromInstruction(Insn, 23, 1);
604 if (Indexed && L == 0) {
605 // The MCInst for an indexed store has an out operand and 4 ins:
606 // Rn_wb, Rt, Rt2, Rn, Imm
607 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
610 // You shouldn't load to the same register twice in an instruction...
612 Result = MCDisassembler::SoftFail;
614 // ... or do any operation that writes-back to a transfer register. But note
615 // that "stp xzr, xzr, [sp], #4" is fine because xzr and sp are different.
616 if (Indexed && V == 0 && Rn != 31 && (Rt == Rn || Rt2 == Rn))
617 Result = MCDisassembler::SoftFail;
619 // Exactly how we decode the MCInst's registers depends on the Opc and V
620 // fields of the instruction. These also obviously determine the size of the
621 // operation so we can fill in that information while we're at it.
623 // The instruction operates on the FP/SIMD registers
625 default: return MCDisassembler::Fail;
627 DecodeFPR32RegisterClass(Inst, Rt, Address, Decoder);
628 DecodeFPR32RegisterClass(Inst, Rt2, Address, Decoder);
631 DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
632 DecodeFPR64RegisterClass(Inst, Rt2, Address, Decoder);
635 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
636 DecodeFPR128RegisterClass(Inst, Rt2, Address, Decoder);
641 default: return MCDisassembler::Fail;
643 DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder);
644 DecodeGPR32RegisterClass(Inst, Rt2, Address, Decoder);
647 assert(L && "unexpected \"store signed\" attempt");
648 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
649 DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder);
652 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
653 DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder);
658 if (Indexed && L == 1) {
659 // The MCInst for an indexed load has 3 out operands and an 3 ins:
660 // Rt, Rt2, Rn_wb, Rt2, Rn, Imm
661 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
665 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
666 Inst.addOperand(MCOperand::CreateImm(SImm7));
671 static DecodeStatus DecodeLoadPairExclusiveInstruction(llvm::MCInst &Inst,
674 const void *Decoder) {
675 unsigned Rt = fieldFromInstruction(Val, 0, 5);
676 unsigned Rn = fieldFromInstruction(Val, 5, 5);
677 unsigned Rt2 = fieldFromInstruction(Val, 10, 5);
678 unsigned MemSize = fieldFromInstruction(Val, 30, 2);
680 DecodeStatus S = MCDisassembler::Success;
681 if (Rt == Rt2) S = MCDisassembler::SoftFail;
685 if (!Check(S, DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder)))
686 return MCDisassembler::Fail;
687 if (!Check(S, DecodeGPR32RegisterClass(Inst, Rt2, Address, Decoder)))
688 return MCDisassembler::Fail;
691 if (!Check(S, DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder)))
692 return MCDisassembler::Fail;
693 if (!Check(S, DecodeGPR64RegisterClass(Inst, Rt2, Address, Decoder)))
694 return MCDisassembler::Fail;
697 llvm_unreachable("Invalid MemSize in DecodeLoadPairExclusiveInstruction");
700 if (!Check(S, DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder)))
701 return MCDisassembler::Fail;
706 template<typename SomeNamedImmMapper>
707 static DecodeStatus DecodeNamedImmOperand(llvm::MCInst &Inst,
710 const void *Decoder) {
711 SomeNamedImmMapper Mapper;
713 Mapper.toString(Val, ValidNamed);
714 if (ValidNamed || Mapper.validImm(Val)) {
715 Inst.addOperand(MCOperand::CreateImm(Val));
716 return MCDisassembler::Success;
719 return MCDisassembler::Fail;
722 static DecodeStatus DecodeSysRegOperand(const A64SysReg::SysRegMapper &Mapper,
726 const void *Decoder) {
728 Mapper.toString(Val, ValidNamed);
730 Inst.addOperand(MCOperand::CreateImm(Val));
732 return ValidNamed ? MCDisassembler::Success : MCDisassembler::Fail;
735 static DecodeStatus DecodeMRSOperand(llvm::MCInst &Inst,
738 const void *Decoder) {
739 return DecodeSysRegOperand(A64SysReg::MRSMapper(), Inst, Val, Address,
743 static DecodeStatus DecodeMSROperand(llvm::MCInst &Inst,
746 const void *Decoder) {
747 return DecodeSysRegOperand(A64SysReg::MSRMapper(), Inst, Val, Address,
751 static DecodeStatus DecodeSingleIndexedInstruction(llvm::MCInst &Inst,
754 const void *Decoder) {
755 unsigned Rt = fieldFromInstruction(Insn, 0, 5);
756 unsigned Rn = fieldFromInstruction(Insn, 5, 5);
757 unsigned Imm9 = fieldFromInstruction(Insn, 12, 9);
759 unsigned Opc = fieldFromInstruction(Insn, 22, 2);
760 unsigned V = fieldFromInstruction(Insn, 26, 1);
761 unsigned Size = fieldFromInstruction(Insn, 30, 2);
763 if (Opc == 0 || (V == 1 && Opc == 2)) {
764 // It's a store, the MCInst gets: Rn_wb, Rt, Rn, Imm
765 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
768 if (V == 0 && (Opc == 2 || Size == 3)) {
769 DecodeGPR64RegisterClass(Inst, Rt, Address, Decoder);
771 DecodeGPR32RegisterClass(Inst, Rt, Address, Decoder);
772 } else if (V == 1 && (Opc & 2)) {
773 DecodeFPR128RegisterClass(Inst, Rt, Address, Decoder);
777 DecodeFPR8RegisterClass(Inst, Rt, Address, Decoder);
780 DecodeFPR16RegisterClass(Inst, Rt, Address, Decoder);
783 DecodeFPR32RegisterClass(Inst, Rt, Address, Decoder);
786 DecodeFPR64RegisterClass(Inst, Rt, Address, Decoder);
791 if (Opc != 0 && (V != 1 || Opc != 2)) {
792 // It's a load, the MCInst gets: Rt, Rn_wb, Rn, Imm
793 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
796 DecodeGPR64xspRegisterClass(Inst, Rn, Address, Decoder);
798 Inst.addOperand(MCOperand::CreateImm(Imm9));
800 // N.b. The official documentation says undpredictable if Rt == Rn, but this
801 // takes place at the architectural rather than encoding level:
803 // "STR xzr, [sp], #4" is perfectly valid.
804 if (V == 0 && Rt == Rn && Rn != 31)
805 return MCDisassembler::SoftFail;
807 return MCDisassembler::Success;
810 static MCDisassembler *createAArch64Disassembler(const Target &T,
811 const MCSubtargetInfo &STI) {
812 return new AArch64Disassembler(STI, T.createMCRegInfo(""));
815 extern "C" void LLVMInitializeAArch64Disassembler() {
816 TargetRegistry::RegisterMCDisassembler(TheAArch64Target,
817 createAArch64Disassembler);
820 template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf>
822 DecodeNeonMovImmShiftOperand(llvm::MCInst &Inst, unsigned ShiftAmount,
823 uint64_t Address, const void *Decoder) {
825 if (Ext == A64SE::LSL)
827 else if (Ext != A64SE::MSL)
828 return MCDisassembler::Fail;
830 // MSL and LSLH accepts encoded shift amount 0 or 1.
831 if ((!IsLSL || (IsLSL && IsHalf)) && ShiftAmount != 0 && ShiftAmount != 1)
832 return MCDisassembler::Fail;
834 // LSL accepts encoded shift amount 0, 1, 2 or 3.
835 if (IsLSL && ShiftAmount > 3)
836 return MCDisassembler::Fail;
838 Inst.addOperand(MCOperand::CreateImm(ShiftAmount));
839 return MCDisassembler::Success;