Coverage Report

Created: 2025-11-16 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/capstonenext/arch/AArch64/AArch64Disassembler.c
Line
Count
Source
1
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
2
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
3
/*    Rot127 <unisono@quyllur.org> 2022-2023 */
4
/* Automatically translated source file from LLVM. */
5
6
/* LLVM-commit: <commit> */
7
/* LLVM-tag: <tag> */
8
9
/* Only small edits allowed. */
10
/* For multiple similar edits, please create a Patch for the translator. */
11
12
/* Capstone's C++ file translator: */
13
/* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */
14
15
//===- AArch64Disassembler.cpp - Disassembler for AArch64 -----------------===//
16
//
17
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
18
// See https://llvm.org/LICENSE.txt for license information.
19
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
20
//
21
//===----------------------------------------------------------------------===//
22
//
23
//
24
//===----------------------------------------------------------------------===//
25
26
#include <stdio.h>
27
#include <string.h>
28
#include <stdlib.h>
29
#include <capstone/platform.h>
30
31
#include "../../MCFixedLenDisassembler.h"
32
#include "../../MCInst.h"
33
#include "../../MCInstrDesc.h"
34
#include "../../MCRegisterInfo.h"
35
#include "../../LEB128.h"
36
#include "../../MCDisassembler.h"
37
#include "../../cs_priv.h"
38
#include "../../utils.h"
39
#include "AArch64AddressingModes.h"
40
#include "AArch64BaseInfo.h"
41
#include "AArch64DisassemblerExtension.h"
42
#include "AArch64Linkage.h"
43
#include "AArch64Mapping.h"
44
45
#define GET_INSTRINFO_MC_DESC
46
#include "AArch64GenInstrInfo.inc"
47
48
3.69k
#define CONCAT(a, b) CONCAT_(a, b)
49
3.69k
#define CONCAT_(a, b) a##_##b
50
51
#define DEBUG_TYPE "aarch64-disassembler"
52
53
// Pull DecodeStatus and its enum values into the global namespace.
54
55
// Forward declare these because the autogenerated code will reference them.
56
// Definitions are further down.
57
static DecodeStatus DecodeFPR128RegisterClass(MCInst *Inst, unsigned RegNo,
58
                uint64_t Address,
59
                const void *Decoder);
60
static DecodeStatus DecodeFPR128_loRegisterClass(MCInst *Inst, unsigned RegNo,
61
             uint64_t Address,
62
             const void *Decoder);
63
static DecodeStatus DecodeFPR128_0to7RegisterClass(MCInst *Inst, unsigned RegNo,
64
               uint64_t Address,
65
               const void *Decoder);
66
static DecodeStatus DecodeFPR64RegisterClass(MCInst *Inst, unsigned RegNo,
67
               uint64_t Address,
68
               const void *Decoder);
69
static DecodeStatus DecodeFPR32RegisterClass(MCInst *Inst, unsigned RegNo,
70
               uint64_t Address,
71
               const void *Decoder);
72
static DecodeStatus DecodeFPR16RegisterClass(MCInst *Inst, unsigned RegNo,
73
               uint64_t Address,
74
               const void *Decoder);
75
static DecodeStatus DecodeFPR8RegisterClass(MCInst *Inst, unsigned RegNo,
76
              uint64_t Address,
77
              const void *Decoder);
78
static DecodeStatus DecodeGPR64commonRegisterClass(MCInst *Inst, unsigned RegNo,
79
               uint64_t Address,
80
               const void *Decoder);
81
static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst, unsigned RegNo,
82
               uint64_t Address,
83
               const void *Decoder);
84
static DecodeStatus DecodeGPR64x8ClassRegisterClass(MCInst *Inst,
85
                unsigned RegNo,
86
                uint64_t Address,
87
                const void *Decoder);
88
static DecodeStatus DecodeGPR64spRegisterClass(MCInst *Inst, unsigned RegNo,
89
                 uint64_t Address,
90
                 const void *Decoder);
91
static DecodeStatus
92
DecodeMatrixIndexGPR32_8_11RegisterClass(MCInst *Inst, unsigned RegNo,
93
           uint64_t Address, const void *Decoder);
94
static DecodeStatus DecodeMatrixIndexGPR32_12_15RegisterClass(
95
  MCInst *Inst, unsigned RegNo, uint64_t Address, const void *Decoder);
96
static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst, unsigned RegNo,
97
               uint64_t Address,
98
               const void *Decoder);
99
static DecodeStatus DecodeGPR32spRegisterClass(MCInst *Inst, unsigned RegNo,
100
                 uint64_t Address,
101
                 const void *Decoder);
102
static DecodeStatus DecodeQQRegisterClass(MCInst *Inst, unsigned RegNo,
103
            uint64_t Address,
104
            const void *Decoder);
105
static DecodeStatus DecodeQQQRegisterClass(MCInst *Inst, unsigned RegNo,
106
             uint64_t Address,
107
             const void *Decoder);
108
static DecodeStatus DecodeQQQQRegisterClass(MCInst *Inst, unsigned RegNo,
109
              uint64_t Address,
110
              const void *Decoder);
111
static DecodeStatus DecodeDDRegisterClass(MCInst *Inst, unsigned RegNo,
112
            uint64_t Address,
113
            const void *Decoder);
114
static DecodeStatus DecodeDDDRegisterClass(MCInst *Inst, unsigned RegNo,
115
             uint64_t Address,
116
             const void *Decoder);
117
static DecodeStatus DecodeDDDDRegisterClass(MCInst *Inst, unsigned RegNo,
118
              uint64_t Address,
119
              const void *Decoder);
120
static DecodeStatus DecodeZPRRegisterClass(MCInst *Inst, unsigned RegNo,
121
             uint64_t Address,
122
             const void *Decoder);
123
static DecodeStatus DecodeZPR_4bRegisterClass(MCInst *Inst, unsigned RegNo,
124
                uint64_t Address,
125
                const void *Decoder);
126
static DecodeStatus DecodeZPR_3bRegisterClass(MCInst *Inst, unsigned RegNo,
127
                uint64_t Address,
128
                const void *Decoder);
129
static DecodeStatus DecodeZPR2RegisterClass(MCInst *Inst, unsigned RegNo,
130
              uint64_t Address,
131
              const void *Decoder);
132
static DecodeStatus DecodeZPR3RegisterClass(MCInst *Inst, unsigned RegNo,
133
              uint64_t Address,
134
              const void *Decoder);
135
static DecodeStatus DecodeZPR4RegisterClass(MCInst *Inst, unsigned RegNo,
136
              uint64_t Address,
137
              const void *Decoder);
138
static DecodeStatus DecodeZPR2Mul2RegisterClass(MCInst *Inst, unsigned RegNo,
139
            uint64_t Address,
140
            const void *Decoder);
141
static DecodeStatus DecodeZPR4Mul4RegisterClass(MCInst *Inst, unsigned RegNo,
142
            uint64_t Address,
143
            const void *Decoder);
144
static DecodeStatus DecodeZPR2StridedRegisterClass(MCInst *Inst, unsigned RegNo,
145
               uint64_t Address,
146
               const void *Decoder);
147
static DecodeStatus DecodeZPR4StridedRegisterClass(MCInst *Inst, unsigned RegNo,
148
               uint64_t Address,
149
               const void *Decoder);
150
#define DECLARE_DecodeMatrixTile(NumBitsForTile) \
151
  static DecodeStatus CONCAT(DecodeMatrixTile, NumBitsForTile)( \
152
    MCInst * Inst, unsigned RegNo, uint64_t Address, \
153
    const void *Decoder);
154
DECLARE_DecodeMatrixTile(2);
155
DECLARE_DecodeMatrixTile(1);
156
DECLARE_DecodeMatrixTile(3);
157
DECLARE_DecodeMatrixTile(4);
158
159
static DecodeStatus DecodeMatrixTileListRegisterClass(MCInst *Inst,
160
                  unsigned RegMask,
161
                  uint64_t Address,
162
                  const void *Decoder);
163
static DecodeStatus DecodePPRRegisterClass(MCInst *Inst, unsigned RegNo,
164
             uint64_t Address,
165
             const void *Decoder);
166
static DecodeStatus DecodePNRRegisterClass(MCInst *Inst, unsigned RegNo,
167
             uint64_t Address,
168
             const void *Decoder);
169
static DecodeStatus DecodePPR_3bRegisterClass(MCInst *Inst, unsigned RegNo,
170
                uint64_t Address,
171
                const void *Decoder);
172
static DecodeStatus DecodePNR_p8to15RegisterClass(MCInst *Inst, unsigned RegNo,
173
              uint64_t Address,
174
              const void *Decoder);
175
static DecodeStatus DecodePPR2RegisterClass(MCInst *Inst, unsigned RegNo,
176
              uint64_t Address,
177
              const void *Decoder);
178
static DecodeStatus DecodePPR2Mul2RegisterClass(MCInst *Inst, unsigned RegNo,
179
            uint64_t Address,
180
            const void *Decoder);
181
182
static DecodeStatus DecodeFixedPointScaleImm32(MCInst *Inst, unsigned Imm,
183
                 uint64_t Address,
184
                 const void *Decoder);
185
static DecodeStatus DecodeFixedPointScaleImm64(MCInst *Inst, unsigned Imm,
186
                 uint64_t Address,
187
                 const void *Decoder);
188
static DecodeStatus DecodePCRelLabel16(MCInst *Inst, unsigned Imm,
189
               uint64_t Address, const void *Decoder);
190
static DecodeStatus DecodePCRelLabel19(MCInst *Inst, unsigned Imm,
191
               uint64_t Address, const void *Decoder);
192
static DecodeStatus DecodeMemExtend(MCInst *Inst, unsigned Imm,
193
            uint64_t Address, const void *Decoder);
194
static DecodeStatus DecodeMRSSystemRegister(MCInst *Inst, unsigned Imm,
195
              uint64_t Address,
196
              const void *Decoder);
197
static DecodeStatus DecodeMSRSystemRegister(MCInst *Inst, unsigned Imm,
198
              uint64_t Address,
199
              const void *Decoder);
200
static DecodeStatus DecodeThreeAddrSRegInstruction(MCInst *Inst, uint32_t insn,
201
               uint64_t Address,
202
               const void *Decoder);
203
static DecodeStatus DecodeMoveImmInstruction(MCInst *Inst, uint32_t insn,
204
               uint64_t Address,
205
               const void *Decoder);
206
static DecodeStatus DecodeUnsignedLdStInstruction(MCInst *Inst, uint32_t insn,
207
              uint64_t Address,
208
              const void *Decoder);
209
static DecodeStatus DecodeSignedLdStInstruction(MCInst *Inst, uint32_t insn,
210
            uint64_t Address,
211
            const void *Decoder);
212
static DecodeStatus DecodeExclusiveLdStInstruction(MCInst *Inst, uint32_t insn,
213
               uint64_t Address,
214
               const void *Decoder);
215
static DecodeStatus DecodePairLdStInstruction(MCInst *Inst, uint32_t insn,
216
                uint64_t Address,
217
                const void *Decoder);
218
static DecodeStatus DecodeAuthLoadInstruction(MCInst *Inst, uint32_t insn,
219
                uint64_t Address,
220
                const void *Decoder);
221
static DecodeStatus DecodeAddSubERegInstruction(MCInst *Inst, uint32_t insn,
222
            uint64_t Address,
223
            const void *Decoder);
224
static DecodeStatus DecodeLogicalImmInstruction(MCInst *Inst, uint32_t insn,
225
            uint64_t Address,
226
            const void *Decoder);
227
static DecodeStatus DecodeModImmInstruction(MCInst *Inst, uint32_t insn,
228
              uint64_t Address,
229
              const void *Decoder);
230
static DecodeStatus DecodeModImmTiedInstruction(MCInst *Inst, uint32_t insn,
231
            uint64_t Address,
232
            const void *Decoder);
233
static DecodeStatus DecodeAdrInstruction(MCInst *Inst, uint32_t insn,
234
           uint64_t Address, const void *Decoder);
235
static DecodeStatus DecodeAddSubImmShift(MCInst *Inst, uint32_t insn,
236
           uint64_t Address, const void *Decoder);
237
static DecodeStatus DecodeUnconditionalBranch(MCInst *Inst, uint32_t insn,
238
                uint64_t Address,
239
                const void *Decoder);
240
static DecodeStatus DecodeSystemPStateImm0_15Instruction(MCInst *Inst,
241
               uint32_t insn,
242
               uint64_t Address,
243
               const void *Decoder);
244
static DecodeStatus DecodeSystemPStateImm0_1Instruction(MCInst *Inst,
245
              uint32_t insn,
246
              uint64_t Address,
247
              const void *Decoder);
248
static DecodeStatus DecodeTestAndBranch(MCInst *Inst, uint32_t insn,
249
          uint64_t Address, const void *Decoder);
250
251
static DecodeStatus DecodeFMOVLaneInstruction(MCInst *Inst, unsigned Insn,
252
                uint64_t Address,
253
                const void *Decoder);
254
static DecodeStatus DecodeVecShiftR64Imm(MCInst *Inst, unsigned Imm,
255
           uint64_t Addr, const void *Decoder);
256
static DecodeStatus DecodeVecShiftR64ImmNarrow(MCInst *Inst, unsigned Imm,
257
                 uint64_t Addr,
258
                 const void *Decoder);
259
static DecodeStatus DecodeVecShiftR32Imm(MCInst *Inst, unsigned Imm,
260
           uint64_t Addr, const void *Decoder);
261
static DecodeStatus DecodeVecShiftR32ImmNarrow(MCInst *Inst, unsigned Imm,
262
                 uint64_t Addr,
263
                 const void *Decoder);
264
static DecodeStatus DecodeVecShiftR16Imm(MCInst *Inst, unsigned Imm,
265
           uint64_t Addr, const void *Decoder);
266
static DecodeStatus DecodeVecShiftR16ImmNarrow(MCInst *Inst, unsigned Imm,
267
                 uint64_t Addr,
268
                 const void *Decoder);
269
static DecodeStatus DecodeVecShiftR8Imm(MCInst *Inst, unsigned Imm,
270
          uint64_t Addr, const void *Decoder);
271
static DecodeStatus DecodeVecShiftL64Imm(MCInst *Inst, unsigned Imm,
272
           uint64_t Addr, const void *Decoder);
273
static DecodeStatus DecodeVecShiftL32Imm(MCInst *Inst, unsigned Imm,
274
           uint64_t Addr, const void *Decoder);
275
static DecodeStatus DecodeVecShiftL16Imm(MCInst *Inst, unsigned Imm,
276
           uint64_t Addr, const void *Decoder);
