1 //===- ARM64Disassembler.cpp - Disassembler for ARM64 -----------*- C++ -*-===//
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 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
13 #define DEBUG_TYPE "arm64-disassembler"
15 #include "ARM64Disassembler.h"
16 #include "ARM64Subtarget.h"
17 #include "MCTargetDesc/ARM64BaseInfo.h"
18 #include "MCTargetDesc/ARM64AddressingModes.h"
19 #include "llvm/MC/MCInst.h"
20 #include "llvm/MC/MCExpr.h"
21 #include "llvm/MC/MCContext.h"
22 #include "llvm/MC/MCFixedLenDisassembler.h"
23 #include "llvm/Support/Debug.h"
24 #include "llvm/Support/MemoryObject.h"
25 #include "llvm/Support/TargetRegistry.h"
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/Support/Format.h"
28 #include "llvm/Support/raw_ostream.h"
30 // Pull DecodeStatus and its enum values into the global namespace.
31 typedef llvm::MCDisassembler::DecodeStatus DecodeStatus;
33 // Forward declare these because the autogenerated code will reference them.
34 // Definitions are further down.
35 static DecodeStatus DecodeFPR128RegisterClass(llvm::MCInst &Inst,
36 unsigned RegNo, uint64_t Address,
38 static DecodeStatus DecodeFPR128_loRegisterClass(llvm::MCInst &Inst,
42 static DecodeStatus DecodeFPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
45 static DecodeStatus DecodeFPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
48 static DecodeStatus DecodeFPR16RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
51 static DecodeStatus DecodeFPR8RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
54 static DecodeStatus DecodeGPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
57 static DecodeStatus DecodeGPR64spRegisterClass(llvm::MCInst &Inst,
58 unsigned RegNo, uint64_t Address,
60 static DecodeStatus DecodeGPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
63 static DecodeStatus DecodeGPR32spRegisterClass(llvm::MCInst &Inst,
64 unsigned RegNo, uint64_t Address,
66 static DecodeStatus DecodeQQRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
69 static DecodeStatus DecodeQQQRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
72 static DecodeStatus DecodeQQQQRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
75 static DecodeStatus DecodeDDRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
78 static DecodeStatus DecodeDDDRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
81 static DecodeStatus DecodeDDDDRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
85 static DecodeStatus DecodeFixedPointScaleImm(llvm::MCInst &Inst, unsigned Imm,
88 static DecodeStatus DecodeCondBranchTarget(llvm::MCInst &Inst, unsigned Imm,
91 static DecodeStatus DecodeSystemRegister(llvm::MCInst &Inst, unsigned Imm,
92 uint64_t Address, const void *Decoder);
93 static DecodeStatus DecodeThreeAddrSRegInstruction(llvm::MCInst &Inst,
97 static DecodeStatus DecodeMoveImmInstruction(llvm::MCInst &Inst, uint32_t insn,
100 static DecodeStatus DecodeUnsignedLdStInstruction(llvm::MCInst &Inst,
103 const void *Decoder);
104 static DecodeStatus DecodeSignedLdStInstruction(llvm::MCInst &Inst,
105 uint32_t insn, uint64_t Address,
106 const void *Decoder);
107 static DecodeStatus DecodeExclusiveLdStInstruction(llvm::MCInst &Inst,
110 const void *Decoder);
111 static DecodeStatus DecodePairLdStInstruction(llvm::MCInst &Inst, uint32_t insn,
113 const void *Decoder);
114 static DecodeStatus DecodeRegOffsetLdStInstruction(llvm::MCInst &Inst,
117 const void *Decoder);
118 static DecodeStatus DecodeAddSubERegInstruction(llvm::MCInst &Inst,
119 uint32_t insn, uint64_t Address,
120 const void *Decoder);
121 static DecodeStatus DecodeLogicalImmInstruction(llvm::MCInst &Inst,
122 uint32_t insn, uint64_t Address,
123 const void *Decoder);
124 static DecodeStatus DecodeModImmInstruction(llvm::MCInst &Inst, uint32_t insn,
126 const void *Decoder);
127 static DecodeStatus DecodeModImmTiedInstruction(llvm::MCInst &Inst,
128 uint32_t insn, uint64_t Address,
129 const void *Decoder);
130 static DecodeStatus DecodeAdrInstruction(llvm::MCInst &Inst, uint32_t insn,
131 uint64_t Address, const void *Decoder);
132 static DecodeStatus DecodeBaseAddSubImm(llvm::MCInst &Inst, uint32_t insn,
133 uint64_t Address, const void *Decoder);
134 static DecodeStatus DecodeUnconditionalBranch(llvm::MCInst &Inst, uint32_t insn,
136 const void *Decoder);
137 static DecodeStatus DecodeSystemCPSRInstruction(llvm::MCInst &Inst,
138 uint32_t insn, uint64_t Address,
139 const void *Decoder);
140 static DecodeStatus DecodeTestAndBranch(llvm::MCInst &Inst, uint32_t insn,
141 uint64_t Address, const void *Decoder);
142 static DecodeStatus DecodeSIMDLdStPost(llvm::MCInst &Inst, uint32_t insn,
143 uint64_t Addr, const void *Decoder);
144 static DecodeStatus DecodeSIMDLdStSingle(llvm::MCInst &Inst, uint32_t insn,
145 uint64_t Addr, const void *Decoder);
146 static DecodeStatus DecodeSIMDLdStSingleTied(llvm::MCInst &Inst, uint32_t insn,
148 const void *Decoder);
150 static DecodeStatus DecodeVecShiftR64Imm(llvm::MCInst &Inst, unsigned Imm,
151 uint64_t Addr, const void *Decoder);
152 static DecodeStatus DecodeVecShiftR64ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
154 const void *Decoder);
155 static DecodeStatus DecodeVecShiftR32Imm(llvm::MCInst &Inst, unsigned Imm,
156 uint64_t Addr, const void *Decoder);
157 static DecodeStatus DecodeVecShiftR32ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
159 const void *Decoder);
160 static DecodeStatus DecodeVecShiftR16Imm(llvm::MCInst &Inst, unsigned Imm,
161 uint64_t Addr, const void *Decoder);
162 static DecodeStatus DecodeVecShiftR16ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
164 const void *Decoder);
165 static DecodeStatus DecodeVecShiftR8Imm(llvm::MCInst &Inst, unsigned Imm,
166 uint64_t Addr, const void *Decoder);
167 static DecodeStatus DecodeVecShiftL64Imm(llvm::MCInst &Inst, unsigned Imm,
168 uint64_t Addr, const void *Decoder);
169 static DecodeStatus DecodeVecShiftL32Imm(llvm::MCInst &Inst, unsigned Imm,
170 uint64_t Addr, const void *Decoder);
171 static DecodeStatus DecodeVecShiftL16Imm(llvm::MCInst &Inst, unsigned Imm,
172 uint64_t Addr, const void *Decoder);
173 static DecodeStatus DecodeVecShiftL8Imm(llvm::MCInst &Inst, unsigned Imm,
174 uint64_t Addr, const void *Decoder);
176 #include "ARM64GenDisassemblerTables.inc"
177 #include "ARM64GenInstrInfo.inc"
179 using namespace llvm;
181 #define Success llvm::MCDisassembler::Success
182 #define Fail llvm::MCDisassembler::Fail
184 static MCDisassembler *createARM64Disassembler(const Target &T,
185 const MCSubtargetInfo &STI) {
186 return new ARM64Disassembler(STI);
189 DecodeStatus ARM64Disassembler::getInstruction(MCInst &MI, uint64_t &Size,
190 const MemoryObject &Region,
193 raw_ostream &cs) const {
198 // We want to read exactly 4 bytes of data.
199 if (Region.readBytes(Address, 4, (uint8_t *)bytes) == -1)
202 // Encoded as a small-endian 32-bit word in the stream.
204 (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0] << 0);
206 // Calling the auto-generated decoder function.
207 DecodeStatus result =
208 decodeInstruction(DecoderTable32, MI, insn, Address, this, STI);
217 static MCSymbolRefExpr::VariantKind
218 getVariant(uint64_t LLVMDisassembler_VariantKind) {
219 switch (LLVMDisassembler_VariantKind) {
220 case LLVMDisassembler_VariantKind_None:
221 return MCSymbolRefExpr::VK_None;
222 case LLVMDisassembler_VariantKind_ARM64_PAGE:
223 return MCSymbolRefExpr::VK_PAGE;
224 case LLVMDisassembler_VariantKind_ARM64_PAGEOFF:
225 return MCSymbolRefExpr::VK_PAGEOFF;
226 case LLVMDisassembler_VariantKind_ARM64_GOTPAGE:
227 return MCSymbolRefExpr::VK_GOTPAGE;
228 case LLVMDisassembler_VariantKind_ARM64_GOTPAGEOFF:
229 return MCSymbolRefExpr::VK_GOTPAGEOFF;
230 case LLVMDisassembler_VariantKind_ARM64_TLVP:
231 case LLVMDisassembler_VariantKind_ARM64_TLVOFF:
233 assert("bad LLVMDisassembler_VariantKind");
234 return MCSymbolRefExpr::VK_None;
238 /// tryAddingSymbolicOperand - tryAddingSymbolicOperand trys to add a symbolic
239 /// operand in place of the immediate Value in the MCInst. The immediate
240 /// Value has not had any PC adjustment made by the caller. If the instruction
241 /// is a branch that adds the PC to the immediate Value then isBranch is
242 /// Success, else Fail. If the getOpInfo() function was set as part of the
243 /// setupForSymbolicDisassembly() call then that function is called to get any
244 /// symbolic information at the Address for this instrution. If that returns
245 /// non-zero then the symbolic information it returns is used to create an
246 /// MCExpr and that is added as an operand to the MCInst. If getOpInfo()
247 /// returns zero and isBranch is Success then a symbol look up for
248 /// Address + Value is done and if a symbol is found an MCExpr is created with
249 /// that, else an MCExpr with Address + Value is created. If getOpInfo()
250 /// returns zero and isBranch is Fail then the the Opcode of the MCInst is
251 /// tested and for ADRP an other instructions that help to load of pointers
252 /// a symbol look up is done to see it is returns a specific reference type
253 /// to add to the comment stream. This function returns Success if it adds
254 /// an operand to the MCInst and Fail otherwise.
255 bool ARM64Disassembler::tryAddingSymbolicOperand(uint64_t Address, int Value,
257 uint64_t InstSize, MCInst &MI,
258 uint32_t insn) const {
259 LLVMOpInfoCallback getOpInfo = getLLVMOpInfoCallback();
261 struct LLVMOpInfo1 SymbolicOp;
262 memset(&SymbolicOp, '\0', sizeof(struct LLVMOpInfo1));
263 SymbolicOp.Value = Value;
264 void *DisInfo = getDisInfoBlock();
265 uint64_t ReferenceType;
266 const char *ReferenceName;
268 LLVMSymbolLookupCallback SymbolLookUp = getLLVMSymbolLookupCallback();
270 !getOpInfo(DisInfo, Address, 0 /* Offset */, InstSize, 1, &SymbolicOp)) {
273 ReferenceType = LLVMDisassembler_ReferenceType_In_Branch;
274 Name = SymbolLookUp(DisInfo, Address + Value, &ReferenceType, Address,
277 SymbolicOp.AddSymbol.Name = Name;
278 SymbolicOp.AddSymbol.Present = Success;
279 SymbolicOp.Value = 0;
281 SymbolicOp.Value = Address + Value;
283 if (ReferenceType == LLVMDisassembler_ReferenceType_Out_SymbolStub)
284 (*CommentStream) << "symbol stub for: " << ReferenceName;
285 else if (ReferenceType ==
286 LLVMDisassembler_ReferenceType_Out_Objc_Message)
287 (*CommentStream) << "Objc message: " << ReferenceName;
291 } else if (MI.getOpcode() == ARM64::ADRP) {
293 ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_ADRP;
294 Name = SymbolLookUp(DisInfo, insn, &ReferenceType, Address,
296 (*CommentStream) << format("0x%llx",
297 0xfffffffffffff000LL & (Address + Value));
301 } else if (MI.getOpcode() == ARM64::ADDXri ||
302 MI.getOpcode() == ARM64::LDRXui ||
303 MI.getOpcode() == ARM64::LDRXl || MI.getOpcode() == ARM64::ADR) {
305 if (MI.getOpcode() == ARM64::ADDXri)
306 ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_ADDXri;
307 else if (MI.getOpcode() == ARM64::LDRXui)
308 ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_LDRXui;
309 if (MI.getOpcode() == ARM64::LDRXl) {
310 ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_LDRXl;
311 Name = SymbolLookUp(DisInfo, Address + Value, &ReferenceType, Address,
313 } else if (MI.getOpcode() == ARM64::ADR) {
314 ReferenceType = LLVMDisassembler_ReferenceType_In_ARM64_ADR;
315 Name = SymbolLookUp(DisInfo, Address + Value, &ReferenceType, Address,
318 Name = SymbolLookUp(DisInfo, insn, &ReferenceType, Address,
321 if (ReferenceType == LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr)
322 (*CommentStream) << "literal pool symbol address: " << ReferenceName;
323 else if (ReferenceType ==
324 LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr)
325 (*CommentStream) << "literal pool for: \"" << ReferenceName << "\"";
326 else if (ReferenceType ==
327 LLVMDisassembler_ReferenceType_Out_Objc_CFString_Ref)
328 (*CommentStream) << "Objc cfstring ref: @\"" << ReferenceName << "\"";
329 else if (ReferenceType ==
330 LLVMDisassembler_ReferenceType_Out_Objc_Message)
331 (*CommentStream) << "Objc message: " << ReferenceName;
332 else if (ReferenceType ==
333 LLVMDisassembler_ReferenceType_Out_Objc_Message_Ref)
334 (*CommentStream) << "Objc message ref: " << ReferenceName;
335 else if (ReferenceType ==
336 LLVMDisassembler_ReferenceType_Out_Objc_Selector_Ref)
337 (*CommentStream) << "Objc selector ref: " << ReferenceName;
338 else if (ReferenceType ==
339 LLVMDisassembler_ReferenceType_Out_Objc_Class_Ref)
340 (*CommentStream) << "Objc class ref: " << ReferenceName;
341 // For these instructions, the SymbolLookUp() above is just to get the
342 // ReferenceType and ReferenceName. We want to make sure not to
343 // fall through so we don't build an MCExpr to leave the disassembly
344 // of the immediate values of these instructions to the InstPrinter.
354 MCContext *Ctx = getMCContext();
355 const MCExpr *Add = NULL;
356 if (SymbolicOp.AddSymbol.Present) {
357 if (SymbolicOp.AddSymbol.Name) {
358 StringRef Name(SymbolicOp.AddSymbol.Name);
359 MCSymbol *Sym = Ctx->GetOrCreateSymbol(Name);
360 MCSymbolRefExpr::VariantKind Variant = getVariant(SymbolicOp.VariantKind);
361 if (Variant != MCSymbolRefExpr::VK_None)
362 Add = MCSymbolRefExpr::Create(Sym, Variant, *Ctx);
364 Add = MCSymbolRefExpr::Create(Sym, *Ctx);
366 Add = MCConstantExpr::Create(SymbolicOp.AddSymbol.Value, *Ctx);
370 const MCExpr *Sub = NULL;
371 if (SymbolicOp.SubtractSymbol.Present) {
372 if (SymbolicOp.SubtractSymbol.Name) {
373 StringRef Name(SymbolicOp.SubtractSymbol.Name);
374 MCSymbol *Sym = Ctx->GetOrCreateSymbol(Name);
375 Sub = MCSymbolRefExpr::Create(Sym, *Ctx);
377 Sub = MCConstantExpr::Create(SymbolicOp.SubtractSymbol.Value, *Ctx);
381 const MCExpr *Off = NULL;
382 if (SymbolicOp.Value != 0)
383 Off = MCConstantExpr::Create(SymbolicOp.Value, *Ctx);
389 LHS = MCBinaryExpr::CreateSub(Add, Sub, *Ctx);
391 LHS = MCUnaryExpr::CreateMinus(Sub, *Ctx);
393 Expr = MCBinaryExpr::CreateAdd(LHS, Off, *Ctx);
398 Expr = MCBinaryExpr::CreateAdd(Add, Off, *Ctx);
405 Expr = MCConstantExpr::Create(0, *Ctx);
408 MI.addOperand(MCOperand::CreateExpr(Expr));
413 extern "C" void LLVMInitializeARM64Disassembler() {
414 TargetRegistry::RegisterMCDisassembler(TheARM64Target,
415 createARM64Disassembler);
418 static const unsigned FPR128DecoderTable[] = {
419 ARM64::Q0, ARM64::Q1, ARM64::Q2, ARM64::Q3, ARM64::Q4, ARM64::Q5,
420 ARM64::Q6, ARM64::Q7, ARM64::Q8, ARM64::Q9, ARM64::Q10, ARM64::Q11,
421 ARM64::Q12, ARM64::Q13, ARM64::Q14, ARM64::Q15, ARM64::Q16, ARM64::Q17,
422 ARM64::Q18, ARM64::Q19, ARM64::Q20, ARM64::Q21, ARM64::Q22, ARM64::Q23,
423 ARM64::Q24, ARM64::Q25, ARM64::Q26, ARM64::Q27, ARM64::Q28, ARM64::Q29,
424 ARM64::Q30, ARM64::Q31
427 static DecodeStatus DecodeFPR128RegisterClass(MCInst &Inst, unsigned RegNo,
429 const void *Decoder) {
433 unsigned Register = FPR128DecoderTable[RegNo];
434 Inst.addOperand(MCOperand::CreateReg(Register));
438 static DecodeStatus DecodeFPR128_loRegisterClass(MCInst &Inst, unsigned RegNo,
440 const void *Decoder) {
443 return DecodeFPR128RegisterClass(Inst, RegNo, Addr, Decoder);
446 static const unsigned FPR64DecoderTable[] = {
447 ARM64::D0, ARM64::D1, ARM64::D2, ARM64::D3, ARM64::D4, ARM64::D5,
448 ARM64::D6, ARM64::D7, ARM64::D8, ARM64::D9, ARM64::D10, ARM64::D11,
449 ARM64::D12, ARM64::D13, ARM64::D14, ARM64::D15, ARM64::D16, ARM64::D17,
450 ARM64::D18, ARM64::D19, ARM64::D20, ARM64::D21, ARM64::D22, ARM64::D23,
451 ARM64::D24, ARM64::D25, ARM64::D26, ARM64::D27, ARM64::D28, ARM64::D29,
452 ARM64::D30, ARM64::D31
455 static DecodeStatus DecodeFPR64RegisterClass(MCInst &Inst, unsigned RegNo,
457 const void *Decoder) {
461 unsigned Register = FPR64DecoderTable[RegNo];
462 Inst.addOperand(MCOperand::CreateReg(Register));
466 static const unsigned FPR32DecoderTable[] = {
467 ARM64::S0, ARM64::S1, ARM64::S2, ARM64::S3, ARM64::S4, ARM64::S5,
468 ARM64::S6, ARM64::S7, ARM64::S8, ARM64::S9, ARM64::S10, ARM64::S11,
469 ARM64::S12, ARM64::S13, ARM64::S14, ARM64::S15, ARM64::S16, ARM64::S17,
470 ARM64::S18, ARM64::S19, ARM64::S20, ARM64::S21, ARM64::S22, ARM64::S23,
471 ARM64::S24, ARM64::S25, ARM64::S26, ARM64::S27, ARM64::S28, ARM64::S29,
472 ARM64::S30, ARM64::S31
475 static DecodeStatus DecodeFPR32RegisterClass(MCInst &Inst, unsigned RegNo,
477 const void *Decoder) {
481 unsigned Register = FPR32DecoderTable[RegNo];
482 Inst.addOperand(MCOperand::CreateReg(Register));
486 static const unsigned FPR16DecoderTable[] = {
487 ARM64::H0, ARM64::H1, ARM64::H2, ARM64::H3, ARM64::H4, ARM64::H5,
488 ARM64::H6, ARM64::H7, ARM64::H8, ARM64::H9, ARM64::H10, ARM64::H11,
489 ARM64::H12, ARM64::H13, ARM64::H14, ARM64::H15, ARM64::H16, ARM64::H17,
490 ARM64::H18, ARM64::H19, ARM64::H20, ARM64::H21, ARM64::H22, ARM64::H23,
491 ARM64::H24, ARM64::H25, ARM64::H26, ARM64::H27, ARM64::H28, ARM64::H29,
492 ARM64::H30, ARM64::H31
495 static DecodeStatus DecodeFPR16RegisterClass(MCInst &Inst, unsigned RegNo,
497 const void *Decoder) {
501 unsigned Register = FPR16DecoderTable[RegNo];
502 Inst.addOperand(MCOperand::CreateReg(Register));
506 static const unsigned FPR8DecoderTable[] = {
507 ARM64::B0, ARM64::B1, ARM64::B2, ARM64::B3, ARM64::B4, ARM64::B5,
508 ARM64::B6, ARM64::B7, ARM64::B8, ARM64::B9, ARM64::B10, ARM64::B11,
509 ARM64::B12, ARM64::B13, ARM64::B14, ARM64::B15, ARM64::B16, ARM64::B17,
510 ARM64::B18, ARM64::B19, ARM64::B20, ARM64::B21, ARM64::B22, ARM64::B23,
511 ARM64::B24, ARM64::B25, ARM64::B26, ARM64::B27, ARM64::B28, ARM64::B29,
512 ARM64::B30, ARM64::B31
515 static DecodeStatus DecodeFPR8RegisterClass(MCInst &Inst, unsigned RegNo,
517 const void *Decoder) {
521 unsigned Register = FPR8DecoderTable[RegNo];
522 Inst.addOperand(MCOperand::CreateReg(Register));
526 static const unsigned GPR64DecoderTable[] = {
527 ARM64::X0, ARM64::X1, ARM64::X2, ARM64::X3, ARM64::X4, ARM64::X5,
528 ARM64::X6, ARM64::X7, ARM64::X8, ARM64::X9, ARM64::X10, ARM64::X11,
529 ARM64::X12, ARM64::X13, ARM64::X14, ARM64::X15, ARM64::X16, ARM64::X17,
530 ARM64::X18, ARM64::X19, ARM64::X20, ARM64::X21, ARM64::X22, ARM64::X23,
531 ARM64::X24, ARM64::X25, ARM64::X26, ARM64::X27, ARM64::X28, ARM64::FP,
532 ARM64::LR, ARM64::XZR
535 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst, unsigned RegNo,
537 const void *Decoder) {
541 unsigned Register = GPR64DecoderTable[RegNo];
542 Inst.addOperand(MCOperand::CreateReg(Register));
546 static DecodeStatus DecodeGPR64spRegisterClass(MCInst &Inst, unsigned RegNo,
548 const void *Decoder) {
551 unsigned Register = GPR64DecoderTable[RegNo];
552 if (Register == ARM64::XZR)
553 Register = ARM64::SP;
554 Inst.addOperand(MCOperand::CreateReg(Register));
558 static const unsigned GPR32DecoderTable[] = {
559 ARM64::W0, ARM64::W1, ARM64::W2, ARM64::W3, ARM64::W4, ARM64::W5,
560 ARM64::W6, ARM64::W7, ARM64::W8, ARM64::W9, ARM64::W10, ARM64::W11,
561 ARM64::W12, ARM64::W13, ARM64::W14, ARM64::W15, ARM64::W16, ARM64::W17,
562 ARM64::W18, ARM64::W19, ARM64::W20, ARM64::W21, ARM64::W22, ARM64::W23,
563 ARM64::W24, ARM64::W25, ARM64::W26, ARM64::W27, ARM64::W28, ARM64::W29,
564 ARM64::W30, ARM64::WZR
567 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst, unsigned RegNo,
569 const void *Decoder) {
573 unsigned Register = GPR32DecoderTable[RegNo];
574 Inst.addOperand(MCOperand::CreateReg(Register));
578 static DecodeStatus DecodeGPR32spRegisterClass(MCInst &Inst, unsigned RegNo,
580 const void *Decoder) {
584 unsigned Register = GPR32DecoderTable[RegNo];
585 if (Register == ARM64::WZR)
586 Register = ARM64::WSP;
587 Inst.addOperand(MCOperand::CreateReg(Register));
591 static const unsigned VectorDecoderTable[] = {
592 ARM64::Q0, ARM64::Q1, ARM64::Q2, ARM64::Q3, ARM64::Q4, ARM64::Q5,
593 ARM64::Q6, ARM64::Q7, ARM64::Q8, ARM64::Q9, ARM64::Q10, ARM64::Q11,
594 ARM64::Q12, ARM64::Q13, ARM64::Q14, ARM64::Q15, ARM64::Q16, ARM64::Q17,
595 ARM64::Q18, ARM64::Q19, ARM64::Q20, ARM64::Q21, ARM64::Q22, ARM64::Q23,
596 ARM64::Q24, ARM64::Q25, ARM64::Q26, ARM64::Q27, ARM64::Q28, ARM64::Q29,
597 ARM64::Q30, ARM64::Q31
600 static DecodeStatus DecodeVectorRegisterClass(MCInst &Inst, unsigned RegNo,
602 const void *Decoder) {
606 unsigned Register = VectorDecoderTable[RegNo];
607 Inst.addOperand(MCOperand::CreateReg(Register));
611 static const unsigned QQDecoderTable[] = {
612 ARM64::Q0_Q1, ARM64::Q1_Q2, ARM64::Q2_Q3, ARM64::Q3_Q4,
613 ARM64::Q4_Q5, ARM64::Q5_Q6, ARM64::Q6_Q7, ARM64::Q7_Q8,
614 ARM64::Q8_Q9, ARM64::Q9_Q10, ARM64::Q10_Q11, ARM64::Q11_Q12,
615 ARM64::Q12_Q13, ARM64::Q13_Q14, ARM64::Q14_Q15, ARM64::Q15_Q16,
616 ARM64::Q16_Q17, ARM64::Q17_Q18, ARM64::Q18_Q19, ARM64::Q19_Q20,
617 ARM64::Q20_Q21, ARM64::Q21_Q22, ARM64::Q22_Q23, ARM64::Q23_Q24,
618 ARM64::Q24_Q25, ARM64::Q25_Q26, ARM64::Q26_Q27, ARM64::Q27_Q28,
619 ARM64::Q28_Q29, ARM64::Q29_Q30, ARM64::Q30_Q31, ARM64::Q31_Q0
622 static DecodeStatus DecodeQQRegisterClass(MCInst &Inst, unsigned RegNo,
623 uint64_t Addr, const void *Decoder) {
626 unsigned Register = QQDecoderTable[RegNo];
627 Inst.addOperand(MCOperand::CreateReg(Register));
631 static const unsigned QQQDecoderTable[] = {
632 ARM64::Q0_Q1_Q2, ARM64::Q1_Q2_Q3, ARM64::Q2_Q3_Q4,
633 ARM64::Q3_Q4_Q5, ARM64::Q4_Q5_Q6, ARM64::Q5_Q6_Q7,
634 ARM64::Q6_Q7_Q8, ARM64::Q7_Q8_Q9, ARM64::Q8_Q9_Q10,
635 ARM64::Q9_Q10_Q11, ARM64::Q10_Q11_Q12, ARM64::Q11_Q12_Q13,
636 ARM64::Q12_Q13_Q14, ARM64::Q13_Q14_Q15, ARM64::Q14_Q15_Q16,
637 ARM64::Q15_Q16_Q17, ARM64::Q16_Q17_Q18, ARM64::Q17_Q18_Q19,
638 ARM64::Q18_Q19_Q20, ARM64::Q19_Q20_Q21, ARM64::Q20_Q21_Q22,
639 ARM64::Q21_Q22_Q23, ARM64::Q22_Q23_Q24, ARM64::Q23_Q24_Q25,
640 ARM64::Q24_Q25_Q26, ARM64::Q25_Q26_Q27, ARM64::Q26_Q27_Q28,
641 ARM64::Q27_Q28_Q29, ARM64::Q28_Q29_Q30, ARM64::Q29_Q30_Q31,
642 ARM64::Q30_Q31_Q0, ARM64::Q31_Q0_Q1
645 static DecodeStatus DecodeQQQRegisterClass(MCInst &Inst, unsigned RegNo,
646 uint64_t Addr, const void *Decoder) {
649 unsigned Register = QQQDecoderTable[RegNo];
650 Inst.addOperand(MCOperand::CreateReg(Register));
654 static const unsigned QQQQDecoderTable[] = {
655 ARM64::Q0_Q1_Q2_Q3, ARM64::Q1_Q2_Q3_Q4, ARM64::Q2_Q3_Q4_Q5,
656 ARM64::Q3_Q4_Q5_Q6, ARM64::Q4_Q5_Q6_Q7, ARM64::Q5_Q6_Q7_Q8,
657 ARM64::Q6_Q7_Q8_Q9, ARM64::Q7_Q8_Q9_Q10, ARM64::Q8_Q9_Q10_Q11,
658 ARM64::Q9_Q10_Q11_Q12, ARM64::Q10_Q11_Q12_Q13, ARM64::Q11_Q12_Q13_Q14,
659 ARM64::Q12_Q13_Q14_Q15, ARM64::Q13_Q14_Q15_Q16, ARM64::Q14_Q15_Q16_Q17,
660 ARM64::Q15_Q16_Q17_Q18, ARM64::Q16_Q17_Q18_Q19, ARM64::Q17_Q18_Q19_Q20,
661 ARM64::Q18_Q19_Q20_Q21, ARM64::Q19_Q20_Q21_Q22, ARM64::Q20_Q21_Q22_Q23,
662 ARM64::Q21_Q22_Q23_Q24, ARM64::Q22_Q23_Q24_Q25, ARM64::Q23_Q24_Q25_Q26,
663 ARM64::Q24_Q25_Q26_Q27, ARM64::Q25_Q26_Q27_Q28, ARM64::Q26_Q27_Q28_Q29,
664 ARM64::Q27_Q28_Q29_Q30, ARM64::Q28_Q29_Q30_Q31, ARM64::Q29_Q30_Q31_Q0,
665 ARM64::Q30_Q31_Q0_Q1, ARM64::Q31_Q0_Q1_Q2
668 static DecodeStatus DecodeQQQQRegisterClass(MCInst &Inst, unsigned RegNo,
670 const void *Decoder) {
673 unsigned Register = QQQQDecoderTable[RegNo];
674 Inst.addOperand(MCOperand::CreateReg(Register));
678 static const unsigned DDDecoderTable[] = {
679 ARM64::D0_D1, ARM64::D1_D2, ARM64::D2_D3, ARM64::D3_D4,
680 ARM64::D4_D5, ARM64::D5_D6, ARM64::D6_D7, ARM64::D7_D8,
681 ARM64::D8_D9, ARM64::D9_D10, ARM64::D10_D11, ARM64::D11_D12,
682 ARM64::D12_D13, ARM64::D13_D14, ARM64::D14_D15, ARM64::D15_D16,
683 ARM64::D16_D17, ARM64::D17_D18, ARM64::D18_D19, ARM64::D19_D20,
684 ARM64::D20_D21, ARM64::D21_D22, ARM64::D22_D23, ARM64::D23_D24,
685 ARM64::D24_D25, ARM64::D25_D26, ARM64::D26_D27, ARM64::D27_D28,
686 ARM64::D28_D29, ARM64::D29_D30, ARM64::D30_D31, ARM64::D31_D0
689 static DecodeStatus DecodeDDRegisterClass(MCInst &Inst, unsigned RegNo,
690 uint64_t Addr, const void *Decoder) {
693 unsigned Register = DDDecoderTable[RegNo];
694 Inst.addOperand(MCOperand::CreateReg(Register));
698 static const unsigned DDDDecoderTable[] = {
699 ARM64::D0_D1_D2, ARM64::D1_D2_D3, ARM64::D2_D3_D4,
700 ARM64::D3_D4_D5, ARM64::D4_D5_D6, ARM64::D5_D6_D7,
701 ARM64::D6_D7_D8, ARM64::D7_D8_D9, ARM64::D8_D9_D10,
702 ARM64::D9_D10_D11, ARM64::D10_D11_D12, ARM64::D11_D12_D13,
703 ARM64::D12_D13_D14, ARM64::D13_D14_D15, ARM64::D14_D15_D16,
704 ARM64::D15_D16_D17, ARM64::D16_D17_D18, ARM64::D17_D18_D19,
705 ARM64::D18_D19_D20, ARM64::D19_D20_D21, ARM64::D20_D21_D22,
706 ARM64::D21_D22_D23, ARM64::D22_D23_D24, ARM64::D23_D24_D25,
707 ARM64::D24_D25_D26, ARM64::D25_D26_D27, ARM64::D26_D27_D28,
708 ARM64::D27_D28_D29, ARM64::D28_D29_D30, ARM64::D29_D30_D31,
709 ARM64::D30_D31_D0, ARM64::D31_D0_D1
712 static DecodeStatus DecodeDDDRegisterClass(MCInst &Inst, unsigned RegNo,
713 uint64_t Addr, const void *Decoder) {
716 unsigned Register = DDDDecoderTable[RegNo];
717 Inst.addOperand(MCOperand::CreateReg(Register));
721 static const unsigned DDDDDecoderTable[] = {
722 ARM64::D0_D1_D2_D3, ARM64::D1_D2_D3_D4, ARM64::D2_D3_D4_D5,
723 ARM64::D3_D4_D5_D6, ARM64::D4_D5_D6_D7, ARM64::D5_D6_D7_D8,
724 ARM64::D6_D7_D8_D9, ARM64::D7_D8_D9_D10, ARM64::D8_D9_D10_D11,
725 ARM64::D9_D10_D11_D12, ARM64::D10_D11_D12_D13, ARM64::D11_D12_D13_D14,
726 ARM64::D12_D13_D14_D15, ARM64::D13_D14_D15_D16, ARM64::D14_D15_D16_D17,
727 ARM64::D15_D16_D17_D18, ARM64::D16_D17_D18_D19, ARM64::D17_D18_D19_D20,
728 ARM64::D18_D19_D20_D21, ARM64::D19_D20_D21_D22, ARM64::D20_D21_D22_D23,
729 ARM64::D21_D22_D23_D24, ARM64::D22_D23_D24_D25, ARM64::D23_D24_D25_D26,
730 ARM64::D24_D25_D26_D27, ARM64::D25_D26_D27_D28, ARM64::D26_D27_D28_D29,
731 ARM64::D27_D28_D29_D30, ARM64::D28_D29_D30_D31, ARM64::D29_D30_D31_D0,
732 ARM64::D30_D31_D0_D1, ARM64::D31_D0_D1_D2
735 static DecodeStatus DecodeDDDDRegisterClass(MCInst &Inst, unsigned RegNo,
737 const void *Decoder) {
740 unsigned Register = DDDDDecoderTable[RegNo];
741 Inst.addOperand(MCOperand::CreateReg(Register));
745 static DecodeStatus DecodeFixedPointScaleImm(llvm::MCInst &Inst, unsigned Imm,
747 const void *Decoder) {
748 Inst.addOperand(MCOperand::CreateImm(64 - Imm));
752 static DecodeStatus DecodeCondBranchTarget(llvm::MCInst &Inst, unsigned Imm,
753 uint64_t Addr, const void *Decoder) {
754 int64_t ImmVal = Imm;
755 const ARM64Disassembler *Dis =
756 static_cast<const ARM64Disassembler *>(Decoder);
758 // Sign-extend 19-bit immediate.
759 if (ImmVal & (1 << (19 - 1)))
760 ImmVal |= ~((1LL << 19) - 1);
762 if (!Dis->tryAddingSymbolicOperand(Addr, ImmVal << 2,
763 Inst.getOpcode() != ARM64::LDRXl, 4, Inst))
764 Inst.addOperand(MCOperand::CreateImm(ImmVal));
768 static DecodeStatus DecodeSystemRegister(llvm::MCInst &Inst, unsigned Imm,
770 const void *Decoder) {
771 Inst.addOperand(MCOperand::CreateImm(Imm | 0x8000));
775 static DecodeStatus DecodeVecShiftRImm(llvm::MCInst &Inst, unsigned Imm,
777 Inst.addOperand(MCOperand::CreateImm(Add - Imm));
781 static DecodeStatus DecodeVecShiftLImm(llvm::MCInst &Inst, unsigned Imm,
783 Inst.addOperand(MCOperand::CreateImm((Imm + Add) & (Add - 1)));
787 static DecodeStatus DecodeVecShiftR64Imm(llvm::MCInst &Inst, unsigned Imm,
788 uint64_t Addr, const void *Decoder) {
789 return DecodeVecShiftRImm(Inst, Imm, 64);
792 static DecodeStatus DecodeVecShiftR64ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
794 const void *Decoder) {
795 return DecodeVecShiftRImm(Inst, Imm | 0x20, 64);
798 static DecodeStatus DecodeVecShiftR32Imm(llvm::MCInst &Inst, unsigned Imm,
799 uint64_t Addr, const void *Decoder) {
800 return DecodeVecShiftRImm(Inst, Imm, 32);
803 static DecodeStatus DecodeVecShiftR32ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
805 const void *Decoder) {
806 return DecodeVecShiftRImm(Inst, Imm | 0x10, 32);
809 static DecodeStatus DecodeVecShiftR16Imm(llvm::MCInst &Inst, unsigned Imm,
810 uint64_t Addr, const void *Decoder) {
811 return DecodeVecShiftRImm(Inst, Imm, 16);
814 static DecodeStatus DecodeVecShiftR16ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
816 const void *Decoder) {
817 return DecodeVecShiftRImm(Inst, Imm | 0x8, 16);
820 static DecodeStatus DecodeVecShiftR8Imm(llvm::MCInst &Inst, unsigned Imm,
821 uint64_t Addr, const void *Decoder) {
822 return DecodeVecShiftRImm(Inst, Imm, 8);
825 static DecodeStatus DecodeVecShiftL64Imm(llvm::MCInst &Inst, unsigned Imm,
826 uint64_t Addr, const void *Decoder) {
827 return DecodeVecShiftLImm(Inst, Imm, 64);
830 static DecodeStatus DecodeVecShiftL32Imm(llvm::MCInst &Inst, unsigned Imm,
831 uint64_t Addr, const void *Decoder) {
832 return DecodeVecShiftLImm(Inst, Imm, 32);
835 static DecodeStatus DecodeVecShiftL16Imm(llvm::MCInst &Inst, unsigned Imm,
836 uint64_t Addr, const void *Decoder) {
837 return DecodeVecShiftLImm(Inst, Imm, 16);
840 static DecodeStatus DecodeVecShiftL8Imm(llvm::MCInst &Inst, unsigned Imm,
841 uint64_t Addr, const void *Decoder) {
842 return DecodeVecShiftLImm(Inst, Imm, 8);
845 static DecodeStatus DecodeThreeAddrSRegInstruction(llvm::MCInst &Inst,
846 uint32_t insn, uint64_t Addr,
847 const void *Decoder) {
848 unsigned Rd = fieldFromInstruction(insn, 0, 5);
849 unsigned Rn = fieldFromInstruction(insn, 5, 5);
850 unsigned Rm = fieldFromInstruction(insn, 16, 5);
851 unsigned shiftHi = fieldFromInstruction(insn, 22, 2);
852 unsigned shiftLo = fieldFromInstruction(insn, 10, 6);
853 unsigned shift = (shiftHi << 6) | shiftLo;
854 switch (Inst.getOpcode()) {
868 case ARM64::SUBSWrs: {
869 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
870 DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
871 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
886 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
887 DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
888 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
892 Inst.addOperand(MCOperand::CreateImm(shift));
896 static DecodeStatus DecodeMoveImmInstruction(llvm::MCInst &Inst, uint32_t insn,
898 const void *Decoder) {
899 unsigned Rd = fieldFromInstruction(insn, 0, 5);
900 unsigned imm = fieldFromInstruction(insn, 5, 16);
901 unsigned shift = fieldFromInstruction(insn, 21, 2);
903 switch (Inst.getOpcode()) {
909 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
914 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
918 if (Inst.getOpcode() == ARM64::MOVKWi || Inst.getOpcode() == ARM64::MOVKXi)
919 Inst.addOperand(Inst.getOperand(0));
921 Inst.addOperand(MCOperand::CreateImm(imm));
922 Inst.addOperand(MCOperand::CreateImm(shift));
926 static DecodeStatus DecodeUnsignedLdStInstruction(llvm::MCInst &Inst,
927 uint32_t insn, uint64_t Addr,
928 const void *Decoder) {
929 unsigned Rt = fieldFromInstruction(insn, 0, 5);
930 unsigned Rn = fieldFromInstruction(insn, 5, 5);
931 unsigned offset = fieldFromInstruction(insn, 10, 12);
932 const ARM64Disassembler *Dis =
933 static_cast<const ARM64Disassembler *>(Decoder);
935 switch (Inst.getOpcode()) {
939 // Rt is an immediate in prefetch.
940 Inst.addOperand(MCOperand::CreateImm(Rt));
944 case ARM64::LDRSBWui:
947 case ARM64::LDRSHWui:
950 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
952 case ARM64::LDRSBXui:
953 case ARM64::LDRSHXui:
957 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
961 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
965 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
969 DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
973 DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
977 DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
981 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
982 if (!Dis->tryAddingSymbolicOperand(Addr, offset, Fail, 4, Inst, insn))
983 Inst.addOperand(MCOperand::CreateImm(offset));
987 static DecodeStatus DecodeSignedLdStInstruction(llvm::MCInst &Inst,
988 uint32_t insn, uint64_t Addr,
989 const void *Decoder) {
990 unsigned Rt = fieldFromInstruction(insn, 0, 5);
991 unsigned Rn = fieldFromInstruction(insn, 5, 5);
992 int64_t offset = fieldFromInstruction(insn, 12, 9);
994 // offset is a 9-bit signed immediate, so sign extend it to
995 // fill the unsigned.
996 if (offset & (1 << (9 - 1)))
997 offset |= ~((1LL << 9) - 1);
999 switch (Inst.getOpcode()) {
1003 // Rt is an immediate in prefetch.
1004 Inst.addOperand(MCOperand::CreateImm(Rt));
1006 case ARM64::STURBBi:
1007 case ARM64::LDURBBi:
1008 case ARM64::LDURSBWi:
1009 case ARM64::STURHHi:
1010 case ARM64::LDURHHi:
1011 case ARM64::LDURSHWi:
1014 case ARM64::LDTRSBWi:
1015 case ARM64::LDTRSHWi:
1022 case ARM64::LDRSBWpre:
1023 case ARM64::LDRSHWpre:
1024 case ARM64::STRBBpre:
1025 case ARM64::LDRBBpre:
1026 case ARM64::STRHHpre:
1027 case ARM64::LDRHHpre:
1028 case ARM64::STRWpre:
1029 case ARM64::LDRWpre:
1030 case ARM64::LDRSBWpost:
1031 case ARM64::LDRSHWpost:
1032 case ARM64::STRBBpost:
1033 case ARM64::LDRBBpost:
1034 case ARM64::STRHHpost:
1035 case ARM64::LDRHHpost:
1036 case ARM64::STRWpost:
1037 case ARM64::LDRWpost:
1038 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1040 case ARM64::LDURSBXi:
1041 case ARM64::LDURSHXi:
1042 case ARM64::LDURSWi:
1045 case ARM64::LDTRSBXi:
1046 case ARM64::LDTRSHXi:
1047 case ARM64::LDTRSWi:
1050 case ARM64::LDRSBXpre:
1051 case ARM64::LDRSHXpre:
1052 case ARM64::STRXpre:
1053 case ARM64::LDRSWpre:
1054 case ARM64::LDRXpre:
1055 case ARM64::LDRSBXpost:
1056 case ARM64::LDRSHXpost:
1057 case ARM64::STRXpost:
1058 case ARM64::LDRSWpost:
1059 case ARM64::LDRXpost:
1060 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1064 case ARM64::LDRQpre:
1065 case ARM64::STRQpre:
1066 case ARM64::LDRQpost:
1067 case ARM64::STRQpost:
1068 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1072 case ARM64::LDRDpre:
1073 case ARM64::STRDpre:
1074 case ARM64::LDRDpost:
1075 case ARM64::STRDpost:
1076 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1080 case ARM64::LDRSpre:
1081 case ARM64::STRSpre:
1082 case ARM64::LDRSpost:
1083 case ARM64::STRSpost:
1084 DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1088 case ARM64::LDRHpre:
1089 case ARM64::STRHpre:
1090 case ARM64::LDRHpost:
1091 case ARM64::STRHpost:
1092 DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
1096 case ARM64::LDRBpre:
1097 case ARM64::STRBpre:
1098 case ARM64::LDRBpost:
1099 case ARM64::STRBpost:
1100 DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
1104 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1105 Inst.addOperand(MCOperand::CreateImm(offset));
1109 static DecodeStatus DecodeExclusiveLdStInstruction(llvm::MCInst &Inst,
1110 uint32_t insn, uint64_t Addr,
1111 const void *Decoder) {
1112 unsigned Rt = fieldFromInstruction(insn, 0, 5);
1113 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1114 unsigned Rt2 = fieldFromInstruction(insn, 10, 5);
1115 unsigned Rs = fieldFromInstruction(insn, 16, 5);
1117 switch (Inst.getOpcode()) {
1126 DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1140 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1144 DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1150 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1154 DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1158 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1159 DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1163 DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1167 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1168 DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1172 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1176 static DecodeStatus DecodePairLdStInstruction(llvm::MCInst &Inst, uint32_t insn,
1178 const void *Decoder) {
1179 unsigned Rt = fieldFromInstruction(insn, 0, 5);
1180 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1181 unsigned Rt2 = fieldFromInstruction(insn, 10, 5);
1182 int64_t offset = fieldFromInstruction(insn, 15, 7);
1184 // offset is a 7-bit signed immediate, so sign extend it to
1185 // fill the unsigned.
1186 if (offset & (1 << (7 - 1)))
1187 offset |= ~((1LL << 7) - 1);
1189 switch (Inst.getOpcode()) {
1194 case ARM64::LDPXpost:
1195 case ARM64::STPXpost:
1196 case ARM64::LDPSWpost:
1200 case ARM64::LDPXpre:
1201 case ARM64::STPXpre:
1202 case ARM64::LDPSWpre:
1203 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1204 DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1208 case ARM64::LDPWpost:
1209 case ARM64::STPWpost:
1212 case ARM64::LDPWpre:
1213 case ARM64::STPWpre:
1214 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1215 DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1219 case ARM64::LDPQpost:
1220 case ARM64::STPQpost:
1223 case ARM64::LDPQpre:
1224 case ARM64::STPQpre:
1225 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1226 DecodeFPR128RegisterClass(Inst, Rt2, Addr, Decoder);
1230 case ARM64::LDPDpost:
1231 case ARM64::STPDpost:
1234 case ARM64::LDPDpre:
1235 case ARM64::STPDpre:
1236 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1237 DecodeFPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1241 case ARM64::LDPSpost:
1242 case ARM64::STPSpost:
1245 case ARM64::LDPSpre:
1246 case ARM64::STPSpre:
1247 DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1248 DecodeFPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1252 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1253 Inst.addOperand(MCOperand::CreateImm(offset));
1257 static DecodeStatus DecodeRegOffsetLdStInstruction(llvm::MCInst &Inst,
1258 uint32_t insn, uint64_t Addr,
1259 const void *Decoder) {
1260 unsigned Rt = fieldFromInstruction(insn, 0, 5);
1261 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1262 unsigned Rm = fieldFromInstruction(insn, 16, 5);
1263 unsigned extendHi = fieldFromInstruction(insn, 13, 3);
1264 unsigned extendLo = fieldFromInstruction(insn, 12, 1);
1265 unsigned extend = 0;
1267 switch (Inst.getOpcode()) {
1270 case ARM64::LDRSWro:
1271 extend = (extendHi << 1) | extendLo;
1272 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1276 extend = (extendHi << 1) | extendLo;
1277 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1281 extend = (extendHi << 1) | extendLo;
1282 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1286 extend = (extendHi << 1) | extendLo;
1287 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1291 extend = (extendHi << 1) | extendLo;
1292 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1296 extend = (extendHi << 1) | extendLo;
1297 DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1300 extend = (extendHi << 1) | extendLo;
1301 DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
1304 extend = (extendHi << 1) | extendLo;
1305 DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
1307 case ARM64::LDRBBro:
1308 case ARM64::STRBBro:
1309 case ARM64::LDRSBWro:
1310 extend = (extendHi << 1) | extendLo;
1311 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1313 case ARM64::LDRHHro:
1314 case ARM64::STRHHro:
1315 case ARM64::LDRSHWro:
1316 extend = (extendHi << 1) | extendLo;
1317 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1319 case ARM64::LDRSHXro:
1320 extend = (extendHi << 1) | extendLo;
1321 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1323 case ARM64::LDRSBXro:
1324 extend = (extendHi << 1) | extendLo;
1325 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1328 extend = (extendHi << 1) | extendLo;
1329 Inst.addOperand(MCOperand::CreateImm(Rt));
1332 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1334 if (extendHi == 0x3)
1335 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1337 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1339 Inst.addOperand(MCOperand::CreateImm(extend));
1343 static DecodeStatus DecodeAddSubERegInstruction(llvm::MCInst &Inst,
1344 uint32_t insn, uint64_t Addr,
1345 const void *Decoder) {
1346 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1347 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1348 unsigned Rm = fieldFromInstruction(insn, 16, 5);
1349 unsigned extend = fieldFromInstruction(insn, 10, 6);
1351 switch (Inst.getOpcode()) {
1356 DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1357 DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1358 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1360 case ARM64::ADDSWrx:
1361 case ARM64::SUBSWrx:
1362 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1363 DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1364 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1368 DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1369 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1370 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1372 case ARM64::ADDSXrx:
1373 case ARM64::SUBSXrx:
1374 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1375 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1376 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1378 case ARM64::ADDXrx64:
1379 case ARM64::ADDSXrx64:
1380 case ARM64::SUBXrx64:
1381 case ARM64::SUBSXrx64:
1382 DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1383 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1384 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1388 Inst.addOperand(MCOperand::CreateImm(extend));
1392 static DecodeStatus DecodeLogicalImmInstruction(llvm::MCInst &Inst,
1393 uint32_t insn, uint64_t Addr,
1394 const void *Decoder) {
1395 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1396 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1397 unsigned Datasize = fieldFromInstruction(insn, 31, 1);
1401 DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1402 DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
1403 imm = fieldFromInstruction(insn, 10, 13);
1404 if (!ARM64_AM::isValidDecodeLogicalImmediate(imm, 64))
1407 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1408 DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
1409 imm = fieldFromInstruction(insn, 10, 12);
1410 if (!ARM64_AM::isValidDecodeLogicalImmediate(imm, 32))
1413 Inst.addOperand(MCOperand::CreateImm(imm));
1417 static DecodeStatus DecodeModImmInstruction(llvm::MCInst &Inst, uint32_t insn,
1419 const void *Decoder) {
1420 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1421 unsigned cmode = fieldFromInstruction(insn, 12, 4);
1422 unsigned imm = fieldFromInstruction(insn, 16, 3) << 5;
1423 imm |= fieldFromInstruction(insn, 5, 5);
1425 if (Inst.getOpcode() == ARM64::MOVID)
1426 DecodeFPR64RegisterClass(Inst, Rd, Addr, Decoder);
1428 DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1430 Inst.addOperand(MCOperand::CreateImm(imm));
1432 switch (Inst.getOpcode()) {
1435 case ARM64::MOVIv4i16:
1436 case ARM64::MOVIv8i16:
1437 case ARM64::MVNIv4i16:
1438 case ARM64::MVNIv8i16:
1439 case ARM64::MOVIv2i32:
1440 case ARM64::MOVIv4i32:
1441 case ARM64::MVNIv2i32:
1442 case ARM64::MVNIv4i32:
1443 Inst.addOperand(MCOperand::CreateImm((cmode & 6) << 2));
1445 case ARM64::MOVIv2s_msl:
1446 case ARM64::MOVIv4s_msl:
1447 case ARM64::MVNIv2s_msl:
1448 case ARM64::MVNIv4s_msl:
1449 Inst.addOperand(MCOperand::CreateImm(cmode & 1 ? 0x110 : 0x108));
1456 static DecodeStatus DecodeModImmTiedInstruction(llvm::MCInst &Inst,
1457 uint32_t insn, uint64_t Addr,
1458 const void *Decoder) {
1459 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1460 unsigned cmode = fieldFromInstruction(insn, 12, 4);
1461 unsigned imm = fieldFromInstruction(insn, 16, 3) << 5;
1462 imm |= fieldFromInstruction(insn, 5, 5);
1464 // Tied operands added twice.
1465 DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1466 DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1468 Inst.addOperand(MCOperand::CreateImm(imm));
1469 Inst.addOperand(MCOperand::CreateImm((cmode & 6) << 2));
1474 static DecodeStatus DecodeAdrInstruction(llvm::MCInst &Inst, uint32_t insn,
1475 uint64_t Addr, const void *Decoder) {
1476 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1477 int64_t imm = fieldFromInstruction(insn, 5, 19) << 2;
1478 imm |= fieldFromInstruction(insn, 29, 2);
1479 const ARM64Disassembler *Dis =
1480 static_cast<const ARM64Disassembler *>(Decoder);
1482 // Sign-extend the 21-bit immediate.
1483 if (imm & (1 << (21 - 1)))
1484 imm |= ~((1LL << 21) - 1);
1486 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1487 if (!Dis->tryAddingSymbolicOperand(Addr, imm, Fail, 4, Inst, insn))
1488 Inst.addOperand(MCOperand::CreateImm(imm));
1493 static DecodeStatus DecodeBaseAddSubImm(llvm::MCInst &Inst, uint32_t insn,
1494 uint64_t Addr, const void *Decoder) {
1495 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1496 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1497 unsigned Imm = fieldFromInstruction(insn, 10, 14);
1498 unsigned S = fieldFromInstruction(insn, 29, 1);
1499 unsigned Datasize = fieldFromInstruction(insn, 31, 1);
1501 unsigned ShifterVal = (Imm >> 12) & 3;
1502 unsigned ImmVal = Imm & 0xFFF;
1503 const ARM64Disassembler *Dis =
1504 static_cast<const ARM64Disassembler *>(Decoder);
1506 if (ShifterVal != 0 && ShifterVal != 1)
1511 DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1513 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1514 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1517 DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1519 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1520 DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1523 if (!Dis->tryAddingSymbolicOperand(Addr, ImmVal, Fail, 4, Inst, insn))
1524 Inst.addOperand(MCOperand::CreateImm(ImmVal));
1525 Inst.addOperand(MCOperand::CreateImm(12 * ShifterVal));
1529 static DecodeStatus DecodeUnconditionalBranch(llvm::MCInst &Inst, uint32_t insn,
1531 const void *Decoder) {
1532 int64_t imm = fieldFromInstruction(insn, 0, 26);
1533 const ARM64Disassembler *Dis =
1534 static_cast<const ARM64Disassembler *>(Decoder);
1536 // Sign-extend the 26-bit immediate.
1537 if (imm & (1 << (26 - 1)))
1538 imm |= ~((1LL << 26) - 1);
1540 if (!Dis->tryAddingSymbolicOperand(Addr, imm << 2, Success, 4, Inst))
1541 Inst.addOperand(MCOperand::CreateImm(imm));
1546 static DecodeStatus DecodeSystemCPSRInstruction(llvm::MCInst &Inst,
1547 uint32_t insn, uint64_t Addr,
1548 const void *Decoder) {
1549 uint64_t op1 = fieldFromInstruction(insn, 16, 3);
1550 uint64_t op2 = fieldFromInstruction(insn, 5, 3);
1551 uint64_t crm = fieldFromInstruction(insn, 8, 4);
1553 Inst.addOperand(MCOperand::CreateImm((op1 << 3) | op2));
1554 Inst.addOperand(MCOperand::CreateImm(crm));
1559 static DecodeStatus DecodeTestAndBranch(llvm::MCInst &Inst, uint32_t insn,
1560 uint64_t Addr, const void *Decoder) {
1561 uint64_t Rt = fieldFromInstruction(insn, 0, 5);
1562 uint64_t bit = fieldFromInstruction(insn, 31, 1) << 5;
1563 bit |= fieldFromInstruction(insn, 19, 5);
1564 int64_t dst = fieldFromInstruction(insn, 5, 14);
1565 const ARM64Disassembler *Dis =
1566 static_cast<const ARM64Disassembler *>(Decoder);
1568 // Sign-extend 14-bit immediate.
1569 if (dst & (1 << (14 - 1)))
1570 dst |= ~((1LL << 14) - 1);
1572 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1573 Inst.addOperand(MCOperand::CreateImm(bit));
1574 if (!Dis->tryAddingSymbolicOperand(Addr, dst << 2, Success, 4, Inst))
1575 Inst.addOperand(MCOperand::CreateImm(dst));
1580 static DecodeStatus DecodeSIMDLdStPost(llvm::MCInst &Inst, uint32_t insn,
1581 uint64_t Addr, const void *Decoder) {
1582 uint64_t Rd = fieldFromInstruction(insn, 0, 5);
1583 uint64_t Rn = fieldFromInstruction(insn, 5, 5);
1584 uint64_t Rm = fieldFromInstruction(insn, 16, 5);
1586 switch (Inst.getOpcode()) {
1589 case ARM64::ST1Onev8b_POST:
1590 case ARM64::ST1Onev4h_POST:
1591 case ARM64::ST1Onev2s_POST:
1592 case ARM64::ST1Onev1d_POST:
1593 case ARM64::LD1Onev8b_POST:
1594 case ARM64::LD1Onev4h_POST:
1595 case ARM64::LD1Onev2s_POST:
1596 case ARM64::LD1Onev1d_POST:
1597 DecodeFPR64RegisterClass(Inst, Rd, Addr, Decoder);
1599 case ARM64::ST1Onev16b_POST:
1600 case ARM64::ST1Onev8h_POST:
1601 case ARM64::ST1Onev4s_POST:
1602 case ARM64::ST1Onev2d_POST:
1603 case ARM64::LD1Onev16b_POST:
1604 case ARM64::LD1Onev8h_POST:
1605 case ARM64::LD1Onev4s_POST:
1606 case ARM64::LD1Onev2d_POST:
1607 DecodeFPR128RegisterClass(Inst, Rd, Addr, Decoder);
1609 case ARM64::ST1Twov8b_POST:
1610 case ARM64::ST1Twov4h_POST:
1611 case ARM64::ST1Twov2s_POST:
1612 case ARM64::ST1Twov1d_POST:
1613 case ARM64::ST2Twov8b_POST:
1614 case ARM64::ST2Twov4h_POST:
1615 case ARM64::ST2Twov2s_POST:
1616 case ARM64::LD1Twov8b_POST:
1617 case ARM64::LD1Twov4h_POST:
1618 case ARM64::LD1Twov2s_POST:
1619 case ARM64::LD1Twov1d_POST:
1620 case ARM64::LD2Twov8b_POST:
1621 case ARM64::LD2Twov4h_POST:
1622 case ARM64::LD2Twov2s_POST:
1623 DecodeDDRegisterClass(Inst, Rd, Addr, Decoder);
1625 case ARM64::ST1Threev8b_POST:
1626 case ARM64::ST1Threev4h_POST:
1627 case ARM64::ST1Threev2s_POST:
1628 case ARM64::ST1Threev1d_POST:
1629 case ARM64::ST3Threev8b_POST:
1630 case ARM64::ST3Threev4h_POST:
1631 case ARM64::ST3Threev2s_POST:
1632 case ARM64::LD1Threev8b_POST:
1633 case ARM64::LD1Threev4h_POST:
1634 case ARM64::LD1Threev2s_POST:
1635 case ARM64::LD1Threev1d_POST:
1636 case ARM64::LD3Threev8b_POST:
1637 case ARM64::LD3Threev4h_POST:
1638 case ARM64::LD3Threev2s_POST:
1639 DecodeDDDRegisterClass(Inst, Rd, Addr, Decoder);
1641 case ARM64::ST1Fourv8b_POST:
1642 case ARM64::ST1Fourv4h_POST:
1643 case ARM64::ST1Fourv2s_POST:
1644 case ARM64::ST1Fourv1d_POST:
1645 case ARM64::ST4Fourv8b_POST:
1646 case ARM64::ST4Fourv4h_POST:
1647 case ARM64::ST4Fourv2s_POST:
1648 case ARM64::LD1Fourv8b_POST:
1649 case ARM64::LD1Fourv4h_POST:
1650 case ARM64::LD1Fourv2s_POST:
1651 case ARM64::LD1Fourv1d_POST:
1652 case ARM64::LD4Fourv8b_POST:
1653 case ARM64::LD4Fourv4h_POST:
1654 case ARM64::LD4Fourv2s_POST:
1655 DecodeDDDDRegisterClass(Inst, Rd, Addr, Decoder);
1657 case ARM64::ST1Twov16b_POST:
1658 case ARM64::ST1Twov8h_POST:
1659 case ARM64::ST1Twov4s_POST:
1660 case ARM64::ST1Twov2d_POST:
1661 case ARM64::ST2Twov16b_POST:
1662 case ARM64::ST2Twov8h_POST:
1663 case ARM64::ST2Twov4s_POST:
1664 case ARM64::ST2Twov2d_POST:
1665 case ARM64::LD1Twov16b_POST:
1666 case ARM64::LD1Twov8h_POST:
1667 case ARM64::LD1Twov4s_POST:
1668 case ARM64::LD1Twov2d_POST:
1669 case ARM64::LD2Twov16b_POST:
1670 case ARM64::LD2Twov8h_POST:
1671 case ARM64::LD2Twov4s_POST:
1672 case ARM64::LD2Twov2d_POST:
1673 DecodeQQRegisterClass(Inst, Rd, Addr, Decoder);
1675 case ARM64::ST1Threev16b_POST:
1676 case ARM64::ST1Threev8h_POST:
1677 case ARM64::ST1Threev4s_POST:
1678 case ARM64::ST1Threev2d_POST:
1679 case ARM64::ST3Threev16b_POST:
1680 case ARM64::ST3Threev8h_POST:
1681 case ARM64::ST3Threev4s_POST:
1682 case ARM64::ST3Threev2d_POST:
1683 case ARM64::LD1Threev16b_POST:
1684 case ARM64::LD1Threev8h_POST:
1685 case ARM64::LD1Threev4s_POST:
1686 case ARM64::LD1Threev2d_POST:
1687 case ARM64::LD3Threev16b_POST:
1688 case ARM64::LD3Threev8h_POST:
1689 case ARM64::LD3Threev4s_POST:
1690 case ARM64::LD3Threev2d_POST:
1691 DecodeQQQRegisterClass(Inst, Rd, Addr, Decoder);
1693 case ARM64::ST1Fourv16b_POST:
1694 case ARM64::ST1Fourv8h_POST:
1695 case ARM64::ST1Fourv4s_POST:
1696 case ARM64::ST1Fourv2d_POST:
1697 case ARM64::ST4Fourv16b_POST:
1698 case ARM64::ST4Fourv8h_POST:
1699 case ARM64::ST4Fourv4s_POST:
1700 case ARM64::ST4Fourv2d_POST:
1701 case ARM64::LD1Fourv16b_POST:
1702 case ARM64::LD1Fourv8h_POST:
1703 case ARM64::LD1Fourv4s_POST:
1704 case ARM64::LD1Fourv2d_POST:
1705 case ARM64::LD4Fourv16b_POST:
1706 case ARM64::LD4Fourv8h_POST:
1707 case ARM64::LD4Fourv4s_POST:
1708 case ARM64::LD4Fourv2d_POST:
1709 DecodeQQQQRegisterClass(Inst, Rd, Addr, Decoder);
1713 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1714 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1718 static DecodeStatus DecodeSIMDLdStSingle(llvm::MCInst &Inst, uint32_t insn,
1719 uint64_t Addr, const void *Decoder) {
1720 uint64_t Rt = fieldFromInstruction(insn, 0, 5);
1721 uint64_t Rn = fieldFromInstruction(insn, 5, 5);
1722 uint64_t Rm = fieldFromInstruction(insn, 16, 5);
1723 uint64_t size = fieldFromInstruction(insn, 10, 2);
1724 uint64_t S = fieldFromInstruction(insn, 12, 1);
1725 uint64_t Q = fieldFromInstruction(insn, 30, 1);
1728 switch (Inst.getOpcode()) {
1730 case ARM64::ST1i8_POST:
1732 case ARM64::ST2i8_POST:
1733 case ARM64::ST3i8_POST:
1735 case ARM64::ST4i8_POST:
1737 index = (Q << 3) | (S << 2) | size;
1740 case ARM64::ST1i16_POST:
1742 case ARM64::ST2i16_POST:
1743 case ARM64::ST3i16_POST:
1745 case ARM64::ST4i16_POST:
1747 index = (Q << 2) | (S << 1) | (size >> 1);
1750 case ARM64::ST1i32_POST:
1752 case ARM64::ST2i32_POST:
1753 case ARM64::ST3i32_POST:
1755 case ARM64::ST4i32_POST:
1757 index = (Q << 1) | S;
1760 case ARM64::ST1i64_POST:
1762 case ARM64::ST2i64_POST:
1763 case ARM64::ST3i64_POST:
1765 case ARM64::ST4i64_POST:
1771 switch (Inst.getOpcode()) {
1774 case ARM64::LD1Rv8b:
1775 case ARM64::LD1Rv8b_POST:
1776 case ARM64::LD1Rv4h:
1777 case ARM64::LD1Rv4h_POST:
1778 case ARM64::LD1Rv2s:
1779 case ARM64::LD1Rv2s_POST:
1780 case ARM64::LD1Rv1d:
1781 case ARM64::LD1Rv1d_POST:
1782 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1784 case ARM64::LD1Rv16b:
1785 case ARM64::LD1Rv16b_POST:
1786 case ARM64::LD1Rv8h:
1787 case ARM64::LD1Rv8h_POST:
1788 case ARM64::LD1Rv4s:
1789 case ARM64::LD1Rv4s_POST:
1790 case ARM64::LD1Rv2d:
1791 case ARM64::LD1Rv2d_POST:
1793 case ARM64::ST1i8_POST:
1795 case ARM64::ST1i16_POST:
1797 case ARM64::ST1i32_POST:
1799 case ARM64::ST1i64_POST:
1800 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1802 case ARM64::LD2Rv16b:
1803 case ARM64::LD2Rv16b_POST:
1804 case ARM64::LD2Rv8h:
1805 case ARM64::LD2Rv8h_POST:
1806 case ARM64::LD2Rv4s:
1807 case ARM64::LD2Rv4s_POST:
1808 case ARM64::LD2Rv2d:
1809 case ARM64::LD2Rv2d_POST:
1811 case ARM64::ST2i8_POST:
1813 case ARM64::ST2i16_POST:
1815 case ARM64::ST2i32_POST:
1817 case ARM64::ST2i64_POST:
1818 DecodeQQRegisterClass(Inst, Rt, Addr, Decoder);
1820 case ARM64::LD2Rv8b:
1821 case ARM64::LD2Rv8b_POST:
1822 case ARM64::LD2Rv4h:
1823 case ARM64::LD2Rv4h_POST:
1824 case ARM64::LD2Rv2s:
1825 case ARM64::LD2Rv2s_POST:
1826 case ARM64::LD2Rv1d:
1827 case ARM64::LD2Rv1d_POST:
1828 DecodeDDRegisterClass(Inst, Rt, Addr, Decoder);
1830 case ARM64::LD3Rv8b:
1831 case ARM64::LD3Rv8b_POST:
1832 case ARM64::LD3Rv4h:
1833 case ARM64::LD3Rv4h_POST:
1834 case ARM64::LD3Rv2s:
1835 case ARM64::LD3Rv2s_POST:
1836 case ARM64::LD3Rv1d:
1837 case ARM64::LD3Rv1d_POST:
1838 DecodeDDDRegisterClass(Inst, Rt, Addr, Decoder);
1840 case ARM64::LD3Rv16b:
1841 case ARM64::LD3Rv16b_POST:
1842 case ARM64::LD3Rv8h:
1843 case ARM64::LD3Rv8h_POST:
1844 case ARM64::LD3Rv4s:
1845 case ARM64::LD3Rv4s_POST:
1846 case ARM64::LD3Rv2d:
1847 case ARM64::LD3Rv2d_POST:
1849 case ARM64::ST3i8_POST:
1851 case ARM64::ST3i16_POST:
1853 case ARM64::ST3i32_POST:
1855 case ARM64::ST3i64_POST:
1856 DecodeQQQRegisterClass(Inst, Rt, Addr, Decoder);
1858 case ARM64::LD4Rv8b:
1859 case ARM64::LD4Rv8b_POST:
1860 case ARM64::LD4Rv4h:
1861 case ARM64::LD4Rv4h_POST:
1862 case ARM64::LD4Rv2s:
1863 case ARM64::LD4Rv2s_POST:
1864 case ARM64::LD4Rv1d:
1865 case ARM64::LD4Rv1d_POST:
1866 DecodeDDDDRegisterClass(Inst, Rt, Addr, Decoder);
1868 case ARM64::LD4Rv16b:
1869 case ARM64::LD4Rv16b_POST:
1870 case ARM64::LD4Rv8h:
1871 case ARM64::LD4Rv8h_POST:
1872 case ARM64::LD4Rv4s:
1873 case ARM64::LD4Rv4s_POST:
1874 case ARM64::LD4Rv2d:
1875 case ARM64::LD4Rv2d_POST:
1877 case ARM64::ST4i8_POST:
1879 case ARM64::ST4i16_POST:
1881 case ARM64::ST4i32_POST:
1883 case ARM64::ST4i64_POST:
1884 DecodeQQQQRegisterClass(Inst, Rt, Addr, Decoder);
1888 switch (Inst.getOpcode()) {
1889 case ARM64::LD1Rv8b:
1890 case ARM64::LD1Rv8b_POST:
1891 case ARM64::LD1Rv16b:
1892 case ARM64::LD1Rv16b_POST:
1893 case ARM64::LD1Rv4h:
1894 case ARM64::LD1Rv4h_POST:
1895 case ARM64::LD1Rv8h:
1896 case ARM64::LD1Rv8h_POST:
1897 case ARM64::LD1Rv4s:
1898 case ARM64::LD1Rv4s_POST:
1899 case ARM64::LD1Rv2s:
1900 case ARM64::LD1Rv2s_POST:
1901 case ARM64::LD1Rv1d:
1902 case ARM64::LD1Rv1d_POST:
1903 case ARM64::LD1Rv2d:
1904 case ARM64::LD1Rv2d_POST:
1905 case ARM64::LD2Rv8b:
1906 case ARM64::LD2Rv8b_POST:
1907 case ARM64::LD2Rv16b:
1908 case ARM64::LD2Rv16b_POST:
1909 case ARM64::LD2Rv4h:
1910 case ARM64::LD2Rv4h_POST:
1911 case ARM64::LD2Rv8h:
1912 case ARM64::LD2Rv8h_POST:
1913 case ARM64::LD2Rv2s:
1914 case ARM64::LD2Rv2s_POST:
1915 case ARM64::LD2Rv4s:
1916 case ARM64::LD2Rv4s_POST:
1917 case ARM64::LD2Rv2d:
1918 case ARM64::LD2Rv2d_POST:
1919 case ARM64::LD2Rv1d:
1920 case ARM64::LD2Rv1d_POST:
1921 case ARM64::LD3Rv8b:
1922 case ARM64::LD3Rv8b_POST:
1923 case ARM64::LD3Rv16b:
1924 case ARM64::LD3Rv16b_POST:
1925 case ARM64::LD3Rv4h:
1926 case ARM64::LD3Rv4h_POST:
1927 case ARM64::LD3Rv8h:
1928 case ARM64::LD3Rv8h_POST:
1929 case ARM64::LD3Rv2s:
1930 case ARM64::LD3Rv2s_POST:
1931 case ARM64::LD3Rv4s:
1932 case ARM64::LD3Rv4s_POST:
1933 case ARM64::LD3Rv2d:
1934 case ARM64::LD3Rv2d_POST:
1935 case ARM64::LD3Rv1d:
1936 case ARM64::LD3Rv1d_POST:
1937 case ARM64::LD4Rv8b:
1938 case ARM64::LD4Rv8b_POST:
1939 case ARM64::LD4Rv16b:
1940 case ARM64::LD4Rv16b_POST:
1941 case ARM64::LD4Rv4h:
1942 case ARM64::LD4Rv4h_POST:
1943 case ARM64::LD4Rv8h:
1944 case ARM64::LD4Rv8h_POST:
1945 case ARM64::LD4Rv2s:
1946 case ARM64::LD4Rv2s_POST:
1947 case ARM64::LD4Rv4s:
1948 case ARM64::LD4Rv4s_POST:
1949 case ARM64::LD4Rv2d:
1950 case ARM64::LD4Rv2d_POST:
1951 case ARM64::LD4Rv1d:
1952 case ARM64::LD4Rv1d_POST:
1955 Inst.addOperand(MCOperand::CreateImm(index));
1958 DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
1960 switch (Inst.getOpcode()) {
1961 case ARM64::ST1i8_POST:
1962 case ARM64::ST1i16_POST:
1963 case ARM64::ST1i32_POST:
1964 case ARM64::ST1i64_POST:
1965 case ARM64::LD1Rv8b_POST:
1966 case ARM64::LD1Rv16b_POST:
1967 case ARM64::LD1Rv4h_POST:
1968 case ARM64::LD1Rv8h_POST:
1969 case ARM64::LD1Rv2s_POST:
1970 case ARM64::LD1Rv4s_POST:
1971 case ARM64::LD1Rv1d_POST:
1972 case ARM64::LD1Rv2d_POST:
1973 case ARM64::ST2i8_POST:
1974 case ARM64::ST2i16_POST:
1975 case ARM64::ST2i32_POST:
1976 case ARM64::ST2i64_POST:
1977 case ARM64::LD2Rv8b_POST:
1978 case ARM64::LD2Rv16b_POST:
1979 case ARM64::LD2Rv4h_POST:
1980 case ARM64::LD2Rv8h_POST:
1981 case ARM64::LD2Rv2s_POST:
1982 case ARM64::LD2Rv4s_POST:
1983 case ARM64::LD2Rv2d_POST:
1984 case ARM64::LD2Rv1d_POST:
1985 case ARM64::ST3i8_POST:
1986 case ARM64::ST3i16_POST:
1987 case ARM64::ST3i32_POST:
1988 case ARM64::ST3i64_POST:
1989 case ARM64::LD3Rv8b_POST:
1990 case ARM64::LD3Rv16b_POST:
1991 case ARM64::LD3Rv4h_POST:
1992 case ARM64::LD3Rv8h_POST:
1993 case ARM64::LD3Rv2s_POST:
1994 case ARM64::LD3Rv4s_POST:
1995 case ARM64::LD3Rv2d_POST:
1996 case ARM64::LD3Rv1d_POST:
1997 case ARM64::ST4i8_POST:
1998 case ARM64::ST4i16_POST:
1999 case ARM64::ST4i32_POST:
2000 case ARM64::ST4i64_POST:
2001 case ARM64::LD4Rv8b_POST:
2002 case ARM64::LD4Rv16b_POST:
2003 case ARM64::LD4Rv4h_POST:
2004 case ARM64::LD4Rv8h_POST:
2005 case ARM64::LD4Rv2s_POST:
2006 case ARM64::LD4Rv4s_POST:
2007 case ARM64::LD4Rv2d_POST:
2008 case ARM64::LD4Rv1d_POST:
2009 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
2015 static DecodeStatus DecodeSIMDLdStSingleTied(llvm::MCInst &Inst, uint32_t insn,
2017 const void *Decoder) {
2018 uint64_t Rt = fieldFromInstruction(insn, 0, 5);
2019 uint64_t Rn = fieldFromInstruction(insn, 5, 5);
2020 uint64_t Rm = fieldFromInstruction(insn, 16, 5);
2021 uint64_t size = fieldFromInstruction(insn, 10, 2);
2022 uint64_t S = fieldFromInstruction(insn, 12, 1);
2023 uint64_t Q = fieldFromInstruction(insn, 30, 1);
2026 switch (Inst.getOpcode()) {
2028 case ARM64::LD1i8_POST:
2030 case ARM64::LD2i8_POST:
2031 case ARM64::LD3i8_POST:
2033 case ARM64::LD4i8_POST:
2035 index = (Q << 3) | (S << 2) | size;
2038 case ARM64::LD1i16_POST:
2040 case ARM64::LD2i16_POST:
2041 case ARM64::LD3i16_POST:
2043 case ARM64::LD4i16_POST:
2045 index = (Q << 2) | (S << 1) | (size >> 1);
2048 case ARM64::LD1i32_POST:
2050 case ARM64::LD2i32_POST:
2051 case ARM64::LD3i32_POST:
2053 case ARM64::LD4i32_POST:
2055 index = (Q << 1) | S;
2058 case ARM64::LD1i64_POST:
2060 case ARM64::LD2i64_POST:
2061 case ARM64::LD3i64_POST:
2063 case ARM64::LD4i64_POST:
2069 switch (Inst.getOpcode()) {
2073 case ARM64::LD1i8_POST:
2075 case ARM64::LD1i16_POST:
2077 case ARM64::LD1i32_POST:
2079 case ARM64::LD1i64_POST:
2080 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
2081 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
2084 case ARM64::LD2i8_POST:
2086 case ARM64::LD2i16_POST:
2088 case ARM64::LD2i32_POST:
2090 case ARM64::LD2i64_POST:
2091 DecodeQQRegisterClass(Inst, Rt, Addr, Decoder);
2092 DecodeQQRegisterClass(Inst, Rt, Addr, Decoder);
2095 case ARM64::LD3i8_POST:
2097 case ARM64::LD3i16_POST:
2099 case ARM64::LD3i32_POST:
2101 case ARM64::LD3i64_POST:
2102 DecodeQQQRegisterClass(Inst, Rt, Addr, Decoder);
2103 DecodeQQQRegisterClass(Inst, Rt, Addr, Decoder);
2106 case ARM64::LD4i8_POST:
2108 case ARM64::LD4i16_POST:
2110 case ARM64::LD4i32_POST:
2112 case ARM64::LD4i64_POST:
2113 DecodeQQQQRegisterClass(Inst, Rt, Addr, Decoder);
2114 DecodeQQQQRegisterClass(Inst, Rt, Addr, Decoder);
2118 Inst.addOperand(MCOperand::CreateImm(index));
2119 DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
2121 switch (Inst.getOpcode()) {
2122 case ARM64::LD1i8_POST:
2123 case ARM64::LD1i16_POST:
2124 case ARM64::LD1i32_POST:
2125 case ARM64::LD1i64_POST:
2126 case ARM64::LD2i8_POST:
2127 case ARM64::LD2i16_POST:
2128 case ARM64::LD2i32_POST:
2129 case ARM64::LD2i64_POST:
2130 case ARM64::LD3i8_POST:
2131 case ARM64::LD3i16_POST:
2132 case ARM64::LD3i32_POST:
2133 case ARM64::LD3i64_POST:
2134 case ARM64::LD4i8_POST:
2135 case ARM64::LD4i16_POST:
2136 case ARM64::LD4i32_POST:
2137 case ARM64::LD4i64_POST:
2138 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);