1*9a0e4156SSadaf Ebrahimi //===- AArch64Disassembler.cpp - Disassembler for AArch64 ISA -------------===//
2*9a0e4156SSadaf Ebrahimi //
3*9a0e4156SSadaf Ebrahimi // The LLVM Compiler Infrastructure
4*9a0e4156SSadaf Ebrahimi //
5*9a0e4156SSadaf Ebrahimi // This file is distributed under the University of Illinois Open Source
6*9a0e4156SSadaf Ebrahimi // License. See LICENSE.TXT for details.
7*9a0e4156SSadaf Ebrahimi //
8*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
9*9a0e4156SSadaf Ebrahimi //
10*9a0e4156SSadaf Ebrahimi // This file contains the functions necessary to decode AArch64 instruction
11*9a0e4156SSadaf Ebrahimi // bitpatterns into MCInsts (with the help of TableGenerated information from
12*9a0e4156SSadaf Ebrahimi // the instruction definitions).
13*9a0e4156SSadaf Ebrahimi //
14*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
15*9a0e4156SSadaf Ebrahimi
16*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
17*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
18*9a0e4156SSadaf Ebrahimi
19*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_HAS_ARM64
20*9a0e4156SSadaf Ebrahimi
21*9a0e4156SSadaf Ebrahimi #include <stdio.h> // DEBUG
22*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
23*9a0e4156SSadaf Ebrahimi
24*9a0e4156SSadaf Ebrahimi #include "../../cs_priv.h"
25*9a0e4156SSadaf Ebrahimi #include "../../utils.h"
26*9a0e4156SSadaf Ebrahimi
27*9a0e4156SSadaf Ebrahimi #include "AArch64Disassembler.h"
28*9a0e4156SSadaf Ebrahimi
29*9a0e4156SSadaf Ebrahimi #include "../../MCInst.h"
30*9a0e4156SSadaf Ebrahimi #include "../../MCInstrDesc.h"
31*9a0e4156SSadaf Ebrahimi #include "../../MCFixedLenDisassembler.h"
32*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h"
33*9a0e4156SSadaf Ebrahimi #include "../../MCDisassembler.h"
34*9a0e4156SSadaf Ebrahimi
35*9a0e4156SSadaf Ebrahimi #include "AArch64BaseInfo.h"
36*9a0e4156SSadaf Ebrahimi #include "AArch64AddressingModes.h"
37*9a0e4156SSadaf Ebrahimi
38*9a0e4156SSadaf Ebrahimi
39*9a0e4156SSadaf Ebrahimi // Forward declare these because the autogenerated code will reference them.
40*9a0e4156SSadaf Ebrahimi // Definitions are further down.
41*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR128RegisterClass(MCInst *Inst,
42*9a0e4156SSadaf Ebrahimi unsigned RegNo, uint64_t Address,
43*9a0e4156SSadaf Ebrahimi const void *Decoder);
44*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR128_loRegisterClass(MCInst *Inst,
45*9a0e4156SSadaf Ebrahimi unsigned RegNo,
46*9a0e4156SSadaf Ebrahimi uint64_t Address,
47*9a0e4156SSadaf Ebrahimi const void *Decoder);
48*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR64RegisterClass(MCInst *Inst, unsigned RegNo,
49*9a0e4156SSadaf Ebrahimi uint64_t Address,
50*9a0e4156SSadaf Ebrahimi const void *Decoder);
51*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR32RegisterClass(MCInst *Inst, unsigned RegNo,
52*9a0e4156SSadaf Ebrahimi uint64_t Address,
53*9a0e4156SSadaf Ebrahimi const void *Decoder);
54*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR16RegisterClass(MCInst *Inst, unsigned RegNo,
55*9a0e4156SSadaf Ebrahimi uint64_t Address,
56*9a0e4156SSadaf Ebrahimi const void *Decoder);
57*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR8RegisterClass(MCInst *Inst, unsigned RegNo,
58*9a0e4156SSadaf Ebrahimi uint64_t Address,
59*9a0e4156SSadaf Ebrahimi const void *Decoder);
60*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst, unsigned RegNo,
61*9a0e4156SSadaf Ebrahimi uint64_t Address,
62*9a0e4156SSadaf Ebrahimi const void *Decoder);
63*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPR64spRegisterClass(MCInst *Inst,
64*9a0e4156SSadaf Ebrahimi unsigned RegNo, uint64_t Address,
65*9a0e4156SSadaf Ebrahimi const void *Decoder);
66*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst, unsigned RegNo,
67*9a0e4156SSadaf Ebrahimi uint64_t Address,
68*9a0e4156SSadaf Ebrahimi const void *Decoder);
69*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPR32spRegisterClass(MCInst *Inst,
70*9a0e4156SSadaf Ebrahimi unsigned RegNo, uint64_t Address,
71*9a0e4156SSadaf Ebrahimi const void *Decoder);
72*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeQQRegisterClass(MCInst *Inst, unsigned RegNo,
73*9a0e4156SSadaf Ebrahimi uint64_t Address,
74*9a0e4156SSadaf Ebrahimi const void *Decoder);
75*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeQQQRegisterClass(MCInst *Inst, unsigned RegNo,
76*9a0e4156SSadaf Ebrahimi uint64_t Address,
77*9a0e4156SSadaf Ebrahimi const void *Decoder);
78*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeQQQQRegisterClass(MCInst *Inst, unsigned RegNo,
79*9a0e4156SSadaf Ebrahimi uint64_t Address,
80*9a0e4156SSadaf Ebrahimi const void *Decoder);
81*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeDDRegisterClass(MCInst *Inst, unsigned RegNo,
82*9a0e4156SSadaf Ebrahimi uint64_t Address,
83*9a0e4156SSadaf Ebrahimi const void *Decoder);
84*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeDDDRegisterClass(MCInst *Inst, unsigned RegNo,
85*9a0e4156SSadaf Ebrahimi uint64_t Address,
86*9a0e4156SSadaf Ebrahimi const void *Decoder);
87*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeDDDDRegisterClass(MCInst *Inst, unsigned RegNo,
88*9a0e4156SSadaf Ebrahimi uint64_t Address,
89*9a0e4156SSadaf Ebrahimi const void *Decoder);
90*9a0e4156SSadaf Ebrahimi
91*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFixedPointScaleImm32(MCInst *Inst, unsigned Imm,
92*9a0e4156SSadaf Ebrahimi uint64_t Address,
93*9a0e4156SSadaf Ebrahimi const void *Decoder);
94*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFixedPointScaleImm64(MCInst *Inst, unsigned Imm,
95*9a0e4156SSadaf Ebrahimi uint64_t Address,
96*9a0e4156SSadaf Ebrahimi const void *Decoder);
97*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelLabel19(MCInst *Inst, unsigned Imm,
98*9a0e4156SSadaf Ebrahimi uint64_t Address, const void *Decoder);
99*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMemExtend(MCInst *Inst, unsigned Imm,
100*9a0e4156SSadaf Ebrahimi uint64_t Address, const void *Decoder);
101*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMRSSystemRegister(MCInst *Inst, unsigned Imm,
102*9a0e4156SSadaf Ebrahimi uint64_t Address, const void *Decoder);
103*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMSRSystemRegister(MCInst *Inst, unsigned Imm,
104*9a0e4156SSadaf Ebrahimi uint64_t Address, const void *Decoder);
105*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeThreeAddrSRegInstruction(MCInst *Inst,
106*9a0e4156SSadaf Ebrahimi uint32_t insn,
107*9a0e4156SSadaf Ebrahimi uint64_t Address,
108*9a0e4156SSadaf Ebrahimi const void *Decoder);
109*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMoveImmInstruction(MCInst *Inst, uint32_t insn,
110*9a0e4156SSadaf Ebrahimi uint64_t Address,
111*9a0e4156SSadaf Ebrahimi const void *Decoder);
112*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeUnsignedLdStInstruction(MCInst *Inst,
113*9a0e4156SSadaf Ebrahimi uint32_t insn,
114*9a0e4156SSadaf Ebrahimi uint64_t Address,
115*9a0e4156SSadaf Ebrahimi const void *Decoder);
116*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSignedLdStInstruction(MCInst *Inst,
117*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Address,
118*9a0e4156SSadaf Ebrahimi const void *Decoder);
119*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeExclusiveLdStInstruction(MCInst *Inst,
120*9a0e4156SSadaf Ebrahimi uint32_t insn,
121*9a0e4156SSadaf Ebrahimi uint64_t Address,
122*9a0e4156SSadaf Ebrahimi const void *Decoder);
123*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePairLdStInstruction(MCInst *Inst, uint32_t insn,
124*9a0e4156SSadaf Ebrahimi uint64_t Address,
125*9a0e4156SSadaf Ebrahimi const void *Decoder);
126*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeAddSubERegInstruction(MCInst *Inst,
127*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Address,
128*9a0e4156SSadaf Ebrahimi const void *Decoder);
129*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLogicalImmInstruction(MCInst *Inst,
130*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Address,
131*9a0e4156SSadaf Ebrahimi const void *Decoder);
132*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeModImmInstruction(MCInst *Inst, uint32_t insn,
133*9a0e4156SSadaf Ebrahimi uint64_t Address,
134*9a0e4156SSadaf Ebrahimi const void *Decoder);
135*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeModImmTiedInstruction(MCInst *Inst,
136*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Address,
137*9a0e4156SSadaf Ebrahimi const void *Decoder);
138*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeAdrInstruction(MCInst *Inst, uint32_t insn,
139*9a0e4156SSadaf Ebrahimi uint64_t Address, const void *Decoder);
140*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeBaseAddSubImm(MCInst *Inst, uint32_t insn,
141*9a0e4156SSadaf Ebrahimi uint64_t Address, const void *Decoder);
142*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeUnconditionalBranch(MCInst *Inst, uint32_t insn,
143*9a0e4156SSadaf Ebrahimi uint64_t Address,
144*9a0e4156SSadaf Ebrahimi const void *Decoder);
145*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSystemPStateInstruction(MCInst *Inst,
146*9a0e4156SSadaf Ebrahimi uint32_t insn,
147*9a0e4156SSadaf Ebrahimi uint64_t Address,
148*9a0e4156SSadaf Ebrahimi const void *Decoder);
149*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeTestAndBranch(MCInst *Inst, uint32_t insn,
150*9a0e4156SSadaf Ebrahimi uint64_t Address, const void *Decoder);
151*9a0e4156SSadaf Ebrahimi
152*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFMOVLaneInstruction(MCInst *Inst, unsigned Insn,
153*9a0e4156SSadaf Ebrahimi uint64_t Address,
154*9a0e4156SSadaf Ebrahimi const void *Decoder);
155*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR64Imm(MCInst *Inst, unsigned Imm,
156*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder);
157*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR64ImmNarrow(MCInst *Inst, unsigned Imm,
158*9a0e4156SSadaf Ebrahimi uint64_t Addr,
159*9a0e4156SSadaf Ebrahimi const void *Decoder);
160*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR32Imm(MCInst *Inst, unsigned Imm,
161*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder);
162*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR32ImmNarrow(MCInst *Inst, unsigned Imm,
163*9a0e4156SSadaf Ebrahimi uint64_t Addr,
164*9a0e4156SSadaf Ebrahimi const void *Decoder);
165*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR16Imm(MCInst *Inst, unsigned Imm,
166*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder);
167*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR16ImmNarrow(MCInst *Inst, unsigned Imm,
168*9a0e4156SSadaf Ebrahimi uint64_t Addr,
169*9a0e4156SSadaf Ebrahimi const void *Decoder);
170*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR8Imm(MCInst *Inst, unsigned Imm,
171*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder);
172*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftL64Imm(MCInst *Inst, unsigned Imm,
173*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder);
174*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftL32Imm(MCInst *Inst, unsigned Imm,
175*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder);
176*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftL16Imm(MCInst *Inst, unsigned Imm,
177*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder);
178*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftL8Imm(MCInst *Inst, unsigned Imm,
179*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder);
180*9a0e4156SSadaf Ebrahimi
Check(DecodeStatus * Out,DecodeStatus In)181*9a0e4156SSadaf Ebrahimi static bool Check(DecodeStatus *Out, DecodeStatus In)
182*9a0e4156SSadaf Ebrahimi {
183*9a0e4156SSadaf Ebrahimi switch (In) {
184*9a0e4156SSadaf Ebrahimi default: // never reach
185*9a0e4156SSadaf Ebrahimi return true;
186*9a0e4156SSadaf Ebrahimi case MCDisassembler_Success:
187*9a0e4156SSadaf Ebrahimi // Out stays the same.
188*9a0e4156SSadaf Ebrahimi return true;
189*9a0e4156SSadaf Ebrahimi case MCDisassembler_SoftFail:
190*9a0e4156SSadaf Ebrahimi *Out = In;
191*9a0e4156SSadaf Ebrahimi return true;
192*9a0e4156SSadaf Ebrahimi case MCDisassembler_Fail:
193*9a0e4156SSadaf Ebrahimi *Out = In;
194*9a0e4156SSadaf Ebrahimi return false;
195*9a0e4156SSadaf Ebrahimi }
196*9a0e4156SSadaf Ebrahimi // llvm_unreachable("Invalid DecodeStatus!");
197*9a0e4156SSadaf Ebrahimi }
198*9a0e4156SSadaf Ebrahimi
199*9a0e4156SSadaf Ebrahimi // Hacky: enable all features for disassembler
getFeatureBits(int feature)200*9a0e4156SSadaf Ebrahimi static uint64_t getFeatureBits(int feature)
201*9a0e4156SSadaf Ebrahimi {
202*9a0e4156SSadaf Ebrahimi // enable all features
203*9a0e4156SSadaf Ebrahimi return (uint64_t)-1;
204*9a0e4156SSadaf Ebrahimi }
205*9a0e4156SSadaf Ebrahimi
206*9a0e4156SSadaf Ebrahimi #define GET_SUBTARGETINFO_ENUM
207*9a0e4156SSadaf Ebrahimi #include "AArch64GenSubtargetInfo.inc"
208*9a0e4156SSadaf Ebrahimi
209*9a0e4156SSadaf Ebrahimi #include "AArch64GenDisassemblerTables.inc"
210*9a0e4156SSadaf Ebrahimi
211*9a0e4156SSadaf Ebrahimi #define GET_INSTRINFO_ENUM
212*9a0e4156SSadaf Ebrahimi #include "AArch64GenInstrInfo.inc"
213*9a0e4156SSadaf Ebrahimi
214*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_ENUM
215*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_MC_DESC
216*9a0e4156SSadaf Ebrahimi #include "AArch64GenRegisterInfo.inc"
217*9a0e4156SSadaf Ebrahimi
218*9a0e4156SSadaf Ebrahimi #define Success MCDisassembler_Success
219*9a0e4156SSadaf Ebrahimi #define Fail MCDisassembler_Fail
220*9a0e4156SSadaf Ebrahimi #define SoftFail MCDisassembler_SoftFail
221*9a0e4156SSadaf Ebrahimi
_getInstruction(cs_struct * ud,MCInst * MI,const uint8_t * code,size_t code_len,uint16_t * Size,uint64_t Address,MCRegisterInfo * MRI)222*9a0e4156SSadaf Ebrahimi static DecodeStatus _getInstruction(cs_struct *ud, MCInst *MI,
223*9a0e4156SSadaf Ebrahimi const uint8_t *code, size_t code_len,
224*9a0e4156SSadaf Ebrahimi uint16_t *Size,
225*9a0e4156SSadaf Ebrahimi uint64_t Address, MCRegisterInfo *MRI)
226*9a0e4156SSadaf Ebrahimi {
227*9a0e4156SSadaf Ebrahimi uint32_t insn;
228*9a0e4156SSadaf Ebrahimi DecodeStatus result;
229*9a0e4156SSadaf Ebrahimi size_t i;
230*9a0e4156SSadaf Ebrahimi
231*9a0e4156SSadaf Ebrahimi if (code_len < 4) {
232*9a0e4156SSadaf Ebrahimi // not enough data
233*9a0e4156SSadaf Ebrahimi *Size = 0;
234*9a0e4156SSadaf Ebrahimi return MCDisassembler_Fail;
235*9a0e4156SSadaf Ebrahimi }
236*9a0e4156SSadaf Ebrahimi
237*9a0e4156SSadaf Ebrahimi if (MI->flat_insn->detail) {
238*9a0e4156SSadaf Ebrahimi memset(MI->flat_insn->detail, 0, offsetof(cs_detail, arm64)+sizeof(cs_arm64));
239*9a0e4156SSadaf Ebrahimi for (i = 0; i < ARR_SIZE(MI->flat_insn->detail->arm64.operands); i++)
240*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[i].vector_index = -1;
241*9a0e4156SSadaf Ebrahimi }
242*9a0e4156SSadaf Ebrahimi
243*9a0e4156SSadaf Ebrahimi if (MODE_IS_BIG_ENDIAN(ud->mode))
244*9a0e4156SSadaf Ebrahimi insn = (code[3] << 0) | (code[2] << 8) |
245*9a0e4156SSadaf Ebrahimi (code[1] << 16) | ((uint32_t) code[0] << 24);
246*9a0e4156SSadaf Ebrahimi else
247*9a0e4156SSadaf Ebrahimi insn = ((uint32_t) code[3] << 24) | (code[2] << 16) |
248*9a0e4156SSadaf Ebrahimi (code[1] << 8) | (code[0] << 0);
249*9a0e4156SSadaf Ebrahimi
250*9a0e4156SSadaf Ebrahimi // Calling the auto-generated decoder function.
251*9a0e4156SSadaf Ebrahimi result = decodeInstruction(DecoderTable32, MI, insn, Address, MRI, 0);
252*9a0e4156SSadaf Ebrahimi if (result != MCDisassembler_Fail) {
253*9a0e4156SSadaf Ebrahimi *Size = 4;
254*9a0e4156SSadaf Ebrahimi return result;
255*9a0e4156SSadaf Ebrahimi }
256*9a0e4156SSadaf Ebrahimi
257*9a0e4156SSadaf Ebrahimi MCInst_clear(MI);
258*9a0e4156SSadaf Ebrahimi *Size = 0;
259*9a0e4156SSadaf Ebrahimi return MCDisassembler_Fail;
260*9a0e4156SSadaf Ebrahimi }
261*9a0e4156SSadaf Ebrahimi
AArch64_getInstruction(csh ud,const uint8_t * code,size_t code_len,MCInst * instr,uint16_t * size,uint64_t address,void * info)262*9a0e4156SSadaf Ebrahimi bool AArch64_getInstruction(csh ud, const uint8_t *code, size_t code_len,
263*9a0e4156SSadaf Ebrahimi MCInst *instr, uint16_t *size, uint64_t address, void *info)
264*9a0e4156SSadaf Ebrahimi {
265*9a0e4156SSadaf Ebrahimi DecodeStatus status = _getInstruction((cs_struct *)ud, instr,
266*9a0e4156SSadaf Ebrahimi code, code_len,
267*9a0e4156SSadaf Ebrahimi size,
268*9a0e4156SSadaf Ebrahimi address, (MCRegisterInfo *)info);
269*9a0e4156SSadaf Ebrahimi
270*9a0e4156SSadaf Ebrahimi return status == MCDisassembler_Success;
271*9a0e4156SSadaf Ebrahimi }
272*9a0e4156SSadaf Ebrahimi
273*9a0e4156SSadaf Ebrahimi static const unsigned FPR128DecoderTable[] = {
274*9a0e4156SSadaf Ebrahimi AArch64_Q0, AArch64_Q1, AArch64_Q2, AArch64_Q3, AArch64_Q4,
275*9a0e4156SSadaf Ebrahimi AArch64_Q5, AArch64_Q6, AArch64_Q7, AArch64_Q8, AArch64_Q9,
276*9a0e4156SSadaf Ebrahimi AArch64_Q10, AArch64_Q11, AArch64_Q12, AArch64_Q13, AArch64_Q14,
277*9a0e4156SSadaf Ebrahimi AArch64_Q15, AArch64_Q16, AArch64_Q17, AArch64_Q18, AArch64_Q19,
278*9a0e4156SSadaf Ebrahimi AArch64_Q20, AArch64_Q21, AArch64_Q22, AArch64_Q23, AArch64_Q24,
279*9a0e4156SSadaf Ebrahimi AArch64_Q25, AArch64_Q26, AArch64_Q27, AArch64_Q28, AArch64_Q29,
280*9a0e4156SSadaf Ebrahimi AArch64_Q30, AArch64_Q31
281*9a0e4156SSadaf Ebrahimi };
282*9a0e4156SSadaf Ebrahimi
DecodeFPR128RegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)283*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR128RegisterClass(MCInst *Inst, unsigned RegNo,
284*9a0e4156SSadaf Ebrahimi uint64_t Addr,
285*9a0e4156SSadaf Ebrahimi const void *Decoder)
286*9a0e4156SSadaf Ebrahimi {
287*9a0e4156SSadaf Ebrahimi unsigned Register;
288*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
289*9a0e4156SSadaf Ebrahimi return Fail;
290*9a0e4156SSadaf Ebrahimi
291*9a0e4156SSadaf Ebrahimi Register = FPR128DecoderTable[RegNo];
292*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
293*9a0e4156SSadaf Ebrahimi return Success;
294*9a0e4156SSadaf Ebrahimi }
295*9a0e4156SSadaf Ebrahimi
DecodeFPR128_loRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)296*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR128_loRegisterClass(MCInst *Inst, unsigned RegNo,
297*9a0e4156SSadaf Ebrahimi uint64_t Addr,
298*9a0e4156SSadaf Ebrahimi const void *Decoder)
299*9a0e4156SSadaf Ebrahimi {
300*9a0e4156SSadaf Ebrahimi if (RegNo > 15)
301*9a0e4156SSadaf Ebrahimi return Fail;
302*9a0e4156SSadaf Ebrahimi
303*9a0e4156SSadaf Ebrahimi return DecodeFPR128RegisterClass(Inst, RegNo, Addr, Decoder);
304*9a0e4156SSadaf Ebrahimi }
305*9a0e4156SSadaf Ebrahimi
306*9a0e4156SSadaf Ebrahimi static const unsigned FPR64DecoderTable[] = {
307*9a0e4156SSadaf Ebrahimi AArch64_D0, AArch64_D1, AArch64_D2, AArch64_D3, AArch64_D4,
308*9a0e4156SSadaf Ebrahimi AArch64_D5, AArch64_D6, AArch64_D7, AArch64_D8, AArch64_D9,
309*9a0e4156SSadaf Ebrahimi AArch64_D10, AArch64_D11, AArch64_D12, AArch64_D13, AArch64_D14,
310*9a0e4156SSadaf Ebrahimi AArch64_D15, AArch64_D16, AArch64_D17, AArch64_D18, AArch64_D19,
311*9a0e4156SSadaf Ebrahimi AArch64_D20, AArch64_D21, AArch64_D22, AArch64_D23, AArch64_D24,
312*9a0e4156SSadaf Ebrahimi AArch64_D25, AArch64_D26, AArch64_D27, AArch64_D28, AArch64_D29,
313*9a0e4156SSadaf Ebrahimi AArch64_D30, AArch64_D31
314*9a0e4156SSadaf Ebrahimi };
315*9a0e4156SSadaf Ebrahimi
DecodeFPR64RegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)316*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR64RegisterClass(MCInst *Inst, unsigned RegNo,
317*9a0e4156SSadaf Ebrahimi uint64_t Addr,
318*9a0e4156SSadaf Ebrahimi const void *Decoder)
319*9a0e4156SSadaf Ebrahimi {
320*9a0e4156SSadaf Ebrahimi unsigned Register;
321*9a0e4156SSadaf Ebrahimi
322*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
323*9a0e4156SSadaf Ebrahimi return Fail;
324*9a0e4156SSadaf Ebrahimi
325*9a0e4156SSadaf Ebrahimi Register = FPR64DecoderTable[RegNo];
326*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
327*9a0e4156SSadaf Ebrahimi return Success;
328*9a0e4156SSadaf Ebrahimi }
329*9a0e4156SSadaf Ebrahimi
330*9a0e4156SSadaf Ebrahimi static const unsigned FPR32DecoderTable[] = {
331*9a0e4156SSadaf Ebrahimi AArch64_S0, AArch64_S1, AArch64_S2, AArch64_S3, AArch64_S4,
332*9a0e4156SSadaf Ebrahimi AArch64_S5, AArch64_S6, AArch64_S7, AArch64_S8, AArch64_S9,
333*9a0e4156SSadaf Ebrahimi AArch64_S10, AArch64_S11, AArch64_S12, AArch64_S13, AArch64_S14,
334*9a0e4156SSadaf Ebrahimi AArch64_S15, AArch64_S16, AArch64_S17, AArch64_S18, AArch64_S19,
335*9a0e4156SSadaf Ebrahimi AArch64_S20, AArch64_S21, AArch64_S22, AArch64_S23, AArch64_S24,
336*9a0e4156SSadaf Ebrahimi AArch64_S25, AArch64_S26, AArch64_S27, AArch64_S28, AArch64_S29,
337*9a0e4156SSadaf Ebrahimi AArch64_S30, AArch64_S31
338*9a0e4156SSadaf Ebrahimi };
339*9a0e4156SSadaf Ebrahimi
DecodeFPR32RegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)340*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR32RegisterClass(MCInst *Inst, unsigned RegNo,
341*9a0e4156SSadaf Ebrahimi uint64_t Addr,
342*9a0e4156SSadaf Ebrahimi const void *Decoder)
343*9a0e4156SSadaf Ebrahimi {
344*9a0e4156SSadaf Ebrahimi unsigned Register;
345*9a0e4156SSadaf Ebrahimi
346*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
347*9a0e4156SSadaf Ebrahimi return Fail;
348*9a0e4156SSadaf Ebrahimi
349*9a0e4156SSadaf Ebrahimi Register = FPR32DecoderTable[RegNo];
350*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
351*9a0e4156SSadaf Ebrahimi return Success;
352*9a0e4156SSadaf Ebrahimi }
353*9a0e4156SSadaf Ebrahimi
354*9a0e4156SSadaf Ebrahimi static const unsigned FPR16DecoderTable[] = {
355*9a0e4156SSadaf Ebrahimi AArch64_H0, AArch64_H1, AArch64_H2, AArch64_H3, AArch64_H4,
356*9a0e4156SSadaf Ebrahimi AArch64_H5, AArch64_H6, AArch64_H7, AArch64_H8, AArch64_H9,
357*9a0e4156SSadaf Ebrahimi AArch64_H10, AArch64_H11, AArch64_H12, AArch64_H13, AArch64_H14,
358*9a0e4156SSadaf Ebrahimi AArch64_H15, AArch64_H16, AArch64_H17, AArch64_H18, AArch64_H19,
359*9a0e4156SSadaf Ebrahimi AArch64_H20, AArch64_H21, AArch64_H22, AArch64_H23, AArch64_H24,
360*9a0e4156SSadaf Ebrahimi AArch64_H25, AArch64_H26, AArch64_H27, AArch64_H28, AArch64_H29,
361*9a0e4156SSadaf Ebrahimi AArch64_H30, AArch64_H31
362*9a0e4156SSadaf Ebrahimi };
363*9a0e4156SSadaf Ebrahimi
DecodeFPR16RegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)364*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR16RegisterClass(MCInst *Inst, unsigned RegNo,
365*9a0e4156SSadaf Ebrahimi uint64_t Addr,
366*9a0e4156SSadaf Ebrahimi const void *Decoder)
367*9a0e4156SSadaf Ebrahimi {
368*9a0e4156SSadaf Ebrahimi unsigned Register;
369*9a0e4156SSadaf Ebrahimi
370*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
371*9a0e4156SSadaf Ebrahimi return Fail;
372*9a0e4156SSadaf Ebrahimi
373*9a0e4156SSadaf Ebrahimi Register = FPR16DecoderTable[RegNo];
374*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
375*9a0e4156SSadaf Ebrahimi return Success;
376*9a0e4156SSadaf Ebrahimi }
377*9a0e4156SSadaf Ebrahimi
378*9a0e4156SSadaf Ebrahimi static const unsigned FPR8DecoderTable[] = {
379*9a0e4156SSadaf Ebrahimi AArch64_B0, AArch64_B1, AArch64_B2, AArch64_B3, AArch64_B4,
380*9a0e4156SSadaf Ebrahimi AArch64_B5, AArch64_B6, AArch64_B7, AArch64_B8, AArch64_B9,
381*9a0e4156SSadaf Ebrahimi AArch64_B10, AArch64_B11, AArch64_B12, AArch64_B13, AArch64_B14,
382*9a0e4156SSadaf Ebrahimi AArch64_B15, AArch64_B16, AArch64_B17, AArch64_B18, AArch64_B19,
383*9a0e4156SSadaf Ebrahimi AArch64_B20, AArch64_B21, AArch64_B22, AArch64_B23, AArch64_B24,
384*9a0e4156SSadaf Ebrahimi AArch64_B25, AArch64_B26, AArch64_B27, AArch64_B28, AArch64_B29,
385*9a0e4156SSadaf Ebrahimi AArch64_B30, AArch64_B31
386*9a0e4156SSadaf Ebrahimi };
387*9a0e4156SSadaf Ebrahimi
DecodeFPR8RegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)388*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFPR8RegisterClass(MCInst *Inst, unsigned RegNo,
389*9a0e4156SSadaf Ebrahimi uint64_t Addr,
390*9a0e4156SSadaf Ebrahimi const void *Decoder)
391*9a0e4156SSadaf Ebrahimi {
392*9a0e4156SSadaf Ebrahimi unsigned Register;
393*9a0e4156SSadaf Ebrahimi
394*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
395*9a0e4156SSadaf Ebrahimi return Fail;
396*9a0e4156SSadaf Ebrahimi
397*9a0e4156SSadaf Ebrahimi Register = FPR8DecoderTable[RegNo];
398*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
399*9a0e4156SSadaf Ebrahimi return Success;
400*9a0e4156SSadaf Ebrahimi }
401*9a0e4156SSadaf Ebrahimi
402*9a0e4156SSadaf Ebrahimi static const unsigned GPR64DecoderTable[] = {
403*9a0e4156SSadaf Ebrahimi AArch64_X0, AArch64_X1, AArch64_X2, AArch64_X3, AArch64_X4,
404*9a0e4156SSadaf Ebrahimi AArch64_X5, AArch64_X6, AArch64_X7, AArch64_X8, AArch64_X9,
405*9a0e4156SSadaf Ebrahimi AArch64_X10, AArch64_X11, AArch64_X12, AArch64_X13, AArch64_X14,
406*9a0e4156SSadaf Ebrahimi AArch64_X15, AArch64_X16, AArch64_X17, AArch64_X18, AArch64_X19,
407*9a0e4156SSadaf Ebrahimi AArch64_X20, AArch64_X21, AArch64_X22, AArch64_X23, AArch64_X24,
408*9a0e4156SSadaf Ebrahimi AArch64_X25, AArch64_X26, AArch64_X27, AArch64_X28, AArch64_FP,
409*9a0e4156SSadaf Ebrahimi AArch64_LR, AArch64_XZR
410*9a0e4156SSadaf Ebrahimi };
411*9a0e4156SSadaf Ebrahimi
DecodeGPR64RegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)412*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst, unsigned RegNo,
413*9a0e4156SSadaf Ebrahimi uint64_t Addr,
414*9a0e4156SSadaf Ebrahimi const void *Decoder)
415*9a0e4156SSadaf Ebrahimi {
416*9a0e4156SSadaf Ebrahimi unsigned Register;
417*9a0e4156SSadaf Ebrahimi
418*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
419*9a0e4156SSadaf Ebrahimi return Fail;
420*9a0e4156SSadaf Ebrahimi
421*9a0e4156SSadaf Ebrahimi Register = GPR64DecoderTable[RegNo];
422*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
423*9a0e4156SSadaf Ebrahimi return Success;
424*9a0e4156SSadaf Ebrahimi }
425*9a0e4156SSadaf Ebrahimi
DecodeGPR64spRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)426*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPR64spRegisterClass(MCInst *Inst, unsigned RegNo,
427*9a0e4156SSadaf Ebrahimi uint64_t Addr,
428*9a0e4156SSadaf Ebrahimi const void *Decoder)
429*9a0e4156SSadaf Ebrahimi {
430*9a0e4156SSadaf Ebrahimi unsigned Register;
431*9a0e4156SSadaf Ebrahimi
432*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
433*9a0e4156SSadaf Ebrahimi return Fail;
434*9a0e4156SSadaf Ebrahimi
435*9a0e4156SSadaf Ebrahimi Register = GPR64DecoderTable[RegNo];
436*9a0e4156SSadaf Ebrahimi if (Register == AArch64_XZR)
437*9a0e4156SSadaf Ebrahimi Register = AArch64_SP;
438*9a0e4156SSadaf Ebrahimi
439*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
440*9a0e4156SSadaf Ebrahimi
441*9a0e4156SSadaf Ebrahimi return Success;
442*9a0e4156SSadaf Ebrahimi }
443*9a0e4156SSadaf Ebrahimi
444*9a0e4156SSadaf Ebrahimi static const unsigned GPR32DecoderTable[] = {
445*9a0e4156SSadaf Ebrahimi AArch64_W0, AArch64_W1, AArch64_W2, AArch64_W3, AArch64_W4,
446*9a0e4156SSadaf Ebrahimi AArch64_W5, AArch64_W6, AArch64_W7, AArch64_W8, AArch64_W9,
447*9a0e4156SSadaf Ebrahimi AArch64_W10, AArch64_W11, AArch64_W12, AArch64_W13, AArch64_W14,
448*9a0e4156SSadaf Ebrahimi AArch64_W15, AArch64_W16, AArch64_W17, AArch64_W18, AArch64_W19,
449*9a0e4156SSadaf Ebrahimi AArch64_W20, AArch64_W21, AArch64_W22, AArch64_W23, AArch64_W24,
450*9a0e4156SSadaf Ebrahimi AArch64_W25, AArch64_W26, AArch64_W27, AArch64_W28, AArch64_W29,
451*9a0e4156SSadaf Ebrahimi AArch64_W30, AArch64_WZR
452*9a0e4156SSadaf Ebrahimi };
453*9a0e4156SSadaf Ebrahimi
DecodeGPR32RegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)454*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst, unsigned RegNo,
455*9a0e4156SSadaf Ebrahimi uint64_t Addr,
456*9a0e4156SSadaf Ebrahimi const void *Decoder)
457*9a0e4156SSadaf Ebrahimi {
458*9a0e4156SSadaf Ebrahimi unsigned Register;
459*9a0e4156SSadaf Ebrahimi
460*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
461*9a0e4156SSadaf Ebrahimi return Fail;
462*9a0e4156SSadaf Ebrahimi
463*9a0e4156SSadaf Ebrahimi Register = GPR32DecoderTable[RegNo];
464*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
465*9a0e4156SSadaf Ebrahimi return Success;
466*9a0e4156SSadaf Ebrahimi }
467*9a0e4156SSadaf Ebrahimi
DecodeGPR32spRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)468*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeGPR32spRegisterClass(MCInst *Inst, unsigned RegNo,
469*9a0e4156SSadaf Ebrahimi uint64_t Addr,
470*9a0e4156SSadaf Ebrahimi const void *Decoder)
471*9a0e4156SSadaf Ebrahimi {
472*9a0e4156SSadaf Ebrahimi unsigned Register;
473*9a0e4156SSadaf Ebrahimi
474*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
475*9a0e4156SSadaf Ebrahimi return Fail;
476*9a0e4156SSadaf Ebrahimi
477*9a0e4156SSadaf Ebrahimi Register = GPR32DecoderTable[RegNo];
478*9a0e4156SSadaf Ebrahimi if (Register == AArch64_WZR)
479*9a0e4156SSadaf Ebrahimi Register = AArch64_WSP;
480*9a0e4156SSadaf Ebrahimi
481*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
482*9a0e4156SSadaf Ebrahimi return Success;
483*9a0e4156SSadaf Ebrahimi }
484*9a0e4156SSadaf Ebrahimi
485*9a0e4156SSadaf Ebrahimi static const unsigned VectorDecoderTable[] = {
486*9a0e4156SSadaf Ebrahimi AArch64_Q0, AArch64_Q1, AArch64_Q2, AArch64_Q3, AArch64_Q4,
487*9a0e4156SSadaf Ebrahimi AArch64_Q5, AArch64_Q6, AArch64_Q7, AArch64_Q8, AArch64_Q9,
488*9a0e4156SSadaf Ebrahimi AArch64_Q10, AArch64_Q11, AArch64_Q12, AArch64_Q13, AArch64_Q14,
489*9a0e4156SSadaf Ebrahimi AArch64_Q15, AArch64_Q16, AArch64_Q17, AArch64_Q18, AArch64_Q19,
490*9a0e4156SSadaf Ebrahimi AArch64_Q20, AArch64_Q21, AArch64_Q22, AArch64_Q23, AArch64_Q24,
491*9a0e4156SSadaf Ebrahimi AArch64_Q25, AArch64_Q26, AArch64_Q27, AArch64_Q28, AArch64_Q29,
492*9a0e4156SSadaf Ebrahimi AArch64_Q30, AArch64_Q31
493*9a0e4156SSadaf Ebrahimi };
494*9a0e4156SSadaf Ebrahimi
DecodeVectorRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)495*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVectorRegisterClass(MCInst *Inst, unsigned RegNo,
496*9a0e4156SSadaf Ebrahimi uint64_t Addr,
497*9a0e4156SSadaf Ebrahimi const void *Decoder)
498*9a0e4156SSadaf Ebrahimi {
499*9a0e4156SSadaf Ebrahimi unsigned Register;
500*9a0e4156SSadaf Ebrahimi
501*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
502*9a0e4156SSadaf Ebrahimi return Fail;
503*9a0e4156SSadaf Ebrahimi
504*9a0e4156SSadaf Ebrahimi Register = VectorDecoderTable[RegNo];
505*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
506*9a0e4156SSadaf Ebrahimi return Success;
507*9a0e4156SSadaf Ebrahimi }
508*9a0e4156SSadaf Ebrahimi
509*9a0e4156SSadaf Ebrahimi static const unsigned QQDecoderTable[] = {
510*9a0e4156SSadaf Ebrahimi AArch64_Q0_Q1, AArch64_Q1_Q2, AArch64_Q2_Q3, AArch64_Q3_Q4,
511*9a0e4156SSadaf Ebrahimi AArch64_Q4_Q5, AArch64_Q5_Q6, AArch64_Q6_Q7, AArch64_Q7_Q8,
512*9a0e4156SSadaf Ebrahimi AArch64_Q8_Q9, AArch64_Q9_Q10, AArch64_Q10_Q11, AArch64_Q11_Q12,
513*9a0e4156SSadaf Ebrahimi AArch64_Q12_Q13, AArch64_Q13_Q14, AArch64_Q14_Q15, AArch64_Q15_Q16,
514*9a0e4156SSadaf Ebrahimi AArch64_Q16_Q17, AArch64_Q17_Q18, AArch64_Q18_Q19, AArch64_Q19_Q20,
515*9a0e4156SSadaf Ebrahimi AArch64_Q20_Q21, AArch64_Q21_Q22, AArch64_Q22_Q23, AArch64_Q23_Q24,
516*9a0e4156SSadaf Ebrahimi AArch64_Q24_Q25, AArch64_Q25_Q26, AArch64_Q26_Q27, AArch64_Q27_Q28,
517*9a0e4156SSadaf Ebrahimi AArch64_Q28_Q29, AArch64_Q29_Q30, AArch64_Q30_Q31, AArch64_Q31_Q0
518*9a0e4156SSadaf Ebrahimi };
519*9a0e4156SSadaf Ebrahimi
DecodeQQRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)520*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeQQRegisterClass(MCInst *Inst, unsigned RegNo,
521*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
522*9a0e4156SSadaf Ebrahimi {
523*9a0e4156SSadaf Ebrahimi unsigned Register;
524*9a0e4156SSadaf Ebrahimi
525*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
526*9a0e4156SSadaf Ebrahimi return Fail;
527*9a0e4156SSadaf Ebrahimi
528*9a0e4156SSadaf Ebrahimi Register = QQDecoderTable[RegNo];
529*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
530*9a0e4156SSadaf Ebrahimi return Success;
531*9a0e4156SSadaf Ebrahimi }
532*9a0e4156SSadaf Ebrahimi
533*9a0e4156SSadaf Ebrahimi static const unsigned QQQDecoderTable[] = {
534*9a0e4156SSadaf Ebrahimi AArch64_Q0_Q1_Q2, AArch64_Q1_Q2_Q3, AArch64_Q2_Q3_Q4,
535*9a0e4156SSadaf Ebrahimi AArch64_Q3_Q4_Q5, AArch64_Q4_Q5_Q6, AArch64_Q5_Q6_Q7,
536*9a0e4156SSadaf Ebrahimi AArch64_Q6_Q7_Q8, AArch64_Q7_Q8_Q9, AArch64_Q8_Q9_Q10,
537*9a0e4156SSadaf Ebrahimi AArch64_Q9_Q10_Q11, AArch64_Q10_Q11_Q12, AArch64_Q11_Q12_Q13,
538*9a0e4156SSadaf Ebrahimi AArch64_Q12_Q13_Q14, AArch64_Q13_Q14_Q15, AArch64_Q14_Q15_Q16,
539*9a0e4156SSadaf Ebrahimi AArch64_Q15_Q16_Q17, AArch64_Q16_Q17_Q18, AArch64_Q17_Q18_Q19,
540*9a0e4156SSadaf Ebrahimi AArch64_Q18_Q19_Q20, AArch64_Q19_Q20_Q21, AArch64_Q20_Q21_Q22,
541*9a0e4156SSadaf Ebrahimi AArch64_Q21_Q22_Q23, AArch64_Q22_Q23_Q24, AArch64_Q23_Q24_Q25,
542*9a0e4156SSadaf Ebrahimi AArch64_Q24_Q25_Q26, AArch64_Q25_Q26_Q27, AArch64_Q26_Q27_Q28,
543*9a0e4156SSadaf Ebrahimi AArch64_Q27_Q28_Q29, AArch64_Q28_Q29_Q30, AArch64_Q29_Q30_Q31,
544*9a0e4156SSadaf Ebrahimi AArch64_Q30_Q31_Q0, AArch64_Q31_Q0_Q1
545*9a0e4156SSadaf Ebrahimi };
546*9a0e4156SSadaf Ebrahimi
DecodeQQQRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)547*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeQQQRegisterClass(MCInst *Inst, unsigned RegNo,
548*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
549*9a0e4156SSadaf Ebrahimi {
550*9a0e4156SSadaf Ebrahimi unsigned Register;
551*9a0e4156SSadaf Ebrahimi
552*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
553*9a0e4156SSadaf Ebrahimi return Fail;
554*9a0e4156SSadaf Ebrahimi
555*9a0e4156SSadaf Ebrahimi Register = QQQDecoderTable[RegNo];
556*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
557*9a0e4156SSadaf Ebrahimi return Success;
558*9a0e4156SSadaf Ebrahimi }
559*9a0e4156SSadaf Ebrahimi
560*9a0e4156SSadaf Ebrahimi static const unsigned QQQQDecoderTable[] = {
561*9a0e4156SSadaf Ebrahimi AArch64_Q0_Q1_Q2_Q3, AArch64_Q1_Q2_Q3_Q4, AArch64_Q2_Q3_Q4_Q5,
562*9a0e4156SSadaf Ebrahimi AArch64_Q3_Q4_Q5_Q6, AArch64_Q4_Q5_Q6_Q7, AArch64_Q5_Q6_Q7_Q8,
563*9a0e4156SSadaf Ebrahimi AArch64_Q6_Q7_Q8_Q9, AArch64_Q7_Q8_Q9_Q10, AArch64_Q8_Q9_Q10_Q11,
564*9a0e4156SSadaf Ebrahimi AArch64_Q9_Q10_Q11_Q12, AArch64_Q10_Q11_Q12_Q13, AArch64_Q11_Q12_Q13_Q14,
565*9a0e4156SSadaf Ebrahimi AArch64_Q12_Q13_Q14_Q15, AArch64_Q13_Q14_Q15_Q16, AArch64_Q14_Q15_Q16_Q17,
566*9a0e4156SSadaf Ebrahimi AArch64_Q15_Q16_Q17_Q18, AArch64_Q16_Q17_Q18_Q19, AArch64_Q17_Q18_Q19_Q20,
567*9a0e4156SSadaf Ebrahimi AArch64_Q18_Q19_Q20_Q21, AArch64_Q19_Q20_Q21_Q22, AArch64_Q20_Q21_Q22_Q23,
568*9a0e4156SSadaf Ebrahimi AArch64_Q21_Q22_Q23_Q24, AArch64_Q22_Q23_Q24_Q25, AArch64_Q23_Q24_Q25_Q26,
569*9a0e4156SSadaf Ebrahimi AArch64_Q24_Q25_Q26_Q27, AArch64_Q25_Q26_Q27_Q28, AArch64_Q26_Q27_Q28_Q29,
570*9a0e4156SSadaf Ebrahimi AArch64_Q27_Q28_Q29_Q30, AArch64_Q28_Q29_Q30_Q31, AArch64_Q29_Q30_Q31_Q0,
571*9a0e4156SSadaf Ebrahimi AArch64_Q30_Q31_Q0_Q1, AArch64_Q31_Q0_Q1_Q2
572*9a0e4156SSadaf Ebrahimi };
573*9a0e4156SSadaf Ebrahimi
DecodeQQQQRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)574*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeQQQQRegisterClass(MCInst *Inst, unsigned RegNo,
575*9a0e4156SSadaf Ebrahimi uint64_t Addr,
576*9a0e4156SSadaf Ebrahimi const void *Decoder)
577*9a0e4156SSadaf Ebrahimi {
578*9a0e4156SSadaf Ebrahimi unsigned Register;
579*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
580*9a0e4156SSadaf Ebrahimi return Fail;
581*9a0e4156SSadaf Ebrahimi
582*9a0e4156SSadaf Ebrahimi Register = QQQQDecoderTable[RegNo];
583*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
584*9a0e4156SSadaf Ebrahimi return Success;
585*9a0e4156SSadaf Ebrahimi }
586*9a0e4156SSadaf Ebrahimi
587*9a0e4156SSadaf Ebrahimi static const unsigned DDDecoderTable[] = {
588*9a0e4156SSadaf Ebrahimi AArch64_D0_D1, AArch64_D1_D2, AArch64_D2_D3, AArch64_D3_D4,
589*9a0e4156SSadaf Ebrahimi AArch64_D4_D5, AArch64_D5_D6, AArch64_D6_D7, AArch64_D7_D8,
590*9a0e4156SSadaf Ebrahimi AArch64_D8_D9, AArch64_D9_D10, AArch64_D10_D11, AArch64_D11_D12,
591*9a0e4156SSadaf Ebrahimi AArch64_D12_D13, AArch64_D13_D14, AArch64_D14_D15, AArch64_D15_D16,
592*9a0e4156SSadaf Ebrahimi AArch64_D16_D17, AArch64_D17_D18, AArch64_D18_D19, AArch64_D19_D20,
593*9a0e4156SSadaf Ebrahimi AArch64_D20_D21, AArch64_D21_D22, AArch64_D22_D23, AArch64_D23_D24,
594*9a0e4156SSadaf Ebrahimi AArch64_D24_D25, AArch64_D25_D26, AArch64_D26_D27, AArch64_D27_D28,
595*9a0e4156SSadaf Ebrahimi AArch64_D28_D29, AArch64_D29_D30, AArch64_D30_D31, AArch64_D31_D0
596*9a0e4156SSadaf Ebrahimi };
597*9a0e4156SSadaf Ebrahimi
DecodeDDRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)598*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeDDRegisterClass(MCInst *Inst, unsigned RegNo,
599*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
600*9a0e4156SSadaf Ebrahimi {
601*9a0e4156SSadaf Ebrahimi unsigned Register;
602*9a0e4156SSadaf Ebrahimi
603*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
604*9a0e4156SSadaf Ebrahimi return Fail;
605*9a0e4156SSadaf Ebrahimi
606*9a0e4156SSadaf Ebrahimi Register = DDDecoderTable[RegNo];
607*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
608*9a0e4156SSadaf Ebrahimi return Success;
609*9a0e4156SSadaf Ebrahimi }
610*9a0e4156SSadaf Ebrahimi
611*9a0e4156SSadaf Ebrahimi static const unsigned DDDDecoderTable[] = {
612*9a0e4156SSadaf Ebrahimi AArch64_D0_D1_D2, AArch64_D1_D2_D3, AArch64_D2_D3_D4,
613*9a0e4156SSadaf Ebrahimi AArch64_D3_D4_D5, AArch64_D4_D5_D6, AArch64_D5_D6_D7,
614*9a0e4156SSadaf Ebrahimi AArch64_D6_D7_D8, AArch64_D7_D8_D9, AArch64_D8_D9_D10,
615*9a0e4156SSadaf Ebrahimi AArch64_D9_D10_D11, AArch64_D10_D11_D12, AArch64_D11_D12_D13,
616*9a0e4156SSadaf Ebrahimi AArch64_D12_D13_D14, AArch64_D13_D14_D15, AArch64_D14_D15_D16,
617*9a0e4156SSadaf Ebrahimi AArch64_D15_D16_D17, AArch64_D16_D17_D18, AArch64_D17_D18_D19,
618*9a0e4156SSadaf Ebrahimi AArch64_D18_D19_D20, AArch64_D19_D20_D21, AArch64_D20_D21_D22,
619*9a0e4156SSadaf Ebrahimi AArch64_D21_D22_D23, AArch64_D22_D23_D24, AArch64_D23_D24_D25,
620*9a0e4156SSadaf Ebrahimi AArch64_D24_D25_D26, AArch64_D25_D26_D27, AArch64_D26_D27_D28,
621*9a0e4156SSadaf Ebrahimi AArch64_D27_D28_D29, AArch64_D28_D29_D30, AArch64_D29_D30_D31,
622*9a0e4156SSadaf Ebrahimi AArch64_D30_D31_D0, AArch64_D31_D0_D1
623*9a0e4156SSadaf Ebrahimi };
624*9a0e4156SSadaf Ebrahimi
DecodeDDDRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)625*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeDDDRegisterClass(MCInst *Inst, unsigned RegNo,
626*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
627*9a0e4156SSadaf Ebrahimi {
628*9a0e4156SSadaf Ebrahimi unsigned Register;
629*9a0e4156SSadaf Ebrahimi
630*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
631*9a0e4156SSadaf Ebrahimi return Fail;
632*9a0e4156SSadaf Ebrahimi
633*9a0e4156SSadaf Ebrahimi Register = DDDDecoderTable[RegNo];
634*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
635*9a0e4156SSadaf Ebrahimi return Success;
636*9a0e4156SSadaf Ebrahimi }
637*9a0e4156SSadaf Ebrahimi
638*9a0e4156SSadaf Ebrahimi static const unsigned DDDDDecoderTable[] = {
639*9a0e4156SSadaf Ebrahimi AArch64_D0_D1_D2_D3, AArch64_D1_D2_D3_D4, AArch64_D2_D3_D4_D5,
640*9a0e4156SSadaf Ebrahimi AArch64_D3_D4_D5_D6, AArch64_D4_D5_D6_D7, AArch64_D5_D6_D7_D8,
641*9a0e4156SSadaf Ebrahimi AArch64_D6_D7_D8_D9, AArch64_D7_D8_D9_D10, AArch64_D8_D9_D10_D11,
642*9a0e4156SSadaf Ebrahimi AArch64_D9_D10_D11_D12, AArch64_D10_D11_D12_D13, AArch64_D11_D12_D13_D14,
643*9a0e4156SSadaf Ebrahimi AArch64_D12_D13_D14_D15, AArch64_D13_D14_D15_D16, AArch64_D14_D15_D16_D17,
644*9a0e4156SSadaf Ebrahimi AArch64_D15_D16_D17_D18, AArch64_D16_D17_D18_D19, AArch64_D17_D18_D19_D20,
645*9a0e4156SSadaf Ebrahimi AArch64_D18_D19_D20_D21, AArch64_D19_D20_D21_D22, AArch64_D20_D21_D22_D23,
646*9a0e4156SSadaf Ebrahimi AArch64_D21_D22_D23_D24, AArch64_D22_D23_D24_D25, AArch64_D23_D24_D25_D26,
647*9a0e4156SSadaf Ebrahimi AArch64_D24_D25_D26_D27, AArch64_D25_D26_D27_D28, AArch64_D26_D27_D28_D29,
648*9a0e4156SSadaf Ebrahimi AArch64_D27_D28_D29_D30, AArch64_D28_D29_D30_D31, AArch64_D29_D30_D31_D0,
649*9a0e4156SSadaf Ebrahimi AArch64_D30_D31_D0_D1, AArch64_D31_D0_D1_D2
650*9a0e4156SSadaf Ebrahimi };
651*9a0e4156SSadaf Ebrahimi
DecodeDDDDRegisterClass(MCInst * Inst,unsigned RegNo,uint64_t Addr,const void * Decoder)652*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeDDDDRegisterClass(MCInst *Inst, unsigned RegNo,
653*9a0e4156SSadaf Ebrahimi uint64_t Addr,
654*9a0e4156SSadaf Ebrahimi const void *Decoder)
655*9a0e4156SSadaf Ebrahimi {
656*9a0e4156SSadaf Ebrahimi unsigned Register;
657*9a0e4156SSadaf Ebrahimi
658*9a0e4156SSadaf Ebrahimi if (RegNo > 31)
659*9a0e4156SSadaf Ebrahimi return Fail;
660*9a0e4156SSadaf Ebrahimi
661*9a0e4156SSadaf Ebrahimi Register = DDDDDecoderTable[RegNo];
662*9a0e4156SSadaf Ebrahimi MCOperand_CreateReg0(Inst, Register);
663*9a0e4156SSadaf Ebrahimi return Success;
664*9a0e4156SSadaf Ebrahimi }
665*9a0e4156SSadaf Ebrahimi
DecodeFixedPointScaleImm32(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)666*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFixedPointScaleImm32(MCInst *Inst, unsigned Imm,
667*9a0e4156SSadaf Ebrahimi uint64_t Addr,
668*9a0e4156SSadaf Ebrahimi const void *Decoder)
669*9a0e4156SSadaf Ebrahimi {
670*9a0e4156SSadaf Ebrahimi // scale{5} is asserted as 1 in tblgen.
671*9a0e4156SSadaf Ebrahimi Imm |= 0x20;
672*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, 64 - Imm);
673*9a0e4156SSadaf Ebrahimi return Success;
674*9a0e4156SSadaf Ebrahimi }
675*9a0e4156SSadaf Ebrahimi
DecodeFixedPointScaleImm64(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)676*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFixedPointScaleImm64(MCInst *Inst, unsigned Imm,
677*9a0e4156SSadaf Ebrahimi uint64_t Addr,
678*9a0e4156SSadaf Ebrahimi const void *Decoder)
679*9a0e4156SSadaf Ebrahimi {
680*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, 64 - Imm);
681*9a0e4156SSadaf Ebrahimi return Success;
682*9a0e4156SSadaf Ebrahimi }
683*9a0e4156SSadaf Ebrahimi
DecodePCRelLabel19(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)684*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePCRelLabel19(MCInst *Inst, unsigned Imm,
685*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
686*9a0e4156SSadaf Ebrahimi {
687*9a0e4156SSadaf Ebrahimi int64_t ImmVal = Imm;
688*9a0e4156SSadaf Ebrahimi
689*9a0e4156SSadaf Ebrahimi // Sign-extend 19-bit immediate.
690*9a0e4156SSadaf Ebrahimi if (ImmVal & (1 << (19 - 1)))
691*9a0e4156SSadaf Ebrahimi ImmVal |= ~((1LL << 19) - 1);
692*9a0e4156SSadaf Ebrahimi
693*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, ImmVal);
694*9a0e4156SSadaf Ebrahimi return Success;
695*9a0e4156SSadaf Ebrahimi }
696*9a0e4156SSadaf Ebrahimi
DecodeMemExtend(MCInst * Inst,unsigned Imm,uint64_t Address,const void * Decoder)697*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMemExtend(MCInst *Inst, unsigned Imm,
698*9a0e4156SSadaf Ebrahimi uint64_t Address, const void *Decoder)
699*9a0e4156SSadaf Ebrahimi {
700*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, (Imm >> 1) & 1);
701*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, Imm & 1);
702*9a0e4156SSadaf Ebrahimi return Success;
703*9a0e4156SSadaf Ebrahimi }
704*9a0e4156SSadaf Ebrahimi
DecodeMRSSystemRegister(MCInst * Inst,unsigned Imm,uint64_t Address,const void * Decoder)705*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMRSSystemRegister(MCInst *Inst, unsigned Imm,
706*9a0e4156SSadaf Ebrahimi uint64_t Address, const void *Decoder)
707*9a0e4156SSadaf Ebrahimi {
708*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, Imm);
709*9a0e4156SSadaf Ebrahimi
710*9a0e4156SSadaf Ebrahimi // Every system register in the encoding space is valid with the syntax
711*9a0e4156SSadaf Ebrahimi // S<op0>_<op1>_<Cn>_<Cm>_<op2>, so decoding system registers always succeeds.
712*9a0e4156SSadaf Ebrahimi return Success;
713*9a0e4156SSadaf Ebrahimi }
714*9a0e4156SSadaf Ebrahimi
DecodeMSRSystemRegister(MCInst * Inst,unsigned Imm,uint64_t Address,const void * Decoder)715*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMSRSystemRegister(MCInst *Inst, unsigned Imm,
716*9a0e4156SSadaf Ebrahimi uint64_t Address,
717*9a0e4156SSadaf Ebrahimi const void *Decoder)
718*9a0e4156SSadaf Ebrahimi {
719*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, Imm);
720*9a0e4156SSadaf Ebrahimi
721*9a0e4156SSadaf Ebrahimi return Success;
722*9a0e4156SSadaf Ebrahimi }
723*9a0e4156SSadaf Ebrahimi
DecodeFMOVLaneInstruction(MCInst * Inst,unsigned Insn,uint64_t Address,const void * Decoder)724*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeFMOVLaneInstruction(MCInst *Inst, unsigned Insn,
725*9a0e4156SSadaf Ebrahimi uint64_t Address,
726*9a0e4156SSadaf Ebrahimi const void *Decoder)
727*9a0e4156SSadaf Ebrahimi {
728*9a0e4156SSadaf Ebrahimi // This decoder exists to add the dummy Lane operand to the MCInst, which must
729*9a0e4156SSadaf Ebrahimi // be 1 in assembly but has no other real manifestation.
730*9a0e4156SSadaf Ebrahimi unsigned Rd = fieldFromInstruction(Insn, 0, 5);
731*9a0e4156SSadaf Ebrahimi unsigned Rn = fieldFromInstruction(Insn, 5, 5);
732*9a0e4156SSadaf Ebrahimi unsigned IsToVec = fieldFromInstruction(Insn, 16, 1);
733*9a0e4156SSadaf Ebrahimi
734*9a0e4156SSadaf Ebrahimi if (IsToVec) {
735*9a0e4156SSadaf Ebrahimi DecodeFPR128RegisterClass(Inst, Rd, Address, Decoder);
736*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
737*9a0e4156SSadaf Ebrahimi } else {
738*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
739*9a0e4156SSadaf Ebrahimi DecodeFPR128RegisterClass(Inst, Rn, Address, Decoder);
740*9a0e4156SSadaf Ebrahimi }
741*9a0e4156SSadaf Ebrahimi
742*9a0e4156SSadaf Ebrahimi // Add the lane
743*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, 1);
744*9a0e4156SSadaf Ebrahimi
745*9a0e4156SSadaf Ebrahimi return Success;
746*9a0e4156SSadaf Ebrahimi }
747*9a0e4156SSadaf Ebrahimi
DecodeVecShiftRImm(MCInst * Inst,unsigned Imm,unsigned Add)748*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftRImm(MCInst *Inst, unsigned Imm,
749*9a0e4156SSadaf Ebrahimi unsigned Add)
750*9a0e4156SSadaf Ebrahimi {
751*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, Add - Imm);
752*9a0e4156SSadaf Ebrahimi return Success;
753*9a0e4156SSadaf Ebrahimi }
754*9a0e4156SSadaf Ebrahimi
DecodeVecShiftLImm(MCInst * Inst,unsigned Imm,unsigned Add)755*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftLImm(MCInst *Inst, unsigned Imm,
756*9a0e4156SSadaf Ebrahimi unsigned Add)
757*9a0e4156SSadaf Ebrahimi {
758*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, (Imm + Add) & (Add - 1));
759*9a0e4156SSadaf Ebrahimi return Success;
760*9a0e4156SSadaf Ebrahimi }
761*9a0e4156SSadaf Ebrahimi
DecodeVecShiftR64Imm(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)762*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR64Imm(MCInst *Inst, unsigned Imm,
763*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
764*9a0e4156SSadaf Ebrahimi {
765*9a0e4156SSadaf Ebrahimi return DecodeVecShiftRImm(Inst, Imm, 64);
766*9a0e4156SSadaf Ebrahimi }
767*9a0e4156SSadaf Ebrahimi
DecodeVecShiftR64ImmNarrow(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)768*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR64ImmNarrow(MCInst *Inst, unsigned Imm,
769*9a0e4156SSadaf Ebrahimi uint64_t Addr,
770*9a0e4156SSadaf Ebrahimi const void *Decoder)
771*9a0e4156SSadaf Ebrahimi {
772*9a0e4156SSadaf Ebrahimi return DecodeVecShiftRImm(Inst, Imm | 0x20, 64);
773*9a0e4156SSadaf Ebrahimi }
774*9a0e4156SSadaf Ebrahimi
DecodeVecShiftR32Imm(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)775*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR32Imm(MCInst *Inst, unsigned Imm,
776*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
777*9a0e4156SSadaf Ebrahimi {
778*9a0e4156SSadaf Ebrahimi return DecodeVecShiftRImm(Inst, Imm, 32);
779*9a0e4156SSadaf Ebrahimi }
780*9a0e4156SSadaf Ebrahimi
DecodeVecShiftR32ImmNarrow(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)781*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR32ImmNarrow(MCInst *Inst, unsigned Imm,
782*9a0e4156SSadaf Ebrahimi uint64_t Addr,
783*9a0e4156SSadaf Ebrahimi const void *Decoder)
784*9a0e4156SSadaf Ebrahimi {
785*9a0e4156SSadaf Ebrahimi return DecodeVecShiftRImm(Inst, Imm | 0x10, 32);
786*9a0e4156SSadaf Ebrahimi }
787*9a0e4156SSadaf Ebrahimi
DecodeVecShiftR16Imm(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)788*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR16Imm(MCInst *Inst, unsigned Imm,
789*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
790*9a0e4156SSadaf Ebrahimi {
791*9a0e4156SSadaf Ebrahimi return DecodeVecShiftRImm(Inst, Imm, 16);
792*9a0e4156SSadaf Ebrahimi }
793*9a0e4156SSadaf Ebrahimi
DecodeVecShiftR16ImmNarrow(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)794*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR16ImmNarrow(MCInst *Inst, unsigned Imm,
795*9a0e4156SSadaf Ebrahimi uint64_t Addr,
796*9a0e4156SSadaf Ebrahimi const void *Decoder)
797*9a0e4156SSadaf Ebrahimi {
798*9a0e4156SSadaf Ebrahimi return DecodeVecShiftRImm(Inst, Imm | 0x8, 16);
799*9a0e4156SSadaf Ebrahimi }
800*9a0e4156SSadaf Ebrahimi
DecodeVecShiftR8Imm(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)801*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftR8Imm(MCInst *Inst, unsigned Imm,
802*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
803*9a0e4156SSadaf Ebrahimi {
804*9a0e4156SSadaf Ebrahimi return DecodeVecShiftRImm(Inst, Imm, 8);
805*9a0e4156SSadaf Ebrahimi }
806*9a0e4156SSadaf Ebrahimi
DecodeVecShiftL64Imm(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)807*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftL64Imm(MCInst *Inst, unsigned Imm,
808*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
809*9a0e4156SSadaf Ebrahimi {
810*9a0e4156SSadaf Ebrahimi return DecodeVecShiftLImm(Inst, Imm, 64);
811*9a0e4156SSadaf Ebrahimi }
812*9a0e4156SSadaf Ebrahimi
DecodeVecShiftL32Imm(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)813*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftL32Imm(MCInst *Inst, unsigned Imm,
814*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
815*9a0e4156SSadaf Ebrahimi {
816*9a0e4156SSadaf Ebrahimi return DecodeVecShiftLImm(Inst, Imm, 32);
817*9a0e4156SSadaf Ebrahimi }
818*9a0e4156SSadaf Ebrahimi
DecodeVecShiftL16Imm(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)819*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftL16Imm(MCInst *Inst, unsigned Imm,
820*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
821*9a0e4156SSadaf Ebrahimi {
822*9a0e4156SSadaf Ebrahimi return DecodeVecShiftLImm(Inst, Imm, 16);
823*9a0e4156SSadaf Ebrahimi }
824*9a0e4156SSadaf Ebrahimi
DecodeVecShiftL8Imm(MCInst * Inst,unsigned Imm,uint64_t Addr,const void * Decoder)825*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeVecShiftL8Imm(MCInst *Inst, unsigned Imm,
826*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
827*9a0e4156SSadaf Ebrahimi {
828*9a0e4156SSadaf Ebrahimi return DecodeVecShiftLImm(Inst, Imm, 8);
829*9a0e4156SSadaf Ebrahimi }
830*9a0e4156SSadaf Ebrahimi
DecodeThreeAddrSRegInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)831*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeThreeAddrSRegInstruction(MCInst *Inst,
832*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Addr,
833*9a0e4156SSadaf Ebrahimi const void *Decoder)
834*9a0e4156SSadaf Ebrahimi {
835*9a0e4156SSadaf Ebrahimi unsigned Rd = fieldFromInstruction(insn, 0, 5);
836*9a0e4156SSadaf Ebrahimi unsigned Rn = fieldFromInstruction(insn, 5, 5);
837*9a0e4156SSadaf Ebrahimi unsigned Rm = fieldFromInstruction(insn, 16, 5);
838*9a0e4156SSadaf Ebrahimi unsigned shiftHi = fieldFromInstruction(insn, 22, 2);
839*9a0e4156SSadaf Ebrahimi unsigned shiftLo = fieldFromInstruction(insn, 10, 6);
840*9a0e4156SSadaf Ebrahimi unsigned shift = (shiftHi << 6) | shiftLo;
841*9a0e4156SSadaf Ebrahimi
842*9a0e4156SSadaf Ebrahimi switch (MCInst_getOpcode(Inst)) {
843*9a0e4156SSadaf Ebrahimi default:
844*9a0e4156SSadaf Ebrahimi return Fail;
845*9a0e4156SSadaf Ebrahimi case AArch64_ADDWrs:
846*9a0e4156SSadaf Ebrahimi case AArch64_ADDSWrs:
847*9a0e4156SSadaf Ebrahimi case AArch64_SUBWrs:
848*9a0e4156SSadaf Ebrahimi case AArch64_SUBSWrs:
849*9a0e4156SSadaf Ebrahimi // if shift == '11' then ReservedValue()
850*9a0e4156SSadaf Ebrahimi if (shiftHi == 0x3)
851*9a0e4156SSadaf Ebrahimi return Fail;
852*9a0e4156SSadaf Ebrahimi // Deliberate fallthrough
853*9a0e4156SSadaf Ebrahimi case AArch64_ANDWrs:
854*9a0e4156SSadaf Ebrahimi case AArch64_ANDSWrs:
855*9a0e4156SSadaf Ebrahimi case AArch64_BICWrs:
856*9a0e4156SSadaf Ebrahimi case AArch64_BICSWrs:
857*9a0e4156SSadaf Ebrahimi case AArch64_ORRWrs:
858*9a0e4156SSadaf Ebrahimi case AArch64_ORNWrs:
859*9a0e4156SSadaf Ebrahimi case AArch64_EORWrs:
860*9a0e4156SSadaf Ebrahimi case AArch64_EONWrs: {
861*9a0e4156SSadaf Ebrahimi // if sf == '0' and imm6<5> == '1' then ReservedValue()
862*9a0e4156SSadaf Ebrahimi if (shiftLo >> 5 == 1)
863*9a0e4156SSadaf Ebrahimi return Fail;
864*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
865*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
866*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
867*9a0e4156SSadaf Ebrahimi break;
868*9a0e4156SSadaf Ebrahimi }
869*9a0e4156SSadaf Ebrahimi case AArch64_ADDXrs:
870*9a0e4156SSadaf Ebrahimi case AArch64_ADDSXrs:
871*9a0e4156SSadaf Ebrahimi case AArch64_SUBXrs:
872*9a0e4156SSadaf Ebrahimi case AArch64_SUBSXrs:
873*9a0e4156SSadaf Ebrahimi // if shift == '11' then ReservedValue()
874*9a0e4156SSadaf Ebrahimi if (shiftHi == 0x3)
875*9a0e4156SSadaf Ebrahimi return Fail;
876*9a0e4156SSadaf Ebrahimi // Deliberate fallthrough
877*9a0e4156SSadaf Ebrahimi case AArch64_ANDXrs:
878*9a0e4156SSadaf Ebrahimi case AArch64_ANDSXrs:
879*9a0e4156SSadaf Ebrahimi case AArch64_BICXrs:
880*9a0e4156SSadaf Ebrahimi case AArch64_BICSXrs:
881*9a0e4156SSadaf Ebrahimi case AArch64_ORRXrs:
882*9a0e4156SSadaf Ebrahimi case AArch64_ORNXrs:
883*9a0e4156SSadaf Ebrahimi case AArch64_EORXrs:
884*9a0e4156SSadaf Ebrahimi case AArch64_EONXrs:
885*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
886*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
887*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
888*9a0e4156SSadaf Ebrahimi break;
889*9a0e4156SSadaf Ebrahimi }
890*9a0e4156SSadaf Ebrahimi
891*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, shift);
892*9a0e4156SSadaf Ebrahimi return Success;
893*9a0e4156SSadaf Ebrahimi }
894*9a0e4156SSadaf Ebrahimi
DecodeMoveImmInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)895*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeMoveImmInstruction(MCInst *Inst, uint32_t insn,
896*9a0e4156SSadaf Ebrahimi uint64_t Addr,
897*9a0e4156SSadaf Ebrahimi const void *Decoder)
898*9a0e4156SSadaf Ebrahimi {
899*9a0e4156SSadaf Ebrahimi unsigned Rd = fieldFromInstruction(insn, 0, 5);
900*9a0e4156SSadaf Ebrahimi unsigned imm = fieldFromInstruction(insn, 5, 16);
901*9a0e4156SSadaf Ebrahimi unsigned shift = fieldFromInstruction(insn, 21, 2);
902*9a0e4156SSadaf Ebrahimi
903*9a0e4156SSadaf Ebrahimi shift <<= 4;
904*9a0e4156SSadaf Ebrahimi
905*9a0e4156SSadaf Ebrahimi switch (MCInst_getOpcode(Inst)) {
906*9a0e4156SSadaf Ebrahimi default:
907*9a0e4156SSadaf Ebrahimi return Fail;
908*9a0e4156SSadaf Ebrahimi case AArch64_MOVZWi:
909*9a0e4156SSadaf Ebrahimi case AArch64_MOVNWi:
910*9a0e4156SSadaf Ebrahimi case AArch64_MOVKWi:
911*9a0e4156SSadaf Ebrahimi if (shift & (1U << 5))
912*9a0e4156SSadaf Ebrahimi return Fail;
913*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
914*9a0e4156SSadaf Ebrahimi break;
915*9a0e4156SSadaf Ebrahimi case AArch64_MOVZXi:
916*9a0e4156SSadaf Ebrahimi case AArch64_MOVNXi:
917*9a0e4156SSadaf Ebrahimi case AArch64_MOVKXi:
918*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
919*9a0e4156SSadaf Ebrahimi break;
920*9a0e4156SSadaf Ebrahimi }
921*9a0e4156SSadaf Ebrahimi
922*9a0e4156SSadaf Ebrahimi if (MCInst_getOpcode(Inst) == AArch64_MOVKWi ||
923*9a0e4156SSadaf Ebrahimi MCInst_getOpcode(Inst) == AArch64_MOVKXi)
924*9a0e4156SSadaf Ebrahimi MCInst_addOperand2(Inst, MCInst_getOperand(Inst, 0));
925*9a0e4156SSadaf Ebrahimi
926*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, imm);
927*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, shift);
928*9a0e4156SSadaf Ebrahimi return Success;
929*9a0e4156SSadaf Ebrahimi }
930*9a0e4156SSadaf Ebrahimi
DecodeUnsignedLdStInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)931*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeUnsignedLdStInstruction(MCInst *Inst,
932*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Addr,
933*9a0e4156SSadaf Ebrahimi const void *Decoder)
934*9a0e4156SSadaf Ebrahimi {
935*9a0e4156SSadaf Ebrahimi unsigned Rt = fieldFromInstruction(insn, 0, 5);
936*9a0e4156SSadaf Ebrahimi unsigned Rn = fieldFromInstruction(insn, 5, 5);
937*9a0e4156SSadaf Ebrahimi unsigned offset = fieldFromInstruction(insn, 10, 12);
938*9a0e4156SSadaf Ebrahimi
939*9a0e4156SSadaf Ebrahimi switch (MCInst_getOpcode(Inst)) {
940*9a0e4156SSadaf Ebrahimi default:
941*9a0e4156SSadaf Ebrahimi return Fail;
942*9a0e4156SSadaf Ebrahimi case AArch64_PRFMui:
943*9a0e4156SSadaf Ebrahimi // Rt is an immediate in prefetch.
944*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, Rt);
945*9a0e4156SSadaf Ebrahimi break;
946*9a0e4156SSadaf Ebrahimi case AArch64_STRBBui:
947*9a0e4156SSadaf Ebrahimi case AArch64_LDRBBui:
948*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBWui:
949*9a0e4156SSadaf Ebrahimi case AArch64_STRHHui:
950*9a0e4156SSadaf Ebrahimi case AArch64_LDRHHui:
951*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHWui:
952*9a0e4156SSadaf Ebrahimi case AArch64_STRWui:
953*9a0e4156SSadaf Ebrahimi case AArch64_LDRWui:
954*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
955*9a0e4156SSadaf Ebrahimi break;
956*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBXui:
957*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHXui:
958*9a0e4156SSadaf Ebrahimi case AArch64_LDRSWui:
959*9a0e4156SSadaf Ebrahimi case AArch64_STRXui:
960*9a0e4156SSadaf Ebrahimi case AArch64_LDRXui:
961*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
962*9a0e4156SSadaf Ebrahimi break;
963*9a0e4156SSadaf Ebrahimi case AArch64_LDRQui:
964*9a0e4156SSadaf Ebrahimi case AArch64_STRQui:
965*9a0e4156SSadaf Ebrahimi DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
966*9a0e4156SSadaf Ebrahimi break;
967*9a0e4156SSadaf Ebrahimi case AArch64_LDRDui:
968*9a0e4156SSadaf Ebrahimi case AArch64_STRDui:
969*9a0e4156SSadaf Ebrahimi DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
970*9a0e4156SSadaf Ebrahimi break;
971*9a0e4156SSadaf Ebrahimi case AArch64_LDRSui:
972*9a0e4156SSadaf Ebrahimi case AArch64_STRSui:
973*9a0e4156SSadaf Ebrahimi DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
974*9a0e4156SSadaf Ebrahimi break;
975*9a0e4156SSadaf Ebrahimi case AArch64_LDRHui:
976*9a0e4156SSadaf Ebrahimi case AArch64_STRHui:
977*9a0e4156SSadaf Ebrahimi DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
978*9a0e4156SSadaf Ebrahimi break;
979*9a0e4156SSadaf Ebrahimi case AArch64_LDRBui:
980*9a0e4156SSadaf Ebrahimi case AArch64_STRBui:
981*9a0e4156SSadaf Ebrahimi DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
982*9a0e4156SSadaf Ebrahimi break;
983*9a0e4156SSadaf Ebrahimi }
984*9a0e4156SSadaf Ebrahimi
985*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
986*9a0e4156SSadaf Ebrahimi //if (!Dis->tryAddingSymbolicOperand(Inst, offset, Addr, Fail, 0, 4))
987*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, offset);
988*9a0e4156SSadaf Ebrahimi
989*9a0e4156SSadaf Ebrahimi return Success;
990*9a0e4156SSadaf Ebrahimi }
991*9a0e4156SSadaf Ebrahimi
DecodeSignedLdStInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)992*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSignedLdStInstruction(MCInst *Inst,
993*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Addr,
994*9a0e4156SSadaf Ebrahimi const void *Decoder)
995*9a0e4156SSadaf Ebrahimi {
996*9a0e4156SSadaf Ebrahimi bool IsLoad;
997*9a0e4156SSadaf Ebrahimi bool IsIndexed;
998*9a0e4156SSadaf Ebrahimi bool IsFP;
999*9a0e4156SSadaf Ebrahimi unsigned Rt = fieldFromInstruction(insn, 0, 5);
1000*9a0e4156SSadaf Ebrahimi unsigned Rn = fieldFromInstruction(insn, 5, 5);
1001*9a0e4156SSadaf Ebrahimi int64_t offset = fieldFromInstruction(insn, 12, 9);
1002*9a0e4156SSadaf Ebrahimi
1003*9a0e4156SSadaf Ebrahimi // offset is a 9-bit signed immediate, so sign extend it to
1004*9a0e4156SSadaf Ebrahimi // fill the unsigned.
1005*9a0e4156SSadaf Ebrahimi if (offset & (1 << (9 - 1)))
1006*9a0e4156SSadaf Ebrahimi offset |= ~((1LL << 9) - 1);
1007*9a0e4156SSadaf Ebrahimi
1008*9a0e4156SSadaf Ebrahimi // First operand is always the writeback to the address register, if needed.
1009*9a0e4156SSadaf Ebrahimi switch (MCInst_getOpcode(Inst)) {
1010*9a0e4156SSadaf Ebrahimi default:
1011*9a0e4156SSadaf Ebrahimi break;
1012*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBWpre:
1013*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHWpre:
1014*9a0e4156SSadaf Ebrahimi case AArch64_STRBBpre:
1015*9a0e4156SSadaf Ebrahimi case AArch64_LDRBBpre:
1016*9a0e4156SSadaf Ebrahimi case AArch64_STRHHpre:
1017*9a0e4156SSadaf Ebrahimi case AArch64_LDRHHpre:
1018*9a0e4156SSadaf Ebrahimi case AArch64_STRWpre:
1019*9a0e4156SSadaf Ebrahimi case AArch64_LDRWpre:
1020*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBWpost:
1021*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHWpost:
1022*9a0e4156SSadaf Ebrahimi case AArch64_STRBBpost:
1023*9a0e4156SSadaf Ebrahimi case AArch64_LDRBBpost:
1024*9a0e4156SSadaf Ebrahimi case AArch64_STRHHpost:
1025*9a0e4156SSadaf Ebrahimi case AArch64_LDRHHpost:
1026*9a0e4156SSadaf Ebrahimi case AArch64_STRWpost:
1027*9a0e4156SSadaf Ebrahimi case AArch64_LDRWpost:
1028*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBXpre:
1029*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHXpre:
1030*9a0e4156SSadaf Ebrahimi case AArch64_STRXpre:
1031*9a0e4156SSadaf Ebrahimi case AArch64_LDRSWpre:
1032*9a0e4156SSadaf Ebrahimi case AArch64_LDRXpre:
1033*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBXpost:
1034*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHXpost:
1035*9a0e4156SSadaf Ebrahimi case AArch64_STRXpost:
1036*9a0e4156SSadaf Ebrahimi case AArch64_LDRSWpost:
1037*9a0e4156SSadaf Ebrahimi case AArch64_LDRXpost:
1038*9a0e4156SSadaf Ebrahimi case AArch64_LDRQpre:
1039*9a0e4156SSadaf Ebrahimi case AArch64_STRQpre:
1040*9a0e4156SSadaf Ebrahimi case AArch64_LDRQpost:
1041*9a0e4156SSadaf Ebrahimi case AArch64_STRQpost:
1042*9a0e4156SSadaf Ebrahimi case AArch64_LDRDpre:
1043*9a0e4156SSadaf Ebrahimi case AArch64_STRDpre:
1044*9a0e4156SSadaf Ebrahimi case AArch64_LDRDpost:
1045*9a0e4156SSadaf Ebrahimi case AArch64_STRDpost:
1046*9a0e4156SSadaf Ebrahimi case AArch64_LDRSpre:
1047*9a0e4156SSadaf Ebrahimi case AArch64_STRSpre:
1048*9a0e4156SSadaf Ebrahimi case AArch64_LDRSpost:
1049*9a0e4156SSadaf Ebrahimi case AArch64_STRSpost:
1050*9a0e4156SSadaf Ebrahimi case AArch64_LDRHpre:
1051*9a0e4156SSadaf Ebrahimi case AArch64_STRHpre:
1052*9a0e4156SSadaf Ebrahimi case AArch64_LDRHpost:
1053*9a0e4156SSadaf Ebrahimi case AArch64_STRHpost:
1054*9a0e4156SSadaf Ebrahimi case AArch64_LDRBpre:
1055*9a0e4156SSadaf Ebrahimi case AArch64_STRBpre:
1056*9a0e4156SSadaf Ebrahimi case AArch64_LDRBpost:
1057*9a0e4156SSadaf Ebrahimi case AArch64_STRBpost:
1058*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1059*9a0e4156SSadaf Ebrahimi break;
1060*9a0e4156SSadaf Ebrahimi }
1061*9a0e4156SSadaf Ebrahimi
1062*9a0e4156SSadaf Ebrahimi switch (MCInst_getOpcode(Inst)) {
1063*9a0e4156SSadaf Ebrahimi default:
1064*9a0e4156SSadaf Ebrahimi return Fail;
1065*9a0e4156SSadaf Ebrahimi case AArch64_PRFUMi:
1066*9a0e4156SSadaf Ebrahimi // Rt is an immediate in prefetch.
1067*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, Rt);
1068*9a0e4156SSadaf Ebrahimi break;
1069*9a0e4156SSadaf Ebrahimi case AArch64_STURBBi:
1070*9a0e4156SSadaf Ebrahimi case AArch64_LDURBBi:
1071*9a0e4156SSadaf Ebrahimi case AArch64_LDURSBWi:
1072*9a0e4156SSadaf Ebrahimi case AArch64_STURHHi:
1073*9a0e4156SSadaf Ebrahimi case AArch64_LDURHHi:
1074*9a0e4156SSadaf Ebrahimi case AArch64_LDURSHWi:
1075*9a0e4156SSadaf Ebrahimi case AArch64_STURWi:
1076*9a0e4156SSadaf Ebrahimi case AArch64_LDURWi:
1077*9a0e4156SSadaf Ebrahimi case AArch64_LDTRSBWi:
1078*9a0e4156SSadaf Ebrahimi case AArch64_LDTRSHWi:
1079*9a0e4156SSadaf Ebrahimi case AArch64_STTRWi:
1080*9a0e4156SSadaf Ebrahimi case AArch64_LDTRWi:
1081*9a0e4156SSadaf Ebrahimi case AArch64_STTRHi:
1082*9a0e4156SSadaf Ebrahimi case AArch64_LDTRHi:
1083*9a0e4156SSadaf Ebrahimi case AArch64_LDTRBi:
1084*9a0e4156SSadaf Ebrahimi case AArch64_STTRBi:
1085*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBWpre:
1086*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHWpre:
1087*9a0e4156SSadaf Ebrahimi case AArch64_STRBBpre:
1088*9a0e4156SSadaf Ebrahimi case AArch64_LDRBBpre:
1089*9a0e4156SSadaf Ebrahimi case AArch64_STRHHpre:
1090*9a0e4156SSadaf Ebrahimi case AArch64_LDRHHpre:
1091*9a0e4156SSadaf Ebrahimi case AArch64_STRWpre:
1092*9a0e4156SSadaf Ebrahimi case AArch64_LDRWpre:
1093*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBWpost:
1094*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHWpost:
1095*9a0e4156SSadaf Ebrahimi case AArch64_STRBBpost:
1096*9a0e4156SSadaf Ebrahimi case AArch64_LDRBBpost:
1097*9a0e4156SSadaf Ebrahimi case AArch64_STRHHpost:
1098*9a0e4156SSadaf Ebrahimi case AArch64_LDRHHpost:
1099*9a0e4156SSadaf Ebrahimi case AArch64_STRWpost:
1100*9a0e4156SSadaf Ebrahimi case AArch64_LDRWpost:
1101*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1102*9a0e4156SSadaf Ebrahimi break;
1103*9a0e4156SSadaf Ebrahimi case AArch64_LDURSBXi:
1104*9a0e4156SSadaf Ebrahimi case AArch64_LDURSHXi:
1105*9a0e4156SSadaf Ebrahimi case AArch64_LDURSWi:
1106*9a0e4156SSadaf Ebrahimi case AArch64_STURXi:
1107*9a0e4156SSadaf Ebrahimi case AArch64_LDURXi:
1108*9a0e4156SSadaf Ebrahimi case AArch64_LDTRSBXi:
1109*9a0e4156SSadaf Ebrahimi case AArch64_LDTRSHXi:
1110*9a0e4156SSadaf Ebrahimi case AArch64_LDTRSWi:
1111*9a0e4156SSadaf Ebrahimi case AArch64_STTRXi:
1112*9a0e4156SSadaf Ebrahimi case AArch64_LDTRXi:
1113*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBXpre:
1114*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHXpre:
1115*9a0e4156SSadaf Ebrahimi case AArch64_STRXpre:
1116*9a0e4156SSadaf Ebrahimi case AArch64_LDRSWpre:
1117*9a0e4156SSadaf Ebrahimi case AArch64_LDRXpre:
1118*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBXpost:
1119*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHXpost:
1120*9a0e4156SSadaf Ebrahimi case AArch64_STRXpost:
1121*9a0e4156SSadaf Ebrahimi case AArch64_LDRSWpost:
1122*9a0e4156SSadaf Ebrahimi case AArch64_LDRXpost:
1123*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1124*9a0e4156SSadaf Ebrahimi break;
1125*9a0e4156SSadaf Ebrahimi case AArch64_LDURQi:
1126*9a0e4156SSadaf Ebrahimi case AArch64_STURQi:
1127*9a0e4156SSadaf Ebrahimi case AArch64_LDRQpre:
1128*9a0e4156SSadaf Ebrahimi case AArch64_STRQpre:
1129*9a0e4156SSadaf Ebrahimi case AArch64_LDRQpost:
1130*9a0e4156SSadaf Ebrahimi case AArch64_STRQpost:
1131*9a0e4156SSadaf Ebrahimi DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1132*9a0e4156SSadaf Ebrahimi break;
1133*9a0e4156SSadaf Ebrahimi case AArch64_LDURDi:
1134*9a0e4156SSadaf Ebrahimi case AArch64_STURDi:
1135*9a0e4156SSadaf Ebrahimi case AArch64_LDRDpre:
1136*9a0e4156SSadaf Ebrahimi case AArch64_STRDpre:
1137*9a0e4156SSadaf Ebrahimi case AArch64_LDRDpost:
1138*9a0e4156SSadaf Ebrahimi case AArch64_STRDpost:
1139*9a0e4156SSadaf Ebrahimi DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1140*9a0e4156SSadaf Ebrahimi break;
1141*9a0e4156SSadaf Ebrahimi case AArch64_LDURSi:
1142*9a0e4156SSadaf Ebrahimi case AArch64_STURSi:
1143*9a0e4156SSadaf Ebrahimi case AArch64_LDRSpre:
1144*9a0e4156SSadaf Ebrahimi case AArch64_STRSpre:
1145*9a0e4156SSadaf Ebrahimi case AArch64_LDRSpost:
1146*9a0e4156SSadaf Ebrahimi case AArch64_STRSpost:
1147*9a0e4156SSadaf Ebrahimi DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1148*9a0e4156SSadaf Ebrahimi break;
1149*9a0e4156SSadaf Ebrahimi case AArch64_LDURHi:
1150*9a0e4156SSadaf Ebrahimi case AArch64_STURHi:
1151*9a0e4156SSadaf Ebrahimi case AArch64_LDRHpre:
1152*9a0e4156SSadaf Ebrahimi case AArch64_STRHpre:
1153*9a0e4156SSadaf Ebrahimi case AArch64_LDRHpost:
1154*9a0e4156SSadaf Ebrahimi case AArch64_STRHpost:
1155*9a0e4156SSadaf Ebrahimi DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
1156*9a0e4156SSadaf Ebrahimi break;
1157*9a0e4156SSadaf Ebrahimi case AArch64_LDURBi:
1158*9a0e4156SSadaf Ebrahimi case AArch64_STURBi:
1159*9a0e4156SSadaf Ebrahimi case AArch64_LDRBpre:
1160*9a0e4156SSadaf Ebrahimi case AArch64_STRBpre:
1161*9a0e4156SSadaf Ebrahimi case AArch64_LDRBpost:
1162*9a0e4156SSadaf Ebrahimi case AArch64_STRBpost:
1163*9a0e4156SSadaf Ebrahimi DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
1164*9a0e4156SSadaf Ebrahimi break;
1165*9a0e4156SSadaf Ebrahimi }
1166*9a0e4156SSadaf Ebrahimi
1167*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1168*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, offset);
1169*9a0e4156SSadaf Ebrahimi
1170*9a0e4156SSadaf Ebrahimi IsLoad = fieldFromInstruction(insn, 22, 1) != 0;
1171*9a0e4156SSadaf Ebrahimi IsIndexed = fieldFromInstruction(insn, 10, 2) != 0;
1172*9a0e4156SSadaf Ebrahimi IsFP = fieldFromInstruction(insn, 26, 1) != 0;
1173*9a0e4156SSadaf Ebrahimi
1174*9a0e4156SSadaf Ebrahimi // Cannot write back to a transfer register (but xzr != sp).
1175*9a0e4156SSadaf Ebrahimi if (IsLoad && IsIndexed && !IsFP && Rn != 31 && Rt == Rn)
1176*9a0e4156SSadaf Ebrahimi return SoftFail;
1177*9a0e4156SSadaf Ebrahimi
1178*9a0e4156SSadaf Ebrahimi return Success;
1179*9a0e4156SSadaf Ebrahimi }
1180*9a0e4156SSadaf Ebrahimi
DecodeExclusiveLdStInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1181*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeExclusiveLdStInstruction(MCInst *Inst,
1182*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Addr,
1183*9a0e4156SSadaf Ebrahimi const void *Decoder)
1184*9a0e4156SSadaf Ebrahimi {
1185*9a0e4156SSadaf Ebrahimi unsigned Rt = fieldFromInstruction(insn, 0, 5);
1186*9a0e4156SSadaf Ebrahimi unsigned Rn = fieldFromInstruction(insn, 5, 5);
1187*9a0e4156SSadaf Ebrahimi unsigned Rt2 = fieldFromInstruction(insn, 10, 5);
1188*9a0e4156SSadaf Ebrahimi unsigned Rs = fieldFromInstruction(insn, 16, 5);
1189*9a0e4156SSadaf Ebrahimi unsigned Opcode = MCInst_getOpcode(Inst);
1190*9a0e4156SSadaf Ebrahimi
1191*9a0e4156SSadaf Ebrahimi switch (Opcode) {
1192*9a0e4156SSadaf Ebrahimi default:
1193*9a0e4156SSadaf Ebrahimi return Fail;
1194*9a0e4156SSadaf Ebrahimi case AArch64_STLXRW:
1195*9a0e4156SSadaf Ebrahimi case AArch64_STLXRB:
1196*9a0e4156SSadaf Ebrahimi case AArch64_STLXRH:
1197*9a0e4156SSadaf Ebrahimi case AArch64_STXRW:
1198*9a0e4156SSadaf Ebrahimi case AArch64_STXRB:
1199*9a0e4156SSadaf Ebrahimi case AArch64_STXRH:
1200*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1201*9a0e4156SSadaf Ebrahimi // FALLTHROUGH
1202*9a0e4156SSadaf Ebrahimi case AArch64_LDARW:
1203*9a0e4156SSadaf Ebrahimi case AArch64_LDARB:
1204*9a0e4156SSadaf Ebrahimi case AArch64_LDARH:
1205*9a0e4156SSadaf Ebrahimi case AArch64_LDAXRW:
1206*9a0e4156SSadaf Ebrahimi case AArch64_LDAXRB:
1207*9a0e4156SSadaf Ebrahimi case AArch64_LDAXRH:
1208*9a0e4156SSadaf Ebrahimi case AArch64_LDXRW:
1209*9a0e4156SSadaf Ebrahimi case AArch64_LDXRB:
1210*9a0e4156SSadaf Ebrahimi case AArch64_LDXRH:
1211*9a0e4156SSadaf Ebrahimi case AArch64_STLRW:
1212*9a0e4156SSadaf Ebrahimi case AArch64_STLRB:
1213*9a0e4156SSadaf Ebrahimi case AArch64_STLRH:
1214*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1215*9a0e4156SSadaf Ebrahimi break;
1216*9a0e4156SSadaf Ebrahimi case AArch64_STLXRX:
1217*9a0e4156SSadaf Ebrahimi case AArch64_STXRX:
1218*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1219*9a0e4156SSadaf Ebrahimi // FALLTHROUGH
1220*9a0e4156SSadaf Ebrahimi case AArch64_LDARX:
1221*9a0e4156SSadaf Ebrahimi case AArch64_LDAXRX:
1222*9a0e4156SSadaf Ebrahimi case AArch64_LDXRX:
1223*9a0e4156SSadaf Ebrahimi case AArch64_STLRX:
1224*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1225*9a0e4156SSadaf Ebrahimi break;
1226*9a0e4156SSadaf Ebrahimi case AArch64_STLXPW:
1227*9a0e4156SSadaf Ebrahimi case AArch64_STXPW:
1228*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1229*9a0e4156SSadaf Ebrahimi // FALLTHROUGH
1230*9a0e4156SSadaf Ebrahimi case AArch64_LDAXPW:
1231*9a0e4156SSadaf Ebrahimi case AArch64_LDXPW:
1232*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1233*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1234*9a0e4156SSadaf Ebrahimi break;
1235*9a0e4156SSadaf Ebrahimi case AArch64_STLXPX:
1236*9a0e4156SSadaf Ebrahimi case AArch64_STXPX:
1237*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1238*9a0e4156SSadaf Ebrahimi // FALLTHROUGH
1239*9a0e4156SSadaf Ebrahimi case AArch64_LDAXPX:
1240*9a0e4156SSadaf Ebrahimi case AArch64_LDXPX:
1241*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1242*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1243*9a0e4156SSadaf Ebrahimi break;
1244*9a0e4156SSadaf Ebrahimi }
1245*9a0e4156SSadaf Ebrahimi
1246*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1247*9a0e4156SSadaf Ebrahimi
1248*9a0e4156SSadaf Ebrahimi // You shouldn't load to the same register twice in an instruction...
1249*9a0e4156SSadaf Ebrahimi if ((Opcode == AArch64_LDAXPW || Opcode == AArch64_LDXPW ||
1250*9a0e4156SSadaf Ebrahimi Opcode == AArch64_LDAXPX || Opcode == AArch64_LDXPX) &&
1251*9a0e4156SSadaf Ebrahimi Rt == Rt2)
1252*9a0e4156SSadaf Ebrahimi return SoftFail;
1253*9a0e4156SSadaf Ebrahimi
1254*9a0e4156SSadaf Ebrahimi return Success;
1255*9a0e4156SSadaf Ebrahimi }
1256*9a0e4156SSadaf Ebrahimi
DecodePairLdStInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1257*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodePairLdStInstruction(MCInst *Inst, uint32_t insn,
1258*9a0e4156SSadaf Ebrahimi uint64_t Addr,
1259*9a0e4156SSadaf Ebrahimi const void *Decoder)
1260*9a0e4156SSadaf Ebrahimi {
1261*9a0e4156SSadaf Ebrahimi unsigned Rt = fieldFromInstruction(insn, 0, 5);
1262*9a0e4156SSadaf Ebrahimi unsigned Rn = fieldFromInstruction(insn, 5, 5);
1263*9a0e4156SSadaf Ebrahimi unsigned Rt2 = fieldFromInstruction(insn, 10, 5);
1264*9a0e4156SSadaf Ebrahimi int32_t offset = fieldFromInstruction(insn, 15, 7);
1265*9a0e4156SSadaf Ebrahimi bool IsLoad = fieldFromInstruction(insn, 22, 1) != 0;
1266*9a0e4156SSadaf Ebrahimi unsigned Opcode = MCInst_getOpcode(Inst);
1267*9a0e4156SSadaf Ebrahimi bool NeedsDisjointWritebackTransfer = false;
1268*9a0e4156SSadaf Ebrahimi
1269*9a0e4156SSadaf Ebrahimi // offset is a 7-bit signed immediate, so sign extend it to
1270*9a0e4156SSadaf Ebrahimi // fill the unsigned.
1271*9a0e4156SSadaf Ebrahimi if (offset & (1 << (7 - 1)))
1272*9a0e4156SSadaf Ebrahimi offset |= ~((1LL << 7) - 1);
1273*9a0e4156SSadaf Ebrahimi
1274*9a0e4156SSadaf Ebrahimi // First operand is always writeback of base register.
1275*9a0e4156SSadaf Ebrahimi switch (Opcode) {
1276*9a0e4156SSadaf Ebrahimi default:
1277*9a0e4156SSadaf Ebrahimi break;
1278*9a0e4156SSadaf Ebrahimi case AArch64_LDPXpost:
1279*9a0e4156SSadaf Ebrahimi case AArch64_STPXpost:
1280*9a0e4156SSadaf Ebrahimi case AArch64_LDPSWpost:
1281*9a0e4156SSadaf Ebrahimi case AArch64_LDPXpre:
1282*9a0e4156SSadaf Ebrahimi case AArch64_STPXpre:
1283*9a0e4156SSadaf Ebrahimi case AArch64_LDPSWpre:
1284*9a0e4156SSadaf Ebrahimi case AArch64_LDPWpost:
1285*9a0e4156SSadaf Ebrahimi case AArch64_STPWpost:
1286*9a0e4156SSadaf Ebrahimi case AArch64_LDPWpre:
1287*9a0e4156SSadaf Ebrahimi case AArch64_STPWpre:
1288*9a0e4156SSadaf Ebrahimi case AArch64_LDPQpost:
1289*9a0e4156SSadaf Ebrahimi case AArch64_STPQpost:
1290*9a0e4156SSadaf Ebrahimi case AArch64_LDPQpre:
1291*9a0e4156SSadaf Ebrahimi case AArch64_STPQpre:
1292*9a0e4156SSadaf Ebrahimi case AArch64_LDPDpost:
1293*9a0e4156SSadaf Ebrahimi case AArch64_STPDpost:
1294*9a0e4156SSadaf Ebrahimi case AArch64_LDPDpre:
1295*9a0e4156SSadaf Ebrahimi case AArch64_STPDpre:
1296*9a0e4156SSadaf Ebrahimi case AArch64_LDPSpost:
1297*9a0e4156SSadaf Ebrahimi case AArch64_STPSpost:
1298*9a0e4156SSadaf Ebrahimi case AArch64_LDPSpre:
1299*9a0e4156SSadaf Ebrahimi case AArch64_STPSpre:
1300*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1301*9a0e4156SSadaf Ebrahimi break;
1302*9a0e4156SSadaf Ebrahimi }
1303*9a0e4156SSadaf Ebrahimi
1304*9a0e4156SSadaf Ebrahimi switch (Opcode) {
1305*9a0e4156SSadaf Ebrahimi default:
1306*9a0e4156SSadaf Ebrahimi return Fail;
1307*9a0e4156SSadaf Ebrahimi case AArch64_LDPXpost:
1308*9a0e4156SSadaf Ebrahimi case AArch64_STPXpost:
1309*9a0e4156SSadaf Ebrahimi case AArch64_LDPSWpost:
1310*9a0e4156SSadaf Ebrahimi case AArch64_LDPXpre:
1311*9a0e4156SSadaf Ebrahimi case AArch64_STPXpre:
1312*9a0e4156SSadaf Ebrahimi case AArch64_LDPSWpre:
1313*9a0e4156SSadaf Ebrahimi NeedsDisjointWritebackTransfer = true;
1314*9a0e4156SSadaf Ebrahimi // Fallthrough
1315*9a0e4156SSadaf Ebrahimi case AArch64_LDNPXi:
1316*9a0e4156SSadaf Ebrahimi case AArch64_STNPXi:
1317*9a0e4156SSadaf Ebrahimi case AArch64_LDPXi:
1318*9a0e4156SSadaf Ebrahimi case AArch64_STPXi:
1319*9a0e4156SSadaf Ebrahimi case AArch64_LDPSWi:
1320*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1321*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1322*9a0e4156SSadaf Ebrahimi break;
1323*9a0e4156SSadaf Ebrahimi case AArch64_LDPWpost:
1324*9a0e4156SSadaf Ebrahimi case AArch64_STPWpost:
1325*9a0e4156SSadaf Ebrahimi case AArch64_LDPWpre:
1326*9a0e4156SSadaf Ebrahimi case AArch64_STPWpre:
1327*9a0e4156SSadaf Ebrahimi NeedsDisjointWritebackTransfer = true;
1328*9a0e4156SSadaf Ebrahimi // Fallthrough
1329*9a0e4156SSadaf Ebrahimi case AArch64_LDNPWi:
1330*9a0e4156SSadaf Ebrahimi case AArch64_STNPWi:
1331*9a0e4156SSadaf Ebrahimi case AArch64_LDPWi:
1332*9a0e4156SSadaf Ebrahimi case AArch64_STPWi:
1333*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1334*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1335*9a0e4156SSadaf Ebrahimi break;
1336*9a0e4156SSadaf Ebrahimi case AArch64_LDNPQi:
1337*9a0e4156SSadaf Ebrahimi case AArch64_STNPQi:
1338*9a0e4156SSadaf Ebrahimi case AArch64_LDPQpost:
1339*9a0e4156SSadaf Ebrahimi case AArch64_STPQpost:
1340*9a0e4156SSadaf Ebrahimi case AArch64_LDPQi:
1341*9a0e4156SSadaf Ebrahimi case AArch64_STPQi:
1342*9a0e4156SSadaf Ebrahimi case AArch64_LDPQpre:
1343*9a0e4156SSadaf Ebrahimi case AArch64_STPQpre:
1344*9a0e4156SSadaf Ebrahimi DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1345*9a0e4156SSadaf Ebrahimi DecodeFPR128RegisterClass(Inst, Rt2, Addr, Decoder);
1346*9a0e4156SSadaf Ebrahimi break;
1347*9a0e4156SSadaf Ebrahimi case AArch64_LDNPDi:
1348*9a0e4156SSadaf Ebrahimi case AArch64_STNPDi:
1349*9a0e4156SSadaf Ebrahimi case AArch64_LDPDpost:
1350*9a0e4156SSadaf Ebrahimi case AArch64_STPDpost:
1351*9a0e4156SSadaf Ebrahimi case AArch64_LDPDi:
1352*9a0e4156SSadaf Ebrahimi case AArch64_STPDi:
1353*9a0e4156SSadaf Ebrahimi case AArch64_LDPDpre:
1354*9a0e4156SSadaf Ebrahimi case AArch64_STPDpre:
1355*9a0e4156SSadaf Ebrahimi DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1356*9a0e4156SSadaf Ebrahimi DecodeFPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1357*9a0e4156SSadaf Ebrahimi break;
1358*9a0e4156SSadaf Ebrahimi case AArch64_LDNPSi:
1359*9a0e4156SSadaf Ebrahimi case AArch64_STNPSi:
1360*9a0e4156SSadaf Ebrahimi case AArch64_LDPSpost:
1361*9a0e4156SSadaf Ebrahimi case AArch64_STPSpost:
1362*9a0e4156SSadaf Ebrahimi case AArch64_LDPSi:
1363*9a0e4156SSadaf Ebrahimi case AArch64_STPSi:
1364*9a0e4156SSadaf Ebrahimi case AArch64_LDPSpre:
1365*9a0e4156SSadaf Ebrahimi case AArch64_STPSpre:
1366*9a0e4156SSadaf Ebrahimi DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1367*9a0e4156SSadaf Ebrahimi DecodeFPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1368*9a0e4156SSadaf Ebrahimi break;
1369*9a0e4156SSadaf Ebrahimi }
1370*9a0e4156SSadaf Ebrahimi
1371*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1372*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, offset);
1373*9a0e4156SSadaf Ebrahimi
1374*9a0e4156SSadaf Ebrahimi // You shouldn't load to the same register twice in an instruction...
1375*9a0e4156SSadaf Ebrahimi if (IsLoad && Rt == Rt2)
1376*9a0e4156SSadaf Ebrahimi return SoftFail;
1377*9a0e4156SSadaf Ebrahimi
1378*9a0e4156SSadaf Ebrahimi // ... or do any operation that writes-back to a transfer register. But note
1379*9a0e4156SSadaf Ebrahimi // that "stp xzr, xzr, [sp], #4" is fine because xzr and sp are different.
1380*9a0e4156SSadaf Ebrahimi if (NeedsDisjointWritebackTransfer && Rn != 31 && (Rt == Rn || Rt2 == Rn))
1381*9a0e4156SSadaf Ebrahimi return SoftFail;
1382*9a0e4156SSadaf Ebrahimi
1383*9a0e4156SSadaf Ebrahimi return Success;
1384*9a0e4156SSadaf Ebrahimi }
1385*9a0e4156SSadaf Ebrahimi
DecodeAddSubERegInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1386*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeAddSubERegInstruction(MCInst *Inst,
1387*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Addr,
1388*9a0e4156SSadaf Ebrahimi const void *Decoder)
1389*9a0e4156SSadaf Ebrahimi {
1390*9a0e4156SSadaf Ebrahimi unsigned Rd, Rn, Rm;
1391*9a0e4156SSadaf Ebrahimi unsigned extend = fieldFromInstruction(insn, 10, 6);
1392*9a0e4156SSadaf Ebrahimi unsigned shift = extend & 0x7;
1393*9a0e4156SSadaf Ebrahimi
1394*9a0e4156SSadaf Ebrahimi if (shift > 4)
1395*9a0e4156SSadaf Ebrahimi return Fail;
1396*9a0e4156SSadaf Ebrahimi
1397*9a0e4156SSadaf Ebrahimi Rd = fieldFromInstruction(insn, 0, 5);
1398*9a0e4156SSadaf Ebrahimi Rn = fieldFromInstruction(insn, 5, 5);
1399*9a0e4156SSadaf Ebrahimi Rm = fieldFromInstruction(insn, 16, 5);
1400*9a0e4156SSadaf Ebrahimi
1401*9a0e4156SSadaf Ebrahimi switch (MCInst_getOpcode(Inst)) {
1402*9a0e4156SSadaf Ebrahimi default:
1403*9a0e4156SSadaf Ebrahimi return Fail;
1404*9a0e4156SSadaf Ebrahimi case AArch64_ADDWrx:
1405*9a0e4156SSadaf Ebrahimi case AArch64_SUBWrx:
1406*9a0e4156SSadaf Ebrahimi DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1407*9a0e4156SSadaf Ebrahimi DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1408*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1409*9a0e4156SSadaf Ebrahimi break;
1410*9a0e4156SSadaf Ebrahimi case AArch64_ADDSWrx:
1411*9a0e4156SSadaf Ebrahimi case AArch64_SUBSWrx:
1412*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1413*9a0e4156SSadaf Ebrahimi DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1414*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1415*9a0e4156SSadaf Ebrahimi break;
1416*9a0e4156SSadaf Ebrahimi case AArch64_ADDXrx:
1417*9a0e4156SSadaf Ebrahimi case AArch64_SUBXrx:
1418*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1419*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1420*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1421*9a0e4156SSadaf Ebrahimi break;
1422*9a0e4156SSadaf Ebrahimi case AArch64_ADDSXrx:
1423*9a0e4156SSadaf Ebrahimi case AArch64_SUBSXrx:
1424*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1425*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1426*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1427*9a0e4156SSadaf Ebrahimi break;
1428*9a0e4156SSadaf Ebrahimi case AArch64_ADDXrx64:
1429*9a0e4156SSadaf Ebrahimi case AArch64_SUBXrx64:
1430*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1431*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1432*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1433*9a0e4156SSadaf Ebrahimi break;
1434*9a0e4156SSadaf Ebrahimi case AArch64_SUBSXrx64:
1435*9a0e4156SSadaf Ebrahimi case AArch64_ADDSXrx64:
1436*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1437*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1438*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1439*9a0e4156SSadaf Ebrahimi break;
1440*9a0e4156SSadaf Ebrahimi }
1441*9a0e4156SSadaf Ebrahimi
1442*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, extend);
1443*9a0e4156SSadaf Ebrahimi return Success;
1444*9a0e4156SSadaf Ebrahimi }
1445*9a0e4156SSadaf Ebrahimi
DecodeLogicalImmInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1446*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeLogicalImmInstruction(MCInst *Inst,
1447*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Addr,
1448*9a0e4156SSadaf Ebrahimi const void *Decoder)
1449*9a0e4156SSadaf Ebrahimi {
1450*9a0e4156SSadaf Ebrahimi unsigned Rd = fieldFromInstruction(insn, 0, 5);
1451*9a0e4156SSadaf Ebrahimi unsigned Rn = fieldFromInstruction(insn, 5, 5);
1452*9a0e4156SSadaf Ebrahimi unsigned Datasize = fieldFromInstruction(insn, 31, 1);
1453*9a0e4156SSadaf Ebrahimi unsigned imm;
1454*9a0e4156SSadaf Ebrahimi
1455*9a0e4156SSadaf Ebrahimi if (Datasize) {
1456*9a0e4156SSadaf Ebrahimi if (MCInst_getOpcode(Inst) == AArch64_ANDSXri)
1457*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1458*9a0e4156SSadaf Ebrahimi else
1459*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1460*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
1461*9a0e4156SSadaf Ebrahimi imm = fieldFromInstruction(insn, 10, 13);
1462*9a0e4156SSadaf Ebrahimi if (!AArch64_AM_isValidDecodeLogicalImmediate(imm, 64))
1463*9a0e4156SSadaf Ebrahimi return Fail;
1464*9a0e4156SSadaf Ebrahimi } else {
1465*9a0e4156SSadaf Ebrahimi if (MCInst_getOpcode(Inst) == AArch64_ANDSWri)
1466*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1467*9a0e4156SSadaf Ebrahimi else
1468*9a0e4156SSadaf Ebrahimi DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1469*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
1470*9a0e4156SSadaf Ebrahimi imm = fieldFromInstruction(insn, 10, 12);
1471*9a0e4156SSadaf Ebrahimi if (!AArch64_AM_isValidDecodeLogicalImmediate(imm, 32))
1472*9a0e4156SSadaf Ebrahimi return Fail;
1473*9a0e4156SSadaf Ebrahimi }
1474*9a0e4156SSadaf Ebrahimi
1475*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, imm);
1476*9a0e4156SSadaf Ebrahimi return Success;
1477*9a0e4156SSadaf Ebrahimi }
1478*9a0e4156SSadaf Ebrahimi
DecodeModImmInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1479*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeModImmInstruction(MCInst *Inst, uint32_t insn,
1480*9a0e4156SSadaf Ebrahimi uint64_t Addr,
1481*9a0e4156SSadaf Ebrahimi const void *Decoder)
1482*9a0e4156SSadaf Ebrahimi {
1483*9a0e4156SSadaf Ebrahimi unsigned Rd = fieldFromInstruction(insn, 0, 5);
1484*9a0e4156SSadaf Ebrahimi unsigned cmode = fieldFromInstruction(insn, 12, 4);
1485*9a0e4156SSadaf Ebrahimi unsigned imm = fieldFromInstruction(insn, 16, 3) << 5;
1486*9a0e4156SSadaf Ebrahimi imm |= fieldFromInstruction(insn, 5, 5);
1487*9a0e4156SSadaf Ebrahimi
1488*9a0e4156SSadaf Ebrahimi if (MCInst_getOpcode(Inst) == AArch64_MOVID)
1489*9a0e4156SSadaf Ebrahimi DecodeFPR64RegisterClass(Inst, Rd, Addr, Decoder);
1490*9a0e4156SSadaf Ebrahimi else
1491*9a0e4156SSadaf Ebrahimi DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1492*9a0e4156SSadaf Ebrahimi
1493*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, imm);
1494*9a0e4156SSadaf Ebrahimi
1495*9a0e4156SSadaf Ebrahimi switch (MCInst_getOpcode(Inst)) {
1496*9a0e4156SSadaf Ebrahimi default:
1497*9a0e4156SSadaf Ebrahimi break;
1498*9a0e4156SSadaf Ebrahimi case AArch64_MOVIv4i16:
1499*9a0e4156SSadaf Ebrahimi case AArch64_MOVIv8i16:
1500*9a0e4156SSadaf Ebrahimi case AArch64_MVNIv4i16:
1501*9a0e4156SSadaf Ebrahimi case AArch64_MVNIv8i16:
1502*9a0e4156SSadaf Ebrahimi case AArch64_MOVIv2i32:
1503*9a0e4156SSadaf Ebrahimi case AArch64_MOVIv4i32:
1504*9a0e4156SSadaf Ebrahimi case AArch64_MVNIv2i32:
1505*9a0e4156SSadaf Ebrahimi case AArch64_MVNIv4i32:
1506*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, (cmode & 6) << 2);
1507*9a0e4156SSadaf Ebrahimi break;
1508*9a0e4156SSadaf Ebrahimi case AArch64_MOVIv2s_msl:
1509*9a0e4156SSadaf Ebrahimi case AArch64_MOVIv4s_msl:
1510*9a0e4156SSadaf Ebrahimi case AArch64_MVNIv2s_msl:
1511*9a0e4156SSadaf Ebrahimi case AArch64_MVNIv4s_msl:
1512*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, cmode & 1 ? 0x110 : 0x108);
1513*9a0e4156SSadaf Ebrahimi break;
1514*9a0e4156SSadaf Ebrahimi }
1515*9a0e4156SSadaf Ebrahimi
1516*9a0e4156SSadaf Ebrahimi return Success;
1517*9a0e4156SSadaf Ebrahimi }
1518*9a0e4156SSadaf Ebrahimi
DecodeModImmTiedInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1519*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeModImmTiedInstruction(MCInst *Inst,
1520*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Addr,
1521*9a0e4156SSadaf Ebrahimi const void *Decoder)
1522*9a0e4156SSadaf Ebrahimi {
1523*9a0e4156SSadaf Ebrahimi unsigned Rd = fieldFromInstruction(insn, 0, 5);
1524*9a0e4156SSadaf Ebrahimi unsigned cmode = fieldFromInstruction(insn, 12, 4);
1525*9a0e4156SSadaf Ebrahimi unsigned imm = fieldFromInstruction(insn, 16, 3) << 5;
1526*9a0e4156SSadaf Ebrahimi imm |= fieldFromInstruction(insn, 5, 5);
1527*9a0e4156SSadaf Ebrahimi
1528*9a0e4156SSadaf Ebrahimi // Tied operands added twice.
1529*9a0e4156SSadaf Ebrahimi DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1530*9a0e4156SSadaf Ebrahimi DecodeVectorRegisterClass(Inst, Rd, Addr, Decoder);
1531*9a0e4156SSadaf Ebrahimi
1532*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, imm);
1533*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, (cmode & 6) << 2);
1534*9a0e4156SSadaf Ebrahimi
1535*9a0e4156SSadaf Ebrahimi return Success;
1536*9a0e4156SSadaf Ebrahimi }
1537*9a0e4156SSadaf Ebrahimi
DecodeAdrInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1538*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeAdrInstruction(MCInst *Inst, uint32_t insn,
1539*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
1540*9a0e4156SSadaf Ebrahimi {
1541*9a0e4156SSadaf Ebrahimi unsigned Rd = fieldFromInstruction(insn, 0, 5);
1542*9a0e4156SSadaf Ebrahimi int64_t imm = fieldFromInstruction(insn, 5, 19) << 2;
1543*9a0e4156SSadaf Ebrahimi imm |= fieldFromInstruction(insn, 29, 2);
1544*9a0e4156SSadaf Ebrahimi
1545*9a0e4156SSadaf Ebrahimi // Sign-extend the 21-bit immediate.
1546*9a0e4156SSadaf Ebrahimi if (imm & (1 << (21 - 1)))
1547*9a0e4156SSadaf Ebrahimi imm |= ~((1LL << 21) - 1);
1548*9a0e4156SSadaf Ebrahimi
1549*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1550*9a0e4156SSadaf Ebrahimi //if (!Dis->tryAddingSymbolicOperand(Inst, imm, Addr, Fail, 0, 4))
1551*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, imm);
1552*9a0e4156SSadaf Ebrahimi
1553*9a0e4156SSadaf Ebrahimi return Success;
1554*9a0e4156SSadaf Ebrahimi }
1555*9a0e4156SSadaf Ebrahimi
DecodeBaseAddSubImm(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1556*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeBaseAddSubImm(MCInst *Inst, uint32_t insn,
1557*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
1558*9a0e4156SSadaf Ebrahimi {
1559*9a0e4156SSadaf Ebrahimi unsigned Rd = fieldFromInstruction(insn, 0, 5);
1560*9a0e4156SSadaf Ebrahimi unsigned Rn = fieldFromInstruction(insn, 5, 5);
1561*9a0e4156SSadaf Ebrahimi unsigned Imm = fieldFromInstruction(insn, 10, 14);
1562*9a0e4156SSadaf Ebrahimi unsigned S = fieldFromInstruction(insn, 29, 1);
1563*9a0e4156SSadaf Ebrahimi unsigned Datasize = fieldFromInstruction(insn, 31, 1);
1564*9a0e4156SSadaf Ebrahimi
1565*9a0e4156SSadaf Ebrahimi unsigned ShifterVal = (Imm >> 12) & 3;
1566*9a0e4156SSadaf Ebrahimi unsigned ImmVal = Imm & 0xFFF;
1567*9a0e4156SSadaf Ebrahimi
1568*9a0e4156SSadaf Ebrahimi if (ShifterVal != 0 && ShifterVal != 1)
1569*9a0e4156SSadaf Ebrahimi return Fail;
1570*9a0e4156SSadaf Ebrahimi
1571*9a0e4156SSadaf Ebrahimi if (Datasize) {
1572*9a0e4156SSadaf Ebrahimi if (Rd == 31 && !S)
1573*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1574*9a0e4156SSadaf Ebrahimi else
1575*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1576*9a0e4156SSadaf Ebrahimi DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1577*9a0e4156SSadaf Ebrahimi } else {
1578*9a0e4156SSadaf Ebrahimi if (Rd == 31 && !S)
1579*9a0e4156SSadaf Ebrahimi DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1580*9a0e4156SSadaf Ebrahimi else
1581*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1582*9a0e4156SSadaf Ebrahimi DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1583*9a0e4156SSadaf Ebrahimi }
1584*9a0e4156SSadaf Ebrahimi
1585*9a0e4156SSadaf Ebrahimi //if (!Dis->tryAddingSymbolicOperand(Inst, Imm, Addr, Fail, 0, 4))
1586*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, ImmVal);
1587*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, 12 * ShifterVal);
1588*9a0e4156SSadaf Ebrahimi return Success;
1589*9a0e4156SSadaf Ebrahimi }
1590*9a0e4156SSadaf Ebrahimi
DecodeUnconditionalBranch(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1591*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeUnconditionalBranch(MCInst *Inst, uint32_t insn,
1592*9a0e4156SSadaf Ebrahimi uint64_t Addr,
1593*9a0e4156SSadaf Ebrahimi const void *Decoder)
1594*9a0e4156SSadaf Ebrahimi {
1595*9a0e4156SSadaf Ebrahimi int64_t imm = fieldFromInstruction(insn, 0, 26);
1596*9a0e4156SSadaf Ebrahimi
1597*9a0e4156SSadaf Ebrahimi // Sign-extend the 26-bit immediate.
1598*9a0e4156SSadaf Ebrahimi if (imm & (1 << (26 - 1)))
1599*9a0e4156SSadaf Ebrahimi imm |= ~((1LL << 26) - 1);
1600*9a0e4156SSadaf Ebrahimi
1601*9a0e4156SSadaf Ebrahimi // if (!Dis->tryAddingSymbolicOperand(Inst, imm << 2, Addr, true, 0, 4))
1602*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, imm);
1603*9a0e4156SSadaf Ebrahimi
1604*9a0e4156SSadaf Ebrahimi return Success;
1605*9a0e4156SSadaf Ebrahimi }
1606*9a0e4156SSadaf Ebrahimi
DecodeSystemPStateInstruction(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1607*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeSystemPStateInstruction(MCInst *Inst,
1608*9a0e4156SSadaf Ebrahimi uint32_t insn, uint64_t Addr,
1609*9a0e4156SSadaf Ebrahimi const void *Decoder)
1610*9a0e4156SSadaf Ebrahimi {
1611*9a0e4156SSadaf Ebrahimi uint32_t op1 = fieldFromInstruction(insn, 16, 3);
1612*9a0e4156SSadaf Ebrahimi uint32_t op2 = fieldFromInstruction(insn, 5, 3);
1613*9a0e4156SSadaf Ebrahimi uint32_t crm = fieldFromInstruction(insn, 8, 4);
1614*9a0e4156SSadaf Ebrahimi bool ValidNamed;
1615*9a0e4156SSadaf Ebrahimi uint32_t pstate_field = (op1 << 3) | op2;
1616*9a0e4156SSadaf Ebrahimi
1617*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, pstate_field);
1618*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, crm);
1619*9a0e4156SSadaf Ebrahimi
1620*9a0e4156SSadaf Ebrahimi A64NamedImmMapper_toString(&A64PState_PStateMapper, pstate_field, &ValidNamed);
1621*9a0e4156SSadaf Ebrahimi
1622*9a0e4156SSadaf Ebrahimi return ValidNamed ? Success : Fail;
1623*9a0e4156SSadaf Ebrahimi }
1624*9a0e4156SSadaf Ebrahimi
DecodeTestAndBranch(MCInst * Inst,uint32_t insn,uint64_t Addr,const void * Decoder)1625*9a0e4156SSadaf Ebrahimi static DecodeStatus DecodeTestAndBranch(MCInst *Inst, uint32_t insn,
1626*9a0e4156SSadaf Ebrahimi uint64_t Addr, const void *Decoder)
1627*9a0e4156SSadaf Ebrahimi {
1628*9a0e4156SSadaf Ebrahimi uint32_t Rt = fieldFromInstruction(insn, 0, 5);
1629*9a0e4156SSadaf Ebrahimi uint32_t bit = fieldFromInstruction(insn, 31, 1) << 5;
1630*9a0e4156SSadaf Ebrahimi uint64_t dst = fieldFromInstruction(insn, 5, 14);
1631*9a0e4156SSadaf Ebrahimi
1632*9a0e4156SSadaf Ebrahimi bit |= fieldFromInstruction(insn, 19, 5);
1633*9a0e4156SSadaf Ebrahimi
1634*9a0e4156SSadaf Ebrahimi // Sign-extend 14-bit immediate.
1635*9a0e4156SSadaf Ebrahimi if (dst & (1 << (14 - 1)))
1636*9a0e4156SSadaf Ebrahimi dst |= ~((1LL << 14) - 1);
1637*9a0e4156SSadaf Ebrahimi
1638*9a0e4156SSadaf Ebrahimi if (fieldFromInstruction(insn, 31, 1) == 0)
1639*9a0e4156SSadaf Ebrahimi DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1640*9a0e4156SSadaf Ebrahimi else
1641*9a0e4156SSadaf Ebrahimi DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1642*9a0e4156SSadaf Ebrahimi
1643*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, bit);
1644*9a0e4156SSadaf Ebrahimi //if (!Dis->tryAddingSymbolicOperand(Inst, dst << 2, Addr, true, 0, 4))
1645*9a0e4156SSadaf Ebrahimi MCOperand_CreateImm0(Inst, dst);
1646*9a0e4156SSadaf Ebrahimi
1647*9a0e4156SSadaf Ebrahimi return Success;
1648*9a0e4156SSadaf Ebrahimi }
1649*9a0e4156SSadaf Ebrahimi
AArch64_init(MCRegisterInfo * MRI)1650*9a0e4156SSadaf Ebrahimi void AArch64_init(MCRegisterInfo *MRI)
1651*9a0e4156SSadaf Ebrahimi {
1652*9a0e4156SSadaf Ebrahimi /*
1653*9a0e4156SSadaf Ebrahimi InitMCRegisterInfo(AArch64RegDesc, 420,
1654*9a0e4156SSadaf Ebrahimi RA, PC,
1655*9a0e4156SSadaf Ebrahimi AArch64MCRegisterClasses, 43,
1656*9a0e4156SSadaf Ebrahimi AArch64RegUnitRoots, 66, AArch64RegDiffLists,
1657*9a0e4156SSadaf Ebrahimi AArch64RegStrings,
1658*9a0e4156SSadaf Ebrahimi AArch64SubRegIdxLists, 53,
1659*9a0e4156SSadaf Ebrahimi AArch64SubRegIdxRanges,
1660*9a0e4156SSadaf Ebrahimi AArch64RegEncodingTable);
1661*9a0e4156SSadaf Ebrahimi */
1662*9a0e4156SSadaf Ebrahimi
1663*9a0e4156SSadaf Ebrahimi MCRegisterInfo_InitMCRegisterInfo(MRI, AArch64RegDesc, 420,
1664*9a0e4156SSadaf Ebrahimi 0, 0,
1665*9a0e4156SSadaf Ebrahimi AArch64MCRegisterClasses, 43,
1666*9a0e4156SSadaf Ebrahimi 0, 0, AArch64RegDiffLists,
1667*9a0e4156SSadaf Ebrahimi 0,
1668*9a0e4156SSadaf Ebrahimi AArch64SubRegIdxLists, 53,
1669*9a0e4156SSadaf Ebrahimi 0);
1670*9a0e4156SSadaf Ebrahimi }
1671*9a0e4156SSadaf Ebrahimi
1672*9a0e4156SSadaf Ebrahimi #endif
1673