277
static DecodeStatus DecodeVecShiftL8Imm(MCInst *Inst, unsigned Imm,
278
          uint64_t Addr, const void *Decoder);
279
static DecodeStatus DecodeWSeqPairsClassRegisterClass(MCInst *Inst,
280
                  unsigned RegNo,
281
                  uint64_t Addr,
282
                  const void *Decoder);
283
static DecodeStatus DecodeXSeqPairsClassRegisterClass(MCInst *Inst,
284
                  unsigned RegNo,
285
                  uint64_t Addr,
286
                  const void *Decoder);
287
static DecodeStatus DecodeSyspXzrInstruction(MCInst *Inst, uint32_t insn,
288
               uint64_t Addr,
289
               const void *Decoder);
290
static DecodeStatus DecodeSVELogicalImmInstruction(MCInst *Inst, uint32_t insn,
291
               uint64_t Address,
292
               const void *Decoder);
293
#define DECLARE_DecodeSImm(Bits) \
294
  static DecodeStatus CONCAT(DecodeSImm, Bits)(MCInst * Inst, \
295
                 uint64_t Imm, \
296
                 uint64_t Address, \
297
                 const void *Decoder);
298
DECLARE_DecodeSImm(4);
299
DECLARE_DecodeSImm(5);
300
DECLARE_DecodeSImm(6);
301
DECLARE_DecodeSImm(8);
302
DECLARE_DecodeSImm(9);
303
DECLARE_DecodeSImm(10);
304
305
#define DECLARE_DecodeImm8OptLsl(ElementWidth) \
306
  static DecodeStatus CONCAT(DecodeImm8OptLsl, ElementWidth)( \
307
    MCInst * Inst, unsigned Imm, uint64_t Addr, \
308
    const void *Decoder);
309
DECLARE_DecodeImm8OptLsl(8);
310
DECLARE_DecodeImm8OptLsl(16);
311
DECLARE_DecodeImm8OptLsl(32);
312
DECLARE_DecodeImm8OptLsl(64);
313
314
static DecodeStatus DecodeSVEIncDecImm(MCInst *Inst, unsigned Imm,
315
               uint64_t Addr, const void *Decoder);
316
static DecodeStatus DecodeSVCROp(MCInst *Inst, unsigned Imm, uint64_t Address,
317
         const void *Decoder);
318
static DecodeStatus DecodeCPYMemOpInstruction(MCInst *Inst, uint32_t insn,
319
                uint64_t Addr,
320
                const void *Decoder);
321
static DecodeStatus DecodeSETMemOpInstruction(MCInst *Inst, uint32_t insn,
322
                uint64_t Addr,
323
                const void *Decoder);
324
static DecodeStatus DecodePRFMRegInstruction(MCInst *Inst, uint32_t insn,
325
               uint64_t Address,
326
               const void *Decoder);
327
328
#include "AArch64GenDisassemblerTables.inc"
329
330
2.11M
#define Success MCDisassembler_Success
331
8.58k
#define Fail MCDisassembler_Fail
332
2.27k
#define SoftFail MCDisassembler_SoftFail
333
334
static DecodeStatus getInstruction(csh handle, const uint8_t *Bytes,
335
           size_t ByteLen, MCInst *MI, uint16_t *Size,
336
           uint64_t Address, void *Info)
337
378k
{
338
378k
  *Size = 0;
339
  // We want to read exactly 4 bytes of data.
340
378k
  if (ByteLen < 4)
341
4.04k
    return Fail;
342
374k
  *Size = 4;
343
344
  // Encoded as a small-endian 32-bit word in the stream.
345
374k
  uint32_t Insn = readBytes32(MI, Bytes);
346
347
374k
  const uint8_t *Tables[] = { DecoderTable32, DecoderTableFallback32 };
348
349
388k
  for (int i = 0; i < (sizeof(Tables) / sizeof(Tables[0])); ++i) {
350
385k
    void *Decoder = NULL;
351
385k
    DecodeStatus Result = decodeInstruction_4(Tables[i], MI, Insn,
352
385k
                Address, Decoder);
353
354
    // Table is indexed backwards
355
385k
    const MCInstrDesc Desc =
356
385k
      AArch64Descs.Insts[ARR_SIZE(AArch64Descs.Insts) - 1 -
357
385k
             MCInst_getOpcode(MI)];
358
359
    // For Scalable Matrix Extension (SME) instructions that have an
360
    // implicit operand for the accumulator (ZA) or implicit immediate zero
361
    // which isn't encoded, manually insert operand.
362
1.72M
    for (unsigned j = 0; j < Desc.NumOperands; j++) {
363
1.33M
      if (Desc.OpInfo[j].OperandType ==
364
1.33M
          MCOI_OPERAND_REGISTER) {
365
971k
        switch (Desc.OpInfo[j].RegClass) {
366
947k
        default:
367
947k
          break;
368
947k
        case AArch64_MPRRegClassID:
369
16.3k
          MCInst_insert0(MI, j,
370
16.3k
                   MCOperand_CreateReg1(
371
16.3k
                     MI, AArch64_ZA));
372
16.3k
          break;
373
5.26k
        case AArch64_MPR8RegClassID:
374
5.26k
          MCInst_insert0(MI, j,
375
5.26k
                   MCOperand_CreateReg1(
376
5.26k
                     MI,
377
5.26k
                     AArch64_ZAB0));
378
5.26k
          break;
379
2.14k
        case AArch64_ZTRRegClassID:
380
2.14k
          MCInst_insert0(MI, j,
381
2.14k
                   MCOperand_CreateReg1(
382
2.14k
                     MI,
383
2.14k
                     AArch64_ZT0));
384
2.14k
          break;
385
971k
        }
386
971k
      } else if (Desc.OpInfo[j].OperandType ==
387
367k
           AARCH64_OP_IMPLICIT_IMM_0) {
388
2.70k
        MCInst_insert0(MI, j,
389
2.70k
                 MCOperand_CreateImm1(MI, 0));
390
2.70k
      }
391
1.33M
    }
392
393
385k
    if (MCInst_getOpcode(MI) == AArch64_LDR_ZA ||
394
384k
        MCInst_getOpcode(MI) == AArch64_STR_ZA) {
395
      // Spill and fill instructions have a single immediate used for both
396
      // the vector select offset and optional memory offset. Replicate
397
      // the decoded immediate.
398
571
      MCOperand *Imm4Op = MCInst_getOperand(MI, (2));
399
400
571
      MCInst_addOperand2(MI, (Imm4Op));
401
571
    }
402
403
385k
    if (Result != MCDisassembler_Fail)
404
371k
      return Result;
405
385k
  }
406
407
3.43k
  return MCDisassembler_Fail;
408
374k
}
409
410
DecodeStatus AArch64_LLVM_getInstruction(csh handle, const uint8_t *Bytes,
411
           size_t ByteLen, MCInst *MI,
412
           uint16_t *Size, uint64_t Address,
413
           void *Info)
414
378k
{
415
378k
  DecodeStatus Result = MCDisassembler_Fail;
416
378k
  Result =
417
378k
    getInstruction(handle, Bytes, ByteLen, MI, Size, Address, Info);
418
378k
  MCInst_handleWriteback(MI, AArch64Descs.Insts,
419
378k
             ARR_SIZE(AArch64Descs.Insts));
420
378k
  return Result;
421
378k
}
422
423
uint64_t suggestBytesToSkip(const uint8_t *Bytes, uint64_t Address)
424
0
{
425
  // AArch64 instructions are always 4 bytes wide, so there's no point
426
  // in skipping any smaller number of bytes if an instruction can't
427
  // be decoded.
428
0
  return 4;
429
0
}
430
431
static DecodeStatus DecodeFPR128RegisterClass(MCInst *Inst, unsigned RegNo,
432
                uint64_t Addr,
433
                const void *Decoder)
434
173k
{
435
173k
  if (RegNo > 31)
436
0
    return Fail;
437
438
173k
  unsigned Register = AArch64MCRegisterClasses[AArch64_FPR128RegClassID]
439
173k
            .RegsBegin[RegNo];
440
173k
  MCOperand_CreateReg0(Inst, (Register));
441
173k
  return Success;
442
173k
}
443
444
static DecodeStatus DecodeFPR128_loRegisterClass(MCInst *Inst, unsigned RegNo,
445
             uint64_t Addr,
446
             const void *Decoder)
447
3.43k
{
448
3.43k
  if (RegNo > 15)
449
0
    return Fail;
450
3.43k
  return DecodeFPR128RegisterClass(Inst, RegNo, Addr, Decoder);
451
3.43k
}
452
453
static DecodeStatus DecodeFPR128_0to7RegisterClass(MCInst *Inst, unsigned RegNo,
454
               uint64_t Addr,
455
               const void *Decoder)
456
105
{
457
105
  if (RegNo > 7)
458
0
    return Fail;
459
105
  return DecodeFPR128RegisterClass(Inst, RegNo, Addr, Decoder);
460
105
}
461
462
static DecodeStatus DecodeFPR64RegisterClass(MCInst *Inst, unsigned RegNo,
463
               uint64_t Addr, const void *Decoder)
464
107k
{
465
107k
  if (RegNo > 31)
466
0
    return Fail;
467
468
107k
  unsigned Register = AArch64MCRegisterClasses[AArch64_FPR64RegClassID]
469
107k
            .RegsBegin[RegNo];
470
107k
  MCOperand_CreateReg0(Inst, (Register));
471
107k
  return Success;
472
107k
}
473
474
static DecodeStatus DecodeFPR32RegisterClass(MCInst *Inst, unsigned RegNo,
475
               uint64_t Addr, const void *Decoder)
476
40.4k
{
477
40.4k
  if (RegNo > 31)
478
0
    return Fail;
479
480
40.4k
  unsigned Register = AArch64MCRegisterClasses[AArch64_FPR32RegClassID]
481
40.4k
            .RegsBegin[RegNo];
482
40.4k
  MCOperand_CreateReg0(Inst, (Register));
483
40.4k
  return Success;
484
40.4k
}
485
486
static DecodeStatus DecodeFPR16RegisterClass(MCInst *Inst, unsigned RegNo,
487
               uint64_t Addr, const void *Decoder)
488
25.5k
{
489
25.5k
  if (RegNo > 31)
490
0
    return Fail;
491
492
25.5k
  unsigned Register = AArch64MCRegisterClasses[AArch64_FPR16RegClassID]
493
25.5k
            .RegsBegin[RegNo];
494
25.5k
  MCOperand_CreateReg0(Inst, (Register));
495
25.5k
  return Success;
496
25.5k
}
497
498
static DecodeStatus DecodeFPR8RegisterClass(MCInst *Inst, unsigned RegNo,
499
              uint64_t Addr, const void *Decoder)
500
11.7k
{
501
11.7k
  if (RegNo > 31)
502
0
    return Fail;
503
504
11.7k
  unsigned Register = AArch64MCRegisterClasses[AArch64_FPR8RegClassID]
505
11.7k
            .RegsBegin[RegNo];
506
11.7k
  MCOperand_CreateReg0(Inst, (Register));
507
11.7k
  return Success;
508
11.7k
}
509
510
static DecodeStatus DecodeGPR64commonRegisterClass(MCInst *Inst, unsigned RegNo,
511
               uint64_t Addr,
512
               const void *Decoder)
513
11.7k
{
514
11.7k
  if (RegNo > 30)
515
20
    return Fail;
516
517
11.7k
  unsigned Register =
518
11.7k
    AArch64MCRegisterClasses[AArch64_GPR64commonRegClassID]
519
11.7k
      .RegsBegin[RegNo];
520
11.7k
  MCOperand_CreateReg0(Inst, (Register));
521
11.7k
  return Success;
522
11.7k
}
523
524
static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst, unsigned RegNo,
525
               uint64_t Addr, const void *Decoder)
526
351k
{
527
351k
  if (RegNo > 31)
528
0
    return Fail;
529
530
351k
  unsigned Register = AArch64MCRegisterClasses[AArch64_GPR64RegClassID]
531
351k
            .RegsBegin[RegNo];
532
351k
  MCOperand_CreateReg0(Inst, (Register));
533
351k
  return Success;
534
351k
}
535
536
static DecodeStatus DecodeGPR64x8ClassRegisterClass(MCInst *Inst,
537
                unsigned RegNo,
538
                uint64_t Address,
539
                const void *Decoder)
540
1.01k
{
541
1.01k
  if (RegNo > 22)
542
5
    return Fail;
543
1.01k
  if (RegNo & 1)
544
5
    return Fail;
545
546
1.00k
  unsigned Register =
547
1.00k
    AArch64MCRegisterClasses[AArch64_GPR64x8ClassRegClassID]
548
1.00k
      .RegsBegin[RegNo >> 1];
549
1.00k
  MCOperand_CreateReg0(Inst, (Register));
550
1.00k
  return Success;
551
1.01k
}
552
553
static DecodeStatus DecodeGPR64spRegisterClass(MCInst *Inst, unsigned RegNo,
554
                 uint64_t Addr,
555
                 const void *Decoder)
556
173k
{
557
173k
  if (RegNo > 31)
558
0
    return Fail;
559
173k
  unsigned Register = AArch64MCRegisterClasses[AArch64_GPR64spRegClassID]
560
173k
            .RegsBegin[RegNo];
561
173k
  MCOperand_CreateReg0(Inst, (Register));
562
173k
  return Success;
563
173k
}
564
565
static DecodeStatus
566
DecodeMatrixIndexGPR32_8_11RegisterClass(MCInst *Inst, unsigned RegNo,
567
           uint64_t Addr, const void *Decoder)
568
8.26k
{
569
8.26k
  if (RegNo > 3)
570
0
    return Fail;
571
572
8.26k
  unsigned Register =
573
8.26k
    AArch64MCRegisterClasses[AArch64_MatrixIndexGPR32_8_11RegClassID]
574
8.26k
      .RegsBegin[RegNo];
575
8.26k
  MCOperand_CreateReg0(Inst, (Register));
576
8.26k
  return Success;
577
8.26k
}
578
579
static DecodeStatus
580
DecodeMatrixIndexGPR32_12_15RegisterClass(MCInst *Inst, unsigned RegNo,
581
            uint64_t Addr, const void *Decoder)
582
20.5k
{
583
20.5k
  if (RegNo > 3)
584
0
    return Fail;
585
586
20.5k
  unsigned Register =
587
20.5k
    AArch64MCRegisterClasses[AArch64_MatrixIndexGPR32_12_15RegClassID]
588
20.5k
      .RegsBegin[RegNo];
589
20.5k
  MCOperand_CreateReg0(Inst, (Register));
590
20.5k
  return Success;
591
20.5k
}
592
593
static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst, unsigned RegNo,
594
               uint64_t Addr, const void *Decoder)
