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 "ARM64ExternalSymbolizer.h"
17 #include "ARM64Subtarget.h"
18 #include "MCTargetDesc/ARM64AddressingModes.h"
19 #include "Utils/ARM64BaseInfo.h"
20 #include "llvm/MC/MCInst.h"
21 #include "llvm/MC/MCFixedLenDisassembler.h"
22 #include "llvm/Support/Debug.h"
23 #include "llvm/Support/MemoryObject.h"
24 #include "llvm/Support/TargetRegistry.h"
25 #include "llvm/Support/ErrorHandling.h"
29 // Pull DecodeStatus and its enum values into the global namespace.
30 typedef llvm::MCDisassembler::DecodeStatus DecodeStatus;
32 // Forward declare these because the autogenerated code will reference them.
33 // Definitions are further down.
34 static DecodeStatus DecodeFPR128RegisterClass(llvm::MCInst &Inst,
35 unsigned RegNo, uint64_t Address,
37 static DecodeStatus DecodeFPR128_loRegisterClass(llvm::MCInst &Inst,
41 static DecodeStatus DecodeFPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
44 static DecodeStatus DecodeFPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
47 static DecodeStatus DecodeFPR16RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
50 static DecodeStatus DecodeFPR8RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
53 static DecodeStatus DecodeGPR64RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
56 static DecodeStatus DecodeGPR64spRegisterClass(llvm::MCInst &Inst,
57 unsigned RegNo, uint64_t Address,
59 static DecodeStatus DecodeGPR32RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
62 static DecodeStatus DecodeGPR32spRegisterClass(llvm::MCInst &Inst,
63 unsigned RegNo, uint64_t Address,
65 static DecodeStatus DecodeQQRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
68 static DecodeStatus DecodeQQQRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
71 static DecodeStatus DecodeQQQQRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
74 static DecodeStatus DecodeDDRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
77 static DecodeStatus DecodeDDDRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
80 static DecodeStatus DecodeDDDDRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
84 static DecodeStatus DecodeFixedPointScaleImm32(llvm::MCInst &Inst, unsigned Imm,
87 static DecodeStatus DecodeFixedPointScaleImm64(llvm::MCInst &Inst, unsigned Imm,
90 static DecodeStatus DecodeCondBranchTarget(llvm::MCInst &Inst, unsigned Imm,
93 static DecodeStatus DecodeMRSSystemRegister(llvm::MCInst &Inst, unsigned Imm,
94 uint64_t Address, const void *Decoder);
95 static DecodeStatus DecodeMSRSystemRegister(llvm::MCInst &Inst, unsigned Imm,
96 uint64_t Address, const void *Decoder);
97 static DecodeStatus DecodeThreeAddrSRegInstruction(llvm::MCInst &Inst,
100 const void *Decoder);
101 static DecodeStatus DecodeMoveImmInstruction(llvm::MCInst &Inst, uint32_t insn,
103 const void *Decoder);
104 static DecodeStatus DecodeUnsignedLdStInstruction(llvm::MCInst &Inst,
107 const void *Decoder);
108 static DecodeStatus DecodeSignedLdStInstruction(llvm::MCInst &Inst,
109 uint32_t insn, uint64_t Address,
110 const void *Decoder);
111 static DecodeStatus DecodeExclusiveLdStInstruction(llvm::MCInst &Inst,
114 const void *Decoder);
115 static DecodeStatus DecodePairLdStInstruction(llvm::MCInst &Inst, uint32_t insn,
117 const void *Decoder);
118 static DecodeStatus DecodeRegOffsetLdStInstruction(llvm::MCInst &Inst,
121 const void *Decoder);
122 static DecodeStatus DecodeAddSubERegInstruction(llvm::MCInst &Inst,
123 uint32_t insn, uint64_t Address,
124 const void *Decoder);
125 static DecodeStatus DecodeLogicalImmInstruction(llvm::MCInst &Inst,
126 uint32_t insn, uint64_t Address,
127 const void *Decoder);
128 static DecodeStatus DecodeModImmInstruction(llvm::MCInst &Inst, uint32_t insn,
130 const void *Decoder);
131 static DecodeStatus DecodeModImmTiedInstruction(llvm::MCInst &Inst,
132 uint32_t insn, uint64_t Address,
133 const void *Decoder);
134 static DecodeStatus DecodeAdrInstruction(llvm::MCInst &Inst, uint32_t insn,
135 uint64_t Address, const void *Decoder);
136 static DecodeStatus DecodeBaseAddSubImm(llvm::MCInst &Inst, uint32_t insn,
137 uint64_t Address, const void *Decoder);
138 static DecodeStatus DecodeUnconditionalBranch(llvm::MCInst &Inst, uint32_t insn,
140 const void *Decoder);
141 static DecodeStatus DecodeSystemCPSRInstruction(llvm::MCInst &Inst,
142 uint32_t insn, uint64_t Address,
143 const void *Decoder);
144 static DecodeStatus DecodeTestAndBranch(llvm::MCInst &Inst, uint32_t insn,
145 uint64_t Address, const void *Decoder);
146 static DecodeStatus DecodeSIMDLdStPost(llvm::MCInst &Inst, uint32_t insn,
147 uint64_t Addr, const void *Decoder);
148 static DecodeStatus DecodeSIMDLdStSingle(llvm::MCInst &Inst, uint32_t insn,
149 uint64_t Addr, const void *Decoder);
150 static DecodeStatus DecodeSIMDLdStSingleTied(llvm::MCInst &Inst, uint32_t insn,
152 const void *Decoder);
154 static DecodeStatus DecodeVecShiftR64Imm(llvm::MCInst &Inst, unsigned Imm,
155 uint64_t Addr, const void *Decoder);
156 static DecodeStatus DecodeVecShiftR64ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
158 const void *Decoder);
159 static DecodeStatus DecodeVecShiftR32Imm(llvm::MCInst &Inst, unsigned Imm,
160 uint64_t Addr, const void *Decoder);
161 static DecodeStatus DecodeVecShiftR32ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
163 const void *Decoder);
164 static DecodeStatus DecodeVecShiftR16Imm(llvm::MCInst &Inst, unsigned Imm,
165 uint64_t Addr, const void *Decoder);
166 static DecodeStatus DecodeVecShiftR16ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
168 const void *Decoder);
169 static DecodeStatus DecodeVecShiftR8Imm(llvm::MCInst &Inst, unsigned Imm,
170 uint64_t Addr, const void *Decoder);
171 static DecodeStatus DecodeVecShiftL64Imm(llvm::MCInst &Inst, unsigned Imm,
172 uint64_t Addr, const void *Decoder);
173 static DecodeStatus DecodeVecShiftL32Imm(llvm::MCInst &Inst, unsigned Imm,
174 uint64_t Addr, const void *Decoder);
175 static DecodeStatus DecodeVecShiftL16Imm(llvm::MCInst &Inst, unsigned Imm,
176 uint64_t Addr, const void *Decoder);
177 static DecodeStatus DecodeVecShiftL8Imm(llvm::MCInst &Inst, unsigned Imm,
178 uint64_t Addr, const void *Decoder);
180 #include "ARM64GenDisassemblerTables.inc"
181 #include "ARM64GenInstrInfo.inc"
183 #define Success llvm::MCDisassembler::Success
184 #define Fail llvm::MCDisassembler::Fail
186 static MCDisassembler *createARM64Disassembler(const Target &T,
187 const MCSubtargetInfo &STI,
189 return new ARM64Disassembler(STI, Ctx);
192 DecodeStatus ARM64Disassembler::getInstruction(MCInst &MI, uint64_t &Size,
193 const MemoryObject &Region,
196 raw_ostream &cs) const {
202 // We want to read exactly 4 bytes of data.
203 if (Region.readBytes(Address, 4, (uint8_t *)bytes) == -1)
207 // Encoded as a small-endian 32-bit word in the stream.
209 (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | (bytes[0] << 0);
211 // Calling the auto-generated decoder function.
212 DecodeStatus result =
213 decodeInstruction(DecoderTable32, MI, insn, Address, this, STI);
220 static MCSymbolizer *
221 createARM64ExternalSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo,
222 LLVMSymbolLookupCallback SymbolLookUp,
223 void *DisInfo, MCContext *Ctx,
224 MCRelocationInfo *RelInfo) {
225 return new llvm::ARM64ExternalSymbolizer(
227 std::unique_ptr<MCRelocationInfo>(RelInfo),
228 GetOpInfo, SymbolLookUp, DisInfo);
231 extern "C" void LLVMInitializeARM64Disassembler() {
232 TargetRegistry::RegisterMCDisassembler(TheARM64Target,
233 createARM64Disassembler);
234 TargetRegistry::RegisterMCSymbolizer(TheARM64Target,
235 createARM64ExternalSymbolizer);
238 static const unsigned FPR128DecoderTable[] = {
239 ARM64::Q0, ARM64::Q1, ARM64::Q2, ARM64::Q3, ARM64::Q4, ARM64::Q5,
240 ARM64::Q6, ARM64::Q7, ARM64::Q8, ARM64::Q9, ARM64::Q10, ARM64::Q11,
241 ARM64::Q12, ARM64::Q13, ARM64::Q14, ARM64::Q15, ARM64::Q16, ARM64::Q17,
242 ARM64::Q18, ARM64::Q19, ARM64::Q20, ARM64::Q21, ARM64::Q22, ARM64::Q23,
243 ARM64::Q24, ARM64::Q25, ARM64::Q26, ARM64::Q27, ARM64::Q28, ARM64::Q29,
244 ARM64::Q30, ARM64::Q31
247 static DecodeStatus DecodeFPR128RegisterClass(MCInst &Inst, unsigned RegNo,
249 const void *Decoder) {
253 unsigned Register = FPR128DecoderTable[RegNo];
254 Inst.addOperand(MCOperand::CreateReg(Register));
258 static DecodeStatus DecodeFPR128_loRegisterClass(MCInst &Inst, unsigned RegNo,
260 const void *Decoder) {
263 return DecodeFPR128RegisterClass(Inst, RegNo, Addr, Decoder);
266 static const unsigned FPR64DecoderTable[] = {
267 ARM64::D0, ARM64::D1, ARM64::D2, ARM64::D3, ARM64::D4, ARM64::D5,
268 ARM64::D6, ARM64::D7, ARM64::D8, ARM64::D9, ARM64::D10, ARM64::D11,
269 ARM64::D12, ARM64::D13, ARM64::D14, ARM64::D15, ARM64::D16, ARM64::D17,
270 ARM64::D18, ARM64::D19, ARM64::D20, ARM64::D21, ARM64::D22, ARM64::D23,
271 ARM64::D24, ARM64::D25, ARM64::D26, ARM64::D27, ARM64::D28, ARM64::D29,
272 ARM64::D30, ARM64::D31
275 static DecodeStatus DecodeFPR64RegisterClass(MCInst &Inst, unsigned RegNo,
277 const void *Decoder) {
281 unsigned Register = FPR64DecoderTable[RegNo];
282 Inst.addOperand(MCOperand::CreateReg(Register));
286 static const unsigned FPR32DecoderTable[] = {
287 ARM64::S0, ARM64::S1, ARM64::S2, ARM64::S3, ARM64::S4, ARM64::S5,
288 ARM64::S6, ARM64::S7, ARM64::S8, ARM64::S9, ARM64::S10, ARM64::S11,
289 ARM64::S12, ARM64::S13, ARM64::S14, ARM64::S15, ARM64::S16, ARM64::S17,
290 ARM64::S18, ARM64::S19, ARM64::S20, ARM64::S21, ARM64::S22, ARM64::S23,
291 ARM64::S24, ARM64::S25, ARM64::S26, ARM64::S27, ARM64::S28, ARM64::S29,
292 ARM64::S30, ARM64::S31
295 static DecodeStatus DecodeFPR32RegisterClass(MCInst &Inst, unsigned RegNo,
297 const void *Decoder) {
301 unsigned Register = FPR32DecoderTable[RegNo];
302 Inst.addOperand(MCOperand::CreateReg(Register));
306 static const unsigned FPR16DecoderTable[] = {
307 ARM64::H0, ARM64::H1, ARM64::H2, ARM64::H3, ARM64::H4, ARM64::H5,
308 ARM64::H6, ARM64::H7, ARM64::H8, ARM64::H9, ARM64::H10, ARM64::H11,
309 ARM64::H12, ARM64::H13, ARM64::H14, ARM64::H15, ARM64::H16, ARM64::H17,
310 ARM64::H18, ARM64::H19, ARM64::H20, ARM64::H21, ARM64::H22, ARM64::H23,
311 ARM64::H24, ARM64::H25, ARM64::H26, ARM64::H27, ARM64::H28, ARM64::H29,
312 ARM64::H30, ARM64::H31
315 static DecodeStatus DecodeFPR16RegisterClass(MCInst &Inst, unsigned RegNo,
317 const void *Decoder) {
321 unsigned Register = FPR16DecoderTable[RegNo];
322 Inst.addOperand(MCOperand::CreateReg(Register));
326 static const unsigned FPR8DecoderTable[] = {
327 ARM64::B0, ARM64::B1, ARM64::B2, ARM64::B3, ARM64::B4, ARM64::B5,
328 ARM64::B6, ARM64::B7, ARM64::B8, ARM64::B9, ARM64::B10, ARM64::B11,
329 ARM64::B12, ARM64::B13, ARM64::B14, ARM64::B15, ARM64::B16, ARM64::B17,
330 ARM64::B18, ARM64::B19, ARM64::B20, ARM64::B21, ARM64::B22, ARM64::B23,
331 ARM64::B24, ARM64::B25, ARM64::B26, ARM64::B27, ARM64::B28, ARM64::B29,
332 ARM64::B30, ARM64::B31
335 static DecodeStatus DecodeFPR8RegisterClass(MCInst &Inst, unsigned RegNo,
337 const void *Decoder) {
341 unsigned Register = FPR8DecoderTable[RegNo];
342 Inst.addOperand(MCOperand::CreateReg(Register));
346 static const unsigned GPR64DecoderTable[] = {
347 ARM64::X0, ARM64::X1, ARM64::X2, ARM64::X3, ARM64::X4, ARM64::X5,
348 ARM64::X6, ARM64::X7, ARM64::X8, ARM64::X9, ARM64::X10, ARM64::X11,
349 ARM64::X12, ARM64::X13, ARM64::X14, ARM64::X15, ARM64::X16, ARM64::X17,
350 ARM64::X18, ARM64::X19, ARM64::X20, ARM64::X21, ARM64::X22, ARM64::X23,
351 ARM64::X24, ARM64::X25, ARM64::X26, ARM64::X27, ARM64::X28, ARM64::FP,
352 ARM64::LR, ARM64::XZR
355 static DecodeStatus DecodeGPR64RegisterClass(MCInst &Inst, unsigned RegNo,
357 const void *Decoder) {
361 unsigned Register = GPR64DecoderTable[RegNo];
362 Inst.addOperand(MCOperand::CreateReg(Register));
366 static DecodeStatus DecodeGPR64spRegisterClass(MCInst &Inst, unsigned RegNo,
368 const void *Decoder) {
371 unsigned Register = GPR64DecoderTable[RegNo];
372 if (Register == ARM64::XZR)
373 Register = ARM64::SP;
374 Inst.addOperand(MCOperand::CreateReg(Register));
378 static const unsigned GPR32DecoderTable[] = {
379 ARM64::W0, ARM64::W1, ARM64::W2, ARM64::W3, ARM64::W4, ARM64::W5,
380 ARM64::W6, ARM64::W7, ARM64::W8, ARM64::W9, ARM64::W10, ARM64::W11,
381 ARM64::W12, ARM64::W13, ARM64::W14, ARM64::W15, ARM64::W16, ARM64::W17,
382 ARM64::W18, ARM64::W19, ARM64::W20, ARM64::W21, ARM64::W22, ARM64::W23,
383 ARM64::W24, ARM64::W25, ARM64::W26, ARM64::W27, ARM64::W28, ARM64::W29,
384 ARM64::W30, ARM64::WZR
387 static DecodeStatus DecodeGPR32RegisterClass(MCInst &Inst, unsigned RegNo,
389 const void *Decoder) {
393 unsigned Register = GPR32DecoderTable[RegNo];
394 Inst.addOperand(MCOperand::CreateReg(Register));
398 static DecodeStatus DecodeGPR32spRegisterClass(MCInst &Inst, unsigned RegNo,
400 const void *Decoder) {
404 unsigned Register = GPR32DecoderTable[RegNo];
405 if (Register == ARM64::WZR)
406 Register = ARM64::WSP;
407 Inst.addOperand(MCOperand::CreateReg(Register));
411 static const unsigned VectorDecoderTable[] = {
412 ARM64::Q0, ARM64::Q1, ARM64::Q2, ARM64::Q3, ARM64::Q4, ARM64::Q5,
413 ARM64::Q6, ARM64::Q7, ARM64::Q8, ARM64::Q9, ARM64::Q10, ARM64::Q11,
414 ARM64::Q12, ARM64::Q13, ARM64::Q14, ARM64::Q15, ARM64::Q16, ARM64::Q17,
415 ARM64::Q18, ARM64::Q19, ARM64::Q20, ARM64::Q21, ARM64::Q22, ARM64::Q23,
416 ARM64::Q24, ARM64::Q25, ARM64::Q26, ARM64::Q27, ARM64::Q28, ARM64::Q29,
417 ARM64::Q30, ARM64::Q31
420 static DecodeStatus DecodeVectorRegisterClass(MCInst &Inst, unsigned RegNo,
422 const void *Decoder) {
426 unsigned Register = VectorDecoderTable[RegNo];
427 Inst.addOperand(MCOperand::CreateReg(Register));
431 static const unsigned QQDecoderTable[] = {
432 ARM64::Q0_Q1, ARM64::Q1_Q2, ARM64::Q2_Q3, ARM64::Q3_Q4,
433 ARM64::Q4_Q5, ARM64::Q5_Q6, ARM64::Q6_Q7, ARM64::Q7_Q8,
434 ARM64::Q8_Q9, ARM64::Q9_Q10, ARM64::Q10_Q11, ARM64::Q11_Q12,
435 ARM64::Q12_Q13, ARM64::Q13_Q14, ARM64::Q14_Q15, ARM64::Q15_Q16,
436 ARM64::Q16_Q17, ARM64::Q17_Q18, ARM64::Q18_Q19, ARM64::Q19_Q20,
437 ARM64::Q20_Q21, ARM64::Q21_Q22, ARM64::Q22_Q23, ARM64::Q23_Q24,
438 ARM64::Q24_Q25, ARM64::Q25_Q26, ARM64::Q26_Q27, ARM64::Q27_Q28,
439 ARM64::Q28_Q29, ARM64::Q29_Q30, ARM64::Q30_Q31, ARM64::Q31_Q0
442 static DecodeStatus DecodeQQRegisterClass(MCInst &Inst, unsigned RegNo,
443 uint64_t Addr, const void *Decoder) {
446 unsigned Register = QQDecoderTable[RegNo];
447 Inst.addOperand(MCOperand::CreateReg(Register));
451 static const unsigned QQQDecoderTable[] = {
452 ARM64::Q0_Q1_Q2, ARM64::Q1_Q2_Q3, ARM64::Q2_Q3_Q4,
453 ARM64::Q3_Q4_Q5, ARM64::Q4_Q5_Q6, ARM64::Q5_Q6_Q7,
454 ARM64::Q6_Q7_Q8, ARM64::Q7_Q8_Q9, ARM64::Q8_Q9_Q10,
455 ARM64::Q9_Q10_Q11, ARM64::Q10_Q11_Q12, ARM64::Q11_Q12_Q13,
456 ARM64::Q12_Q13_Q14, ARM64::Q13_Q14_Q15, ARM64::Q14_Q15_Q16,
457 ARM64::Q15_Q16_Q17, ARM64::Q16_Q17_Q18, ARM64::Q17_Q18_Q19,
458 ARM64::Q18_Q19_Q20, ARM64::Q19_Q20_Q21, ARM64::Q20_Q21_Q22,
459 ARM64::Q21_Q22_Q23, ARM64::Q22_Q23_Q24, ARM64::Q23_Q24_Q25,
460 ARM64::Q24_Q25_Q26, ARM64::Q25_Q26_Q27, ARM64::Q26_Q27_Q28,
461 ARM64::Q27_Q28_Q29, ARM64::Q28_Q29_Q30, ARM64::Q29_Q30_Q31,
462 ARM64::Q30_Q31_Q0, ARM64::Q31_Q0_Q1
465 static DecodeStatus DecodeQQQRegisterClass(MCInst &Inst, unsigned RegNo,
466 uint64_t Addr, const void *Decoder) {
469 unsigned Register = QQQDecoderTable[RegNo];
470 Inst.addOperand(MCOperand::CreateReg(Register));
474 static const unsigned QQQQDecoderTable[] = {
475 ARM64::Q0_Q1_Q2_Q3, ARM64::Q1_Q2_Q3_Q4, ARM64::Q2_Q3_Q4_Q5,
476 ARM64::Q3_Q4_Q5_Q6, ARM64::Q4_Q5_Q6_Q7, ARM64::Q5_Q6_Q7_Q8,
477 ARM64::Q6_Q7_Q8_Q9, ARM64::Q7_Q8_Q9_Q10, ARM64::Q8_Q9_Q10_Q11,
478 ARM64::Q9_Q10_Q11_Q12, ARM64::Q10_Q11_Q12_Q13, ARM64::Q11_Q12_Q13_Q14,
479 ARM64::Q12_Q13_Q14_Q15, ARM64::Q13_Q14_Q15_Q16, ARM64::Q14_Q15_Q16_Q17,
480 ARM64::Q15_Q16_Q17_Q18, ARM64::Q16_Q17_Q18_Q19, ARM64::Q17_Q18_Q19_Q20,
481 ARM64::Q18_Q19_Q20_Q21, ARM64::Q19_Q20_Q21_Q22, ARM64::Q20_Q21_Q22_Q23,
482 ARM64::Q21_Q22_Q23_Q24, ARM64::Q22_Q23_Q24_Q25, ARM64::Q23_Q24_Q25_Q26,
483 ARM64::Q24_Q25_Q26_Q27, ARM64::Q25_Q26_Q27_Q28, ARM64::Q26_Q27_Q28_Q29,
484 ARM64::Q27_Q28_Q29_Q30, ARM64::Q28_Q29_Q30_Q31, ARM64::Q29_Q30_Q31_Q0,
485 ARM64::Q30_Q31_Q0_Q1, ARM64::Q31_Q0_Q1_Q2
488 static DecodeStatus DecodeQQQQRegisterClass(MCInst &Inst, unsigned RegNo,
490 const void *Decoder) {
493 unsigned Register = QQQQDecoderTable[RegNo];
494 Inst.addOperand(MCOperand::CreateReg(Register));
498 static const unsigned DDDecoderTable[] = {
499 ARM64::D0_D1, ARM64::D1_D2, ARM64::D2_D3, ARM64::D3_D4,
500 ARM64::D4_D5, ARM64::D5_D6, ARM64::D6_D7, ARM64::D7_D8,
501 ARM64::D8_D9, ARM64::D9_D10, ARM64::D10_D11, ARM64::D11_D12,
502 ARM64::D12_D13, ARM64::D13_D14, ARM64::D14_D15, ARM64::D15_D16,
503 ARM64::D16_D17, ARM64::D17_D18, ARM64::D18_D19, ARM64::D19_D20,
504 ARM64::D20_D21, ARM64::D21_D22, ARM64::D22_D23, ARM64::D23_D24,
505 ARM64::D24_D25, ARM64::D25_D26, ARM64::D26_D27, ARM64::D27_D28,
506 ARM64::D28_D29, ARM64::D29_D30, ARM64::D30_D31, ARM64::D31_D0
509 static DecodeStatus DecodeDDRegisterClass(MCInst &Inst, unsigned RegNo,
510 uint64_t Addr, const void *Decoder) {
513 unsigned Register = DDDecoderTable[RegNo];
514 Inst.addOperand(MCOperand::CreateReg(Register));
518 static const unsigned DDDDecoderTable[] = {
519 ARM64::D0_D1_D2, ARM64::D1_D2_D3, ARM64::D2_D3_D4,
520 ARM64::D3_D4_D5, ARM64::D4_D5_D6, ARM64::D5_D6_D7,
521 ARM64::D6_D7_D8, ARM64::D7_D8_D9, ARM64::D8_D9_D10,
522 ARM64::D9_D10_D11, ARM64::D10_D11_D12, ARM64::D11_D12_D13,
523 ARM64::D12_D13_D14, ARM64::D13_D14_D15, ARM64::D14_D15_D16,
524 ARM64::D15_D16_D17, ARM64::D16_D17_D18, ARM64::D17_D18_D19,
525 ARM64::D18_D19_D20, ARM64::D19_D20_D21, ARM64::D20_D21_D22,
526 ARM64::D21_D22_D23, ARM64::D22_D23_D24, ARM64::D23_D24_D25,
527 ARM64::D24_D25_D26, ARM64::D25_D26_D27, ARM64::D26_D27_D28,
528 ARM64::D27_D28_D29, ARM64::D28_D29_D30, ARM64::D29_D30_D31,
529 ARM64::D30_D31_D0, ARM64::D31_D0_D1
532 static DecodeStatus DecodeDDDRegisterClass(MCInst &Inst, unsigned RegNo,
533 uint64_t Addr, const void *Decoder) {
536 unsigned Register = DDDDecoderTable[RegNo];
537 Inst.addOperand(MCOperand::CreateReg(Register));
541 static const unsigned DDDDDecoderTable[] = {
542 ARM64::D0_D1_D2_D3, ARM64::D1_D2_D3_D4, ARM64::D2_D3_D4_D5,
543 ARM64::D3_D4_D5_D6, ARM64::D4_D5_D6_D7, ARM64::D5_D6_D7_D8,
544 ARM64::D6_D7_D8_D9, ARM64::D7_D8_D9_D10, ARM64::D8_D9_D10_D11,
545 ARM64::D9_D10_D11_D12, ARM64::D10_D11_D12_D13, ARM64::D11_D12_D13_D14,
546 ARM64::D12_D13_D14_D15, ARM64::D13_D14_D15_D16, ARM64::D14_D15_D16_D17,
547 ARM64::D15_D16_D17_D18, ARM64::D16_D17_D18_D19, ARM64::D17_D18_D19_D20,
548 ARM64::D18_D19_D20_D21, ARM64::D19_D20_D21_D22, ARM64::D20_D21_D22_D23,
549 ARM64::D21_D22_D23_D24, ARM64::D22_D23_D24_D25, ARM64::D23_D24_D25_D26,
550 ARM64::D24_D25_D26_D27, ARM64::D25_D26_D27_D28, ARM64::D26_D27_D28_D29,
551 ARM64::D27_D28_D29_D30, ARM64::D28_D29_D30_D31, ARM64::D29_D30_D31_D0,
552 ARM64::D30_D31_D0_D1, ARM64::D31_D0_D1_D2
555 static DecodeStatus DecodeDDDDRegisterClass(MCInst &Inst, unsigned RegNo,
557 const void *Decoder) {
560 unsigned Register = DDDDDecoderTable[RegNo];
561 Inst.addOperand(MCOperand::CreateReg(Register));
565 static DecodeStatus DecodeFixedPointScaleImm32(llvm::MCInst &Inst, unsigned Imm,
567 const void *Decoder) {
568 // scale{5} is asserted as 1 in tblgen.
570 Inst.addOperand(MCOperand::CreateImm(64 - Imm));
574 static DecodeStatus DecodeFixedPointScaleImm64(llvm::MCInst &Inst, unsigned Imm,
576 const void *Decoder) {
577 Inst.addOperand(MCOperand::CreateImm(64 - Imm));
581 static DecodeStatus DecodeCondBranchTarget(llvm::MCInst &Inst, unsigned Imm,
582 uint64_t Addr, const void *Decoder) {
583 int64_t ImmVal = Imm;
584 const ARM64Disassembler *Dis =
585 static_cast<const ARM64Disassembler *>(Decoder);
587 // Sign-extend 19-bit immediate.
588 if (ImmVal & (1 << (19 - 1)))
589 ImmVal |= ~((1LL << 19) - 1);
591 if (!Dis->tryAddingSymbolicOperand(Inst, ImmVal << 2, Addr,
592 Inst.getOpcode() != ARM64::LDRXl, 0, 4))
593 Inst.addOperand(MCOperand::CreateImm(ImmVal));
597 static DecodeStatus DecodeMRSSystemRegister(llvm::MCInst &Inst, unsigned Imm,
599 const void *Decoder) {
601 Inst.addOperand(MCOperand::CreateImm(Imm));
604 (void)ARM64SysReg::MRSMapper().toString(Imm, ValidNamed);
606 return ValidNamed ? Success : Fail;
609 static DecodeStatus DecodeMSRSystemRegister(llvm::MCInst &Inst, unsigned Imm,
611 const void *Decoder) {
613 Inst.addOperand(MCOperand::CreateImm(Imm));
616 (void)ARM64SysReg::MSRMapper().toString(Imm, ValidNamed);
618 return ValidNamed ? Success : Fail;
621 static DecodeStatus DecodeVecShiftRImm(llvm::MCInst &Inst, unsigned Imm,
623 Inst.addOperand(MCOperand::CreateImm(Add - Imm));
627 static DecodeStatus DecodeVecShiftLImm(llvm::MCInst &Inst, unsigned Imm,
629 Inst.addOperand(MCOperand::CreateImm((Imm + Add) & (Add - 1)));
633 static DecodeStatus DecodeVecShiftR64Imm(llvm::MCInst &Inst, unsigned Imm,
634 uint64_t Addr, const void *Decoder) {
635 return DecodeVecShiftRImm(Inst, Imm, 64);
638 static DecodeStatus DecodeVecShiftR64ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
640 const void *Decoder) {
641 return DecodeVecShiftRImm(Inst, Imm | 0x20, 64);
644 static DecodeStatus DecodeVecShiftR32Imm(llvm::MCInst &Inst, unsigned Imm,
645 uint64_t Addr, const void *Decoder) {
646 return DecodeVecShiftRImm(Inst, Imm, 32);
649 static DecodeStatus DecodeVecShiftR32ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
651 const void *Decoder) {
652 return DecodeVecShiftRImm(Inst, Imm | 0x10, 32);
655 static DecodeStatus DecodeVecShiftR16Imm(llvm::MCInst &Inst, unsigned Imm,
656 uint64_t Addr, const void *Decoder) {
657 return DecodeVecShiftRImm(Inst, Imm, 16);
660 static DecodeStatus DecodeVecShiftR16ImmNarrow(llvm::MCInst &Inst, unsigned Imm,
662 const void *Decoder) {
663 return DecodeVecShiftRImm(Inst, Imm | 0x8, 16);
666 static DecodeStatus DecodeVecShiftR8Imm(llvm::MCInst &Inst, unsigned Imm,
667 uint64_t Addr, const void *Decoder) {
668 return DecodeVecShiftRImm(Inst, Imm, 8);
671 static DecodeStatus DecodeVecShiftL64Imm(llvm::MCInst &Inst, unsigned Imm,
672 uint64_t Addr, const void *Decoder) {
673 return DecodeVecShiftLImm(Inst, Imm, 64);
676 static DecodeStatus DecodeVecShiftL32Imm(llvm::MCInst &Inst, unsigned Imm,
677 uint64_t Addr, const void *Decoder) {
678 return DecodeVecShiftLImm(Inst, Imm, 32);
681 static DecodeStatus DecodeVecShiftL16Imm(llvm::MCInst &Inst, unsigned Imm,
682 uint64_t Addr, const void *Decoder) {
683 return DecodeVecShiftLImm(Inst, Imm, 16);
686 static DecodeStatus DecodeVecShiftL8Imm(llvm::MCInst &Inst, unsigned Imm,
687 uint64_t Addr, const void *Decoder) {
688 return DecodeVecShiftLImm(Inst, Imm, 8);
691 static DecodeStatus DecodeThreeAddrSRegInstruction(llvm::MCInst &Inst,
692 uint32_t insn, uint64_t Addr,
693 const void *Decoder) {
694 unsigned Rd = fieldFromInstruction(insn, 0, 5);
695 unsigned Rn = fieldFromInstruction(insn, 5, 5);
696 unsigned Rm = fieldFromInstruction(insn, 16, 5);
697 unsigned shiftHi = fieldFromInstruction(insn, 22, 2);
698 unsigned shiftLo = fieldFromInstruction(insn, 10, 6);
699 unsigned shift = (shiftHi << 6) | shiftLo;
700 switch (Inst.getOpcode()) {
707 // if shift == '11' then ReservedValue()
710 // Deliberate fallthrough
718 case ARM64::EONWrs: {
719 // if sf == '0' and imm6<5> == '1' then ReservedValue()
720 if (shiftLo >> 5 == 1)
722 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
723 DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
724 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
731 // if shift == '11' then ReservedValue()
734 // Deliberate fallthrough
743 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
744 DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
745 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
749 Inst.addOperand(MCOperand::CreateImm(shift));
753 static DecodeStatus DecodeMoveImmInstruction(llvm::MCInst &Inst, uint32_t insn,
755 const void *Decoder) {
756 unsigned Rd = fieldFromInstruction(insn, 0, 5);
757 unsigned imm = fieldFromInstruction(insn, 5, 16);
758 unsigned shift = fieldFromInstruction(insn, 21, 2);
760 switch (Inst.getOpcode()) {
766 if (shift & (1U << 5))
768 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
773 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
777 if (Inst.getOpcode() == ARM64::MOVKWi || Inst.getOpcode() == ARM64::MOVKXi)
778 Inst.addOperand(Inst.getOperand(0));
780 Inst.addOperand(MCOperand::CreateImm(imm));
781 Inst.addOperand(MCOperand::CreateImm(shift));
785 static DecodeStatus DecodeUnsignedLdStInstruction(llvm::MCInst &Inst,
786 uint32_t insn, uint64_t Addr,
787 const void *Decoder) {
788 unsigned Rt = fieldFromInstruction(insn, 0, 5);
789 unsigned Rn = fieldFromInstruction(insn, 5, 5);
790 unsigned offset = fieldFromInstruction(insn, 10, 12);
791 const ARM64Disassembler *Dis =
792 static_cast<const ARM64Disassembler *>(Decoder);
794 switch (Inst.getOpcode()) {
798 // Rt is an immediate in prefetch.
799 Inst.addOperand(MCOperand::CreateImm(Rt));
803 case ARM64::LDRSBWui:
806 case ARM64::LDRSHWui:
809 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
811 case ARM64::LDRSBXui:
812 case ARM64::LDRSHXui:
816 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
820 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
824 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
828 DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
832 DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
836 DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
840 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
841 if (!Dis->tryAddingSymbolicOperand(Inst, offset, Addr, Fail, 0, 4))
842 Inst.addOperand(MCOperand::CreateImm(offset));
846 static DecodeStatus DecodeSignedLdStInstruction(llvm::MCInst &Inst,
847 uint32_t insn, uint64_t Addr,
848 const void *Decoder) {
849 unsigned Rt = fieldFromInstruction(insn, 0, 5);
850 unsigned Rn = fieldFromInstruction(insn, 5, 5);
851 int64_t offset = fieldFromInstruction(insn, 12, 9);
853 // offset is a 9-bit signed immediate, so sign extend it to
854 // fill the unsigned.
855 if (offset & (1 << (9 - 1)))
856 offset |= ~((1LL << 9) - 1);
858 switch (Inst.getOpcode()) {
862 // Rt is an immediate in prefetch.
863 Inst.addOperand(MCOperand::CreateImm(Rt));
867 case ARM64::LDURSBWi:
870 case ARM64::LDURSHWi:
873 case ARM64::LDTRSBWi:
874 case ARM64::LDTRSHWi:
881 case ARM64::LDRSBWpre:
882 case ARM64::LDRSHWpre:
883 case ARM64::STRBBpre:
884 case ARM64::LDRBBpre:
885 case ARM64::STRHHpre:
886 case ARM64::LDRHHpre:
889 case ARM64::LDRSBWpost:
890 case ARM64::LDRSHWpost:
891 case ARM64::STRBBpost:
892 case ARM64::LDRBBpost:
893 case ARM64::STRHHpost:
894 case ARM64::LDRHHpost:
895 case ARM64::STRWpost:
896 case ARM64::LDRWpost:
897 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
899 case ARM64::LDURSBXi:
900 case ARM64::LDURSHXi:
904 case ARM64::LDTRSBXi:
905 case ARM64::LDTRSHXi:
909 case ARM64::LDRSBXpre:
910 case ARM64::LDRSHXpre:
912 case ARM64::LDRSWpre:
914 case ARM64::LDRSBXpost:
915 case ARM64::LDRSHXpost:
916 case ARM64::STRXpost:
917 case ARM64::LDRSWpost:
918 case ARM64::LDRXpost:
919 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
925 case ARM64::LDRQpost:
926 case ARM64::STRQpost:
927 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
933 case ARM64::LDRDpost:
934 case ARM64::STRDpost:
935 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
941 case ARM64::LDRSpost:
942 case ARM64::STRSpost:
943 DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
949 case ARM64::LDRHpost:
950 case ARM64::STRHpost:
951 DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
957 case ARM64::LDRBpost:
958 case ARM64::STRBpost:
959 DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
963 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
964 Inst.addOperand(MCOperand::CreateImm(offset));
968 static DecodeStatus DecodeExclusiveLdStInstruction(llvm::MCInst &Inst,
969 uint32_t insn, uint64_t Addr,
970 const void *Decoder) {
971 unsigned Rt = fieldFromInstruction(insn, 0, 5);
972 unsigned Rn = fieldFromInstruction(insn, 5, 5);
973 unsigned Rt2 = fieldFromInstruction(insn, 10, 5);
974 unsigned Rs = fieldFromInstruction(insn, 16, 5);
976 switch (Inst.getOpcode()) {
985 DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
999 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1003 DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1009 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1013 DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1017 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1018 DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1022 DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1026 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1027 DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1031 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1035 static DecodeStatus DecodePairLdStInstruction(llvm::MCInst &Inst, uint32_t insn,
1037 const void *Decoder) {
1038 unsigned Rt = fieldFromInstruction(insn, 0, 5);
1039 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1040 unsigned Rt2 = fieldFromInstruction(insn, 10, 5);
1041 int64_t offset = fieldFromInstruction(insn, 15, 7);
1043 // offset is a 7-bit signed immediate, so sign extend it to
1044 // fill the unsigned.
1045 if (offset & (1 << (7 - 1)))
1046 offset |= ~((1LL << 7) - 1);
1048 switch (Inst.getOpcode()) {
1053 case ARM64::LDPXpost:
1054 case ARM64::STPXpost:
1055 case ARM64::LDPSWpost:
1059 case ARM64::LDPXpre:
1060 case ARM64::STPXpre:
1061 case ARM64::LDPSWpre:
1062 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1063 DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1067 case ARM64::LDPWpost:
1068 case ARM64::STPWpost:
1071 case ARM64::LDPWpre:
1072 case ARM64::STPWpre:
1073 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1074 DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1078 case ARM64::LDPQpost:
1079 case ARM64::STPQpost:
1082 case ARM64::LDPQpre:
1083 case ARM64::STPQpre:
1084 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1085 DecodeFPR128RegisterClass(Inst, Rt2, Addr, Decoder);
1089 case ARM64::LDPDpost:
1090 case ARM64::STPDpost:
1093 case ARM64::LDPDpre:
1094 case ARM64::STPDpre:
1095 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1096 DecodeFPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1100 case ARM64::LDPSpost:
1101 case ARM64::STPSpost:
1104 case ARM64::LDPSpre:
1105 case ARM64::STPSpre:
1106 DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1107 DecodeFPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1111 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1112 Inst.addOperand(MCOperand::CreateImm(offset));
1116 static DecodeStatus DecodeRegOffsetLdStInstruction(llvm::MCInst &Inst,
1117 uint32_t insn, uint64_t Addr,
1118 const void *Decoder) {
1119 unsigned Rt = fieldFromInstruction(insn, 0, 5);
1120 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1121 unsigned Rm = fieldFromInstruction(insn, 16, 5);
1122 unsigned extendHi = fieldFromInstruction(insn, 13, 3);
1123 unsigned extendLo = fieldFromInstruction(insn, 12, 1);
1124 unsigned extend = (extendHi << 1) | extendLo;
1126 // All RO load-store instructions are undefined if option == 00x or 10x.
1127 if (extend >> 2 == 0x0 || extend >> 2 == 0x2)
1130 switch (Inst.getOpcode()) {
1133 case ARM64::LDRSWro:
1134 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1138 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1142 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1146 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1150 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1154 DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1158 DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
1162 DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
1164 case ARM64::LDRBBro:
1165 case ARM64::STRBBro:
1166 case ARM64::LDRSBWro:
1167 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1169 case ARM64::LDRHHro:
1170 case ARM64::STRHHro:
1171 case ARM64::LDRSHWro:
1172 DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1174 case ARM64::LDRSHXro:
1175 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1177 case ARM64::LDRSBXro:
1178 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1181 Inst.addOperand(MCOperand::CreateImm(Rt));
1184 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1185 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1187 Inst.addOperand(MCOperand::CreateImm(extend));
1191 static DecodeStatus DecodeAddSubERegInstruction(llvm::MCInst &Inst,
1192 uint32_t insn, uint64_t Addr,
1193 const void *Decoder) {
1194 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1195 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1196 unsigned Rm = fieldFromInstruction(insn, 16, 5);
1197 unsigned extend = fieldFromInstruction(insn, 10, 6);
1199 unsigned shift = extend & 0x7;
1203 switch (Inst.getOpcode()) {
1208 DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1209 DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1210 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1212 case ARM64::ADDSWrx:
1213 case ARM64::SUBSWrx:
1214 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1215 DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1216 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1220 DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1221 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1222 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1224 case ARM64::ADDSXrx:
1225 case ARM64::SUBSXrx:
1226 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1227 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1228 DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1230 case ARM64::ADDXrx64:
1231 case ARM64::SUBXrx64:
1232 DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1233 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1234 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1236 case ARM64::SUBSXrx64:
1237 case ARM64::ADDSXrx64:
1238 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1239 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1240 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1244 Inst.addOperand(MCOperand::CreateImm(extend));
1248 static DecodeStatus DecodeLogicalImmInstruction(llvm::MCInst &Inst,
1249 uint32_t insn, uint64_t Addr,
1250 const void *Decoder) {
1251 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1252 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1253 unsigned Datasize = fieldFromInstruction(insn, 31, 1);
1257 if (Inst.getOpcode() == ARM64::ANDSXri)
1258 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1260 DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1261 DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
1262 imm = fieldFromInstruction(insn, 10, 13);
1263 if (!ARM64_AM::isValidDecodeLogicalImmediate(imm, 64))
1266 if (Inst.getOpcode() == ARM64::ANDSWri)
1267 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1269 DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1270 DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
1271 imm = fieldFromInstruction(insn, 10, 12);
1272 if (!ARM64_AM::isValidDecodeLogicalImmediate(imm, 32))
1275 Inst.addOperand(MCOperand::CreateImm(imm));
1279 static DecodeStatus DecodeModImmInstruction(llvm::MCInst &Inst, uint32_t insn,
1281 const void *Decoder) {
1282 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1283 unsigned cmode = fieldFromInstruction(insn, 12, 4);
1284 unsigned imm = fieldFromInstruction(insn, 16, 3) << 5;
1285 imm |= fieldFromInstruction(insn, 5, 5);
1287 if (Inst.getOpcode() == ARM64::MOVID)
1288 DecodeFPR64RegisterClass(Inst, Rd, Addr, Decoder);
1290 DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1292 Inst.addOperand(MCOperand::CreateImm(imm));
1294 switch (Inst.getOpcode()) {
1297 case ARM64::MOVIv4i16:
1298 case ARM64::MOVIv8i16:
1299 case ARM64::MVNIv4i16:
1300 case ARM64::MVNIv8i16:
1301 case ARM64::MOVIv2i32:
1302 case ARM64::MOVIv4i32:
1303 case ARM64::MVNIv2i32:
1304 case ARM64::MVNIv4i32:
1305 Inst.addOperand(MCOperand::CreateImm((cmode & 6) << 2));
1307 case ARM64::MOVIv2s_msl:
1308 case ARM64::MOVIv4s_msl:
1309 case ARM64::MVNIv2s_msl:
1310 case ARM64::MVNIv4s_msl:
1311 Inst.addOperand(MCOperand::CreateImm(cmode & 1 ? 0x110 : 0x108));
1318 static DecodeStatus DecodeModImmTiedInstruction(llvm::MCInst &Inst,
1319 uint32_t insn, uint64_t Addr,
1320 const void *Decoder) {
1321 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1322 unsigned cmode = fieldFromInstruction(insn, 12, 4);
1323 unsigned imm = fieldFromInstruction(insn, 16, 3) << 5;
1324 imm |= fieldFromInstruction(insn, 5, 5);
1326 // Tied operands added twice.
1327 DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1328 DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1330 Inst.addOperand(MCOperand::CreateImm(imm));
1331 Inst.addOperand(MCOperand::CreateImm((cmode & 6) << 2));
1336 static DecodeStatus DecodeAdrInstruction(llvm::MCInst &Inst, uint32_t insn,
1337 uint64_t Addr, const void *Decoder) {
1338 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1339 int64_t imm = fieldFromInstruction(insn, 5, 19) << 2;
1340 imm |= fieldFromInstruction(insn, 29, 2);
1341 const ARM64Disassembler *Dis =
1342 static_cast<const ARM64Disassembler *>(Decoder);
1344 // Sign-extend the 21-bit immediate.
1345 if (imm & (1 << (21 - 1)))
1346 imm |= ~((1LL << 21) - 1);
1348 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1349 if (!Dis->tryAddingSymbolicOperand(Inst, imm, Addr, Fail, 0, 4))
1350 Inst.addOperand(MCOperand::CreateImm(imm));
1355 static DecodeStatus DecodeBaseAddSubImm(llvm::MCInst &Inst, uint32_t insn,
1356 uint64_t Addr, const void *Decoder) {
1357 unsigned Rd = fieldFromInstruction(insn, 0, 5);
1358 unsigned Rn = fieldFromInstruction(insn, 5, 5);
1359 unsigned Imm = fieldFromInstruction(insn, 10, 14);
1360 unsigned S = fieldFromInstruction(insn, 29, 1);
1361 unsigned Datasize = fieldFromInstruction(insn, 31, 1);
1363 unsigned ShifterVal = (Imm >> 12) & 3;
1364 unsigned ImmVal = Imm & 0xFFF;
1365 const ARM64Disassembler *Dis =
1366 static_cast<const ARM64Disassembler *>(Decoder);
1368 if (ShifterVal != 0 && ShifterVal != 1)
1373 DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1375 DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1376 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1379 DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1381 DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1382 DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1385 if (!Dis->tryAddingSymbolicOperand(Inst, Imm, Addr, Fail, 0, 4))
1386 Inst.addOperand(MCOperand::CreateImm(ImmVal));
1387 Inst.addOperand(MCOperand::CreateImm(12 * ShifterVal));
1391 static DecodeStatus DecodeUnconditionalBranch(llvm::MCInst &Inst, uint32_t insn,
1393 const void *Decoder) {
1394 int64_t imm = fieldFromInstruction(insn, 0, 26);
1395 const ARM64Disassembler *Dis =
1396 static_cast<const ARM64Disassembler *>(Decoder);
1398 // Sign-extend the 26-bit immediate.
1399 if (imm & (1 << (26 - 1)))
1400 imm |= ~((1LL << 26) - 1);
1402 if (!Dis->tryAddingSymbolicOperand(Inst, imm << 2, Addr, true, 0, 4))
1403 Inst.addOperand(MCOperand::CreateImm(imm));
1408 static DecodeStatus DecodeSystemCPSRInstruction(llvm::MCInst &Inst,
1409 uint32_t insn, uint64_t Addr,
1410 const void *Decoder) {
1411 uint64_t op1 = fieldFromInstruction(insn, 16, 3);
1412 uint64_t op2 = fieldFromInstruction(insn, 5, 3);
1413 uint64_t crm = fieldFromInstruction(insn, 8, 4);
1415 uint64_t cpsr_field = (op1 << 3) | op2;
1417 Inst.addOperand(MCOperand::CreateImm(cpsr_field));
1418 Inst.addOperand(MCOperand::CreateImm(crm));
1421 (void)ARM64PState::PStateMapper().toString(cpsr_field, ValidNamed);
1423 return ValidNamed ? Success : Fail;
1426 static DecodeStatus DecodeTestAndBranch(llvm::MCInst &Inst, uint32_t insn,
1427 uint64_t Addr, const void *Decoder) {
1428 uint64_t Rt = fieldFromInstruction(insn, 0, 5);
1429 uint64_t bit = fieldFromInstruction(insn, 31, 1) << 5;
1430 bit |= fieldFromInstruction(insn, 19, 5);
1431 int64_t dst = fieldFromInstruction(insn, 5, 14);
1432 const ARM64Disassembler *Dis =
1433 static_cast<const ARM64Disassembler *>(Decoder);
1435 // Sign-extend 14-bit immediate.
1436 if (dst & (1 << (14 - 1)))
1437 dst |= ~((1LL << 14) - 1);
1439 DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1440 Inst.addOperand(MCOperand::CreateImm(bit));
1441 if (!Dis->tryAddingSymbolicOperand(Inst, dst << 2, Addr, true, 0, 4))
1442 Inst.addOperand(MCOperand::CreateImm(dst));
1447 static DecodeStatus DecodeSIMDLdStPost(llvm::MCInst &Inst, uint32_t insn,
1448 uint64_t Addr, const void *Decoder) {
1449 uint64_t Rd = fieldFromInstruction(insn, 0, 5);
1450 uint64_t Rn = fieldFromInstruction(insn, 5, 5);
1451 uint64_t Rm = fieldFromInstruction(insn, 16, 5);
1453 switch (Inst.getOpcode()) {
1456 case ARM64::ST1Onev8b_POST:
1457 case ARM64::ST1Onev4h_POST:
1458 case ARM64::ST1Onev2s_POST:
1459 case ARM64::ST1Onev1d_POST:
1460 case ARM64::LD1Onev8b_POST:
1461 case ARM64::LD1Onev4h_POST:
1462 case ARM64::LD1Onev2s_POST:
1463 case ARM64::LD1Onev1d_POST:
1464 DecodeFPR64RegisterClass(Inst, Rd, Addr, Decoder);
1466 case ARM64::ST1Onev16b_POST:
1467 case ARM64::ST1Onev8h_POST:
1468 case ARM64::ST1Onev4s_POST:
1469 case ARM64::ST1Onev2d_POST:
1470 case ARM64::LD1Onev16b_POST:
1471 case ARM64::LD1Onev8h_POST:
1472 case ARM64::LD1Onev4s_POST:
1473 case ARM64::LD1Onev2d_POST:
1474 DecodeFPR128RegisterClass(Inst, Rd, Addr, Decoder);
1476 case ARM64::ST1Twov8b_POST:
1477 case ARM64::ST1Twov4h_POST:
1478 case ARM64::ST1Twov2s_POST:
1479 case ARM64::ST1Twov1d_POST:
1480 case ARM64::ST2Twov8b_POST:
1481 case ARM64::ST2Twov4h_POST:
1482 case ARM64::ST2Twov2s_POST:
1483 case ARM64::LD1Twov8b_POST:
1484 case ARM64::LD1Twov4h_POST:
1485 case ARM64::LD1Twov2s_POST:
1486 case ARM64::LD1Twov1d_POST:
1487 case ARM64::LD2Twov8b_POST:
1488 case ARM64::LD2Twov4h_POST:
1489 case ARM64::LD2Twov2s_POST:
1490 DecodeDDRegisterClass(Inst, Rd, Addr, Decoder);
1492 case ARM64::ST1Threev8b_POST:
1493 case ARM64::ST1Threev4h_POST:
1494 case ARM64::ST1Threev2s_POST:
1495 case ARM64::ST1Threev1d_POST:
1496 case ARM64::ST3Threev8b_POST:
1497 case ARM64::ST3Threev4h_POST:
1498 case ARM64::ST3Threev2s_POST:
1499 case ARM64::LD1Threev8b_POST:
1500 case ARM64::LD1Threev4h_POST:
1501 case ARM64::LD1Threev2s_POST:
1502 case ARM64::LD1Threev1d_POST:
1503 case ARM64::LD3Threev8b_POST:
1504 case ARM64::LD3Threev4h_POST:
1505 case ARM64::LD3Threev2s_POST:
1506 DecodeDDDRegisterClass(Inst, Rd, Addr, Decoder);
1508 case ARM64::ST1Fourv8b_POST:
1509 case ARM64::ST1Fourv4h_POST:
1510 case ARM64::ST1Fourv2s_POST:
1511 case ARM64::ST1Fourv1d_POST:
1512 case ARM64::ST4Fourv8b_POST:
1513 case ARM64::ST4Fourv4h_POST:
1514 case ARM64::ST4Fourv2s_POST:
1515 case ARM64::LD1Fourv8b_POST:
1516 case ARM64::LD1Fourv4h_POST:
1517 case ARM64::LD1Fourv2s_POST:
1518 case ARM64::LD1Fourv1d_POST:
1519 case ARM64::LD4Fourv8b_POST:
1520 case ARM64::LD4Fourv4h_POST:
1521 case ARM64::LD4Fourv2s_POST:
1522 DecodeDDDDRegisterClass(Inst, Rd, Addr, Decoder);
1524 case ARM64::ST1Twov16b_POST:
1525 case ARM64::ST1Twov8h_POST:
1526 case ARM64::ST1Twov4s_POST:
1527 case ARM64::ST1Twov2d_POST:
1528 case ARM64::ST2Twov16b_POST:
1529 case ARM64::ST2Twov8h_POST:
1530 case ARM64::ST2Twov4s_POST:
1531 case ARM64::ST2Twov2d_POST:
1532 case ARM64::LD1Twov16b_POST:
1533 case ARM64::LD1Twov8h_POST:
1534 case ARM64::LD1Twov4s_POST:
1535 case ARM64::LD1Twov2d_POST:
1536 case ARM64::LD2Twov16b_POST:
1537 case ARM64::LD2Twov8h_POST:
1538 case ARM64::LD2Twov4s_POST:
1539 case ARM64::LD2Twov2d_POST:
1540 DecodeQQRegisterClass(Inst, Rd, Addr, Decoder);
1542 case ARM64::ST1Threev16b_POST:
1543 case ARM64::ST1Threev8h_POST:
1544 case ARM64::ST1Threev4s_POST:
1545 case ARM64::ST1Threev2d_POST:
1546 case ARM64::ST3Threev16b_POST:
1547 case ARM64::ST3Threev8h_POST:
1548 case ARM64::ST3Threev4s_POST:
1549 case ARM64::ST3Threev2d_POST:
1550 case ARM64::LD1Threev16b_POST:
1551 case ARM64::LD1Threev8h_POST:
1552 case ARM64::LD1Threev4s_POST:
1553 case ARM64::LD1Threev2d_POST:
1554 case ARM64::LD3Threev16b_POST:
1555 case ARM64::LD3Threev8h_POST:
1556 case ARM64::LD3Threev4s_POST:
1557 case ARM64::LD3Threev2d_POST:
1558 DecodeQQQRegisterClass(Inst, Rd, Addr, Decoder);
1560 case ARM64::ST1Fourv16b_POST:
1561 case ARM64::ST1Fourv8h_POST:
1562 case ARM64::ST1Fourv4s_POST:
1563 case ARM64::ST1Fourv2d_POST:
1564 case ARM64::ST4Fourv16b_POST:
1565 case ARM64::ST4Fourv8h_POST:
1566 case ARM64::ST4Fourv4s_POST:
1567 case ARM64::ST4Fourv2d_POST:
1568 case ARM64::LD1Fourv16b_POST:
1569 case ARM64::LD1Fourv8h_POST:
1570 case ARM64::LD1Fourv4s_POST:
1571 case ARM64::LD1Fourv2d_POST:
1572 case ARM64::LD4Fourv16b_POST:
1573 case ARM64::LD4Fourv8h_POST:
1574 case ARM64::LD4Fourv4s_POST:
1575 case ARM64::LD4Fourv2d_POST:
1576 DecodeQQQQRegisterClass(Inst, Rd, Addr, Decoder);
1580 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1581 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1585 static DecodeStatus DecodeSIMDLdStSingle(llvm::MCInst &Inst, uint32_t insn,
1586 uint64_t Addr, const void *Decoder) {
1587 uint64_t Rt = fieldFromInstruction(insn, 0, 5);
1588 uint64_t Rn = fieldFromInstruction(insn, 5, 5);
1589 uint64_t Rm = fieldFromInstruction(insn, 16, 5);
1590 uint64_t size = fieldFromInstruction(insn, 10, 2);
1591 uint64_t S = fieldFromInstruction(insn, 12, 1);
1592 uint64_t Q = fieldFromInstruction(insn, 30, 1);
1595 switch (Inst.getOpcode()) {
1597 case ARM64::ST1i8_POST:
1599 case ARM64::ST2i8_POST:
1600 case ARM64::ST3i8_POST:
1602 case ARM64::ST4i8_POST:
1604 index = (Q << 3) | (S << 2) | size;
1607 case ARM64::ST1i16_POST:
1609 case ARM64::ST2i16_POST:
1610 case ARM64::ST3i16_POST:
1612 case ARM64::ST4i16_POST:
1614 index = (Q << 2) | (S << 1) | (size >> 1);
1617 case ARM64::ST1i32_POST:
1619 case ARM64::ST2i32_POST:
1620 case ARM64::ST3i32_POST:
1622 case ARM64::ST4i32_POST:
1624 index = (Q << 1) | S;
1627 case ARM64::ST1i64_POST:
1629 case ARM64::ST2i64_POST:
1630 case ARM64::ST3i64_POST:
1632 case ARM64::ST4i64_POST:
1638 switch (Inst.getOpcode()) {
1641 case ARM64::LD1Rv8b:
1642 case ARM64::LD1Rv8b_POST:
1643 case ARM64::LD1Rv4h:
1644 case ARM64::LD1Rv4h_POST:
1645 case ARM64::LD1Rv2s:
1646 case ARM64::LD1Rv2s_POST:
1647 case ARM64::LD1Rv1d:
1648 case ARM64::LD1Rv1d_POST:
1649 DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1651 case ARM64::LD1Rv16b:
1652 case ARM64::LD1Rv16b_POST:
1653 case ARM64::LD1Rv8h:
1654 case ARM64::LD1Rv8h_POST:
1655 case ARM64::LD1Rv4s:
1656 case ARM64::LD1Rv4s_POST:
1657 case ARM64::LD1Rv2d:
1658 case ARM64::LD1Rv2d_POST:
1660 case ARM64::ST1i8_POST:
1662 case ARM64::ST1i16_POST:
1664 case ARM64::ST1i32_POST:
1666 case ARM64::ST1i64_POST:
1667 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1669 case ARM64::LD2Rv16b:
1670 case ARM64::LD2Rv16b_POST:
1671 case ARM64::LD2Rv8h:
1672 case ARM64::LD2Rv8h_POST:
1673 case ARM64::LD2Rv4s:
1674 case ARM64::LD2Rv4s_POST:
1675 case ARM64::LD2Rv2d:
1676 case ARM64::LD2Rv2d_POST:
1678 case ARM64::ST2i8_POST:
1680 case ARM64::ST2i16_POST:
1682 case ARM64::ST2i32_POST:
1684 case ARM64::ST2i64_POST:
1685 DecodeQQRegisterClass(Inst, Rt, Addr, Decoder);
1687 case ARM64::LD2Rv8b:
1688 case ARM64::LD2Rv8b_POST:
1689 case ARM64::LD2Rv4h:
1690 case ARM64::LD2Rv4h_POST:
1691 case ARM64::LD2Rv2s:
1692 case ARM64::LD2Rv2s_POST:
1693 case ARM64::LD2Rv1d:
1694 case ARM64::LD2Rv1d_POST:
1695 DecodeDDRegisterClass(Inst, Rt, Addr, Decoder);
1697 case ARM64::LD3Rv8b:
1698 case ARM64::LD3Rv8b_POST:
1699 case ARM64::LD3Rv4h:
1700 case ARM64::LD3Rv4h_POST:
1701 case ARM64::LD3Rv2s:
1702 case ARM64::LD3Rv2s_POST:
1703 case ARM64::LD3Rv1d:
1704 case ARM64::LD3Rv1d_POST:
1705 DecodeDDDRegisterClass(Inst, Rt, Addr, Decoder);
1707 case ARM64::LD3Rv16b:
1708 case ARM64::LD3Rv16b_POST:
1709 case ARM64::LD3Rv8h:
1710 case ARM64::LD3Rv8h_POST:
1711 case ARM64::LD3Rv4s:
1712 case ARM64::LD3Rv4s_POST:
1713 case ARM64::LD3Rv2d:
1714 case ARM64::LD3Rv2d_POST:
1716 case ARM64::ST3i8_POST:
1718 case ARM64::ST3i16_POST:
1720 case ARM64::ST3i32_POST:
1722 case ARM64::ST3i64_POST:
1723 DecodeQQQRegisterClass(Inst, Rt, Addr, Decoder);
1725 case ARM64::LD4Rv8b:
1726 case ARM64::LD4Rv8b_POST:
1727 case ARM64::LD4Rv4h:
1728 case ARM64::LD4Rv4h_POST:
1729 case ARM64::LD4Rv2s:
1730 case ARM64::LD4Rv2s_POST:
1731 case ARM64::LD4Rv1d:
1732 case ARM64::LD4Rv1d_POST:
1733 DecodeDDDDRegisterClass(Inst, Rt, Addr, Decoder);
1735 case ARM64::LD4Rv16b:
1736 case ARM64::LD4Rv16b_POST:
1737 case ARM64::LD4Rv8h:
1738 case ARM64::LD4Rv8h_POST:
1739 case ARM64::LD4Rv4s:
1740 case ARM64::LD4Rv4s_POST:
1741 case ARM64::LD4Rv2d:
1742 case ARM64::LD4Rv2d_POST:
1744 case ARM64::ST4i8_POST:
1746 case ARM64::ST4i16_POST:
1748 case ARM64::ST4i32_POST:
1750 case ARM64::ST4i64_POST:
1751 DecodeQQQQRegisterClass(Inst, Rt, Addr, Decoder);
1755 switch (Inst.getOpcode()) {
1756 case ARM64::LD1Rv8b:
1757 case ARM64::LD1Rv8b_POST:
1758 case ARM64::LD1Rv16b:
1759 case ARM64::LD1Rv16b_POST:
1760 case ARM64::LD1Rv4h:
1761 case ARM64::LD1Rv4h_POST:
1762 case ARM64::LD1Rv8h:
1763 case ARM64::LD1Rv8h_POST:
1764 case ARM64::LD1Rv4s:
1765 case ARM64::LD1Rv4s_POST:
1766 case ARM64::LD1Rv2s:
1767 case ARM64::LD1Rv2s_POST:
1768 case ARM64::LD1Rv1d:
1769 case ARM64::LD1Rv1d_POST:
1770 case ARM64::LD1Rv2d:
1771 case ARM64::LD1Rv2d_POST:
1772 case ARM64::LD2Rv8b:
1773 case ARM64::LD2Rv8b_POST:
1774 case ARM64::LD2Rv16b:
1775 case ARM64::LD2Rv16b_POST:
1776 case ARM64::LD2Rv4h:
1777 case ARM64::LD2Rv4h_POST:
1778 case ARM64::LD2Rv8h:
1779 case ARM64::LD2Rv8h_POST:
1780 case ARM64::LD2Rv2s:
1781 case ARM64::LD2Rv2s_POST:
1782 case ARM64::LD2Rv4s:
1783 case ARM64::LD2Rv4s_POST:
1784 case ARM64::LD2Rv2d:
1785 case ARM64::LD2Rv2d_POST:
1786 case ARM64::LD2Rv1d:
1787 case ARM64::LD2Rv1d_POST:
1788 case ARM64::LD3Rv8b:
1789 case ARM64::LD3Rv8b_POST:
1790 case ARM64::LD3Rv16b:
1791 case ARM64::LD3Rv16b_POST:
1792 case ARM64::LD3Rv4h:
1793 case ARM64::LD3Rv4h_POST:
1794 case ARM64::LD3Rv8h:
1795 case ARM64::LD3Rv8h_POST:
1796 case ARM64::LD3Rv2s:
1797 case ARM64::LD3Rv2s_POST:
1798 case ARM64::LD3Rv4s:
1799 case ARM64::LD3Rv4s_POST:
1800 case ARM64::LD3Rv2d:
1801 case ARM64::LD3Rv2d_POST:
1802 case ARM64::LD3Rv1d:
1803 case ARM64::LD3Rv1d_POST:
1804 case ARM64::LD4Rv8b:
1805 case ARM64::LD4Rv8b_POST:
1806 case ARM64::LD4Rv16b:
1807 case ARM64::LD4Rv16b_POST:
1808 case ARM64::LD4Rv4h:
1809 case ARM64::LD4Rv4h_POST:
1810 case ARM64::LD4Rv8h:
1811 case ARM64::LD4Rv8h_POST:
1812 case ARM64::LD4Rv2s:
1813 case ARM64::LD4Rv2s_POST:
1814 case ARM64::LD4Rv4s:
1815 case ARM64::LD4Rv4s_POST:
1816 case ARM64::LD4Rv2d:
1817 case ARM64::LD4Rv2d_POST:
1818 case ARM64::LD4Rv1d:
1819 case ARM64::LD4Rv1d_POST:
1822 Inst.addOperand(MCOperand::CreateImm(index));
1825 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1827 switch (Inst.getOpcode()) {
1828 case ARM64::ST1i8_POST:
1829 case ARM64::ST1i16_POST:
1830 case ARM64::ST1i32_POST:
1831 case ARM64::ST1i64_POST:
1832 case ARM64::LD1Rv8b_POST:
1833 case ARM64::LD1Rv16b_POST:
1834 case ARM64::LD1Rv4h_POST:
1835 case ARM64::LD1Rv8h_POST:
1836 case ARM64::LD1Rv2s_POST:
1837 case ARM64::LD1Rv4s_POST:
1838 case ARM64::LD1Rv1d_POST:
1839 case ARM64::LD1Rv2d_POST:
1840 case ARM64::ST2i8_POST:
1841 case ARM64::ST2i16_POST:
1842 case ARM64::ST2i32_POST:
1843 case ARM64::ST2i64_POST:
1844 case ARM64::LD2Rv8b_POST:
1845 case ARM64::LD2Rv16b_POST:
1846 case ARM64::LD2Rv4h_POST:
1847 case ARM64::LD2Rv8h_POST:
1848 case ARM64::LD2Rv2s_POST:
1849 case ARM64::LD2Rv4s_POST:
1850 case ARM64::LD2Rv2d_POST:
1851 case ARM64::LD2Rv1d_POST:
1852 case ARM64::ST3i8_POST:
1853 case ARM64::ST3i16_POST:
1854 case ARM64::ST3i32_POST:
1855 case ARM64::ST3i64_POST:
1856 case ARM64::LD3Rv8b_POST:
1857 case ARM64::LD3Rv16b_POST:
1858 case ARM64::LD3Rv4h_POST:
1859 case ARM64::LD3Rv8h_POST:
1860 case ARM64::LD3Rv2s_POST:
1861 case ARM64::LD3Rv4s_POST:
1862 case ARM64::LD3Rv2d_POST:
1863 case ARM64::LD3Rv1d_POST:
1864 case ARM64::ST4i8_POST:
1865 case ARM64::ST4i16_POST:
1866 case ARM64::ST4i32_POST:
1867 case ARM64::ST4i64_POST:
1868 case ARM64::LD4Rv8b_POST:
1869 case ARM64::LD4Rv16b_POST:
1870 case ARM64::LD4Rv4h_POST:
1871 case ARM64::LD4Rv8h_POST:
1872 case ARM64::LD4Rv2s_POST:
1873 case ARM64::LD4Rv4s_POST:
1874 case ARM64::LD4Rv2d_POST:
1875 case ARM64::LD4Rv1d_POST:
1876 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1882 static DecodeStatus DecodeSIMDLdStSingleTied(llvm::MCInst &Inst, uint32_t insn,
1884 const void *Decoder) {
1885 uint64_t Rt = fieldFromInstruction(insn, 0, 5);
1886 uint64_t Rn = fieldFromInstruction(insn, 5, 5);
1887 uint64_t Rm = fieldFromInstruction(insn, 16, 5);
1888 uint64_t size = fieldFromInstruction(insn, 10, 2);
1889 uint64_t S = fieldFromInstruction(insn, 12, 1);
1890 uint64_t Q = fieldFromInstruction(insn, 30, 1);
1893 switch (Inst.getOpcode()) {
1895 case ARM64::LD1i8_POST:
1897 case ARM64::LD2i8_POST:
1898 case ARM64::LD3i8_POST:
1900 case ARM64::LD4i8_POST:
1902 index = (Q << 3) | (S << 2) | size;
1905 case ARM64::LD1i16_POST:
1907 case ARM64::LD2i16_POST:
1908 case ARM64::LD3i16_POST:
1910 case ARM64::LD4i16_POST:
1912 index = (Q << 2) | (S << 1) | (size >> 1);
1915 case ARM64::LD1i32_POST:
1917 case ARM64::LD2i32_POST:
1918 case ARM64::LD3i32_POST:
1920 case ARM64::LD4i32_POST:
1922 index = (Q << 1) | S;
1925 case ARM64::LD1i64_POST:
1927 case ARM64::LD2i64_POST:
1928 case ARM64::LD3i64_POST:
1930 case ARM64::LD4i64_POST:
1936 switch (Inst.getOpcode()) {
1940 case ARM64::LD1i8_POST:
1942 case ARM64::LD1i16_POST:
1944 case ARM64::LD1i32_POST:
1946 case ARM64::LD1i64_POST:
1947 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1948 DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1951 case ARM64::LD2i8_POST:
1953 case ARM64::LD2i16_POST:
1955 case ARM64::LD2i32_POST:
1957 case ARM64::LD2i64_POST:
1958 DecodeQQRegisterClass(Inst, Rt, Addr, Decoder);
1959 DecodeQQRegisterClass(Inst, Rt, Addr, Decoder);
1962 case ARM64::LD3i8_POST:
1964 case ARM64::LD3i16_POST:
1966 case ARM64::LD3i32_POST:
1968 case ARM64::LD3i64_POST:
1969 DecodeQQQRegisterClass(Inst, Rt, Addr, Decoder);
1970 DecodeQQQRegisterClass(Inst, Rt, Addr, Decoder);
1973 case ARM64::LD4i8_POST:
1975 case ARM64::LD4i16_POST:
1977 case ARM64::LD4i32_POST:
1979 case ARM64::LD4i64_POST:
1980 DecodeQQQQRegisterClass(Inst, Rt, Addr, Decoder);
1981 DecodeQQQQRegisterClass(Inst, Rt, Addr, Decoder);
1985 Inst.addOperand(MCOperand::CreateImm(index));
1986 DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1988 switch (Inst.getOpcode()) {
1989 case ARM64::LD1i8_POST:
1990 case ARM64::LD1i16_POST:
1991 case ARM64::LD1i32_POST:
1992 case ARM64::LD1i64_POST:
1993 case ARM64::LD2i8_POST:
1994 case ARM64::LD2i16_POST:
1995 case ARM64::LD2i32_POST:
1996 case ARM64::LD2i64_POST:
1997 case ARM64::LD3i8_POST:
1998 case ARM64::LD3i16_POST:
1999 case ARM64::LD3i32_POST:
2000 case ARM64::LD3i64_POST:
2001 case ARM64::LD4i8_POST:
2002 case ARM64::LD4i16_POST:
2003 case ARM64::LD4i32_POST:
2004 case ARM64::LD4i64_POST:
2005 DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);