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