595
174k
{
596
174k
  if (RegNo > 31)
597
0
    return Fail;
598
599
174k
  unsigned Register = AArch64MCRegisterClasses[AArch64_GPR32RegClassID]
600
174k
            .RegsBegin[RegNo];
601
174k
  MCOperand_CreateReg0(Inst, (Register));
602
174k
  return Success;
603
174k
}
604
605
static DecodeStatus DecodeGPR32spRegisterClass(MCInst *Inst, unsigned RegNo,
606
                 uint64_t Addr,
607
                 const void *Decoder)
608
10.2k
{
609
10.2k
  if (RegNo > 31)
610
0
    return Fail;
611
612
10.2k
  unsigned Register = AArch64MCRegisterClasses[AArch64_GPR32spRegClassID]
613
10.2k
            .RegsBegin[RegNo];
614
10.2k
  MCOperand_CreateReg0(Inst, (Register));
615
10.2k
  return Success;
616
10.2k
}
617
618
static DecodeStatus DecodeZPRRegisterClass(MCInst *Inst, unsigned RegNo,
619
             uint64_t Address,
620
             const void *Decoder)
621
326k
{
622
326k
  if (RegNo > 31)
623
0
    return Fail;
624
625
326k
  unsigned Register =
626
326k
    AArch64MCRegisterClasses[AArch64_ZPRRegClassID].RegsBegin[RegNo];
627
326k
  MCOperand_CreateReg0(Inst, (Register));
628
326k
  return Success;
629
326k
}
630
631
static DecodeStatus DecodeZPR_4bRegisterClass(MCInst *Inst, unsigned RegNo,
632
                uint64_t Address,
633
                const void *Decoder)
634
8.18k
{
635
8.18k
  if (RegNo > 15)
636
0
    return Fail;
637
8.18k
  return DecodeZPRRegisterClass(Inst, RegNo, Address, Decoder);
638
8.18k
}
639
640
static DecodeStatus DecodeZPR_3bRegisterClass(MCInst *Inst, unsigned RegNo,
641
                uint64_t Address,
642
                const void *Decoder)
643
3.09k
{
644
3.09k
  if (RegNo > 7)
645
0
    return Fail;
646
3.09k
  return DecodeZPRRegisterClass(Inst, RegNo, Address, Decoder);
647
3.09k
}
648
649
static DecodeStatus DecodeZPR2RegisterClass(MCInst *Inst, unsigned RegNo,
650
              uint64_t Address,
651
              const void *Decoder)
652
6.62k
{
653
6.62k
  if (RegNo > 31)
654
0
    return Fail;
655
6.62k
  unsigned Register = AArch64MCRegisterClasses[AArch64_ZPR2RegClassID]
656
6.62k
            .RegsBegin[RegNo];
657
6.62k
  MCOperand_CreateReg0(Inst, (Register));
658
6.62k
  return Success;
659
6.62k
}
660
661
static DecodeStatus DecodeZPR3RegisterClass(MCInst *Inst, unsigned RegNo,
662
              uint64_t Address,
663
              const void *Decoder)
664
2.43k
{
665
2.43k
  if (RegNo > 31)
666
0
    return Fail;
667
2.43k
  unsigned Register = AArch64MCRegisterClasses[AArch64_ZPR3RegClassID]
668
2.43k
            .RegsBegin[RegNo];
669
2.43k
  MCOperand_CreateReg0(Inst, (Register));
670
2.43k
  return Success;
671
2.43k
}
672
673
static DecodeStatus DecodeZPR4RegisterClass(MCInst *Inst, unsigned RegNo,
674
              uint64_t Address,
675
              const void *Decoder)
676
2.79k
{
677
2.79k
  if (RegNo > 31)
678
0
    return Fail;
679
2.79k
  unsigned Register = AArch64MCRegisterClasses[AArch64_ZPR4RegClassID]
680
2.79k
            .RegsBegin[RegNo];
681
2.79k
  MCOperand_CreateReg0(Inst, (Register));
682
2.79k
  return Success;
683
2.79k
}
684
685
static DecodeStatus DecodeZPR2Mul2RegisterClass(MCInst *Inst, unsigned RegNo,
686
            uint64_t Address,
687
            const void *Decoder)
688
12.3k
{
689
12.3k
  if (RegNo * 2 > 30)
690
0
    return Fail;
691
12.3k
  unsigned Register = AArch64MCRegisterClasses[AArch64_ZPR2RegClassID]
692
12.3k
            .RegsBegin[RegNo * 2];
693
12.3k
  MCOperand_CreateReg0(Inst, (Register));
694
12.3k
  return Success;
695
12.3k
}
696
697
static DecodeStatus DecodeZPR4Mul4RegisterClass(MCInst *Inst, unsigned RegNo,
698
            uint64_t Address,
699
            const void *Decoder)
700
8.19k
{
701
8.19k
  if (RegNo * 4 > 28)
702
0
    return Fail;
703
8.19k
  unsigned Register = AArch64MCRegisterClasses[AArch64_ZPR4RegClassID]
704
8.19k
            .RegsBegin[RegNo * 4];
705
8.19k
  MCOperand_CreateReg0(Inst, (Register));
706
8.19k
  return Success;
707
8.19k
}
708
709
static DecodeStatus DecodeZPR2StridedRegisterClass(MCInst *Inst, unsigned RegNo,
710
               uint64_t Address,
711
               const void *Decoder)
712
5.96k
{
713
5.96k
  if (RegNo > 15)
714
0
    return Fail;
715
5.96k
  unsigned Register =
716
5.96k
    AArch64MCRegisterClasses[AArch64_ZPR2StridedRegClassID]
717
5.96k
      .RegsBegin[RegNo];
718
5.96k
  MCOperand_CreateReg0(Inst, (Register));
719
5.96k
  return Success;
720
5.96k
}
721
722
static DecodeStatus DecodeZPR4StridedRegisterClass(MCInst *Inst, unsigned RegNo,
723
               uint64_t Address,
724
               const void *Decoder)
725
2.20k
{
726
2.20k
  if (RegNo > 7)
727
0
    return Fail;
728
2.20k
  unsigned Register =
729
2.20k
    AArch64MCRegisterClasses[AArch64_ZPR4StridedRegClassID]
730
2.20k
      .RegsBegin[RegNo];
731
2.20k
  MCOperand_CreateReg0(Inst, (Register));
732
2.20k
  return Success;
733
2.20k
}
734
735
static DecodeStatus DecodeMatrixTileListRegisterClass(MCInst *Inst,
736
                  unsigned RegMask,
737
                  uint64_t Address,
738
                  const void *Decoder)
739
2.73k
{
740
2.73k
  if (RegMask > 0xFF)
741
0
    return Fail;
742
2.73k
  MCOperand_CreateImm0(Inst, (RegMask));
743
2.73k
  return Success;
744
2.73k
}
745
746
static const MCPhysReg MatrixZATileDecoderTable[5][16] = {
747
  { AArch64_ZAB0 },
748
  { AArch64_ZAH0, AArch64_ZAH1 },
749
  { AArch64_ZAS0, AArch64_ZAS1, AArch64_ZAS2, AArch64_ZAS3 },
750
  { AArch64_ZAD0, AArch64_ZAD1, AArch64_ZAD2, AArch64_ZAD3, AArch64_ZAD4,
751
    AArch64_ZAD5, AArch64_ZAD6, AArch64_ZAD7 },
752
  { AArch64_ZAQ0, AArch64_ZAQ1, AArch64_ZAQ2, AArch64_ZAQ3, AArch64_ZAQ4,
753
    AArch64_ZAQ5, AArch64_ZAQ6, AArch64_ZAQ7, AArch64_ZAQ8, AArch64_ZAQ9,
754
    AArch64_ZAQ10, AArch64_ZAQ11, AArch64_ZAQ12, AArch64_ZAQ13,
755
    AArch64_ZAQ14, AArch64_ZAQ15 }
756
};
757
758
#define DEFINE_DecodeMatrixTile(NumBitsForTile) \
759
  static DecodeStatus CONCAT(DecodeMatrixTile, NumBitsForTile)( \
760
    MCInst * Inst, unsigned RegNo, uint64_t Address, \
761
    const void *Decoder) \
762
13.2k
  { \
763
13.2k
    unsigned LastReg = (1 << NumBitsForTile) - 1; \
764
13.2k
    if (RegNo > LastReg) \
765
13.2k
      return Fail; \
766
13.2k
    MCOperand_CreateReg0( \
767
13.2k
      Inst, \
768
13.2k
      (MatrixZATileDecoderTable[NumBitsForTile][RegNo])); \
769
13.2k
    return Success; \
770
13.2k
  }
AArch64Disassembler.c:DecodeMatrixTile_2
Line
Count
Source
762
4.50k
  { \
763
4.50k
    unsigned LastReg = (1 << NumBitsForTile) - 1; \
764
4.50k
    if (RegNo > LastReg) \
765
4.50k
      return Fail; \
766
4.50k
    MCOperand_CreateReg0( \
767
4.50k
      Inst, \
768
4.50k
      (MatrixZATileDecoderTable[NumBitsForTile][RegNo])); \
769
4.50k
    return Success; \
770
4.50k
  }
AArch64Disassembler.c:DecodeMatrixTile_1
Line
Count
Source
762
2.97k
  { \
763
2.97k
    unsigned LastReg = (1 << NumBitsForTile) - 1; \
764
2.97k
    if (RegNo > LastReg) \
765
2.97k
      return Fail; \
766
2.97k
    MCOperand_CreateReg0( \
767
2.97k
      Inst, \
768
2.97k
      (MatrixZATileDecoderTable[NumBitsForTile][RegNo])); \
769
2.97k
    return Success; \
770
2.97k
  }
AArch64Disassembler.c:DecodeMatrixTile_3
Line
Count
Source
762
4.58k
  { \
763
4.58k
    unsigned LastReg = (1 << NumBitsForTile) - 1; \
764
4.58k
    if (RegNo > LastReg) \
765
4.58k
      return Fail; \
766
4.58k
    MCOperand_CreateReg0( \
767
4.58k
      Inst, \
768
4.58k
      (MatrixZATileDecoderTable[NumBitsForTile][RegNo])); \
769
4.58k
    return Success; \
770
4.58k
  }
AArch64Disassembler.c:DecodeMatrixTile_4
Line
Count
Source
762
1.16k
  { \
763
1.16k
    unsigned LastReg = (1 << NumBitsForTile) - 1; \
764
1.16k
    if (RegNo > LastReg) \
765
1.16k
      return Fail; \
766
1.16k
    MCOperand_CreateReg0( \
767
1.16k
      Inst, \
768
1.16k
      (MatrixZATileDecoderTable[NumBitsForTile][RegNo])); \
769
1.16k
    return Success; \
770
1.16k
  }
771
DEFINE_DecodeMatrixTile(2);
772
DEFINE_DecodeMatrixTile(1);
773
DEFINE_DecodeMatrixTile(3);
774
DEFINE_DecodeMatrixTile(4);
775
776
static DecodeStatus DecodePPRRegisterClass(MCInst *Inst, unsigned RegNo,
777
             uint64_t Addr, const void *Decoder)
778
170k
{
779
170k
  if (RegNo > 15)
780
0
    return Fail;
781
782
170k
  unsigned Register =
783
170k
    AArch64MCRegisterClasses[AArch64_PPRRegClassID].RegsBegin[RegNo];
784
170k
  MCOperand_CreateReg0(Inst, (Register));
785
170k
  return Success;
786
170k
}
787
788
static DecodeStatus DecodePNRRegisterClass(MCInst *Inst, unsigned RegNo,
789
             uint64_t Addr, const void *Decoder)
790
14.6k
{
791
14.6k
  if (RegNo > 15)
792
0
    return Fail;
793
794
14.6k
  unsigned Register =
795
14.6k
    AArch64MCRegisterClasses[AArch64_PNRRegClassID].RegsBegin[RegNo];
796
14.6k
  MCOperand_CreateReg0(Inst, (Register));
797
14.6k
  return Success;
798
14.6k
}
799
800
static DecodeStatus DecodePPR_3bRegisterClass(MCInst *Inst, unsigned RegNo,
801
                uint64_t Addr,
802
                const void *Decoder)
803
111k
{
804
111k
  if (RegNo > 7)
805
0
    return Fail;
806
807
  // Just reuse the PPR decode table
808
111k
  return DecodePPRRegisterClass(Inst, RegNo, Addr, Decoder);
809
111k
}
810
811
static DecodeStatus DecodePNR_p8to15RegisterClass(MCInst *Inst, unsigned RegNo,
812
              uint64_t Addr,
813
              const void *Decoder)
814
14.4k
{
815
14.4k
  if (RegNo > 7)
816
0
    return Fail;
817
818
  // Just reuse the PPR decode table
819
14.4k
  return DecodePNRRegisterClass(Inst, RegNo + 8, Addr, Decoder);
820
14.4k
}
821
822
static DecodeStatus DecodePPR2RegisterClass(MCInst *Inst, unsigned RegNo,
823
              uint64_t Address,
824
              const void *Decoder)
825
1.84k
{
826
1.84k
  if (RegNo > 15)
827
0
    return Fail;
828
829
1.84k
  unsigned Register = AArch64MCRegisterClasses[AArch64_PPR2RegClassID]
830
1.84k
            .RegsBegin[RegNo];
831
1.84k
  MCOperand_CreateReg0(Inst, (Register));
832
1.84k
  return Success;
833
1.84k
}
834
835
static DecodeStatus DecodePPR2Mul2RegisterClass(MCInst *Inst, unsigned RegNo,
836
            uint64_t Address,
837
            const void *Decoder)
838
1.90k
{
839
1.90k
  if ((RegNo * 2) > 14)
840
0
    return Fail;
841
1.90k
  unsigned Register = AArch64MCRegisterClasses[AArch64_PPR2RegClassID]
842
1.90k
            .RegsBegin[RegNo * 2];
843
1.90k
  MCOperand_CreateReg0(Inst, (Register));
844
1.90k
  return Success;
845
1.90k
}
846
847
static DecodeStatus DecodeQQRegisterClass(MCInst *Inst, unsigned RegNo,
848
            uint64_t Addr, const void *Decoder)
849
35.9k
{
850
35.9k
  if (RegNo > 31)
851
0
    return Fail;
852
35.9k
  unsigned Register =
853
35.9k
    AArch64MCRegisterClasses[AArch64_QQRegClassID].RegsBegin[RegNo];
854
35.9k
  MCOperand_CreateReg0(Inst, (Register));
855
35.9k
  return Success;
856
35.9k
}
857
858
static DecodeStatus DecodeQQQRegisterClass(MCInst *Inst, unsigned RegNo,
859
             uint64_t Addr, const void *Decoder)
