1*9a0e4156SSadaf Ebrahimi //==-- AArch64InstPrinter.cpp - Convert AArch64 MCInst to assembly syntax --==//
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 class prints an AArch64 MCInst to a .s file.
11*9a0e4156SSadaf Ebrahimi //
12*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
13*9a0e4156SSadaf Ebrahimi
14*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
15*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2016 */
16*9a0e4156SSadaf Ebrahimi
17*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_HAS_ARM64
18*9a0e4156SSadaf Ebrahimi
19*9a0e4156SSadaf Ebrahimi #include <capstone/platform.h>
20*9a0e4156SSadaf Ebrahimi #include <stdio.h>
21*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
22*9a0e4156SSadaf Ebrahimi
23*9a0e4156SSadaf Ebrahimi #include "AArch64InstPrinter.h"
24*9a0e4156SSadaf Ebrahimi #include "AArch64BaseInfo.h"
25*9a0e4156SSadaf Ebrahimi #include "../../utils.h"
26*9a0e4156SSadaf Ebrahimi #include "../../MCInst.h"
27*9a0e4156SSadaf Ebrahimi #include "../../SStream.h"
28*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h"
29*9a0e4156SSadaf Ebrahimi #include "../../MathExtras.h"
30*9a0e4156SSadaf Ebrahimi
31*9a0e4156SSadaf Ebrahimi #include "AArch64Mapping.h"
32*9a0e4156SSadaf Ebrahimi #include "AArch64AddressingModes.h"
33*9a0e4156SSadaf Ebrahimi
34*9a0e4156SSadaf Ebrahimi #define GET_REGINFO_ENUM
35*9a0e4156SSadaf Ebrahimi #include "AArch64GenRegisterInfo.inc"
36*9a0e4156SSadaf Ebrahimi
37*9a0e4156SSadaf Ebrahimi #define GET_INSTRINFO_ENUM
38*9a0e4156SSadaf Ebrahimi #include "AArch64GenInstrInfo.inc"
39*9a0e4156SSadaf Ebrahimi
40*9a0e4156SSadaf Ebrahimi
41*9a0e4156SSadaf Ebrahimi static const char *getRegisterName(unsigned RegNo, int AltIdx);
42*9a0e4156SSadaf Ebrahimi static void printOperand(MCInst *MI, unsigned OpNo, SStream *O);
43*9a0e4156SSadaf Ebrahimi static bool printSysAlias(MCInst *MI, SStream *O);
44*9a0e4156SSadaf Ebrahimi static char *printAliasInstr(MCInst *MI, SStream *OS, void *info);
45*9a0e4156SSadaf Ebrahimi static void printInstruction(MCInst *MI, SStream *O, MCRegisterInfo *MRI);
46*9a0e4156SSadaf Ebrahimi static void printShifter(MCInst *MI, unsigned OpNum, SStream *O);
47*9a0e4156SSadaf Ebrahimi
get_op_access(cs_struct * h,unsigned int id,unsigned int index)48*9a0e4156SSadaf Ebrahimi static cs_ac_type get_op_access(cs_struct *h, unsigned int id, unsigned int index)
49*9a0e4156SSadaf Ebrahimi {
50*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
51*9a0e4156SSadaf Ebrahimi uint8_t *arr = AArch64_get_op_access(h, id);
52*9a0e4156SSadaf Ebrahimi
53*9a0e4156SSadaf Ebrahimi if (arr[index] == CS_AC_IGNORE)
54*9a0e4156SSadaf Ebrahimi return 0;
55*9a0e4156SSadaf Ebrahimi
56*9a0e4156SSadaf Ebrahimi return arr[index];
57*9a0e4156SSadaf Ebrahimi #else
58*9a0e4156SSadaf Ebrahimi return 0;
59*9a0e4156SSadaf Ebrahimi #endif
60*9a0e4156SSadaf Ebrahimi }
61*9a0e4156SSadaf Ebrahimi
set_mem_access(MCInst * MI,bool status)62*9a0e4156SSadaf Ebrahimi static void set_mem_access(MCInst *MI, bool status)
63*9a0e4156SSadaf Ebrahimi {
64*9a0e4156SSadaf Ebrahimi MI->csh->doing_mem = status;
65*9a0e4156SSadaf Ebrahimi
66*9a0e4156SSadaf Ebrahimi if (MI->csh->detail != CS_OPT_ON)
67*9a0e4156SSadaf Ebrahimi return;
68*9a0e4156SSadaf Ebrahimi
69*9a0e4156SSadaf Ebrahimi if (status) {
70*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
71*9a0e4156SSadaf Ebrahimi uint8_t access;
72*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
73*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
74*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
75*9a0e4156SSadaf Ebrahimi #endif
76*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_MEM;
77*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.base = ARM64_REG_INVALID;
78*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.index = ARM64_REG_INVALID;
79*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.disp = 0;
80*9a0e4156SSadaf Ebrahimi } else {
81*9a0e4156SSadaf Ebrahimi // done, create the next operand slot
82*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
83*9a0e4156SSadaf Ebrahimi }
84*9a0e4156SSadaf Ebrahimi }
85*9a0e4156SSadaf Ebrahimi
AArch64_printInst(MCInst * MI,SStream * O,void * Info)86*9a0e4156SSadaf Ebrahimi void AArch64_printInst(MCInst *MI, SStream *O, void *Info)
87*9a0e4156SSadaf Ebrahimi {
88*9a0e4156SSadaf Ebrahimi // Check for special encodings and print the canonical alias instead.
89*9a0e4156SSadaf Ebrahimi unsigned Opcode = MCInst_getOpcode(MI);
90*9a0e4156SSadaf Ebrahimi int LSB;
91*9a0e4156SSadaf Ebrahimi int Width;
92*9a0e4156SSadaf Ebrahimi char *mnem;
93*9a0e4156SSadaf Ebrahimi
94*9a0e4156SSadaf Ebrahimi if (Opcode == AArch64_SYSxt && printSysAlias(MI, O))
95*9a0e4156SSadaf Ebrahimi return;
96*9a0e4156SSadaf Ebrahimi
97*9a0e4156SSadaf Ebrahimi // SBFM/UBFM should print to a nicer aliased form if possible.
98*9a0e4156SSadaf Ebrahimi if (Opcode == AArch64_SBFMXri || Opcode == AArch64_SBFMWri ||
99*9a0e4156SSadaf Ebrahimi Opcode == AArch64_UBFMXri || Opcode == AArch64_UBFMWri) {
100*9a0e4156SSadaf Ebrahimi MCOperand *Op0 = MCInst_getOperand(MI, 0);
101*9a0e4156SSadaf Ebrahimi MCOperand *Op1 = MCInst_getOperand(MI, 1);
102*9a0e4156SSadaf Ebrahimi MCOperand *Op2 = MCInst_getOperand(MI, 2);
103*9a0e4156SSadaf Ebrahimi MCOperand *Op3 = MCInst_getOperand(MI, 3);
104*9a0e4156SSadaf Ebrahimi
105*9a0e4156SSadaf Ebrahimi bool IsSigned = (Opcode == AArch64_SBFMXri || Opcode == AArch64_SBFMWri);
106*9a0e4156SSadaf Ebrahimi bool Is64Bit = (Opcode == AArch64_SBFMXri || Opcode == AArch64_UBFMXri);
107*9a0e4156SSadaf Ebrahimi
108*9a0e4156SSadaf Ebrahimi if (MCOperand_isImm(Op2) && MCOperand_getImm(Op2) == 0 && MCOperand_isImm(Op3)) {
109*9a0e4156SSadaf Ebrahimi const char *AsmMnemonic = NULL;
110*9a0e4156SSadaf Ebrahimi
111*9a0e4156SSadaf Ebrahimi switch (MCOperand_getImm(Op3)) {
112*9a0e4156SSadaf Ebrahimi default:
113*9a0e4156SSadaf Ebrahimi break;
114*9a0e4156SSadaf Ebrahimi case 7:
115*9a0e4156SSadaf Ebrahimi if (IsSigned)
116*9a0e4156SSadaf Ebrahimi AsmMnemonic = "sxtb";
117*9a0e4156SSadaf Ebrahimi else if (!Is64Bit)
118*9a0e4156SSadaf Ebrahimi AsmMnemonic = "uxtb";
119*9a0e4156SSadaf Ebrahimi break;
120*9a0e4156SSadaf Ebrahimi case 15:
121*9a0e4156SSadaf Ebrahimi if (IsSigned)
122*9a0e4156SSadaf Ebrahimi AsmMnemonic = "sxth";
123*9a0e4156SSadaf Ebrahimi else if (!Is64Bit)
124*9a0e4156SSadaf Ebrahimi AsmMnemonic = "uxth";
125*9a0e4156SSadaf Ebrahimi break;
126*9a0e4156SSadaf Ebrahimi case 31:
127*9a0e4156SSadaf Ebrahimi // *xtw is only valid for signed 64-bit operations.
128*9a0e4156SSadaf Ebrahimi if (Is64Bit && IsSigned)
129*9a0e4156SSadaf Ebrahimi AsmMnemonic = "sxtw";
130*9a0e4156SSadaf Ebrahimi break;
131*9a0e4156SSadaf Ebrahimi }
132*9a0e4156SSadaf Ebrahimi
133*9a0e4156SSadaf Ebrahimi if (AsmMnemonic) {
134*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%s\t%s, %s", AsmMnemonic,
135*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
136*9a0e4156SSadaf Ebrahimi getRegisterName(getWRegFromXReg(MCOperand_getReg(Op1)), AArch64_NoRegAltName));
137*9a0e4156SSadaf Ebrahimi
138*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
139*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
140*9a0e4156SSadaf Ebrahimi uint8_t access;
141*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
142*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
143*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
144*9a0e4156SSadaf Ebrahimi #endif
145*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
146*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
147*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
148*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
149*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
150*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
151*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
152*9a0e4156SSadaf Ebrahimi #endif
153*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
154*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = getWRegFromXReg(MCOperand_getReg(Op1));
155*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
156*9a0e4156SSadaf Ebrahimi }
157*9a0e4156SSadaf Ebrahimi
158*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, AArch64_map_insn(AsmMnemonic));
159*9a0e4156SSadaf Ebrahimi
160*9a0e4156SSadaf Ebrahimi return;
161*9a0e4156SSadaf Ebrahimi }
162*9a0e4156SSadaf Ebrahimi }
163*9a0e4156SSadaf Ebrahimi
164*9a0e4156SSadaf Ebrahimi // All immediate shifts are aliases, implemented using the Bitfield
165*9a0e4156SSadaf Ebrahimi // instruction. In all cases the immediate shift amount shift must be in
166*9a0e4156SSadaf Ebrahimi // the range 0 to (reg.size -1).
167*9a0e4156SSadaf Ebrahimi if (MCOperand_isImm(Op2) && MCOperand_isImm(Op3)) {
168*9a0e4156SSadaf Ebrahimi const char *AsmMnemonic = NULL;
169*9a0e4156SSadaf Ebrahimi int shift = 0;
170*9a0e4156SSadaf Ebrahimi int immr = (int)MCOperand_getImm(Op2);
171*9a0e4156SSadaf Ebrahimi int imms = (int)MCOperand_getImm(Op3);
172*9a0e4156SSadaf Ebrahimi
173*9a0e4156SSadaf Ebrahimi if (Opcode == AArch64_UBFMWri && imms != 0x1F && ((imms + 1) == immr)) {
174*9a0e4156SSadaf Ebrahimi AsmMnemonic = "lsl";
175*9a0e4156SSadaf Ebrahimi shift = 31 - imms;
176*9a0e4156SSadaf Ebrahimi } else if (Opcode == AArch64_UBFMXri && imms != 0x3f &&
177*9a0e4156SSadaf Ebrahimi ((imms + 1 == immr))) {
178*9a0e4156SSadaf Ebrahimi AsmMnemonic = "lsl";
179*9a0e4156SSadaf Ebrahimi shift = 63 - imms;
180*9a0e4156SSadaf Ebrahimi } else if (Opcode == AArch64_UBFMWri && imms == 0x1f) {
181*9a0e4156SSadaf Ebrahimi AsmMnemonic = "lsr";
182*9a0e4156SSadaf Ebrahimi shift = immr;
183*9a0e4156SSadaf Ebrahimi } else if (Opcode == AArch64_UBFMXri && imms == 0x3f) {
184*9a0e4156SSadaf Ebrahimi AsmMnemonic = "lsr";
185*9a0e4156SSadaf Ebrahimi shift = immr;
186*9a0e4156SSadaf Ebrahimi } else if (Opcode == AArch64_SBFMWri && imms == 0x1f) {
187*9a0e4156SSadaf Ebrahimi AsmMnemonic = "asr";
188*9a0e4156SSadaf Ebrahimi shift = immr;
189*9a0e4156SSadaf Ebrahimi } else if (Opcode == AArch64_SBFMXri && imms == 0x3f) {
190*9a0e4156SSadaf Ebrahimi AsmMnemonic = "asr";
191*9a0e4156SSadaf Ebrahimi shift = immr;
192*9a0e4156SSadaf Ebrahimi }
193*9a0e4156SSadaf Ebrahimi
194*9a0e4156SSadaf Ebrahimi if (AsmMnemonic) {
195*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%s\t%s, %s, ", AsmMnemonic,
196*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
197*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op1), AArch64_NoRegAltName));
198*9a0e4156SSadaf Ebrahimi
199*9a0e4156SSadaf Ebrahimi printInt32Bang(O, shift);
200*9a0e4156SSadaf Ebrahimi
201*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, AArch64_map_insn(AsmMnemonic));
202*9a0e4156SSadaf Ebrahimi
203*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
204*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
205*9a0e4156SSadaf Ebrahimi uint8_t access;
206*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
207*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
208*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
209*9a0e4156SSadaf Ebrahimi #endif
210*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
211*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
212*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
213*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
214*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
215*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
216*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
217*9a0e4156SSadaf Ebrahimi #endif
218*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
219*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op1);
220*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
221*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
222*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
223*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
224*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
225*9a0e4156SSadaf Ebrahimi #endif
226*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
227*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = shift;
228*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
229*9a0e4156SSadaf Ebrahimi }
230*9a0e4156SSadaf Ebrahimi
231*9a0e4156SSadaf Ebrahimi return;
232*9a0e4156SSadaf Ebrahimi }
233*9a0e4156SSadaf Ebrahimi }
234*9a0e4156SSadaf Ebrahimi
235*9a0e4156SSadaf Ebrahimi // SBFIZ/UBFIZ aliases
236*9a0e4156SSadaf Ebrahimi if (MCOperand_getImm(Op2) > MCOperand_getImm(Op3)) {
237*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%s\t%s, %s, ", (IsSigned ? "sbfiz" : "ubfiz"),
238*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
239*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op1), AArch64_NoRegAltName));
240*9a0e4156SSadaf Ebrahimi printInt32Bang(O, (int)((Is64Bit ? 64 : 32) - MCOperand_getImm(Op2)));
241*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
242*9a0e4156SSadaf Ebrahimi printInt32Bang(O, (int)MCOperand_getImm(Op3) + 1);
243*9a0e4156SSadaf Ebrahimi
244*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, AArch64_map_insn(IsSigned ? "sbfiz" : "ubfiz"));
245*9a0e4156SSadaf Ebrahimi
246*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
247*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
248*9a0e4156SSadaf Ebrahimi uint8_t access;
249*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
250*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
251*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
252*9a0e4156SSadaf Ebrahimi #endif
253*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
254*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
255*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
256*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
257*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
258*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
259*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
260*9a0e4156SSadaf Ebrahimi #endif
261*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
262*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op1);
263*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
264*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
265*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
266*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
267*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
268*9a0e4156SSadaf Ebrahimi #endif
269*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
270*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (Is64Bit ? 64 : 32) - (int)MCOperand_getImm(Op2);
271*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
272*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
273*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
274*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
275*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
276*9a0e4156SSadaf Ebrahimi #endif
277*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
278*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op3) + 1;
279*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
280*9a0e4156SSadaf Ebrahimi }
281*9a0e4156SSadaf Ebrahimi
282*9a0e4156SSadaf Ebrahimi return;
283*9a0e4156SSadaf Ebrahimi }
284*9a0e4156SSadaf Ebrahimi
285*9a0e4156SSadaf Ebrahimi // Otherwise SBFX/UBFX is the preferred form
286*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%s\t%s, %s, ", (IsSigned ? "sbfx" : "ubfx"),
287*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
288*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op1), AArch64_NoRegAltName));
289*9a0e4156SSadaf Ebrahimi printInt32Bang(O, (int)MCOperand_getImm(Op2));
290*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
291*9a0e4156SSadaf Ebrahimi printInt32Bang(O, (int)MCOperand_getImm(Op3) - (int)MCOperand_getImm(Op2) + 1);
292*9a0e4156SSadaf Ebrahimi
293*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, AArch64_map_insn(IsSigned ? "sbfx" : "ubfx"));
294*9a0e4156SSadaf Ebrahimi
295*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
296*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
297*9a0e4156SSadaf Ebrahimi uint8_t access;
298*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
299*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
300*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
301*9a0e4156SSadaf Ebrahimi #endif
302*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
303*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
304*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
305*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
306*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
307*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
308*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
309*9a0e4156SSadaf Ebrahimi #endif
310*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
311*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op1);
312*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
313*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
314*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
315*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
316*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
317*9a0e4156SSadaf Ebrahimi #endif
318*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
319*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op2);
320*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
321*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
322*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
323*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
324*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
325*9a0e4156SSadaf Ebrahimi #endif
326*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
327*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op3) - MCOperand_getImm(Op2) + 1;
328*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
329*9a0e4156SSadaf Ebrahimi }
330*9a0e4156SSadaf Ebrahimi
331*9a0e4156SSadaf Ebrahimi return;
332*9a0e4156SSadaf Ebrahimi }
333*9a0e4156SSadaf Ebrahimi
334*9a0e4156SSadaf Ebrahimi if (Opcode == AArch64_BFMXri || Opcode == AArch64_BFMWri) {
335*9a0e4156SSadaf Ebrahimi MCOperand *Op0 = MCInst_getOperand(MI, 0); // Op1 == Op0
336*9a0e4156SSadaf Ebrahimi MCOperand *Op2 = MCInst_getOperand(MI, 2);
337*9a0e4156SSadaf Ebrahimi int ImmR = (int)MCOperand_getImm(MCInst_getOperand(MI, 3));
338*9a0e4156SSadaf Ebrahimi int ImmS = (int)MCOperand_getImm(MCInst_getOperand(MI, 4));
339*9a0e4156SSadaf Ebrahimi
340*9a0e4156SSadaf Ebrahimi // BFI alias
341*9a0e4156SSadaf Ebrahimi if (ImmS < ImmR) {
342*9a0e4156SSadaf Ebrahimi int BitWidth = Opcode == AArch64_BFMXri ? 64 : 32;
343*9a0e4156SSadaf Ebrahimi LSB = (BitWidth - ImmR) % BitWidth;
344*9a0e4156SSadaf Ebrahimi Width = ImmS + 1;
345*9a0e4156SSadaf Ebrahimi
346*9a0e4156SSadaf Ebrahimi SStream_concat(O, "bfi\t%s, %s, ",
347*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
348*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op2), AArch64_NoRegAltName));
349*9a0e4156SSadaf Ebrahimi printInt32Bang(O, LSB);
350*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
351*9a0e4156SSadaf Ebrahimi printInt32Bang(O, Width);
352*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, AArch64_map_insn("bfi"));
353*9a0e4156SSadaf Ebrahimi
354*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
355*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
356*9a0e4156SSadaf Ebrahimi uint8_t access;
357*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
358*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
359*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
360*9a0e4156SSadaf Ebrahimi #endif
361*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
362*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
363*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
364*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
365*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
366*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
367*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
368*9a0e4156SSadaf Ebrahimi #endif
369*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
370*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op2);
371*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
372*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
373*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
374*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
375*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
376*9a0e4156SSadaf Ebrahimi #endif
377*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
378*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = LSB;
379*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
380*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
381*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
382*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
383*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
384*9a0e4156SSadaf Ebrahimi #endif
385*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
386*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Width;
387*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
388*9a0e4156SSadaf Ebrahimi }
389*9a0e4156SSadaf Ebrahimi
390*9a0e4156SSadaf Ebrahimi return;
391*9a0e4156SSadaf Ebrahimi }
392*9a0e4156SSadaf Ebrahimi
393*9a0e4156SSadaf Ebrahimi LSB = ImmR;
394*9a0e4156SSadaf Ebrahimi Width = ImmS - ImmR + 1;
395*9a0e4156SSadaf Ebrahimi // Otherwise BFXIL the preferred form
396*9a0e4156SSadaf Ebrahimi SStream_concat(O, "bfxil\t%s, %s, ",
397*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op0), AArch64_NoRegAltName),
398*9a0e4156SSadaf Ebrahimi getRegisterName(MCOperand_getReg(Op2), AArch64_NoRegAltName));
399*9a0e4156SSadaf Ebrahimi printInt32Bang(O, LSB);
400*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
401*9a0e4156SSadaf Ebrahimi printInt32Bang(O, Width);
402*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, AArch64_map_insn("bfxil"));
403*9a0e4156SSadaf Ebrahimi
404*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
405*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
406*9a0e4156SSadaf Ebrahimi uint8_t access;
407*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
408*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
409*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
410*9a0e4156SSadaf Ebrahimi #endif
411*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
412*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op0);
413*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
414*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
415*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
416*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
417*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
418*9a0e4156SSadaf Ebrahimi #endif
419*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
420*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(Op2);
421*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
422*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
423*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
424*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
425*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
426*9a0e4156SSadaf Ebrahimi #endif
427*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
428*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = LSB;
429*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
430*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
431*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
432*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
433*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
434*9a0e4156SSadaf Ebrahimi #endif
435*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
436*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Width;
437*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
438*9a0e4156SSadaf Ebrahimi }
439*9a0e4156SSadaf Ebrahimi
440*9a0e4156SSadaf Ebrahimi return;
441*9a0e4156SSadaf Ebrahimi }
442*9a0e4156SSadaf Ebrahimi
443*9a0e4156SSadaf Ebrahimi mnem = printAliasInstr(MI, O, Info);
444*9a0e4156SSadaf Ebrahimi if (mnem) {
445*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, AArch64_map_insn(mnem));
446*9a0e4156SSadaf Ebrahimi cs_mem_free(mnem);
447*9a0e4156SSadaf Ebrahimi } else {
448*9a0e4156SSadaf Ebrahimi printInstruction(MI, O, Info);
449*9a0e4156SSadaf Ebrahimi }
450*9a0e4156SSadaf Ebrahimi }
451*9a0e4156SSadaf Ebrahimi
printSysAlias(MCInst * MI,SStream * O)452*9a0e4156SSadaf Ebrahimi static bool printSysAlias(MCInst *MI, SStream *O)
453*9a0e4156SSadaf Ebrahimi {
454*9a0e4156SSadaf Ebrahimi // unsigned Opcode = MCInst_getOpcode(MI);
455*9a0e4156SSadaf Ebrahimi //assert(Opcode == AArch64_SYSxt && "Invalid opcode for SYS alias!");
456*9a0e4156SSadaf Ebrahimi
457*9a0e4156SSadaf Ebrahimi const char *Asm = NULL;
458*9a0e4156SSadaf Ebrahimi MCOperand *Op1 = MCInst_getOperand(MI, 0);
459*9a0e4156SSadaf Ebrahimi MCOperand *Cn = MCInst_getOperand(MI, 1);
460*9a0e4156SSadaf Ebrahimi MCOperand *Cm = MCInst_getOperand(MI, 2);
461*9a0e4156SSadaf Ebrahimi MCOperand *Op2 = MCInst_getOperand(MI, 3);
462*9a0e4156SSadaf Ebrahimi
463*9a0e4156SSadaf Ebrahimi unsigned Op1Val = (unsigned)MCOperand_getImm(Op1);
464*9a0e4156SSadaf Ebrahimi unsigned CnVal = (unsigned)MCOperand_getImm(Cn);
465*9a0e4156SSadaf Ebrahimi unsigned CmVal = (unsigned)MCOperand_getImm(Cm);
466*9a0e4156SSadaf Ebrahimi unsigned Op2Val = (unsigned)MCOperand_getImm(Op2);
467*9a0e4156SSadaf Ebrahimi unsigned insn_id = ARM64_INS_INVALID;
468*9a0e4156SSadaf Ebrahimi unsigned op_ic = 0, op_dc = 0, op_at = 0, op_tlbi = 0;
469*9a0e4156SSadaf Ebrahimi
470*9a0e4156SSadaf Ebrahimi if (CnVal == 7) {
471*9a0e4156SSadaf Ebrahimi switch (CmVal) {
472*9a0e4156SSadaf Ebrahimi default:
473*9a0e4156SSadaf Ebrahimi break;
474*9a0e4156SSadaf Ebrahimi
475*9a0e4156SSadaf Ebrahimi // IC aliases
476*9a0e4156SSadaf Ebrahimi case 1:
477*9a0e4156SSadaf Ebrahimi if (Op1Val == 0 && Op2Val == 0) {
478*9a0e4156SSadaf Ebrahimi Asm = "ic\tialluis";
479*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_IC;
480*9a0e4156SSadaf Ebrahimi op_ic = ARM64_IC_IALLUIS;
481*9a0e4156SSadaf Ebrahimi }
482*9a0e4156SSadaf Ebrahimi break;
483*9a0e4156SSadaf Ebrahimi case 5:
484*9a0e4156SSadaf Ebrahimi if (Op1Val == 0 && Op2Val == 0) {
485*9a0e4156SSadaf Ebrahimi Asm = "ic\tiallu";
486*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_IC;
487*9a0e4156SSadaf Ebrahimi op_ic = ARM64_IC_IALLU;
488*9a0e4156SSadaf Ebrahimi } else if (Op1Val == 3 && Op2Val == 1) {
489*9a0e4156SSadaf Ebrahimi Asm = "ic\tivau";
490*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_IC;
491*9a0e4156SSadaf Ebrahimi op_ic = ARM64_IC_IVAU;
492*9a0e4156SSadaf Ebrahimi }
493*9a0e4156SSadaf Ebrahimi break;
494*9a0e4156SSadaf Ebrahimi
495*9a0e4156SSadaf Ebrahimi // DC aliases
496*9a0e4156SSadaf Ebrahimi case 4:
497*9a0e4156SSadaf Ebrahimi if (Op1Val == 3 && Op2Val == 1) {
498*9a0e4156SSadaf Ebrahimi Asm = "dc\tzva";
499*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_DC;
500*9a0e4156SSadaf Ebrahimi op_dc = ARM64_DC_ZVA;
501*9a0e4156SSadaf Ebrahimi }
502*9a0e4156SSadaf Ebrahimi break;
503*9a0e4156SSadaf Ebrahimi case 6:
504*9a0e4156SSadaf Ebrahimi if (Op1Val == 0 && Op2Val == 1) {
505*9a0e4156SSadaf Ebrahimi Asm = "dc\tivac";
506*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_DC;
507*9a0e4156SSadaf Ebrahimi op_dc = ARM64_DC_IVAC;
508*9a0e4156SSadaf Ebrahimi }
509*9a0e4156SSadaf Ebrahimi if (Op1Val == 0 && Op2Val == 2) {
510*9a0e4156SSadaf Ebrahimi Asm = "dc\tisw";
511*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_DC;
512*9a0e4156SSadaf Ebrahimi op_dc = ARM64_DC_ISW;
513*9a0e4156SSadaf Ebrahimi }
514*9a0e4156SSadaf Ebrahimi break;
515*9a0e4156SSadaf Ebrahimi case 10:
516*9a0e4156SSadaf Ebrahimi if (Op1Val == 3 && Op2Val == 1) {
517*9a0e4156SSadaf Ebrahimi Asm = "dc\tcvac";
518*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_DC;
519*9a0e4156SSadaf Ebrahimi op_dc = ARM64_DC_CVAC;
520*9a0e4156SSadaf Ebrahimi } else if (Op1Val == 0 && Op2Val == 2) {
521*9a0e4156SSadaf Ebrahimi Asm = "dc\tcsw";
522*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_DC;
523*9a0e4156SSadaf Ebrahimi op_dc = ARM64_DC_CSW;
524*9a0e4156SSadaf Ebrahimi }
525*9a0e4156SSadaf Ebrahimi break;
526*9a0e4156SSadaf Ebrahimi case 11:
527*9a0e4156SSadaf Ebrahimi if (Op1Val == 3 && Op2Val == 1) {
528*9a0e4156SSadaf Ebrahimi Asm = "dc\tcvau";
529*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_DC;
530*9a0e4156SSadaf Ebrahimi op_dc = ARM64_DC_CVAU;
531*9a0e4156SSadaf Ebrahimi }
532*9a0e4156SSadaf Ebrahimi break;
533*9a0e4156SSadaf Ebrahimi case 14:
534*9a0e4156SSadaf Ebrahimi if (Op1Val == 3 && Op2Val == 1) {
535*9a0e4156SSadaf Ebrahimi Asm = "dc\tcivac";
536*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_DC;
537*9a0e4156SSadaf Ebrahimi op_dc = ARM64_DC_CIVAC;
538*9a0e4156SSadaf Ebrahimi } else if (Op1Val == 0 && Op2Val == 2) {
539*9a0e4156SSadaf Ebrahimi Asm = "dc\tcisw";
540*9a0e4156SSadaf Ebrahimi insn_id = ARM64_INS_DC;
541*9a0e4156SSadaf Ebrahimi op_dc = ARM64_DC_CISW;
542*9a0e4156SSadaf Ebrahimi }
543*9a0e4156SSadaf Ebrahimi break;
544*9a0e4156SSadaf Ebrahimi
545*9a0e4156SSadaf Ebrahimi // AT aliases
546*9a0e4156SSadaf Ebrahimi case 8:
547*9a0e4156SSadaf Ebrahimi switch (Op1Val) {
548*9a0e4156SSadaf Ebrahimi default:
549*9a0e4156SSadaf Ebrahimi break;
550*9a0e4156SSadaf Ebrahimi case 0:
551*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
552*9a0e4156SSadaf Ebrahimi default:
553*9a0e4156SSadaf Ebrahimi break;
554*9a0e4156SSadaf Ebrahimi case 0: Asm = "at\ts1e1r"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E1R; break;
555*9a0e4156SSadaf Ebrahimi case 1: Asm = "at\ts1e1w"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E1W; break;
556*9a0e4156SSadaf Ebrahimi case 2: Asm = "at\ts1e0r"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E0R; break;
557*9a0e4156SSadaf Ebrahimi case 3: Asm = "at\ts1e0w"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E0W; break;
558*9a0e4156SSadaf Ebrahimi }
559*9a0e4156SSadaf Ebrahimi break;
560*9a0e4156SSadaf Ebrahimi case 4:
561*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
562*9a0e4156SSadaf Ebrahimi default:
563*9a0e4156SSadaf Ebrahimi break;
564*9a0e4156SSadaf Ebrahimi case 0: Asm = "at\ts1e2r"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E2R; break;
565*9a0e4156SSadaf Ebrahimi case 1: Asm = "at\ts1e2w"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E2W; break;
566*9a0e4156SSadaf Ebrahimi case 4: Asm = "at\ts12e1r"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E1R; break;
567*9a0e4156SSadaf Ebrahimi case 5: Asm = "at\ts12e1w"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E1W; break;
568*9a0e4156SSadaf Ebrahimi case 6: Asm = "at\ts12e0r"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E0R; break;
569*9a0e4156SSadaf Ebrahimi case 7: Asm = "at\ts12e0w"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E0W; break;
570*9a0e4156SSadaf Ebrahimi }
571*9a0e4156SSadaf Ebrahimi break;
572*9a0e4156SSadaf Ebrahimi case 6:
573*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
574*9a0e4156SSadaf Ebrahimi default:
575*9a0e4156SSadaf Ebrahimi break;
576*9a0e4156SSadaf Ebrahimi case 0: Asm = "at\ts1e3r"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E3R; break;
577*9a0e4156SSadaf Ebrahimi case 1: Asm = "at\ts1e3w"; insn_id = ARM64_INS_AT; op_at = ARM64_AT_S1E3W; break;
578*9a0e4156SSadaf Ebrahimi }
579*9a0e4156SSadaf Ebrahimi break;
580*9a0e4156SSadaf Ebrahimi }
581*9a0e4156SSadaf Ebrahimi break;
582*9a0e4156SSadaf Ebrahimi }
583*9a0e4156SSadaf Ebrahimi } else if (CnVal == 8) {
584*9a0e4156SSadaf Ebrahimi // TLBI aliases
585*9a0e4156SSadaf Ebrahimi switch (CmVal) {
586*9a0e4156SSadaf Ebrahimi default:
587*9a0e4156SSadaf Ebrahimi break;
588*9a0e4156SSadaf Ebrahimi case 3:
589*9a0e4156SSadaf Ebrahimi switch (Op1Val) {
590*9a0e4156SSadaf Ebrahimi default:
591*9a0e4156SSadaf Ebrahimi break;
592*9a0e4156SSadaf Ebrahimi case 0:
593*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
594*9a0e4156SSadaf Ebrahimi default:
595*9a0e4156SSadaf Ebrahimi break;
596*9a0e4156SSadaf Ebrahimi case 0: Asm = "tlbi\tvmalle1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VMALLE1IS; break;
597*9a0e4156SSadaf Ebrahimi case 1: Asm = "tlbi\tvae1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAE1IS; break;
598*9a0e4156SSadaf Ebrahimi case 2: Asm = "tlbi\taside1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_ASIDE1IS; break;
599*9a0e4156SSadaf Ebrahimi case 3: Asm = "tlbi\tvaae1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAAE1IS; break;
600*9a0e4156SSadaf Ebrahimi case 5: Asm = "tlbi\tvale1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VALE1IS; break;
601*9a0e4156SSadaf Ebrahimi case 7: Asm = "tlbi\tvaale1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAALE1IS; break;
602*9a0e4156SSadaf Ebrahimi }
603*9a0e4156SSadaf Ebrahimi break;
604*9a0e4156SSadaf Ebrahimi case 4:
605*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
606*9a0e4156SSadaf Ebrahimi default:
607*9a0e4156SSadaf Ebrahimi break;
608*9a0e4156SSadaf Ebrahimi case 0: Asm = "tlbi\talle2is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_ALLE2IS; break;
609*9a0e4156SSadaf Ebrahimi case 1: Asm = "tlbi\tvae2is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAE2IS; break;
610*9a0e4156SSadaf Ebrahimi case 4: Asm = "tlbi\talle1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_ALLE1IS; break;
611*9a0e4156SSadaf Ebrahimi case 5: Asm = "tlbi\tvale2is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VALE2IS; break;
612*9a0e4156SSadaf Ebrahimi case 6: Asm = "tlbi\tvmalls12e1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VMALLS12E1IS; break;
613*9a0e4156SSadaf Ebrahimi }
614*9a0e4156SSadaf Ebrahimi break;
615*9a0e4156SSadaf Ebrahimi case 6:
616*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
617*9a0e4156SSadaf Ebrahimi default:
618*9a0e4156SSadaf Ebrahimi break;
619*9a0e4156SSadaf Ebrahimi case 0: Asm = "tlbi\talle3is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_ALLE3IS; break;
620*9a0e4156SSadaf Ebrahimi case 1: Asm = "tlbi\tvae3is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAE3IS; break;
621*9a0e4156SSadaf Ebrahimi case 5: Asm = "tlbi\tvale3is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VALE3IS; break;
622*9a0e4156SSadaf Ebrahimi }
623*9a0e4156SSadaf Ebrahimi break;
624*9a0e4156SSadaf Ebrahimi }
625*9a0e4156SSadaf Ebrahimi break;
626*9a0e4156SSadaf Ebrahimi case 0:
627*9a0e4156SSadaf Ebrahimi switch (Op1Val) {
628*9a0e4156SSadaf Ebrahimi default:
629*9a0e4156SSadaf Ebrahimi break;
630*9a0e4156SSadaf Ebrahimi case 4:
631*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
632*9a0e4156SSadaf Ebrahimi default:
633*9a0e4156SSadaf Ebrahimi break;
634*9a0e4156SSadaf Ebrahimi case 1: Asm = "tlbi\tipas2e1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_IPAS2E1IS; break;
635*9a0e4156SSadaf Ebrahimi case 5: Asm = "tlbi\tipas2le1is"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_IPAS2LE1IS; break;
636*9a0e4156SSadaf Ebrahimi }
637*9a0e4156SSadaf Ebrahimi break;
638*9a0e4156SSadaf Ebrahimi }
639*9a0e4156SSadaf Ebrahimi break;
640*9a0e4156SSadaf Ebrahimi case 4:
641*9a0e4156SSadaf Ebrahimi switch (Op1Val) {
642*9a0e4156SSadaf Ebrahimi default:
643*9a0e4156SSadaf Ebrahimi break;
644*9a0e4156SSadaf Ebrahimi case 4:
645*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
646*9a0e4156SSadaf Ebrahimi default:
647*9a0e4156SSadaf Ebrahimi break;
648*9a0e4156SSadaf Ebrahimi case 1: Asm = "tlbi\tipas2e1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_IPAS2E1; break;
649*9a0e4156SSadaf Ebrahimi case 5: Asm = "tlbi\tipas2le1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_IPAS2LE1; break;
650*9a0e4156SSadaf Ebrahimi }
651*9a0e4156SSadaf Ebrahimi break;
652*9a0e4156SSadaf Ebrahimi }
653*9a0e4156SSadaf Ebrahimi break;
654*9a0e4156SSadaf Ebrahimi case 7:
655*9a0e4156SSadaf Ebrahimi switch (Op1Val) {
656*9a0e4156SSadaf Ebrahimi default:
657*9a0e4156SSadaf Ebrahimi break;
658*9a0e4156SSadaf Ebrahimi case 0:
659*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
660*9a0e4156SSadaf Ebrahimi default:
661*9a0e4156SSadaf Ebrahimi break;
662*9a0e4156SSadaf Ebrahimi case 0: Asm = "tlbi\tvmalle1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VMALLE1; break;
663*9a0e4156SSadaf Ebrahimi case 1: Asm = "tlbi\tvae1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAE1; break;
664*9a0e4156SSadaf Ebrahimi case 2: Asm = "tlbi\taside1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_ASIDE1; break;
665*9a0e4156SSadaf Ebrahimi case 3: Asm = "tlbi\tvaae1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAAE1; break;
666*9a0e4156SSadaf Ebrahimi case 5: Asm = "tlbi\tvale1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VALE1; break;
667*9a0e4156SSadaf Ebrahimi case 7: Asm = "tlbi\tvaale1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAALE1; break;
668*9a0e4156SSadaf Ebrahimi }
669*9a0e4156SSadaf Ebrahimi break;
670*9a0e4156SSadaf Ebrahimi case 4:
671*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
672*9a0e4156SSadaf Ebrahimi default:
673*9a0e4156SSadaf Ebrahimi break;
674*9a0e4156SSadaf Ebrahimi case 0: Asm = "tlbi\talle2"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_ALLE2; break;
675*9a0e4156SSadaf Ebrahimi case 1: Asm = "tlbi\tvae2"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAE2; break;
676*9a0e4156SSadaf Ebrahimi case 4: Asm = "tlbi\talle1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_ALLE1; break;
677*9a0e4156SSadaf Ebrahimi case 5: Asm = "tlbi\tvale2"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VALE2; break;
678*9a0e4156SSadaf Ebrahimi case 6: Asm = "tlbi\tvmalls12e1"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VMALLS12E1; break;
679*9a0e4156SSadaf Ebrahimi }
680*9a0e4156SSadaf Ebrahimi break;
681*9a0e4156SSadaf Ebrahimi case 6:
682*9a0e4156SSadaf Ebrahimi switch (Op2Val) {
683*9a0e4156SSadaf Ebrahimi default:
684*9a0e4156SSadaf Ebrahimi break;
685*9a0e4156SSadaf Ebrahimi case 0: Asm = "tlbi\talle3"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_ALLE3; break;
686*9a0e4156SSadaf Ebrahimi case 1: Asm = "tlbi\tvae3"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VAE3; break;
687*9a0e4156SSadaf Ebrahimi case 5: Asm = "tlbi\tvale3"; insn_id = ARM64_INS_TLBI; op_tlbi = ARM64_TLBI_VALE3; break;
688*9a0e4156SSadaf Ebrahimi }
689*9a0e4156SSadaf Ebrahimi break;
690*9a0e4156SSadaf Ebrahimi }
691*9a0e4156SSadaf Ebrahimi break;
692*9a0e4156SSadaf Ebrahimi }
693*9a0e4156SSadaf Ebrahimi }
694*9a0e4156SSadaf Ebrahimi
695*9a0e4156SSadaf Ebrahimi if (Asm) {
696*9a0e4156SSadaf Ebrahimi MCInst_setOpcodePub(MI, insn_id);
697*9a0e4156SSadaf Ebrahimi SStream_concat0(O, Asm);
698*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
699*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
700*9a0e4156SSadaf Ebrahimi uint8_t access;
701*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
702*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
703*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
704*9a0e4156SSadaf Ebrahimi #endif
705*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_SYS;
706*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].sys = op_ic + op_dc + op_at + op_tlbi;
707*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
708*9a0e4156SSadaf Ebrahimi }
709*9a0e4156SSadaf Ebrahimi
710*9a0e4156SSadaf Ebrahimi if (!strstr(Asm, "all")) {
711*9a0e4156SSadaf Ebrahimi unsigned Reg = MCOperand_getReg(MCInst_getOperand(MI, 4));
712*9a0e4156SSadaf Ebrahimi SStream_concat(O, ", %s", getRegisterName(Reg, AArch64_NoRegAltName));
713*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
714*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
715*9a0e4156SSadaf Ebrahimi uint8_t access;
716*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
717*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
718*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
719*9a0e4156SSadaf Ebrahimi #endif
720*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
721*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
722*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
723*9a0e4156SSadaf Ebrahimi }
724*9a0e4156SSadaf Ebrahimi }
725*9a0e4156SSadaf Ebrahimi }
726*9a0e4156SSadaf Ebrahimi
727*9a0e4156SSadaf Ebrahimi return Asm != NULL;
728*9a0e4156SSadaf Ebrahimi }
729*9a0e4156SSadaf Ebrahimi
printOperand(MCInst * MI,unsigned OpNo,SStream * O)730*9a0e4156SSadaf Ebrahimi static void printOperand(MCInst *MI, unsigned OpNo, SStream *O)
731*9a0e4156SSadaf Ebrahimi {
732*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
733*9a0e4156SSadaf Ebrahimi
734*9a0e4156SSadaf Ebrahimi if (MCOperand_isReg(Op)) {
735*9a0e4156SSadaf Ebrahimi unsigned Reg = MCOperand_getReg(Op);
736*9a0e4156SSadaf Ebrahimi SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
737*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
738*9a0e4156SSadaf Ebrahimi if (MI->csh->doing_mem) {
739*9a0e4156SSadaf Ebrahimi if (MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.base == ARM64_REG_INVALID) {
740*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.base = Reg;
741*9a0e4156SSadaf Ebrahimi }
742*9a0e4156SSadaf Ebrahimi else if (MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.index == ARM64_REG_INVALID) {
743*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.index = Reg;
744*9a0e4156SSadaf Ebrahimi }
745*9a0e4156SSadaf Ebrahimi } else {
746*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
747*9a0e4156SSadaf Ebrahimi uint8_t access;
748*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
749*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
750*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
751*9a0e4156SSadaf Ebrahimi #endif
752*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
753*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
754*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
755*9a0e4156SSadaf Ebrahimi }
756*9a0e4156SSadaf Ebrahimi }
757*9a0e4156SSadaf Ebrahimi } else if (MCOperand_isImm(Op)) {
758*9a0e4156SSadaf Ebrahimi int64_t imm = MCOperand_getImm(Op);
759*9a0e4156SSadaf Ebrahimi
760*9a0e4156SSadaf Ebrahimi if (MI->Opcode == AArch64_ADR) {
761*9a0e4156SSadaf Ebrahimi imm += MI->address;
762*9a0e4156SSadaf Ebrahimi printUInt64Bang(O, imm);
763*9a0e4156SSadaf Ebrahimi } else {
764*9a0e4156SSadaf Ebrahimi if (MI->csh->doing_mem) {
765*9a0e4156SSadaf Ebrahimi if (MI->csh->imm_unsigned) {
766*9a0e4156SSadaf Ebrahimi printUInt64Bang(O, imm);
767*9a0e4156SSadaf Ebrahimi } else {
768*9a0e4156SSadaf Ebrahimi printInt64Bang(O, imm);
769*9a0e4156SSadaf Ebrahimi }
770*9a0e4156SSadaf Ebrahimi } else
771*9a0e4156SSadaf Ebrahimi printUInt64Bang(O, imm);
772*9a0e4156SSadaf Ebrahimi }
773*9a0e4156SSadaf Ebrahimi
774*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
775*9a0e4156SSadaf Ebrahimi if (MI->csh->doing_mem) {
776*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.disp = (int32_t)imm;
777*9a0e4156SSadaf Ebrahimi } else {
778*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
779*9a0e4156SSadaf Ebrahimi uint8_t access;
780*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
781*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
782*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
783*9a0e4156SSadaf Ebrahimi #endif
784*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
785*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = imm;
786*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
787*9a0e4156SSadaf Ebrahimi }
788*9a0e4156SSadaf Ebrahimi }
789*9a0e4156SSadaf Ebrahimi }
790*9a0e4156SSadaf Ebrahimi }
791*9a0e4156SSadaf Ebrahimi
printHexImm(MCInst * MI,unsigned OpNo,SStream * O)792*9a0e4156SSadaf Ebrahimi static void printHexImm(MCInst *MI, unsigned OpNo, SStream *O)
793*9a0e4156SSadaf Ebrahimi {
794*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
795*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%#llx", MCOperand_getImm(Op));
796*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
797*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
798*9a0e4156SSadaf Ebrahimi uint8_t access;
799*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
800*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
801*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
802*9a0e4156SSadaf Ebrahimi #endif
803*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
804*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op);
805*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
806*9a0e4156SSadaf Ebrahimi }
807*9a0e4156SSadaf Ebrahimi }
808*9a0e4156SSadaf Ebrahimi
printPostIncOperand(MCInst * MI,unsigned OpNo,unsigned Imm,SStream * O)809*9a0e4156SSadaf Ebrahimi static void printPostIncOperand(MCInst *MI, unsigned OpNo,
810*9a0e4156SSadaf Ebrahimi unsigned Imm, SStream *O)
811*9a0e4156SSadaf Ebrahimi {
812*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
813*9a0e4156SSadaf Ebrahimi
814*9a0e4156SSadaf Ebrahimi if (MCOperand_isReg(Op)) {
815*9a0e4156SSadaf Ebrahimi unsigned Reg = MCOperand_getReg(Op);
816*9a0e4156SSadaf Ebrahimi if (Reg == AArch64_XZR) {
817*9a0e4156SSadaf Ebrahimi printInt32Bang(O, Imm);
818*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
819*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
820*9a0e4156SSadaf Ebrahimi uint8_t access;
821*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
822*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
823*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
824*9a0e4156SSadaf Ebrahimi #endif
825*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
826*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Imm;
827*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
828*9a0e4156SSadaf Ebrahimi }
829*9a0e4156SSadaf Ebrahimi } else {
830*9a0e4156SSadaf Ebrahimi SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
831*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
832*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
833*9a0e4156SSadaf Ebrahimi uint8_t access;
834*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
835*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
836*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
837*9a0e4156SSadaf Ebrahimi #endif
838*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
839*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
840*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
841*9a0e4156SSadaf Ebrahimi }
842*9a0e4156SSadaf Ebrahimi }
843*9a0e4156SSadaf Ebrahimi }
844*9a0e4156SSadaf Ebrahimi //llvm_unreachable("unknown operand kind in printPostIncOperand64");
845*9a0e4156SSadaf Ebrahimi }
846*9a0e4156SSadaf Ebrahimi
printPostIncOperand2(MCInst * MI,unsigned OpNo,SStream * O,int Amount)847*9a0e4156SSadaf Ebrahimi static void printPostIncOperand2(MCInst *MI, unsigned OpNo, SStream *O, int Amount)
848*9a0e4156SSadaf Ebrahimi {
849*9a0e4156SSadaf Ebrahimi printPostIncOperand(MI, OpNo, Amount, O);
850*9a0e4156SSadaf Ebrahimi }
851*9a0e4156SSadaf Ebrahimi
printVRegOperand(MCInst * MI,unsigned OpNo,SStream * O)852*9a0e4156SSadaf Ebrahimi static void printVRegOperand(MCInst *MI, unsigned OpNo, SStream *O)
853*9a0e4156SSadaf Ebrahimi {
854*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
855*9a0e4156SSadaf Ebrahimi //assert(Op.isReg() && "Non-register vreg operand!");
856*9a0e4156SSadaf Ebrahimi unsigned Reg = MCOperand_getReg(Op);
857*9a0e4156SSadaf Ebrahimi SStream_concat0(O, getRegisterName(Reg, AArch64_vreg));
858*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
859*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
860*9a0e4156SSadaf Ebrahimi uint8_t access;
861*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
862*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
863*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
864*9a0e4156SSadaf Ebrahimi #endif
865*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
866*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = AArch64_map_vregister(Reg);
867*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
868*9a0e4156SSadaf Ebrahimi }
869*9a0e4156SSadaf Ebrahimi }
870*9a0e4156SSadaf Ebrahimi
printSysCROperand(MCInst * MI,unsigned OpNo,SStream * O)871*9a0e4156SSadaf Ebrahimi static void printSysCROperand(MCInst *MI, unsigned OpNo, SStream *O)
872*9a0e4156SSadaf Ebrahimi {
873*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNo);
874*9a0e4156SSadaf Ebrahimi //assert(Op.isImm() && "System instruction C[nm] operands must be immediates!");
875*9a0e4156SSadaf Ebrahimi SStream_concat(O, "c%u", MCOperand_getImm(Op));
876*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
877*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
878*9a0e4156SSadaf Ebrahimi uint8_t access;
879*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
880*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
881*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
882*9a0e4156SSadaf Ebrahimi #endif
883*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_CIMM;
884*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = MCOperand_getImm(Op);
885*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
886*9a0e4156SSadaf Ebrahimi }
887*9a0e4156SSadaf Ebrahimi }
888*9a0e4156SSadaf Ebrahimi
printAddSubImm(MCInst * MI,unsigned OpNum,SStream * O)889*9a0e4156SSadaf Ebrahimi static void printAddSubImm(MCInst *MI, unsigned OpNum, SStream *O)
890*9a0e4156SSadaf Ebrahimi {
891*9a0e4156SSadaf Ebrahimi MCOperand *MO = MCInst_getOperand(MI, OpNum);
892*9a0e4156SSadaf Ebrahimi if (MCOperand_isImm(MO)) {
893*9a0e4156SSadaf Ebrahimi unsigned Val = (MCOperand_getImm(MO) & 0xfff);
894*9a0e4156SSadaf Ebrahimi //assert(Val == MO.getImm() && "Add/sub immediate out of range!");
895*9a0e4156SSadaf Ebrahimi unsigned Shift = AArch64_AM_getShiftValue((int)MCOperand_getImm(MCInst_getOperand(MI, OpNum + 1)));
896*9a0e4156SSadaf Ebrahimi
897*9a0e4156SSadaf Ebrahimi printInt32Bang(O, Val);
898*9a0e4156SSadaf Ebrahimi
899*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
900*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
901*9a0e4156SSadaf Ebrahimi uint8_t access;
902*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
903*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
904*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
905*9a0e4156SSadaf Ebrahimi #endif
906*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
907*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
908*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
909*9a0e4156SSadaf Ebrahimi }
910*9a0e4156SSadaf Ebrahimi
911*9a0e4156SSadaf Ebrahimi if (Shift != 0)
912*9a0e4156SSadaf Ebrahimi printShifter(MI, OpNum + 1, O);
913*9a0e4156SSadaf Ebrahimi }
914*9a0e4156SSadaf Ebrahimi }
915*9a0e4156SSadaf Ebrahimi
printLogicalImm32(MCInst * MI,unsigned OpNum,SStream * O)916*9a0e4156SSadaf Ebrahimi static void printLogicalImm32(MCInst *MI, unsigned OpNum, SStream *O)
917*9a0e4156SSadaf Ebrahimi {
918*9a0e4156SSadaf Ebrahimi int64_t Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
919*9a0e4156SSadaf Ebrahimi
920*9a0e4156SSadaf Ebrahimi Val = AArch64_AM_decodeLogicalImmediate(Val, 32);
921*9a0e4156SSadaf Ebrahimi printUInt32Bang(O, (int)Val);
922*9a0e4156SSadaf Ebrahimi
923*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
924*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
925*9a0e4156SSadaf Ebrahimi uint8_t access;
926*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
927*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
928*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
929*9a0e4156SSadaf Ebrahimi #endif
930*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
931*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
932*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
933*9a0e4156SSadaf Ebrahimi }
934*9a0e4156SSadaf Ebrahimi }
935*9a0e4156SSadaf Ebrahimi
printLogicalImm64(MCInst * MI,unsigned OpNum,SStream * O)936*9a0e4156SSadaf Ebrahimi static void printLogicalImm64(MCInst *MI, unsigned OpNum, SStream *O)
937*9a0e4156SSadaf Ebrahimi {
938*9a0e4156SSadaf Ebrahimi int64_t Val = MCOperand_getImm(MCInst_getOperand(MI, OpNum));
939*9a0e4156SSadaf Ebrahimi Val = AArch64_AM_decodeLogicalImmediate(Val, 64);
940*9a0e4156SSadaf Ebrahimi
941*9a0e4156SSadaf Ebrahimi switch(MI->flat_insn->id) {
942*9a0e4156SSadaf Ebrahimi default:
943*9a0e4156SSadaf Ebrahimi printInt64Bang(O, Val);
944*9a0e4156SSadaf Ebrahimi break;
945*9a0e4156SSadaf Ebrahimi case ARM64_INS_ORR:
946*9a0e4156SSadaf Ebrahimi case ARM64_INS_AND:
947*9a0e4156SSadaf Ebrahimi case ARM64_INS_EOR:
948*9a0e4156SSadaf Ebrahimi case ARM64_INS_TST:
949*9a0e4156SSadaf Ebrahimi // do not print number in negative form
950*9a0e4156SSadaf Ebrahimi if (Val >= 0 && Val <= HEX_THRESHOLD)
951*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%u", (int)Val);
952*9a0e4156SSadaf Ebrahimi else
953*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#0x%"PRIx64, Val);
954*9a0e4156SSadaf Ebrahimi break;
955*9a0e4156SSadaf Ebrahimi }
956*9a0e4156SSadaf Ebrahimi
957*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
958*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
959*9a0e4156SSadaf Ebrahimi uint8_t access;
960*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
961*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
962*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
963*9a0e4156SSadaf Ebrahimi #endif
964*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
965*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (int64_t)Val;
966*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
967*9a0e4156SSadaf Ebrahimi }
968*9a0e4156SSadaf Ebrahimi }
969*9a0e4156SSadaf Ebrahimi
printShifter(MCInst * MI,unsigned OpNum,SStream * O)970*9a0e4156SSadaf Ebrahimi static void printShifter(MCInst *MI, unsigned OpNum, SStream *O)
971*9a0e4156SSadaf Ebrahimi {
972*9a0e4156SSadaf Ebrahimi unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
973*9a0e4156SSadaf Ebrahimi
974*9a0e4156SSadaf Ebrahimi // LSL #0 should not be printed.
975*9a0e4156SSadaf Ebrahimi if (AArch64_AM_getShiftType(Val) == AArch64_AM_LSL &&
976*9a0e4156SSadaf Ebrahimi AArch64_AM_getShiftValue(Val) == 0)
977*9a0e4156SSadaf Ebrahimi return;
978*9a0e4156SSadaf Ebrahimi
979*9a0e4156SSadaf Ebrahimi SStream_concat(O, ", %s ", AArch64_AM_getShiftExtendName(AArch64_AM_getShiftType(Val)));
980*9a0e4156SSadaf Ebrahimi printInt32BangDec(O, AArch64_AM_getShiftValue(Val));
981*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
982*9a0e4156SSadaf Ebrahimi arm64_shifter shifter = ARM64_SFT_INVALID;
983*9a0e4156SSadaf Ebrahimi switch(AArch64_AM_getShiftType(Val)) {
984*9a0e4156SSadaf Ebrahimi default: // never reach
985*9a0e4156SSadaf Ebrahimi case AArch64_AM_LSL:
986*9a0e4156SSadaf Ebrahimi shifter = ARM64_SFT_LSL;
987*9a0e4156SSadaf Ebrahimi break;
988*9a0e4156SSadaf Ebrahimi case AArch64_AM_LSR:
989*9a0e4156SSadaf Ebrahimi shifter = ARM64_SFT_LSR;
990*9a0e4156SSadaf Ebrahimi break;
991*9a0e4156SSadaf Ebrahimi case AArch64_AM_ASR:
992*9a0e4156SSadaf Ebrahimi shifter = ARM64_SFT_ASR;
993*9a0e4156SSadaf Ebrahimi break;
994*9a0e4156SSadaf Ebrahimi case AArch64_AM_ROR:
995*9a0e4156SSadaf Ebrahimi shifter = ARM64_SFT_ROR;
996*9a0e4156SSadaf Ebrahimi break;
997*9a0e4156SSadaf Ebrahimi case AArch64_AM_MSL:
998*9a0e4156SSadaf Ebrahimi shifter = ARM64_SFT_MSL;
999*9a0e4156SSadaf Ebrahimi break;
1000*9a0e4156SSadaf Ebrahimi }
1001*9a0e4156SSadaf Ebrahimi
1002*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.type = shifter;
1003*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.value = AArch64_AM_getShiftValue(Val);
1004*9a0e4156SSadaf Ebrahimi }
1005*9a0e4156SSadaf Ebrahimi }
1006*9a0e4156SSadaf Ebrahimi
printShiftedRegister(MCInst * MI,unsigned OpNum,SStream * O)1007*9a0e4156SSadaf Ebrahimi static void printShiftedRegister(MCInst *MI, unsigned OpNum, SStream *O)
1008*9a0e4156SSadaf Ebrahimi {
1009*9a0e4156SSadaf Ebrahimi SStream_concat0(O, getRegisterName(MCOperand_getReg(MCInst_getOperand(MI, OpNum)), AArch64_NoRegAltName));
1010*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1011*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1012*9a0e4156SSadaf Ebrahimi uint8_t access;
1013*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1014*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1015*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1016*9a0e4156SSadaf Ebrahimi #endif
1017*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1018*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
1019*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1020*9a0e4156SSadaf Ebrahimi }
1021*9a0e4156SSadaf Ebrahimi printShifter(MI, OpNum + 1, O);
1022*9a0e4156SSadaf Ebrahimi }
1023*9a0e4156SSadaf Ebrahimi
printArithExtend(MCInst * MI,unsigned OpNum,SStream * O)1024*9a0e4156SSadaf Ebrahimi static void printArithExtend(MCInst *MI, unsigned OpNum, SStream *O)
1025*9a0e4156SSadaf Ebrahimi {
1026*9a0e4156SSadaf Ebrahimi unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1027*9a0e4156SSadaf Ebrahimi AArch64_AM_ShiftExtendType ExtType = AArch64_AM_getArithExtendType(Val);
1028*9a0e4156SSadaf Ebrahimi unsigned ShiftVal = AArch64_AM_getArithShiftValue(Val);
1029*9a0e4156SSadaf Ebrahimi
1030*9a0e4156SSadaf Ebrahimi // If the destination or first source register operand is [W]SP, print
1031*9a0e4156SSadaf Ebrahimi // UXTW/UXTX as LSL, and if the shift amount is also zero, print nothing at
1032*9a0e4156SSadaf Ebrahimi // all.
1033*9a0e4156SSadaf Ebrahimi if (ExtType == AArch64_AM_UXTW || ExtType == AArch64_AM_UXTX) {
1034*9a0e4156SSadaf Ebrahimi unsigned Dest = MCOperand_getReg(MCInst_getOperand(MI, 0));
1035*9a0e4156SSadaf Ebrahimi unsigned Src1 = MCOperand_getReg(MCInst_getOperand(MI, 1));
1036*9a0e4156SSadaf Ebrahimi if ( ((Dest == AArch64_SP || Src1 == AArch64_SP) &&
1037*9a0e4156SSadaf Ebrahimi ExtType == AArch64_AM_UXTX) ||
1038*9a0e4156SSadaf Ebrahimi ((Dest == AArch64_WSP || Src1 == AArch64_WSP) &&
1039*9a0e4156SSadaf Ebrahimi ExtType == AArch64_AM_UXTW) ) {
1040*9a0e4156SSadaf Ebrahimi if (ShiftVal != 0) {
1041*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", lsl ");
1042*9a0e4156SSadaf Ebrahimi printInt32Bang(O, ShiftVal);
1043*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1044*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.type = ARM64_SFT_LSL;
1045*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.value = ShiftVal;
1046*9a0e4156SSadaf Ebrahimi }
1047*9a0e4156SSadaf Ebrahimi }
1048*9a0e4156SSadaf Ebrahimi
1049*9a0e4156SSadaf Ebrahimi return;
1050*9a0e4156SSadaf Ebrahimi }
1051*9a0e4156SSadaf Ebrahimi }
1052*9a0e4156SSadaf Ebrahimi
1053*9a0e4156SSadaf Ebrahimi SStream_concat(O, ", %s", AArch64_AM_getShiftExtendName(ExtType));
1054*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1055*9a0e4156SSadaf Ebrahimi arm64_extender ext = ARM64_EXT_INVALID;
1056*9a0e4156SSadaf Ebrahimi switch(ExtType) {
1057*9a0e4156SSadaf Ebrahimi default: // never reach
1058*9a0e4156SSadaf Ebrahimi case AArch64_AM_UXTB:
1059*9a0e4156SSadaf Ebrahimi ext = ARM64_EXT_UXTB;
1060*9a0e4156SSadaf Ebrahimi break;
1061*9a0e4156SSadaf Ebrahimi case AArch64_AM_UXTH:
1062*9a0e4156SSadaf Ebrahimi ext = ARM64_EXT_UXTH;
1063*9a0e4156SSadaf Ebrahimi break;
1064*9a0e4156SSadaf Ebrahimi case AArch64_AM_UXTW:
1065*9a0e4156SSadaf Ebrahimi ext = ARM64_EXT_UXTW;
1066*9a0e4156SSadaf Ebrahimi break;
1067*9a0e4156SSadaf Ebrahimi case AArch64_AM_UXTX:
1068*9a0e4156SSadaf Ebrahimi ext = ARM64_EXT_UXTX;
1069*9a0e4156SSadaf Ebrahimi break;
1070*9a0e4156SSadaf Ebrahimi case AArch64_AM_SXTB:
1071*9a0e4156SSadaf Ebrahimi ext = ARM64_EXT_SXTB;
1072*9a0e4156SSadaf Ebrahimi break;
1073*9a0e4156SSadaf Ebrahimi case AArch64_AM_SXTH:
1074*9a0e4156SSadaf Ebrahimi ext = ARM64_EXT_SXTH;
1075*9a0e4156SSadaf Ebrahimi break;
1076*9a0e4156SSadaf Ebrahimi case AArch64_AM_SXTW:
1077*9a0e4156SSadaf Ebrahimi ext = ARM64_EXT_SXTW;
1078*9a0e4156SSadaf Ebrahimi break;
1079*9a0e4156SSadaf Ebrahimi case AArch64_AM_SXTX:
1080*9a0e4156SSadaf Ebrahimi ext = ARM64_EXT_SXTX;
1081*9a0e4156SSadaf Ebrahimi break;
1082*9a0e4156SSadaf Ebrahimi }
1083*9a0e4156SSadaf Ebrahimi
1084*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].ext = ext;
1085*9a0e4156SSadaf Ebrahimi }
1086*9a0e4156SSadaf Ebrahimi
1087*9a0e4156SSadaf Ebrahimi if (ShiftVal != 0) {
1088*9a0e4156SSadaf Ebrahimi SStream_concat0(O, " ");
1089*9a0e4156SSadaf Ebrahimi printInt32Bang(O, ShiftVal);
1090*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1091*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.type = ARM64_SFT_LSL;
1092*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].shift.value = ShiftVal;
1093*9a0e4156SSadaf Ebrahimi }
1094*9a0e4156SSadaf Ebrahimi }
1095*9a0e4156SSadaf Ebrahimi }
1096*9a0e4156SSadaf Ebrahimi
printExtendedRegister(MCInst * MI,unsigned OpNum,SStream * O)1097*9a0e4156SSadaf Ebrahimi static void printExtendedRegister(MCInst *MI, unsigned OpNum, SStream *O)
1098*9a0e4156SSadaf Ebrahimi {
1099*9a0e4156SSadaf Ebrahimi unsigned Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
1100*9a0e4156SSadaf Ebrahimi
1101*9a0e4156SSadaf Ebrahimi SStream_concat0(O, getRegisterName(Reg, AArch64_NoRegAltName));
1102*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1103*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1104*9a0e4156SSadaf Ebrahimi uint8_t access;
1105*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1106*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1107*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1108*9a0e4156SSadaf Ebrahimi #endif
1109*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1110*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Reg;
1111*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1112*9a0e4156SSadaf Ebrahimi }
1113*9a0e4156SSadaf Ebrahimi
1114*9a0e4156SSadaf Ebrahimi printArithExtend(MI, OpNum + 1, O);
1115*9a0e4156SSadaf Ebrahimi }
1116*9a0e4156SSadaf Ebrahimi
printMemExtend(MCInst * MI,unsigned OpNum,SStream * O,char SrcRegKind,unsigned Width)1117*9a0e4156SSadaf Ebrahimi static void printMemExtend(MCInst *MI, unsigned OpNum, SStream *O, char SrcRegKind, unsigned Width)
1118*9a0e4156SSadaf Ebrahimi {
1119*9a0e4156SSadaf Ebrahimi unsigned SignExtend = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1120*9a0e4156SSadaf Ebrahimi unsigned DoShift = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum + 1));
1121*9a0e4156SSadaf Ebrahimi
1122*9a0e4156SSadaf Ebrahimi // sxtw, sxtx, uxtw or lsl (== uxtx)
1123*9a0e4156SSadaf Ebrahimi bool IsLSL = !SignExtend && SrcRegKind == 'x';
1124*9a0e4156SSadaf Ebrahimi if (IsLSL) {
1125*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "lsl");
1126*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1127*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].shift.type = ARM64_SFT_LSL;
1128*9a0e4156SSadaf Ebrahimi }
1129*9a0e4156SSadaf Ebrahimi } else {
1130*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%cxt%c", (SignExtend ? 's' : 'u'), SrcRegKind);
1131*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1132*9a0e4156SSadaf Ebrahimi if (!SignExtend) {
1133*9a0e4156SSadaf Ebrahimi switch(SrcRegKind) {
1134*9a0e4156SSadaf Ebrahimi default: break;
1135*9a0e4156SSadaf Ebrahimi case 'b':
1136*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_UXTB;
1137*9a0e4156SSadaf Ebrahimi break;
1138*9a0e4156SSadaf Ebrahimi case 'h':
1139*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_UXTH;
1140*9a0e4156SSadaf Ebrahimi break;
1141*9a0e4156SSadaf Ebrahimi case 'w':
1142*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_UXTW;
1143*9a0e4156SSadaf Ebrahimi break;
1144*9a0e4156SSadaf Ebrahimi }
1145*9a0e4156SSadaf Ebrahimi } else {
1146*9a0e4156SSadaf Ebrahimi switch(SrcRegKind) {
1147*9a0e4156SSadaf Ebrahimi default: break;
1148*9a0e4156SSadaf Ebrahimi case 'b':
1149*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_SXTB;
1150*9a0e4156SSadaf Ebrahimi break;
1151*9a0e4156SSadaf Ebrahimi case 'h':
1152*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_SXTH;
1153*9a0e4156SSadaf Ebrahimi break;
1154*9a0e4156SSadaf Ebrahimi case 'w':
1155*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_SXTW;
1156*9a0e4156SSadaf Ebrahimi break;
1157*9a0e4156SSadaf Ebrahimi case 'x':
1158*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].ext = ARM64_EXT_SXTX;
1159*9a0e4156SSadaf Ebrahimi break;
1160*9a0e4156SSadaf Ebrahimi }
1161*9a0e4156SSadaf Ebrahimi }
1162*9a0e4156SSadaf Ebrahimi }
1163*9a0e4156SSadaf Ebrahimi }
1164*9a0e4156SSadaf Ebrahimi
1165*9a0e4156SSadaf Ebrahimi if (DoShift || IsLSL) {
1166*9a0e4156SSadaf Ebrahimi SStream_concat(O, " #%u", Log2_32(Width / 8));
1167*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1168*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].shift.type = ARM64_SFT_LSL;
1169*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].shift.value = Log2_32(Width / 8);
1170*9a0e4156SSadaf Ebrahimi }
1171*9a0e4156SSadaf Ebrahimi }
1172*9a0e4156SSadaf Ebrahimi }
1173*9a0e4156SSadaf Ebrahimi
printCondCode(MCInst * MI,unsigned OpNum,SStream * O)1174*9a0e4156SSadaf Ebrahimi static void printCondCode(MCInst *MI, unsigned OpNum, SStream *O)
1175*9a0e4156SSadaf Ebrahimi {
1176*9a0e4156SSadaf Ebrahimi A64CC_CondCode CC = (A64CC_CondCode)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1177*9a0e4156SSadaf Ebrahimi SStream_concat0(O, getCondCodeName(CC));
1178*9a0e4156SSadaf Ebrahimi
1179*9a0e4156SSadaf Ebrahimi if (MI->csh->detail)
1180*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.cc = (arm64_cc)(CC + 1);
1181*9a0e4156SSadaf Ebrahimi }
1182*9a0e4156SSadaf Ebrahimi
printInverseCondCode(MCInst * MI,unsigned OpNum,SStream * O)1183*9a0e4156SSadaf Ebrahimi static void printInverseCondCode(MCInst *MI, unsigned OpNum, SStream *O)
1184*9a0e4156SSadaf Ebrahimi {
1185*9a0e4156SSadaf Ebrahimi A64CC_CondCode CC = (A64CC_CondCode)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1186*9a0e4156SSadaf Ebrahimi SStream_concat0(O, getCondCodeName(getInvertedCondCode(CC)));
1187*9a0e4156SSadaf Ebrahimi
1188*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1189*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.cc = (arm64_cc)(getInvertedCondCode(CC) + 1);
1190*9a0e4156SSadaf Ebrahimi }
1191*9a0e4156SSadaf Ebrahimi }
1192*9a0e4156SSadaf Ebrahimi
printImmScale(MCInst * MI,unsigned OpNum,SStream * O,int Scale)1193*9a0e4156SSadaf Ebrahimi static void printImmScale(MCInst *MI, unsigned OpNum, SStream *O, int Scale)
1194*9a0e4156SSadaf Ebrahimi {
1195*9a0e4156SSadaf Ebrahimi int64_t val = Scale * MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1196*9a0e4156SSadaf Ebrahimi
1197*9a0e4156SSadaf Ebrahimi printInt64Bang(O, val);
1198*9a0e4156SSadaf Ebrahimi
1199*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1200*9a0e4156SSadaf Ebrahimi if (MI->csh->doing_mem) {
1201*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.disp = (int32_t)val;
1202*9a0e4156SSadaf Ebrahimi } else {
1203*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1204*9a0e4156SSadaf Ebrahimi uint8_t access;
1205*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1206*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1207*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1208*9a0e4156SSadaf Ebrahimi #endif
1209*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1210*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = val;
1211*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1212*9a0e4156SSadaf Ebrahimi }
1213*9a0e4156SSadaf Ebrahimi }
1214*9a0e4156SSadaf Ebrahimi }
1215*9a0e4156SSadaf Ebrahimi
printUImm12Offset(MCInst * MI,unsigned OpNum,unsigned Scale,SStream * O)1216*9a0e4156SSadaf Ebrahimi static void printUImm12Offset(MCInst *MI, unsigned OpNum, unsigned Scale, SStream *O)
1217*9a0e4156SSadaf Ebrahimi {
1218*9a0e4156SSadaf Ebrahimi MCOperand *MO = MCInst_getOperand(MI, OpNum);
1219*9a0e4156SSadaf Ebrahimi
1220*9a0e4156SSadaf Ebrahimi if (MCOperand_isImm(MO)) {
1221*9a0e4156SSadaf Ebrahimi int64_t val = Scale * MCOperand_getImm(MO);
1222*9a0e4156SSadaf Ebrahimi printInt64Bang(O, val);
1223*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1224*9a0e4156SSadaf Ebrahimi if (MI->csh->doing_mem) {
1225*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].mem.disp = (int32_t)val;
1226*9a0e4156SSadaf Ebrahimi } else {
1227*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1228*9a0e4156SSadaf Ebrahimi uint8_t access;
1229*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1230*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1231*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1232*9a0e4156SSadaf Ebrahimi #endif
1233*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1234*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (int)val;
1235*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1236*9a0e4156SSadaf Ebrahimi }
1237*9a0e4156SSadaf Ebrahimi }
1238*9a0e4156SSadaf Ebrahimi }
1239*9a0e4156SSadaf Ebrahimi }
1240*9a0e4156SSadaf Ebrahimi
printUImm12Offset2(MCInst * MI,unsigned OpNum,SStream * O,int Scale)1241*9a0e4156SSadaf Ebrahimi static void printUImm12Offset2(MCInst *MI, unsigned OpNum, SStream *O, int Scale)
1242*9a0e4156SSadaf Ebrahimi {
1243*9a0e4156SSadaf Ebrahimi printUImm12Offset(MI, OpNum, Scale, O);
1244*9a0e4156SSadaf Ebrahimi }
1245*9a0e4156SSadaf Ebrahimi
printPrefetchOp(MCInst * MI,unsigned OpNum,SStream * O)1246*9a0e4156SSadaf Ebrahimi static void printPrefetchOp(MCInst *MI, unsigned OpNum, SStream *O)
1247*9a0e4156SSadaf Ebrahimi {
1248*9a0e4156SSadaf Ebrahimi unsigned prfop = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1249*9a0e4156SSadaf Ebrahimi bool Valid;
1250*9a0e4156SSadaf Ebrahimi const char *Name = A64NamedImmMapper_toString(&A64PRFM_PRFMMapper, prfop, &Valid);
1251*9a0e4156SSadaf Ebrahimi
1252*9a0e4156SSadaf Ebrahimi if (Valid) {
1253*9a0e4156SSadaf Ebrahimi SStream_concat0(O, Name);
1254*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1255*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_PREFETCH;
1256*9a0e4156SSadaf Ebrahimi // we have to plus 1 to prfop because 0 is a valid value of prfop
1257*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].prefetch = prfop + 1;
1258*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1259*9a0e4156SSadaf Ebrahimi }
1260*9a0e4156SSadaf Ebrahimi } else {
1261*9a0e4156SSadaf Ebrahimi printInt32Bang(O, prfop);
1262*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1263*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1264*9a0e4156SSadaf Ebrahimi uint8_t access;
1265*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1266*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1267*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1268*9a0e4156SSadaf Ebrahimi #endif
1269*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1270*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = prfop;
1271*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1272*9a0e4156SSadaf Ebrahimi }
1273*9a0e4156SSadaf Ebrahimi }
1274*9a0e4156SSadaf Ebrahimi }
1275*9a0e4156SSadaf Ebrahimi
printFPImmOperand(MCInst * MI,unsigned OpNum,SStream * O)1276*9a0e4156SSadaf Ebrahimi static void printFPImmOperand(MCInst *MI, unsigned OpNum, SStream *O)
1277*9a0e4156SSadaf Ebrahimi {
1278*9a0e4156SSadaf Ebrahimi MCOperand *MO = MCInst_getOperand(MI, OpNum);
1279*9a0e4156SSadaf Ebrahimi double FPImm = MCOperand_isFPImm(MO) ? MCOperand_getFPImm(MO) : AArch64_AM_getFPImmFloat((int)MCOperand_getImm(MO));
1280*9a0e4156SSadaf Ebrahimi
1281*9a0e4156SSadaf Ebrahimi // 8 decimal places are enough to perfectly represent permitted floats.
1282*9a0e4156SSadaf Ebrahimi #if defined(_KERNEL_MODE)
1283*9a0e4156SSadaf Ebrahimi // Issue #681: Windows kernel does not support formatting float point
1284*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#<float_point_unsupported>");
1285*9a0e4156SSadaf Ebrahimi #else
1286*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%.8f", FPImm);
1287*9a0e4156SSadaf Ebrahimi #endif
1288*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1289*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1290*9a0e4156SSadaf Ebrahimi uint8_t access;
1291*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1292*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1293*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1294*9a0e4156SSadaf Ebrahimi #endif
1295*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_FP;
1296*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].fp = FPImm;
1297*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1298*9a0e4156SSadaf Ebrahimi }
1299*9a0e4156SSadaf Ebrahimi }
1300*9a0e4156SSadaf Ebrahimi
1301*9a0e4156SSadaf Ebrahimi //static unsigned getNextVectorRegister(unsigned Reg, unsigned Stride = 1)
getNextVectorRegister(unsigned Reg,unsigned Stride)1302*9a0e4156SSadaf Ebrahimi static unsigned getNextVectorRegister(unsigned Reg, unsigned Stride)
1303*9a0e4156SSadaf Ebrahimi {
1304*9a0e4156SSadaf Ebrahimi while (Stride--) {
1305*9a0e4156SSadaf Ebrahimi switch (Reg) {
1306*9a0e4156SSadaf Ebrahimi default:
1307*9a0e4156SSadaf Ebrahimi // llvm_unreachable("Vector register expected!");
1308*9a0e4156SSadaf Ebrahimi case AArch64_Q0: Reg = AArch64_Q1; break;
1309*9a0e4156SSadaf Ebrahimi case AArch64_Q1: Reg = AArch64_Q2; break;
1310*9a0e4156SSadaf Ebrahimi case AArch64_Q2: Reg = AArch64_Q3; break;
1311*9a0e4156SSadaf Ebrahimi case AArch64_Q3: Reg = AArch64_Q4; break;
1312*9a0e4156SSadaf Ebrahimi case AArch64_Q4: Reg = AArch64_Q5; break;
1313*9a0e4156SSadaf Ebrahimi case AArch64_Q5: Reg = AArch64_Q6; break;
1314*9a0e4156SSadaf Ebrahimi case AArch64_Q6: Reg = AArch64_Q7; break;
1315*9a0e4156SSadaf Ebrahimi case AArch64_Q7: Reg = AArch64_Q8; break;
1316*9a0e4156SSadaf Ebrahimi case AArch64_Q8: Reg = AArch64_Q9; break;
1317*9a0e4156SSadaf Ebrahimi case AArch64_Q9: Reg = AArch64_Q10; break;
1318*9a0e4156SSadaf Ebrahimi case AArch64_Q10: Reg = AArch64_Q11; break;
1319*9a0e4156SSadaf Ebrahimi case AArch64_Q11: Reg = AArch64_Q12; break;
1320*9a0e4156SSadaf Ebrahimi case AArch64_Q12: Reg = AArch64_Q13; break;
1321*9a0e4156SSadaf Ebrahimi case AArch64_Q13: Reg = AArch64_Q14; break;
1322*9a0e4156SSadaf Ebrahimi case AArch64_Q14: Reg = AArch64_Q15; break;
1323*9a0e4156SSadaf Ebrahimi case AArch64_Q15: Reg = AArch64_Q16; break;
1324*9a0e4156SSadaf Ebrahimi case AArch64_Q16: Reg = AArch64_Q17; break;
1325*9a0e4156SSadaf Ebrahimi case AArch64_Q17: Reg = AArch64_Q18; break;
1326*9a0e4156SSadaf Ebrahimi case AArch64_Q18: Reg = AArch64_Q19; break;
1327*9a0e4156SSadaf Ebrahimi case AArch64_Q19: Reg = AArch64_Q20; break;
1328*9a0e4156SSadaf Ebrahimi case AArch64_Q20: Reg = AArch64_Q21; break;
1329*9a0e4156SSadaf Ebrahimi case AArch64_Q21: Reg = AArch64_Q22; break;
1330*9a0e4156SSadaf Ebrahimi case AArch64_Q22: Reg = AArch64_Q23; break;
1331*9a0e4156SSadaf Ebrahimi case AArch64_Q23: Reg = AArch64_Q24; break;
1332*9a0e4156SSadaf Ebrahimi case AArch64_Q24: Reg = AArch64_Q25; break;
1333*9a0e4156SSadaf Ebrahimi case AArch64_Q25: Reg = AArch64_Q26; break;
1334*9a0e4156SSadaf Ebrahimi case AArch64_Q26: Reg = AArch64_Q27; break;
1335*9a0e4156SSadaf Ebrahimi case AArch64_Q27: Reg = AArch64_Q28; break;
1336*9a0e4156SSadaf Ebrahimi case AArch64_Q28: Reg = AArch64_Q29; break;
1337*9a0e4156SSadaf Ebrahimi case AArch64_Q29: Reg = AArch64_Q30; break;
1338*9a0e4156SSadaf Ebrahimi case AArch64_Q30: Reg = AArch64_Q31; break;
1339*9a0e4156SSadaf Ebrahimi // Vector lists can wrap around.
1340*9a0e4156SSadaf Ebrahimi case AArch64_Q31: Reg = AArch64_Q0; break;
1341*9a0e4156SSadaf Ebrahimi }
1342*9a0e4156SSadaf Ebrahimi }
1343*9a0e4156SSadaf Ebrahimi
1344*9a0e4156SSadaf Ebrahimi return Reg;
1345*9a0e4156SSadaf Ebrahimi }
1346*9a0e4156SSadaf Ebrahimi
printVectorList(MCInst * MI,unsigned OpNum,SStream * O,char * LayoutSuffix,MCRegisterInfo * MRI,arm64_vas vas,arm64_vess vess)1347*9a0e4156SSadaf Ebrahimi static void printVectorList(MCInst *MI, unsigned OpNum, SStream *O, char *LayoutSuffix, MCRegisterInfo *MRI, arm64_vas vas, arm64_vess vess)
1348*9a0e4156SSadaf Ebrahimi {
1349*9a0e4156SSadaf Ebrahimi #define GETREGCLASS_CONTAIN0(_class, _reg) MCRegisterClass_contains(MCRegisterInfo_getRegClass(MRI, _class), _reg)
1350*9a0e4156SSadaf Ebrahimi
1351*9a0e4156SSadaf Ebrahimi unsigned Reg = MCOperand_getReg(MCInst_getOperand(MI, OpNum));
1352*9a0e4156SSadaf Ebrahimi unsigned NumRegs = 1, FirstReg, i;
1353*9a0e4156SSadaf Ebrahimi
1354*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "{");
1355*9a0e4156SSadaf Ebrahimi
1356*9a0e4156SSadaf Ebrahimi // Work out how many registers there are in the list (if there is an actual
1357*9a0e4156SSadaf Ebrahimi // list).
1358*9a0e4156SSadaf Ebrahimi if (GETREGCLASS_CONTAIN0(AArch64_DDRegClassID , Reg) ||
1359*9a0e4156SSadaf Ebrahimi GETREGCLASS_CONTAIN0(AArch64_QQRegClassID, Reg))
1360*9a0e4156SSadaf Ebrahimi NumRegs = 2;
1361*9a0e4156SSadaf Ebrahimi else if (GETREGCLASS_CONTAIN0(AArch64_DDDRegClassID, Reg) ||
1362*9a0e4156SSadaf Ebrahimi GETREGCLASS_CONTAIN0(AArch64_QQQRegClassID, Reg))
1363*9a0e4156SSadaf Ebrahimi NumRegs = 3;
1364*9a0e4156SSadaf Ebrahimi else if (GETREGCLASS_CONTAIN0(AArch64_DDDDRegClassID, Reg) ||
1365*9a0e4156SSadaf Ebrahimi GETREGCLASS_CONTAIN0(AArch64_QQQQRegClassID, Reg))
1366*9a0e4156SSadaf Ebrahimi NumRegs = 4;
1367*9a0e4156SSadaf Ebrahimi
1368*9a0e4156SSadaf Ebrahimi // Now forget about the list and find out what the first register is.
1369*9a0e4156SSadaf Ebrahimi if ((FirstReg = MCRegisterInfo_getSubReg(MRI, Reg, AArch64_dsub0)))
1370*9a0e4156SSadaf Ebrahimi Reg = FirstReg;
1371*9a0e4156SSadaf Ebrahimi else if ((FirstReg = MCRegisterInfo_getSubReg(MRI, Reg, AArch64_qsub0)))
1372*9a0e4156SSadaf Ebrahimi Reg = FirstReg;
1373*9a0e4156SSadaf Ebrahimi
1374*9a0e4156SSadaf Ebrahimi // If it's a D-reg, we need to promote it to the equivalent Q-reg before
1375*9a0e4156SSadaf Ebrahimi // printing (otherwise getRegisterName fails).
1376*9a0e4156SSadaf Ebrahimi if (GETREGCLASS_CONTAIN0(AArch64_FPR64RegClassID, Reg)) {
1377*9a0e4156SSadaf Ebrahimi const MCRegisterClass *FPR128RC = MCRegisterInfo_getRegClass(MRI, AArch64_FPR128RegClassID);
1378*9a0e4156SSadaf Ebrahimi Reg = MCRegisterInfo_getMatchingSuperReg(MRI, Reg, AArch64_dsub, FPR128RC);
1379*9a0e4156SSadaf Ebrahimi }
1380*9a0e4156SSadaf Ebrahimi
1381*9a0e4156SSadaf Ebrahimi for (i = 0; i < NumRegs; ++i, Reg = getNextVectorRegister(Reg, 1)) {
1382*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%s%s", getRegisterName(Reg, AArch64_vreg), LayoutSuffix);
1383*9a0e4156SSadaf Ebrahimi if (i + 1 != NumRegs)
1384*9a0e4156SSadaf Ebrahimi SStream_concat0(O, ", ");
1385*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1386*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1387*9a0e4156SSadaf Ebrahimi uint8_t access;
1388*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1389*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1390*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1391*9a0e4156SSadaf Ebrahimi #endif
1392*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;
1393*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = AArch64_map_vregister(Reg);
1394*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].vas = vas;
1395*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].vess = vess;
1396*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1397*9a0e4156SSadaf Ebrahimi }
1398*9a0e4156SSadaf Ebrahimi }
1399*9a0e4156SSadaf Ebrahimi
1400*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "}");
1401*9a0e4156SSadaf Ebrahimi }
1402*9a0e4156SSadaf Ebrahimi
printTypedVectorList(MCInst * MI,unsigned OpNum,SStream * O,unsigned NumLanes,char LaneKind,MCRegisterInfo * MRI)1403*9a0e4156SSadaf Ebrahimi static void printTypedVectorList(MCInst *MI, unsigned OpNum, SStream *O, unsigned NumLanes, char LaneKind, MCRegisterInfo *MRI)
1404*9a0e4156SSadaf Ebrahimi {
1405*9a0e4156SSadaf Ebrahimi char Suffix[32];
1406*9a0e4156SSadaf Ebrahimi arm64_vas vas = 0;
1407*9a0e4156SSadaf Ebrahimi arm64_vess vess = 0;
1408*9a0e4156SSadaf Ebrahimi
1409*9a0e4156SSadaf Ebrahimi if (NumLanes) {
1410*9a0e4156SSadaf Ebrahimi cs_snprintf(Suffix, sizeof(Suffix), ".%u%c", NumLanes, LaneKind);
1411*9a0e4156SSadaf Ebrahimi switch(LaneKind) {
1412*9a0e4156SSadaf Ebrahimi default: break;
1413*9a0e4156SSadaf Ebrahimi case 'b':
1414*9a0e4156SSadaf Ebrahimi switch(NumLanes) {
1415*9a0e4156SSadaf Ebrahimi default: break;
1416*9a0e4156SSadaf Ebrahimi case 8:
1417*9a0e4156SSadaf Ebrahimi vas = ARM64_VAS_8B;
1418*9a0e4156SSadaf Ebrahimi break;
1419*9a0e4156SSadaf Ebrahimi case 16:
1420*9a0e4156SSadaf Ebrahimi vas = ARM64_VAS_16B;
1421*9a0e4156SSadaf Ebrahimi break;
1422*9a0e4156SSadaf Ebrahimi }
1423*9a0e4156SSadaf Ebrahimi break;
1424*9a0e4156SSadaf Ebrahimi case 'h':
1425*9a0e4156SSadaf Ebrahimi switch(NumLanes) {
1426*9a0e4156SSadaf Ebrahimi default: break;
1427*9a0e4156SSadaf Ebrahimi case 4:
1428*9a0e4156SSadaf Ebrahimi vas = ARM64_VAS_4H;
1429*9a0e4156SSadaf Ebrahimi break;
1430*9a0e4156SSadaf Ebrahimi case 8:
1431*9a0e4156SSadaf Ebrahimi vas = ARM64_VAS_8H;
1432*9a0e4156SSadaf Ebrahimi break;
1433*9a0e4156SSadaf Ebrahimi }
1434*9a0e4156SSadaf Ebrahimi break;
1435*9a0e4156SSadaf Ebrahimi case 's':
1436*9a0e4156SSadaf Ebrahimi switch(NumLanes) {
1437*9a0e4156SSadaf Ebrahimi default: break;
1438*9a0e4156SSadaf Ebrahimi case 2:
1439*9a0e4156SSadaf Ebrahimi vas = ARM64_VAS_2S;
1440*9a0e4156SSadaf Ebrahimi break;
1441*9a0e4156SSadaf Ebrahimi case 4:
1442*9a0e4156SSadaf Ebrahimi vas = ARM64_VAS_4S;
1443*9a0e4156SSadaf Ebrahimi break;
1444*9a0e4156SSadaf Ebrahimi }
1445*9a0e4156SSadaf Ebrahimi break;
1446*9a0e4156SSadaf Ebrahimi case 'd':
1447*9a0e4156SSadaf Ebrahimi switch(NumLanes) {
1448*9a0e4156SSadaf Ebrahimi default: break;
1449*9a0e4156SSadaf Ebrahimi case 1:
1450*9a0e4156SSadaf Ebrahimi vas = ARM64_VAS_1D;
1451*9a0e4156SSadaf Ebrahimi break;
1452*9a0e4156SSadaf Ebrahimi case 2:
1453*9a0e4156SSadaf Ebrahimi vas = ARM64_VAS_2D;
1454*9a0e4156SSadaf Ebrahimi break;
1455*9a0e4156SSadaf Ebrahimi }
1456*9a0e4156SSadaf Ebrahimi break;
1457*9a0e4156SSadaf Ebrahimi case 'q':
1458*9a0e4156SSadaf Ebrahimi switch(NumLanes) {
1459*9a0e4156SSadaf Ebrahimi default: break;
1460*9a0e4156SSadaf Ebrahimi case 1:
1461*9a0e4156SSadaf Ebrahimi vas = ARM64_VAS_1Q;
1462*9a0e4156SSadaf Ebrahimi break;
1463*9a0e4156SSadaf Ebrahimi }
1464*9a0e4156SSadaf Ebrahimi break;
1465*9a0e4156SSadaf Ebrahimi }
1466*9a0e4156SSadaf Ebrahimi } else {
1467*9a0e4156SSadaf Ebrahimi cs_snprintf(Suffix, sizeof(Suffix), ".%c", LaneKind);
1468*9a0e4156SSadaf Ebrahimi switch(LaneKind) {
1469*9a0e4156SSadaf Ebrahimi default: break;
1470*9a0e4156SSadaf Ebrahimi case 'b':
1471*9a0e4156SSadaf Ebrahimi vess = ARM64_VESS_B;
1472*9a0e4156SSadaf Ebrahimi break;
1473*9a0e4156SSadaf Ebrahimi case 'h':
1474*9a0e4156SSadaf Ebrahimi vess = ARM64_VESS_H;
1475*9a0e4156SSadaf Ebrahimi break;
1476*9a0e4156SSadaf Ebrahimi case 's':
1477*9a0e4156SSadaf Ebrahimi vess = ARM64_VESS_S;
1478*9a0e4156SSadaf Ebrahimi break;
1479*9a0e4156SSadaf Ebrahimi case 'd':
1480*9a0e4156SSadaf Ebrahimi vess = ARM64_VESS_D;
1481*9a0e4156SSadaf Ebrahimi break;
1482*9a0e4156SSadaf Ebrahimi }
1483*9a0e4156SSadaf Ebrahimi }
1484*9a0e4156SSadaf Ebrahimi
1485*9a0e4156SSadaf Ebrahimi printVectorList(MI, OpNum, O, Suffix, MRI, vas, vess);
1486*9a0e4156SSadaf Ebrahimi }
1487*9a0e4156SSadaf Ebrahimi
printVectorIndex(MCInst * MI,unsigned OpNum,SStream * O)1488*9a0e4156SSadaf Ebrahimi static void printVectorIndex(MCInst *MI, unsigned OpNum, SStream *O)
1489*9a0e4156SSadaf Ebrahimi {
1490*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "[");
1491*9a0e4156SSadaf Ebrahimi printInt32(O, (int)MCOperand_getImm(MCInst_getOperand(MI, OpNum)));
1492*9a0e4156SSadaf Ebrahimi SStream_concat0(O, "]");
1493*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1494*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].vector_index = (int)MCOperand_getImm(MCInst_getOperand(MI, OpNum));
1495*9a0e4156SSadaf Ebrahimi }
1496*9a0e4156SSadaf Ebrahimi }
1497*9a0e4156SSadaf Ebrahimi
printAlignedLabel(MCInst * MI,unsigned OpNum,SStream * O)1498*9a0e4156SSadaf Ebrahimi static void printAlignedLabel(MCInst *MI, unsigned OpNum, SStream *O)
1499*9a0e4156SSadaf Ebrahimi {
1500*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNum);
1501*9a0e4156SSadaf Ebrahimi
1502*9a0e4156SSadaf Ebrahimi // If the label has already been resolved to an immediate offset (say, when
1503*9a0e4156SSadaf Ebrahimi // we're running the disassembler), just print the immediate.
1504*9a0e4156SSadaf Ebrahimi if (MCOperand_isImm(Op)) {
1505*9a0e4156SSadaf Ebrahimi uint64_t imm = (MCOperand_getImm(Op) * 4) + MI->address;
1506*9a0e4156SSadaf Ebrahimi printUInt64Bang(O, imm);
1507*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1508*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1509*9a0e4156SSadaf Ebrahimi uint8_t access;
1510*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1511*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1512*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1513*9a0e4156SSadaf Ebrahimi #endif
1514*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1515*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = imm;
1516*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1517*9a0e4156SSadaf Ebrahimi }
1518*9a0e4156SSadaf Ebrahimi return;
1519*9a0e4156SSadaf Ebrahimi }
1520*9a0e4156SSadaf Ebrahimi }
1521*9a0e4156SSadaf Ebrahimi
printAdrpLabel(MCInst * MI,unsigned OpNum,SStream * O)1522*9a0e4156SSadaf Ebrahimi static void printAdrpLabel(MCInst *MI, unsigned OpNum, SStream *O)
1523*9a0e4156SSadaf Ebrahimi {
1524*9a0e4156SSadaf Ebrahimi MCOperand *Op = MCInst_getOperand(MI, OpNum);
1525*9a0e4156SSadaf Ebrahimi
1526*9a0e4156SSadaf Ebrahimi if (MCOperand_isImm(Op)) {
1527*9a0e4156SSadaf Ebrahimi // ADRP sign extends a 21-bit offset, shifts it left by 12
1528*9a0e4156SSadaf Ebrahimi // and adds it to the value of the PC with its bottom 12 bits cleared
1529*9a0e4156SSadaf Ebrahimi uint64_t imm = (MCOperand_getImm(Op) * 0x1000) + (MI->address & ~0xfff);
1530*9a0e4156SSadaf Ebrahimi printUInt64Bang(O, imm);
1531*9a0e4156SSadaf Ebrahimi
1532*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1533*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1534*9a0e4156SSadaf Ebrahimi uint8_t access;
1535*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1536*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1537*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1538*9a0e4156SSadaf Ebrahimi #endif
1539*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1540*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = imm;
1541*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1542*9a0e4156SSadaf Ebrahimi }
1543*9a0e4156SSadaf Ebrahimi return;
1544*9a0e4156SSadaf Ebrahimi }
1545*9a0e4156SSadaf Ebrahimi }
1546*9a0e4156SSadaf Ebrahimi
printBarrierOption(MCInst * MI,unsigned OpNo,SStream * O)1547*9a0e4156SSadaf Ebrahimi static void printBarrierOption(MCInst *MI, unsigned OpNo, SStream *O)
1548*9a0e4156SSadaf Ebrahimi {
1549*9a0e4156SSadaf Ebrahimi unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
1550*9a0e4156SSadaf Ebrahimi unsigned Opcode = MCInst_getOpcode(MI);
1551*9a0e4156SSadaf Ebrahimi bool Valid;
1552*9a0e4156SSadaf Ebrahimi const char *Name;
1553*9a0e4156SSadaf Ebrahimi
1554*9a0e4156SSadaf Ebrahimi if (Opcode == AArch64_ISB)
1555*9a0e4156SSadaf Ebrahimi Name = A64NamedImmMapper_toString(&A64ISB_ISBMapper, Val, &Valid);
1556*9a0e4156SSadaf Ebrahimi else
1557*9a0e4156SSadaf Ebrahimi Name = A64NamedImmMapper_toString(&A64DB_DBarrierMapper, Val, &Valid);
1558*9a0e4156SSadaf Ebrahimi
1559*9a0e4156SSadaf Ebrahimi if (Valid) {
1560*9a0e4156SSadaf Ebrahimi SStream_concat0(O, Name);
1561*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1562*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1563*9a0e4156SSadaf Ebrahimi uint8_t access;
1564*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1565*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1566*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1567*9a0e4156SSadaf Ebrahimi #endif
1568*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_BARRIER;
1569*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].barrier = Val;
1570*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1571*9a0e4156SSadaf Ebrahimi }
1572*9a0e4156SSadaf Ebrahimi } else {
1573*9a0e4156SSadaf Ebrahimi printUInt32Bang(O, Val);
1574*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1575*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1576*9a0e4156SSadaf Ebrahimi uint8_t access;
1577*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1578*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1579*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1580*9a0e4156SSadaf Ebrahimi #endif
1581*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1582*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
1583*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1584*9a0e4156SSadaf Ebrahimi }
1585*9a0e4156SSadaf Ebrahimi }
1586*9a0e4156SSadaf Ebrahimi }
1587*9a0e4156SSadaf Ebrahimi
printMRSSystemRegister(MCInst * MI,unsigned OpNo,SStream * O)1588*9a0e4156SSadaf Ebrahimi static void printMRSSystemRegister(MCInst *MI, unsigned OpNo, SStream *O)
1589*9a0e4156SSadaf Ebrahimi {
1590*9a0e4156SSadaf Ebrahimi unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
1591*9a0e4156SSadaf Ebrahimi char Name[128];
1592*9a0e4156SSadaf Ebrahimi
1593*9a0e4156SSadaf Ebrahimi A64SysRegMapper_toString(&AArch64_MRSMapper, Val, Name);
1594*9a0e4156SSadaf Ebrahimi
1595*9a0e4156SSadaf Ebrahimi SStream_concat0(O, Name);
1596*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1597*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1598*9a0e4156SSadaf Ebrahimi uint8_t access;
1599*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1600*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1601*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1602*9a0e4156SSadaf Ebrahimi #endif
1603*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG_MRS;
1604*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Val;
1605*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1606*9a0e4156SSadaf Ebrahimi }
1607*9a0e4156SSadaf Ebrahimi }
1608*9a0e4156SSadaf Ebrahimi
printMSRSystemRegister(MCInst * MI,unsigned OpNo,SStream * O)1609*9a0e4156SSadaf Ebrahimi static void printMSRSystemRegister(MCInst *MI, unsigned OpNo, SStream *O)
1610*9a0e4156SSadaf Ebrahimi {
1611*9a0e4156SSadaf Ebrahimi unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
1612*9a0e4156SSadaf Ebrahimi char Name[128];
1613*9a0e4156SSadaf Ebrahimi
1614*9a0e4156SSadaf Ebrahimi A64SysRegMapper_toString(&AArch64_MSRMapper, Val, Name);
1615*9a0e4156SSadaf Ebrahimi
1616*9a0e4156SSadaf Ebrahimi SStream_concat0(O, Name);
1617*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1618*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1619*9a0e4156SSadaf Ebrahimi uint8_t access;
1620*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1621*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1622*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1623*9a0e4156SSadaf Ebrahimi #endif
1624*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG_MSR;
1625*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = Val;
1626*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1627*9a0e4156SSadaf Ebrahimi }
1628*9a0e4156SSadaf Ebrahimi }
1629*9a0e4156SSadaf Ebrahimi
printSystemPStateField(MCInst * MI,unsigned OpNo,SStream * O)1630*9a0e4156SSadaf Ebrahimi static void printSystemPStateField(MCInst *MI, unsigned OpNo, SStream *O)
1631*9a0e4156SSadaf Ebrahimi {
1632*9a0e4156SSadaf Ebrahimi unsigned Val = (unsigned)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
1633*9a0e4156SSadaf Ebrahimi bool Valid;
1634*9a0e4156SSadaf Ebrahimi const char *Name;
1635*9a0e4156SSadaf Ebrahimi
1636*9a0e4156SSadaf Ebrahimi Name = A64NamedImmMapper_toString(&A64PState_PStateMapper, Val, &Valid);
1637*9a0e4156SSadaf Ebrahimi if (Valid) {
1638*9a0e4156SSadaf Ebrahimi SStream_concat0(O, Name);
1639*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1640*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1641*9a0e4156SSadaf Ebrahimi uint8_t access;
1642*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1643*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1644*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1645*9a0e4156SSadaf Ebrahimi #endif
1646*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_PSTATE;
1647*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].pstate = Val;
1648*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1649*9a0e4156SSadaf Ebrahimi }
1650*9a0e4156SSadaf Ebrahimi } else {
1651*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1652*9a0e4156SSadaf Ebrahimi unsigned char access;
1653*9a0e4156SSadaf Ebrahimi #endif
1654*9a0e4156SSadaf Ebrahimi printInt32Bang(O, Val);
1655*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1656*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1657*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1658*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1659*9a0e4156SSadaf Ebrahimi #endif
1660*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1661*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
1662*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1663*9a0e4156SSadaf Ebrahimi }
1664*9a0e4156SSadaf Ebrahimi }
1665*9a0e4156SSadaf Ebrahimi
printSIMDType10Operand(MCInst * MI,unsigned OpNo,SStream * O)1666*9a0e4156SSadaf Ebrahimi static void printSIMDType10Operand(MCInst *MI, unsigned OpNo, SStream *O)
1667*9a0e4156SSadaf Ebrahimi {
1668*9a0e4156SSadaf Ebrahimi uint8_t RawVal = (uint8_t)MCOperand_getImm(MCInst_getOperand(MI, OpNo));
1669*9a0e4156SSadaf Ebrahimi uint64_t Val = AArch64_AM_decodeAdvSIMDModImmType10(RawVal);
1670*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%#016llx", Val);
1671*9a0e4156SSadaf Ebrahimi if (MI->csh->detail) {
1672*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
1673*9a0e4156SSadaf Ebrahimi unsigned char access;
1674*9a0e4156SSadaf Ebrahimi access = get_op_access(MI->csh, MCInst_getOpcode(MI), MI->ac_idx);
1675*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].access = access;
1676*9a0e4156SSadaf Ebrahimi MI->ac_idx++;
1677*9a0e4156SSadaf Ebrahimi #endif
1678*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;
1679*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = Val;
1680*9a0e4156SSadaf Ebrahimi MI->flat_insn->detail->arm64.op_count++;
1681*9a0e4156SSadaf Ebrahimi }
1682*9a0e4156SSadaf Ebrahimi }
1683*9a0e4156SSadaf Ebrahimi
1684*9a0e4156SSadaf Ebrahimi
1685*9a0e4156SSadaf Ebrahimi #define PRINT_ALIAS_INSTR
1686*9a0e4156SSadaf Ebrahimi #include "AArch64GenAsmWriter.inc"
1687*9a0e4156SSadaf Ebrahimi
AArch64_post_printer(csh handle,cs_insn * flat_insn,char * insn_asm,MCInst * mci)1688*9a0e4156SSadaf Ebrahimi void AArch64_post_printer(csh handle, cs_insn *flat_insn, char *insn_asm, MCInst *mci)
1689*9a0e4156SSadaf Ebrahimi {
1690*9a0e4156SSadaf Ebrahimi if (((cs_struct *)handle)->detail != CS_OPT_ON)
1691*9a0e4156SSadaf Ebrahimi return;
1692*9a0e4156SSadaf Ebrahimi
1693*9a0e4156SSadaf Ebrahimi if (mci->csh->detail) {
1694*9a0e4156SSadaf Ebrahimi unsigned opcode = MCInst_getOpcode(mci);
1695*9a0e4156SSadaf Ebrahimi switch (opcode) {
1696*9a0e4156SSadaf Ebrahimi default:
1697*9a0e4156SSadaf Ebrahimi break;
1698*9a0e4156SSadaf Ebrahimi case AArch64_LD1Fourv16b_POST:
1699*9a0e4156SSadaf Ebrahimi case AArch64_LD1Fourv1d_POST:
1700*9a0e4156SSadaf Ebrahimi case AArch64_LD1Fourv2d_POST:
1701*9a0e4156SSadaf Ebrahimi case AArch64_LD1Fourv2s_POST:
1702*9a0e4156SSadaf Ebrahimi case AArch64_LD1Fourv4h_POST:
1703*9a0e4156SSadaf Ebrahimi case AArch64_LD1Fourv4s_POST:
1704*9a0e4156SSadaf Ebrahimi case AArch64_LD1Fourv8b_POST:
1705*9a0e4156SSadaf Ebrahimi case AArch64_LD1Fourv8h_POST:
1706*9a0e4156SSadaf Ebrahimi case AArch64_LD1Onev16b_POST:
1707*9a0e4156SSadaf Ebrahimi case AArch64_LD1Onev1d_POST:
1708*9a0e4156SSadaf Ebrahimi case AArch64_LD1Onev2d_POST:
1709*9a0e4156SSadaf Ebrahimi case AArch64_LD1Onev2s_POST:
1710*9a0e4156SSadaf Ebrahimi case AArch64_LD1Onev4h_POST:
1711*9a0e4156SSadaf Ebrahimi case AArch64_LD1Onev4s_POST:
1712*9a0e4156SSadaf Ebrahimi case AArch64_LD1Onev8b_POST:
1713*9a0e4156SSadaf Ebrahimi case AArch64_LD1Onev8h_POST:
1714*9a0e4156SSadaf Ebrahimi case AArch64_LD1Rv16b_POST:
1715*9a0e4156SSadaf Ebrahimi case AArch64_LD1Rv1d_POST:
1716*9a0e4156SSadaf Ebrahimi case AArch64_LD1Rv2d_POST:
1717*9a0e4156SSadaf Ebrahimi case AArch64_LD1Rv2s_POST:
1718*9a0e4156SSadaf Ebrahimi case AArch64_LD1Rv4h_POST:
1719*9a0e4156SSadaf Ebrahimi case AArch64_LD1Rv4s_POST:
1720*9a0e4156SSadaf Ebrahimi case AArch64_LD1Rv8b_POST:
1721*9a0e4156SSadaf Ebrahimi case AArch64_LD1Rv8h_POST:
1722*9a0e4156SSadaf Ebrahimi case AArch64_LD1Threev16b_POST:
1723*9a0e4156SSadaf Ebrahimi case AArch64_LD1Threev1d_POST:
1724*9a0e4156SSadaf Ebrahimi case AArch64_LD1Threev2d_POST:
1725*9a0e4156SSadaf Ebrahimi case AArch64_LD1Threev2s_POST:
1726*9a0e4156SSadaf Ebrahimi case AArch64_LD1Threev4h_POST:
1727*9a0e4156SSadaf Ebrahimi case AArch64_LD1Threev4s_POST:
1728*9a0e4156SSadaf Ebrahimi case AArch64_LD1Threev8b_POST:
1729*9a0e4156SSadaf Ebrahimi case AArch64_LD1Threev8h_POST:
1730*9a0e4156SSadaf Ebrahimi case AArch64_LD1Twov16b_POST:
1731*9a0e4156SSadaf Ebrahimi case AArch64_LD1Twov1d_POST:
1732*9a0e4156SSadaf Ebrahimi case AArch64_LD1Twov2d_POST:
1733*9a0e4156SSadaf Ebrahimi case AArch64_LD1Twov2s_POST:
1734*9a0e4156SSadaf Ebrahimi case AArch64_LD1Twov4h_POST:
1735*9a0e4156SSadaf Ebrahimi case AArch64_LD1Twov4s_POST:
1736*9a0e4156SSadaf Ebrahimi case AArch64_LD1Twov8b_POST:
1737*9a0e4156SSadaf Ebrahimi case AArch64_LD1Twov8h_POST:
1738*9a0e4156SSadaf Ebrahimi case AArch64_LD1i16_POST:
1739*9a0e4156SSadaf Ebrahimi case AArch64_LD1i32_POST:
1740*9a0e4156SSadaf Ebrahimi case AArch64_LD1i64_POST:
1741*9a0e4156SSadaf Ebrahimi case AArch64_LD1i8_POST:
1742*9a0e4156SSadaf Ebrahimi case AArch64_LD2Rv16b_POST:
1743*9a0e4156SSadaf Ebrahimi case AArch64_LD2Rv1d_POST:
1744*9a0e4156SSadaf Ebrahimi case AArch64_LD2Rv2d_POST:
1745*9a0e4156SSadaf Ebrahimi case AArch64_LD2Rv2s_POST:
1746*9a0e4156SSadaf Ebrahimi case AArch64_LD2Rv4h_POST:
1747*9a0e4156SSadaf Ebrahimi case AArch64_LD2Rv4s_POST:
1748*9a0e4156SSadaf Ebrahimi case AArch64_LD2Rv8b_POST:
1749*9a0e4156SSadaf Ebrahimi case AArch64_LD2Rv8h_POST:
1750*9a0e4156SSadaf Ebrahimi case AArch64_LD2Twov16b_POST:
1751*9a0e4156SSadaf Ebrahimi case AArch64_LD2Twov2d_POST:
1752*9a0e4156SSadaf Ebrahimi case AArch64_LD2Twov2s_POST:
1753*9a0e4156SSadaf Ebrahimi case AArch64_LD2Twov4h_POST:
1754*9a0e4156SSadaf Ebrahimi case AArch64_LD2Twov4s_POST:
1755*9a0e4156SSadaf Ebrahimi case AArch64_LD2Twov8b_POST:
1756*9a0e4156SSadaf Ebrahimi case AArch64_LD2Twov8h_POST:
1757*9a0e4156SSadaf Ebrahimi case AArch64_LD2i16_POST:
1758*9a0e4156SSadaf Ebrahimi case AArch64_LD2i32_POST:
1759*9a0e4156SSadaf Ebrahimi case AArch64_LD2i64_POST:
1760*9a0e4156SSadaf Ebrahimi case AArch64_LD2i8_POST:
1761*9a0e4156SSadaf Ebrahimi case AArch64_LD3Rv16b_POST:
1762*9a0e4156SSadaf Ebrahimi case AArch64_LD3Rv1d_POST:
1763*9a0e4156SSadaf Ebrahimi case AArch64_LD3Rv2d_POST:
1764*9a0e4156SSadaf Ebrahimi case AArch64_LD3Rv2s_POST:
1765*9a0e4156SSadaf Ebrahimi case AArch64_LD3Rv4h_POST:
1766*9a0e4156SSadaf Ebrahimi case AArch64_LD3Rv4s_POST:
1767*9a0e4156SSadaf Ebrahimi case AArch64_LD3Rv8b_POST:
1768*9a0e4156SSadaf Ebrahimi case AArch64_LD3Rv8h_POST:
1769*9a0e4156SSadaf Ebrahimi case AArch64_LD3Threev16b_POST:
1770*9a0e4156SSadaf Ebrahimi case AArch64_LD3Threev2d_POST:
1771*9a0e4156SSadaf Ebrahimi case AArch64_LD3Threev2s_POST:
1772*9a0e4156SSadaf Ebrahimi case AArch64_LD3Threev4h_POST:
1773*9a0e4156SSadaf Ebrahimi case AArch64_LD3Threev4s_POST:
1774*9a0e4156SSadaf Ebrahimi case AArch64_LD3Threev8b_POST:
1775*9a0e4156SSadaf Ebrahimi case AArch64_LD3Threev8h_POST:
1776*9a0e4156SSadaf Ebrahimi case AArch64_LD3i16_POST:
1777*9a0e4156SSadaf Ebrahimi case AArch64_LD3i32_POST:
1778*9a0e4156SSadaf Ebrahimi case AArch64_LD3i64_POST:
1779*9a0e4156SSadaf Ebrahimi case AArch64_LD3i8_POST:
1780*9a0e4156SSadaf Ebrahimi case AArch64_LD4Fourv16b_POST:
1781*9a0e4156SSadaf Ebrahimi case AArch64_LD4Fourv2d_POST:
1782*9a0e4156SSadaf Ebrahimi case AArch64_LD4Fourv2s_POST:
1783*9a0e4156SSadaf Ebrahimi case AArch64_LD4Fourv4h_POST:
1784*9a0e4156SSadaf Ebrahimi case AArch64_LD4Fourv4s_POST:
1785*9a0e4156SSadaf Ebrahimi case AArch64_LD4Fourv8b_POST:
1786*9a0e4156SSadaf Ebrahimi case AArch64_LD4Fourv8h_POST:
1787*9a0e4156SSadaf Ebrahimi case AArch64_LD4Rv16b_POST:
1788*9a0e4156SSadaf Ebrahimi case AArch64_LD4Rv1d_POST:
1789*9a0e4156SSadaf Ebrahimi case AArch64_LD4Rv2d_POST:
1790*9a0e4156SSadaf Ebrahimi case AArch64_LD4Rv2s_POST:
1791*9a0e4156SSadaf Ebrahimi case AArch64_LD4Rv4h_POST:
1792*9a0e4156SSadaf Ebrahimi case AArch64_LD4Rv4s_POST:
1793*9a0e4156SSadaf Ebrahimi case AArch64_LD4Rv8b_POST:
1794*9a0e4156SSadaf Ebrahimi case AArch64_LD4Rv8h_POST:
1795*9a0e4156SSadaf Ebrahimi case AArch64_LD4i16_POST:
1796*9a0e4156SSadaf Ebrahimi case AArch64_LD4i32_POST:
1797*9a0e4156SSadaf Ebrahimi case AArch64_LD4i64_POST:
1798*9a0e4156SSadaf Ebrahimi case AArch64_LD4i8_POST:
1799*9a0e4156SSadaf Ebrahimi case AArch64_LDPDpost:
1800*9a0e4156SSadaf Ebrahimi case AArch64_LDPDpre:
1801*9a0e4156SSadaf Ebrahimi case AArch64_LDPQpost:
1802*9a0e4156SSadaf Ebrahimi case AArch64_LDPQpre:
1803*9a0e4156SSadaf Ebrahimi case AArch64_LDPSWpost:
1804*9a0e4156SSadaf Ebrahimi case AArch64_LDPSWpre:
1805*9a0e4156SSadaf Ebrahimi case AArch64_LDPSpost:
1806*9a0e4156SSadaf Ebrahimi case AArch64_LDPSpre:
1807*9a0e4156SSadaf Ebrahimi case AArch64_LDPWpost:
1808*9a0e4156SSadaf Ebrahimi case AArch64_LDPWpre:
1809*9a0e4156SSadaf Ebrahimi case AArch64_LDPXpost:
1810*9a0e4156SSadaf Ebrahimi case AArch64_LDPXpre:
1811*9a0e4156SSadaf Ebrahimi case AArch64_LDRBBpost:
1812*9a0e4156SSadaf Ebrahimi case AArch64_LDRBBpre:
1813*9a0e4156SSadaf Ebrahimi case AArch64_LDRBpost:
1814*9a0e4156SSadaf Ebrahimi case AArch64_LDRBpre:
1815*9a0e4156SSadaf Ebrahimi case AArch64_LDRDpost:
1816*9a0e4156SSadaf Ebrahimi case AArch64_LDRDpre:
1817*9a0e4156SSadaf Ebrahimi case AArch64_LDRHHpost:
1818*9a0e4156SSadaf Ebrahimi case AArch64_LDRHHpre:
1819*9a0e4156SSadaf Ebrahimi case AArch64_LDRHpost:
1820*9a0e4156SSadaf Ebrahimi case AArch64_LDRHpre:
1821*9a0e4156SSadaf Ebrahimi case AArch64_LDRQpost:
1822*9a0e4156SSadaf Ebrahimi case AArch64_LDRQpre:
1823*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBWpost:
1824*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBWpre:
1825*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBXpost:
1826*9a0e4156SSadaf Ebrahimi case AArch64_LDRSBXpre:
1827*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHWpost:
1828*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHWpre:
1829*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHXpost:
1830*9a0e4156SSadaf Ebrahimi case AArch64_LDRSHXpre:
1831*9a0e4156SSadaf Ebrahimi case AArch64_LDRSWpost:
1832*9a0e4156SSadaf Ebrahimi case AArch64_LDRSWpre:
1833*9a0e4156SSadaf Ebrahimi case AArch64_LDRSpost:
1834*9a0e4156SSadaf Ebrahimi case AArch64_LDRSpre:
1835*9a0e4156SSadaf Ebrahimi case AArch64_LDRWpost:
1836*9a0e4156SSadaf Ebrahimi case AArch64_LDRWpre:
1837*9a0e4156SSadaf Ebrahimi case AArch64_LDRXpost:
1838*9a0e4156SSadaf Ebrahimi case AArch64_LDRXpre:
1839*9a0e4156SSadaf Ebrahimi case AArch64_ST1Fourv16b_POST:
1840*9a0e4156SSadaf Ebrahimi case AArch64_ST1Fourv1d_POST:
1841*9a0e4156SSadaf Ebrahimi case AArch64_ST1Fourv2d_POST:
1842*9a0e4156SSadaf Ebrahimi case AArch64_ST1Fourv2s_POST:
1843*9a0e4156SSadaf Ebrahimi case AArch64_ST1Fourv4h_POST:
1844*9a0e4156SSadaf Ebrahimi case AArch64_ST1Fourv4s_POST:
1845*9a0e4156SSadaf Ebrahimi case AArch64_ST1Fourv8b_POST:
1846*9a0e4156SSadaf Ebrahimi case AArch64_ST1Fourv8h_POST:
1847*9a0e4156SSadaf Ebrahimi case AArch64_ST1Onev16b_POST:
1848*9a0e4156SSadaf Ebrahimi case AArch64_ST1Onev1d_POST:
1849*9a0e4156SSadaf Ebrahimi case AArch64_ST1Onev2d_POST:
1850*9a0e4156SSadaf Ebrahimi case AArch64_ST1Onev2s_POST:
1851*9a0e4156SSadaf Ebrahimi case AArch64_ST1Onev4h_POST:
1852*9a0e4156SSadaf Ebrahimi case AArch64_ST1Onev4s_POST:
1853*9a0e4156SSadaf Ebrahimi case AArch64_ST1Onev8b_POST:
1854*9a0e4156SSadaf Ebrahimi case AArch64_ST1Onev8h_POST:
1855*9a0e4156SSadaf Ebrahimi case AArch64_ST1Threev16b_POST:
1856*9a0e4156SSadaf Ebrahimi case AArch64_ST1Threev1d_POST:
1857*9a0e4156SSadaf Ebrahimi case AArch64_ST1Threev2d_POST:
1858*9a0e4156SSadaf Ebrahimi case AArch64_ST1Threev2s_POST:
1859*9a0e4156SSadaf Ebrahimi case AArch64_ST1Threev4h_POST:
1860*9a0e4156SSadaf Ebrahimi case AArch64_ST1Threev4s_POST:
1861*9a0e4156SSadaf Ebrahimi case AArch64_ST1Threev8b_POST:
1862*9a0e4156SSadaf Ebrahimi case AArch64_ST1Threev8h_POST:
1863*9a0e4156SSadaf Ebrahimi case AArch64_ST1Twov16b_POST:
1864*9a0e4156SSadaf Ebrahimi case AArch64_ST1Twov1d_POST:
1865*9a0e4156SSadaf Ebrahimi case AArch64_ST1Twov2d_POST:
1866*9a0e4156SSadaf Ebrahimi case AArch64_ST1Twov2s_POST:
1867*9a0e4156SSadaf Ebrahimi case AArch64_ST1Twov4h_POST:
1868*9a0e4156SSadaf Ebrahimi case AArch64_ST1Twov4s_POST:
1869*9a0e4156SSadaf Ebrahimi case AArch64_ST1Twov8b_POST:
1870*9a0e4156SSadaf Ebrahimi case AArch64_ST1Twov8h_POST:
1871*9a0e4156SSadaf Ebrahimi case AArch64_ST1i16_POST:
1872*9a0e4156SSadaf Ebrahimi case AArch64_ST1i32_POST:
1873*9a0e4156SSadaf Ebrahimi case AArch64_ST1i64_POST:
1874*9a0e4156SSadaf Ebrahimi case AArch64_ST1i8_POST:
1875*9a0e4156SSadaf Ebrahimi case AArch64_ST2Twov16b_POST:
1876*9a0e4156SSadaf Ebrahimi case AArch64_ST2Twov2d_POST:
1877*9a0e4156SSadaf Ebrahimi case AArch64_ST2Twov2s_POST:
1878*9a0e4156SSadaf Ebrahimi case AArch64_ST2Twov4h_POST:
1879*9a0e4156SSadaf Ebrahimi case AArch64_ST2Twov4s_POST:
1880*9a0e4156SSadaf Ebrahimi case AArch64_ST2Twov8b_POST:
1881*9a0e4156SSadaf Ebrahimi case AArch64_ST2Twov8h_POST:
1882*9a0e4156SSadaf Ebrahimi case AArch64_ST2i16_POST:
1883*9a0e4156SSadaf Ebrahimi case AArch64_ST2i32_POST:
1884*9a0e4156SSadaf Ebrahimi case AArch64_ST2i64_POST:
1885*9a0e4156SSadaf Ebrahimi case AArch64_ST2i8_POST:
1886*9a0e4156SSadaf Ebrahimi case AArch64_ST3Threev16b_POST:
1887*9a0e4156SSadaf Ebrahimi case AArch64_ST3Threev2d_POST:
1888*9a0e4156SSadaf Ebrahimi case AArch64_ST3Threev2s_POST:
1889*9a0e4156SSadaf Ebrahimi case AArch64_ST3Threev4h_POST:
1890*9a0e4156SSadaf Ebrahimi case AArch64_ST3Threev4s_POST:
1891*9a0e4156SSadaf Ebrahimi case AArch64_ST3Threev8b_POST:
1892*9a0e4156SSadaf Ebrahimi case AArch64_ST3Threev8h_POST:
1893*9a0e4156SSadaf Ebrahimi case AArch64_ST3i16_POST:
1894*9a0e4156SSadaf Ebrahimi case AArch64_ST3i32_POST:
1895*9a0e4156SSadaf Ebrahimi case AArch64_ST3i64_POST:
1896*9a0e4156SSadaf Ebrahimi case AArch64_ST3i8_POST:
1897*9a0e4156SSadaf Ebrahimi case AArch64_ST4Fourv16b_POST:
1898*9a0e4156SSadaf Ebrahimi case AArch64_ST4Fourv2d_POST:
1899*9a0e4156SSadaf Ebrahimi case AArch64_ST4Fourv2s_POST:
1900*9a0e4156SSadaf Ebrahimi case AArch64_ST4Fourv4h_POST:
1901*9a0e4156SSadaf Ebrahimi case AArch64_ST4Fourv4s_POST:
1902*9a0e4156SSadaf Ebrahimi case AArch64_ST4Fourv8b_POST:
1903*9a0e4156SSadaf Ebrahimi case AArch64_ST4Fourv8h_POST:
1904*9a0e4156SSadaf Ebrahimi case AArch64_ST4i16_POST:
1905*9a0e4156SSadaf Ebrahimi case AArch64_ST4i32_POST:
1906*9a0e4156SSadaf Ebrahimi case AArch64_ST4i64_POST:
1907*9a0e4156SSadaf Ebrahimi case AArch64_ST4i8_POST:
1908*9a0e4156SSadaf Ebrahimi case AArch64_STPDpost:
1909*9a0e4156SSadaf Ebrahimi case AArch64_STPDpre:
1910*9a0e4156SSadaf Ebrahimi case AArch64_STPQpost:
1911*9a0e4156SSadaf Ebrahimi case AArch64_STPQpre:
1912*9a0e4156SSadaf Ebrahimi case AArch64_STPSpost:
1913*9a0e4156SSadaf Ebrahimi case AArch64_STPSpre:
1914*9a0e4156SSadaf Ebrahimi case AArch64_STPWpost:
1915*9a0e4156SSadaf Ebrahimi case AArch64_STPWpre:
1916*9a0e4156SSadaf Ebrahimi case AArch64_STPXpost:
1917*9a0e4156SSadaf Ebrahimi case AArch64_STPXpre:
1918*9a0e4156SSadaf Ebrahimi case AArch64_STRBBpost:
1919*9a0e4156SSadaf Ebrahimi case AArch64_STRBBpre:
1920*9a0e4156SSadaf Ebrahimi case AArch64_STRBpost:
1921*9a0e4156SSadaf Ebrahimi case AArch64_STRBpre:
1922*9a0e4156SSadaf Ebrahimi case AArch64_STRDpost:
1923*9a0e4156SSadaf Ebrahimi case AArch64_STRDpre:
1924*9a0e4156SSadaf Ebrahimi case AArch64_STRHHpost:
1925*9a0e4156SSadaf Ebrahimi case AArch64_STRHHpre:
1926*9a0e4156SSadaf Ebrahimi case AArch64_STRHpost:
1927*9a0e4156SSadaf Ebrahimi case AArch64_STRHpre:
1928*9a0e4156SSadaf Ebrahimi case AArch64_STRQpost:
1929*9a0e4156SSadaf Ebrahimi case AArch64_STRQpre:
1930*9a0e4156SSadaf Ebrahimi case AArch64_STRSpost:
1931*9a0e4156SSadaf Ebrahimi case AArch64_STRSpre:
1932*9a0e4156SSadaf Ebrahimi case AArch64_STRWpost:
1933*9a0e4156SSadaf Ebrahimi case AArch64_STRWpre:
1934*9a0e4156SSadaf Ebrahimi case AArch64_STRXpost:
1935*9a0e4156SSadaf Ebrahimi case AArch64_STRXpre:
1936*9a0e4156SSadaf Ebrahimi flat_insn->detail->arm64.writeback = true;
1937*9a0e4156SSadaf Ebrahimi break;
1938*9a0e4156SSadaf Ebrahimi }
1939*9a0e4156SSadaf Ebrahimi }
1940*9a0e4156SSadaf Ebrahimi }
1941*9a0e4156SSadaf Ebrahimi
1942*9a0e4156SSadaf Ebrahimi #endif
1943