860
39.7k
{
861
39.7k
  if (RegNo > 31)
862
0
    return Fail;
863
39.7k
  unsigned Register =
864
39.7k
    AArch64MCRegisterClasses[AArch64_QQQRegClassID].RegsBegin[RegNo];
865
39.7k
  MCOperand_CreateReg0(Inst, (Register));
866
39.7k
  return Success;
867
39.7k
}
868
869
static DecodeStatus DecodeQQQQRegisterClass(MCInst *Inst, unsigned RegNo,
870
              uint64_t Addr, const void *Decoder)
871
39.8k
{
872
39.8k
  if (RegNo > 31)
873
0
    return Fail;
874
39.8k
  unsigned Register = AArch64MCRegisterClasses[AArch64_QQQQRegClassID]
875
39.8k
            .RegsBegin[RegNo];
876
39.8k
  MCOperand_CreateReg0(Inst, (Register));
877
39.8k
  return Success;
878
39.8k
}
879
880
static DecodeStatus DecodeDDRegisterClass(MCInst *Inst, unsigned RegNo,
881
            uint64_t Addr, const void *Decoder)
882
6.32k
{
883
6.32k
  if (RegNo > 31)
884
0
    return Fail;
885
6.32k
  unsigned Register =
886
6.32k
    AArch64MCRegisterClasses[AArch64_DDRegClassID].RegsBegin[RegNo];
887
6.32k
  MCOperand_CreateReg0(Inst, (Register));
888
6.32k
  return Success;
889
6.32k
}
890
891
static DecodeStatus DecodeDDDRegisterClass(MCInst *Inst, unsigned RegNo,
892
             uint64_t Addr, const void *Decoder)
893
6.81k
{
894
6.81k
  if (RegNo > 31)
895
0
    return Fail;
896
6.81k
  unsigned Register =
897
6.81k
    AArch64MCRegisterClasses[AArch64_DDDRegClassID].RegsBegin[RegNo];
898
6.81k
  MCOperand_CreateReg0(Inst, (Register));
899
6.81k
  return Success;
900
6.81k
}
901
902
static DecodeStatus DecodeDDDDRegisterClass(MCInst *Inst, unsigned RegNo,
903
              uint64_t Addr, const void *Decoder)
904
7.75k
{
905
7.75k
  if (RegNo > 31)
906
0
    return Fail;
907
7.75k
  unsigned Register = AArch64MCRegisterClasses[AArch64_DDDDRegClassID]
908
7.75k
            .RegsBegin[RegNo];
909
7.75k
  MCOperand_CreateReg0(Inst, (Register));
910
7.75k
  return Success;
911
7.75k
}
912
913
static DecodeStatus DecodeFixedPointScaleImm32(MCInst *Inst, unsigned Imm,
914
                 uint64_t Addr,
915
                 const void *Decoder)
916
962
{
917
  // scale{5} is asserted as 1 in tblgen.
918
962
  Imm |= 0x20;
919
962
  MCOperand_CreateImm0(Inst, (64 - Imm));
920
962
  return Success;
921
962
}
922
923
static DecodeStatus DecodeFixedPointScaleImm64(MCInst *Inst, unsigned Imm,
924
                 uint64_t Addr,
925
                 const void *Decoder)
926
1.21k
{
927
1.21k
  MCOperand_CreateImm0(Inst, (64 - Imm));
928
1.21k
  return Success;
929
1.21k
}
930
931
static DecodeStatus DecodePCRelLabel16(MCInst *Inst, unsigned Imm,
932
               uint64_t Addr, const void *Decoder)
933
97
{
934
  // Immediate is encoded as the top 16-bits of an unsigned 18-bit negative
935
  // PC-relative offset.
936
97
  uint64_t ImmVal = Imm;
937
97
  if (ImmVal > (1 << 16))
938
0
    return Fail;
939
  // Symbols are not supported by Capstone
940
97
  return Success;
941
97
}
942
943
static DecodeStatus DecodePCRelLabel19(MCInst *Inst, unsigned Imm,
944
               uint64_t Addr, const void *Decoder)
945
16.0k
{
946
16.0k
  int64_t ImmVal = Imm;
947
948
  // Sign-extend 19-bit immediate.
949
16.0k
  if (ImmVal & (1 << (19 - 1)))
950
5.90k
    ImmVal |= ~((1LL << 19) - 1);
951
952
  // No symbols supported in Capstone
953
  // if (!Decoder->tryAddingSymbolicOperand(
954
  //    Inst, ImmVal * 4, Addr, MCInst_getOpcode(Inst) != AArch64_LDRXl, 0,
955
  //    0, 4))
956
16.0k
  MCOperand_CreateImm0(Inst, (ImmVal));
957
16.0k
  return Success;
958
16.0k
}
959
960
static DecodeStatus DecodeMemExtend(MCInst *Inst, unsigned Imm,
961
            uint64_t Address, const void *Decoder)
962
11.4k
{
963
11.4k
  MCOperand_CreateImm0(Inst, ((Imm >> 1) & 1));
964
11.4k
  MCOperand_CreateImm0(Inst, (Imm & 1));
965
11.4k
  return Success;
966
11.4k
}
967
968
static DecodeStatus DecodeMRSSystemRegister(MCInst *Inst, unsigned Imm,
969
              uint64_t Address,
970
              const void *Decoder)
971
5.13k
{
972
5.13k
  MCOperand_CreateImm0(Inst, (Imm));
973
974
  // Every system register in the encoding space is valid with the syntax
975
  // S<op0>_<op1>_<Cn>_<Cm>_<op2>, so decoding system registers always
976
  // succeeds.
977
5.13k
  return Success;
978
5.13k
}
979
980
static DecodeStatus DecodeMSRSystemRegister(MCInst *Inst, unsigned Imm,
981
              uint64_t Address,
982
              const void *Decoder)
983
9.35k
{
984
9.35k
  MCOperand_CreateImm0(Inst, (Imm));
985
986
9.35k
  return Success;
987
9.35k
}
988
989
static DecodeStatus DecodeFMOVLaneInstruction(MCInst *Inst, unsigned Insn,
990
                uint64_t Address,
991
                const void *Decoder)
992
1.22k
{
993
  // This decoder exists to add the dummy Lane operand to the MCInst, which
994
  // must be 1 in assembly but has no other real manifestation.
995
1.22k
  unsigned Rd = fieldFromInstruction_4(Insn, 0, 5);
996
1.22k
  unsigned Rn = fieldFromInstruction_4(Insn, 5, 5);
997
1.22k
  unsigned IsToVec = fieldFromInstruction_4(Insn, 16, 1);
998
999
1.22k
  if (IsToVec) {
1000
592
    DecodeFPR128RegisterClass(Inst, Rd, Address, Decoder);
1001
592
    DecodeGPR64RegisterClass(Inst, Rn, Address, Decoder);
1002
630
  } else {
1003
630
    DecodeGPR64RegisterClass(Inst, Rd, Address, Decoder);
1004
630
    DecodeFPR128RegisterClass(Inst, Rn, Address, Decoder);
1005
630
  }
1006
1007
  // Add the lane
1008
1.22k
  MCOperand_CreateImm0(Inst, (1));
1009
1010
1.22k
  return Success;
1011
1.22k
}
1012
1013
static DecodeStatus DecodeVecShiftRImm(MCInst *Inst, unsigned Imm, unsigned Add)
1014
10.8k
{
1015
10.8k
  MCOperand_CreateImm0(Inst, (Add - Imm));
1016
10.8k
  return Success;
1017
10.8k
}
1018
1019
static DecodeStatus DecodeVecShiftLImm(MCInst *Inst, unsigned Imm, unsigned Add)
1020
11.9k
{
1021
11.9k
  MCOperand_CreateImm0(Inst, ((Imm + Add) & (Add - 1)));
1022
11.9k
  return Success;
1023
11.9k
}
1024
1025
static DecodeStatus DecodeVecShiftR64Imm(MCInst *Inst, unsigned Imm,
1026
           uint64_t Addr, const void *Decoder)
1027
2.61k
{
1028
2.61k
  return DecodeVecShiftRImm(Inst, Imm, 64);
1029
2.61k
}
1030
1031
static DecodeStatus DecodeVecShiftR64ImmNarrow(MCInst *Inst, unsigned Imm,
1032
                 uint64_t Addr,
1033
                 const void *Decoder)
1034
1.05k
{
1035
1.05k
  return DecodeVecShiftRImm(Inst, Imm | 0x20, 64);
1036
1.05k
}
1037
1038
static DecodeStatus DecodeVecShiftR32Imm(MCInst *Inst, unsigned Imm,
1039
           uint64_t Addr, const void *Decoder)
1040
2.27k
{
1041
2.27k
  return DecodeVecShiftRImm(Inst, Imm, 32);
1042
2.27k
}
1043
1044
static DecodeStatus DecodeVecShiftR32ImmNarrow(MCInst *Inst, unsigned Imm,
1045
                 uint64_t Addr,
1046
                 const void *Decoder)
1047
222
{
1048
222
  return DecodeVecShiftRImm(Inst, Imm | 0x10, 32);
1049
222
}
1050
1051
static DecodeStatus DecodeVecShiftR16Imm(MCInst *Inst, unsigned Imm,
1052
           uint64_t Addr, const void *Decoder)
1053
2.14k
{
1054
2.14k
  return DecodeVecShiftRImm(Inst, Imm, 16);
1055
2.14k
}
1056
1057
static DecodeStatus DecodeVecShiftR16ImmNarrow(MCInst *Inst, unsigned Imm,
1058
                 uint64_t Addr,
1059
                 const void *Decoder)
1060
564
{
1061
564
  return DecodeVecShiftRImm(Inst, Imm | 0x8, 16);
1062
564
}
1063
1064
static DecodeStatus DecodeVecShiftR8Imm(MCInst *Inst, unsigned Imm,
1065
          uint64_t Addr, const void *Decoder)
1066
1.98k
{
1067
1.98k
  return DecodeVecShiftRImm(Inst, Imm, 8);
1068
1.98k
}
1069
1070
static DecodeStatus DecodeVecShiftL64Imm(MCInst *Inst, unsigned Imm,
1071
           uint64_t Addr, const void *Decoder)
1072
1.61k
{
1073
1.61k
  return DecodeVecShiftLImm(Inst, Imm, 64);
1074
1.61k
}
1075
1076
static DecodeStatus DecodeVecShiftL32Imm(MCInst *Inst, unsigned Imm,
1077
           uint64_t Addr, const void *Decoder)
1078
2.78k
{
1079
2.78k
  return DecodeVecShiftLImm(Inst, Imm, 32);
1080
2.78k
}
1081
1082
static DecodeStatus DecodeVecShiftL16Imm(MCInst *Inst, unsigned Imm,
1083
           uint64_t Addr, const void *Decoder)
1084
2.89k
{
1085
2.89k
  return DecodeVecShiftLImm(Inst, Imm, 16);
1086
2.89k
}
1087
1088
static DecodeStatus DecodeVecShiftL8Imm(MCInst *Inst, unsigned Imm,
1089
          uint64_t Addr, const void *Decoder)
1090
4.68k
{
1091
4.68k
  return DecodeVecShiftLImm(Inst, Imm, 8);
1092
4.68k
}
1093
1094
static DecodeStatus DecodeThreeAddrSRegInstruction(MCInst *Inst, uint32_t insn,
1095
               uint64_t Addr,
1096
               const void *Decoder)
1097
17.2k
{
1098
17.2k
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1099
17.2k
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1100
17.2k
  unsigned Rm = fieldFromInstruction_4(insn, 16, 5);
1101
17.2k
  unsigned shiftHi = fieldFromInstruction_4(insn, 22, 2);
1102
17.2k
  unsigned shiftLo = fieldFromInstruction_4(insn, 10, 6);
1103
17.2k
  unsigned shift = (shiftHi << 6) | shiftLo;
1104
17.2k
  switch (MCInst_getOpcode(Inst)) {
1105
0
  default:
1106
0
    return Fail;
1107
1.14k
  case AArch64_ADDWrs:
1108
2.18k
  case AArch64_ADDSWrs:
1109
2.88k
  case AArch64_SUBWrs:
1110
3.35k
  case AArch64_SUBSWrs:
1111
    // if shift == '11' then ReservedValue()
1112
3.35k
    if (shiftHi == 0x3)
1113
8
      return Fail;
1114
    // fall through
1115
3.99k
  case AArch64_ANDWrs:
1116
4.53k
  case AArch64_ANDSWrs:
1117
5.08k
  case AArch64_BICWrs:
1118
6.18k
  case AArch64_BICSWrs:
1119
6.80k
  case AArch64_ORRWrs:
1120
7.49k
  case AArch64_ORNWrs:
1121
8.02k
  case AArch64_EORWrs:
1122
8.57k
  case AArch64_EONWrs: {
1123
    // if sf == '0' and imm6<5> == '1' then ReservedValue()
1124
8.57k
    if (shiftLo >> 5 == 1)
1125
58
      return Fail;
1126
8.51k
    DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1127
8.51k
    DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
1128
8.51k
    DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1129
8.51k
    break;
1130
8.57k
  }
1131
640
  case AArch64_ADDXrs:
1132
1.28k
  case AArch64_ADDSXrs:
1133
1.70k
  case AArch64_SUBXrs:
1134
2.53k
  case AArch64_SUBSXrs:
1135
    // if shift == '11' then ReservedValue()
1136
2.53k
    if (shiftHi == 0x3)
1137
9
      return Fail;
1138
    // fall through
1139
3.10k
  case AArch64_ANDXrs:
1140
3.93k
  case AArch64_ANDSXrs:
1141
4.46k
  case AArch64_BICXrs:
1142
5.82k
  case AArch64_BICSXrs:
1143
6.34k
  case AArch64_ORRXrs:
1144
6.92k
  case AArch64_ORNXrs:
1145
8.24k
  case AArch64_EORXrs:
1146
8.68k
  case AArch64_EONXrs:
1147
8.68k
    DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1148
8.68k
    DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
1149
8.68k
    DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1150
8.68k
    break;
1151
17.2k
  }
1152
1153
17.2k
  MCOperand_CreateImm0(Inst, (shift));
1154
17.2k
  return Success;
1155
17.2k
}
1156
1157
static DecodeStatus DecodeMoveImmInstruction(MCInst *Inst, uint32_t insn,
1158
               uint64_t Addr, const void *Decoder)
1159
7.44k
{
1160
7.44k
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1161
7.44k
  unsigned imm = fieldFromInstruction_4(insn, 5, 16);
1162
7.44k
  unsigned shift = fieldFromInstruction_4(insn, 21, 2);
1163
7.44k
  shift <<= 4;
1164
7.44k
  switch (MCInst_getOpcode(Inst)) {
1165
0
  default:
1166
0
    return Fail;
1167
1.59k
  case AArch64_MOVZWi:
1168
2.67k
  case AArch64_MOVNWi:
1169
3.07k
  case AArch64_MOVKWi:
1170
3.07k
    if (shift & (1U << 5))
1171
16
      return Fail;
1172
3.06k
    DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1173
3.06k
    break;
1174
1.32k
  case AArch64_MOVZXi:
1175
2.97k
  case AArch64_MOVNXi:
1176
4.37k
  case AArch64_MOVKXi:
1177
4.37k
    DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1178
4.37k
    break;
1179
7.44k
  }
1180
1181
7.43k
  if (MCInst_getOpcode(Inst) == AArch64_MOVKWi ||
1182
7.03k
      MCInst_getOpcode(Inst) == AArch64_MOVKXi)
1183
1.79k
    MCInst_addOperand2(Inst, (MCInst_getOperand(Inst, (0))));
1184
1185
7.43k
  MCOperand_CreateImm0(Inst, (imm));
1186
7.43k
  MCOperand_CreateImm0(Inst, (shift));
1187
7.43k
  return Success;
1188
7.44k
}
1189
1190
static DecodeStatus DecodeUnsignedLdStInstruction(MCInst *Inst, uint32_t insn,
1191
              uint64_t Addr,
1192
              const void *Decoder)
1193
18.2k
{
1194
18.2k
  unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1195
18.2k
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1196
18.2k
  unsigned offset = fieldFromInstruction_4(insn, 10, 12);
1197
1198
18.2k
  switch (MCInst_getOpcode(Inst)) {
1199
0
  default:
1200
0
    return Fail;
1201
734
  case AArch64_PRFMui:
1202
    // Rt is an immediate in prefetch.
1203
734
    MCOperand_CreateImm0(Inst, (Rt));
1204
734
    break;
1205
1.34k
  case AArch64_STRBBui:
1206
1.58k
  case AArch64_LDRBBui:
1207
1.83k
  case AArch64_LDRSBWui:
1208
2.84k
  case AArch64_STRHHui:
1209
4.45k
  case AArch64_LDRHHui:
1210
4.79k
  case AArch64_LDRSHWui:
1211
5.27k
  case AArch64_STRWui:
1212
5.95k
  case AArch64_LDRWui:
1213
5.95k
    DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1214
5.95k
    break;
1215
374
  case AArch64_LDRSBXui:
1216
984
  case AArch64_LDRSHXui:
1217
1.51k
  case AArch64_LDRSWui:
1218
3.48k
  case AArch64_STRXui:
1219
4.13k
  case AArch64_LDRXui:
1220
4.13k
    DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1221
4.13k
    break;
1222
640
  case AArch64_LDRQui:
1223
1.27k
  case AArch64_STRQui:
1224
1.27k
    DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1225
1.27k
    break;
1226
302
  case AArch64_LDRDui:
1227
780
  case AArch64_STRDui:
1228
780
    DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1229
780
    break;
1230
154
  case AArch64_LDRSui:
1231
386
  case AArch64_STRSui:
1232
386
    DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1233
386
    break;
1234
1.19k
  case AArch64_LDRHui:
1235
1.63k
  case AArch64_STRHui:
1236
1.63k
    DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
1237
1.63k
    break;
1238
1.39k
  case AArch64_LDRBui:
1239
3.34k
  case AArch64_STRBui:
1240
3.34k
    DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
1241
3.34k
    break;
1242
18.2k
  }
1243
1244
18.2k
  DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1245
  // No symbols supported in Capstone
1246
  // if (!Decoder->tryAddingSymbolicOperand(Inst, offset, Addr, Fail, 0, 0, 4))
1247
18.2k
  MCOperand_CreateImm0(Inst, (offset));
1248
18.2k
  return Success;
1249
18.2k
}
1250
1251
static DecodeStatus DecodeSignedLdStInstruction(MCInst *Inst, uint32_t insn,
1252
            uint64_t Addr,
1253
            const void *Decoder)
1254
15.6k
{
1255
15.6k
  unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1256
15.6k
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1257
15.6k
  int64_t offset = fieldFromInstruction_4(insn, 12, 9);
1258
1259
  // offset is a 9-bit signed immediate, so sign extend it to
1260
  // fill the unsigned.
1261
15.6k
  if (offset & (1 << (9 - 1)))
1262
4.17k
    offset |= ~((1LL << 9) - 1);
1263
1264
  // First operand is always the writeback to the address register, if needed.
1265
15.6k
  switch (MCInst_getOpcode(Inst)) {
1266
7.71k
  default:
1267
7.71k
    break;
1268
7.71k
  case AArch64_LDRSBWpre:
1269
423
  case AArch64_LDRSHWpre:
1270
464
  case AArch64_STRBBpre:
1271
526
  case AArch64_LDRBBpre:
1272
798
  case AArch64_STRHHpre:
1273
903
  case AArch64_LDRHHpre:
1274
1.04k
  case AArch64_STRWpre:
1275
1.12k
  case AArch64_LDRWpre:
1276
1.32k
  case AArch64_LDRSBWpost:
1277
1.47k
  case AArch64_LDRSHWpost:
1278
1.58k
  case AArch64_STRBBpost:
1279
1.66k
  case AArch64_LDRBBpost:
1280
1.80k
  case AArch64_STRHHpost:
1281
1.84k
  case AArch64_LDRHHpost:
1282
1.95k
  case AArch64_STRWpost:
1283
2.03k
  case AArch64_LDRWpost:
1284
2.12k
  case AArch64_LDRSBXpre:
1285
2.18k
  case AArch64_LDRSHXpre:
1286
2.29k
  case AArch64_STRXpre:
1287
2.36k
  case AArch64_LDRSWpre:
1288
2.67k
  case AArch64_LDRXpre:
1289
2.75k
  case AArch64_LDRSBXpost:
1290
2.86k
  case AArch64_LDRSHXpost:
1291
3.76k
  case AArch64_STRXpost:
1292
3.83k
  case AArch64_LDRSWpost:
1293
4.08k
  case AArch64_LDRXpost:
1294
4.16k
  case AArch64_LDRQpre:
1295
4.62k
  case AArch64_STRQpre:
1296
4.69k
  case AArch64_LDRQpost:
1297
5.21k
  case AArch64_STRQpost:
1298
5.50k
  case AArch64_LDRDpre:
1299
5.59k
  case AArch64_STRDpre:
1300
5.66k
  case AArch64_LDRDpost:
1301
5.83k
  case AArch64_STRDpost:
1302
5.92k
  case AArch64_LDRSpre:
1303
6.08k
  case AArch64_STRSpre:
1304
6.13k
  case AArch64_LDRSpost:
1305
6.17k
  case AArch64_STRSpost:
1306
6.39k
  case AArch64_LDRHpre:
1307
6.68k
  case AArch64_STRHpre:
1308
6.72k
  case AArch64_LDRHpost:
1309
6.81k
  case AArch64_STRHpost:
1310
6.93k
  case AArch64_LDRBpre:
1311
7.54k
  case AArch64_STRBpre:
1312
7.74k
  case AArch64_LDRBpost:
1313
7.89k
  case AArch64_STRBpost:
1314
7.89k
    DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1315
7.89k
    break;
1316
15.6k
  }
1317
1318
15.6k
  switch (MCInst_getOpcode(Inst)) {
1319
0
  default:
1320
0
    return Fail;
1321
75
  case AArch64_PRFUMi:
1322
    // Rt is an immediate in prefetch.
1323
75
    MCOperand_CreateImm0(Inst, (Rt));
1324
75
    break;
1325
87
  case AArch64_STURBBi:
1326
164
  case AArch64_LDURBBi:
1327
205
  case AArch64_LDURSBWi:
1328
505
  case AArch64_STURHHi:
1329
738
  case AArch64_LDURHHi:
1330
905
  case AArch64_LDURSHWi:
1331
1.00k
  case AArch64_STURWi:
1332
1.26k
  case AArch64_LDURWi:
1333
1.38k
  case AArch64_LDTRSBWi:
1334
1.49k
  case AArch64_LDTRSHWi:
1335
1.58k
  case AArch64_STTRWi:
1336
2.01k
  case AArch64_LDTRWi:
1337
2.26k
  case AArch64_STTRHi:
1338
2.39k
  case AArch64_LDTRHi:
1339
2.48k
  case AArch64_LDTRBi:
1340
2.53k
  case AArch64_STTRBi:
1341
2.62k
  case AArch64_LDRSBWpre:
1342
2.95k
  case AArch64_LDRSHWpre:
1343
3.00k
  case AArch64_STRBBpre:
1344
3.06k
  case AArch64_LDRBBpre:
1345
3.33k
  case AArch64_STRHHpre:
1346
3.43k
  case AArch64_LDRHHpre:
1347
3.57k
  case AArch64_STRWpre:
1348
3.65k
  case AArch64_LDRWpre:
1349
3.85k
  case AArch64_LDRSBWpost:
1350
4.00k
  case AArch64_LDRSHWpost:
1351
4.12k
  case AArch64_STRBBpost:
1352
4.20k
  case AArch64_LDRBBpost:
1353
4.34k
  case AArch64_STRHHpost:
1354
4.38k
  case AArch64_LDRHHpost:
1355
4.49k
  case AArch64_STRWpost:
1356
4.56k
  case AArch64_LDRWpost:
1357
4.74k
  case AArch64_STLURBi:
1358
4.77k
  case AArch64_STLURHi:
1359
5.04k
  case AArch64_STLURWi:
1360
5.12k
  case AArch64_LDAPURBi:
1361
5.16k
  case AArch64_LDAPURSBWi:
1362
5.25k
  case AArch64_LDAPURHi:
1363
5.28k
  case AArch64_LDAPURSHWi:
1364
5.51k
  case AArch64_LDAPURi:
1365
5.51k
    DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1366
5.51k
    break;
1367
70
  case AArch64_LDURSBXi:
1368
130
  case AArch64_LDURSHXi:
1369
349
  case AArch64_LDURSWi:
1370
560
  case AArch64_STURXi:
1371
649
  case AArch64_LDURXi:
1372
859
  case AArch64_LDTRSBXi:
1373
1.01k
  case AArch64_LDTRSHXi:
1374
1.09k
  case AArch64_LDTRSWi:
1375
1.33k
  case AArch64_STTRXi:
1376
1.42k
  case AArch64_LDTRXi:
1377
1.51k
  case AArch64_LDRSBXpre:
1378
1.58k
  case AArch64_LDRSHXpre:
1379
1.69k
  case AArch64_STRXpre:
1380
1.76k
  case AArch64_LDRSWpre:
1381
2.06k
  case AArch64_LDRXpre:
1382
2.14k
  case AArch64_LDRSBXpost:
1383
2.25k
  case AArch64_LDRSHXpost:
1384
3.16k
  case AArch64_STRXpost:
1385
3.23k
  case AArch64_LDRSWpost:
1386
3.47k
  case AArch64_LDRXpost:
1387
3.55k
  case AArch64_LDAPURSWi:
1388
3.58k
  case AArch64_LDAPURSHXi:
1389
3.65k
  case AArch64_LDAPURSBXi:
1390
4.23k
  case AArch64_STLURXi:
1391
4.31k
  case AArch64_LDAPURXi:
1392
4.31k
    DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1393
4.31k
    break;
1394
77
  case AArch64_LDURQi:
1395
175
  case AArch64_STURQi:
1396
252
  case AArch64_LDRQpre:
1397
715
  case AArch64_STRQpre:
1398
782
  case AArch64_LDRQpost:
1399
1.30k
  case AArch64_STRQpost:
1400
1.30k
    DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1401
1.30k
    break;
1402
130
  case AArch64_LDURDi:
1403
333
  case AArch64_STURDi:
1404
620
  case AArch64_LDRDpre:
1405
710
  case AArch64_STRDpre:
1406
784
  case AArch64_LDRDpost:
1407
952
  case AArch64_STRDpost:
1408
952
    DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1409
952
    break;
1410
43
  case AArch64_LDURSi:
1411
183
  case AArch64_STURSi:
1412
274
  case AArch64_LDRSpre:
1413
437
  case AArch64_STRSpre:
1414
484
  case AArch64_LDRSpost:
1415
521
  case AArch64_STRSpost:
1416
521
    DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1417
521
    break;
1418
124
  case AArch64_LDURHi:
1419
796
  case AArch64_STURHi:
1420
1.02k
  case AArch64_LDRHpre:
1421
1.30k
  case AArch64_STRHpre:
1422
1.35k
  case AArch64_LDRHpost:
1423
1.44k
  case AArch64_STRHpost:
1424
1.44k
    DecodeFPR16RegisterClass(Inst, Rt, Addr, Decoder);
1425
1.44k
    break;
1426
159
  case AArch64_LDURBi:
1427
405
  case AArch64_STURBi:
1428
520
  case AArch64_LDRBpre:
1429
1.13k
  case AArch64_STRBpre:
1430
1.33k
  case AArch64_LDRBpost:
1431
1.48k
  case AArch64_STRBpost:
1432
1.48k
    DecodeFPR8RegisterClass(Inst, Rt, Addr, Decoder);
1433
1.48k
    break;
1434
15.6k
  }
1435
1436
15.6k
  DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1437
15.6k
  MCOperand_CreateImm0(Inst, (offset));
1438
1439
15.6k
  bool IsLoad = fieldFromInstruction_4(insn, 22, 1);
1440
15.6k
  bool IsIndexed = fieldFromInstruction_4(insn, 10, 2) != 0;
1441
15.6k
  bool IsFP = fieldFromInstruction_4(insn, 26, 1);
1442
1443
  // Cannot write back to a transfer register (but xzr != sp).
1444
15.6k
  if (IsLoad && IsIndexed && !IsFP && Rn != 31 && Rt == Rn)
1445
233
    return SoftFail;
1446
1447
15.3k
  return Success;
1448
15.6k
}
1449
1450
static DecodeStatus DecodeExclusiveLdStInstruction(MCInst *Inst, uint32_t insn,
1451
               uint64_t Addr,
1452
               const void *Decoder)
1453
19.0k
{
1454
19.0k
  unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1455
19.0k
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1456
19.0k
  unsigned Rt2 = fieldFromInstruction_4(insn, 10, 5);
1457
19.0k
  unsigned Rs = fieldFromInstruction_4(insn, 16, 5);
1458
1459
19.0k
  unsigned Opcode = MCInst_getOpcode(Inst);
1460
19.0k
  switch (Opcode) {
1461
0
  default:
1462
0
    return Fail;
1463
300
  case AArch64_STLXRW:
1464
1.14k
  case AArch64_STLXRB:
1465
1.96k
  case AArch64_STLXRH:
1466
2.53k
  case AArch64_STXRW:
1467
3.27k
  case AArch64_STXRB:
1468
4.04k
  case AArch64_STXRH:
1469
4.04k
    DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1470
    // fall through
1471
4.74k
  case AArch64_LDARW:
1472
4.89k
  case AArch64_LDARB:
1473
5.28k
  case AArch64_LDARH:
1474
6.28k
  case AArch64_LDAXRW:
1475
7.40k
  case AArch64_LDAXRB:
1476
7.56k
  case AArch64_LDAXRH:
1477
8.20k
  case AArch64_LDXRW:
1478
8.75k
  case AArch64_LDXRB:
1479
9.03k
  case AArch64_LDXRH:
1480
9.60k
  case AArch64_STLRW:
1481
10.2k
  case AArch64_STLRB:
1482
10.5k
  case AArch64_STLRH:
1483
10.8k
  case AArch64_STLLRW:
1484
10.9k
  case AArch64_STLLRB:
1485
11.1k
  case AArch64_STLLRH:
1486
11.3k
  case AArch64_LDLARW:
1487
11.4k
  case AArch64_LDLARB:
1488
11.6k
  case AArch64_LDLARH:
1489
11.6k
    DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1490
11.6k
    break;
1491
383
  case AArch64_STLXRX:
1492
1.30k
  case AArch64_STXRX:
1493
1.30k
    DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1494
    // fall through
1495
1.73k
  case AArch64_LDARX:
1496
2.08k
  case AArch64_LDAXRX:
1497
2.31k
  case AArch64_LDXRX:
1498
2.51k
  case AArch64_STLRX:
1499
2.83k
  case AArch64_LDLARX:
1500
3.49k
  case AArch64_STLLRX:
1501
3.49k
    DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1502
3.49k
    break;
1503
159
  case AArch64_STLXPW:
1504
682
  case AArch64_STXPW:
1505
682
    DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1506
    // fall through
1507
972
  case AArch64_LDAXPW:
1508
1.69k
  case AArch64_LDXPW:
1509
1.69k
    DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1510
1.69k
    DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1511
1.69k
    break;
1512
1.09k
  case AArch64_STLXPX:
1513
1.49k
  case AArch64_STXPX:
1514
1.49k
    DecodeGPR32RegisterClass(Inst, Rs, Addr, Decoder);
1515
    // fall through
1516
1.79k
  case AArch64_LDAXPX:
1517
2.22k
  case AArch64_LDXPX:
1518
2.22k
    DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1519
2.22k
    DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1520
2.22k
    break;
1521
19.0k
  }
1522
1523
19.0k
  DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1524
1525
  // You shouldn't load to the same register twice in an instruction...
1526
19.0k
  if ((Opcode == AArch64_LDAXPW || Opcode == AArch64_LDXPW ||
1527
18.0k
       Opcode == AArch64_LDAXPX || Opcode == AArch64_LDXPX) &&
1528
1.74k
      Rt == Rt2)
1529
126
    return SoftFail;
1530
1531
18.9k
  return Success;
1532
19.0k
}
1533
1534
static DecodeStatus DecodePairLdStInstruction(MCInst *Inst, uint32_t insn,
1535
                uint64_t Addr,
1536
                const void *Decoder)
1537
21.4k
{
1538
21.4k
  unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1539
21.4k
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1540
21.4k
  unsigned Rt2 = fieldFromInstruction_4(insn, 10, 5);
1541
21.4k
  int64_t offset = fieldFromInstruction_4(insn, 15, 7);
1542
21.4k
  bool IsLoad = fieldFromInstruction_4(insn, 22, 1);
1543
1544
  // offset is a 7-bit signed immediate, so sign extend it to
1545
  // fill the unsigned.
1546
21.4k
  if (offset & (1 << (7 - 1)))
1547
12.6k
    offset |= ~((1LL << 7) - 1);
1548
1549
21.4k
  unsigned Opcode = MCInst_getOpcode(Inst);
1550
21.4k
  bool NeedsDisjointWritebackTransfer = false;
1551
1552
  // First operand is always writeback of base register.
1553
21.4k
  switch (Opcode) {
1554
11.5k
  default:
1555
11.5k
    break;
1556
11.5k
  case AArch64_LDPXpost:
1557
1.23k
  case AArch64_STPXpost:
1558
1.34k
  case AArch64_LDPSWpost:
1559
1.45k
  case AArch64_LDPXpre:
1560
1.74k
  case AArch64_STPXpre:
1561
1.99k
  case AArch64_LDPSWpre:
1562
2.46k
  case AArch64_LDPWpost:
1563
2.91k
  case AArch64_STPWpost:
1564
3.45k
  case AArch64_LDPWpre:
1565
3.62k
  case AArch64_STPWpre:
1566
3.72k
  case AArch64_LDPQpost:
1567
4.01k
  case AArch64_STPQpost:
1568
4.11k
  case AArch64_LDPQpre:
1569
5.11k
  case AArch64_STPQpre:
1570
5.54k
  case AArch64_LDPDpost:
1571
5.80k
  case AArch64_STPDpost:
1572
6.91k
  case AArch64_LDPDpre:
1573
7.23k
  case AArch64_STPDpre:
1574
7.70k
  case AArch64_LDPSpost:
1575
8.08k
  case AArch64_STPSpost:
1576
8.70k
  case AArch64_LDPSpre:
1577
8.84k
  case AArch64_STPSpre:
1578
9.16k
  case AArch64_STGPpre:
1579
9.98k
  case AArch64_STGPpost:
1580
9.98k
    DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1581
9.98k
    break;
1582
21.4k
  }
1583
1584
21.4k
  switch (Opcode) {
1585
0
  default:
1586
0
    return Fail;
1587
48
  case AArch64_LDPXpost:
1588
1.23k
  case AArch64_STPXpost:
1589
1.34k
  case AArch64_LDPSWpost:
1590
1.45k
  case AArch64_LDPXpre:
1591
1.74k
  case AArch64_STPXpre:
1592
1.99k
  case AArch64_LDPSWpre:
1593
2.30k
  case AArch64_STGPpre:
1594
3.13k
  case AArch64_STGPpost:
1595
3.13k
    NeedsDisjointWritebackTransfer = true;
1596
    // fall through
1597
3.59k
  case AArch64_LDNPXi:
1598
4.06k
  case AArch64_STNPXi:
1599
4.17k
  case AArch64_LDPXi:
1600
4.33k
  case AArch64_STPXi:
1601
5.12k
  case AArch64_LDPSWi:
1602
5.54k
  case AArch64_STGPi:
1603
5.54k
    DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1604
5.54k
    DecodeGPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1605
5.54k
    break;
1606
470
  case AArch64_LDPWpost:
1607
928
  case AArch64_STPWpost:
1608
1.46k
  case AArch64_LDPWpre:
1609
1.63k
  case AArch64_STPWpre:
1610
1.63k
    NeedsDisjointWritebackTransfer = true;
1611
    // fall through
1612
2.09k
  case AArch64_LDNPWi:
1613
2.86k
  case AArch64_STNPWi:
1614
3.55k
  case AArch64_LDPWi:
1615
4.04k
  case AArch64_STPWi:
1616
4.04k
    DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1617
4.04k
    DecodeGPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1618
4.04k
    break;
1619
221
  case AArch64_LDNPQi:
1620
469
  case AArch64_STNPQi:
1621
566
  case AArch64_LDPQpost:
1622
860
  case AArch64_STPQpost:
1623
1.22k
  case AArch64_LDPQi:
1624
1.45k
  case AArch64_STPQi:
1625
1.54k
  case AArch64_LDPQpre:
1626
2.54k
  case AArch64_STPQpre:
1627
2.54k
    DecodeFPR128RegisterClass(Inst, Rt, Addr, Decoder);
1628
2.54k
    DecodeFPR128RegisterClass(Inst, Rt2, Addr, Decoder);
1629
2.54k
    break;
1630
1.14k
  case AArch64_LDNPDi:
1631
1.44k
  case AArch64_STNPDi:
1632
1.86k
  case AArch64_LDPDpost:
1633
2.13k
  case AArch64_STPDpost:
1634
2.90k
  case AArch64_LDPDi:
1635
3.29k
  case AArch64_STPDi:
1636
4.39k
  case AArch64_LDPDpre:
1637
4.71k
  case AArch64_STPDpre:
1638
4.71k
    DecodeFPR64RegisterClass(Inst, Rt, Addr, Decoder);
1639
4.71k
    DecodeFPR64RegisterClass(Inst, Rt2, Addr, Decoder);
1640
4.71k
    break;
1641
748
  case AArch64_LDNPSi:
1642
1.53k
  case AArch64_STNPSi:
1643
2.01k
  case AArch64_LDPSpost:
1644
2.38k
  case AArch64_STPSpost:
1645
3.36k
  case AArch64_LDPSi:
1646
3.88k
  case AArch64_STPSi:
1647
4.50k
  case AArch64_LDPSpre:
1648
4.64k
  case AArch64_STPSpre:
1649
4.64k
    DecodeFPR32RegisterClass(Inst, Rt, Addr, Decoder);
1650
4.64k
    DecodeFPR32RegisterClass(Inst, Rt2, Addr, Decoder);
1651
4.64k
    break;
1652
21.4k
  }
1653
1654
21.4k
  DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1655
21.4k
  MCOperand_CreateImm0(Inst, (offset));
1656
1657
  // You shouldn't load to the same register twice in an instruction...
1658
21.4k
  if (IsLoad && Rt == Rt2)
1659
181
    return SoftFail;
1660
1661
  // ... or do any operation that writes-back to a transfer register. But note
1662
  // that "stp xzr, xzr, [sp], #4" is fine because xzr and sp are different.
1663
21.3k
  if (NeedsDisjointWritebackTransfer && Rn != 31 &&
1664
4.60k
      (Rt == Rn || Rt2 == Rn))
1665
1.09k
    return SoftFail;
1666
1667
20.2k
  return Success;
1668
21.3k
}
1669
1670
static DecodeStatus DecodeAuthLoadInstruction(MCInst *Inst, uint32_t insn,
1671
                uint64_t Addr,
1672
                const void *Decoder)
1673
3.69k
{
1674
3.69k
  unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
1675
3.69k
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1676
3.69k
  uint64_t offset = fieldFromInstruction_4(insn, 22, 1) << 9 |
1677
3.69k
        fieldFromInstruction_4(insn, 12, 9);
1678
3.69k
  unsigned writeback = fieldFromInstruction_4(insn, 11, 1);
1679
1680
3.69k
  switch (MCInst_getOpcode(Inst)) {
1681
0
  default:
1682
0
    return Fail;
1683
1.07k
  case AArch64_LDRAAwriteback:
1684
1.91k
  case AArch64_LDRABwriteback:
1685
1.91k
    DecodeGPR64spRegisterClass(Inst, Rn /* writeback register */,
1686
1.91k
             Addr, Decoder);
1687
1.91k
    break;
1688
871
  case AArch64_LDRAAindexed:
1689
1.77k
  case AArch64_LDRABindexed:
1690
1.77k
    break;
1691
3.69k
  }
1692
1693
3.69k
  DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1694
3.69k
  DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1695
3.69k
  CONCAT(DecodeSImm, 10)(Inst, offset, Addr, Decoder);
1696
1697
3.69k
  if (writeback && Rt == Rn && Rn != 31) {
1698
646
    return SoftFail;
1699
646
  }
1700
1701
3.04k
  return Success;
1702
3.69k
}
1703
1704
static DecodeStatus DecodeAddSubERegInstruction(MCInst *Inst, uint32_t insn,
1705
            uint64_t Addr,
1706
            const void *Decoder)
1707
12.9k
{
1708
12.9k
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1709
12.9k
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1710
12.9k
  unsigned Rm = fieldFromInstruction_4(insn, 16, 5);
1711
12.9k
  unsigned extend = fieldFromInstruction_4(insn, 10, 6);
1712
1713
12.9k
  unsigned shift = extend & 0x7;
1714
12.9k
  if (shift > 4)
1715
8
    return Fail;
1716
1717
12.9k
  switch (MCInst_getOpcode(Inst)) {
1718
0
  default:
1719
0
    return Fail;
1720
1.28k
  case AArch64_ADDWrx:
1721
3.92k
  case AArch64_SUBWrx:
1722
3.92k
    DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1723
3.92k
    DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1724
3.92k
    DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1725
3.92k
    break;
1726
1.93k
  case AArch64_ADDSWrx:
1727
2.16k
  case AArch64_SUBSWrx:
1728
2.16k
    DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1729
2.16k
    DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1730
2.16k
    DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1731
2.16k
    break;
1732
2.39k
  case AArch64_ADDXrx:
1733
2.71k
  case AArch64_SUBXrx:
1734
2.71k
    DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1735
2.71k
    DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1736
2.71k
    DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1737
2.71k
    break;
1738
1.70k
  case AArch64_ADDSXrx:
1739
1.90k
  case AArch64_SUBSXrx:
1740
1.90k
    DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1741
1.90k
    DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1742
1.90k
    DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
1743
1.90k
    break;
1744
636
  case AArch64_ADDXrx64:
1745
970
  case AArch64_SUBXrx64:
1746
970
    DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1747
970
    DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1748
970
    DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1749
970
    break;
1750
480
  case AArch64_SUBSXrx64:
1751
1.29k
  case AArch64_ADDSXrx64:
1752
1.29k
    DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1753
1.29k
    DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1754
1.29k
    DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
1755
1.29k
    break;
1756
12.9k
  }
1757
1758
12.9k
  MCOperand_CreateImm0(Inst, (extend));
1759
12.9k
  return Success;
1760
12.9k
}
1761
1762
static DecodeStatus DecodeLogicalImmInstruction(MCInst *Inst, uint32_t insn,
1763
            uint64_t Addr,
1764
            const void *Decoder)
1765
10.8k
{
1766
10.8k
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1767
10.8k
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1768
10.8k
  unsigned Datasize = fieldFromInstruction_4(insn, 31, 1);
1769
10.8k
  unsigned imm;
1770
1771
10.8k
  if (Datasize) {
1772
6.77k
    if (MCInst_getOpcode(Inst) == AArch64_ANDSXri)
1773
2.25k
      DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1774
4.51k
    else
1775
4.51k
      DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1776
6.77k
    DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder);
1777
6.77k
    imm = fieldFromInstruction_4(insn, 10, 13);
1778
6.77k
    if (!AArch64_AM_isValidDecodeLogicalImmediate(imm, 64))
1779
12
      return Fail;
1780
6.77k
  } else {
1781
4.11k
    if (MCInst_getOpcode(Inst) == AArch64_ANDSWri)
1782
890
      DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1783
3.22k
    else
1784
3.22k
      DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1785
4.11k
    DecodeGPR32RegisterClass(Inst, Rn, Addr, Decoder);
1786
4.11k
    imm = fieldFromInstruction_4(insn, 10, 12);
1787
4.11k
    if (!AArch64_AM_isValidDecodeLogicalImmediate(imm, 32))
1788
9
      return Fail;
1789
4.11k
  }
1790
10.8k
  MCOperand_CreateImm0(Inst, (imm));
1791
10.8k
  return Success;
1792
10.8k
}
1793
1794
static DecodeStatus DecodeModImmInstruction(MCInst *Inst, uint32_t insn,
1795
              uint64_t Addr, const void *Decoder)
1796
11.9k
{
1797
11.9k
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1798
11.9k
  unsigned cmode = fieldFromInstruction_4(insn, 12, 4);
1799
11.9k
  unsigned imm = fieldFromInstruction_4(insn, 16, 3) << 5;
1800
11.9k
  imm |= fieldFromInstruction_4(insn, 5, 5);
1801
1802
11.9k
  if (MCInst_getOpcode(Inst) == AArch64_MOVID)
1803
3.68k
    DecodeFPR64RegisterClass(Inst, Rd, Addr, Decoder);
1804
8.22k
  else
1805
8.22k
    DecodeFPR128RegisterClass(Inst, Rd, Addr, Decoder);
1806
1807
11.9k
  MCOperand_CreateImm0(Inst, (imm));
1808
1809
11.9k
  switch (MCInst_getOpcode(Inst)) {
1810
6.81k
  default:
1811
6.81k
    break;
1812
6.81k
  case AArch64_MOVIv4i16:
1813
1.34k
  case AArch64_MOVIv8i16:
1814
2.00k
  case AArch64_MVNIv4i16:
1815
2.17k
  case AArch64_MVNIv8i16:
1816
2.73k
  case AArch64_MOVIv2i32:
1817
3.26k
  case AArch64_MOVIv4i32:
1818
3.71k
  case AArch64_MVNIv2i32:
1819
4.15k
  case AArch64_MVNIv4i32:
1820
4.15k
    MCOperand_CreateImm0(Inst, ((cmode & 6) << 2));
1821
4.15k
    break;
1822
101
  case AArch64_MOVIv2s_msl:
1823
238
  case AArch64_MOVIv4s_msl:
1824
653
  case AArch64_MVNIv2s_msl:
1825
946
  case AArch64_MVNIv4s_msl:
1826
946
    MCOperand_CreateImm0(Inst, ((cmode & 1) ? 0x110 : 0x108));
1827
946
    break;
1828
11.9k
  }
1829
1830
11.9k
  return Success;
1831
11.9k
}
1832
1833
static DecodeStatus DecodeModImmTiedInstruction(MCInst *Inst, uint32_t insn,
1834
            uint64_t Addr,
1835
            const void *Decoder)
1836
548
{
1837
548
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1838
548
  unsigned cmode = fieldFromInstruction_4(insn, 12, 4);
1839
548
  unsigned imm = fieldFromInstruction_4(insn, 16, 3) << 5;
1840
548
  imm |= fieldFromInstruction_4(insn, 5, 5);
1841
1842
  // Tied operands added twice.
1843
548
  DecodeFPR128RegisterClass(Inst, Rd, Addr, Decoder);
1844
548
  DecodeFPR128RegisterClass(Inst, Rd, Addr, Decoder);
1845
1846
548
  MCOperand_CreateImm0(Inst, (imm));
1847
548
  MCOperand_CreateImm0(Inst, ((cmode & 6) << 2));
1848
1849
548
  return Success;
1850
548
}
1851
1852
static DecodeStatus DecodeAdrInstruction(MCInst *Inst, uint32_t insn,
1853
           uint64_t Addr, const void *Decoder)
1854
10.5k
{
1855
10.5k
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1856
10.5k
  int64_t imm = fieldFromInstruction_4(insn, 5, 19) << 2;
1857
10.5k
  imm |= fieldFromInstruction_4(insn, 29, 2);
1858
1859
  // Sign-extend the 21-bit immediate.
1860
10.5k
  if (imm & (1 << (21 - 1)))
1861
4.77k
    imm |= ~((1LL << 21) - 1);
1862
1863
10.5k
  DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1864
  // No symbols supported in Capstone
1865
  // if (!Decoder->tryAddingSymbolicOperand(Inst, imm, Addr, Fail, 0, 0, 4))
1866
10.5k
  MCOperand_CreateImm0(Inst, (imm));
1867
1868
10.5k
  return Success;
1869
10.5k
}
1870
1871
static DecodeStatus DecodeAddSubImmShift(MCInst *Inst, uint32_t insn,
1872
           uint64_t Addr, const void *Decoder)
1873
8.12k
{
1874
8.12k
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
1875
8.12k
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
1876
8.12k
  unsigned Imm = fieldFromInstruction_4(insn, 10, 14);
1877
8.12k
  unsigned S = fieldFromInstruction_4(insn, 29, 1);
1878
8.12k
  unsigned Datasize = fieldFromInstruction_4(insn, 31, 1);
1879
1880
8.12k
  unsigned ShifterVal = (Imm >> 12) & 3;
1881
8.12k
  unsigned ImmVal = Imm & 0xFFF;
1882
1883
8.12k
  if (ShifterVal != 0 && ShifterVal != 1)
1884
51
    return Fail;
1885
1886
8.07k
  if (Datasize) {
1887
3.29k
    if (Rd == 31 && !S)
1888
695
      DecodeGPR64spRegisterClass(Inst, Rd, Addr, Decoder);
1889
2.59k
    else
1890
2.59k
      DecodeGPR64RegisterClass(Inst, Rd, Addr, Decoder);
1891
3.29k
    DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
1892
4.78k
  } else {
1893
4.78k
    if (Rd == 31 && !S)
1894
370
      DecodeGPR32spRegisterClass(Inst, Rd, Addr, Decoder);
1895
4.41k
    else
1896
4.41k
      DecodeGPR32RegisterClass(Inst, Rd, Addr, Decoder);
1897
4.78k
    DecodeGPR32spRegisterClass(Inst, Rn, Addr, Decoder);
1898
4.78k
  }
1899
1900
  // No symbols supported in Capstone
1901
  // if (!Decoder->tryAddingSymbolicOperand(Inst, Imm, Addr, Fail, 0, 0, 4))
1902
8.07k
  MCOperand_CreateImm0(Inst, (ImmVal));
1903
8.07k
  MCOperand_CreateImm0(Inst, (12 * ShifterVal));
1904
8.07k
  return Success;
1905
8.12k
}
1906
1907
static DecodeStatus DecodeUnconditionalBranch(MCInst *Inst, uint32_t insn,
1908
                uint64_t Addr,
1909
                const void *Decoder)
1910
5.06k
{
1911
5.06k
  int64_t imm = fieldFromInstruction_4(insn, 0, 26);
1912
1913
  // Sign-extend the 26-bit immediate.
1914
5.06k
  if (imm & (1 << (26 - 1)))
1915
2.04k
    imm |= ~((1LL << 26) - 1);
1916
1917
  // No symbols supported in Capstone
1918
  // if (!Decoder->tryAddingSymbolicOperand(Inst, imm * 4, Addr, true, 0, 0, 4))
1919
5.06k
  MCOperand_CreateImm0(Inst, (imm));
1920
1921
5.06k
  return Success;
1922
5.06k
}
1923
1924
static bool isInvalidPState(uint64_t Op1, uint64_t Op2)
1925
3.19k
{
1926
3.19k
  return Op1 == 0 && (Op2 == 0 || // CFINV
1927
1.58k
          Op2 == 1 || // XAFlag
1928
1.58k
          Op2 == 2); // AXFlag
1929
3.19k
}
1930
1931
static DecodeStatus DecodeSystemPStateImm0_15Instruction(MCInst *Inst,
1932
               uint32_t insn,
1933
               uint64_t Addr,
1934
               const void *Decoder)
1935
1.56k
{
1936
1.56k
  uint64_t op1 = fieldFromInstruction_4(insn, 16, 3);
1937
1.56k
  uint64_t op2 = fieldFromInstruction_4(insn, 5, 3);
1938
1.56k
  uint64_t imm = fieldFromInstruction_4(insn, 8, 4);
1939
1.56k
  uint64_t pstate_field = (op1 << 3) | op2;
1940
1941
1.56k
  if (isInvalidPState(op1, op2))
1942
69
    return Fail;
1943
1944
1.49k
  MCOperand_CreateImm0(Inst, (pstate_field));
1945
1.49k
  MCOperand_CreateImm0(Inst, (imm));
1946
1947
1.49k
  const AArch64PState_PStateImm0_15 *PState =
1948
1.49k
    AArch64PState_lookupPStateImm0_15ByEncoding(pstate_field);
1949
1.49k
  if (PState &&
1950
780
      AArch64_testFeatureList(Inst->csh->mode, PState->FeaturesRequired))
1951
780
    return Success;
1952
717
  return Fail;
1953
1.49k
}
1954
1955
static DecodeStatus DecodeSystemPStateImm0_1Instruction(MCInst *Inst,
1956
              uint32_t insn,
1957
              uint64_t Addr,
1958
              const void *Decoder)
1959
1.62k
{
1960
1.62k
  uint64_t op1 = fieldFromInstruction_4(insn, 16, 3);
1961
1.62k
  uint64_t op2 = fieldFromInstruction_4(insn, 5, 3);
1962
1.62k
  uint64_t crm_high = fieldFromInstruction_4(insn, 9, 3);
1963
1.62k
  uint64_t imm = fieldFromInstruction_4(insn, 8, 1);
1964
1.62k
  uint64_t pstate_field = (crm_high << 6) | (op1 << 3) | op2;
1965
1966
1.62k
  if (isInvalidPState(op1, op2))
1967
69
    return Fail;
1968
1969
1.55k
  MCOperand_CreateImm0(Inst, (pstate_field));
1970
1.55k
  MCOperand_CreateImm0(Inst, (imm));
1971
1972
1.55k
  const AArch64PState_PStateImm0_1 *PState =
1973
1.55k
    AArch64PState_lookupPStateImm0_1ByEncoding(pstate_field);
1974
1.55k
  if (PState &&
1975
165
      AArch64_testFeatureList(Inst->csh->mode, PState->FeaturesRequired))
1976
165
    return Success;
1977
1.39k
  return Fail;
1978
1.55k
}
1979
1980
static DecodeStatus DecodeTestAndBranch(MCInst *Inst, uint32_t insn,
1981
          uint64_t Addr, const void *Decoder)
1982
7.42k
{
1983
7.42k
  uint64_t Rt = fieldFromInstruction_4(insn, 0, 5);
1984
7.42k
  uint64_t bit = fieldFromInstruction_4(insn, 31, 1) << 5;
1985
7.42k
  bit |= fieldFromInstruction_4(insn, 19, 5);
1986
7.42k
  int64_t dst = fieldFromInstruction_4(insn, 5, 14);
1987
1988
  // Sign-extend 14-bit immediate.
1989
7.42k
  if (dst & (1 << (14 - 1)))
1990
4.83k
    dst |= ~((1LL << 14) - 1);
1991
1992
7.42k
  if (fieldFromInstruction_4(insn, 31, 1) == 0)
1993
6.11k
    DecodeGPR32RegisterClass(Inst, Rt, Addr, Decoder);
1994
1.31k
  else
1995
1.31k
    DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
1996
7.42k
  MCOperand_CreateImm0(Inst, (bit));
1997
  // No symbols supported in Capstone
1998
  // if (!Decoder->tryAddingSymbolicOperand(Inst, dst * 4, Addr, true, 0, 0, 4))
1999
7.42k
  MCOperand_CreateImm0(Inst, (dst));
2000
2001
7.42k
  return Success;
2002
7.42k
}
2003
2004
static DecodeStatus DecodeGPRSeqPairsClassRegisterClass(MCInst *Inst,
2005
              unsigned RegClassID,
2006
              unsigned RegNo,
2007
              uint64_t Addr,
2008
              const void *Decoder)
2009
12.1k
{
2010
  // Register number must be even (see CASP instruction)
2011
12.1k
  if (RegNo & 0x1)
2012
25
    return Fail;
2013
2014
12.1k
  unsigned Reg =
2015
12.1k
    AArch64MCRegisterClasses[RegClassID].RegsBegin[RegNo / 2];
2016
12.1k
  MCOperand_CreateReg0(Inst, (Reg));
2017
12.1k
  return Success;
2018
12.1k
}
2019
2020
static DecodeStatus DecodeWSeqPairsClassRegisterClass(MCInst *Inst,
2021
                  unsigned RegNo,
2022
                  uint64_t Addr,
2023
                  const void *Decoder)
2024
3.09k
{
2025
3.09k
  return DecodeGPRSeqPairsClassRegisterClass(
2026
3.09k
    Inst, AArch64_WSeqPairsClassRegClassID, RegNo, Addr, Decoder);
2027
3.09k
}
2028
2029
static DecodeStatus DecodeXSeqPairsClassRegisterClass(MCInst *Inst,
2030
                  unsigned RegNo,
2031
                  uint64_t Addr,
2032
                  const void *Decoder)
2033
9.03k
{
2034
9.03k
  return DecodeGPRSeqPairsClassRegisterClass(
2035
9.03k
    Inst, AArch64_XSeqPairsClassRegClassID, RegNo, Addr, Decoder);
2036
9.03k
}
2037
2038
static DecodeStatus DecodeSyspXzrInstruction(MCInst *Inst, uint32_t insn,
2039
               uint64_t Addr, const void *Decoder)
2040
1.91k
{
2041
1.91k
  unsigned op1 = fieldFromInstruction_4(insn, 16, 3);
2042
1.91k
  unsigned CRn = fieldFromInstruction_4(insn, 12, 4);
2043
1.91k
  unsigned CRm = fieldFromInstruction_4(insn, 8, 4);
2044
1.91k
  unsigned op2 = fieldFromInstruction_4(insn, 5, 3);
2045
1.91k
  unsigned Rt = fieldFromInstruction_4(insn, 0, 5);
2046
1.91k
  if (Rt != 0x1f)
2047
0
    return Fail;
2048
2049
1.91k
  MCOperand_CreateImm0(Inst, (op1));
2050
1.91k
  MCOperand_CreateImm0(Inst, (CRn));
2051
1.91k
  MCOperand_CreateImm0(Inst, (CRm));
2052
1.91k
  MCOperand_CreateImm0(Inst, (op2));
2053
1.91k
  DecodeGPR64RegisterClass(Inst, Rt, Addr, Decoder);
2054
2055
1.91k
  return Success;
2056
1.91k
}
2057
2058
static DecodeStatus DecodeSVELogicalImmInstruction(MCInst *Inst, uint32_t insn,
2059
               uint64_t Addr,
2060
               const void *Decoder)
2061
15.3k
{
2062
15.3k
  unsigned Zdn = fieldFromInstruction_4(insn, 0, 5);
2063
15.3k
  unsigned imm = fieldFromInstruction_4(insn, 5, 13);
2064
15.3k
  if (!AArch64_AM_isValidDecodeLogicalImmediate(imm, 64))
2065
5
    return Fail;
2066
2067
  // The same (tied) operand is added twice to the instruction.
2068
15.3k
  DecodeZPRRegisterClass(Inst, Zdn, Addr, Decoder);
2069
15.3k
  if (MCInst_getOpcode(Inst) != AArch64_DUPM_ZI)
2070
1.88k
    DecodeZPRRegisterClass(Inst, Zdn, Addr, Decoder);
2071
15.3k
  MCOperand_CreateImm0(Inst, (imm));
2072
15.3k
  return Success;
2073
15.3k
}
2074
2075
#define DEFINE_DecodeSImm(Bits) \
2076
  static DecodeStatus CONCAT(DecodeSImm, Bits)(MCInst * Inst, \
2077
                 uint64_t Imm, \
2078
                 uint64_t Address, \
2079
                 const void *Decoder) \
2080
17.7k
  { \
2081
17.7k
    if (Imm & ~((1LL << Bits) - 1)) \
2082
17.7k
      return Fail; \
2083
17.7k
\
2084
17.7k
    if (Imm & (1 << (Bits - 1))) \
2085
17.7k
      Imm |= ~((1LL << Bits) - 1); \
2086
17.7k
\
2087
17.7k
    MCOperand_CreateImm0(Inst, (Imm)); \
2088
17.7k
    return Success; \
2089
17.7k
  }
AArch64Disassembler.c:DecodeSImm_5
Line
Count
Source
2080
3.33k
  { \
2081
3.33k
    if (Imm & ~((1LL << Bits) - 1)) \
2082
3.33k
      return Fail; \
2083
3.33k
\
2084
3.33k
    if (Imm & (1 << (Bits - 1))) \
2085
3.33k
      Imm |= ~((1LL << Bits) - 1); \
2086
3.33k
\
2087
3.33k
    MCOperand_CreateImm0(Inst, (Imm)); \
2088
3.33k
    return Success; \
2089
3.33k
  }
AArch64Disassembler.c:DecodeSImm_4
Line
Count
Source
2080
7.32k
  { \
2081
7.32k
    if (Imm & ~((1LL << Bits) - 1)) \
2082
7.32k
      return Fail; \
2083
7.32k
\
2084
7.32k
    if (Imm & (1 << (Bits - 1))) \
2085
7.32k
      Imm |= ~((1LL << Bits) - 1); \
2086
7.32k
\
2087
7.32k
    MCOperand_CreateImm0(Inst, (Imm)); \
2088
7.32k
    return Success; \
2089
7.32k
  }
AArch64Disassembler.c:DecodeSImm_6
Line
Count
Source
2080
1.54k
  { \
2081
1.54k
    if (Imm & ~((1LL << Bits) - 1)) \
2082
1.54k
      return Fail; \
2083
1.54k
\
2084
1.54k
    if (Imm & (1 << (Bits - 1))) \
2085
1.54k
      Imm |= ~((1LL << Bits) - 1); \
2086
1.54k
\
2087
1.54k
    MCOperand_CreateImm0(Inst, (Imm)); \
2088
1.54k
    return Success; \
2089
1.54k
  }
AArch64Disassembler.c:DecodeSImm_8
Line
Count
Source
2080
954
  { \
2081
954
    if (Imm & ~((1LL << Bits) - 1)) \
2082
954
      return Fail; \
2083
954
\
2084
954
    if (Imm & (1 << (Bits - 1))) \
2085
954
      Imm |= ~((1LL << Bits) - 1); \
2086
954
\
2087
954
    MCOperand_CreateImm0(Inst, (Imm)); \
2088
954
    return Success; \
2089
954
  }
AArch64Disassembler.c:DecodeSImm_9
Line
Count
Source
2080
3.01k
  { \
2081
3.01k
    if (Imm & ~((1LL << Bits) - 1)) \
2082
3.01k
      return Fail; \
2083
3.01k
\
2084
3.01k
    if (Imm & (1 << (Bits - 1))) \
2085
3.01k
      Imm |= ~((1LL << Bits) - 1); \
2086
3.01k
\
2087
3.01k
    MCOperand_CreateImm0(Inst, (Imm)); \
2088
3.01k
    return Success; \
2089
3.01k
  }
AArch64Disassembler.c:DecodeSImm_10
Line
Count
Source
2080
1.55k
  { \
2081
1.55k
    if (Imm & ~((1LL << Bits) - 1)) \
2082
1.55k
      return Fail; \
2083
1.55k
\
2084
1.55k
    if (Imm & (1 << (Bits - 1))) \
2085
1.55k
      Imm |= ~((1LL << Bits) - 1); \
2086
1.55k
\
2087
1.55k
    MCOperand_CreateImm0(Inst, (Imm)); \
2088
1.55k
    return Success; \
2089
1.55k
  }
2090
DEFINE_DecodeSImm(4);
2091
DEFINE_DecodeSImm(5);
2092
DEFINE_DecodeSImm(6);
2093
DEFINE_DecodeSImm(8);
2094
DEFINE_DecodeSImm(9);
2095
DEFINE_DecodeSImm(10);
2096
2097
// Decode 8-bit signed/unsigned immediate for a given element width.
2098
#define DEFINE_DecodeImm8OptLsl(ElementWidth) \
2099
  static DecodeStatus CONCAT(DecodeImm8OptLsl, ElementWidth)( \
2100
    MCInst * Inst, unsigned Imm, uint64_t Addr, \
2101
    const void *Decoder) \
2102
4.33k
  { \
2103
4.33k
    unsigned Val = (uint8_t)Imm; \
2104
4.33k
    unsigned Shift = (Imm & 0x100) ? 8 : 0; \
2105
4.33k
    if (ElementWidth == 8 && Shift) \
2106
4.33k
      return Fail; \
2107
4.33k
    MCOperand_CreateImm0(Inst, (Val)); \
2108
4.33k
    MCOperand_CreateImm0(Inst, (Shift)); \
2109
4.33k
    return Success; \
2110
4.33k
  }
AArch64Disassembler.c:DecodeImm8OptLsl_8
Line
Count
Source
2102
968
  { \
2103
968
    unsigned Val = (uint8_t)Imm; \
2104
968
    unsigned Shift = (Imm & 0x100) ? 8 : 0; \
2105
968
    if (ElementWidth == 8 && Shift) \
2106
968
      return Fail; \
2107
968
    MCOperand_CreateImm0(Inst, (Val)); \
2108
961
    MCOperand_CreateImm0(Inst, (Shift)); \
2109
961
    return Success; \
2110
968
  }
AArch64Disassembler.c:DecodeImm8OptLsl_16
Line
Count
Source
2102
567
  { \
2103
567
    unsigned Val = (uint8_t)Imm; \
2104
567
    unsigned Shift = (Imm & 0x100) ? 8 : 0; \
2105
567
    if (ElementWidth == 8 && Shift) \
2106
567
      return Fail; \
2107
567
    MCOperand_CreateImm0(Inst, (Val)); \
2108
567
    MCOperand_CreateImm0(Inst, (Shift)); \
2109
567
    return Success; \
2110
567
  }
AArch64Disassembler.c:DecodeImm8OptLsl_32
Line
Count
Source
2102
563
  { \
2103
563
    unsigned Val = (uint8_t)Imm; \
2104
563
    unsigned Shift = (Imm & 0x100) ? 8 : 0; \
2105
563
    if (ElementWidth == 8 && Shift) \
2106
563
      return Fail; \
2107
563
    MCOperand_CreateImm0(Inst, (Val)); \
2108
563
    MCOperand_CreateImm0(Inst, (Shift)); \
2109
563
    return Success; \
2110
563
  }
AArch64Disassembler.c:DecodeImm8OptLsl_64
Line
Count
Source
2102
2.23k
  { \
2103
2.23k
    unsigned Val = (uint8_t)Imm; \
2104
2.23k
    unsigned Shift = (Imm & 0x100) ? 8 : 0; \
2105
2.23k
    if (ElementWidth == 8 && Shift) \
2106
2.23k
      return Fail; \
2107
2.23k
    MCOperand_CreateImm0(Inst, (Val)); \
2108
2.23k
    MCOperand_CreateImm0(Inst, (Shift)); \
2109
2.23k
    return Success; \
2110
2.23k
  }
2111
DEFINE_DecodeImm8OptLsl(8);
2112
DEFINE_DecodeImm8OptLsl(16);
2113
DEFINE_DecodeImm8OptLsl(32);
2114
DEFINE_DecodeImm8OptLsl(64);
2115
2116
// Decode uimm4 ranged from 1-16.
2117
static DecodeStatus DecodeSVEIncDecImm(MCInst *Inst, unsigned Imm,
2118
               uint64_t Addr, const void *Decoder)
2119
11.4k
{
2120
11.4k
  MCOperand_CreateImm0(Inst, (Imm + 1));
2121
11.4k
  return Success;
2122
11.4k
}
2123
2124
static DecodeStatus DecodeSVCROp(MCInst *Inst, unsigned Imm, uint64_t Address,
2125
         const void *Decoder)
2126
1.64k
{
2127
1.64k
  if (AArch64SVCR_lookupSVCRByEncoding(Imm)) {
2128
481
    MCOperand_CreateImm0(Inst, (Imm));
2129
481
    return Success;
2130
481
  }
2131
1.16k
  return Fail;
2132
1.64k
}
2133
2134
static DecodeStatus DecodeCPYMemOpInstruction(MCInst *Inst, uint32_t insn,
2135
                uint64_t Addr,
2136
                const void *Decoder)
2137
463
{
2138
463
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
2139
463
  unsigned Rs = fieldFromInstruction_4(insn, 16, 5);
2140
463
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
2141
2142
  // None of the registers may alias: if they do, then the instruction is not
2143
  // merely unpredictable but actually entirely unallocated.
2144
463
  if (Rd == Rs || Rs == Rn || Rd == Rn)
2145
8
    return MCDisassembler_Fail;
2146
2147
  // All three register operands are written back, so they all appear
2148
  // twice in the operand list, once as outputs and once as inputs.
2149
455
  if (!DecodeGPR64commonRegisterClass(Inst, Rd, Addr, Decoder) ||
2150
453
      !DecodeGPR64commonRegisterClass(Inst, Rs, Addr, Decoder) ||
2151
451
      !DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder) ||
2152
451
      !DecodeGPR64commonRegisterClass(Inst, Rd, Addr, Decoder) ||
2153
451
      !DecodeGPR64commonRegisterClass(Inst, Rs, Addr, Decoder) ||
2154
451
      !DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder))
2155
4
    return MCDisassembler_Fail;
2156
2157
451
  return MCDisassembler_Success;
2158
455
}
2159
2160
static DecodeStatus DecodeSETMemOpInstruction(MCInst *Inst, uint32_t insn,
2161
                uint64_t Addr,
2162
                const void *Decoder)
2163
294
{
2164
294
  unsigned Rd = fieldFromInstruction_4(insn, 0, 5);
2165
294
  unsigned Rm = fieldFromInstruction_4(insn, 16, 5);
2166
294
  unsigned Rn = fieldFromInstruction_4(insn, 5, 5);
2167
2168
  // None of the registers may alias: if they do, then the instruction is not
2169
  // merely unpredictable but actually entirely unallocated.
2170
294
  if (Rd == Rm || Rm == Rn || Rd == Rn)
2171
7
    return MCDisassembler_Fail;
2172
2173
  // Rd and Rn (not Rm) register operands are written back, so they appear
2174
  // twice in the operand list, once as outputs and once as inputs.
2175
287
  if (!DecodeGPR64commonRegisterClass(Inst, Rd, Addr, Decoder) ||
2176
285
      !DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder) ||
2177
285
      !DecodeGPR64commonRegisterClass(Inst, Rd, Addr, Decoder) ||
2178
285
      !DecodeGPR64RegisterClass(Inst, Rn, Addr, Decoder) ||
2179
285
      !DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder))
2180
2
    return MCDisassembler_Fail;
2181
2182
285
  return MCDisassembler_Success;
2183
287
}
2184
2185
static DecodeStatus DecodePRFMRegInstruction(MCInst *Inst, uint32_t insn,
2186
               uint64_t Addr, const void *Decoder)
2187
1.29k
{
2188
  // PRFM with Rt = '11xxx' should be decoded as RPRFM.
2189
  // Fail to decode and defer to fallback decoder table to decode RPRFM.
2190
1.29k
  unsigned Mask = 0x18;
2191
1.29k
  uint64_t Rt = fieldFromInstruction_4(insn, 0, 5);
2192
1.29k
  if ((Rt & Mask) == Mask)
2193
880
    return Fail;
2194
2195
418
  uint64_t Rn = fieldFromInstruction_4(insn, 5, 5);
2196
418
  uint64_t Shift = fieldFromInstruction_4(insn, 12, 1);
2197
418
  uint64_t Extend = fieldFromInstruction_4(insn, 15, 1);
2198
418
  uint64_t Rm = fieldFromInstruction_4(insn, 16, 5);
2199
2200
418
  MCOperand_CreateImm0(Inst, (Rt));
2201
418
  DecodeGPR64spRegisterClass(Inst, Rn, Addr, Decoder);
2202
2203
418
  switch (MCInst_getOpcode(Inst)) {
2204
0
  default:
2205
0
    return Fail;
2206
116
  case AArch64_PRFMroW:
2207
116
    DecodeGPR32RegisterClass(Inst, Rm, Addr, Decoder);
2208
116
    break;
2209
302
  case AArch64_PRFMroX:
2210
302
    DecodeGPR64RegisterClass(Inst, Rm, Addr, Decoder);
2211
302
    break;
2212
418
  }
2213
2214
418
  DecodeMemExtend(Inst, (Extend << 1) | Shift, Addr, Decoder);
2215
2216
418
  return Success;
2217
418
}