Coverage Report

Created: 2025-07-11 06:32

/src/capstonenext/arch/ARM/ARMDisassembler.c
Line
Count
Source (jump to first uncovered line)
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
//===- ARMDisassembler.cpp - Disassembler for ARM/Thumb ISA ---------------===//
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
#include <capstone/platform.h>
24
#include <stdio.h>
25
#include <stdlib.h>
26
#include <string.h>
27
#include <stdlib.h>
28
#include <capstone/platform.h>
29
30
#include <capstone/platform.h>
31
32
#include "../../LEB128.h"
33
#include "../../MCDisassembler.h"
34
#include "../../MCFixedLenDisassembler.h"
35
#include "../../MCInst.h"
36
#include "../../MCInstrDesc.h"
37
#include "../../MCRegisterInfo.h"
38
#include "../../MathExtras.h"
39
#include "../../cs_priv.h"
40
#include "../../utils.h"
41
#include "ARMAddressingModes.h"
42
#include "ARMBaseInfo.h"
43
#include "ARMDisassemblerExtension.h"
44
45
#include "ARMLinkage.h"
46
#include "ARMMapping.h"
47
48
#define GET_INSTRINFO_MC_DESC
49
#include "ARMGenInstrInfo.inc"
50
51
11.5k
#define CONCAT(a, b) CONCAT_(a, b)
52
11.5k
#define CONCAT_(a, b) a##_##b
53
54
// end anonymous namespace
55
56
// Forward declare these because the autogenerated code will reference them.
57
// Definitions are further down.
58
static DecodeStatus DecodeGPRRegisterClass(MCInst *Inst, unsigned RegNo,
59
             uint64_t Address,
60
             const void *Decoder);
61
static DecodeStatus DecodeCLRMGPRRegisterClass(MCInst *Inst, unsigned RegNo,
62
                 uint64_t Address,
63
                 const void *Decoder);
64
static DecodeStatus DecodetGPROddRegisterClass(MCInst *Inst, unsigned RegNo,
65
                 uint64_t Address,
66
                 const void *Decoder);
67
static DecodeStatus DecodetGPREvenRegisterClass(MCInst *Inst, unsigned RegNo,
68
            uint64_t Address,
69
            const void *Decoder);
70
static DecodeStatus
71
DecodeGPRwithAPSR_NZCVnospRegisterClass(MCInst *Inst, unsigned RegNo,
72
          uint64_t Address, const void *Decoder);
73
static DecodeStatus DecodeGPRnopcRegisterClass(MCInst *Inst, unsigned RegNo,
74
                 uint64_t Address,
75
                 const void *Decoder);
76
static DecodeStatus DecodeGPRnospRegisterClass(MCInst *Inst, unsigned RegNo,
77
                 uint64_t Address,
78
                 const void *Decoder);
79
static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst *Inst, unsigned RegNo,
80
               uint64_t Address,
81
               const void *Decoder);
82
static DecodeStatus DecodeGPRwithZRRegisterClass(MCInst *Inst, unsigned RegNo,
83
             uint64_t Address,
84
             const void *Decoder);
85
static DecodeStatus DecodeGPRwithZRnospRegisterClass(MCInst *Inst,
86
                 unsigned RegNo,
87
                 uint64_t Address,
88
                 const void *Decoder);
89
static DecodeStatus DecodetGPRRegisterClass(MCInst *Inst, unsigned RegNo,
90
              uint64_t Address,
91
              const void *Decoder);
92
static DecodeStatus DecodetcGPRRegisterClass(MCInst *Inst, unsigned RegNo,
93
               uint64_t Address,
94
               const void *Decoder);
95
static DecodeStatus DecoderGPRRegisterClass(MCInst *Inst, unsigned RegNo,
96
              uint64_t Address,
97
              const void *Decoder);
98
static DecodeStatus DecodeGPRPairRegisterClass(MCInst *Inst, unsigned RegNo,
99
                 uint64_t Address,
100
                 const void *Decoder);
101
static DecodeStatus DecodeGPRPairnospRegisterClass(MCInst *Inst, unsigned RegNo,
102
               uint64_t Address,
103
               const void *Decoder);
104
static DecodeStatus DecodeGPRspRegisterClass(MCInst *Inst, unsigned RegNo,
105
               uint64_t Address,
106
               const void *Decoder);
107
static DecodeStatus DecodeHPRRegisterClass(MCInst *Inst, unsigned RegNo,
108
             uint64_t Address,
109
             const void *Decoder);
110
static DecodeStatus DecodeSPRRegisterClass(MCInst *Inst, unsigned RegNo,
111
             uint64_t Address,
112
             const void *Decoder);
113
static DecodeStatus DecodeDPRRegisterClass(MCInst *Inst, unsigned RegNo,
114
             uint64_t Address,
115
             const void *Decoder);
116
static DecodeStatus DecodeDPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
117
               uint64_t Address,
118
               const void *Decoder);
119
static DecodeStatus DecodeSPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
120
               uint64_t Address,
121
               const void *Decoder);
122
static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst *Inst, unsigned RegNo,
123
            uint64_t Address,
124
            const void *Decoder);
125
static DecodeStatus DecodeQPRRegisterClass(MCInst *Inst, unsigned RegNo,
126
             uint64_t Address,
127
             const void *Decoder);
128
static DecodeStatus DecodeMQPRRegisterClass(MCInst *Inst, unsigned RegNo,
129
              uint64_t Address,
130
              const void *Decoder);
131
static DecodeStatus DecodeMQQPRRegisterClass(MCInst *Inst, unsigned RegNo,
132
               uint64_t Address,
133
               const void *Decoder);
134
static DecodeStatus DecodeMQQQQPRRegisterClass(MCInst *Inst, unsigned RegNo,
135
                 uint64_t Address,
136
                 const void *Decoder);
137
static DecodeStatus DecodeDPairRegisterClass(MCInst *Inst, unsigned RegNo,
138
               uint64_t Address,
139
               const void *Decoder);
140
static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst *Inst, unsigned RegNo,
141
               uint64_t Address,
142
               const void *Decoder);
143
144
static DecodeStatus DecodePredicateOperand(MCInst *Inst, unsigned Val,
145
             uint64_t Address,
146
             const void *Decoder);
147
static DecodeStatus DecodeCCOutOperand(MCInst *Inst, unsigned Val,
148
               uint64_t Address, const void *Decoder);
149
static DecodeStatus DecodeRegListOperand(MCInst *Inst, unsigned Val,
150
           uint64_t Address, const void *Decoder);
151
static DecodeStatus DecodeSPRRegListOperand(MCInst *Inst, unsigned Val,
152
              uint64_t Address,
153
              const void *Decoder);
154
static DecodeStatus DecodeDPRRegListOperand(MCInst *Inst, unsigned Val,
155
              uint64_t Address,
156
              const void *Decoder);
157
158
static DecodeStatus DecodeBitfieldMaskOperand(MCInst *Inst, unsigned Insn,
159
                uint64_t Address,
160
                const void *Decoder);
161
static DecodeStatus DecodeCopMemInstruction(MCInst *Inst, unsigned Insn,
162
              uint64_t Address,
163
              const void *Decoder);
164
static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst *Inst, unsigned Insn,
165
              uint64_t Address,
166
              const void *Decoder);
167
static DecodeStatus DecodeSORegMemOperand(MCInst *Inst, unsigned Insn,
168
            uint64_t Address,
169
            const void *Decoder);
170
static DecodeStatus DecodeAddrMode3Instruction(MCInst *Inst, unsigned Insn,
171
                 uint64_t Address,
172
                 const void *Decoder);
173
static DecodeStatus DecodeTSBInstruction(MCInst *Inst, unsigned Insn,
174
           uint64_t Address, const void *Decoder);
175
static DecodeStatus DecodeSORegImmOperand(MCInst *Inst, unsigned Insn,
176
            uint64_t Address,
177
            const void *Decoder);
178
static DecodeStatus DecodeSORegRegOperand(MCInst *Inst, unsigned Insn,
179
            uint64_t Address,
180
            const void *Decoder);
181
182
static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst *Inst,
183
                unsigned Insn,
184
                uint64_t Adddress,
185
                const void *Decoder);
186
static DecodeStatus DecodeT2MOVTWInstruction(MCInst *Inst, unsigned Insn,
187
               uint64_t Address,
188
               const void *Decoder);
189
static DecodeStatus DecodeArmMOVTWInstruction(MCInst *Inst, unsigned Insn,
190
                uint64_t Address,
191
                const void *Decoder);
192
static DecodeStatus DecodeSMLAInstruction(MCInst *Inst, unsigned Insn,
193
            uint64_t Address,
194
            const void *Decoder);
195
static DecodeStatus DecodeHINTInstruction(MCInst *Inst, unsigned Insn,
196
            uint64_t Address,
197
            const void *Decoder);
198
static DecodeStatus DecodeCPSInstruction(MCInst *Inst, unsigned Insn,
199
           uint64_t Address, const void *Decoder);
200
static DecodeStatus DecodeTSTInstruction(MCInst *Inst, unsigned Insn,
201
           uint64_t Address, const void *Decoder);
202
static DecodeStatus DecodeSETPANInstruction(MCInst *Inst, unsigned Insn,
203
              uint64_t Address,
204
              const void *Decoder);
205
static DecodeStatus DecodeT2CPSInstruction(MCInst *Inst, unsigned Insn,
206
             uint64_t Address,
207
             const void *Decoder);
208
static DecodeStatus DecodeT2HintSpaceInstruction(MCInst *Inst, unsigned Insn,
209
             uint64_t Address,
210
             const void *Decoder);
211
static DecodeStatus DecodeAddrModeImm12Operand(MCInst *Inst, unsigned Val,
212
                 uint64_t Address,
213
                 const void *Decoder);
214
static DecodeStatus DecodeAddrMode5Operand(MCInst *Inst, unsigned Val,
215
             uint64_t Address,
216
             const void *Decoder);
217
static DecodeStatus DecodeAddrMode5FP16Operand(MCInst *Inst, unsigned Val,
218
                 uint64_t Address,
219
                 const void *Decoder);
220
static DecodeStatus DecodeAddrMode7Operand(MCInst *Inst, unsigned Val,
221
             uint64_t Address,
222
             const void *Decoder);
223
static DecodeStatus DecodeT2BInstruction(MCInst *Inst, unsigned Insn,
224
           uint64_t Address, const void *Decoder);
225
static DecodeStatus DecodeBranchImmInstruction(MCInst *Inst, unsigned Insn,
226
                 uint64_t Address,
227
                 const void *Decoder);
228
static DecodeStatus DecodeAddrMode6Operand(MCInst *Inst, unsigned Val,
229
             uint64_t Address,
230
             const void *Decoder);
231
static DecodeStatus DecodeVLDST1Instruction(MCInst *Inst, unsigned Val,
232
              uint64_t Address,
233
              const void *Decoder);
234
static DecodeStatus DecodeVLDST2Instruction(MCInst *Inst, unsigned Val,
235
              uint64_t Address,
236
              const void *Decoder);
237
static DecodeStatus DecodeVLDST3Instruction(MCInst *Inst, unsigned Val,
238
              uint64_t Address,
239
              const void *Decoder);
240
static DecodeStatus DecodeVLDST4Instruction(MCInst *Inst, unsigned Val,
241
              uint64_t Address,
242
              const void *Decoder);
243
static DecodeStatus DecodeVLDInstruction(MCInst *Inst, unsigned Val,
244
           uint64_t Address, const void *Decoder);
245
static DecodeStatus DecodeVSTInstruction(MCInst *Inst, unsigned Val,
246
           uint64_t Address, const void *Decoder);
247
static DecodeStatus DecodeVLD1DupInstruction(MCInst *Inst, unsigned Val,
248
               uint64_t Address,
249
               const void *Decoder);
250
static DecodeStatus DecodeVLD2DupInstruction(MCInst *Inst, unsigned Val,
251
               uint64_t Address,
252
               const void *Decoder);
253
static DecodeStatus DecodeVLD3DupInstruction(MCInst *Inst, unsigned Val,
254
               uint64_t Address,
255
               const void *Decoder);
256
static DecodeStatus DecodeVLD4DupInstruction(MCInst *Inst, unsigned Val,
257
               uint64_t Address,
258
               const void *Decoder);
259
static DecodeStatus DecodeVMOVModImmInstruction(MCInst *Inst, unsigned Val,
260
            uint64_t Address,
261
            const void *Decoder);
262
static DecodeStatus DecodeMVEModImmInstruction(MCInst *Inst, unsigned Val,
263
                 uint64_t Address,
264
                 const void *Decoder);
265
static DecodeStatus DecodeMVEVADCInstruction(MCInst *Inst, unsigned Insn,
266
               uint64_t Address,
267
               const void *Decoder);
268
static DecodeStatus DecodeVSHLMaxInstruction(MCInst *Inst, unsigned Val,
269
               uint64_t Address,
270
               const void *Decoder);
271
static DecodeStatus DecodeShiftRight8Imm(MCInst *Inst, unsigned Val,
272
           uint64_t Address, const void *Decoder);
273
static DecodeStatus DecodeShiftRight16Imm(MCInst *Inst, unsigned Val,
274
            uint64_t Address,
275
            const void *Decoder);
276
static DecodeStatus DecodeShiftRight32Imm(MCInst *Inst, unsigned Val,
277
            uint64_t Address,
278
            const void *Decoder);
279
static DecodeStatus DecodeShiftRight64Imm(MCInst *Inst, unsigned Val,
280
            uint64_t Address,
281
            const void *Decoder);
282
static DecodeStatus DecodeTBLInstruction(MCInst *Inst, unsigned Insn,
283
           uint64_t Address, const void *Decoder);
284
static DecodeStatus DecodePostIdxReg(MCInst *Inst, unsigned Insn,
285
             uint64_t Address, const void *Decoder);
286
static DecodeStatus DecodeMveAddrModeRQ(MCInst *Inst, unsigned Insn,
287
          uint64_t Address, const void *Decoder);
288
#define DECLARE_DecodeMveAddrModeQ(shift) \
289
  static DecodeStatus CONCAT(DecodeMveAddrModeQ, shift)( \
290
    MCInst * Inst, unsigned Insn, uint64_t Address, \
291
    const void *Decoder);
292
DECLARE_DecodeMveAddrModeQ(2);
293
DECLARE_DecodeMveAddrModeQ(3);
294
295
static DecodeStatus DecodeCoprocessor(MCInst *Inst, unsigned Insn,
296
              uint64_t Address, const void *Decoder);
297
static DecodeStatus DecodeMemBarrierOption(MCInst *Inst, unsigned Insn,
298
             uint64_t Address,
299
             const void *Decoder);
300
static DecodeStatus DecodeInstSyncBarrierOption(MCInst *Inst, unsigned Insn,
301
            uint64_t Address,
302
            const void *Decoder);
303
static DecodeStatus DecodeMSRMask(MCInst *Inst, unsigned Insn, uint64_t Address,
304
          const void *Decoder);
305
static DecodeStatus DecodeBankedReg(MCInst *Inst, unsigned Insn,
306
            uint64_t Address, const void *Decoder);
307
static DecodeStatus DecodeDoubleRegLoad(MCInst *Inst, unsigned Insn,
308
          uint64_t Address, const void *Decoder);
309
static DecodeStatus DecodeDoubleRegStore(MCInst *Inst, unsigned Insn,
310
           uint64_t Address, const void *Decoder);
311
static DecodeStatus DecodeLDRPreImm(MCInst *Inst, unsigned Insn,
312
            uint64_t Address, const void *Decoder);
313
static DecodeStatus DecodeLDRPreReg(MCInst *Inst, unsigned Insn,
314
            uint64_t Address, const void *Decoder);
315
static DecodeStatus DecodeSTRPreImm(MCInst *Inst, unsigned Insn,
316
            uint64_t Address, const void *Decoder);
317
static DecodeStatus DecodeSTRPreReg(MCInst *Inst, unsigned Insn,
318
            uint64_t Address, const void *Decoder);
319
static DecodeStatus DecodeVLD1LN(MCInst *Inst, unsigned Insn, uint64_t Address,
320
         const void *Decoder);
321
static DecodeStatus DecodeVLD2LN(MCInst *Inst, unsigned Insn, uint64_t Address,
322
         const void *Decoder);
323
static DecodeStatus DecodeVLD3LN(MCInst *Inst, unsigned Insn, uint64_t Address,
324
         const void *Decoder);
325
static DecodeStatus DecodeVLD4LN(MCInst *Inst, unsigned Insn, uint64_t Address,
326
         const void *Decoder);
327
static DecodeStatus DecodeVST1LN(MCInst *Inst, unsigned Insn, uint64_t Address,
328
         const void *Decoder);
329
static DecodeStatus DecodeVST2LN(MCInst *Inst, unsigned Insn, uint64_t Address,
330
         const void *Decoder);
331
static DecodeStatus DecodeVST3LN(MCInst *Inst, unsigned Insn, uint64_t Address,
332
         const void *Decoder);
333
static DecodeStatus DecodeVST4LN(MCInst *Inst, unsigned Insn, uint64_t Address,
334
         const void *Decoder);
335
static DecodeStatus DecodeVMOVSRR(MCInst *Inst, unsigned Insn, uint64_t Address,
336
          const void *Decoder);
337
static DecodeStatus DecodeVMOVRRS(MCInst *Inst, unsigned Insn, uint64_t Address,
338
          const void *Decoder);
339
static DecodeStatus DecodeSwap(MCInst *Inst, unsigned Insn, uint64_t Address,
340
             const void *Decoder);
341
static DecodeStatus DecodeVCVTD(MCInst *Inst, unsigned Insn, uint64_t Address,
342
        const void *Decoder);
343
static DecodeStatus DecodeVCVTQ(MCInst *Inst, unsigned Insn, uint64_t Address,
344
        const void *Decoder);
345
static DecodeStatus DecodeVCVTImmOperand(MCInst *Inst, unsigned Insn,
346
           uint64_t Address, const void *Decoder);
347
static DecodeStatus DecodeNEONComplexLane64Instruction(MCInst *Inst,
348
                   unsigned Val,
349
                   uint64_t Address,
350
                   const void *Decoder);
351
352
static DecodeStatus DecodeThumbAddSpecialReg(MCInst *Inst, uint16_t Insn,
353
               uint64_t Address,
354
               const void *Decoder);
355
static DecodeStatus DecodeThumbBROperand(MCInst *Inst, unsigned Val,
356
           uint64_t Address, const void *Decoder);
357
static DecodeStatus DecodeT2BROperand(MCInst *Inst, unsigned Val,
358
              uint64_t Address, const void *Decoder);
359
static DecodeStatus DecodeThumbCmpBROperand(MCInst *Inst, unsigned Val,
360
              uint64_t Address,
361
              const void *Decoder);
362
static DecodeStatus DecodeThumbAddrModeRR(MCInst *Inst, unsigned Val,
363
            uint64_t Address,
364
            const void *Decoder);
365
static DecodeStatus DecodeThumbAddrModeIS(MCInst *Inst, unsigned Val,
366
            uint64_t Address,
367
            const void *Decoder);
368
static DecodeStatus DecodeThumbAddrModePC(MCInst *Inst, unsigned Val,
369
            uint64_t Address,
370
            const void *Decoder);
371
static DecodeStatus DecodeThumbAddrModeSP(MCInst *Inst, unsigned Val,
372
            uint64_t Address,
373
            const void *Decoder);
374
static DecodeStatus DecodeT2AddrModeSOReg(MCInst *Inst, unsigned Val,
375
            uint64_t Address,
376
            const void *Decoder);
377
static DecodeStatus DecodeT2LoadShift(MCInst *Inst, unsigned Val,
378
              uint64_t Address, const void *Decoder);
379
static DecodeStatus DecodeT2LoadImm8(MCInst *Inst, unsigned Insn,
380
             uint64_t Address, const void *Decoder);
381
static DecodeStatus DecodeT2LoadImm12(MCInst *Inst, unsigned Insn,
382
              uint64_t Address, const void *Decoder);
383
static DecodeStatus DecodeT2LoadT(MCInst *Inst, unsigned Insn, uint64_t Address,
384
          const void *Decoder);
385
static DecodeStatus DecodeT2LoadLabel(MCInst *Inst, unsigned Insn,
386
              uint64_t Address, const void *Decoder);
387
static DecodeStatus DecodeT2Imm8S4(MCInst *Inst, unsigned Val, uint64_t Address,
388
           const void *Decoder);
389
static DecodeStatus DecodeT2Imm7S4(MCInst *Inst, unsigned Val, uint64_t Address,
390
           const void *Decoder);
391
static DecodeStatus DecodeT2AddrModeImm8s4(MCInst *Inst, unsigned Val,
392
             uint64_t Address,
393
             const void *Decoder);
394
static DecodeStatus DecodeT2AddrModeImm7s4(MCInst *Inst, unsigned Val,
395
             uint64_t Address,
396
             const void *Decoder);
397
static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst *Inst, unsigned Val,
398
            uint64_t Address,
399
            const void *Decoder);
400
static DecodeStatus DecodeT2Imm8(MCInst *Inst, unsigned Val, uint64_t Address,
401
         const void *Decoder);
402
#define DECLARE_DecodeT2Imm7(shift) \
403
  static DecodeStatus CONCAT(DecodeT2Imm7, shift)(MCInst * Inst, \
404
              unsigned Val, \
405
              uint64_t Address, \
406
              const void *Decoder);
407
DECLARE_DecodeT2Imm7(0);
408
DECLARE_DecodeT2Imm7(1);
409
DECLARE_DecodeT2Imm7(2);
410
411
static DecodeStatus DecodeT2AddrModeImm8(MCInst *Inst, unsigned Val,
412
           uint64_t Address, const void *Decoder);
413
#define DECLARE_DecodeTAddrModeImm7(shift) \
414
  static DecodeStatus CONCAT(DecodeTAddrModeImm7, shift)( \
415
    MCInst * Inst, unsigned Val, uint64_t Address, \
416
    const void *Decoder);
417
DECLARE_DecodeTAddrModeImm7(0);
418
DECLARE_DecodeTAddrModeImm7(1);
419
420
#define DECLARE_DecodeT2AddrModeImm7(shift, WriteBack) \
421
  static DecodeStatus CONCAT(DecodeT2AddrModeImm7, \
422
           CONCAT(shift, WriteBack))( \
423
    MCInst * Inst, unsigned Val, uint64_t Address, \
424
    const void *Decoder);
425
DECLARE_DecodeT2AddrModeImm7(0, 0);
426
DECLARE_DecodeT2AddrModeImm7(1, 0);
427
DECLARE_DecodeT2AddrModeImm7(2, 0);
428
DECLARE_DecodeT2AddrModeImm7(0, 1);
429
DECLARE_DecodeT2AddrModeImm7(1, 1);
430
DECLARE_DecodeT2AddrModeImm7(2, 1);
431
432
static DecodeStatus DecodeThumbAddSPImm(MCInst *Inst, uint16_t Val,
433
          uint64_t Address, const void *Decoder);
434
static DecodeStatus DecodeThumbAddSPReg(MCInst *Inst, uint16_t Insn,
435
          uint64_t Address, const void *Decoder);
436
static DecodeStatus DecodeThumbCPS(MCInst *Inst, uint16_t Insn,
437
           uint64_t Address, const void *Decoder);
438
static DecodeStatus DecodeQADDInstruction(MCInst *Inst, unsigned Insn,
439
            uint64_t Address,
440
            const void *Decoder);
441
static DecodeStatus DecodeThumbBLXOffset(MCInst *Inst, unsigned Insn,
442
           uint64_t Address, const void *Decoder);
443
static DecodeStatus DecodeT2AddrModeImm12(MCInst *Inst, unsigned Val,
444
            uint64_t Address,
445
            const void *Decoder);
446
static DecodeStatus DecodeThumbTableBranch(MCInst *Inst, unsigned Val,
447
             uint64_t Address,
448
             const void *Decoder);
449
static DecodeStatus DecodeThumb2BCCInstruction(MCInst *Inst, unsigned Val,
450
                 uint64_t Address,
451
                 const void *Decoder);
452
static DecodeStatus DecodeT2SOImm(MCInst *Inst, unsigned Val, uint64_t Address,
453
          const void *Decoder);
454
static DecodeStatus DecodeThumbBCCTargetOperand(MCInst *Inst, unsigned Val,
455
            uint64_t Address,
456
            const void *Decoder);
457
static DecodeStatus DecodeThumbBLTargetOperand(MCInst *Inst, unsigned Val,
458
                 uint64_t Address,
459
                 const void *Decoder);
460
static DecodeStatus DecodeIT(MCInst *Inst, unsigned Val, uint64_t Address,
461
           const void *Decoder);
462
static DecodeStatus DecodeT2LDRDPreInstruction(MCInst *Inst, unsigned Insn,
463
                 uint64_t Address,
464
                 const void *Decoder);
465
static DecodeStatus DecodeT2STRDPreInstruction(MCInst *Inst, unsigned Insn,
466
                 uint64_t Address,
467
                 const void *Decoder);
468
static DecodeStatus DecodeT2Adr(MCInst *Inst, unsigned Val, uint64_t Address,
469
        const void *Decoder);
470
static DecodeStatus DecodeT2LdStPre(MCInst *Inst, unsigned Val,
471
            uint64_t Address, const void *Decoder);
472
static DecodeStatus DecodeT2ShifterImmOperand(MCInst *Inst, unsigned Val,
473
                uint64_t Address,
474
                const void *Decoder);
475
476
static DecodeStatus DecodeLDR(MCInst *Inst, unsigned Val, uint64_t Address,
477
            const void *Decoder);
478
static DecodeStatus DecoderForMRRC2AndMCRR2(MCInst *Inst, unsigned Val,
479
              uint64_t Address,
480
              const void *Decoder);
481
static DecodeStatus DecodeForVMRSandVMSR(MCInst *Inst, unsigned Val,
482
           uint64_t Address, const void *Decoder);
483
484
#define DECLARE_DecodeBFLabelOperand(isSigned, isNeg, zeroPermitted, size) \
485
  static DecodeStatus CONCAT( \
486
    DecodeBFLabelOperand, \
487
    CONCAT(isSigned, CONCAT(isNeg, CONCAT(zeroPermitted, size))))( \
488
    MCInst * Inst, unsigned val, uint64_t Address, \
489
    const void *Decoder);
490
DECLARE_DecodeBFLabelOperand(false, false, false, 4);
491
DECLARE_DecodeBFLabelOperand(true, false, true, 18);
492
DECLARE_DecodeBFLabelOperand(true, false, true, 12);
493
DECLARE_DecodeBFLabelOperand(true, false, true, 16);
494
DECLARE_DecodeBFLabelOperand(false, true, true, 11);
495
DECLARE_DecodeBFLabelOperand(false, false, true, 11);
496
497
static DecodeStatus DecodeBFAfterTargetOperand(MCInst *Inst, unsigned val,
498
                 uint64_t Address,
499
                 const void *Decoder);
500
static DecodeStatus DecodePredNoALOperand(MCInst *Inst, unsigned Val,
501
            uint64_t Address,
502
            const void *Decoder);
503
static DecodeStatus DecodeLOLoop(MCInst *Inst, unsigned Insn, uint64_t Address,
504
         const void *Decoder);
505
static DecodeStatus DecodeLongShiftOperand(MCInst *Inst, unsigned Val,
506
             uint64_t Address,
507
             const void *Decoder);
508
static DecodeStatus DecodeVSCCLRM(MCInst *Inst, unsigned Insn, uint64_t Address,
509
          const void *Decoder);
510
static DecodeStatus DecodeVPTMaskOperand(MCInst *Inst, unsigned Val,
511
           uint64_t Address, const void *Decoder);
512
static DecodeStatus DecodeVpredROperand(MCInst *Inst, unsigned Val,
513
          uint64_t Address, const void *Decoder);
514
static DecodeStatus DecodeRestrictedIPredicateOperand(MCInst *Inst,
515
                  unsigned Val,
516
                  uint64_t Address,
517
                  const void *Decoder);
518
static DecodeStatus DecodeRestrictedSPredicateOperand(MCInst *Inst,
519
                  unsigned Val,
520
                  uint64_t Address,
521
                  const void *Decoder);
522
static DecodeStatus DecodeRestrictedUPredicateOperand(MCInst *Inst,
523
                  unsigned Val,
524
                  uint64_t Address,
525
                  const void *Decoder);
526
static DecodeStatus DecodeRestrictedFPPredicateOperand(MCInst *Inst,
527
                   unsigned Val,
528
                   uint64_t Address,
529
                   const void *Decoder);
530
#define DECLARE_DecodeVSTRVLDR_SYSREG(Writeback) \
531
  static DecodeStatus CONCAT(DecodeVSTRVLDR_SYSREG, Writeback)( \
532
    MCInst * Inst, unsigned Insn, uint64_t Address, \
533
    const void *Decoder);
534
DECLARE_DecodeVSTRVLDR_SYSREG(false);
535
DECLARE_DecodeVSTRVLDR_SYSREG(true);
536
537
#define DECLARE_DecodeMVE_MEM_1_pre(shift) \
538
  static DecodeStatus CONCAT(DecodeMVE_MEM_1_pre, shift)( \
539
    MCInst * Inst, unsigned Val, uint64_t Address, \
540
    const void *Decoder);
541
DECLARE_DecodeMVE_MEM_1_pre(0);
542
DECLARE_DecodeMVE_MEM_1_pre(1);
543
544
#define DECLARE_DecodeMVE_MEM_2_pre(shift) \
545
  static DecodeStatus CONCAT(DecodeMVE_MEM_2_pre, shift)( \
546
    MCInst * Inst, unsigned Val, uint64_t Address, \
547
    const void *Decoder);
548
DECLARE_DecodeMVE_MEM_2_pre(0);
549
DECLARE_DecodeMVE_MEM_2_pre(1);
550
DECLARE_DecodeMVE_MEM_2_pre(2);
551
552
#define DECLARE_DecodeMVE_MEM_3_pre(shift) \
553
  static DecodeStatus CONCAT(DecodeMVE_MEM_3_pre, shift)( \
554
    MCInst * Inst, unsigned Val, uint64_t Address, \
555
    const void *Decoder);
556
DECLARE_DecodeMVE_MEM_3_pre(2);
557
DECLARE_DecodeMVE_MEM_3_pre(3);
558
559
#define DECLARE_DecodePowerTwoOperand(MinLog, MaxLog) \
560
  static DecodeStatus CONCAT(DecodePowerTwoOperand, \
561
           CONCAT(MinLog, MaxLog))( \
562
    MCInst * Inst, unsigned Val, uint64_t Address, \
563
    const void *Decoder);
564
DECLARE_DecodePowerTwoOperand(0, 3);
565
566
#define DECLARE_DecodeMVEPairVectorIndexOperand(start) \
567
  static DecodeStatus CONCAT(DecodeMVEPairVectorIndexOperand, start)( \
568
    MCInst * Inst, unsigned Val, uint64_t Address, \
569
    const void *Decoder);
570
DECLARE_DecodeMVEPairVectorIndexOperand(2);
571
DECLARE_DecodeMVEPairVectorIndexOperand(0);
572
573
static DecodeStatus DecodeMVEVMOVQtoDReg(MCInst *Inst, unsigned Insn,
574
           uint64_t Address, const void *Decoder);
575
static DecodeStatus DecodeMVEVMOVDRegtoQ(MCInst *Inst, unsigned Insn,
576
           uint64_t Address, const void *Decoder);
577
static DecodeStatus DecodeMVEVCVTt1fp(MCInst *Inst, unsigned Insn,
578
              uint64_t Address, const void *Decoder);
579
typedef DecodeStatus OperandDecoder(MCInst *Inst, unsigned Val,
580
            uint64_t Address, const void *Decoder);
581
#define DECLARE_DecodeMVEVCMP(scalar, predicate_decoder) \
582
  static DecodeStatus CONCAT(DecodeMVEVCMP, \
583
           CONCAT(scalar, predicate_decoder))( \
584
    MCInst * Inst, unsigned Insn, uint64_t Address, \
585
    const void *Decoder);
586
DECLARE_DecodeMVEVCMP(false, DecodeRestrictedIPredicateOperand);
587
DECLARE_DecodeMVEVCMP(false, DecodeRestrictedUPredicateOperand);
588
DECLARE_DecodeMVEVCMP(false, DecodeRestrictedSPredicateOperand);
589
DECLARE_DecodeMVEVCMP(true, DecodeRestrictedIPredicateOperand);
590
DECLARE_DecodeMVEVCMP(true, DecodeRestrictedUPredicateOperand);
591
DECLARE_DecodeMVEVCMP(true, DecodeRestrictedSPredicateOperand);
592
DECLARE_DecodeMVEVCMP(false, DecodeRestrictedFPPredicateOperand);
593
DECLARE_DecodeMVEVCMP(true, DecodeRestrictedFPPredicateOperand);
594
595
static DecodeStatus DecodeMveVCTP(MCInst *Inst, unsigned Insn, uint64_t Address,
596
          const void *Decoder);
597
static DecodeStatus DecodeMVEVPNOT(MCInst *Inst, unsigned Insn,
598
           uint64_t Address, const void *Decoder);
599
static DecodeStatus DecodeMVEOverlappingLongShift(MCInst *Inst, unsigned Insn,
600
              uint64_t Address,
601
              const void *Decoder);
602
static DecodeStatus DecodeT2AddSubSPImm(MCInst *Inst, unsigned Insn,
603
          uint64_t Address, const void *Decoder);
604
605
#include "ARMGenDisassemblerTables.inc"
606
607
// Post-decoding checks
608
609
static DecodeStatus checkDecodedInstruction(MCInst *MI, uint32_t Insn,
610
              DecodeStatus Result)
611
200k
{
612
200k
  switch (MCInst_getOpcode(MI)) {
613
151
  case ARM_HVC: {
614
    // HVC is undefined if condition = 0xf otherwise upredictable
615
    // if condition != 0xe
616
151
    uint32_t Cond = (Insn >> 28) & 0xF;
617
151
    if (Cond == 0xF)
618
1
      return MCDisassembler_Fail;
619
150
    if (Cond != 0xE)
620
70
      return MCDisassembler_SoftFail;
621
80
    return Result;
622
150
  }
623
1.13k
  case ARM_t2ADDri:
624
1.58k
  case ARM_t2ADDri12:
625
2.52k
  case ARM_t2ADDrr:
626
3.17k
  case ARM_t2ADDrs:
627
3.72k
  case ARM_t2SUBri:
628
4.14k
  case ARM_t2SUBri12:
629
4.27k
  case ARM_t2SUBrr:
630
4.68k
  case ARM_t2SUBrs:
631
4.68k
    if (MCOperand_getReg(MCInst_getOperand(MI, (0))) == ARM_SP &&
632
4.68k
        MCOperand_getReg(MCInst_getOperand(MI, (1))) != ARM_SP)
633
221
      return MCDisassembler_SoftFail;
634
4.46k
    return Result;
635
196k
  default:
636
196k
    return Result;
637
200k
  }
638
200k
}
639
640
static DecodeStatus getARMInstruction(csh ud, const uint8_t *Bytes,
641
              size_t BytesLen, MCInst *MI,
642
              uint16_t *Size, uint64_t Address,
643
              void *Info)
644
138k
{
645
  // We want to read exactly 4 bytes of data.
646
138k
  if (BytesLen < 4) {
647
1.42k
    *Size = 0;
648
1.42k
    return MCDisassembler_Fail;
649
1.42k
  }
650
651
  // Encoded as a 32-bit word in the stream.
652
136k
  uint32_t Insn = readBytes32(MI, Bytes);
653
654
  // Calling the auto-generated decoder function.
655
136k
  DecodeStatus Result =
656
136k
    decodeInstruction_4(DecoderTableARM32, MI, Insn, Address, NULL);
657
136k
  if (Result != MCDisassembler_Fail) {
658
109k
    *Size = 4;
659
109k
    return checkDecodedInstruction(MI, Insn, Result);
660
109k
  }
661
662
27.0k
  typedef struct DecodeTable {
663
27.0k
    const uint8_t *P;
664
27.0k
    bool DecodePred;
665
27.0k
  } DecodeTable;
666
667
27.0k
  const DecodeTable Tables[] = {
668
27.0k
    { DecoderTableVFP32, false },
669
27.0k
    { DecoderTableVFPV832, false },
670
27.0k
    { DecoderTableNEONData32, true },
671
27.0k
    { DecoderTableNEONLoadStore32, true },
672
27.0k
    { DecoderTableNEONDup32, true },
673
27.0k
    { DecoderTablev8NEON32, false },
674
27.0k
    { DecoderTablev8Crypto32, false },
675
27.0k
  };
676
677
162k
  for (int i = 0; i < (sizeof(Tables) / sizeof(Tables[0])); ++i) {
678
144k
    MCInst_clear(MI);
679
144k
    DecodeTable Table = Tables[i];
680
144k
    Result = decodeInstruction_4(Table.P, MI, Insn, Address, NULL);
681
144k
    if (Result != MCDisassembler_Fail) {
682
8.92k
      *Size = 4;
683
      // Add a fake predicate operand, because we share these instruction
684
      // definitions with Thumb2 where these instructions are predicable.
685
8.92k
      if (Table.DecodePred &&
686
8.92k
          !DecodePredicateOperand(MI, 0xE, Address, Table.P))
687
0
        return MCDisassembler_Fail;
688
8.92k
      return Result;
689
8.92k
    }
690
144k
  }
691
692
18.1k
  Result = decodeInstruction_4(DecoderTableCoProc32, MI, Insn, Address,
693
18.1k
             NULL);
694
18.1k
  if (Result != MCDisassembler_Fail) {
695
17.4k
    *Size = 4;
696
17.4k
    return checkDecodedInstruction(MI, Insn, Result);
697
17.4k
  }
698
699
646
  *Size = 4;
700
646
  return MCDisassembler_Fail;
701
18.1k
}
702
703
/// tryAddingSymbolicOperand - trys to add a symbolic operand in place of the
704
/// immediate Value in the MCInst.  The immediate Value has had any PC
705
/// adjustment made by the caller.  If the instruction is a branch instruction
706
/// then isBranch is true, else false.  If the getOpInfo() function was set as
707
/// part of the setupForSymbolicDisassembly() call then that function is called
708
/// to get any symbolic information at the Address for this instruction.  If
709
/// that returns non-zero then the symbolic information it returns is used to
710
/// create an MCExpr and that is added as an operand to the MCInst.  If
711
/// getOpInfo() returns zero and isBranch is true then a symbol look up for
712
/// Value is done and if a symbol is found an MCExpr is created with that, else
713
/// an MCExpr with Value is created.  This function returns true if it adds an
714
/// operand to the MCInst and false otherwise.
715
static bool tryAddingSymbolicOperand(uint64_t Address, int32_t Value,
716
             bool isBranch, uint64_t InstSize,
717
             MCInst *MI, const void *Decoder)
718
62.2k
{
719
  // FIXME: Does it make sense for value to be negative?
720
  // return Decoder->tryAddingSymbolicOperand(MI, (uint32_t)Value, Address,
721
  //         isBranch, /*Offset=*/0, /*OpSize=*/0,
722
  //         InstSize);
723
62.2k
  return false;
724
62.2k
}
725
726
/// tryAddingPcLoadReferenceComment - trys to add a comment as to what is being
727
/// referenced by a load instruction with the base register that is the Pc.
728
/// These can often be values in a literal pool near the Address of the
729
/// instruction.  The Address of the instruction and its immediate Value are
730
/// used as a possible literal pool entry.  The SymbolLookUp call back will
731
/// return the name of a symbol referenced by the literal pool's entry if
732
/// the referenced address is that of a symbol.  Or it will return a pointer to
733
/// a literal 'C' string if the referenced address of the literal pool's entry
734
/// is an address into a section with 'C' string literals.
735
static void tryAddingPcLoadReferenceComment(uint64_t Address, int Value,
736
              const void *Decoder)
737
18.7k
{
738
  // Decoder->tryAddingPcLoadReferenceComment(Value, Address);
739
18.7k
}
740
741
// Thumb1 instructions don't have explicit S bits.  Rather, they
742
// implicitly set CPSR.  Since it's not represented in the encoding, the
743
// auto-generated decoder won't inject the CPSR operand.  We need to fix
744
// that as a post-pass.
745
static void AddThumb1SBit(MCInst *MI, bool InITBlock)
746
409k
{
747
409k
  const MCInstrDesc *Desc = MCInstrDesc_get(
748
409k
    MCInst_getOpcode(MI), ARMDescs.Insts, ARR_SIZE(ARMDescs.Insts));
749
409k
  const MCOperandInfo *OpInfo = Desc->OpInfo;
750
409k
  unsigned short NumOps = Desc->NumOperands;
751
409k
  unsigned i;
752
753
831k
  for (i = 0; i < NumOps; ++i) {
754
824k
    if (i == MCInst_getNumOperands(MI))
755
0
      break;
756
824k
    if (MCOperandInfo_isOptionalDef(&OpInfo[i]) &&
757
824k
        OpInfo[i].RegClass == ARM_CCRRegClassID) {
758
402k
      if (i > 0 && MCOperandInfo_isPredicate(&OpInfo[i - 1]))
759
0
        continue;
760
402k
      MCInst_insert0(MI, i,
761
402k
               MCOperand_CreateReg1(
762
402k
                 MI, (InITBlock ? 0 : ARM_CPSR)));
763
402k
      return;
764
402k
    }
765
824k
  }
766
767
6.47k
  MCInst_insert0(MI, i,
768
6.47k
           MCOperand_CreateReg1(MI, (InITBlock ? 0 : ARM_CPSR)));
769
6.47k
}
770
771
static bool isVectorPredicable(unsigned Opcode)
772
2.63M
{
773
2.63M
  const MCInstrDesc *Desc = MCInstrDesc_get(Opcode, ARMDescs.Insts,
774
2.63M
              ARR_SIZE(ARMDescs.Insts));
775
2.63M
  const MCOperandInfo *OpInfo = Desc->OpInfo;
776
2.63M
  unsigned short NumOps = Desc->NumOperands;
777
16.4M
  for (unsigned i = 0; i < NumOps; ++i) {
778
13.9M
    if (ARM_isVpred(OpInfo[i].OperandType))
779
101k
      return true;
780
13.9M
  }
781
2.53M
  return false;
782
2.63M
}
783
784
// Most Thumb instructions don't have explicit predicates in the
785
// encoding, but rather get their predicates from IT context.  We need
786
// to fix up the predicate operands using this context information as a
787
// post-pass.
788
DecodeStatus AddThumbPredicate(MCInst *MI)
789
998k
{
790
998k
  DecodeStatus S = MCDisassembler_Success;
791
792
  // A few instructions actually have predicates encoded in them.  Don't
793
  // try to overwrite it if we're seeing one of those.
794
998k
  switch (MCInst_getOpcode(MI)) {
795
22.1k
  case ARM_tBcc:
796
24.0k
  case ARM_t2Bcc:
797
26.9k
  case ARM_tCBZ:
798
30.7k
  case ARM_tCBNZ:
799
31.3k
  case ARM_tCPS:
800
31.4k
  case ARM_t2CPS3p:
801
31.4k
  case ARM_t2CPS2p:
802
32.0k
  case ARM_t2CPS1p:
803
32.0k
  case ARM_t2CSEL:
804
32.4k
  case ARM_t2CSINC:
805
33.1k
  case ARM_t2CSINV:
806
33.2k
  case ARM_t2CSNEG:
807
114k
  case ARM_tMOVSr:
808
114k
  case ARM_tSETEND:
809
    // Some instructions (mostly conditional branches) are not
810
    // allowed in IT blocks.
811
114k
    if (ITBlock_instrInITBlock(&(MI->csh->ITBlock)))
812
1.86k
      S = MCDisassembler_SoftFail;
813
113k
    else
814
113k
      return MCDisassembler_Success;
815
1.86k
    break;
816
1.86k
  case ARM_t2HINT:
817
467
    if (MCOperand_getImm(MCInst_getOperand(MI, (0))) == 0x10 &&
818
467
        (ARM_getFeatureBits(MI->csh->mode, ARM_FeatureRAS)) != 0)
819
0
      S = MCDisassembler_SoftFail;
820
467
    break;
821
15.3k
  case ARM_tB:
822
16.3k
  case ARM_t2B:
823
16.4k
  case ARM_t2TBB:
824
16.9k
  case ARM_t2TBH:
825
    // Some instructions (mostly unconditional branches) can
826
    // only appears at the end of, or outside of, an IT.
827
16.9k
    if (ITBlock_instrInITBlock(&(MI->csh->ITBlock)) &&
828
16.9k
        !ITBlock_instrLastInITBlock(&(MI->csh->ITBlock)))
829
1.76k
      S = MCDisassembler_SoftFail;
830
16.9k
    break;
831
866k
  default:
832
866k
    break;
833
998k
  }
834
835
  // Warn on non-VPT predicable instruction in a VPT block and a VPT
836
  // predicable instruction in an IT block
837
885k
  if ((!isVectorPredicable(MCInst_getOpcode(MI)) &&
838
885k
       VPTBlock_instrInVPTBlock(&(MI->csh->VPTBlock))) ||
839
885k
      (isVectorPredicable(MCInst_getOpcode(MI)) &&
840
867k
       ITBlock_instrInITBlock(&(MI->csh->ITBlock))))
841
18.5k
    S = MCDisassembler_SoftFail;
842
843
  // If we're in an IT/VPT block, base the predicate on that.  Otherwise,
844
  // assume a predicate of AL.
845
885k
  unsigned CC = ARMCC_AL;
846
885k
  unsigned VCC = ARMVCC_None;
847
885k
  if (ITBlock_instrInITBlock(&(MI->csh->ITBlock))) {
848
32.8k
    CC = ITBlock_getITCC(&(MI->csh->ITBlock));
849
32.8k
    ITBlock_advanceITState(&(MI->csh->ITBlock));
850
852k
  } else if (VPTBlock_instrInVPTBlock(&(MI->csh->VPTBlock))) {
851
20.3k
    VCC = VPTBlock_getVPTPred(&(MI->csh->VPTBlock));
852
20.3k
    VPTBlock_advanceVPTState(&(MI->csh->VPTBlock));
853
20.3k
  }
854
885k
  const MCInstrDesc *Desc = MCInstrDesc_get(
855
885k
    MCInst_getOpcode(MI), ARMDescs.Insts, ARR_SIZE(ARMDescs.Insts));
856
857
885k
  const MCOperandInfo *OpInfo = Desc->OpInfo;
858
885k
  unsigned short NumOps = Desc->NumOperands;
859
860
885k
  unsigned i;
861
3.57M
  for (i = 0; i < NumOps; ++i) {
862
3.53M
    if (MCOperandInfo_isPredicate(&OpInfo[i]) ||
863
3.53M
        i == MCInst_getNumOperands(MI))
864
849k
      break;
865
3.53M
  }
866
867
885k
  if (MCInst_isPredicable(Desc)) {
868
819k
    MCInst_insert0(MI, i, MCOperand_CreateImm1(MI, (CC)));
869
870
819k
    if (CC == ARMCC_AL)
871
800k
      MCInst_insert0(MI, i + 1,
872
800k
               MCOperand_CreateReg1(MI, (0)));
873
18.8k
    else
874
18.8k
      MCInst_insert0(MI, i + 1,
875
18.8k
               MCOperand_CreateReg1(MI, (ARM_CPSR)));
876
819k
  } else if (CC != ARMCC_AL) {
877
11.1k
    Check(&S, MCDisassembler_SoftFail);
878
11.1k
  }
879
880
885k
  unsigned VCCPos;
881
5.25M
  for (VCCPos = 0; VCCPos < NumOps; ++VCCPos) {
882
4.66M
    if (ARM_isVpred(OpInfo[VCCPos].OperandType) ||
883
4.66M
        VCCPos == MCInst_getNumOperands(MI))
884
299k
      break;
885
4.66M
  }
886
887
885k
  if (isVectorPredicable(MCInst_getOpcode(MI))) {
888
33.7k
    MCInst_insert0(MI, VCCPos, MCOperand_CreateImm1(MI, (VCC)));
889
890
33.7k
    if (VCC == ARMVCC_None)
891
29.9k
      MCInst_insert0(MI, VCCPos + 1,
892
29.9k
               MCOperand_CreateReg1(MI, (0)));
893
3.81k
    else
894
3.81k
      MCInst_insert0(MI, VCCPos + 1,
895
3.81k
               MCOperand_CreateReg1(MI, (ARM_P0)));
896
33.7k
    MCInst_insert0(MI, VCCPos + 2, MCOperand_CreateReg1(MI, (0)));
897
33.7k
    if (OpInfo[VCCPos].OperandType == ARM_OP_VPRED_R) {
898
7.90k
      int TiedOp = MCOperandInfo_getOperandConstraint(
899
7.90k
        Desc, VCCPos + 3, MCOI_TIED_TO);
900
7.90k
      CS_ASSERT_RET_VAL(
901
7.90k
        TiedOp >= 0 &&
902
7.90k
          "Inactive register in vpred_r is not tied to an output!",
903
7.90k
        MCDisassembler_Fail);
904
      // Copy the operand to ensure it's not invalidated when MI grows.
905
7.90k
      MCOperand Op = *MCInst_getOperand(MI, TiedOp);
906
7.90k
      MCInst_insert0(MI, VCCPos + 3, &Op);
907
7.90k
    }
908
851k
  } else if (VCC != ARMVCC_None) {
909
16.5k
    Check(&S, MCDisassembler_SoftFail);
910
16.5k
  }
911
912
885k
  return S;
913
998k
}
914
915
// Thumb VFP instructions are a special case.  Because we share their
916
// encodings between ARM and Thumb modes, and they are predicable in ARM
917
// mode, the auto-generated decoder will give them an (incorrect)
918
// predicate operand.  We need to rewrite these operands based on the IT
919
// context as a post-pass.
920
static void UpdateThumbVFPPredicate(DecodeStatus S, MCInst *MI)
921
17.1k
{
922
17.1k
  unsigned CC;
923
17.1k
  CC = ITBlock_getITCC(&(MI->csh->ITBlock));
924
17.1k
  if (CC == 0xF)
925
174
    CC = ARMCC_AL;
926
17.1k
  if (ITBlock_instrInITBlock(&(MI->csh->ITBlock)))
927
821
    ITBlock_advanceITState(&(MI->csh->ITBlock));
928
16.3k
  else if (VPTBlock_instrInVPTBlock(&(MI->csh->VPTBlock))) {
929
461
    CC = VPTBlock_getVPTPred(&(MI->csh->VPTBlock));
930
461
    VPTBlock_advanceVPTState(&(MI->csh->VPTBlock));
931
461
  }
932
933
17.1k
  const MCInstrDesc *Desc = MCInstrDesc_get(
934
17.1k
    MCInst_getOpcode(MI), ARMDescs.Insts, ARR_SIZE(ARMDescs.Insts));
935
17.1k
  const MCOperandInfo *OpInfo = Desc->OpInfo;
936
17.1k
  unsigned short NumOps = Desc->NumOperands;
937
59.6k
  for (unsigned i = 0; i < NumOps; ++i) {
938
59.6k
    if (MCOperandInfo_isPredicate(&OpInfo[i])) {
939
17.1k
      if (CC != ARMCC_AL && !MCInst_isPredicable(Desc))
940
0
        Check(&S, MCDisassembler_SoftFail);
941
17.1k
      MCOperand_setImm(MCInst_getOperand(MI, i), CC);
942
943
17.1k
      if (CC == ARMCC_AL)
944
16.0k
        MCOperand_setReg(MCInst_getOperand(MI, i + 1),
945
16.0k
             0);
946
1.06k
      else
947
1.06k
        MCOperand_setReg(MCInst_getOperand(MI, i + 1),
948
1.06k
             ARM_CPSR);
949
950
17.1k
      return;
951
17.1k
    }
952
59.6k
  }
953
17.1k
}
954
955
static DecodeStatus getThumbInstruction(csh ud, const uint8_t *Bytes,
956
          size_t BytesLen, MCInst *MI,
957
          uint16_t *Size, uint64_t Address,
958
          void *Info)
959
1.02M
{
960
  // We want to read exactly 2 bytes of data.
961
1.02M
  if (BytesLen < 2) {
962
2.77k
    *Size = 0;
963
2.77k
    return MCDisassembler_Fail;
964
2.77k
  }
965
966
1.02M
  uint16_t Insn16 = readBytes16(MI, Bytes);
967
1.02M
  DecodeStatus Result = decodeInstruction_2(DecoderTableThumb16, MI,
968
1.02M
              Insn16, Address, NULL);
969
1.02M
  if (Result != MCDisassembler_Fail) {
970
459k
    *Size = 2;
971
459k
    Check(&Result, AddThumbPredicate(MI));
972
459k
    return Result;
973
459k
  }
974
975
562k
  Result = decodeInstruction_2(DecoderTableThumbSBit16, MI, Insn16,
976
562k
             Address, NULL);
977
562k
  if (Result) {
978
265k
    *Size = 2;
979
265k
    bool InITBlock = ITBlock_instrInITBlock(&(MI->csh->ITBlock));
980
265k
    Check(&Result, AddThumbPredicate(MI));
981
265k
    AddThumb1SBit(MI, InITBlock);
982
265k
    return Result;
983
265k
  }
984
985
296k
  Result = decodeInstruction_2(DecoderTableThumb216, MI, Insn16, Address,
986
296k
             NULL);
987
296k
  if (Result != MCDisassembler_Fail) {
988
13.8k
    *Size = 2;
989
990
    // Nested IT blocks are UNPREDICTABLE.  Must be checked before we add
991
    // the Thumb predicate.
992
13.8k
    if (MCInst_getOpcode(MI) == ARM_t2IT &&
993
13.8k
        ITBlock_instrInITBlock(&(MI->csh->ITBlock)))
994
9.25k
      Result = MCDisassembler_SoftFail;
995
996
13.8k
    Check(&Result, AddThumbPredicate(MI));
997
998
    // If we find an IT instruction, we need to parse its condition
999
    // code and mask operands so that we can apply them correctly
1000
    // to the subsequent instructions.
1001
13.8k
    if (MCInst_getOpcode(MI) == ARM_t2IT) {
1002
13.8k
      unsigned Firstcond =
1003
13.8k
        MCOperand_getImm(MCInst_getOperand(MI, (0)));
1004
13.8k
      unsigned Mask =
1005
13.8k
        MCOperand_getImm(MCInst_getOperand(MI, (1)));
1006
13.8k
      ITBlock_setITState(&(MI->csh->ITBlock), (char)Firstcond,
1007
13.8k
             (char)Mask);
1008
1009
      // An IT instruction that would give a 'NV' predicate is
1010
      // unpredictable. if (Firstcond == ARMCC_AL && !isPowerOf2_32(Mask))
1011
      //  SStream_concat0(CS, "unpredictable IT predicate sequence");
1012
13.8k
    }
1013
1014
13.8k
    return Result;
1015
13.8k
  }
1016
1017
  // We want to read exactly 4 bytes of data.
1018
283k
  if (BytesLen < 4) {
1019
758
    *Size = 0;
1020
758
    return MCDisassembler_Fail;
1021
758
  }
1022
282k
  uint32_t Insn32 = (uint32_t)Insn16 << 16 | readBytes16(MI, Bytes + 2);
1023
1024
282k
  Result = decodeInstruction_4(DecoderTableMVE32, MI, Insn32, Address,
1025
282k
             NULL);
1026
282k
  if (Result != MCDisassembler_Fail) {
1027
44.3k
    *Size = 4;
1028
1029
    // Nested VPT blocks are UNPREDICTABLE. Must be checked before we add
1030
    // the VPT predicate.
1031
44.3k
    if (isVPTOpcode(MCInst_getOpcode(MI)) &&
1032
44.3k
        VPTBlock_instrInVPTBlock(&(MI->csh->VPTBlock)))
1033
3.68k
      Result = MCDisassembler_SoftFail;
1034
1035
44.3k
    Check(&Result, AddThumbPredicate(MI));
1036
1037
44.3k
    if (isVPTOpcode(MCInst_getOpcode(MI))) {
1038
7.68k
      unsigned Mask =
1039
7.68k
        MCOperand_getImm(MCInst_getOperand(MI, (0)));
1040
7.68k
      VPTBlock_setVPTState(&(MI->csh->VPTBlock), Mask);
1041
7.68k
    }
1042
1043
44.3k
    return Result;
1044
44.3k
  }
1045
1046
238k
  Result = decodeInstruction_4(DecoderTableThumb32, MI, Insn32, Address,
1047
238k
             NULL);
1048
238k
  if (Result != MCDisassembler_Fail) {
1049
3.45k
    *Size = 4;
1050
3.45k
    bool InITBlock = ITBlock_instrInITBlock(&(MI->csh->ITBlock));
1051
3.45k
    Check(&Result, AddThumbPredicate(MI));
1052
3.45k
    AddThumb1SBit(MI, InITBlock);
1053
3.45k
    return Result;
1054
3.45k
  }
1055
1056
234k
  Result = decodeInstruction_4(DecoderTableThumb232, MI, Insn32, Address,
1057
234k
             NULL);
1058
234k
  if (Result != MCDisassembler_Fail) {
1059
73.6k
    *Size = 4;
1060
73.6k
    Check(&Result, AddThumbPredicate(MI));
1061
73.6k
    return checkDecodedInstruction(MI, Insn32, Result);
1062
73.6k
  }
1063
1064
160k
  if (fieldFromInstruction_4(Insn32, 28, 4) == 0xE) {
1065
50.6k
    Result = decodeInstruction_4(DecoderTableVFP32, MI, Insn32,
1066
50.6k
               Address, NULL);
1067
50.6k
    if (Result != MCDisassembler_Fail) {
1068
17.1k
      *Size = 4;
1069
17.1k
      UpdateThumbVFPPredicate(Result, MI);
1070
17.1k
      return Result;
1071
17.1k
    }
1072
50.6k
  }
1073
1074
143k
  Result = decodeInstruction_4(DecoderTableVFPV832, MI, Insn32, Address,
1075
143k
             NULL);
1076
143k
  if (Result != MCDisassembler_Fail) {
1077
3.69k
    *Size = 4;
1078
3.69k
    return Result;
1079
3.69k
  }
1080
1081
140k
  if (fieldFromInstruction_4(Insn32, 28, 4) == 0xE) {
1082
33.4k
    Result = decodeInstruction_4(DecoderTableNEONDup32, MI, Insn32,
1083
33.4k
               Address, NULL);
1084
33.4k
    if (Result != MCDisassembler_Fail) {
1085
1.22k
      *Size = 4;
1086
1.22k
      Check(&Result, AddThumbPredicate(MI));
1087
1.22k
      return Result;
1088
1.22k
    }
1089
33.4k
  }
1090
1091
138k
  if (fieldFromInstruction_4(Insn32, 24, 8) == 0xF9) {
1092
50.9k
    uint32_t NEONLdStInsn = Insn32;
1093
50.9k
    NEONLdStInsn &= 0xF0FFFFFF;
1094
50.9k
    NEONLdStInsn |= 0x04000000;
1095
50.9k
    Result = decodeInstruction_4(DecoderTableNEONLoadStore32, MI,
1096
50.9k
               NEONLdStInsn, Address, NULL);
1097
50.9k
    if (Result != MCDisassembler_Fail) {
1098
50.7k
      *Size = 4;
1099
50.7k
      Check(&Result, AddThumbPredicate(MI));
1100
50.7k
      return Result;
1101
50.7k
    }
1102
50.9k
  }
1103
1104
88.0k
  if (fieldFromInstruction_4(Insn32, 24, 4) == 0xF) {
1105
36.9k
    uint32_t NEONDataInsn = Insn32;
1106
36.9k
    NEONDataInsn &= 0xF0FFFFFF; // Clear bits 27-24
1107
36.9k
    NEONDataInsn |= (NEONDataInsn & 0x10000000) >>
1108
36.9k
        4;      // Move bit 28 to bit 24
1109
36.9k
    NEONDataInsn |= 0x12000000; // Set bits 28 and 25
1110
36.9k
    Result = decodeInstruction_4(DecoderTableNEONData32, MI,
1111
36.9k
               NEONDataInsn, Address, NULL);
1112
36.9k
    if (Result != MCDisassembler_Fail) {
1113
35.9k
      *Size = 4;
1114
35.9k
      Check(&Result, AddThumbPredicate(MI));
1115
35.9k
      return Result;
1116
35.9k
    }
1117
1118
1.04k
    uint32_t NEONCryptoInsn = Insn32;
1119
1.04k
    NEONCryptoInsn &= 0xF0FFFFFF; // Clear bits 27-24
1120
1.04k
    NEONCryptoInsn |= (NEONCryptoInsn & 0x10000000) >>
1121
1.04k
          4;        // Move bit 28 to bit 24
1122
1.04k
    NEONCryptoInsn |= 0x12000000; // Set bits 28 and 25
1123
1.04k
    Result = decodeInstruction_4(DecoderTablev8Crypto32, MI,
1124
1.04k
               NEONCryptoInsn, Address, NULL);
1125
1.04k
    if (Result != MCDisassembler_Fail) {
1126
79
      *Size = 4;
1127
79
      return Result;
1128
79
    }
1129
1130
968
    uint32_t NEONv8Insn = Insn32;
1131
968
    NEONv8Insn &= 0xF3FFFFFF; // Clear bits 27-26
1132
968
    Result = decodeInstruction_4(DecoderTablev8NEON32, MI,
1133
968
               NEONv8Insn, Address, NULL);
1134
968
    if (Result != MCDisassembler_Fail) {
1135
542
      *Size = 4;
1136
542
      return Result;
1137
542
    }
1138
968
  }
1139
1140
51.5k
  uint32_t Coproc = fieldFromInstruction_4(Insn32, 8, 4);
1141
51.5k
  const uint8_t *DecoderTable = ARM_isCDECoproc(Coproc, MI) ?
1142
0
                DecoderTableThumb2CDE32 :
1143
51.5k
                DecoderTableThumb2CoProc32;
1144
51.5k
  Result = decodeInstruction_4(DecoderTable, MI, Insn32, Address, NULL);
1145
51.5k
  if (Result != MCDisassembler_Fail) {
1146
50.2k
    *Size = 4;
1147
50.2k
    Check(&Result, AddThumbPredicate(MI));
1148
50.2k
    return Result;
1149
50.2k
  }
1150
1151
1.22k
  *Size = 0;
1152
1.22k
  return MCDisassembler_Fail;
1153
51.5k
}
1154
1155
static DecodeStatus getInstruction(csh ud, const uint8_t *Bytes,
1156
           size_t BytesLen, MCInst *MI, uint16_t *Size,
1157
           uint64_t Address, void *Info)
1158
1.16M
{
1159
1.16M
  DecodeStatus Result = MCDisassembler_Fail;
1160
1.16M
  if (MI->csh->mode & CS_MODE_THUMB)
1161
1.02M
    Result = getThumbInstruction(ud, Bytes, BytesLen, MI, Size,
1162
1.02M
               Address, Info);
1163
138k
  else
1164
138k
    Result = getARMInstruction(ud, Bytes, BytesLen, MI, Size,
1165
138k
             Address, Info);
1166
1.16M
  MCInst_handleWriteback(MI, ARMDescs.Insts, ARR_SIZE(ARMDescs.Insts));
1167
1.16M
  return Result;
1168
1.16M
}
1169
1170
static const uint16_t GPRDecoderTable[] = { ARM_R0,  ARM_R1, ARM_R2,  ARM_R3,
1171
              ARM_R4,  ARM_R5, ARM_R6,  ARM_R7,
1172
              ARM_R8,  ARM_R9, ARM_R10, ARM_R11,
1173
              ARM_R12, ARM_SP, ARM_LR,  ARM_PC };
1174
1175
static const uint16_t CLRMGPRDecoderTable[] = {
1176
  ARM_R0, ARM_R1, ARM_R2,  ARM_R3,  ARM_R4,  ARM_R5, ARM_R6, ARM_R7,
1177
  ARM_R8, ARM_R9, ARM_R10, ARM_R11, ARM_R12, 0,    ARM_LR, ARM_APSR
1178
};
1179
1180
static DecodeStatus DecodeGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1181
             uint64_t Address,
1182
             const void *Decoder)
1183
3.48M
{
1184
3.48M
  if (RegNo > 15)
1185
10
    return MCDisassembler_Fail;
1186
1187
3.48M
  unsigned Register = GPRDecoderTable[RegNo];
1188
3.48M
  MCOperand_CreateReg0(Inst, (Register));
1189
3.48M
  return MCDisassembler_Success;
1190
3.48M
}
1191
1192
static DecodeStatus DecodeCLRMGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1193
                 uint64_t Address,
1194
                 const void *Decoder)
1195
1.00k
{
1196
1.00k
  if (RegNo > 15)
1197
0
    return MCDisassembler_Fail;
1198
1199
1.00k
  unsigned Register = CLRMGPRDecoderTable[RegNo];
1200
1.00k
  if (Register == 0)
1201
0
    return MCDisassembler_Fail;
1202
1203
1.00k
  MCOperand_CreateReg0(Inst, (Register));
1204
1.00k
  return MCDisassembler_Success;
1205
1.00k
}
1206
1207
static DecodeStatus DecodeGPRnopcRegisterClass(MCInst *Inst, unsigned RegNo,
1208
                 uint64_t Address,
1209
                 const void *Decoder)
1210
190k
{
1211
190k
  DecodeStatus S = MCDisassembler_Success;
1212
1213
190k
  if (RegNo == 15)
1214
46.6k
    S = MCDisassembler_SoftFail;
1215
1216
190k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1217
1218
190k
  return S;
1219
190k
}
1220
1221
static DecodeStatus DecodeGPRnospRegisterClass(MCInst *Inst, unsigned RegNo,
1222
                 uint64_t Address,
1223
                 const void *Decoder)
1224
402
{
1225
402
  DecodeStatus S = MCDisassembler_Success;
1226
1227
402
  if (RegNo == 13)
1228
120
    S = MCDisassembler_SoftFail;
1229
1230
402
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1231
1232
402
  return S;
1233
402
}
1234
1235
static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst *Inst, unsigned RegNo,
1236
               uint64_t Address,
1237
               const void *Decoder)
1238
7.46k
{
1239
7.46k
  DecodeStatus S = MCDisassembler_Success;
1240
1241
7.46k
  if (RegNo == 15) {
1242
2.06k
    MCOperand_CreateReg0(Inst, (ARM_APSR_NZCV));
1243
2.06k
    return MCDisassembler_Success;
1244
2.06k
  }
1245
1246
5.39k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1247
5.39k
  return S;
1248
7.46k
}
1249
1250
static DecodeStatus DecodeGPRwithZRRegisterClass(MCInst *Inst, unsigned RegNo,
1251
             uint64_t Address,
1252
             const void *Decoder)
1253
10.2k
{
1254
10.2k
  DecodeStatus S = MCDisassembler_Success;
1255
1256
10.2k
  if (RegNo == 15) {
1257
3.57k
    MCOperand_CreateReg0(Inst, (ARM_ZR));
1258
3.57k
    return MCDisassembler_Success;
1259
3.57k
  }
1260
1261
6.66k
  if (RegNo == 13)
1262
1.89k
    Check(&S, MCDisassembler_SoftFail);
1263
1264
6.66k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1265
6.66k
  return S;
1266
10.2k
}
1267
1268
static DecodeStatus DecodeGPRwithZRnospRegisterClass(MCInst *Inst,
1269
                 unsigned RegNo,
1270
                 uint64_t Address,
1271
                 const void *Decoder)
1272
2.37k
{
1273
2.37k
  DecodeStatus S = MCDisassembler_Success;
1274
2.37k
  if (RegNo == 13)
1275
4
    return MCDisassembler_Fail;
1276
2.37k
  Check(&S, DecodeGPRwithZRRegisterClass(Inst, RegNo, Address, Decoder));
1277
2.37k
  return S;
1278
2.37k
}
1279
1280
static DecodeStatus DecodetGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1281
              uint64_t Address,
1282
              const void *Decoder)
1283
1.86M
{
1284
1.86M
  if (RegNo > 7)
1285
0
    return MCDisassembler_Fail;
1286
1.86M
  return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
1287
1.86M
}
1288
1289
static const uint16_t GPRPairDecoderTable[] = { ARM_R0_R1, ARM_R2_R3,
1290
            ARM_R4_R5, ARM_R6_R7,
1291
            ARM_R8_R9, ARM_R10_R11,
1292
            ARM_R12_SP };
1293
1294
static DecodeStatus DecodeGPRPairRegisterClass(MCInst *Inst, unsigned RegNo,
1295
                 uint64_t Address,
1296
                 const void *Decoder)
1297
355
{
1298
355
  DecodeStatus S = MCDisassembler_Success;
1299
1300
  // According to the Arm ARM RegNo = 14 is undefined, but we return fail
1301
  // rather than SoftFail as there is no GPRPair table entry for index 7.
1302
355
  if (RegNo > 13)
1303
2
    return MCDisassembler_Fail;
1304
1305
353
  if (RegNo & 1)
1306
134
    S = MCDisassembler_SoftFail;
1307
1308
353
  unsigned RegisterPair = GPRPairDecoderTable[RegNo / 2];
1309
353
  MCOperand_CreateReg0(Inst, (RegisterPair));
1310
353
  return S;
1311
355
}
1312
1313
static DecodeStatus DecodeGPRPairnospRegisterClass(MCInst *Inst, unsigned RegNo,
1314
               uint64_t Address,
1315
               const void *Decoder)
1316
0
{
1317
0
  if (RegNo > 13)
1318
0
    return MCDisassembler_Fail;
1319
1320
0
  unsigned RegisterPair = GPRPairDecoderTable[RegNo / 2];
1321
0
  MCOperand_CreateReg0(Inst, (RegisterPair));
1322
1323
0
  if ((RegNo & 1) || RegNo > 10)
1324
0
    return MCDisassembler_SoftFail;
1325
0
  return MCDisassembler_Success;
1326
0
}
1327
1328
static DecodeStatus DecodeGPRspRegisterClass(MCInst *Inst, unsigned RegNo,
1329
               uint64_t Address,
1330
               const void *Decoder)
1331
1.07k
{
1332
1.07k
  if (RegNo != 13)
1333
0
    return MCDisassembler_Fail;
1334
1335
1.07k
  unsigned Register = GPRDecoderTable[RegNo];
1336
1.07k
  MCOperand_CreateReg0(Inst, (Register));
1337
1.07k
  return MCDisassembler_Success;
1338
1.07k
}
1339
1340
static DecodeStatus DecodetcGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1341
               uint64_t Address,
1342
               const void *Decoder)
1343
1.26k
{
1344
1.26k
  unsigned Register = 0;
1345
1.26k
  switch (RegNo) {
1346
510
  case 0:
1347
510
    Register = ARM_R0;
1348
510
    break;
1349
76
  case 1:
1350
76
    Register = ARM_R1;
1351
76
    break;
1352
260
  case 2:
1353
260
    Register = ARM_R2;
1354
260
    break;
1355
101
  case 3:
1356
101
    Register = ARM_R3;
1357
101
    break;
1358
263
  case 9:
1359
263
    Register = ARM_R9;
1360
263
    break;
1361
48
  case 12:
1362
48
    Register = ARM_R12;
1363
48
    break;
1364
9
  default:
1365
9
    return MCDisassembler_Fail;
1366
1.26k
  }
1367
1368
1.25k
  MCOperand_CreateReg0(Inst, (Register));
1369
1.25k
  return MCDisassembler_Success;
1370
1.26k
}
1371
1372
static DecodeStatus DecoderGPRRegisterClass(MCInst *Inst, unsigned RegNo,
1373
              uint64_t Address,
1374
              const void *Decoder)
1375
255k
{
1376
255k
  DecodeStatus S = MCDisassembler_Success;
1377
1378
255k
  if ((RegNo == 13 &&
1379
255k
       !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops)) ||
1380
255k
      RegNo == 15)
1381
72.0k
    S = MCDisassembler_SoftFail;
1382
1383
255k
  Check(&S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
1384
255k
  return S;
1385
255k
}
1386
1387
static const uint16_t SPRDecoderTable[] = {
1388
  ARM_S0,  ARM_S1,  ARM_S2,  ARM_S3,  ARM_S4,  ARM_S5,  ARM_S6,  ARM_S7,
1389
  ARM_S8,  ARM_S9,  ARM_S10, ARM_S11, ARM_S12, ARM_S13, ARM_S14, ARM_S15,
1390
  ARM_S16, ARM_S17, ARM_S18, ARM_S19, ARM_S20, ARM_S21, ARM_S22, ARM_S23,
1391
  ARM_S24, ARM_S25, ARM_S26, ARM_S27, ARM_S28, ARM_S29, ARM_S30, ARM_S31
1392
};
1393
1394
static DecodeStatus DecodeSPRRegisterClass(MCInst *Inst, unsigned RegNo,
1395
             uint64_t Address,
1396
             const void *Decoder)
1397
91.4k
{
1398
91.4k
  if (RegNo > 31)
1399
6
    return MCDisassembler_Fail;
1400
1401
91.4k
  unsigned Register = SPRDecoderTable[RegNo];
1402
91.4k
  MCOperand_CreateReg0(Inst, (Register));
1403
91.4k
  return MCDisassembler_Success;
1404
91.4k
}
1405
1406
static DecodeStatus DecodeHPRRegisterClass(MCInst *Inst, unsigned RegNo,
1407
             uint64_t Address,
1408
             const void *Decoder)
1409
18.3k
{
1410
18.3k
  return DecodeSPRRegisterClass(Inst, RegNo, Address, Decoder);
1411
18.3k
}
1412
1413
static const uint16_t DPRDecoderTable[] = {
1414
  ARM_D0,  ARM_D1,  ARM_D2,  ARM_D3,  ARM_D4,  ARM_D5,  ARM_D6,  ARM_D7,
1415
  ARM_D8,  ARM_D9,  ARM_D10, ARM_D11, ARM_D12, ARM_D13, ARM_D14, ARM_D15,
1416
  ARM_D16, ARM_D17, ARM_D18, ARM_D19, ARM_D20, ARM_D21, ARM_D22, ARM_D23,
1417
  ARM_D24, ARM_D25, ARM_D26, ARM_D27, ARM_D28, ARM_D29, ARM_D30, ARM_D31
1418
};
1419
1420
static DecodeStatus DecodeDPRRegisterClass(MCInst *Inst, unsigned RegNo,
1421
             uint64_t Address,
1422
             const void *Decoder)
1423
200k
{
1424
200k
  bool hasD32 = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureD32);
1425
1426
200k
  if (RegNo > 31 || (!hasD32 && RegNo > 15))
1427
24
    return MCDisassembler_Fail;
1428
1429
200k
  unsigned Register = DPRDecoderTable[RegNo];
1430
200k
  MCOperand_CreateReg0(Inst, (Register));
1431
200k
  return MCDisassembler_Success;
1432
200k
}
1433
1434
static DecodeStatus DecodeDPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
1435
               uint64_t Address,
1436
               const void *Decoder)
1437
4.52k
{
1438
4.52k
  if (RegNo > 7)
1439
0
    return MCDisassembler_Fail;
1440
4.52k
  return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
1441
4.52k
}
1442
1443
static DecodeStatus DecodeSPR_8RegisterClass(MCInst *Inst, unsigned RegNo,
1444
               uint64_t Address,
1445
               const void *Decoder)
1446
170
{
1447
170
  if (RegNo > 15)
1448
0
    return MCDisassembler_Fail;
1449
170
  return DecodeSPRRegisterClass(Inst, RegNo, Address, Decoder);
1450
170
}
1451
1452
static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst *Inst, unsigned RegNo,
1453
            uint64_t Address,
1454
            const void *Decoder)
1455
7.00k
{
1456
7.00k
  if (RegNo > 15)
1457
0
    return MCDisassembler_Fail;
1458
7.00k
  return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
1459
7.00k
}
1460
1461
static const uint16_t QPRDecoderTable[] = {
1462
  ARM_Q0, ARM_Q1, ARM_Q2,  ARM_Q3,  ARM_Q4,  ARM_Q5,  ARM_Q6,  ARM_Q7,
1463
  ARM_Q8, ARM_Q9, ARM_Q10, ARM_Q11, ARM_Q12, ARM_Q13, ARM_Q14, ARM_Q15
1464
};
1465
1466
static DecodeStatus DecodeQPRRegisterClass(MCInst *Inst, unsigned RegNo,
1467
             uint64_t Address,
1468
             const void *Decoder)
1469
75.0k
{
1470
75.0k
  if (RegNo > 31 || (RegNo & 1) != 0)
1471
3.88k
    return MCDisassembler_Fail;
1472
71.1k
  RegNo >>= 1;
1473
1474
71.1k
  unsigned Register = QPRDecoderTable[RegNo];
1475
71.1k
  MCOperand_CreateReg0(Inst, (Register));
1476
71.1k
  return MCDisassembler_Success;
1477
75.0k
}
1478
1479
static const uint16_t DPairDecoderTable[] = {
1480
  ARM_Q0,  ARM_D1_D2,   ARM_Q1,  ARM_D3_D4,   ARM_Q2,  ARM_D5_D6,
1481
  ARM_Q3,  ARM_D7_D8,   ARM_Q4,  ARM_D9_D10,  ARM_Q5,  ARM_D11_D12,
1482
  ARM_Q6,  ARM_D13_D14, ARM_Q7,  ARM_D15_D16, ARM_Q8,  ARM_D17_D18,
1483
  ARM_Q9,  ARM_D19_D20, ARM_Q10, ARM_D21_D22, ARM_Q11, ARM_D23_D24,
1484
  ARM_Q12, ARM_D25_D26, ARM_Q13, ARM_D27_D28, ARM_Q14, ARM_D29_D30,
1485
  ARM_Q15
1486
};
1487
1488
static DecodeStatus DecodeDPairRegisterClass(MCInst *Inst, unsigned RegNo,
1489
               uint64_t Address,
1490
               const void *Decoder)
1491
17.9k
{
1492
17.9k
  if (RegNo > 30)
1493
13
    return MCDisassembler_Fail;
1494
1495
17.9k
  unsigned Register = DPairDecoderTable[RegNo];
1496
17.9k
  MCOperand_CreateReg0(Inst, (Register));
1497
17.9k
  return MCDisassembler_Success;
1498
17.9k
}
1499
1500
static const uint16_t DPairSpacedDecoderTable[] = {
1501
  ARM_D0_D2,   ARM_D1_D3,   ARM_D2_D4,   ARM_D3_D5,   ARM_D4_D6,
1502
  ARM_D5_D7,   ARM_D6_D8,   ARM_D7_D9,   ARM_D8_D10,  ARM_D9_D11,
1503
  ARM_D10_D12, ARM_D11_D13, ARM_D12_D14, ARM_D13_D15, ARM_D14_D16,
1504
  ARM_D15_D17, ARM_D16_D18, ARM_D17_D19, ARM_D18_D20, ARM_D19_D21,
1505
  ARM_D20_D22, ARM_D21_D23, ARM_D22_D24, ARM_D23_D25, ARM_D24_D26,
1506
  ARM_D25_D27, ARM_D26_D28, ARM_D27_D29, ARM_D28_D30, ARM_D29_D31
1507
};
1508
1509
static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst *Inst, unsigned RegNo,
1510
               uint64_t Address,
1511
               const void *Decoder)
1512
9.35k
{
1513
9.35k
  if (RegNo > 29)
1514
21
    return MCDisassembler_Fail;
1515
1516
9.33k
  unsigned Register = DPairSpacedDecoderTable[RegNo];
1517
9.33k
  MCOperand_CreateReg0(Inst, (Register));
1518
9.33k
  return MCDisassembler_Success;
1519
9.35k
}
1520
1521
static DecodeStatus DecodePredicateOperand(MCInst *Inst, unsigned Val,
1522
             uint64_t Address,
1523
             const void *Decoder)
1524
165k
{
1525
165k
  DecodeStatus S = MCDisassembler_Success;
1526
165k
  if (Val == 0xF)
1527
5.10k
    return MCDisassembler_Fail;
1528
  // AL predicate is not allowed on Thumb1 branches.
1529
160k
  if (MCInst_getOpcode(Inst) == ARM_tBcc && Val == 0xE)
1530
0
    return MCDisassembler_Fail;
1531
1532
160k
  const MCInstrDesc *Desc = MCInstrDesc_get(MCInst_getOpcode(Inst),
1533
160k
              ARMDescs.Insts,
1534
160k
              ARR_SIZE(ARMDescs.Insts));
1535
1536
160k
  if (Val != ARMCC_AL && !MCInst_isPredicable(Desc))
1537
0
    Check(&S, MCDisassembler_SoftFail);
1538
160k
  MCOperand_CreateImm0(Inst, (Val));
1539
160k
  if (Val == ARMCC_AL) {
1540
25.6k
    MCOperand_CreateReg0(Inst, (0));
1541
25.6k
  } else
1542
134k
    MCOperand_CreateReg0(Inst, (ARM_CPSR));
1543
160k
  return S;
1544
160k
}
1545
1546
static DecodeStatus DecodeCCOutOperand(MCInst *Inst, unsigned Val,
1547
               uint64_t Address, const void *Decoder)
1548
86.0k
{
1549
86.0k
  if (Val)
1550
33.1k
    MCOperand_CreateReg0(Inst, (ARM_CPSR));
1551
52.8k
  else
1552
52.8k
    MCOperand_CreateReg0(Inst, (0));
1553
86.0k
  return MCDisassembler_Success;
1554
86.0k
}
1555
1556
static DecodeStatus DecodeSORegImmOperand(MCInst *Inst, unsigned Val,
1557
            uint64_t Address, const void *Decoder)
1558
34.4k
{
1559
34.4k
  DecodeStatus S = MCDisassembler_Success;
1560
1561
34.4k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
1562
34.4k
  unsigned type = fieldFromInstruction_4(Val, 5, 2);
1563
34.4k
  unsigned imm = fieldFromInstruction_4(Val, 7, 5);
1564
1565
  // Register-immediate
1566
34.4k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
1567
0
    return MCDisassembler_Fail;
1568
1569
34.4k
  ARM_AM_ShiftOpc Shift = ARM_AM_lsl;
1570
34.4k
  switch (type) {
1571
12.5k
  case 0:
1572
12.5k
    Shift = ARM_AM_lsl;
1573
12.5k
    break;
1574
6.34k
  case 1:
1575
6.34k
    Shift = ARM_AM_lsr;
1576
6.34k
    break;
1577
7.12k
  case 2:
1578
7.12k
    Shift = ARM_AM_asr;
1579
7.12k
    break;
1580
8.46k
  case 3:
1581
8.46k
    Shift = ARM_AM_ror;
1582
8.46k
    break;
1583
34.4k
  }
1584
1585
34.4k
  if (Shift == ARM_AM_ror && imm == 0)
1586
1.65k
    Shift = ARM_AM_rrx;
1587
1588
34.4k
  unsigned Op = Shift | (imm << 3);
1589
34.4k
  MCOperand_CreateImm0(Inst, (Op));
1590
1591
34.4k
  return S;
1592
34.4k
}
1593
1594
static DecodeStatus DecodeSORegRegOperand(MCInst *Inst, unsigned Val,
1595
            uint64_t Address, const void *Decoder)
1596
13.5k
{
1597
13.5k
  DecodeStatus S = MCDisassembler_Success;
1598
1599
13.5k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
1600
13.5k
  unsigned type = fieldFromInstruction_4(Val, 5, 2);
1601
13.5k
  unsigned Rs = fieldFromInstruction_4(Val, 8, 4);
1602
1603
  // Register-register
1604
13.5k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1605
0
    return MCDisassembler_Fail;
1606
13.5k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rs, Address, Decoder)))
1607
0
    return MCDisassembler_Fail;
1608
1609
13.5k
  ARM_AM_ShiftOpc Shift = ARM_AM_lsl;
1610
13.5k
  switch (type) {
1611
3.22k
  case 0:
1612
3.22k
    Shift = ARM_AM_lsl;
1613
3.22k
    break;
1614
3.64k
  case 1:
1615
3.64k
    Shift = ARM_AM_lsr;
1616
3.64k
    break;
1617
3.52k
  case 2:
1618
3.52k
    Shift = ARM_AM_asr;
1619
3.52k
    break;
1620
3.10k
  case 3:
1621
3.10k
    Shift = ARM_AM_ror;
1622
3.10k
    break;
1623
13.5k
  }
1624
1625
13.5k
  MCOperand_CreateImm0(Inst, (Shift));
1626
1627
13.5k
  return S;
1628
13.5k
}
1629
1630
static DecodeStatus DecodeRegListOperand(MCInst *Inst, unsigned Val,
1631
           uint64_t Address, const void *Decoder)
1632
45.1k
{
1633
45.1k
  DecodeStatus S = MCDisassembler_Success;
1634
1635
45.1k
  bool NeedDisjointWriteback = false;
1636
45.1k
  unsigned WritebackReg = 0;
1637
45.1k
  bool CLRM = false;
1638
45.1k
  switch (MCInst_getOpcode(Inst)) {
1639
42.1k
  default:
1640
42.1k
    break;
1641
42.1k
  case ARM_LDMIA_UPD:
1642
1.19k
  case ARM_LDMDB_UPD:
1643
1.50k
  case ARM_LDMIB_UPD:
1644
1.94k
  case ARM_LDMDA_UPD:
1645
2.49k
  case ARM_t2LDMIA_UPD:
1646
2.74k
  case ARM_t2LDMDB_UPD:
1647
2.79k
  case ARM_t2STMIA_UPD:
1648
2.93k
  case ARM_t2STMDB_UPD:
1649
2.93k
    NeedDisjointWriteback = true;
1650
2.93k
    WritebackReg = MCOperand_getReg(MCInst_getOperand(Inst, (0)));
1651
2.93k
    break;
1652
94
  case ARM_t2CLRM:
1653
94
    CLRM = true;
1654
94
    break;
1655
45.1k
  }
1656
1657
  // Empty register lists are not allowed.
1658
45.1k
  if (Val == 0)
1659
70
    return MCDisassembler_Fail;
1660
766k
  for (unsigned i = 0; i < 16; ++i) {
1661
721k
    if (Val & (1 << i)) {
1662
224k
      if (CLRM) {
1663
1.00k
        if (!Check(&S, DecodeCLRMGPRRegisterClass(
1664
1.00k
                   Inst, i, Address,
1665
1.00k
                   Decoder))) {
1666
0
          return MCDisassembler_Fail;
1667
0
        }
1668
223k
      } else {
1669
223k
        if (!Check(&S, DecodeGPRRegisterClass(Inst, i,
1670
223k
                      Address,
1671
223k
                      Decoder)))
1672
0
          return MCDisassembler_Fail;
1673
        // Writeback not allowed if Rn is in the target list.
1674
223k
        if (NeedDisjointWriteback &&
1675
223k
            WritebackReg ==
1676
19.5k
              MCOperand_getReg(&(
1677
19.5k
                Inst->Operands[Inst->size -
1678
19.5k
                   1])))
1679
869
          Check(&S, MCDisassembler_SoftFail);
1680
223k
      }
1681
224k
    }
1682
721k
  }
1683
1684
45.0k
  return S;
1685
45.0k
}
1686
1687
static DecodeStatus DecodeSPRRegListOperand(MCInst *Inst, unsigned Val,
1688
              uint64_t Address,
1689
              const void *Decoder)
1690
3.11k
{
1691
3.11k
  DecodeStatus S = MCDisassembler_Success;
1692
1693
3.11k
  unsigned Vd = fieldFromInstruction_4(Val, 8, 5);
1694
3.11k
  unsigned regs = fieldFromInstruction_4(Val, 0, 8);
1695
1696
  // In case of unpredictable encoding, tweak the operands.
1697
3.11k
  if (regs == 0 || (Vd + regs) > 32) {
1698
2.32k
    regs = Vd + regs > 32 ? 32 - Vd : regs;
1699
2.32k
    regs = regs > 1u ? regs : 1u;
1700
2.32k
    S = MCDisassembler_SoftFail;
1701
2.32k
  }
1702
1703
3.11k
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Vd, Address, Decoder)))
1704
0
    return MCDisassembler_Fail;
1705
44.5k
  for (unsigned i = 0; i < (regs - 1); ++i) {
1706
41.4k
    if (!Check(&S, DecodeSPRRegisterClass(Inst, ++Vd, Address,
1707
41.4k
                  Decoder)))
1708
0
      return MCDisassembler_Fail;
1709
41.4k
  }
1710
1711
3.11k
  return S;
1712
3.11k
}
1713
1714
static DecodeStatus DecodeDPRRegListOperand(MCInst *Inst, unsigned Val,
1715
              uint64_t Address,
1716
              const void *Decoder)
1717
1.34k
{
1718
1.34k
  DecodeStatus S = MCDisassembler_Success;
1719
1720
1.34k
  unsigned Vd = fieldFromInstruction_4(Val, 8, 5);
1721
1.34k
  unsigned regs = fieldFromInstruction_4(Val, 1, 7);
1722
1723
  // In case of unpredictable encoding, tweak the operands.
1724
1.34k
  if (regs == 0 || regs > 16 || (Vd + regs) > 32) {
1725
1.21k
    regs = Vd + regs > 32 ? 32 - Vd : regs;
1726
1.21k
    regs = regs > 1u ? regs : 1u;
1727
1.21k
    regs = regs < 16u ? regs : 16u;
1728
1.21k
    S = MCDisassembler_SoftFail;
1729
1.21k
  }
1730
1731
1.34k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
1732
0
    return MCDisassembler_Fail;
1733
10.9k
  for (unsigned i = 0; i < (regs - 1); ++i) {
1734
9.59k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, ++Vd, Address,
1735
9.59k
                  Decoder)))
1736
0
      return MCDisassembler_Fail;
1737
9.59k
  }
1738
1739
1.34k
  return S;
1740
1.34k
}
1741
1742
static DecodeStatus DecodeBitfieldMaskOperand(MCInst *Inst, unsigned Val,
1743
                uint64_t Address,
1744
                const void *Decoder)
1745
2.96k
{
1746
  // This operand encodes a mask of contiguous zeros between a specified MSB
1747
  // and LSB.  To decode it, we create the mask of all bits MSB-and-lower,
1748
  // the mask of all bits LSB-and-lower, and then xor them to create
1749
  // the mask of that's all ones on [msb, lsb].  Finally we not it to
1750
  // create the final mask.
1751
2.96k
  unsigned msb = fieldFromInstruction_4(Val, 5, 5);
1752
2.96k
  unsigned lsb = fieldFromInstruction_4(Val, 0, 5);
1753
1754
2.96k
  DecodeStatus S = MCDisassembler_Success;
1755
2.96k
  if (lsb > msb) {
1756
1.63k
    Check(&S, MCDisassembler_SoftFail);
1757
    // The check above will cause the warning for the "potentially undefined
1758
    // instruction encoding" but we can't build a bad MCOperand value here
1759
    // with a lsb > msb or else printing the MCInst will cause a crash.
1760
1.63k
    lsb = msb;
1761
1.63k
  }
1762
1763
2.96k
  uint32_t msb_mask = 0xFFFFFFFF;
1764
2.96k
  if (msb != 31)
1765
2.72k
    msb_mask = (1U << (msb + 1)) - 1;
1766
2.96k
  uint32_t lsb_mask = (1U << lsb) - 1;
1767
1768
2.96k
  MCOperand_CreateImm0(Inst, (~(msb_mask ^ lsb_mask)));
1769
2.96k
  return S;
1770
2.96k
}
1771
1772
static DecodeStatus DecodeCopMemInstruction(MCInst *Inst, unsigned Insn,
1773
              uint64_t Address,
1774
              const void *Decoder)
1775
33.1k
{
1776
33.1k
  DecodeStatus S = MCDisassembler_Success;
1777
1778
33.1k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
1779
33.1k
  unsigned CRd = fieldFromInstruction_4(Insn, 12, 4);
1780
33.1k
  unsigned coproc = fieldFromInstruction_4(Insn, 8, 4);
1781
33.1k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
1782
33.1k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
1783
33.1k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
1784
1785
33.1k
  switch (MCInst_getOpcode(Inst)) {
1786
408
  case ARM_LDC_OFFSET:
1787
967
  case ARM_LDC_PRE:
1788
1.49k
  case ARM_LDC_POST:
1789
1.88k
  case ARM_LDC_OPTION:
1790
2.45k
  case ARM_LDCL_OFFSET:
1791
2.93k
  case ARM_LDCL_PRE:
1792
4.00k
  case ARM_LDCL_POST:
1793
4.35k
  case ARM_LDCL_OPTION:
1794
5.25k
  case ARM_STC_OFFSET:
1795
5.61k
  case ARM_STC_PRE:
1796
6.11k
  case ARM_STC_POST:
1797
6.45k
  case ARM_STC_OPTION:
1798
7.00k
  case ARM_STCL_OFFSET:
1799
7.71k
  case ARM_STCL_PRE:
1800
8.45k
  case ARM_STCL_POST:
1801
8.83k
  case ARM_STCL_OPTION:
1802
9.47k
  case ARM_t2LDC_OFFSET:
1803
10.2k
  case ARM_t2LDC_PRE:
1804
10.6k
  case ARM_t2LDC_POST:
1805
10.8k
  case ARM_t2LDC_OPTION:
1806
11.1k
  case ARM_t2LDCL_OFFSET:
1807
12.3k
  case ARM_t2LDCL_PRE:
1808
12.9k
  case ARM_t2LDCL_POST:
1809
13.1k
  case ARM_t2LDCL_OPTION:
1810
14.1k
  case ARM_t2STC_OFFSET:
1811
14.8k
  case ARM_t2STC_PRE:
1812
15.5k
  case ARM_t2STC_POST:
1813
15.7k
  case ARM_t2STC_OPTION:
1814
16.1k
  case ARM_t2STCL_OFFSET:
1815
16.8k
  case ARM_t2STCL_PRE:
1816
18.2k
  case ARM_t2STCL_POST:
1817
18.5k
  case ARM_t2STCL_OPTION:
1818
19.1k
  case ARM_t2LDC2_OFFSET:
1819
19.4k
  case ARM_t2LDC2L_OFFSET:
1820
20.4k
  case ARM_t2LDC2_PRE:
1821
21.3k
  case ARM_t2LDC2L_PRE:
1822
22.4k
  case ARM_t2STC2_OFFSET:
1823
22.8k
  case ARM_t2STC2L_OFFSET:
1824
23.5k
  case ARM_t2STC2_PRE:
1825
24.1k
  case ARM_t2STC2L_PRE:
1826
24.2k
  case ARM_LDC2_OFFSET:
1827
24.4k
  case ARM_LDC2L_OFFSET:
1828
24.5k
  case ARM_LDC2_PRE:
1829
24.8k
  case ARM_LDC2L_PRE:
1830
25.0k
  case ARM_STC2_OFFSET:
1831
25.2k
  case ARM_STC2L_OFFSET:
1832
25.3k
  case ARM_STC2_PRE:
1833
25.5k
  case ARM_STC2L_PRE:
1834
26.5k
  case ARM_t2LDC2_OPTION:
1835
27.1k
  case ARM_t2STC2_OPTION:
1836
28.0k
  case ARM_t2LDC2_POST:
1837
28.8k
  case ARM_t2LDC2L_POST:
1838
29.9k
  case ARM_t2STC2_POST:
1839
30.8k
  case ARM_t2STC2L_POST:
1840
31.1k
  case ARM_LDC2_POST:
1841
31.7k
  case ARM_LDC2L_POST:
1842
31.8k
  case ARM_STC2_POST:
1843
32.2k
  case ARM_STC2L_POST:
1844
32.2k
    if (coproc == 0xA || coproc == 0xB ||
1845
32.2k
        (ARM_getFeatureBits(Inst->csh->mode,
1846
32.2k
          ARM_HasV8_1MMainlineOps) &&
1847
32.2k
         (coproc == 0x8 || coproc == 0x9 || coproc == 0xA ||
1848
51
          coproc == 0xB || coproc == 0xE || coproc == 0xF)))
1849
44
      return MCDisassembler_Fail;
1850
32.2k
    break;
1851
32.2k
  default:
1852
841
    break;
1853
33.1k
  }
1854
1855
33.0k
  if (ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops) && (coproc != 14))
1856
39
    return MCDisassembler_Fail;
1857
1858
33.0k
  MCOperand_CreateImm0(Inst, (coproc));
1859
33.0k
  MCOperand_CreateImm0(Inst, (CRd));
1860
33.0k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1861
0
    return MCDisassembler_Fail;
1862
1863
33.0k
  switch (MCInst_getOpcode(Inst)) {
1864
649
  case ARM_t2LDC2_OFFSET:
1865
951
  case ARM_t2LDC2L_OFFSET:
1866
1.93k
  case ARM_t2LDC2_PRE:
1867
2.86k
  case ARM_t2LDC2L_PRE:
1868
3.91k
  case ARM_t2STC2_OFFSET:
1869
4.34k
  case ARM_t2STC2L_OFFSET:
1870
5.01k
  case ARM_t2STC2_PRE:
1871
5.67k
  case ARM_t2STC2L_PRE:
1872
5.77k
  case ARM_LDC2_OFFSET:
1873
5.91k
  case ARM_LDC2L_OFFSET:
1874
6.00k
  case ARM_LDC2_PRE:
1875
6.33k
  case ARM_LDC2L_PRE:
1876
6.56k
  case ARM_STC2_OFFSET:
1877
6.69k
  case ARM_STC2L_OFFSET:
1878
6.79k
  case ARM_STC2_PRE:
1879
7.07k
  case ARM_STC2L_PRE:
1880
7.72k
  case ARM_t2LDC_OFFSET:
1881
8.00k
  case ARM_t2LDCL_OFFSET:
1882
8.72k
  case ARM_t2LDC_PRE:
1883
9.91k
  case ARM_t2LDCL_PRE:
1884
10.9k
  case ARM_t2STC_OFFSET:
1885
11.2k
  case ARM_t2STCL_OFFSET:
1886
11.9k
  case ARM_t2STC_PRE:
1887
12.6k
  case ARM_t2STCL_PRE:
1888
13.0k
  case ARM_LDC_OFFSET:
1889
13.6k
  case ARM_LDCL_OFFSET:
1890
14.2k
  case ARM_LDC_PRE:
1891
14.6k
  case ARM_LDCL_PRE:
1892
15.5k
  case ARM_STC_OFFSET:
1893
16.1k
  case ARM_STCL_OFFSET:
1894
16.4k
  case ARM_STC_PRE:
1895
17.2k
  case ARM_STCL_PRE:
1896
17.2k
    imm = ARM_AM_getAM5Opc(U ? ARM_AM_add : ARM_AM_sub, imm);
1897
17.2k
    MCOperand_CreateImm0(Inst, (imm));
1898
17.2k
    break;
1899
915
  case ARM_t2LDC2_POST:
1900
1.67k
  case ARM_t2LDC2L_POST:
1901
2.77k
  case ARM_t2STC2_POST:
1902
3.67k
  case ARM_t2STC2L_POST:
1903
3.96k
  case ARM_LDC2_POST:
1904
4.58k
  case ARM_LDC2L_POST:
1905
4.68k
  case ARM_STC2_POST:
1906
5.10k
  case ARM_STC2L_POST:
1907
5.57k
  case ARM_t2LDC_POST:
1908
6.19k
  case ARM_t2LDCL_POST:
1909
6.80k
  case ARM_t2STC_POST:
1910
8.19k
  case ARM_t2STCL_POST:
1911
8.71k
  case ARM_LDC_POST:
1912
9.78k
  case ARM_LDCL_POST:
1913
10.2k
  case ARM_STC_POST:
1914
11.0k
  case ARM_STCL_POST:
1915
11.0k
    imm |= U << 8;
1916
    // fall through
1917
15.8k
  default:
1918
    // The 'option' variant doesn't encode 'U' in the immediate since
1919
    // the immediate is unsigned [0,255].
1920
15.8k
    MCOperand_CreateImm0(Inst, (imm));
1921
15.8k
    break;
1922
33.0k
  }
1923
1924
33.0k
  switch (MCInst_getOpcode(Inst)) {
1925
408
  case ARM_LDC_OFFSET:
1926
965
  case ARM_LDC_PRE:
1927
1.49k
  case ARM_LDC_POST:
1928
1.88k
  case ARM_LDC_OPTION:
1929
2.44k
  case ARM_LDCL_OFFSET:
1930
2.92k
  case ARM_LDCL_PRE:
1931
3.99k
  case ARM_LDCL_POST:
1932
4.33k
  case ARM_LDCL_OPTION:
1933
5.23k
  case ARM_STC_OFFSET:
1934
5.60k
  case ARM_STC_PRE:
1935
6.09k
  case ARM_STC_POST:
1936
6.43k
  case ARM_STC_OPTION:
1937
6.98k
  case ARM_STCL_OFFSET:
1938
7.68k
  case ARM_STCL_PRE:
1939
8.42k
  case ARM_STCL_POST:
1940
8.79k
  case ARM_STCL_OPTION:
1941
8.79k
    if (!Check(&S, DecodePredicateOperand(Inst, pred, Address,
1942
8.79k
                  Decoder)))
1943
0
      return MCDisassembler_Fail;
1944
8.79k
    break;
1945
24.2k
  default:
1946
24.2k
    break;
1947
33.0k
  }
1948
1949
33.0k
  return S;
1950
33.0k
}
1951
1952
static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst *Inst, unsigned Insn,
1953
              uint64_t Address,
1954
              const void *Decoder)
1955
20.4k
{
1956
20.4k
  DecodeStatus S = MCDisassembler_Success;
1957
1958
20.4k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
1959
20.4k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
1960
20.4k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
1961
20.4k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
1962
20.4k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
1963
20.4k
  unsigned reg = fieldFromInstruction_4(Insn, 25, 1);
1964
20.4k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
1965
20.4k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
1966
1967
  // On stores, the writeback operand precedes Rt.
1968
20.4k
  switch (MCInst_getOpcode(Inst)) {
1969
1.61k
  case ARM_STR_POST_IMM:
1970
2.75k
  case ARM_STR_POST_REG:
1971
4.25k
  case ARM_STRB_POST_IMM:
1972
4.90k
  case ARM_STRB_POST_REG:
1973
5.99k
  case ARM_STRT_POST_REG:
1974
7.82k
  case ARM_STRT_POST_IMM:
1975
9.42k
  case ARM_STRBT_POST_REG:
1976
12.7k
  case ARM_STRBT_POST_IMM:
1977
12.7k
    if (!Check(&S,
1978
12.7k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1979
0
      return MCDisassembler_Fail;
1980
12.7k
    break;
1981
12.7k
  default:
1982
7.74k
    break;
1983
20.4k
  }
1984
1985
20.4k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
1986
0
    return MCDisassembler_Fail;
1987
1988
  // On loads, the writeback operand comes after Rt.
1989
20.4k
  switch (MCInst_getOpcode(Inst)) {
1990
1.72k
  case ARM_LDR_POST_IMM:
1991
2.46k
  case ARM_LDR_POST_REG:
1992
3.18k
  case ARM_LDRB_POST_IMM:
1993
3.99k
  case ARM_LDRB_POST_REG:
1994
4.55k
  case ARM_LDRBT_POST_REG:
1995
5.95k
  case ARM_LDRBT_POST_IMM:
1996
6.66k
  case ARM_LDRT_POST_REG:
1997
7.74k
  case ARM_LDRT_POST_IMM:
1998
7.74k
    if (!Check(&S,
1999
7.74k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2000
0
      return MCDisassembler_Fail;
2001
7.74k
    break;
2002
12.7k
  default:
2003
12.7k
    break;
2004
20.4k
  }
2005
2006
20.4k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2007
0
    return MCDisassembler_Fail;
2008
2009
20.4k
  ARM_AM_AddrOpc Op = ARM_AM_add;
2010
20.4k
  if (!fieldFromInstruction_4(Insn, 23, 1))
2011
10.3k
    Op = ARM_AM_sub;
2012
2013
20.4k
  bool writeback = (P == 0) || (W == 1);
2014
20.4k
  unsigned idx_mode = 0;
2015
20.4k
  if (P && writeback)
2016
0
    idx_mode = ARMII_IndexModePre;
2017
20.4k
  else if (!P && writeback)
2018
20.4k
    idx_mode = ARMII_IndexModePost;
2019
2020
20.4k
  if (writeback && (Rn == 15 || Rn == Rt))
2021
3.85k
    S = MCDisassembler_SoftFail; // UNPREDICTABLE
2022
2023
20.4k
  if (reg) {
2024
7.29k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address,
2025
7.29k
                Decoder)))
2026
0
      return MCDisassembler_Fail;
2027
7.29k
    ARM_AM_ShiftOpc Opc = ARM_AM_lsl;
2028
7.29k
    switch (fieldFromInstruction_4(Insn, 5, 2)) {
2029
2.49k
    case 0:
2030
2.49k
      Opc = ARM_AM_lsl;
2031
2.49k
      break;
2032
1.56k
    case 1:
2033
1.56k
      Opc = ARM_AM_lsr;
2034
1.56k
      break;
2035
980
    case 2:
2036
980
      Opc = ARM_AM_asr;
2037
980
      break;
2038
2.25k
    case 3:
2039
2.25k
      Opc = ARM_AM_ror;
2040
2.25k
      break;
2041
0
    default:
2042
0
      return MCDisassembler_Fail;
2043
7.29k
    }
2044
7.29k
    unsigned amt = fieldFromInstruction_4(Insn, 7, 5);
2045
7.29k
    if (Opc == ARM_AM_ror && amt == 0)
2046
265
      Opc = ARM_AM_rrx;
2047
7.29k
    imm = ARM_AM_getAM2Opc(Op, amt, Opc, idx_mode);
2048
2049
7.29k
    MCOperand_CreateImm0(Inst, (imm));
2050
13.1k
  } else {
2051
13.1k
    MCOperand_CreateReg0(Inst, (0));
2052
13.1k
    unsigned tmp = ARM_AM_getAM2Opc(Op, imm, ARM_AM_lsl, idx_mode);
2053
13.1k
    MCOperand_CreateImm0(Inst, (tmp));
2054
13.1k
  }
2055
2056
20.4k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2057
2.56k
    return MCDisassembler_Fail;
2058
2059
17.8k
  return S;
2060
20.4k
}
2061
2062
static DecodeStatus DecodeSORegMemOperand(MCInst *Inst, unsigned Val,
2063
            uint64_t Address, const void *Decoder)
2064
10.7k
{
2065
10.7k
  DecodeStatus S = MCDisassembler_Success;
2066
2067
10.7k
  unsigned Rn = fieldFromInstruction_4(Val, 13, 4);
2068
10.7k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
2069
10.7k
  unsigned type = fieldFromInstruction_4(Val, 5, 2);
2070
10.7k
  unsigned imm = fieldFromInstruction_4(Val, 7, 5);
2071
10.7k
  unsigned U = fieldFromInstruction_4(Val, 12, 1);
2072
2073
10.7k
  ARM_AM_ShiftOpc ShOp = ARM_AM_lsl;
2074
10.7k
  switch (type) {
2075
2.92k
  case 0:
2076
2.92k
    ShOp = ARM_AM_lsl;
2077
2.92k
    break;
2078
1.94k
  case 1:
2079
1.94k
    ShOp = ARM_AM_lsr;
2080
1.94k
    break;
2081
2.37k
  case 2:
2082
2.37k
    ShOp = ARM_AM_asr;
2083
2.37k
    break;
2084
3.52k
  case 3:
2085
3.52k
    ShOp = ARM_AM_ror;
2086
3.52k
    break;
2087
10.7k
  }
2088
2089
10.7k
  if (ShOp == ARM_AM_ror && imm == 0)
2090
1.04k
    ShOp = ARM_AM_rrx;
2091
2092
10.7k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2093
0
    return MCDisassembler_Fail;
2094
10.7k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2095
0
    return MCDisassembler_Fail;
2096
10.7k
  unsigned shift;
2097
10.7k
  if (U)
2098
4.23k
    shift = ARM_AM_getAM2Opc(ARM_AM_add, imm, ShOp, 0);
2099
6.53k
  else
2100
6.53k
    shift = ARM_AM_getAM2Opc(ARM_AM_sub, imm, ShOp, 0);
2101
10.7k
  MCOperand_CreateImm0(Inst, (shift));
2102
2103
10.7k
  return S;
2104
10.7k
}
2105
2106
static DecodeStatus DecodeTSBInstruction(MCInst *Inst, unsigned Insn,
2107
           uint64_t Address, const void *Decoder)
2108
100
{
2109
100
  if (MCInst_getOpcode(Inst) != ARM_TSB &&
2110
100
      MCInst_getOpcode(Inst) != ARM_t2TSB)
2111
0
    return MCDisassembler_Fail;
2112
2113
  // The "csync" operand is not encoded into the "tsb" instruction (as this is
2114
  // the only available operand), but LLVM expects the instruction to have one
2115
  // operand, so we need to add the csync when decoding.
2116
100
  MCOperand_CreateImm0(Inst, (ARM_TSB_CSYNC));
2117
100
  return MCDisassembler_Success;
2118
100
}
2119
2120
static DecodeStatus DecodeAddrMode3Instruction(MCInst *Inst, unsigned Insn,
2121
                 uint64_t Address,
2122
                 const void *Decoder)
2123
20.2k
{
2124
20.2k
  DecodeStatus S = MCDisassembler_Success;
2125
2126
20.2k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
2127
20.2k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2128
20.2k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2129
20.2k
  unsigned type = fieldFromInstruction_4(Insn, 22, 1);
2130
20.2k
  unsigned imm = fieldFromInstruction_4(Insn, 8, 4);
2131
20.2k
  unsigned U = ((~fieldFromInstruction_4(Insn, 23, 1)) & 1) << 8;
2132
20.2k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2133
20.2k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
2134
20.2k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
2135
20.2k
  unsigned Rt2 = Rt + 1;
2136
2137
20.2k
  bool writeback = (W == 1) | (P == 0);
2138
2139
  // For {LD,ST}RD, Rt must be even, else undefined.
2140
20.2k
  switch (MCInst_getOpcode(Inst)) {
2141
975
  case ARM_STRD:
2142
1.73k
  case ARM_STRD_PRE:
2143
3.77k
  case ARM_STRD_POST:
2144
4.72k
  case ARM_LDRD:
2145
5.49k
  case ARM_LDRD_PRE:
2146
7.35k
  case ARM_LDRD_POST:
2147
7.35k
    if (Rt & 0x1)
2148
2.65k
      S = MCDisassembler_SoftFail;
2149
7.35k
    break;
2150
12.9k
  default:
2151
12.9k
    break;
2152
20.2k
  }
2153
20.2k
  switch (MCInst_getOpcode(Inst)) {
2154
975
  case ARM_STRD:
2155
1.73k
  case ARM_STRD_PRE:
2156
3.77k
  case ARM_STRD_POST:
2157
3.77k
    if (P == 0 && W == 1)
2158
0
      S = MCDisassembler_SoftFail;
2159
2160
3.77k
    if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
2161
1.40k
      S = MCDisassembler_SoftFail;
2162
3.77k
    if (type && Rm == 15)
2163
425
      S = MCDisassembler_SoftFail;
2164
3.77k
    if (Rt2 == 15)
2165
489
      S = MCDisassembler_SoftFail;
2166
3.77k
    if (!type && fieldFromInstruction_4(Insn, 8, 4))
2167
1.41k
      S = MCDisassembler_SoftFail;
2168
3.77k
    break;
2169
518
  case ARM_STRH:
2170
969
  case ARM_STRH_PRE:
2171
2.82k
  case ARM_STRH_POST:
2172
2.82k
    if (Rt == 15)
2173
450
      S = MCDisassembler_SoftFail;
2174
2.82k
    if (writeback && (Rn == 15 || Rn == Rt))
2175
753
      S = MCDisassembler_SoftFail;
2176
2.82k
    if (!type && Rm == 15)
2177
396
      S = MCDisassembler_SoftFail;
2178
2.82k
    break;
2179
952
  case ARM_LDRD:
2180
1.72k
  case ARM_LDRD_PRE:
2181
3.58k
  case ARM_LDRD_POST:
2182
3.58k
    if (type && Rn == 15) {
2183
329
      if (Rt2 == 15)
2184
101
        S = MCDisassembler_SoftFail;
2185
329
      break;
2186
329
    }
2187
3.25k
    if (P == 0 && W == 1)
2188
0
      S = MCDisassembler_SoftFail;
2189
3.25k
    if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
2190
1.40k
      S = MCDisassembler_SoftFail;
2191
3.25k
    if (!type && writeback && Rn == 15)
2192
399
      S = MCDisassembler_SoftFail;
2193
3.25k
    if (writeback && (Rn == Rt || Rn == Rt2))
2194
575
      S = MCDisassembler_SoftFail;
2195
3.25k
    break;
2196
1.03k
  case ARM_LDRH:
2197
1.80k
  case ARM_LDRH_PRE:
2198
2.81k
  case ARM_LDRH_POST:
2199
2.81k
    if (type && Rn == 15) {
2200
322
      if (Rt == 15)
2201
85
        S = MCDisassembler_SoftFail;
2202
322
      break;
2203
322
    }
2204
2.49k
    if (Rt == 15)
2205
523
      S = MCDisassembler_SoftFail;
2206
2.49k
    if (!type && Rm == 15)
2207
324
      S = MCDisassembler_SoftFail;
2208
2.49k
    if (!type && writeback && (Rn == 15 || Rn == Rt))
2209
257
      S = MCDisassembler_SoftFail;
2210
2.49k
    break;
2211
883
  case ARM_LDRSH:
2212
1.92k
  case ARM_LDRSH_PRE:
2213
2.72k
  case ARM_LDRSH_POST:
2214
4.61k
  case ARM_LDRSB:
2215
5.01k
  case ARM_LDRSB_PRE:
2216
7.29k
  case ARM_LDRSB_POST:
2217
7.29k
    if (type && Rn == 15) {
2218
577
      if (Rt == 15)
2219
114
        S = MCDisassembler_SoftFail;
2220
577
      break;
2221
577
    }
2222
6.71k
    if (type && (Rt == 15 || (writeback && Rn == Rt)))
2223
738
      S = MCDisassembler_SoftFail;
2224
6.71k
    if (!type && (Rt == 15 || Rm == 15))
2225
698
      S = MCDisassembler_SoftFail;
2226
6.71k
    if (!type && writeback && (Rn == 15 || Rn == Rt))
2227
686
      S = MCDisassembler_SoftFail;
2228
6.71k
    break;
2229
0
  default:
2230
0
    break;
2231
20.2k
  }
2232
2233
20.2k
  if (writeback) { // Writeback
2234
14.0k
    if (P)
2235
4.18k
      U |= ARMII_IndexModePre << 9;
2236
9.84k
    else
2237
9.84k
      U |= ARMII_IndexModePost << 9;
2238
2239
    // On stores, the writeback operand precedes Rt.
2240
14.0k
    switch (MCInst_getOpcode(Inst)) {
2241
0
    case ARM_STRD:
2242
759
    case ARM_STRD_PRE:
2243
2.79k
    case ARM_STRD_POST:
2244
2.79k
    case ARM_STRH:
2245
3.24k
    case ARM_STRH_PRE:
2246
5.09k
    case ARM_STRH_POST:
2247
5.09k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address,
2248
5.09k
                    Decoder)))
2249
0
        return MCDisassembler_Fail;
2250
5.09k
      break;
2251
8.93k
    default:
2252
8.93k
      break;
2253
14.0k
    }
2254
14.0k
  }
2255
2256
20.2k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
2257
0
    return MCDisassembler_Fail;
2258
20.2k
  switch (MCInst_getOpcode(Inst)) {
2259
975
  case ARM_STRD:
2260
1.73k
  case ARM_STRD_PRE:
2261
3.77k
  case ARM_STRD_POST:
2262
4.72k
  case ARM_LDRD:
2263
5.49k
  case ARM_LDRD_PRE:
2264
7.35k
  case ARM_LDRD_POST:
2265
7.35k
    if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt + 1, Address,
2266
7.35k
                  Decoder)))
2267
10
      return MCDisassembler_Fail;
2268
7.34k
    break;
2269
12.9k
  default:
2270
12.9k
    break;
2271
20.2k
  }
2272
2273
20.2k
  if (writeback) {
2274
    // On loads, the writeback operand comes after Rt.
2275
14.0k
    switch (MCInst_getOpcode(Inst)) {
2276
0
    case ARM_LDRD:
2277
771
    case ARM_LDRD_PRE:
2278
2.63k
    case ARM_LDRD_POST:
2279
2.63k
    case ARM_LDRH:
2280
3.39k
    case ARM_LDRH_PRE:
2281
4.40k
    case ARM_LDRH_POST:
2282
4.40k
    case ARM_LDRSH:
2283
5.44k
    case ARM_LDRSH_PRE:
2284
6.25k
    case ARM_LDRSH_POST:
2285
6.25k
    case ARM_LDRSB:
2286
6.65k
    case ARM_LDRSB_PRE:
2287
8.92k
    case ARM_LDRSB_POST:
2288
8.92k
    case ARM_LDRHTr:
2289
8.92k
    case ARM_LDRSBTr:
2290
8.92k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address,
2291
8.92k
                    Decoder)))
2292
0
        return MCDisassembler_Fail;
2293
8.92k
      break;
2294
8.92k
    default:
2295
5.09k
      break;
2296
14.0k
    }
2297
14.0k
  }
2298
2299
20.2k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2300
0
    return MCDisassembler_Fail;
2301
2302
20.2k
  if (type) {
2303
9.75k
    MCOperand_CreateReg0(Inst, (0));
2304
9.75k
    MCOperand_CreateImm0(Inst, (U | (imm << 4) | Rm));
2305
10.5k
  } else {
2306
10.5k
    if (!Check(&S,
2307
10.5k
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2308
0
      return MCDisassembler_Fail;
2309
10.5k
    MCOperand_CreateImm0(Inst, (U));
2310
10.5k
  }
2311
2312
20.2k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2313
6
    return MCDisassembler_Fail;
2314
2315
20.2k
  return S;
2316
20.2k
}
2317
2318
static DecodeStatus DecodeRFEInstruction(MCInst *Inst, unsigned Insn,
2319
           uint64_t Address, const void *Decoder)
2320
1.10k
{
2321
1.10k
  DecodeStatus S = MCDisassembler_Success;
2322
2323
1.10k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2324
1.10k
  unsigned mode = fieldFromInstruction_4(Insn, 23, 2);
2325
2326
1.10k
  switch (mode) {
2327
346
  case 0:
2328
346
    mode = ARM_AM_da;
2329
346
    break;
2330
315
  case 1:
2331
315
    mode = ARM_AM_ia;
2332
315
    break;
2333
264
  case 2:
2334
264
    mode = ARM_AM_db;
2335
264
    break;
2336
184
  case 3:
2337
184
    mode = ARM_AM_ib;
2338
184
    break;
2339
1.10k
  }
2340
2341
1.10k
  MCOperand_CreateImm0(Inst, (mode));
2342
1.10k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2343
0
    return MCDisassembler_Fail;
2344
2345
1.10k
  return S;
2346
1.10k
}
2347
2348
static DecodeStatus DecodeQADDInstruction(MCInst *Inst, unsigned Insn,
2349
            uint64_t Address, const void *Decoder)
2350
1.05k
{
2351
1.05k
  DecodeStatus S = MCDisassembler_Success;
2352
2353
1.05k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2354
1.05k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2355
1.05k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2356
1.05k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2357
2358
1.05k
  if (pred == 0xF)
2359
270
    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
2360
2361
786
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2362
0
    return MCDisassembler_Fail;
2363
786
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
2364
0
    return MCDisassembler_Fail;
2365
786
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
2366
0
    return MCDisassembler_Fail;
2367
786
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2368
0
    return MCDisassembler_Fail;
2369
786
  return S;
2370
786
}
2371
2372
static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst *Inst,
2373
                unsigned Insn,
2374
                uint64_t Address,
2375
                const void *Decoder)
2376
10.9k
{
2377
10.9k
  DecodeStatus S = MCDisassembler_Success;
2378
2379
10.9k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2380
10.9k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2381
10.9k
  unsigned reglist = fieldFromInstruction_4(Insn, 0, 16);
2382
2383
10.9k
  if (pred == 0xF) {
2384
    // Ambiguous with RFE and SRS
2385
1.13k
    switch (MCInst_getOpcode(Inst)) {
2386
0
    case ARM_LDMDA:
2387
0
      MCInst_setOpcode(Inst, (ARM_RFEDA));
2388
0
      break;
2389
346
    case ARM_LDMDA_UPD:
2390
346
      MCInst_setOpcode(Inst, (ARM_RFEDA_UPD));
2391
346
      break;
2392
0
    case ARM_LDMDB:
2393
0
      MCInst_setOpcode(Inst, (ARM_RFEDB));
2394
0
      break;
2395
264
    case ARM_LDMDB_UPD:
2396
264
      MCInst_setOpcode(Inst, (ARM_RFEDB_UPD));
2397
264
      break;
2398
0
    case ARM_LDMIA:
2399
0
      MCInst_setOpcode(Inst, (ARM_RFEIA));
2400
0
      break;
2401
315
    case ARM_LDMIA_UPD:
2402
315
      MCInst_setOpcode(Inst, (ARM_RFEIA_UPD));
2403
315
      break;
2404
0
    case ARM_LDMIB:
2405
0
      MCInst_setOpcode(Inst, (ARM_RFEIB));
2406
0
      break;
2407
184
    case ARM_LDMIB_UPD:
2408
184
      MCInst_setOpcode(Inst, (ARM_RFEIB_UPD));
2409
184
      break;
2410
0
    case ARM_STMDA:
2411
0
      MCInst_setOpcode(Inst, (ARM_SRSDA));
2412
0
      break;
2413
3
    case ARM_STMDA_UPD:
2414
3
      MCInst_setOpcode(Inst, (ARM_SRSDA_UPD));
2415
3
      break;
2416
0
    case ARM_STMDB:
2417
0
      MCInst_setOpcode(Inst, (ARM_SRSDB));
2418
0
      break;
2419
4
    case ARM_STMDB_UPD:
2420
4
      MCInst_setOpcode(Inst, (ARM_SRSDB_UPD));
2421
4
      break;
2422
0
    case ARM_STMIA:
2423
0
      MCInst_setOpcode(Inst, (ARM_SRSIA));
2424
0
      break;
2425
2
    case ARM_STMIA_UPD:
2426
2
      MCInst_setOpcode(Inst, (ARM_SRSIA_UPD));
2427
2
      break;
2428
0
    case ARM_STMIB:
2429
0
      MCInst_setOpcode(Inst, (ARM_SRSIB));
2430
0
      break;
2431
2
    case ARM_STMIB_UPD:
2432
2
      MCInst_setOpcode(Inst, (ARM_SRSIB_UPD));
2433
2
      break;
2434
19
    default:
2435
19
      return MCDisassembler_Fail;
2436
1.13k
    }
2437
2438
    // For stores (which become SRS's, the only operand is the mode.
2439
1.12k
    if (fieldFromInstruction_4(Insn, 20, 1) == 0) {
2440
      // Check SRS encoding constraints
2441
11
      if (!(fieldFromInstruction_4(Insn, 22, 1) == 1 &&
2442
11
            fieldFromInstruction_4(Insn, 20, 1) == 0))
2443
11
        return MCDisassembler_Fail;
2444
2445
0
      MCOperand_CreateImm0(
2446
0
        Inst, (fieldFromInstruction_4(Insn, 0, 4)));
2447
0
      return S;
2448
11
    }
2449
2450
1.10k
    return DecodeRFEInstruction(Inst, Insn, Address, Decoder);
2451
1.12k
  }
2452
2453
9.81k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2454
0
    return MCDisassembler_Fail;
2455
9.81k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2456
0
    return MCDisassembler_Fail; // Tied
2457
9.81k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2458
0
    return MCDisassembler_Fail;
2459
9.81k
  if (!Check(&S, DecodeRegListOperand(Inst, reglist, Address, Decoder)))
2460
9
    return MCDisassembler_Fail;
2461
2462
9.81k
  return S;
2463
9.81k
}
2464
2465
// Check for UNPREDICTABLE predicated ESB instruction
2466
static DecodeStatus DecodeHINTInstruction(MCInst *Inst, unsigned Insn,
2467
            uint64_t Address, const void *Decoder)
2468
142
{
2469
142
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2470
142
  unsigned imm8 = fieldFromInstruction_4(Insn, 0, 8);
2471
2472
142
  DecodeStatus S = MCDisassembler_Success;
2473
2474
142
  MCOperand_CreateImm0(Inst, (imm8));
2475
2476
142
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2477
36
    return MCDisassembler_Fail;
2478
2479
  // ESB is unpredictable if pred != AL. Without the RAS extension, it is a
2480
  // NOP, so all predicates should be allowed.
2481
106
  if (imm8 == 0x10 && pred != 0xe &&
2482
106
      ((ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureRAS)) != 0))
2483
0
    S = MCDisassembler_SoftFail;
2484
2485
106
  return S;
2486
142
}
2487
2488
static DecodeStatus DecodeCPSInstruction(MCInst *Inst, unsigned Insn,
2489
           uint64_t Address, const void *Decoder)
2490
3.19k
{
2491
3.19k
  unsigned imod = fieldFromInstruction_4(Insn, 18, 2);
2492
3.19k
  unsigned M = fieldFromInstruction_4(Insn, 17, 1);
2493
3.19k
  unsigned iflags = fieldFromInstruction_4(Insn, 6, 3);
2494
3.19k
  unsigned mode = fieldFromInstruction_4(Insn, 0, 5);
2495
2496
3.19k
  DecodeStatus S = MCDisassembler_Success;
2497
2498
  // This decoder is called from multiple location that do not check
2499
  // the full encoding is valid before they do.
2500
3.19k
  if (fieldFromInstruction_4(Insn, 5, 1) != 0 ||
2501
3.19k
      fieldFromInstruction_4(Insn, 16, 1) != 0 ||
2502
3.19k
      fieldFromInstruction_4(Insn, 20, 8) != 0x10)
2503
7
    return MCDisassembler_Fail;
2504
2505
  // imod == '01' --> UNPREDICTABLE
2506
  // NOTE: Even though this is technically UNPREDICTABLE, we choose to
2507
  // return failure here.  The '01' imod value is unprintable, so there's
2508
  // nothing useful we could do even if we returned UNPREDICTABLE.
2509
2510
3.19k
  if (imod == 1)
2511
5
    return MCDisassembler_Fail;
2512
2513
3.18k
  if (imod && M) {
2514
429
    MCInst_setOpcode(Inst, (ARM_CPS3p));
2515
429
    MCOperand_CreateImm0(Inst, (imod));
2516
429
    MCOperand_CreateImm0(Inst, (iflags));
2517
429
    MCOperand_CreateImm0(Inst, (mode));
2518
2.75k
  } else if (imod && !M) {
2519
2.10k
    MCInst_setOpcode(Inst, (ARM_CPS2p));
2520
2.10k
    MCOperand_CreateImm0(Inst, (imod));
2521
2.10k
    MCOperand_CreateImm0(Inst, (iflags));
2522
2.10k
    if (mode)
2523
1.83k
      S = MCDisassembler_SoftFail;
2524
2.10k
  } else if (!imod && M) {
2525
515
    MCInst_setOpcode(Inst, (ARM_CPS1p));
2526
515
    MCOperand_CreateImm0(Inst, (mode));
2527
515
    if (iflags)
2528
255
      S = MCDisassembler_SoftFail;
2529
515
  } else {
2530
    // imod == '00' && M == '0' --> UNPREDICTABLE
2531
137
    MCInst_setOpcode(Inst, (ARM_CPS1p));
2532
137
    MCOperand_CreateImm0(Inst, (mode));
2533
137
    S = MCDisassembler_SoftFail;
2534
137
  }
2535
2536
3.18k
  return S;
2537
3.19k
}
2538
2539
static DecodeStatus DecodeT2CPSInstruction(MCInst *Inst, unsigned Insn,
2540
             uint64_t Address,
2541
             const void *Decoder)
2542
1.17k
{
2543
1.17k
  unsigned imod = fieldFromInstruction_4(Insn, 9, 2);
2544
1.17k
  unsigned M = fieldFromInstruction_4(Insn, 8, 1);
2545
1.17k
  unsigned iflags = fieldFromInstruction_4(Insn, 5, 3);
2546
1.17k
  unsigned mode = fieldFromInstruction_4(Insn, 0, 5);
2547
2548
1.17k
  DecodeStatus S = MCDisassembler_Success;
2549
2550
  // imod == '01' --> UNPREDICTABLE
2551
  // NOTE: Even though this is technically UNPREDICTABLE, we choose to
2552
  // return failure here.  The '01' imod value is unprintable, so there's
2553
  // nothing useful we could do even if we returned UNPREDICTABLE.
2554
2555
1.17k
  if (imod == 1)
2556
2
    return MCDisassembler_Fail;
2557
2558
1.16k
  if (imod && M) {
2559
218
    MCInst_setOpcode(Inst, (ARM_t2CPS3p));
2560
218
    MCOperand_CreateImm0(Inst, (imod));
2561
218
    MCOperand_CreateImm0(Inst, (iflags));
2562
218
    MCOperand_CreateImm0(Inst, (mode));
2563
951
  } else if (imod && !M) {
2564
289
    MCInst_setOpcode(Inst, (ARM_t2CPS2p));
2565
289
    MCOperand_CreateImm0(Inst, (imod));
2566
289
    MCOperand_CreateImm0(Inst, (iflags));
2567
289
    if (mode)
2568
0
      S = MCDisassembler_SoftFail;
2569
662
  } else if (!imod && M) {
2570
662
    MCInst_setOpcode(Inst, (ARM_t2CPS1p));
2571
662
    MCOperand_CreateImm0(Inst, (mode));
2572
662
    if (iflags)
2573
524
      S = MCDisassembler_SoftFail;
2574
662
  } else {
2575
    // imod == '00' && M == '0' --> this is a HINT instruction
2576
0
    int imm = fieldFromInstruction_4(Insn, 0, 8);
2577
    // HINT are defined only for immediate in [0..4]
2578
0
    if (imm > 4)
2579
0
      return MCDisassembler_Fail;
2580
0
    MCInst_setOpcode(Inst, (ARM_t2HINT));
2581
0
    MCOperand_CreateImm0(Inst, (imm));
2582
0
  }
2583
2584
1.16k
  return S;
2585
1.16k
}
2586
2587
static DecodeStatus DecodeT2HintSpaceInstruction(MCInst *Inst, unsigned Insn,
2588
             uint64_t Address,
2589
             const void *Decoder)
2590
956
{
2591
956
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
2592
2593
956
  unsigned Opcode = ARM_t2HINT;
2594
2595
956
  if (imm == 0x0D) {
2596
70
    Opcode = ARM_t2PACBTI;
2597
886
  } else if (imm == 0x1D) {
2598
200
    Opcode = ARM_t2PAC;
2599
686
  } else if (imm == 0x2D) {
2600
18
    Opcode = ARM_t2AUT;
2601
668
  } else if (imm == 0x0F) {
2602
201
    Opcode = ARM_t2BTI;
2603
201
  }
2604
2605
956
  MCInst_setOpcode(Inst, (Opcode));
2606
956
  if (Opcode == ARM_t2HINT) {
2607
467
    MCOperand_CreateImm0(Inst, (imm));
2608
467
  }
2609
2610
956
  return MCDisassembler_Success;
2611
956
}
2612
2613
static DecodeStatus DecodeT2MOVTWInstruction(MCInst *Inst, unsigned Insn,
2614
               uint64_t Address,
2615
               const void *Decoder)
2616
1.42k
{
2617
1.42k
  DecodeStatus S = MCDisassembler_Success;
2618
2619
1.42k
  unsigned Rd = fieldFromInstruction_4(Insn, 8, 4);
2620
1.42k
  unsigned imm = 0;
2621
2622
1.42k
  imm |= (fieldFromInstruction_4(Insn, 0, 8) << 0);
2623
1.42k
  imm |= (fieldFromInstruction_4(Insn, 12, 3) << 8);
2624
1.42k
  imm |= (fieldFromInstruction_4(Insn, 16, 4) << 12);
2625
1.42k
  imm |= (fieldFromInstruction_4(Insn, 26, 1) << 11);
2626
2627
1.42k
  if (MCInst_getOpcode(Inst) == ARM_t2MOVTi16)
2628
986
    if (!Check(&S,
2629
986
         DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
2630
0
      return MCDisassembler_Fail;
2631
1.42k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
2632
0
    return MCDisassembler_Fail;
2633
2634
1.42k
  if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
2635
1.42k
    MCOperand_CreateImm0(Inst, (imm));
2636
2637
1.42k
  return S;
2638
1.42k
}
2639
2640
static DecodeStatus DecodeArmMOVTWInstruction(MCInst *Inst, unsigned Insn,
2641
                uint64_t Address,
2642
                const void *Decoder)
2643
1.47k
{
2644
1.47k
  DecodeStatus S = MCDisassembler_Success;
2645
2646
1.47k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2647
1.47k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2648
1.47k
  unsigned imm = 0;
2649
2650
1.47k
  imm |= (fieldFromInstruction_4(Insn, 0, 12) << 0);
2651
1.47k
  imm |= (fieldFromInstruction_4(Insn, 16, 4) << 12);
2652
2653
1.47k
  if (MCInst_getOpcode(Inst) == ARM_MOVTi16)
2654
650
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address,
2655
650
                Decoder)))
2656
0
      return MCDisassembler_Fail;
2657
2658
1.47k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2659
0
    return MCDisassembler_Fail;
2660
2661
1.47k
  if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
2662
1.47k
    MCOperand_CreateImm0(Inst, (imm));
2663
2664
1.47k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2665
438
    return MCDisassembler_Fail;
2666
2667
1.03k
  return S;
2668
1.47k
}
2669
2670
static DecodeStatus DecodeSMLAInstruction(MCInst *Inst, unsigned Insn,
2671
            uint64_t Address, const void *Decoder)
2672
3.01k
{
2673
3.01k
  DecodeStatus S = MCDisassembler_Success;
2674
2675
3.01k
  unsigned Rd = fieldFromInstruction_4(Insn, 16, 4);
2676
3.01k
  unsigned Rn = fieldFromInstruction_4(Insn, 0, 4);
2677
3.01k
  unsigned Rm = fieldFromInstruction_4(Insn, 8, 4);
2678
3.01k
  unsigned Ra = fieldFromInstruction_4(Insn, 12, 4);
2679
3.01k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2680
2681
3.01k
  if (pred == 0xF)
2682
987
    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
2683
2684
2.02k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
2685
0
    return MCDisassembler_Fail;
2686
2.02k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
2687
0
    return MCDisassembler_Fail;
2688
2.02k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
2689
0
    return MCDisassembler_Fail;
2690
2.02k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Ra, Address, Decoder)))
2691
0
    return MCDisassembler_Fail;
2692
2693
2.02k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2694
0
    return MCDisassembler_Fail;
2695
2696
2.02k
  return S;
2697
2.02k
}
2698
2699
static DecodeStatus DecodeTSTInstruction(MCInst *Inst, unsigned Insn,
2700
           uint64_t Address, const void *Decoder)
2701
499
{
2702
499
  DecodeStatus S = MCDisassembler_Success;
2703
2704
499
  unsigned Pred = fieldFromInstruction_4(Insn, 28, 4);
2705
499
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2706
499
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2707
2708
499
  if (Pred == 0xF)
2709
256
    return DecodeSETPANInstruction(Inst, Insn, Address, Decoder);
2710
2711
243
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2712
0
    return MCDisassembler_Fail;
2713
243
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2714
0
    return MCDisassembler_Fail;
2715
243
  if (!Check(&S, DecodePredicateOperand(Inst, Pred, Address, Decoder)))
2716
0
    return MCDisassembler_Fail;
2717
2718
243
  return S;
2719
243
}
2720
2721
static DecodeStatus DecodeSETPANInstruction(MCInst *Inst, unsigned Insn,
2722
              uint64_t Address,
2723
              const void *Decoder)
2724
256
{
2725
256
  DecodeStatus S = MCDisassembler_Success;
2726
2727
256
  unsigned Imm = fieldFromInstruction_4(Insn, 9, 1);
2728
2729
256
  if (!ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8_1aOps) ||
2730
256
      !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops))
2731
2
    return MCDisassembler_Fail;
2732
2733
  // Decoder can be called from DecodeTST, which does not check the full
2734
  // encoding is valid.
2735
254
  if (fieldFromInstruction_4(Insn, 20, 12) != 0xf11 ||
2736
254
      fieldFromInstruction_4(Insn, 4, 4) != 0)
2737
0
    return MCDisassembler_Fail;
2738
254
  if (fieldFromInstruction_4(Insn, 10, 10) != 0 ||
2739
254
      fieldFromInstruction_4(Insn, 0, 4) != 0)
2740
169
    S = MCDisassembler_SoftFail;
2741
2742
254
  MCInst_setOpcode(Inst, (ARM_SETPAN));
2743
254
  MCOperand_CreateImm0(Inst, (Imm));
2744
2745
254
  return S;
2746
254
}
2747
2748
static DecodeStatus DecodeAddrModeImm12Operand(MCInst *Inst, unsigned Val,
2749
                 uint64_t Address,
2750
                 const void *Decoder)
2751
6.80k
{
2752
6.80k
  DecodeStatus S = MCDisassembler_Success;
2753
2754
6.80k
  unsigned add = fieldFromInstruction_4(Val, 12, 1);
2755
6.80k
  unsigned imm = fieldFromInstruction_4(Val, 0, 12);
2756
6.80k
  unsigned Rn = fieldFromInstruction_4(Val, 13, 4);
2757
2758
6.80k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2759
0
    return MCDisassembler_Fail;
2760
2761
6.80k
  if (!add)
2762
3.33k
    imm *= -1;
2763
6.80k
  if (imm == 0 && !add)
2764
303
    imm = INT32_MIN;
2765
6.80k
  MCOperand_CreateImm0(Inst, (imm));
2766
6.80k
  if (Rn == 15)
2767
559
    tryAddingPcLoadReferenceComment(Address, Address + imm + 8,
2768
559
            Decoder);
2769
2770
6.80k
  return S;
2771
6.80k
}
2772
2773
static DecodeStatus DecodeAddrMode5Operand(MCInst *Inst, unsigned Val,
2774
             uint64_t Address,
2775
             const void *Decoder)
2776
1.88k
{
2777
1.88k
  DecodeStatus S = MCDisassembler_Success;
2778
2779
1.88k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
2780
  // U == 1 to add imm, 0 to subtract it.
2781
1.88k
  unsigned U = fieldFromInstruction_4(Val, 8, 1);
2782
1.88k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
2783
2784
1.88k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2785
0
    return MCDisassembler_Fail;
2786
2787
1.88k
  if (U)
2788
1.09k
    MCOperand_CreateImm0(Inst, (ARM_AM_getAM5Opc(ARM_AM_add, imm)));
2789
789
  else
2790
789
    MCOperand_CreateImm0(Inst, (ARM_AM_getAM5Opc(ARM_AM_sub, imm)));
2791
2792
1.88k
  return S;
2793
1.88k
}
2794
2795
static DecodeStatus DecodeAddrMode5FP16Operand(MCInst *Inst, unsigned Val,
2796
                 uint64_t Address,
2797
                 const void *Decoder)
2798
1.91k
{
2799
1.91k
  DecodeStatus S = MCDisassembler_Success;
2800
2801
1.91k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
2802
  // U == 1 to add imm, 0 to subtract it.
2803
1.91k
  unsigned U = fieldFromInstruction_4(Val, 8, 1);
2804
1.91k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
2805
2806
1.91k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2807
0
    return MCDisassembler_Fail;
2808
2809
1.91k
  if (U)
2810
1.00k
    MCOperand_CreateImm0(Inst,
2811
1.00k
             (ARM_AM_getAM5FP16Opc(ARM_AM_add, imm)));
2812
906
  else
2813
906
    MCOperand_CreateImm0(Inst,
2814
906
             (ARM_AM_getAM5FP16Opc(ARM_AM_sub, imm)));
2815
2816
1.91k
  return S;
2817
1.91k
}
2818
2819
static DecodeStatus DecodeAddrMode7Operand(MCInst *Inst, unsigned Val,
2820
             uint64_t Address,
2821
             const void *Decoder)
2822
10.9k
{
2823
10.9k
  return DecodeGPRRegisterClass(Inst, Val, Address, Decoder);
2824
10.9k
}
2825
2826
static DecodeStatus DecodeT2BInstruction(MCInst *Inst, unsigned Insn,
2827
           uint64_t Address, const void *Decoder)
2828
992
{
2829
992
  DecodeStatus Status = MCDisassembler_Success;
2830
2831
  // Note the J1 and J2 values are from the encoded instruction.  So here
2832
  // change them to I1 and I2 values via as documented:
2833
  // I1 = NOT(J1 EOR S);
2834
  // I2 = NOT(J2 EOR S);
2835
  // and build the imm32 with one trailing zero as documented:
2836
  // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
2837
992
  unsigned S = fieldFromInstruction_4(Insn, 26, 1);
2838
992
  unsigned J1 = fieldFromInstruction_4(Insn, 13, 1);
2839
992
  unsigned J2 = fieldFromInstruction_4(Insn, 11, 1);
2840
992
  unsigned I1 = !(J1 ^ S);
2841
992
  unsigned I2 = !(J2 ^ S);
2842
992
  unsigned imm10 = fieldFromInstruction_4(Insn, 16, 10);
2843
992
  unsigned imm11 = fieldFromInstruction_4(Insn, 0, 11);
2844
992
  unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) |
2845
992
           imm11;
2846
992
  int imm32 = SignExtend32((tmp << 1), 25);
2847
992
  if (!tryAddingSymbolicOperand(Address, Address + imm32 + 4, true, 4,
2848
992
              Inst, Decoder))
2849
992
    MCOperand_CreateImm0(Inst, (imm32));
2850
2851
992
  return Status;
2852
992
}
2853
2854
static DecodeStatus DecodeBranchImmInstruction(MCInst *Inst, unsigned Insn,
2855
                 uint64_t Address,
2856
                 const void *Decoder)
2857
6.54k
{
2858
6.54k
  DecodeStatus S = MCDisassembler_Success;
2859
2860
6.54k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
2861
6.54k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 24) << 2;
2862
2863
6.54k
  if (pred == 0xF) {
2864
463
    MCInst_setOpcode(Inst, (ARM_BLXi));
2865
463
    imm |= fieldFromInstruction_4(Insn, 24, 1) << 1;
2866
463
    if (!tryAddingSymbolicOperand(
2867
463
          Address, Address + SignExtend32((imm), 26) + 8,
2868
463
          true, 4, Inst, Decoder))
2869
463
      MCOperand_CreateImm0(Inst, (SignExtend32((imm), 26)));
2870
463
    return S;
2871
463
  }
2872
2873
6.08k
  if (!tryAddingSymbolicOperand(Address,
2874
6.08k
              Address + SignExtend32((imm), 26) + 8,
2875
6.08k
              true, 4, Inst, Decoder))
2876
6.08k
    MCOperand_CreateImm0(Inst, (SignExtend32((imm), 26)));
2877
2878
  // We already have BL_pred for BL w/ predicate, no need to add addition
2879
  // predicate opreands for BL
2880
6.08k
  if (MCInst_getOpcode(Inst) != ARM_BL)
2881
5.59k
    if (!Check(&S, DecodePredicateOperand(Inst, pred, Address,
2882
5.59k
                  Decoder)))
2883
0
      return MCDisassembler_Fail;
2884
2885
6.08k
  return S;
2886
6.08k
}
2887
2888
static DecodeStatus DecodeAddrMode6Operand(MCInst *Inst, unsigned Val,
2889
             uint64_t Address,
2890
             const void *Decoder)
2891
66.1k
{
2892
66.1k
  DecodeStatus S = MCDisassembler_Success;
2893
2894
66.1k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
2895
66.1k
  unsigned align = fieldFromInstruction_4(Val, 4, 2);
2896
2897
66.1k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2898
0
    return MCDisassembler_Fail;
2899
66.1k
  if (!align)
2900
31.8k
    MCOperand_CreateImm0(Inst, (0));
2901
34.3k
  else
2902
34.3k
    MCOperand_CreateImm0(Inst, (4 << align));
2903
2904
66.1k
  return S;
2905
66.1k
}
2906
2907
static DecodeStatus DecodeVLDInstruction(MCInst *Inst, unsigned Insn,
2908
           uint64_t Address, const void *Decoder)
2909
15.2k
{
2910
15.2k
  DecodeStatus S = MCDisassembler_Success;
2911
2912
15.2k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
2913
15.2k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
2914
15.2k
  unsigned wb = fieldFromInstruction_4(Insn, 16, 4);
2915
15.2k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
2916
15.2k
  Rn |= fieldFromInstruction_4(Insn, 4, 2) << 4;
2917
15.2k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
2918
2919
  // First output register
2920
15.2k
  switch (MCInst_getOpcode(Inst)) {
2921
207
  case ARM_VLD1q16:
2922
429
  case ARM_VLD1q32:
2923
527
  case ARM_VLD1q64:
2924
632
  case ARM_VLD1q8:
2925
747
  case ARM_VLD1q16wb_fixed:
2926
874
  case ARM_VLD1q16wb_register:
2927
976
  case ARM_VLD1q32wb_fixed:
2928
1.04k
  case ARM_VLD1q32wb_register:
2929
1.13k
  case ARM_VLD1q64wb_fixed:
2930
1.32k
  case ARM_VLD1q64wb_register:
2931
1.43k
  case ARM_VLD1q8wb_fixed:
2932
1.63k
  case ARM_VLD1q8wb_register:
2933
1.71k
  case ARM_VLD2d16:
2934
2.05k
  case ARM_VLD2d32:
2935
2.25k
  case ARM_VLD2d8:
2936
2.35k
  case ARM_VLD2d16wb_fixed:
2937
2.42k
  case ARM_VLD2d16wb_register:
2938
2.56k
  case ARM_VLD2d32wb_fixed:
2939
2.77k
  case ARM_VLD2d32wb_register:
2940
2.88k
  case ARM_VLD2d8wb_fixed:
2941
3.20k
  case ARM_VLD2d8wb_register:
2942
3.20k
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address,
2943
3.20k
              Decoder)))
2944
1
      return MCDisassembler_Fail;
2945
3.20k
    break;
2946
3.20k
  case ARM_VLD2b16:
2947
492
  case ARM_VLD2b32:
2948
643
  case ARM_VLD2b8:
2949
731
  case ARM_VLD2b16wb_fixed:
2950
858
  case ARM_VLD2b16wb_register:
2951
1.01k
  case ARM_VLD2b32wb_fixed:
2952
1.14k
  case ARM_VLD2b32wb_register:
2953
1.38k
  case ARM_VLD2b8wb_fixed:
2954
1.73k
  case ARM_VLD2b8wb_register:
2955
1.73k
    if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address,
2956
1.73k
                    Decoder)))
2957
3
      return MCDisassembler_Fail;
2958
1.73k
    break;
2959
10.3k
  default:
2960
10.3k
    if (!Check(&S,
2961
10.3k
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2962
0
      return MCDisassembler_Fail;
2963
15.2k
  }
2964
2965
  // Second output register
2966
15.2k
  switch (MCInst_getOpcode(Inst)) {
2967
92
  case ARM_VLD3d8:
2968
181
  case ARM_VLD3d16:
2969
384
  case ARM_VLD3d32:
2970
521
  case ARM_VLD3d8_UPD:
2971
640
  case ARM_VLD3d16_UPD:
2972
884
  case ARM_VLD3d32_UPD:
2973
981
  case ARM_VLD4d8:
2974
1.87k
  case ARM_VLD4d16:
2975
2.04k
  case ARM_VLD4d32:
2976
2.60k
  case ARM_VLD4d8_UPD:
2977
2.83k
  case ARM_VLD4d16_UPD:
2978
3.01k
  case ARM_VLD4d32_UPD:
2979
3.01k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 1) % 32,
2980
3.01k
                  Address, Decoder)))
2981
0
      return MCDisassembler_Fail;
2982
3.01k
    break;
2983
3.01k
  case ARM_VLD3q8:
2984
358
  case ARM_VLD3q16:
2985
437
  case ARM_VLD3q32:
2986
723
  case ARM_VLD3q8_UPD:
2987
932
  case ARM_VLD3q16_UPD:
2988
973
  case ARM_VLD3q32_UPD:
2989
1.08k
  case ARM_VLD4q8:
2990
1.15k
  case ARM_VLD4q16:
2991
1.35k
  case ARM_VLD4q32:
2992
1.75k
  case ARM_VLD4q8_UPD:
2993
1.94k
  case ARM_VLD4q16_UPD:
2994
2.10k
  case ARM_VLD4q32_UPD:
2995
2.10k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32,
2996
2.10k
                  Address, Decoder)))
2997
0
      return MCDisassembler_Fail;
2998
2.10k
    break;
2999
10.1k
  default:
3000
10.1k
    break;
3001
15.2k
  }
3002
3003
  // Third output register
3004
15.2k
  switch (MCInst_getOpcode(Inst)) {
3005
92
  case ARM_VLD3d8:
3006
181
  case ARM_VLD3d16:
3007
384
  case ARM_VLD3d32:
3008
521
  case ARM_VLD3d8_UPD:
3009
640
  case ARM_VLD3d16_UPD:
3010
884
  case ARM_VLD3d32_UPD:
3011
981
  case ARM_VLD4d8:
3012
1.87k
  case ARM_VLD4d16:
3013
2.04k
  case ARM_VLD4d32:
3014
2.60k
  case ARM_VLD4d8_UPD:
3015
2.83k
  case ARM_VLD4d16_UPD:
3016
3.01k
  case ARM_VLD4d32_UPD:
3017
3.01k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32,
3018
3.01k
                  Address, Decoder)))
3019
0
      return MCDisassembler_Fail;
3020
3.01k
    break;
3021
3.01k
  case ARM_VLD3q8:
3022
358
  case ARM_VLD3q16:
3023
437
  case ARM_VLD3q32:
3024
723
  case ARM_VLD3q8_UPD:
3025
932
  case ARM_VLD3q16_UPD:
3026
973
  case ARM_VLD3q32_UPD:
3027
1.08k
  case ARM_VLD4q8:
3028
1.15k
  case ARM_VLD4q16:
3029
1.35k
  case ARM_VLD4q32:
3030
1.75k
  case ARM_VLD4q8_UPD:
3031
1.94k
  case ARM_VLD4q16_UPD:
3032
2.10k
  case ARM_VLD4q32_UPD:
3033
2.10k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 4) % 32,
3034
2.10k
                  Address, Decoder)))
3035
0
      return MCDisassembler_Fail;
3036
2.10k
    break;
3037
10.1k
  default:
3038
10.1k
    break;
3039
15.2k
  }
3040
3041
  // Fourth output register
3042
15.2k
  switch (MCInst_getOpcode(Inst)) {
3043
97
  case ARM_VLD4d8:
3044
990
  case ARM_VLD4d16:
3045
1.16k
  case ARM_VLD4d32:
3046
1.72k
  case ARM_VLD4d8_UPD:
3047
1.95k
  case ARM_VLD4d16_UPD:
3048
2.12k
  case ARM_VLD4d32_UPD:
3049
2.12k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 3) % 32,
3050
2.12k
                  Address, Decoder)))
3051
0
      return MCDisassembler_Fail;
3052
2.12k
    break;
3053
2.12k
  case ARM_VLD4q8:
3054
181
  case ARM_VLD4q16:
3055
381
  case ARM_VLD4q32:
3056
782
  case ARM_VLD4q8_UPD:
3057
968
  case ARM_VLD4q16_UPD:
3058
1.12k
  case ARM_VLD4q32_UPD:
3059
1.12k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 6) % 32,
3060
1.12k
                  Address, Decoder)))
3061
0
      return MCDisassembler_Fail;
3062
1.12k
    break;
3063
11.9k
  default:
3064
11.9k
    break;
3065
15.2k
  }
3066
3067
  // Writeback operand
3068
15.2k
  switch (MCInst_getOpcode(Inst)) {
3069
72
  case ARM_VLD1d8wb_fixed:
3070
257
  case ARM_VLD1d16wb_fixed:
3071
481
  case ARM_VLD1d32wb_fixed:
3072
692
  case ARM_VLD1d64wb_fixed:
3073
767
  case ARM_VLD1d8wb_register:
3074
1.04k
  case ARM_VLD1d16wb_register:
3075
1.16k
  case ARM_VLD1d32wb_register:
3076
1.28k
  case ARM_VLD1d64wb_register:
3077
1.39k
  case ARM_VLD1q8wb_fixed:
3078
1.50k
  case ARM_VLD1q16wb_fixed:
3079
1.61k
  case ARM_VLD1q32wb_fixed:
3080
1.69k
  case ARM_VLD1q64wb_fixed:
3081
1.89k
  case ARM_VLD1q8wb_register:
3082
2.02k
  case ARM_VLD1q16wb_register:
3083
2.09k
  case ARM_VLD1q32wb_register:
3084
2.29k
  case ARM_VLD1q64wb_register:
3085
2.39k
  case ARM_VLD1d8Twb_fixed:
3086
2.49k
  case ARM_VLD1d8Twb_register:
3087
2.76k
  case ARM_VLD1d16Twb_fixed:
3088
2.87k
  case ARM_VLD1d16Twb_register:
3089
2.98k
  case ARM_VLD1d32Twb_fixed:
3090
3.29k
  case ARM_VLD1d32Twb_register:
3091
3.32k
  case ARM_VLD1d64Twb_fixed:
3092
3.39k
  case ARM_VLD1d64Twb_register:
3093
3.49k
  case ARM_VLD1d8Qwb_fixed:
3094
3.85k
  case ARM_VLD1d8Qwb_register:
3095
4.21k
  case ARM_VLD1d16Qwb_fixed:
3096
4.35k
  case ARM_VLD1d16Qwb_register:
3097
4.57k
  case ARM_VLD1d32Qwb_fixed:
3098
4.67k
  case ARM_VLD1d32Qwb_register:
3099
5.00k
  case ARM_VLD1d64Qwb_fixed:
3100
5.14k
  case ARM_VLD1d64Qwb_register:
3101
5.25k
  case ARM_VLD2d8wb_fixed:
3102
5.34k
  case ARM_VLD2d16wb_fixed:
3103
5.48k
  case ARM_VLD2d32wb_fixed:
3104
5.57k
  case ARM_VLD2q8wb_fixed:
3105
5.63k
  case ARM_VLD2q16wb_fixed:
3106
5.67k
  case ARM_VLD2q32wb_fixed:
3107
5.99k
  case ARM_VLD2d8wb_register:
3108
6.06k
  case ARM_VLD2d16wb_register:
3109
6.27k
  case ARM_VLD2d32wb_register:
3110
6.55k
  case ARM_VLD2q8wb_register:
3111
6.74k
  case ARM_VLD2q16wb_register:
3112
6.97k
  case ARM_VLD2q32wb_register:
3113
7.21k
  case ARM_VLD2b8wb_fixed:
3114
7.30k
  case ARM_VLD2b16wb_fixed:
3115
7.46k
  case ARM_VLD2b32wb_fixed:
3116
7.80k
  case ARM_VLD2b8wb_register:
3117
7.93k
  case ARM_VLD2b16wb_register:
3118
8.05k
  case ARM_VLD2b32wb_register:
3119
8.05k
    MCOperand_CreateImm0(Inst, (0));
3120
8.05k
    break;
3121
137
  case ARM_VLD3d8_UPD:
3122
256
  case ARM_VLD3d16_UPD:
3123
500
  case ARM_VLD3d32_UPD:
3124
786
  case ARM_VLD3q8_UPD:
3125
995
  case ARM_VLD3q16_UPD:
3126
1.03k
  case ARM_VLD3q32_UPD:
3127
1.59k
  case ARM_VLD4d8_UPD:
3128
1.82k
  case ARM_VLD4d16_UPD:
3129
2.00k
  case ARM_VLD4d32_UPD:
3130
2.40k
  case ARM_VLD4q8_UPD:
3131
2.58k
  case ARM_VLD4q16_UPD:
3132
2.74k
  case ARM_VLD4q32_UPD:
3133
2.74k
    if (!Check(&S,
3134
2.74k
         DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
3135
0
      return MCDisassembler_Fail;
3136
2.74k
    break;
3137
4.43k
  default:
3138
4.43k
    break;
3139
15.2k
  }
3140
3141
  // AddrMode6 Base (register+alignment)
3142
15.2k
  if (!Check(&S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
3143
0
    return MCDisassembler_Fail;
3144
3145
  // AddrMode6 Offset (register)
3146
15.2k
  switch (MCInst_getOpcode(Inst)) {
3147
10.4k
  default:
3148
    // The below have been updated to have explicit am6offset split
3149
    // between fixed and register offset. For those instructions not
3150
    // yet updated, we need to add an additional reg0 operand for the
3151
    // fixed variant.
3152
    //
3153
    // The fixed offset encodes as Rm == 0xd, so we check for that.
3154
10.4k
    if (Rm == 0xd) {
3155
862
      MCOperand_CreateReg0(Inst, (0));
3156
862
      break;
3157
862
    }
3158
    // Fall through to handle the register offset variant.
3159
    // fall through
3160
9.62k
  case ARM_VLD1d8wb_fixed:
3161
9.80k
  case ARM_VLD1d16wb_fixed:
3162
10.0k
  case ARM_VLD1d32wb_fixed:
3163
10.2k
  case ARM_VLD1d64wb_fixed:
3164
10.3k
  case ARM_VLD1d8Twb_fixed:
3165
10.6k
  case ARM_VLD1d16Twb_fixed:
3166
10.7k
  case ARM_VLD1d32Twb_fixed:
3167
10.7k
  case ARM_VLD1d64Twb_fixed:
3168
10.8k
  case ARM_VLD1d8Qwb_fixed:
3169
11.2k
  case ARM_VLD1d16Qwb_fixed:
3170
11.4k
  case ARM_VLD1d32Qwb_fixed:
3171
11.7k
  case ARM_VLD1d64Qwb_fixed:
3172
11.8k
  case ARM_VLD1d8wb_register:
3173
12.1k
  case ARM_VLD1d16wb_register:
3174
12.2k
  case ARM_VLD1d32wb_register:
3175
12.3k
  case ARM_VLD1d64wb_register:
3176
12.4k
  case ARM_VLD1q8wb_fixed:
3177
12.5k
  case ARM_VLD1q16wb_fixed:
3178
12.6k
  case ARM_VLD1q32wb_fixed:
3179
12.7k
  case ARM_VLD1q64wb_fixed:
3180
12.9k
  case ARM_VLD1q8wb_register:
3181
13.0k
  case ARM_VLD1q16wb_register:
3182
13.1k
  case ARM_VLD1q32wb_register:
3183
13.3k
  case ARM_VLD1q64wb_register:
3184
    // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
3185
    // variant encodes Rm == 0xf. Anything else is a register offset post-
3186
    // increment and we need to add the register operand to the instruction.
3187
13.3k
    if (Rm != 0xD && Rm != 0xF &&
3188
13.3k
        !Check(&S,
3189
6.30k
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3190
0
      return MCDisassembler_Fail;
3191
13.3k
    break;
3192
13.3k
  case ARM_VLD2d8wb_fixed:
3193
205
  case ARM_VLD2d16wb_fixed:
3194
348
  case ARM_VLD2d32wb_fixed:
3195
593
  case ARM_VLD2b8wb_fixed:
3196
681
  case ARM_VLD2b16wb_fixed:
3197
842
  case ARM_VLD2b32wb_fixed:
3198
927
  case ARM_VLD2q8wb_fixed:
3199
987
  case ARM_VLD2q16wb_fixed:
3200
1.02k
  case ARM_VLD2q32wb_fixed:
3201
1.02k
    break;
3202
15.2k
  }
3203
3204
15.2k
  return S;
3205
15.2k
}
3206
3207
static DecodeStatus DecodeVLDST1Instruction(MCInst *Inst, unsigned Insn,
3208
              uint64_t Address,
3209
              const void *Decoder)
3210
25.4k
{
3211
25.4k
  unsigned type = fieldFromInstruction_4(Insn, 8, 4);
3212
25.4k
  unsigned align = fieldFromInstruction_4(Insn, 4, 2);
3213
25.4k
  if (type == 6 && (align & 2))
3214
6
    return MCDisassembler_Fail;
3215
25.4k
  if (type == 7 && (align & 2))
3216
0
    return MCDisassembler_Fail;
3217
25.4k
  if (type == 10 && align == 3)
3218
9
    return MCDisassembler_Fail;
3219
3220
25.4k
  unsigned load = fieldFromInstruction_4(Insn, 21, 1);
3221
25.4k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) :
3222
25.4k
          DecodeVSTInstruction(Inst, Insn, Address, Decoder);
3223
25.4k
}
3224
3225
static DecodeStatus DecodeVLDST2Instruction(MCInst *Inst, unsigned Insn,
3226
              uint64_t Address,
3227
              const void *Decoder)
3228
18.3k
{
3229
18.3k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3230
18.3k
  if (size == 3)
3231
0
    return MCDisassembler_Fail;
3232
3233
18.3k
  unsigned type = fieldFromInstruction_4(Insn, 8, 4);
3234
18.3k
  unsigned align = fieldFromInstruction_4(Insn, 4, 2);
3235
18.3k
  if (type == 8 && align == 3)
3236
2
    return MCDisassembler_Fail;
3237
18.3k
  if (type == 9 && align == 3)
3238
3
    return MCDisassembler_Fail;
3239
3240
18.3k
  unsigned load = fieldFromInstruction_4(Insn, 21, 1);
3241
18.3k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) :
3242
18.3k
          DecodeVSTInstruction(Inst, Insn, Address, Decoder);
3243
18.3k
}
3244
3245
static DecodeStatus DecodeVLDST3Instruction(MCInst *Inst, unsigned Insn,
3246
              uint64_t Address,
3247
              const void *Decoder)
3248
9.92k
{
3249
9.92k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3250
9.92k
  if (size == 3)
3251
0
    return MCDisassembler_Fail;
3252
3253
9.92k
  unsigned align = fieldFromInstruction_4(Insn, 4, 2);
3254
9.92k
  if (align & 2)
3255
0
    return MCDisassembler_Fail;
3256
3257
9.92k
  unsigned load = fieldFromInstruction_4(Insn, 21, 1);
3258
9.92k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) :
3259
9.92k
          DecodeVSTInstruction(Inst, Insn, Address, Decoder);
3260
9.92k
}
3261
3262
static DecodeStatus DecodeVLDST4Instruction(MCInst *Inst, unsigned Insn,
3263
              uint64_t Address,
3264
              const void *Decoder)
3265
12.4k
{
3266
12.4k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3267
12.4k
  if (size == 3)
3268
0
    return MCDisassembler_Fail;
3269
3270
12.4k
  unsigned load = fieldFromInstruction_4(Insn, 21, 1);
3271
12.4k
  return load ? DecodeVLDInstruction(Inst, Insn, Address, Decoder) :
3272
12.4k
          DecodeVSTInstruction(Inst, Insn, Address, Decoder);
3273
12.4k
}
3274
3275
static DecodeStatus DecodeVSTInstruction(MCInst *Inst, unsigned Insn,
3276
           uint64_t Address, const void *Decoder)
3277
33.8k
{
3278
33.8k
  DecodeStatus S = MCDisassembler_Success;
3279
3280
33.8k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3281
33.8k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3282
33.8k
  unsigned wb = fieldFromInstruction_4(Insn, 16, 4);
3283
33.8k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3284
33.8k
  Rn |= fieldFromInstruction_4(Insn, 4, 2) << 4;
3285
33.8k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3286
3287
  // Writeback Operand
3288
33.8k
  switch (MCInst_getOpcode(Inst)) {
3289
426
  case ARM_VST1d8wb_fixed:
3290
633
  case ARM_VST1d16wb_fixed:
3291
1.01k
  case ARM_VST1d32wb_fixed:
3292
1.22k
  case ARM_VST1d64wb_fixed:
3293
1.76k
  case ARM_VST1d8wb_register:
3294
2.22k
  case ARM_VST1d16wb_register:
3295
2.33k
  case ARM_VST1d32wb_register:
3296
2.60k
  case ARM_VST1d64wb_register:
3297
2.85k
  case ARM_VST1q8wb_fixed:
3298
3.28k
  case ARM_VST1q16wb_fixed:
3299
3.53k
  case ARM_VST1q32wb_fixed:
3300
3.93k
  case ARM_VST1q64wb_fixed:
3301
4.78k
  case ARM_VST1q8wb_register:
3302
4.96k
  case ARM_VST1q16wb_register:
3303
5.59k
  case ARM_VST1q32wb_register:
3304
5.86k
  case ARM_VST1q64wb_register:
3305
6.07k
  case ARM_VST1d8Twb_fixed:
3306
6.23k
  case ARM_VST1d16Twb_fixed:
3307
6.59k
  case ARM_VST1d32Twb_fixed:
3308
6.96k
  case ARM_VST1d64Twb_fixed:
3309
7.64k
  case ARM_VST1d8Twb_register:
3310
8.26k
  case ARM_VST1d16Twb_register:
3311
8.62k
  case ARM_VST1d32Twb_register:
3312
8.78k
  case ARM_VST1d64Twb_register:
3313
9.12k
  case ARM_VST1d8Qwb_fixed:
3314
9.41k
  case ARM_VST1d16Qwb_fixed:
3315
9.81k
  case ARM_VST1d32Qwb_fixed:
3316
10.0k
  case ARM_VST1d64Qwb_fixed:
3317
10.4k
  case ARM_VST1d8Qwb_register:
3318
10.8k
  case ARM_VST1d16Qwb_register:
3319
11.2k
  case ARM_VST1d32Qwb_register:
3320
11.5k
  case ARM_VST1d64Qwb_register:
3321
11.8k
  case ARM_VST2d8wb_fixed:
3322
12.2k
  case ARM_VST2d16wb_fixed:
3323
12.5k
  case ARM_VST2d32wb_fixed:
3324
13.0k
  case ARM_VST2d8wb_register:
3325
13.2k
  case ARM_VST2d16wb_register:
3326
13.4k
  case ARM_VST2d32wb_register:
3327
13.8k
  case ARM_VST2q8wb_fixed:
3328
14.0k
  case ARM_VST2q16wb_fixed:
3329
14.3k
  case ARM_VST2q32wb_fixed:
3330
15.1k
  case ARM_VST2q8wb_register:
3331
15.5k
  case ARM_VST2q16wb_register:
3332
16.1k
  case ARM_VST2q32wb_register:
3333
16.8k
  case ARM_VST2b8wb_fixed:
3334
17.0k
  case ARM_VST2b16wb_fixed:
3335
17.4k
  case ARM_VST2b32wb_fixed:
3336
18.5k
  case ARM_VST2b8wb_register:
3337
18.8k
  case ARM_VST2b16wb_register:
3338
19.2k
  case ARM_VST2b32wb_register:
3339
19.2k
    if (Rm == 0xF)
3340
0
      return MCDisassembler_Fail;
3341
19.2k
    MCOperand_CreateImm0(Inst, (0));
3342
19.2k
    break;
3343
570
  case ARM_VST3d8_UPD:
3344
864
  case ARM_VST3d16_UPD:
3345
1.12k
  case ARM_VST3d32_UPD:
3346
1.52k
  case ARM_VST3q8_UPD:
3347
1.96k
  case ARM_VST3q16_UPD:
3348
2.27k
  case ARM_VST3q32_UPD:
3349
3.37k
  case ARM_VST4d8_UPD:
3350
3.86k
  case ARM_VST4d16_UPD:
3351
4.67k
  case ARM_VST4d32_UPD:
3352
5.34k
  case ARM_VST4q8_UPD:
3353
5.93k
  case ARM_VST4q16_UPD:
3354
6.40k
  case ARM_VST4q32_UPD:
3355
6.40k
    if (!Check(&S,
3356
6.40k
         DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
3357
0
      return MCDisassembler_Fail;
3358
6.40k
    break;
3359
8.21k
  default:
3360
8.21k
    break;
3361
33.8k
  }
3362
3363
  // AddrMode6 Base (register+alignment)
3364
33.8k
  if (!Check(&S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
3365
0
    return MCDisassembler_Fail;
3366
3367
  // AddrMode6 Offset (register)
3368
33.8k
  switch (MCInst_getOpcode(Inst)) {
3369
25.6k
  default:
3370
25.6k
    if (Rm == 0xD)
3371
862
      MCOperand_CreateReg0(Inst, (0));
3372
24.7k
    else if (Rm != 0xF) {
3373
16.5k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
3374
16.5k
                    Decoder)))
3375
0
        return MCDisassembler_Fail;
3376
16.5k
    }
3377
25.6k
    break;
3378
25.6k
  case ARM_VST1d8wb_fixed:
3379
633
  case ARM_VST1d16wb_fixed:
3380
1.01k
  case ARM_VST1d32wb_fixed:
3381
1.22k
  case ARM_VST1d64wb_fixed:
3382
1.46k
  case ARM_VST1q8wb_fixed:
3383
1.90k
  case ARM_VST1q16wb_fixed:
3384
2.15k
  case ARM_VST1q32wb_fixed:
3385
2.55k
  case ARM_VST1q64wb_fixed:
3386
2.76k
  case ARM_VST1d8Twb_fixed:
3387
2.91k
  case ARM_VST1d16Twb_fixed:
3388
3.27k
  case ARM_VST1d32Twb_fixed:
3389
3.65k
  case ARM_VST1d64Twb_fixed:
3390
3.98k
  case ARM_VST1d8Qwb_fixed:
3391
4.28k
  case ARM_VST1d16Qwb_fixed:
3392
4.68k
  case ARM_VST1d32Qwb_fixed:
3393
4.94k
  case ARM_VST1d64Qwb_fixed:
3394
5.20k
  case ARM_VST2d8wb_fixed:
3395
5.64k
  case ARM_VST2d16wb_fixed:
3396
5.95k
  case ARM_VST2d32wb_fixed:
3397
6.40k
  case ARM_VST2q8wb_fixed:
3398
6.61k
  case ARM_VST2q16wb_fixed:
3399
6.87k
  case ARM_VST2q32wb_fixed:
3400
7.61k
  case ARM_VST2b8wb_fixed:
3401
7.79k
  case ARM_VST2b16wb_fixed:
3402
8.22k
  case ARM_VST2b32wb_fixed:
3403
8.22k
    break;
3404
33.8k
  }
3405
3406
  // First input register
3407
33.8k
  switch (MCInst_getOpcode(Inst)) {
3408
141
  case ARM_VST1q16:
3409
437
  case ARM_VST1q32:
3410
826
  case ARM_VST1q64:
3411
980
  case ARM_VST1q8:
3412
1.41k
  case ARM_VST1q16wb_fixed:
3413
1.59k
  case ARM_VST1q16wb_register:
3414
1.84k
  case ARM_VST1q32wb_fixed:
3415
2.47k
  case ARM_VST1q32wb_register:
3416
2.87k
  case ARM_VST1q64wb_fixed:
3417
3.14k
  case ARM_VST1q64wb_register:
3418
3.38k
  case ARM_VST1q8wb_fixed:
3419
4.24k
  case ARM_VST1q8wb_register:
3420
4.37k
  case ARM_VST2d16:
3421
4.53k
  case ARM_VST2d32:
3422
4.83k
  case ARM_VST2d8:
3423
5.27k
  case ARM_VST2d16wb_fixed:
3424
5.44k
  case ARM_VST2d16wb_register:
3425
5.76k
  case ARM_VST2d32wb_fixed:
3426
5.93k
  case ARM_VST2d32wb_register:
3427
6.19k
  case ARM_VST2d8wb_fixed:
3428
6.68k
  case ARM_VST2d8wb_register:
3429
6.68k
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address,
3430
6.68k
              Decoder)))
3431
2
      return MCDisassembler_Fail;
3432
6.68k
    break;
3433
6.68k
  case ARM_VST2b16:
3434
331
  case ARM_VST2b32:
3435
716
  case ARM_VST2b8:
3436
899
  case ARM_VST2b16wb_fixed:
3437
1.17k
  case ARM_VST2b16wb_register:
3438
1.60k
  case ARM_VST2b32wb_fixed:
3439
2.05k
  case ARM_VST2b32wb_register:
3440
2.79k
  case ARM_VST2b8wb_fixed:
3441
3.87k
  case ARM_VST2b8wb_register:
3442
3.87k
    if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address,
3443
3.87k
                    Decoder)))
3444
10
      return MCDisassembler_Fail;
3445
3.86k
    break;
3446
23.3k
  default:
3447
23.3k
    if (!Check(&S,
3448
23.3k
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3449
0
      return MCDisassembler_Fail;
3450
33.8k
  }
3451
3452
  // Second input register
3453
33.8k
  switch (MCInst_getOpcode(Inst)) {
3454
386
  case ARM_VST3d8:
3455
614
  case ARM_VST3d16:
3456
793
  case ARM_VST3d32:
3457
1.36k
  case ARM_VST3d8_UPD:
3458
1.65k
  case ARM_VST3d16_UPD:
3459
1.91k
  case ARM_VST3d32_UPD:
3460
2.13k
  case ARM_VST4d8:
3461
3.07k
  case ARM_VST4d16:
3462
3.34k
  case ARM_VST4d32:
3463
4.44k
  case ARM_VST4d8_UPD:
3464
4.94k
  case ARM_VST4d16_UPD:
3465
5.75k
  case ARM_VST4d32_UPD:
3466
5.75k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 1) % 32,
3467
5.75k
                  Address, Decoder)))
3468
0
      return MCDisassembler_Fail;
3469
5.75k
    break;
3470
5.75k
  case ARM_VST3q8:
3471
1.10k
  case ARM_VST3q16:
3472
1.50k
  case ARM_VST3q32:
3473
1.91k
  case ARM_VST3q8_UPD:
3474
2.34k
  case ARM_VST3q16_UPD:
3475
2.65k
  case ARM_VST3q32_UPD:
3476
3.26k
  case ARM_VST4q8:
3477
3.53k
  case ARM_VST4q16:
3478
3.89k
  case ARM_VST4q32:
3479
4.56k
  case ARM_VST4q8_UPD:
3480
5.14k
  case ARM_VST4q16_UPD:
3481
5.61k
  case ARM_VST4q32_UPD:
3482
5.61k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32,
3483
5.61k
                  Address, Decoder)))
3484
0
      return MCDisassembler_Fail;
3485
5.61k
    break;
3486
22.5k
  default:
3487
22.5k
    break;
3488
33.8k
  }
3489
3490
  // Third input register
3491
33.8k
  switch (MCInst_getOpcode(Inst)) {
3492
386
  case ARM_VST3d8:
3493
614
  case ARM_VST3d16:
3494
793
  case ARM_VST3d32:
3495
1.36k
  case ARM_VST3d8_UPD:
3496
1.65k
  case ARM_VST3d16_UPD:
3497
1.91k
  case ARM_VST3d32_UPD:
3498
2.13k
  case ARM_VST4d8:
3499
3.07k
  case ARM_VST4d16:
3500
3.34k
  case ARM_VST4d32:
3501
4.44k
  case ARM_VST4d8_UPD:
3502
4.94k
  case ARM_VST4d16_UPD:
3503
5.75k
  case ARM_VST4d32_UPD:
3504
5.75k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2) % 32,
3505
5.75k
                  Address, Decoder)))
3506
0
      return MCDisassembler_Fail;
3507
5.75k
    break;
3508
5.75k
  case ARM_VST3q8:
3509
1.10k
  case ARM_VST3q16:
3510
1.50k
  case ARM_VST3q32:
3511
1.91k
  case ARM_VST3q8_UPD:
3512
2.34k
  case ARM_VST3q16_UPD:
3513
2.65k
  case ARM_VST3q32_UPD:
3514
3.26k
  case ARM_VST4q8:
3515
3.53k
  case ARM_VST4q16:
3516
3.89k
  case ARM_VST4q32:
3517
4.56k
  case ARM_VST4q8_UPD:
3518
5.14k
  case ARM_VST4q16_UPD:
3519
5.61k
  case ARM_VST4q32_UPD:
3520
5.61k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 4) % 32,
3521
5.61k
                  Address, Decoder)))
3522
0
      return MCDisassembler_Fail;
3523
5.61k
    break;
3524
22.5k
  default:
3525
22.5k
    break;
3526
33.8k
  }
3527
3528
  // Fourth input register
3529
33.8k
  switch (MCInst_getOpcode(Inst)) {
3530
220
  case ARM_VST4d8:
3531
1.15k
  case ARM_VST4d16:
3532
1.43k
  case ARM_VST4d32:
3533
2.53k
  case ARM_VST4d8_UPD:
3534
3.02k
  case ARM_VST4d16_UPD:
3535
3.83k
  case ARM_VST4d32_UPD:
3536
3.83k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 3) % 32,
3537
3.83k
                  Address, Decoder)))
3538
0
      return MCDisassembler_Fail;
3539
3.83k
    break;
3540
3.83k
  case ARM_VST4q8:
3541
885
  case ARM_VST4q16:
3542
1.23k
  case ARM_VST4q32:
3543
1.90k
  case ARM_VST4q8_UPD:
3544
2.49k
  case ARM_VST4q16_UPD:
3545
2.96k
  case ARM_VST4q32_UPD:
3546
2.96k
    if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 6) % 32,
3547
2.96k
                  Address, Decoder)))
3548
0
      return MCDisassembler_Fail;
3549
2.96k
    break;
3550
27.0k
  default:
3551
27.0k
    break;
3552
33.8k
  }
3553
3554
33.8k
  return S;
3555
33.8k
}
3556
3557
static DecodeStatus DecodeVLD1DupInstruction(MCInst *Inst, unsigned Insn,
3558
               uint64_t Address,
3559
               const void *Decoder)
3560
1.24k
{
3561
1.24k
  DecodeStatus S = MCDisassembler_Success;
3562
3563
1.24k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3564
1.24k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3565
1.24k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3566
1.24k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3567
1.24k
  unsigned align = fieldFromInstruction_4(Insn, 4, 1);
3568
1.24k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3569
3570
1.24k
  if (size == 0 && align == 1)
3571
2
    return MCDisassembler_Fail;
3572
1.24k
  align *= (1 << size);
3573
3574
1.24k
  switch (MCInst_getOpcode(Inst)) {
3575
243
  case ARM_VLD1DUPq16:
3576
245
  case ARM_VLD1DUPq32:
3577
384
  case ARM_VLD1DUPq8:
3578
409
  case ARM_VLD1DUPq16wb_fixed:
3579
618
  case ARM_VLD1DUPq16wb_register:
3580
620
  case ARM_VLD1DUPq32wb_fixed:
3581
641
  case ARM_VLD1DUPq32wb_register:
3582
642
  case ARM_VLD1DUPq8wb_fixed:
3583
708
  case ARM_VLD1DUPq8wb_register:
3584
708
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address,
3585
708
              Decoder)))
3586
2
      return MCDisassembler_Fail;
3587
706
    break;
3588
706
  default:
3589
536
    if (!Check(&S,
3590
536
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3591
0
      return MCDisassembler_Fail;
3592
536
    break;
3593
1.24k
  }
3594
1.24k
  if (Rm != 0xF) {
3595
784
    if (!Check(&S,
3596
784
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3597
0
      return MCDisassembler_Fail;
3598
784
  }
3599
3600
1.24k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3601
0
    return MCDisassembler_Fail;
3602
1.24k
  MCOperand_CreateImm0(Inst, (align));
3603
3604
  // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
3605
  // variant encodes Rm == 0xf. Anything else is a register offset post-
3606
  // increment and we need to add the register operand to the instruction.
3607
1.24k
  if (Rm != 0xD && Rm != 0xF &&
3608
1.24k
      !Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3609
0
    return MCDisassembler_Fail;
3610
3611
1.24k
  return S;
3612
1.24k
}
3613
3614
static DecodeStatus DecodeVLD2DupInstruction(MCInst *Inst, unsigned Insn,
3615
               uint64_t Address,
3616
               const void *Decoder)
3617
4.34k
{
3618
4.34k
  DecodeStatus S = MCDisassembler_Success;
3619
3620
4.34k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3621
4.34k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3622
4.34k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3623
4.34k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3624
4.34k
  unsigned align = fieldFromInstruction_4(Insn, 4, 1);
3625
4.34k
  unsigned size = 1 << fieldFromInstruction_4(Insn, 6, 2);
3626
4.34k
  align *= 2 * size;
3627
3628
4.34k
  switch (MCInst_getOpcode(Inst)) {
3629
280
  case ARM_VLD2DUPd16:
3630
716
  case ARM_VLD2DUPd32:
3631
860
  case ARM_VLD2DUPd8:
3632
1.02k
  case ARM_VLD2DUPd16wb_fixed:
3633
1.18k
  case ARM_VLD2DUPd16wb_register:
3634
1.51k
  case ARM_VLD2DUPd32wb_fixed:
3635
1.97k
  case ARM_VLD2DUPd32wb_register:
3636
2.45k
  case ARM_VLD2DUPd8wb_fixed:
3637
2.63k
  case ARM_VLD2DUPd8wb_register:
3638
2.63k
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rd, Address,
3639
2.63k
              Decoder)))
3640
3
      return MCDisassembler_Fail;
3641
2.63k
    break;
3642
2.63k
  case ARM_VLD2DUPd16x2:
3643
314
  case ARM_VLD2DUPd32x2:
3644
593
  case ARM_VLD2DUPd8x2:
3645
751
  case ARM_VLD2DUPd16x2wb_fixed:
3646
965
  case ARM_VLD2DUPd16x2wb_register:
3647
1.19k
  case ARM_VLD2DUPd32x2wb_fixed:
3648
1.40k
  case ARM_VLD2DUPd32x2wb_register:
3649
1.53k
  case ARM_VLD2DUPd8x2wb_fixed:
3650
1.71k
  case ARM_VLD2DUPd8x2wb_register:
3651
1.71k
    if (!Check(&S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address,
3652
1.71k
                    Decoder)))
3653
5
      return MCDisassembler_Fail;
3654
1.70k
    break;
3655
1.70k
  default:
3656
0
    if (!Check(&S,
3657
0
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3658
0
      return MCDisassembler_Fail;
3659
0
    break;
3660
4.34k
  }
3661
3662
4.34k
  if (Rm != 0xF)
3663
2.88k
    MCOperand_CreateImm0(Inst, (0));
3664
3665
4.34k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3666
0
    return MCDisassembler_Fail;
3667
4.34k
  MCOperand_CreateImm0(Inst, (align));
3668
3669
4.34k
  if (Rm != 0xD && Rm != 0xF) {
3670
1.41k
    if (!Check(&S,
3671
1.41k
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3672
0
      return MCDisassembler_Fail;
3673
1.41k
  }
3674
3675
4.34k
  return S;
3676
4.34k
}
3677
3678
static DecodeStatus DecodeVLD3DupInstruction(MCInst *Inst, unsigned Insn,
3679
               uint64_t Address,
3680
               const void *Decoder)
3681
1.48k
{
3682
1.48k
  DecodeStatus S = MCDisassembler_Success;
3683
3684
1.48k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3685
1.48k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3686
1.48k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3687
1.48k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3688
1.48k
  unsigned inc = fieldFromInstruction_4(Insn, 5, 1) + 1;
3689
3690
1.48k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3691
0
    return MCDisassembler_Fail;
3692
1.48k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + inc) % 32, Address,
3693
1.48k
                Decoder)))
3694
0
    return MCDisassembler_Fail;
3695
1.48k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2 * inc) % 32,
3696
1.48k
                Address, Decoder)))
3697
0
    return MCDisassembler_Fail;
3698
1.48k
  if (Rm != 0xF) {
3699
1.12k
    if (!Check(&S,
3700
1.12k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3701
0
      return MCDisassembler_Fail;
3702
1.12k
  }
3703
3704
1.48k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3705
0
    return MCDisassembler_Fail;
3706
1.48k
  MCOperand_CreateImm0(Inst, (0));
3707
3708
1.48k
  if (Rm == 0xD)
3709
463
    MCOperand_CreateReg0(Inst, (0));
3710
1.01k
  else if (Rm != 0xF) {
3711
661
    if (!Check(&S,
3712
661
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3713
0
      return MCDisassembler_Fail;
3714
661
  }
3715
3716
1.48k
  return S;
3717
1.48k
}
3718
3719
static DecodeStatus DecodeVLD4DupInstruction(MCInst *Inst, unsigned Insn,
3720
               uint64_t Address,
3721
               const void *Decoder)
3722
1.23k
{
3723
1.23k
  DecodeStatus S = MCDisassembler_Success;
3724
3725
1.23k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3726
1.23k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3727
1.23k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3728
1.23k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3729
1.23k
  unsigned size = fieldFromInstruction_4(Insn, 6, 2);
3730
1.23k
  unsigned inc = fieldFromInstruction_4(Insn, 5, 1) + 1;
3731
1.23k
  unsigned align = fieldFromInstruction_4(Insn, 4, 1);
3732
3733
1.23k
  if (size == 0x3) {
3734
191
    if (align == 0)
3735
2
      return MCDisassembler_Fail;
3736
189
    align = 16;
3737
1.04k
  } else {
3738
1.04k
    if (size == 2) {
3739
203
      align *= 8;
3740
837
    } else {
3741
837
      size = 1 << size;
3742
837
      align *= 4 * size;
3743
837
    }
3744
1.04k
  }
3745
3746
1.22k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3747
0
    return MCDisassembler_Fail;
3748
1.22k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + inc) % 32, Address,
3749
1.22k
                Decoder)))
3750
0
    return MCDisassembler_Fail;
3751
1.22k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 2 * inc) % 32,
3752
1.22k
                Address, Decoder)))
3753
0
    return MCDisassembler_Fail;
3754
1.22k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, (Rd + 3 * inc) % 32,
3755
1.22k
                Address, Decoder)))
3756
0
    return MCDisassembler_Fail;
3757
1.22k
  if (Rm != 0xF) {
3758
856
    if (!Check(&S,
3759
856
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3760
0
      return MCDisassembler_Fail;
3761
856
  }
3762
3763
1.22k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3764
0
    return MCDisassembler_Fail;
3765
1.22k
  MCOperand_CreateImm0(Inst, (align));
3766
3767
1.22k
  if (Rm == 0xD)
3768
472
    MCOperand_CreateReg0(Inst, (0));
3769
757
  else if (Rm != 0xF) {
3770
384
    if (!Check(&S,
3771
384
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3772
0
      return MCDisassembler_Fail;
3773
384
  }
3774
3775
1.22k
  return S;
3776
1.22k
}
3777
3778
static DecodeStatus DecodeVMOVModImmInstruction(MCInst *Inst, unsigned Insn,
3779
            uint64_t Address,
3780
            const void *Decoder)
3781
3.22k
{
3782
3.22k
  DecodeStatus S = MCDisassembler_Success;
3783
3784
3.22k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3785
3.22k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3786
3.22k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 4);
3787
3.22k
  imm |= fieldFromInstruction_4(Insn, 16, 3) << 4;
3788
3.22k
  imm |= fieldFromInstruction_4(Insn, 24, 1) << 7;
3789
3.22k
  imm |= fieldFromInstruction_4(Insn, 8, 4) << 8;
3790
3.22k
  imm |= fieldFromInstruction_4(Insn, 5, 1) << 12;
3791
3.22k
  unsigned Q = fieldFromInstruction_4(Insn, 6, 1);
3792
3793
3.22k
  if (Q) {
3794
1.23k
    if (!Check(&S,
3795
1.23k
         DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3796
6
      return MCDisassembler_Fail;
3797
1.99k
  } else {
3798
1.99k
    if (!Check(&S,
3799
1.99k
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3800
0
      return MCDisassembler_Fail;
3801
1.99k
  }
3802
3803
3.22k
  MCOperand_CreateImm0(Inst, (imm));
3804
3805
3.22k
  switch (MCInst_getOpcode(Inst)) {
3806
36
  case ARM_VORRiv4i16:
3807
163
  case ARM_VORRiv2i32:
3808
412
  case ARM_VBICiv4i16:
3809
959
  case ARM_VBICiv2i32:
3810
959
    if (!Check(&S,
3811
959
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3812
0
      return MCDisassembler_Fail;
3813
959
    break;
3814
959
  case ARM_VORRiv8i16:
3815
345
  case ARM_VORRiv4i32:
3816
379
  case ARM_VBICiv8i16:
3817
513
  case ARM_VBICiv4i32:
3818
513
    if (!Check(&S,
3819
513
         DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3820
0
      return MCDisassembler_Fail;
3821
513
    break;
3822
1.74k
  default:
3823
1.74k
    break;
3824
3.22k
  }
3825
3826
3.22k
  return S;
3827
3.22k
}
3828
3829
static DecodeStatus DecodeMVEModImmInstruction(MCInst *Inst, unsigned Insn,
3830
                 uint64_t Address,
3831
                 const void *Decoder)
3832
664
{
3833
664
  DecodeStatus S = MCDisassembler_Success;
3834
3835
664
  unsigned Qd = ((fieldFromInstruction_4(Insn, 22, 1) << 3) |
3836
664
           fieldFromInstruction_4(Insn, 13, 3));
3837
664
  unsigned cmode = fieldFromInstruction_4(Insn, 8, 4);
3838
664
  unsigned imm = fieldFromInstruction_4(Insn, 0, 4);
3839
664
  imm |= fieldFromInstruction_4(Insn, 16, 3) << 4;
3840
664
  imm |= fieldFromInstruction_4(Insn, 28, 1) << 7;
3841
664
  imm |= cmode << 8;
3842
664
  imm |= fieldFromInstruction_4(Insn, 5, 1) << 12;
3843
3844
664
  if (cmode == 0xF && MCInst_getOpcode(Inst) == ARM_MVE_VMVNimmi32)
3845
1
    return MCDisassembler_Fail;
3846
3847
663
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
3848
453
    return MCDisassembler_Fail;
3849
3850
210
  MCOperand_CreateImm0(Inst, (imm));
3851
3852
210
  MCOperand_CreateImm0(Inst, (ARMVCC_None));
3853
210
  MCOperand_CreateReg0(Inst, (0));
3854
210
  MCOperand_CreateImm0(Inst, (0));
3855
3856
210
  return S;
3857
663
}
3858
3859
static DecodeStatus DecodeMVEVADCInstruction(MCInst *Inst, unsigned Insn,
3860
               uint64_t Address,
3861
               const void *Decoder)
3862
1.27k
{
3863
1.27k
  DecodeStatus S = MCDisassembler_Success;
3864
3865
1.27k
  unsigned Qd = fieldFromInstruction_4(Insn, 13, 3);
3866
1.27k
  Qd |= fieldFromInstruction_4(Insn, 22, 1) << 3;
3867
1.27k
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
3868
280
    return MCDisassembler_Fail;
3869
995
  MCOperand_CreateReg0(Inst, (ARM_FPSCR_NZCV));
3870
3871
995
  unsigned Qn = fieldFromInstruction_4(Insn, 17, 3);
3872
995
  Qn |= fieldFromInstruction_4(Insn, 7, 1) << 3;
3873
995
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, Decoder)))
3874
435
    return MCDisassembler_Fail;
3875
560
  unsigned Qm = fieldFromInstruction_4(Insn, 1, 3);
3876
560
  Qm |= fieldFromInstruction_4(Insn, 5, 1) << 3;
3877
560
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, Decoder)))
3878
297
    return MCDisassembler_Fail;
3879
263
  if (!fieldFromInstruction_4(Insn, 12,
3880
263
            1)) // I bit clear => need input FPSCR
3881
129
    MCOperand_CreateReg0(Inst, (ARM_FPSCR_NZCV));
3882
263
  MCOperand_CreateImm0(Inst, (Qd));
3883
3884
263
  return S;
3885
560
}
3886
3887
static DecodeStatus DecodeVSHLMaxInstruction(MCInst *Inst, unsigned Insn,
3888
               uint64_t Address,
3889
               const void *Decoder)
3890
511
{
3891
511
  DecodeStatus S = MCDisassembler_Success;
3892
3893
511
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3894
511
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3895
511
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3896
511
  Rm |= fieldFromInstruction_4(Insn, 5, 1) << 4;
3897
511
  unsigned size = fieldFromInstruction_4(Insn, 18, 2);
3898
3899
511
  if (!Check(&S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
3900
2
    return MCDisassembler_Fail;
3901
509
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
3902
0
    return MCDisassembler_Fail;
3903
509
  MCOperand_CreateImm0(Inst, (8 << size));
3904
3905
509
  return S;
3906
509
}
3907
3908
static DecodeStatus DecodeShiftRight8Imm(MCInst *Inst, unsigned Val,
3909
           uint64_t Address, const void *Decoder)
3910
1.95k
{
3911
1.95k
  MCOperand_CreateImm0(Inst, (8 - Val));
3912
1.95k
  return MCDisassembler_Success;
3913
1.95k
}
3914
3915
static DecodeStatus DecodeShiftRight16Imm(MCInst *Inst, unsigned Val,
3916
            uint64_t Address, const void *Decoder)
3917
1.82k
{
3918
1.82k
  MCOperand_CreateImm0(Inst, (16 - Val));
3919
1.82k
  return MCDisassembler_Success;
3920
1.82k
}
3921
3922
static DecodeStatus DecodeShiftRight32Imm(MCInst *Inst, unsigned Val,
3923
            uint64_t Address, const void *Decoder)
3924
2.82k
{
3925
2.82k
  MCOperand_CreateImm0(Inst, (32 - Val));
3926
2.82k
  return MCDisassembler_Success;
3927
2.82k
}
3928
3929
static DecodeStatus DecodeShiftRight64Imm(MCInst *Inst, unsigned Val,
3930
            uint64_t Address, const void *Decoder)
3931
1.58k
{
3932
1.58k
  MCOperand_CreateImm0(Inst, (64 - Val));
3933
1.58k
  return MCDisassembler_Success;
3934
1.58k
}
3935
3936
static DecodeStatus DecodeTBLInstruction(MCInst *Inst, unsigned Insn,
3937
           uint64_t Address, const void *Decoder)
3938
3.50k
{
3939
3.50k
  DecodeStatus S = MCDisassembler_Success;
3940
3941
3.50k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
3942
3.50k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
3943
3.50k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
3944
3.50k
  Rn |= fieldFromInstruction_4(Insn, 7, 1) << 4;
3945
3.50k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
3946
3.50k
  Rm |= fieldFromInstruction_4(Insn, 5, 1) << 4;
3947
3.50k
  unsigned op = fieldFromInstruction_4(Insn, 6, 1);
3948
3949
3.50k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3950
0
    return MCDisassembler_Fail;
3951
3.50k
  if (op) {
3952
1.26k
    if (!Check(&S,
3953
1.26k
         DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3954
0
      return MCDisassembler_Fail; // Writeback
3955
1.26k
  }
3956
3957
3.50k
  switch (MCInst_getOpcode(Inst)) {
3958
900
  case ARM_VTBL2:
3959
1.31k
  case ARM_VTBX2:
3960
1.31k
    if (!Check(&S, DecodeDPairRegisterClass(Inst, Rn, Address,
3961
1.31k
              Decoder)))
3962
4
      return MCDisassembler_Fail;
3963
1.31k
    break;
3964
2.18k
  default:
3965
2.18k
    if (!Check(&S,
3966
2.18k
         DecodeDPRRegisterClass(Inst, Rn, Address, Decoder)))
3967
0
      return MCDisassembler_Fail;
3968
3.50k
  }
3969
3970
3.50k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
3971
0
    return MCDisassembler_Fail;
3972
3973
3.50k
  return S;
3974
3.50k
}
3975
3976
static DecodeStatus DecodeThumbAddSpecialReg(MCInst *Inst, uint16_t Insn,
3977
               uint64_t Address,
3978
               const void *Decoder)
3979
49.1k
{
3980
49.1k
  DecodeStatus S = MCDisassembler_Success;
3981
3982
49.1k
  unsigned dst = fieldFromInstruction_2(Insn, 8, 3);
3983
49.1k
  unsigned imm = fieldFromInstruction_2(Insn, 0, 8);
3984
3985
49.1k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, dst, Address, Decoder)))
3986
0
    return MCDisassembler_Fail;
3987
3988
49.1k
  switch (MCInst_getOpcode(Inst)) {
3989
0
  default:
3990
0
    return MCDisassembler_Fail;
3991
27.4k
  case ARM_tADR:
3992
27.4k
    break; // tADR does not explicitly represent the PC as an operand.
3993
21.7k
  case ARM_tADDrSPi:
3994
21.7k
    MCOperand_CreateReg0(Inst, (ARM_SP));
3995
21.7k
    break;
3996
49.1k
  }
3997
3998
49.1k
  MCOperand_CreateImm0(Inst, (imm));
3999
49.1k
  return S;
4000
49.1k
}
4001
4002
static DecodeStatus DecodeThumbBROperand(MCInst *Inst, unsigned Val,
4003
           uint64_t Address, const void *Decoder)
4004
15.3k
{
4005
15.3k
  if (!tryAddingSymbolicOperand(
4006
15.3k
        Address, Address + SignExtend32((Val << 1), 12) + 4, true,
4007
15.3k
        2, Inst, Decoder))
4008
15.3k
    MCOperand_CreateImm0(Inst, (SignExtend32((Val << 1), 12)));
4009
15.3k
  return MCDisassembler_Success;
4010
15.3k
}
4011
4012
static DecodeStatus DecodeT2BROperand(MCInst *Inst, unsigned Val,
4013
              uint64_t Address, const void *Decoder)
4014
1.90k
{
4015
1.90k
  if (!tryAddingSymbolicOperand(Address,
4016
1.90k
              Address + SignExtend32((Val), 21) + 4,
4017
1.90k
              true, 4, Inst, Decoder))
4018
1.90k
    MCOperand_CreateImm0(Inst, (SignExtend32((Val), 21)));
4019
1.90k
  return MCDisassembler_Success;
4020
1.90k
}
4021
4022
static DecodeStatus DecodeThumbCmpBROperand(MCInst *Inst, unsigned Val,
4023
              uint64_t Address,
4024
              const void *Decoder)
4025
6.73k
{
4026
6.73k
  if (!tryAddingSymbolicOperand(Address, Address + (Val << 1) + 4, true,
4027
6.73k
              2, Inst, Decoder))
4028
6.73k
    MCOperand_CreateImm0(Inst, (Val << 1));
4029
6.73k
  return MCDisassembler_Success;
4030
6.73k
}
4031
4032
static DecodeStatus DecodeThumbAddrModeRR(MCInst *Inst, unsigned Val,
4033
            uint64_t Address, const void *Decoder)
4034
43.6k
{
4035
43.6k
  DecodeStatus S = MCDisassembler_Success;
4036
4037
43.6k
  unsigned Rn = fieldFromInstruction_4(Val, 0, 3);
4038
43.6k
  unsigned Rm = fieldFromInstruction_4(Val, 3, 3);
4039
4040
43.6k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
4041
0
    return MCDisassembler_Fail;
4042
43.6k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, Rm, Address, Decoder)))
4043
0
    return MCDisassembler_Fail;
4044
4045
43.6k
  return S;
4046
43.6k
}
4047
4048
static DecodeStatus DecodeThumbAddrModeIS(MCInst *Inst, unsigned Val,
4049
            uint64_t Address, const void *Decoder)
4050
222k
{
4051
222k
  DecodeStatus S = MCDisassembler_Success;
4052
4053
222k
  unsigned Rn = fieldFromInstruction_4(Val, 0, 3);
4054
222k
  unsigned imm = fieldFromInstruction_4(Val, 3, 5);
4055
4056
222k
  if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
4057
0
    return MCDisassembler_Fail;
4058
222k
  MCOperand_CreateImm0(Inst, (imm));
4059
4060
222k
  return S;
4061
222k
}
4062
4063
static DecodeStatus DecodeThumbAddrModePC(MCInst *Inst, unsigned Val,
4064
            uint64_t Address, const void *Decoder)
4065
29.6k
{
4066
29.6k
  unsigned imm = Val << 2;
4067
4068
29.6k
  MCOperand_CreateImm0(Inst, (imm));
4069
29.6k
  tryAddingPcLoadReferenceComment(Address, (Address & ~2u) + imm + 4,
4070
29.6k
          Decoder);
4071
4072
29.6k
  return MCDisassembler_Success;
4073
29.6k
}
4074
4075
static DecodeStatus DecodeThumbAddrModeSP(MCInst *Inst, unsigned Val,
4076
            uint64_t Address, const void *Decoder)
4077
39.6k
{
4078
39.6k
  MCOperand_CreateReg0(Inst, (ARM_SP));
4079
39.6k
  MCOperand_CreateImm0(Inst, (Val));
4080
4081
39.6k
  return MCDisassembler_Success;
4082
39.6k
}
4083
4084
static DecodeStatus DecodeT2AddrModeSOReg(MCInst *Inst, unsigned Val,
4085
            uint64_t Address, const void *Decoder)
4086
1.64k
{
4087
1.64k
  DecodeStatus S = MCDisassembler_Success;
4088
4089
1.64k
  unsigned Rn = fieldFromInstruction_4(Val, 6, 4);
4090
1.64k
  unsigned Rm = fieldFromInstruction_4(Val, 2, 4);
4091
1.64k
  unsigned imm = fieldFromInstruction_4(Val, 0, 2);
4092
4093
  // Thumb stores cannot use PC as dest register.
4094
1.64k
  switch (MCInst_getOpcode(Inst)) {
4095
356
  case ARM_t2STRHs:
4096
452
  case ARM_t2STRBs:
4097
594
  case ARM_t2STRs:
4098
594
    if (Rn == 15)
4099
2
      return MCDisassembler_Fail;
4100
592
    break;
4101
1.05k
  default:
4102
1.05k
    break;
4103
1.64k
  }
4104
4105
1.64k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4106
0
    return MCDisassembler_Fail;
4107
1.64k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
4108
0
    return MCDisassembler_Fail;
4109
1.64k
  MCOperand_CreateImm0(Inst, (imm));
4110
4111
1.64k
  return S;
4112
1.64k
}
4113
4114
static DecodeStatus DecodeT2LoadShift(MCInst *Inst, unsigned Insn,
4115
              uint64_t Address, const void *Decoder)
4116
3.05k
{
4117
3.05k
  DecodeStatus S = MCDisassembler_Success;
4118
4119
3.05k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4120
3.05k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4121
4122
3.05k
  bool hasMP = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMP);
4123
3.05k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
4124
4125
3.05k
  if (Rn == 15) {
4126
1.99k
    switch (MCInst_getOpcode(Inst)) {
4127
82
    case ARM_t2LDRBs:
4128
82
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4129
82
      break;
4130
56
    case ARM_t2LDRHs:
4131
56
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4132
56
      break;
4133
312
    case ARM_t2LDRSHs:
4134
312
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4135
312
      break;
4136
118
    case ARM_t2LDRSBs:
4137
118
      MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4138
118
      break;
4139
277
    case ARM_t2LDRs:
4140
277
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4141
277
      break;
4142
814
    case ARM_t2PLDs:
4143
814
      MCInst_setOpcode(Inst, (ARM_t2PLDpci));
4144
814
      break;
4145
338
    case ARM_t2PLIs:
4146
338
      MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4147
338
      break;
4148
1
    default:
4149
1
      return MCDisassembler_Fail;
4150
1.99k
    }
4151
4152
1.99k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4153
1.99k
  }
4154
4155
1.05k
  if (Rt == 15) {
4156
781
    switch (MCInst_getOpcode(Inst)) {
4157
1
    case ARM_t2LDRSHs:
4158
1
      return MCDisassembler_Fail;
4159
0
    case ARM_t2LDRHs:
4160
0
      MCInst_setOpcode(Inst, (ARM_t2PLDWs));
4161
0
      break;
4162
0
    case ARM_t2LDRSBs:
4163
0
      MCInst_setOpcode(Inst, (ARM_t2PLIs));
4164
0
      break;
4165
780
    default:
4166
780
      break;
4167
781
    }
4168
781
  }
4169
4170
1.05k
  switch (MCInst_getOpcode(Inst)) {
4171
330
  case ARM_t2PLDs:
4172
330
    break;
4173
93
  case ARM_t2PLIs:
4174
93
    if (!hasV7Ops)
4175
0
      return MCDisassembler_Fail;
4176
93
    break;
4177
357
  case ARM_t2PLDWs:
4178
357
    if (!hasV7Ops || !hasMP)
4179
0
      return MCDisassembler_Fail;
4180
357
    break;
4181
357
  default:
4182
273
    if (!Check(&S,
4183
273
         DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4184
0
      return MCDisassembler_Fail;
4185
1.05k
  }
4186
4187
1.05k
  unsigned addrmode = fieldFromInstruction_4(Insn, 4, 2);
4188
1.05k
  addrmode |= fieldFromInstruction_4(Insn, 0, 4) << 2;
4189
1.05k
  addrmode |= fieldFromInstruction_4(Insn, 16, 4) << 6;
4190
1.05k
  if (!Check(&S, DecodeT2AddrModeSOReg(Inst, addrmode, Address, Decoder)))
4191
0
    return MCDisassembler_Fail;
4192
4193
1.05k
  return S;
4194
1.05k
}
4195
4196
static DecodeStatus DecodeT2LoadImm8(MCInst *Inst, unsigned Insn,
4197
             uint64_t Address, const void *Decoder)
4198
3.57k
{
4199
3.57k
  DecodeStatus S = MCDisassembler_Success;
4200
4201
3.57k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4202
3.57k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4203
3.57k
  unsigned U = fieldFromInstruction_4(Insn, 9, 1);
4204
3.57k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
4205
3.57k
  imm |= (U << 8);
4206
3.57k
  imm |= (Rn << 9);
4207
3.57k
  unsigned add = fieldFromInstruction_4(Insn, 9, 1);
4208
4209
3.57k
  bool hasMP = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMP);
4210
3.57k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
4211
4212
3.57k
  if (Rn == 15) {
4213
1.98k
    switch (MCInst_getOpcode(Inst)) {
4214
277
    case ARM_t2LDRi8:
4215
277
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4216
277
      break;
4217
147
    case ARM_t2LDRBi8:
4218
147
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4219
147
      break;
4220
252
    case ARM_t2LDRSBi8:
4221
252
      MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4222
252
      break;
4223
232
    case ARM_t2LDRHi8:
4224
232
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4225
232
      break;
4226
472
    case ARM_t2LDRSHi8:
4227
472
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4228
472
      break;
4229
225
    case ARM_t2PLDi8:
4230
225
      MCInst_setOpcode(Inst, (ARM_t2PLDpci));
4231
225
      break;
4232
375
    case ARM_t2PLIi8:
4233
375
      MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4234
375
      break;
4235
2
    default:
4236
2
      return MCDisassembler_Fail;
4237
1.98k
    }
4238
1.98k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4239
1.98k
  }
4240
4241
1.59k
  if (Rt == 15) {
4242
1.14k
    switch (MCInst_getOpcode(Inst)) {
4243
2
    case ARM_t2LDRSHi8:
4244
2
      return MCDisassembler_Fail;
4245
0
    case ARM_t2LDRHi8:
4246
0
      if (!add)
4247
0
        MCInst_setOpcode(Inst, (ARM_t2PLDWi8));
4248
0
      break;
4249
0
    case ARM_t2LDRSBi8:
4250
0
      MCInst_setOpcode(Inst, (ARM_t2PLIi8));
4251
0
      break;
4252
1.14k
    default:
4253
1.14k
      break;
4254
1.14k
    }
4255
1.14k
  }
4256
4257
1.59k
  switch (MCInst_getOpcode(Inst)) {
4258
661
  case ARM_t2PLDi8:
4259
661
    break;
4260
206
  case ARM_t2PLIi8:
4261
206
    if (!hasV7Ops)
4262
0
      return MCDisassembler_Fail;
4263
206
    break;
4264
263
  case ARM_t2PLDWi8:
4265
263
    if (!hasV7Ops || !hasMP)
4266
0
      return MCDisassembler_Fail;
4267
263
    break;
4268
465
  default:
4269
465
    if (!Check(&S,
4270
465
         DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4271
0
      return MCDisassembler_Fail;
4272
1.59k
  }
4273
4274
1.59k
  if (!Check(&S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder)))
4275
0
    return MCDisassembler_Fail;
4276
1.59k
  return S;
4277
1.59k
}
4278
4279
static DecodeStatus DecodeT2LoadImm12(MCInst *Inst, unsigned Insn,
4280
              uint64_t Address, const void *Decoder)
4281
6.16k
{
4282
6.16k
  DecodeStatus S = MCDisassembler_Success;
4283
4284
6.16k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4285
6.16k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4286
6.16k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
4287
6.16k
  imm |= (Rn << 13);
4288
4289
6.16k
  bool hasMP = ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMP);
4290
6.16k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
4291
4292
6.16k
  if (Rn == 15) {
4293
3.50k
    switch (MCInst_getOpcode(Inst)) {
4294
263
    case ARM_t2LDRi12:
4295
263
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4296
263
      break;
4297
990
    case ARM_t2LDRHi12:
4298
990
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4299
990
      break;
4300
379
    case ARM_t2LDRSHi12:
4301
379
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4302
379
      break;
4303
454
    case ARM_t2LDRBi12:
4304
454
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4305
454
      break;
4306
527
    case ARM_t2LDRSBi12:
4307
527
      MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4308
527
      break;
4309
326
    case ARM_t2PLDi12:
4310
326
      MCInst_setOpcode(Inst, (ARM_t2PLDpci));
4311
326
      break;
4312
562
    case ARM_t2PLIi12:
4313
562
      MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4314
562
      break;
4315
3
    default:
4316
3
      return MCDisassembler_Fail;
4317
3.50k
    }
4318
3.50k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4319
3.50k
  }
4320
4321
2.66k
  if (Rt == 15) {
4322
1.40k
    switch (MCInst_getOpcode(Inst)) {
4323
2
    case ARM_t2LDRSHi12:
4324
2
      return MCDisassembler_Fail;
4325
0
    case ARM_t2LDRHi12:
4326
0
      MCInst_setOpcode(Inst, (ARM_t2PLDWi12));
4327
0
      break;
4328
0
    case ARM_t2LDRSBi12:
4329
0
      MCInst_setOpcode(Inst, (ARM_t2PLIi12));
4330
0
      break;
4331
1.40k
    default:
4332
1.40k
      break;
4333
1.40k
    }
4334
1.40k
  }
4335
4336
2.66k
  switch (MCInst_getOpcode(Inst)) {
4337
613
  case ARM_t2PLDi12:
4338
613
    break;
4339
300
  case ARM_t2PLIi12:
4340
300
    if (!hasV7Ops)
4341
0
      return MCDisassembler_Fail;
4342
300
    break;
4343
426
  case ARM_t2PLDWi12:
4344
426
    if (!hasV7Ops || !hasMP)
4345
0
      return MCDisassembler_Fail;
4346
426
    break;
4347
1.32k
  default:
4348
1.32k
    if (!Check(&S,
4349
1.32k
         DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4350
0
      return MCDisassembler_Fail;
4351
2.66k
  }
4352
4353
2.66k
  if (!Check(&S, DecodeT2AddrModeImm12(Inst, imm, Address, Decoder)))
4354
0
    return MCDisassembler_Fail;
4355
2.66k
  return S;
4356
2.66k
}
4357
4358
static DecodeStatus DecodeT2LoadT(MCInst *Inst, unsigned Insn, uint64_t Address,
4359
          const void *Decoder)
4360
4.28k
{
4361
4.28k
  DecodeStatus S = MCDisassembler_Success;
4362
4363
4.28k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4364
4.28k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4365
4.28k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 8);
4366
4.28k
  imm |= (Rn << 9);
4367
4368
4.28k
  if (Rn == 15) {
4369
1.25k
    switch (MCInst_getOpcode(Inst)) {
4370
324
    case ARM_t2LDRT:
4371
324
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4372
324
      break;
4373
143
    case ARM_t2LDRBT:
4374
143
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4375
143
      break;
4376
360
    case ARM_t2LDRHT:
4377
360
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4378
360
      break;
4379
149
    case ARM_t2LDRSBT:
4380
149
      MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4381
149
      break;
4382
276
    case ARM_t2LDRSHT:
4383
276
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4384
276
      break;
4385
0
    default:
4386
0
      return MCDisassembler_Fail;
4387
1.25k
    }
4388
1.25k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4389
1.25k
  }
4390
4391
3.03k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
4392
0
    return MCDisassembler_Fail;
4393
3.03k
  if (!Check(&S, DecodeT2AddrModeImm8(Inst, imm, Address, Decoder)))
4394
0
    return MCDisassembler_Fail;
4395
3.03k
  return S;
4396
3.03k
}
4397
4398
static DecodeStatus DecodeT2LoadLabel(MCInst *Inst, unsigned Insn,
4399
              uint64_t Address, const void *Decoder)
4400
14.4k
{
4401
14.4k
  DecodeStatus S = MCDisassembler_Success;
4402
4403
14.4k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4404
14.4k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
4405
14.4k
  int imm = fieldFromInstruction_4(Insn, 0, 12);
4406
4407
14.4k
  bool hasV7Ops = ARM_getFeatureBits(Inst->csh->mode, ARM_HasV7Ops);
4408
4409
14.4k
  if (Rt == 15) {
4410
4.56k
    switch (MCInst_getOpcode(Inst)) {
4411
285
    case ARM_t2LDRBpci:
4412
638
    case ARM_t2LDRHpci:
4413
638
      MCInst_setOpcode(Inst, (ARM_t2PLDpci));
4414
638
      break;
4415
139
    case ARM_t2LDRSBpci:
4416
139
      MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4417
139
      break;
4418
11
    case ARM_t2LDRSHpci:
4419
11
      return MCDisassembler_Fail;
4420
3.78k
    default:
4421
3.78k
      break;
4422
4.56k
    }
4423
4.56k
  }
4424
4425
14.4k
  switch (MCInst_getOpcode(Inst)) {
4426
2.32k
  case ARM_t2PLDpci:
4427
2.32k
    break;
4428
2.01k
  case ARM_t2PLIpci:
4429
2.01k
    if (!hasV7Ops)
4430
0
      return MCDisassembler_Fail;
4431
2.01k
    break;
4432
10.1k
  default:
4433
10.1k
    if (!Check(&S,
4434
10.1k
         DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4435
0
      return MCDisassembler_Fail;
4436
14.4k
  }
4437
4438
14.4k
  if (!U) {
4439
    // Special case for #-0.
4440
10.9k
    if (imm == 0)
4441
1.62k
      imm = INT32_MIN;
4442
9.31k
    else
4443
9.31k
      imm = -imm;
4444
10.9k
  }
4445
14.4k
  MCOperand_CreateImm0(Inst, (imm));
4446
4447
14.4k
  return S;
4448
14.4k
}
4449
4450
static DecodeStatus DecodeT2Imm8S4(MCInst *Inst, unsigned Val, uint64_t Address,
4451
           const void *Decoder)
4452
16.8k
{
4453
16.8k
  if (Val == 0)
4454
1.88k
    MCOperand_CreateImm0(Inst, (INT32_MIN));
4455
14.9k
  else {
4456
14.9k
    int imm = Val & 0xFF;
4457
4458
14.9k
    if (!(Val & 0x100))
4459
6.40k
      imm *= -1;
4460
14.9k
    MCOperand_CreateImm0(Inst, (imm * 4));
4461
14.9k
  }
4462
4463
16.8k
  return MCDisassembler_Success;
4464
16.8k
}
4465
4466
static DecodeStatus DecodeT2Imm7S4(MCInst *Inst, unsigned Val, uint64_t Address,
4467
           const void *Decoder)
4468
4.26k
{
4469
4.26k
  if (Val == 0)
4470
1.42k
    MCOperand_CreateImm0(Inst, (INT32_MIN));
4471
2.83k
  else {
4472
2.83k
    int imm = Val & 0x7F;
4473
4474
2.83k
    if (!(Val & 0x80))
4475
1.17k
      imm *= -1;
4476
2.83k
    MCOperand_CreateImm0(Inst, (imm * 4));
4477
2.83k
  }
4478
4479
4.26k
  return MCDisassembler_Success;
4480
4.26k
}
4481
4482
static DecodeStatus DecodeT2AddrModeImm8s4(MCInst *Inst, unsigned Val,
4483
             uint64_t Address,
4484
             const void *Decoder)
4485
12.7k
{
4486
12.7k
  DecodeStatus S = MCDisassembler_Success;
4487
4488
12.7k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
4489
12.7k
  unsigned imm = fieldFromInstruction_4(Val, 0, 9);
4490
4491
12.7k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4492
0
    return MCDisassembler_Fail;
4493
12.7k
  if (!Check(&S, DecodeT2Imm8S4(Inst, imm, Address, Decoder)))
4494
0
    return MCDisassembler_Fail;
4495
4496
12.7k
  return S;
4497
12.7k
}
4498
4499
static DecodeStatus DecodeT2AddrModeImm7s4(MCInst *Inst, unsigned Val,
4500
             uint64_t Address,
4501
             const void *Decoder)
4502
4.26k
{
4503
4.26k
  DecodeStatus S = MCDisassembler_Success;
4504
4505
4.26k
  unsigned Rn = fieldFromInstruction_4(Val, 8, 4);
4506
4.26k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
4507
4508
4.26k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
4509
0
    return MCDisassembler_Fail;
4510
4.26k
  if (!Check(&S, DecodeT2Imm7S4(Inst, imm, Address, Decoder)))
4511
0
    return MCDisassembler_Fail;
4512
4513
4.26k
  return S;
4514
4.26k
}
4515
4516
static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst *Inst, unsigned Val,
4517
            uint64_t Address,
4518
            const void *Decoder)
4519
2.57k
{
4520
2.57k
  DecodeStatus S = MCDisassembler_Success;
4521
4522
2.57k
  unsigned Rn = fieldFromInstruction_4(Val, 8, 4);
4523
2.57k
  unsigned imm = fieldFromInstruction_4(Val, 0, 8);
4524
4525
2.57k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
4526
0
    return MCDisassembler_Fail;
4527
4528
2.57k
  MCOperand_CreateImm0(Inst, (imm));
4529
4530
2.57k
  return S;
4531
2.57k
}
4532
4533
static DecodeStatus DecodeT2Imm8(MCInst *Inst, unsigned Val, uint64_t Address,
4534
         const void *Decoder)
4535
10.8k
{
4536
10.8k
  int imm = Val & 0xFF;
4537
10.8k
  if (Val == 0)
4538
1.54k
    imm = INT32_MIN;
4539
9.31k
  else if (!(Val & 0x100))
4540
3.01k
    imm *= -1;
4541
10.8k
  MCOperand_CreateImm0(Inst, (imm));
4542
4543
10.8k
  return MCDisassembler_Success;
4544
10.8k
}
4545
4546
#define DEFINE_DecodeT2Imm7(shift) \
4547
  static DecodeStatus CONCAT(DecodeT2Imm7, shift)(MCInst * Inst, \
4548
              unsigned Val, \
4549
              uint64_t Address, \
4550
              const void *Decoder) \
4551
8.86k
  { \
4552
8.86k
    int imm = Val & 0x7F; \
4553
8.86k
    if (Val == 0) \
4554
8.86k
      imm = INT32_MIN; \
4555
8.86k
    else if (!(Val & 0x80)) \
4556
6.48k
      imm *= -1; \
4557
8.86k
    if (imm != INT32_MIN) \
4558
8.86k
      imm *= (1U << shift); \
4559
8.86k
    MCOperand_CreateImm0(Inst, (imm)); \
4560
8.86k
\
4561
8.86k
    return MCDisassembler_Success; \
4562
8.86k
  }
ARMDisassembler.c:DecodeT2Imm7_0
Line
Count
Source
4551
3.29k
  { \
4552
3.29k
    int imm = Val & 0x7F; \
4553
3.29k
    if (Val == 0) \
4554
3.29k
      imm = INT32_MIN; \
4555
3.29k
    else if (!(Val & 0x80)) \
4556
2.50k
      imm *= -1; \
4557
3.29k
    if (imm != INT32_MIN) \
4558
3.29k
      imm *= (1U << shift); \
4559
3.29k
    MCOperand_CreateImm0(Inst, (imm)); \
4560
3.29k
\
4561
3.29k
    return MCDisassembler_Success; \
4562
3.29k
  }
ARMDisassembler.c:DecodeT2Imm7_1
Line
Count
Source
4551
3.52k
  { \
4552
3.52k
    int imm = Val & 0x7F; \
4553
3.52k
    if (Val == 0) \
4554
3.52k
      imm = INT32_MIN; \
4555
3.52k
    else if (!(Val & 0x80)) \
4556
2.34k
      imm *= -1; \
4557
3.52k
    if (imm != INT32_MIN) \
4558
3.52k
      imm *= (1U << shift); \
4559
3.52k
    MCOperand_CreateImm0(Inst, (imm)); \
4560
3.52k
\
4561
3.52k
    return MCDisassembler_Success; \
4562
3.52k
  }
ARMDisassembler.c:DecodeT2Imm7_2
Line
Count
Source
4551
2.04k
  { \
4552
2.04k
    int imm = Val & 0x7F; \
4553
2.04k
    if (Val == 0) \
4554
2.04k
      imm = INT32_MIN; \
4555
2.04k
    else if (!(Val & 0x80)) \
4556
1.63k
      imm *= -1; \
4557
2.04k
    if (imm != INT32_MIN) \
4558
2.04k
      imm *= (1U << shift); \
4559
2.04k
    MCOperand_CreateImm0(Inst, (imm)); \
4560
2.04k
\
4561
2.04k
    return MCDisassembler_Success; \
4562
2.04k
  }
4563
DEFINE_DecodeT2Imm7(0);
4564
DEFINE_DecodeT2Imm7(1);
4565
DEFINE_DecodeT2Imm7(2);
4566
4567
static DecodeStatus DecodeT2AddrModeImm8(MCInst *Inst, unsigned Val,
4568
           uint64_t Address, const void *Decoder)
4569
10.8k
{
4570
10.8k
  DecodeStatus S = MCDisassembler_Success;
4571
4572
10.8k
  unsigned Rn = fieldFromInstruction_4(Val, 9, 4);
4573
10.8k
  unsigned imm = fieldFromInstruction_4(Val, 0, 9);
4574
4575
  // Thumb stores cannot use PC as dest register.
4576
10.8k
  switch (MCInst_getOpcode(Inst)) {
4577
424
  case ARM_t2STRT:
4578
882
  case ARM_t2STRBT:
4579
1.30k
  case ARM_t2STRHT:
4580
1.43k
  case ARM_t2STRi8:
4581
1.76k
  case ARM_t2STRHi8:
4582
2.26k
  case ARM_t2STRBi8:
4583
2.26k
    if (Rn == 15)
4584
6
      return MCDisassembler_Fail;
4585
2.25k
    break;
4586
8.60k
  default:
4587
8.60k
    break;
4588
10.8k
  }
4589
4590
  // Some instructions always use an additive offset.
4591
10.8k
  switch (MCInst_getOpcode(Inst)) {
4592
710
  case ARM_t2LDRT:
4593
1.48k
  case ARM_t2LDRBT:
4594
2.17k
  case ARM_t2LDRHT:
4595
2.65k
  case ARM_t2LDRSBT:
4596
3.03k
  case ARM_t2LDRSHT:
4597
3.45k
  case ARM_t2STRT:
4598
3.91k
  case ARM_t2STRBT:
4599
4.33k
  case ARM_t2STRHT:
4600
4.33k
    imm |= 0x100;
4601
4.33k
    break;
4602
6.53k
  default:
4603
6.53k
    break;
4604
10.8k
  }
4605
4606
10.8k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4607
0
    return MCDisassembler_Fail;
4608
10.8k
  if (!Check(&S, DecodeT2Imm8(Inst, imm, Address, Decoder)))
4609
0
    return MCDisassembler_Fail;
4610
4611
10.8k
  return S;
4612
10.8k
}
4613
4614
#define DEFINE_DecodeTAddrModeImm7(shift) \
4615
  static DecodeStatus CONCAT(DecodeTAddrModeImm7, shift)( \
4616
    MCInst * Inst, unsigned Val, uint64_t Address, \
4617
    const void *Decoder) \
4618
2.07k
  { \
4619
2.07k
    DecodeStatus S = MCDisassembler_Success; \
4620
2.07k
\
4621
2.07k
    unsigned Rn = fieldFromInstruction_4(Val, 8, 3); \
4622
2.07k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4623
2.07k
\
4624
2.07k
    if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, \
4625
2.07k
                   Decoder))) \
4626
2.07k
      return MCDisassembler_Fail; \
4627
2.07k
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4628
2.07k
                 Decoder))) \
4629
2.07k
      return MCDisassembler_Fail; \
4630
2.07k
\
4631
2.07k
    return S; \
4632
2.07k
  }
ARMDisassembler.c:DecodeTAddrModeImm7_0
Line
Count
Source
4618
1.19k
  { \
4619
1.19k
    DecodeStatus S = MCDisassembler_Success; \
4620
1.19k
\
4621
1.19k
    unsigned Rn = fieldFromInstruction_4(Val, 8, 3); \
4622
1.19k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4623
1.19k
\
4624
1.19k
    if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, \
4625
1.19k
                   Decoder))) \
4626
1.19k
      return MCDisassembler_Fail; \
4627
1.19k
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4628
1.19k
                 Decoder))) \
4629
1.19k
      return MCDisassembler_Fail; \
4630
1.19k
\
4631
1.19k
    return S; \
4632
1.19k
  }
ARMDisassembler.c:DecodeTAddrModeImm7_1
Line
Count
Source
4618
877
  { \
4619
877
    DecodeStatus S = MCDisassembler_Success; \
4620
877
\
4621
877
    unsigned Rn = fieldFromInstruction_4(Val, 8, 3); \
4622
877
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4623
877
\
4624
877
    if (!Check(&S, DecodetGPRRegisterClass(Inst, Rn, Address, \
4625
877
                   Decoder))) \
4626
877
      return MCDisassembler_Fail; \
4627
877
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4628
877
                 Decoder))) \
4629
877
      return MCDisassembler_Fail; \
4630
877
\
4631
877
    return S; \
4632
877
  }
4633
DEFINE_DecodeTAddrModeImm7(0);
4634
DEFINE_DecodeTAddrModeImm7(1);
4635
4636
#define DEFINE_DecodeT2AddrModeImm7(shift, WriteBack) \
4637
  static DecodeStatus CONCAT(DecodeT2AddrModeImm7, \
4638
           CONCAT(shift, WriteBack))( \
4639
    MCInst * Inst, unsigned Val, uint64_t Address, \
4640
    const void *Decoder) \
4641
4.39k
  { \
4642
4.39k
    DecodeStatus S = MCDisassembler_Success; \
4643
4.39k
\
4644
4.39k
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4645
4.39k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4646
4.39k
    if (WriteBack) { \
4647
2.09k
      if (!Check(&S, DecoderGPRRegisterClass( \
4648
2.09k
                 Inst, Rn, Address, Decoder))) \
4649
2.09k
        return MCDisassembler_Fail; \
4650
2.30k
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4651
2.30k
                Inst, Rn, Address, Decoder))) \
4652
2.30k
      return MCDisassembler_Fail; \
4653
4.39k
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4654
4.39k
                 Decoder))) \
4655
4.39k
      return MCDisassembler_Fail; \
4656
4.39k
\
4657
4.39k
    return S; \
4658
4.39k
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_0_0
Line
Count
Source
4641
783
  { \
4642
783
    DecodeStatus S = MCDisassembler_Success; \
4643
783
\
4644
783
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4645
783
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4646
783
    if (WriteBack) { \
4647
0
      if (!Check(&S, DecoderGPRRegisterClass( \
4648
0
                 Inst, Rn, Address, Decoder))) \
4649
0
        return MCDisassembler_Fail; \
4650
783
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4651
783
                Inst, Rn, Address, Decoder))) \
4652
783
      return MCDisassembler_Fail; \
4653
783
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4654
783
                 Decoder))) \
4655
783
      return MCDisassembler_Fail; \
4656
783
\
4657
783
    return S; \
4658
783
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_1_0
Line
Count
Source
4641
915
  { \
4642
915
    DecodeStatus S = MCDisassembler_Success; \
4643
915
\
4644
915
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4645
915
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4646
915
    if (WriteBack) { \
4647
0
      if (!Check(&S, DecoderGPRRegisterClass( \
4648
0
                 Inst, Rn, Address, Decoder))) \
4649
0
        return MCDisassembler_Fail; \
4650
915
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4651
915
                Inst, Rn, Address, Decoder))) \
4652
915
      return MCDisassembler_Fail; \
4653
915
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4654
915
                 Decoder))) \
4655
915
      return MCDisassembler_Fail; \
4656
915
\
4657
915
    return S; \
4658
915
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_0_1
Line
Count
Source
4641
503
  { \
4642
503
    DecodeStatus S = MCDisassembler_Success; \
4643
503
\
4644
503
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4645
503
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4646
503
    if (WriteBack) { \
4647
503
      if (!Check(&S, DecoderGPRRegisterClass( \
4648
503
                 Inst, Rn, Address, Decoder))) \
4649
503
        return MCDisassembler_Fail; \
4650
503
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4651
0
                Inst, Rn, Address, Decoder))) \
4652
0
      return MCDisassembler_Fail; \
4653
503
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4654
503
                 Decoder))) \
4655
503
      return MCDisassembler_Fail; \
4656
503
\
4657
503
    return S; \
4658
503
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_1_1
Line
Count
Source
4641
820
  { \
4642
820
    DecodeStatus S = MCDisassembler_Success; \
4643
820
\
4644
820
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4645
820
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4646
820
    if (WriteBack) { \
4647
820
      if (!Check(&S, DecoderGPRRegisterClass( \
4648
820
                 Inst, Rn, Address, Decoder))) \
4649
820
        return MCDisassembler_Fail; \
4650
820
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4651
0
                Inst, Rn, Address, Decoder))) \
4652
0
      return MCDisassembler_Fail; \
4653
820
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4654
820
                 Decoder))) \
4655
820
      return MCDisassembler_Fail; \
4656
820
\
4657
820
    return S; \
4658
820
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_2_0
Line
Count
Source
4641
609
  { \
4642
609
    DecodeStatus S = MCDisassembler_Success; \
4643
609
\
4644
609
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4645
609
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4646
609
    if (WriteBack) { \
4647
0
      if (!Check(&S, DecoderGPRRegisterClass( \
4648
0
                 Inst, Rn, Address, Decoder))) \
4649
0
        return MCDisassembler_Fail; \
4650
609
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4651
609
                Inst, Rn, Address, Decoder))) \
4652
609
      return MCDisassembler_Fail; \
4653
609
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4654
609
                 Decoder))) \
4655
609
      return MCDisassembler_Fail; \
4656
609
\
4657
609
    return S; \
4658
609
  }
ARMDisassembler.c:DecodeT2AddrModeImm7_2_1
Line
Count
Source
4641
768
  { \
4642
768
    DecodeStatus S = MCDisassembler_Success; \
4643
768
\
4644
768
    unsigned Rn = fieldFromInstruction_4(Val, 8, 4); \
4645
768
    unsigned imm = fieldFromInstruction_4(Val, 0, 8); \
4646
768
    if (WriteBack) { \
4647
768
      if (!Check(&S, DecoderGPRRegisterClass( \
4648
768
                 Inst, Rn, Address, Decoder))) \
4649
768
        return MCDisassembler_Fail; \
4650
768
    } else if (!Check(&S, DecodeGPRnopcRegisterClass( \
4651
0
                Inst, Rn, Address, Decoder))) \
4652
0
      return MCDisassembler_Fail; \
4653
768
    if (!Check(&S, CONCAT(DecodeT2Imm7, shift)(Inst, imm, Address, \
4654
768
                 Decoder))) \
4655
768
      return MCDisassembler_Fail; \
4656
768
\
4657
768
    return S; \
4658
768
  }
4659
DEFINE_DecodeT2AddrModeImm7(0, 0);
4660
DEFINE_DecodeT2AddrModeImm7(1, 0);
4661
DEFINE_DecodeT2AddrModeImm7(2, 0);
4662
DEFINE_DecodeT2AddrModeImm7(0, 1);
4663
DEFINE_DecodeT2AddrModeImm7(1, 1);
4664
DEFINE_DecodeT2AddrModeImm7(2, 1);
4665
4666
static DecodeStatus DecodeT2LdStPre(MCInst *Inst, unsigned Insn,
4667
            uint64_t Address, const void *Decoder)
4668
7.03k
{
4669
7.03k
  DecodeStatus S = MCDisassembler_Success;
4670
4671
7.03k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
4672
7.03k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4673
7.03k
  unsigned addr = fieldFromInstruction_4(Insn, 0, 8);
4674
7.03k
  addr |= fieldFromInstruction_4(Insn, 9, 1) << 8;
4675
7.03k
  addr |= Rn << 9;
4676
7.03k
  unsigned load = fieldFromInstruction_4(Insn, 20, 1);
4677
4678
7.03k
  if (Rn == 15) {
4679
3.05k
    switch (MCInst_getOpcode(Inst)) {
4680
371
    case ARM_t2LDR_PRE:
4681
827
    case ARM_t2LDR_POST:
4682
827
      MCInst_setOpcode(Inst, (ARM_t2LDRpci));
4683
827
      break;
4684
256
    case ARM_t2LDRB_PRE:
4685
385
    case ARM_t2LDRB_POST:
4686
385
      MCInst_setOpcode(Inst, (ARM_t2LDRBpci));
4687
385
      break;
4688
256
    case ARM_t2LDRH_PRE:
4689
491
    case ARM_t2LDRH_POST:
4690
491
      MCInst_setOpcode(Inst, (ARM_t2LDRHpci));
4691
491
      break;
4692
424
    case ARM_t2LDRSB_PRE:
4693
769
    case ARM_t2LDRSB_POST:
4694
769
      if (Rt == 15)
4695
331
        MCInst_setOpcode(Inst, (ARM_t2PLIpci));
4696
438
      else
4697
438
        MCInst_setOpcode(Inst, (ARM_t2LDRSBpci));
4698
769
      break;
4699
255
    case ARM_t2LDRSH_PRE:
4700
574
    case ARM_t2LDRSH_POST:
4701
574
      MCInst_setOpcode(Inst, (ARM_t2LDRSHpci));
4702
574
      break;
4703
8
    default:
4704
8
      return MCDisassembler_Fail;
4705
3.05k
    }
4706
3.04k
    return DecodeT2LoadLabel(Inst, Insn, Address, Decoder);
4707
3.05k
  }
4708
4709
3.97k
  if (!load) {
4710
1.80k
    if (!Check(&S,
4711
1.80k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4712
0
      return MCDisassembler_Fail;
4713
1.80k
  }
4714
4715
3.97k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
4716
0
    return MCDisassembler_Fail;
4717
4718
3.97k
  if (load) {
4719
2.16k
    if (!Check(&S,
4720
2.16k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4721
0
      return MCDisassembler_Fail;
4722
2.16k
  }
4723
4724
3.97k
  if (!Check(&S, DecodeT2AddrModeImm8(Inst, addr, Address, Decoder)))
4725
0
    return MCDisassembler_Fail;
4726
4727
3.97k
  return S;
4728
3.97k
}
4729
4730
static DecodeStatus DecodeT2AddrModeImm12(MCInst *Inst, unsigned Val,
4731
            uint64_t Address, const void *Decoder)
4732
2.03k
{
4733
2.03k
  DecodeStatus S = MCDisassembler_Success;
4734
4735
2.03k
  unsigned Rn = fieldFromInstruction_4(Val, 13, 4);
4736
2.03k
  unsigned imm = fieldFromInstruction_4(Val, 0, 12);
4737
4738
  // Thumb stores cannot use PC as dest register.
4739
2.03k
  switch (MCInst_getOpcode(Inst)) {
4740
365
  case ARM_t2STRi12:
4741
468
  case ARM_t2STRBi12:
4742
666
  case ARM_t2STRHi12:
4743
666
    if (Rn == 15)
4744
3
      return MCDisassembler_Fail;
4745
663
    break;
4746
1.37k
  default:
4747
1.37k
    break;
4748
2.03k
  }
4749
4750
2.03k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4751
0
    return MCDisassembler_Fail;
4752
2.03k
  MCOperand_CreateImm0(Inst, (imm));
4753
4754
2.03k
  return S;
4755
2.03k
}
4756
4757
static DecodeStatus DecodeThumbAddSPImm(MCInst *Inst, uint16_t Insn,
4758
          uint64_t Address, const void *Decoder)
4759
2.33k
{
4760
2.33k
  unsigned imm = fieldFromInstruction_2(Insn, 0, 7);
4761
4762
2.33k
  MCOperand_CreateReg0(Inst, (ARM_SP));
4763
2.33k
  MCOperand_CreateReg0(Inst, (ARM_SP));
4764
2.33k
  MCOperand_CreateImm0(Inst, (imm));
4765
4766
2.33k
  return MCDisassembler_Success;
4767
2.33k
}
4768
4769
static DecodeStatus DecodeThumbAddSPReg(MCInst *Inst, uint16_t Insn,
4770
          uint64_t Address, const void *Decoder)
4771
1.17k
{
4772
1.17k
  DecodeStatus S = MCDisassembler_Success;
4773
4774
1.17k
  if (MCInst_getOpcode(Inst) == ARM_tADDrSP) {
4775
784
    unsigned Rdm = fieldFromInstruction_2(Insn, 0, 3);
4776
784
    Rdm |= fieldFromInstruction_2(Insn, 7, 1) << 3;
4777
4778
784
    if (!Check(&S,
4779
784
         DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
4780
0
      return MCDisassembler_Fail;
4781
784
    MCOperand_CreateReg0(Inst, (ARM_SP));
4782
784
    if (!Check(&S,
4783
784
         DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
4784
0
      return MCDisassembler_Fail;
4785
784
  } else if (MCInst_getOpcode(Inst) == ARM_tADDspr) {
4786
394
    unsigned Rm = fieldFromInstruction_2(Insn, 3, 4);
4787
4788
394
    MCOperand_CreateReg0(Inst, (ARM_SP));
4789
394
    MCOperand_CreateReg0(Inst, (ARM_SP));
4790
394
    if (!Check(&S,
4791
394
         DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4792
0
      return MCDisassembler_Fail;
4793
394
  }
4794
4795
1.17k
  return S;
4796
1.17k
}
4797
4798
static DecodeStatus DecodeThumbCPS(MCInst *Inst, uint16_t Insn,
4799
           uint64_t Address, const void *Decoder)
4800
969
{
4801
969
  unsigned imod = fieldFromInstruction_2(Insn, 4, 1) | 0x2;
4802
969
  unsigned flags = fieldFromInstruction_2(Insn, 0, 3);
4803
4804
969
  MCOperand_CreateImm0(Inst, (imod));
4805
969
  MCOperand_CreateImm0(Inst, (flags));
4806
4807
969
  return MCDisassembler_Success;
4808
969
}
4809
4810
static DecodeStatus DecodePostIdxReg(MCInst *Inst, unsigned Insn,
4811
             uint64_t Address, const void *Decoder)
4812
2.88k
{
4813
2.88k
  DecodeStatus S = MCDisassembler_Success;
4814
2.88k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4815
2.88k
  unsigned add = fieldFromInstruction_4(Insn, 4, 1);
4816
4817
2.88k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
4818
0
    return MCDisassembler_Fail;
4819
2.88k
  MCOperand_CreateImm0(Inst, (add));
4820
4821
2.88k
  return S;
4822
2.88k
}
4823
4824
static DecodeStatus DecodeMveAddrModeRQ(MCInst *Inst, unsigned Insn,
4825
          uint64_t Address, const void *Decoder)
4826
458
{
4827
458
  DecodeStatus S = MCDisassembler_Success;
4828
458
  unsigned Rn = fieldFromInstruction_4(Insn, 3, 4);
4829
458
  unsigned Qm = fieldFromInstruction_4(Insn, 0, 3);
4830
4831
458
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
4832
0
    return MCDisassembler_Fail;
4833
458
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, Decoder)))
4834
0
    return MCDisassembler_Fail;
4835
4836
458
  return S;
4837
458
}
4838
4839
#define DEFINE_DecodeMveAddrModeQ(shift) \
4840
  static DecodeStatus CONCAT(DecodeMveAddrModeQ, shift)( \
4841
    MCInst * Inst, unsigned Insn, uint64_t Address, \
4842
    const void *Decoder) \
4843
2.18k
  { \
4844
2.18k
    DecodeStatus S = MCDisassembler_Success; \
4845
2.18k
    unsigned Qm = fieldFromInstruction_4(Insn, 8, 3); \
4846
2.18k
    int imm = fieldFromInstruction_4(Insn, 0, 7); \
4847
2.18k
\
4848
2.18k
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, \
4849
2.18k
                   Decoder))) \
4850
2.18k
      return MCDisassembler_Fail; \
4851
2.18k
\
4852
2.18k
    if (!fieldFromInstruction_4(Insn, 7, 1)) { \
4853
1.23k
      if (imm == 0) \
4854
1.23k
        imm = INT32_MIN; \
4855
1.23k
      else \
4856
1.23k
        imm *= -1; \
4857
1.23k
    } \
4858
2.18k
    if (imm != INT32_MIN) \
4859
2.18k
      imm *= (1U << shift); \
4860
2.18k
    MCOperand_CreateImm0(Inst, (imm)); \
4861
2.18k
\
4862
2.18k
    return S; \
4863
2.18k
  }
ARMDisassembler.c:DecodeMveAddrModeQ_2
Line
Count
Source
4843
1.54k
  { \
4844
1.54k
    DecodeStatus S = MCDisassembler_Success; \
4845
1.54k
    unsigned Qm = fieldFromInstruction_4(Insn, 8, 3); \
4846
1.54k
    int imm = fieldFromInstruction_4(Insn, 0, 7); \
4847
1.54k
\
4848
1.54k
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, \
4849
1.54k
                   Decoder))) \
4850
1.54k
      return MCDisassembler_Fail; \
4851
1.54k
\
4852
1.54k
    if (!fieldFromInstruction_4(Insn, 7, 1)) { \
4853
913
      if (imm == 0) \
4854
913
        imm = INT32_MIN; \
4855
913
      else \
4856
913
        imm *= -1; \
4857
913
    } \
4858
1.54k
    if (imm != INT32_MIN) \
4859
1.54k
      imm *= (1U << shift); \
4860
1.54k
    MCOperand_CreateImm0(Inst, (imm)); \
4861
1.54k
\
4862
1.54k
    return S; \
4863
1.54k
  }
ARMDisassembler.c:DecodeMveAddrModeQ_3
Line
Count
Source
4843
639
  { \
4844
639
    DecodeStatus S = MCDisassembler_Success; \
4845
639
    unsigned Qm = fieldFromInstruction_4(Insn, 8, 3); \
4846
639
    int imm = fieldFromInstruction_4(Insn, 0, 7); \
4847
639
\
4848
639
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, \
4849
639
                   Decoder))) \
4850
639
      return MCDisassembler_Fail; \
4851
639
\
4852
639
    if (!fieldFromInstruction_4(Insn, 7, 1)) { \
4853
326
      if (imm == 0) \
4854
326
        imm = INT32_MIN; \
4855
326
      else \
4856
326
        imm *= -1; \
4857
326
    } \
4858
639
    if (imm != INT32_MIN) \
4859
639
      imm *= (1U << shift); \
4860
639
    MCOperand_CreateImm0(Inst, (imm)); \
4861
639
\
4862
639
    return S; \
4863
639
  }
4864
DEFINE_DecodeMveAddrModeQ(2);
4865
DEFINE_DecodeMveAddrModeQ(3);
4866
4867
static DecodeStatus DecodeThumbBLXOffset(MCInst *Inst, unsigned Val,
4868
           uint64_t Address, const void *Decoder)
4869
221
{
4870
  // Val is passed in as S:J1:J2:imm10H:imm10L:'0'
4871
  // Note only one trailing zero not two.  Also the J1 and J2 values are from
4872
  // the encoded instruction.  So here change to I1 and I2 values via:
4873
  // I1 = NOT(J1 EOR S);
4874
  // I2 = NOT(J2 EOR S);
4875
  // and build the imm32 with two trailing zeros as documented:
4876
  // imm32 = SignExtend(S:I1:I2:imm10H:imm10L:'00', 32);
4877
221
  unsigned S = (Val >> 23) & 1;
4878
221
  unsigned J1 = (Val >> 22) & 1;
4879
221
  unsigned J2 = (Val >> 21) & 1;
4880
221
  unsigned I1 = !(J1 ^ S);
4881
221
  unsigned I2 = !(J2 ^ S);
4882
221
  unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
4883
221
  int imm32 = SignExtend32((tmp << 1), 25);
4884
4885
221
  if (!tryAddingSymbolicOperand(Address, (Address & ~2u) + imm32 + 4,
4886
221
              true, 4, Inst, Decoder))
4887
221
    MCOperand_CreateImm0(Inst, (imm32));
4888
221
  return MCDisassembler_Success;
4889
221
}
4890
4891
static DecodeStatus DecodeCoprocessor(MCInst *Inst, unsigned Val,
4892
              uint64_t Address, const void *Decoder)
4893
36.4k
{
4894
36.4k
  if (Val == 0xA || Val == 0xB)
4895
509
    return MCDisassembler_Fail;
4896
4897
35.9k
  if (!isValidCoprocessorNumber(Inst, Val))
4898
38
    return MCDisassembler_Fail;
4899
4900
35.9k
  MCOperand_CreateImm0(Inst, (Val));
4901
35.9k
  return MCDisassembler_Success;
4902
35.9k
}
4903
4904
static DecodeStatus DecodeThumbTableBranch(MCInst *Inst, unsigned Insn,
4905
             uint64_t Address,
4906
             const void *Decoder)
4907
579
{
4908
579
  DecodeStatus S = MCDisassembler_Success;
4909
4910
579
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
4911
579
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
4912
4913
579
  if (Rn == 13 && !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops))
4914
190
    S = MCDisassembler_SoftFail;
4915
579
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4916
0
    return MCDisassembler_Fail;
4917
579
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
4918
0
    return MCDisassembler_Fail;
4919
579
  return S;
4920
579
}
4921
4922
static DecodeStatus DecodeThumb2BCCInstruction(MCInst *Inst, unsigned Insn,
4923
                 uint64_t Address,
4924
                 const void *Decoder)
4925
3.30k
{
4926
3.30k
  DecodeStatus S = MCDisassembler_Success;
4927
4928
3.30k
  unsigned pred = fieldFromInstruction_4(Insn, 22, 4);
4929
3.30k
  if (pred == 0xE || pred == 0xF) {
4930
218
    unsigned opc = fieldFromInstruction_4(Insn, 4, 28);
4931
218
    switch (opc) {
4932
218
    default:
4933
218
      return MCDisassembler_Fail;
4934
0
    case 0xf3bf8f4:
4935
0
      MCInst_setOpcode(Inst, (ARM_t2DSB));
4936
0
      break;
4937
0
    case 0xf3bf8f5:
4938
0
      MCInst_setOpcode(Inst, (ARM_t2DMB));
4939
0
      break;
4940
0
    case 0xf3bf8f6:
4941
0
      MCInst_setOpcode(Inst, (ARM_t2ISB));
4942
0
      break;
4943
218
    }
4944
4945
0
    unsigned imm = fieldFromInstruction_4(Insn, 0, 4);
4946
0
    return DecodeMemBarrierOption(Inst, imm, Address, Decoder);
4947
218
  }
4948
4949
3.09k
  unsigned brtarget = fieldFromInstruction_4(Insn, 0, 11) << 1;
4950
3.09k
  brtarget |= fieldFromInstruction_4(Insn, 11, 1) << 19;
4951
3.09k
  brtarget |= fieldFromInstruction_4(Insn, 13, 1) << 18;
4952
3.09k
  brtarget |= fieldFromInstruction_4(Insn, 16, 6) << 12;
4953
3.09k
  brtarget |= fieldFromInstruction_4(Insn, 26, 1) << 20;
4954
4955
3.09k
  if (!Check(&S, DecodeT2BROperand(Inst, brtarget, Address, Decoder)))
4956
0
    return MCDisassembler_Fail;
4957
3.09k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4958
0
    return MCDisassembler_Fail;
4959
4960
3.09k
  return S;
4961
3.09k
}
4962
4963
// Decode a shifted immediate operand.  These basically consist
4964
// of an 8-bit value, and a 4-bit directive that specifies either
4965
// a splat operation or a rotation.
4966
static DecodeStatus DecodeT2SOImm(MCInst *Inst, unsigned Val, uint64_t Address,
4967
          const void *Decoder)
4968
11.7k
{
4969
11.7k
  unsigned ctrl = fieldFromInstruction_4(Val, 10, 2);
4970
11.7k
  if (ctrl == 0) {
4971
6.46k
    unsigned byte = fieldFromInstruction_4(Val, 8, 2);
4972
6.46k
    unsigned imm = fieldFromInstruction_4(Val, 0, 8);
4973
6.46k
    switch (byte) {
4974
3.21k
    case 0:
4975
3.21k
      MCOperand_CreateImm0(Inst, (imm));
4976
3.21k
      break;
4977
1.08k
    case 1:
4978
1.08k
      MCOperand_CreateImm0(Inst, ((imm << 16) | imm));
4979
1.08k
      break;
4980
1.45k
    case 2:
4981
1.45k
      MCOperand_CreateImm0(Inst, ((imm << 24) | (imm << 8)));
4982
1.45k
      break;
4983
709
    case 3:
4984
709
      MCOperand_CreateImm0(Inst, ((imm << 24) | (imm << 16) |
4985
709
                (imm << 8) | imm));
4986
709
      break;
4987
6.46k
    }
4988
6.46k
  } else {
4989
5.30k
    unsigned unrot = fieldFromInstruction_4(Val, 0, 7) | 0x80;
4990
5.30k
    unsigned rot = fieldFromInstruction_4(Val, 7, 5);
4991
5.30k
    unsigned imm = (unrot >> rot) | (unrot << ((32 - rot) & 31));
4992
5.30k
    MCOperand_CreateImm0(Inst, (imm));
4993
5.30k
  }
4994
4995
11.7k
  return MCDisassembler_Success;
4996
11.7k
}
4997
4998
static DecodeStatus DecodeThumbBCCTargetOperand(MCInst *Inst, unsigned Val,
4999
            uint64_t Address,
5000
            const void *Decoder)
5001
22.1k
{
5002
22.1k
  if (!tryAddingSymbolicOperand(Address,
5003
22.1k
              Address + SignExtend32((Val << 1), 9) + 4,
5004
22.1k
              true, 2, Inst, Decoder))
5005
22.1k
    MCOperand_CreateImm0(Inst, (SignExtend32((Val << 1), 9)));
5006
22.1k
  return MCDisassembler_Success;
5007
22.1k
}
5008
5009
static DecodeStatus DecodeThumbBLTargetOperand(MCInst *Inst, unsigned Val,
5010
                 uint64_t Address,
5011
                 const void *Decoder)
5012
3.22k
{
5013
  // Val is passed in as S:J1:J2:imm10:imm11
5014
  // Note no trailing zero after imm11.  Also the J1 and J2 values are from
5015
  // the encoded instruction.  So here change to I1 and I2 values via:
5016
  // I1 = NOT(J1 EOR S);
5017
  // I2 = NOT(J2 EOR S);
5018
  // and build the imm32 with one trailing zero as documented:
5019
  // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
5020
3.22k
  unsigned S = (Val >> 23) & 1;
5021
3.22k
  unsigned J1 = (Val >> 22) & 1;
5022
3.22k
  unsigned J2 = (Val >> 21) & 1;
5023
3.22k
  unsigned I1 = !(J1 ^ S);
5024
3.22k
  unsigned I2 = !(J2 ^ S);
5025
3.22k
  unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
5026
3.22k
  int imm32 = SignExtend32((tmp << 1), 25);
5027
5028
3.22k
  if (!tryAddingSymbolicOperand(Address, Address + imm32 + 4, true, 4,
5029
3.22k
              Inst, Decoder))
5030
3.22k
    MCOperand_CreateImm0(Inst, (imm32));
5031
3.22k
  return MCDisassembler_Success;
5032
3.22k
}
5033
5034
static DecodeStatus DecodeMemBarrierOption(MCInst *Inst, unsigned Val,
5035
             uint64_t Address,
5036
             const void *Decoder)
5037
6.28k
{
5038
6.28k
  if (Val & ~0xf)
5039
0
    return MCDisassembler_Fail;
5040
5041
6.28k
  MCOperand_CreateImm0(Inst, (Val));
5042
6.28k
  return MCDisassembler_Success;
5043
6.28k
}
5044
5045
static DecodeStatus DecodeInstSyncBarrierOption(MCInst *Inst, unsigned Val,
5046
            uint64_t Address,
5047
            const void *Decoder)
5048
1.67k
{
5049
1.67k
  if (Val & ~0xf)
5050
0
    return MCDisassembler_Fail;
5051
5052
1.67k
  MCOperand_CreateImm0(Inst, (Val));
5053
1.67k
  return MCDisassembler_Success;
5054
1.67k
}
5055
5056
static DecodeStatus DecodeMSRMask(MCInst *Inst, unsigned Val, uint64_t Address,
5057
          const void *Decoder)
5058
8.23k
{
5059
8.23k
  DecodeStatus S = MCDisassembler_Success;
5060
5061
8.23k
  if (ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureMClass)) {
5062
7.40k
    unsigned ValLow = Val & 0xff;
5063
5064
    // Validate the SYSm value first.
5065
7.40k
    switch (ValLow) {
5066
279
    case 0:  // apsr
5067
563
    case 1:  // iapsr
5068
762
    case 2:  // eapsr
5069
976
    case 3:  // xpsr
5070
1.05k
    case 5:  // ipsr
5071
1.16k
    case 6:  // epsr
5072
1.22k
    case 7:  // iepsr
5073
1.66k
    case 8:  // msp
5074
1.67k
    case 9:  // psp
5075
1.87k
    case 16: // primask
5076
1.95k
    case 20: // control
5077
1.95k
      break;
5078
80
    case 17: // basepri
5079
386
    case 18: // basepri_max
5080
609
    case 19: // faultmask
5081
609
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5082
609
             ARM_HasV7Ops)))
5083
        // Values basepri, basepri_max and faultmask are only valid for
5084
        // v7m.
5085
0
        return MCDisassembler_Fail;
5086
609
      break;
5087
609
    case 0x8a: // msplim_ns
5088
339
    case 0x8b: // psplim_ns
5089
438
    case 0x91: // basepri_ns
5090
511
    case 0x93: // faultmask_ns
5091
511
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5092
511
             ARM_HasV8MMainlineOps)))
5093
0
        return MCDisassembler_Fail;
5094
      // fall through
5095
530
    case 10:   // msplim
5096
834
    case 11:   // psplim
5097
908
    case 0x88: // msp_ns
5098
985
    case 0x89: // psp_ns
5099
1.18k
    case 0x90: // primask_ns
5100
1.23k
    case 0x94: // control_ns
5101
1.30k
    case 0x98: // sp_ns
5102
1.30k
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5103
1.30k
             ARM_Feature8MSecExt)))
5104
0
        return MCDisassembler_Fail;
5105
1.30k
      break;
5106
1.30k
    case 0x20: // pac_key_p_0
5107
178
    case 0x21: // pac_key_p_1
5108
433
    case 0x22: // pac_key_p_2
5109
699
    case 0x23: // pac_key_p_3
5110
890
    case 0x24: // pac_key_u_0
5111
1.09k
    case 0x25: // pac_key_u_1
5112
1.16k
    case 0x26: // pac_key_u_2
5113
1.23k
    case 0x27: // pac_key_u_3
5114
1.63k
    case 0xa0: // pac_key_p_0_ns
5115
1.82k
    case 0xa1: // pac_key_p_1_ns
5116
1.88k
    case 0xa2: // pac_key_p_2_ns
5117
1.95k
    case 0xa3: // pac_key_p_3_ns
5118
2.12k
    case 0xa4: // pac_key_u_0_ns
5119
2.56k
    case 0xa5: // pac_key_u_1_ns
5120
2.62k
    case 0xa6: // pac_key_u_2_ns
5121
2.69k
    case 0xa7: // pac_key_u_3_ns
5122
2.69k
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5123
2.69k
             ARM_FeaturePACBTI)))
5124
0
        return MCDisassembler_Fail;
5125
2.69k
      break;
5126
2.69k
    default:
5127
      // Architecturally defined as unpredictable
5128
841
      S = MCDisassembler_SoftFail;
5129
841
      break;
5130
7.40k
    }
5131
5132
7.40k
    if (MCInst_getOpcode(Inst) == ARM_t2MSR_M) {
5133
6.34k
      unsigned Mask = fieldFromInstruction_4(Val, 10, 2);
5134
6.34k
      if (!(ARM_getFeatureBits(Inst->csh->mode,
5135
6.34k
             ARM_HasV7Ops))) {
5136
        // The ARMv6-M MSR bits {11-10} can be only 0b10, other values
5137
        // are unpredictable.
5138
0
        if (Mask != 2)
5139
0
          S = MCDisassembler_SoftFail;
5140
6.34k
      } else {
5141
        // The ARMv7-M architecture stores an additional 2-bit mask
5142
        // value in MSR bits {11-10}. The mask is used only with apsr,
5143
        // iapsr, eapsr and xpsr, it has to be 0b10 in other cases. Bit
5144
        // mask{1} indicates if the NZCVQ bits should be moved by the
5145
        // instruction. Bit mask{0} indicates the move for the GE{3:0}
5146
        // bits, the mask{0} bit can be set only if the processor
5147
        // includes the DSP extension.
5148
6.34k
        if (Mask == 0 || (Mask != 2 && ValLow > 3) ||
5149
6.34k
            (!(ARM_getFeatureBits(Inst->csh->mode,
5150
1.71k
                ARM_FeatureDSP)) &&
5151
1.71k
             (Mask & 1)))
5152
4.63k
          S = MCDisassembler_SoftFail;
5153
6.34k
      }
5154
6.34k
    }
5155
7.40k
  } else {
5156
    // A/R class
5157
828
    if (Val == 0)
5158
12
      return MCDisassembler_Fail;
5159
828
  }
5160
8.22k
  MCOperand_CreateImm0(Inst, (Val));
5161
8.22k
  return S;
5162
8.23k
}
5163
5164
static DecodeStatus DecodeBankedReg(MCInst *Inst, unsigned Val,
5165
            uint64_t Address, const void *Decoder)
5166
1.70k
{
5167
1.70k
  unsigned R = fieldFromInstruction_4(Val, 5, 1);
5168
1.70k
  unsigned SysM = fieldFromInstruction_4(Val, 0, 5);
5169
5170
  // The table of encodings for these banked registers comes from B9.2.3 of
5171
  // the ARM ARM. There are patterns, but nothing regular enough to make this
5172
  // logic neater. So by fiat, these values are UNPREDICTABLE:
5173
1.70k
  if (!ARMBankedReg_lookupBankedRegByEncoding((R << 5) | SysM))
5174
78
    return MCDisassembler_Fail;
5175
5176
1.62k
  MCOperand_CreateImm0(Inst, (Val));
5177
1.62k
  return MCDisassembler_Success;
5178
1.70k
}
5179
5180
static DecodeStatus DecodeDoubleRegLoad(MCInst *Inst, unsigned Insn,
5181
          uint64_t Address, const void *Decoder)
5182
671
{
5183
671
  DecodeStatus S = MCDisassembler_Success;
5184
5185
671
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5186
671
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5187
671
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5188
5189
671
  if (Rn == 0xF)
5190
416
    S = MCDisassembler_SoftFail;
5191
5192
671
  if (!Check(&S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder)))
5193
2
    return MCDisassembler_Fail;
5194
669
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5195
0
    return MCDisassembler_Fail;
5196
669
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5197
2
    return MCDisassembler_Fail;
5198
5199
667
  return S;
5200
669
}
5201
5202
static DecodeStatus DecodeDoubleRegStore(MCInst *Inst, unsigned Insn,
5203
           uint64_t Address, const void *Decoder)
5204
1.93k
{
5205
1.93k
  DecodeStatus S = MCDisassembler_Success;
5206
5207
1.93k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5208
1.93k
  unsigned Rt = fieldFromInstruction_4(Insn, 0, 4);
5209
1.93k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5210
1.93k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5211
5212
1.93k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
5213
0
    return MCDisassembler_Fail;
5214
5215
1.93k
  if (Rn == 0xF || Rd == Rn || Rd == Rt || Rd == Rt + 1)
5216
1.26k
    S = MCDisassembler_SoftFail;
5217
5218
1.93k
  if (!Check(&S, DecodeGPRPairRegisterClass(Inst, Rt, Address, Decoder)))
5219
4
    return MCDisassembler_Fail;
5220
1.92k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5221
0
    return MCDisassembler_Fail;
5222
1.92k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5223
3
    return MCDisassembler_Fail;
5224
5225
1.92k
  return S;
5226
1.92k
}
5227
5228
static DecodeStatus DecodeLDRPreImm(MCInst *Inst, unsigned Insn,
5229
            uint64_t Address, const void *Decoder)
5230
4.22k
{
5231
4.22k
  DecodeStatus S = MCDisassembler_Success;
5232
5233
4.22k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5234
4.22k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5235
4.22k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
5236
4.22k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
5237
4.22k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
5238
4.22k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5239
5240
4.22k
  if (Rn == 0xF || Rn == Rt)
5241
1.31k
    S = MCDisassembler_SoftFail;
5242
5243
4.22k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5244
0
    return MCDisassembler_Fail;
5245
4.22k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5246
0
    return MCDisassembler_Fail;
5247
4.22k
  if (!Check(&S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
5248
0
    return MCDisassembler_Fail;
5249
4.22k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5250
18
    return MCDisassembler_Fail;
5251
5252
4.20k
  return S;
5253
4.22k
}
5254
5255
static DecodeStatus DecodeLDRPreReg(MCInst *Inst, unsigned Insn,
5256
            uint64_t Address, const void *Decoder)
5257
2.87k
{
5258
2.87k
  DecodeStatus S = MCDisassembler_Success;
5259
5260
2.87k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5261
2.87k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5262
2.87k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
5263
2.87k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
5264
2.87k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
5265
2.87k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5266
2.87k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5267
5268
2.87k
  if (Rn == 0xF || Rn == Rt)
5269
878
    S = MCDisassembler_SoftFail;
5270
2.87k
  if (Rm == 0xF)
5271
790
    S = MCDisassembler_SoftFail;
5272
5273
2.87k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5274
0
    return MCDisassembler_Fail;
5275
2.87k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5276
0
    return MCDisassembler_Fail;
5277
2.87k
  if (!Check(&S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
5278
0
    return MCDisassembler_Fail;
5279
2.87k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5280
4
    return MCDisassembler_Fail;
5281
5282
2.87k
  return S;
5283
2.87k
}
5284
5285
static DecodeStatus DecodeSTRPreImm(MCInst *Inst, unsigned Insn,
5286
            uint64_t Address, const void *Decoder)
5287
4.18k
{
5288
4.18k
  DecodeStatus S = MCDisassembler_Success;
5289
5290
4.18k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5291
4.18k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5292
4.18k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
5293
4.18k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
5294
4.18k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
5295
4.18k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5296
5297
4.18k
  if (Rn == 0xF || Rn == Rt)
5298
1.35k
    S = MCDisassembler_SoftFail;
5299
5300
4.18k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5301
0
    return MCDisassembler_Fail;
5302
4.18k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5303
0
    return MCDisassembler_Fail;
5304
4.18k
  if (!Check(&S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
5305
0
    return MCDisassembler_Fail;
5306
4.18k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5307
4
    return MCDisassembler_Fail;
5308
5309
4.18k
  return S;
5310
4.18k
}
5311
5312
static DecodeStatus DecodeSTRPreReg(MCInst *Inst, unsigned Insn,
5313
            uint64_t Address, const void *Decoder)
5314
3.21k
{
5315
3.21k
  DecodeStatus S = MCDisassembler_Success;
5316
5317
3.21k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5318
3.21k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5319
3.21k
  unsigned imm = fieldFromInstruction_4(Insn, 0, 12);
5320
3.21k
  imm |= fieldFromInstruction_4(Insn, 16, 4) << 13;
5321
3.21k
  imm |= fieldFromInstruction_4(Insn, 23, 1) << 12;
5322
3.21k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5323
5324
3.21k
  if (Rn == 0xF || Rn == Rt)
5325
628
    S = MCDisassembler_SoftFail;
5326
5327
3.21k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5328
0
    return MCDisassembler_Fail;
5329
3.21k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5330
0
    return MCDisassembler_Fail;
5331
3.21k
  if (!Check(&S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
5332
0
    return MCDisassembler_Fail;
5333
3.21k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5334
5
    return MCDisassembler_Fail;
5335
5336
3.20k
  return S;
5337
3.21k
}
5338
5339
static DecodeStatus DecodeVLD1LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5340
         const void *Decoder)
5341
3.36k
{
5342
3.36k
  DecodeStatus S = MCDisassembler_Success;
5343
5344
3.36k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5345
3.36k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5346
3.36k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5347
3.36k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5348
3.36k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5349
5350
3.36k
  unsigned align = 0;
5351
3.36k
  unsigned index = 0;
5352
3.36k
  switch (size) {
5353
0
  default:
5354
0
    return MCDisassembler_Fail;
5355
984
  case 0:
5356
984
    if (fieldFromInstruction_4(Insn, 4, 1))
5357
0
      return MCDisassembler_Fail; // UNDEFINED
5358
984
    index = fieldFromInstruction_4(Insn, 5, 3);
5359
984
    break;
5360
1.00k
  case 1:
5361
1.00k
    if (fieldFromInstruction_4(Insn, 5, 1))
5362
3
      return MCDisassembler_Fail; // UNDEFINED
5363
998
    index = fieldFromInstruction_4(Insn, 6, 2);
5364
998
    if (fieldFromInstruction_4(Insn, 4, 1))
5365
303
      align = 2;
5366
998
    break;
5367
1.37k
  case 2:
5368
1.37k
    if (fieldFromInstruction_4(Insn, 6, 1))
5369
0
      return MCDisassembler_Fail; // UNDEFINED
5370
1.37k
    index = fieldFromInstruction_4(Insn, 7, 1);
5371
5372
1.37k
    switch (fieldFromInstruction_4(Insn, 4, 2)) {
5373
967
    case 0:
5374
967
      align = 0;
5375
967
      break;
5376
404
    case 3:
5377
404
      align = 4;
5378
404
      break;
5379
4
    default:
5380
4
      return MCDisassembler_Fail;
5381
1.37k
    }
5382
1.37k
    break;
5383
3.36k
  }
5384
5385
3.35k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5386
0
    return MCDisassembler_Fail;
5387
3.35k
  if (Rm != 0xF) { // Writeback
5388
2.86k
    if (!Check(&S,
5389
2.86k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5390
0
      return MCDisassembler_Fail;
5391
2.86k
  }
5392
3.35k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5393
0
    return MCDisassembler_Fail;
5394
3.35k
  MCOperand_CreateImm0(Inst, (align));
5395
3.35k
  if (Rm != 0xF) {
5396
2.86k
    if (Rm != 0xD) {
5397
2.03k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5398
2.03k
                    Decoder)))
5399
0
        return MCDisassembler_Fail;
5400
2.03k
    } else
5401
829
      MCOperand_CreateReg0(Inst, (0));
5402
2.86k
  }
5403
5404
3.35k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5405
0
    return MCDisassembler_Fail;
5406
3.35k
  MCOperand_CreateImm0(Inst, (index));
5407
5408
3.35k
  return S;
5409
3.35k
}
5410
5411
static DecodeStatus DecodeVST1LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5412
         const void *Decoder)
5413
2.56k
{
5414
2.56k
  DecodeStatus S = MCDisassembler_Success;
5415
5416
2.56k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5417
2.56k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5418
2.56k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5419
2.56k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5420
2.56k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5421
5422
2.56k
  unsigned align = 0;
5423
2.56k
  unsigned index = 0;
5424
2.56k
  switch (size) {
5425
0
  default:
5426
0
    return MCDisassembler_Fail;
5427
717
  case 0:
5428
717
    if (fieldFromInstruction_4(Insn, 4, 1))
5429
0
      return MCDisassembler_Fail; // UNDEFINED
5430
717
    index = fieldFromInstruction_4(Insn, 5, 3);
5431
717
    break;
5432
803
  case 1:
5433
803
    if (fieldFromInstruction_4(Insn, 5, 1))
5434
0
      return MCDisassembler_Fail; // UNDEFINED
5435
803
    index = fieldFromInstruction_4(Insn, 6, 2);
5436
803
    if (fieldFromInstruction_4(Insn, 4, 1))
5437
354
      align = 2;
5438
803
    break;
5439
1.04k
  case 2:
5440
1.04k
    if (fieldFromInstruction_4(Insn, 6, 1))
5441
0
      return MCDisassembler_Fail; // UNDEFINED
5442
1.04k
    index = fieldFromInstruction_4(Insn, 7, 1);
5443
5444
1.04k
    switch (fieldFromInstruction_4(Insn, 4, 2)) {
5445
757
    case 0:
5446
757
      align = 0;
5447
757
      break;
5448
283
    case 3:
5449
283
      align = 4;
5450
283
      break;
5451
2
    default:
5452
2
      return MCDisassembler_Fail;
5453
1.04k
    }
5454
1.04k
    break;
5455
2.56k
  }
5456
5457
2.56k
  if (Rm != 0xF) { // Writeback
5458
2.01k
    if (!Check(&S,
5459
2.01k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5460
0
      return MCDisassembler_Fail;
5461
2.01k
  }
5462
2.56k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5463
0
    return MCDisassembler_Fail;
5464
2.56k
  MCOperand_CreateImm0(Inst, (align));
5465
2.56k
  if (Rm != 0xF) {
5466
2.01k
    if (Rm != 0xD) {
5467
1.50k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5468
1.50k
                    Decoder)))
5469
0
        return MCDisassembler_Fail;
5470
1.50k
    } else
5471
505
      MCOperand_CreateReg0(Inst, (0));
5472
2.01k
  }
5473
5474
2.56k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5475
0
    return MCDisassembler_Fail;
5476
2.56k
  MCOperand_CreateImm0(Inst, (index));
5477
5478
2.56k
  return S;
5479
2.56k
}
5480
5481
static DecodeStatus DecodeVLD2LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5482
         const void *Decoder)
5483
3.85k
{
5484
3.85k
  DecodeStatus S = MCDisassembler_Success;
5485
5486
3.85k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5487
3.85k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5488
3.85k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5489
3.85k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5490
3.85k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5491
5492
3.85k
  unsigned align = 0;
5493
3.85k
  unsigned index = 0;
5494
3.85k
  unsigned inc = 1;
5495
3.85k
  switch (size) {
5496
0
  default:
5497
0
    return MCDisassembler_Fail;
5498
1.28k
  case 0:
5499
1.28k
    index = fieldFromInstruction_4(Insn, 5, 3);
5500
1.28k
    if (fieldFromInstruction_4(Insn, 4, 1))
5501
796
      align = 2;
5502
1.28k
    break;
5503
1.10k
  case 1:
5504
1.10k
    index = fieldFromInstruction_4(Insn, 6, 2);
5505
1.10k
    if (fieldFromInstruction_4(Insn, 4, 1))
5506
576
      align = 4;
5507
1.10k
    if (fieldFromInstruction_4(Insn, 5, 1))
5508
501
      inc = 2;
5509
1.10k
    break;
5510
1.46k
  case 2:
5511
1.46k
    if (fieldFromInstruction_4(Insn, 5, 1))
5512
0
      return MCDisassembler_Fail; // UNDEFINED
5513
1.46k
    index = fieldFromInstruction_4(Insn, 7, 1);
5514
1.46k
    if (fieldFromInstruction_4(Insn, 4, 1) != 0)
5515
836
      align = 8;
5516
1.46k
    if (fieldFromInstruction_4(Insn, 6, 1))
5517
436
      inc = 2;
5518
1.46k
    break;
5519
3.85k
  }
5520
5521
3.85k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5522
0
    return MCDisassembler_Fail;
5523
3.85k
  if (!Check(&S,
5524
3.85k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5525
4
    return MCDisassembler_Fail;
5526
3.84k
  if (Rm != 0xF) { // Writeback
5527
2.95k
    if (!Check(&S,
5528
2.95k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5529
0
      return MCDisassembler_Fail;
5530
2.95k
  }
5531
3.84k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5532
0
    return MCDisassembler_Fail;
5533
3.84k
  MCOperand_CreateImm0(Inst, (align));
5534
3.84k
  if (Rm != 0xF) {
5535
2.95k
    if (Rm != 0xD) {
5536
1.87k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5537
1.87k
                    Decoder)))
5538
0
        return MCDisassembler_Fail;
5539
1.87k
    } else
5540
1.08k
      MCOperand_CreateReg0(Inst, (0));
5541
2.95k
  }
5542
5543
3.84k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5544
0
    return MCDisassembler_Fail;
5545
3.84k
  if (!Check(&S,
5546
3.84k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5547
0
    return MCDisassembler_Fail;
5548
3.84k
  MCOperand_CreateImm0(Inst, (index));
5549
5550
3.84k
  return S;
5551
3.84k
}
5552
5553
static DecodeStatus DecodeVST2LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5554
         const void *Decoder)
5555
6.09k
{
5556
6.09k
  DecodeStatus S = MCDisassembler_Success;
5557
5558
6.09k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5559
6.09k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5560
6.09k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5561
6.09k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5562
6.09k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5563
5564
6.09k
  unsigned align = 0;
5565
6.09k
  unsigned index = 0;
5566
6.09k
  unsigned inc = 1;
5567
6.09k
  switch (size) {
5568
0
  default:
5569
0
    return MCDisassembler_Fail;
5570
1.81k
  case 0:
5571
1.81k
    index = fieldFromInstruction_4(Insn, 5, 3);
5572
1.81k
    if (fieldFromInstruction_4(Insn, 4, 1))
5573
836
      align = 2;
5574
1.81k
    break;
5575
1.78k
  case 1:
5576
1.78k
    index = fieldFromInstruction_4(Insn, 6, 2);
5577
1.78k
    if (fieldFromInstruction_4(Insn, 4, 1))
5578
402
      align = 4;
5579
1.78k
    if (fieldFromInstruction_4(Insn, 5, 1))
5580
763
      inc = 2;
5581
1.78k
    break;
5582
2.50k
  case 2:
5583
2.50k
    if (fieldFromInstruction_4(Insn, 5, 1))
5584
0
      return MCDisassembler_Fail; // UNDEFINED
5585
2.50k
    index = fieldFromInstruction_4(Insn, 7, 1);
5586
2.50k
    if (fieldFromInstruction_4(Insn, 4, 1) != 0)
5587
853
      align = 8;
5588
2.50k
    if (fieldFromInstruction_4(Insn, 6, 1))
5589
996
      inc = 2;
5590
2.50k
    break;
5591
6.09k
  }
5592
5593
6.09k
  if (Rm != 0xF) { // Writeback
5594
4.52k
    if (!Check(&S,
5595
4.52k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5596
0
      return MCDisassembler_Fail;
5597
4.52k
  }
5598
6.09k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5599
0
    return MCDisassembler_Fail;
5600
6.09k
  MCOperand_CreateImm0(Inst, (align));
5601
6.09k
  if (Rm != 0xF) {
5602
4.52k
    if (Rm != 0xD) {
5603
2.37k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5604
2.37k
                    Decoder)))
5605
0
        return MCDisassembler_Fail;
5606
2.37k
    } else
5607
2.15k
      MCOperand_CreateReg0(Inst, (0));
5608
4.52k
  }
5609
5610
6.09k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5611
0
    return MCDisassembler_Fail;
5612
6.09k
  if (!Check(&S,
5613
6.09k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5614
8
    return MCDisassembler_Fail;
5615
6.08k
  MCOperand_CreateImm0(Inst, (index));
5616
5617
6.08k
  return S;
5618
6.09k
}
5619
5620
static DecodeStatus DecodeVLD3LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5621
         const void *Decoder)
5622
1.94k
{
5623
1.94k
  DecodeStatus S = MCDisassembler_Success;
5624
5625
1.94k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5626
1.94k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5627
1.94k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5628
1.94k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5629
1.94k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5630
5631
1.94k
  unsigned align = 0;
5632
1.94k
  unsigned index = 0;
5633
1.94k
  unsigned inc = 1;
5634
1.94k
  switch (size) {
5635
0
  default:
5636
0
    return MCDisassembler_Fail;
5637
832
  case 0:
5638
832
    if (fieldFromInstruction_4(Insn, 4, 1))
5639
0
      return MCDisassembler_Fail; // UNDEFINED
5640
832
    index = fieldFromInstruction_4(Insn, 5, 3);
5641
832
    break;
5642
651
  case 1:
5643
651
    if (fieldFromInstruction_4(Insn, 4, 1))
5644
0
      return MCDisassembler_Fail; // UNDEFINED
5645
651
    index = fieldFromInstruction_4(Insn, 6, 2);
5646
651
    if (fieldFromInstruction_4(Insn, 5, 1))
5647
188
      inc = 2;
5648
651
    break;
5649
461
  case 2:
5650
461
    if (fieldFromInstruction_4(Insn, 4, 2))
5651
0
      return MCDisassembler_Fail; // UNDEFINED
5652
461
    index = fieldFromInstruction_4(Insn, 7, 1);
5653
461
    if (fieldFromInstruction_4(Insn, 6, 1))
5654
170
      inc = 2;
5655
461
    break;
5656
1.94k
  }
5657
5658
1.94k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5659
0
    return MCDisassembler_Fail;
5660
1.94k
  if (!Check(&S,
5661
1.94k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5662
2
    return MCDisassembler_Fail;
5663
1.94k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5664
1.94k
                Decoder)))
5665
3
    return MCDisassembler_Fail;
5666
5667
1.93k
  if (Rm != 0xF) { // Writeback
5668
1.12k
    if (!Check(&S,
5669
1.12k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5670
0
      return MCDisassembler_Fail;
5671
1.12k
  }
5672
1.93k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5673
0
    return MCDisassembler_Fail;
5674
1.93k
  MCOperand_CreateImm0(Inst, (align));
5675
1.93k
  if (Rm != 0xF) {
5676
1.12k
    if (Rm != 0xD) {
5677
726
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5678
726
                    Decoder)))
5679
0
        return MCDisassembler_Fail;
5680
726
    } else
5681
401
      MCOperand_CreateReg0(Inst, (0));
5682
1.12k
  }
5683
5684
1.93k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5685
0
    return MCDisassembler_Fail;
5686
1.93k
  if (!Check(&S,
5687
1.93k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5688
0
    return MCDisassembler_Fail;
5689
1.93k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5690
1.93k
                Decoder)))
5691
0
    return MCDisassembler_Fail;
5692
1.93k
  MCOperand_CreateImm0(Inst, (index));
5693
5694
1.93k
  return S;
5695
1.93k
}
5696
5697
static DecodeStatus DecodeVST3LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5698
         const void *Decoder)
5699
2.37k
{
5700
2.37k
  DecodeStatus S = MCDisassembler_Success;
5701
5702
2.37k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5703
2.37k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5704
2.37k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5705
2.37k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5706
2.37k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5707
5708
2.37k
  unsigned align = 0;
5709
2.37k
  unsigned index = 0;
5710
2.37k
  unsigned inc = 1;
5711
2.37k
  switch (size) {
5712
0
  default:
5713
0
    return MCDisassembler_Fail;
5714
738
  case 0:
5715
738
    if (fieldFromInstruction_4(Insn, 4, 1))
5716
0
      return MCDisassembler_Fail; // UNDEFINED
5717
738
    index = fieldFromInstruction_4(Insn, 5, 3);
5718
738
    break;
5719
798
  case 1:
5720
798
    if (fieldFromInstruction_4(Insn, 4, 1))
5721
0
      return MCDisassembler_Fail; // UNDEFINED
5722
798
    index = fieldFromInstruction_4(Insn, 6, 2);
5723
798
    if (fieldFromInstruction_4(Insn, 5, 1))
5724
129
      inc = 2;
5725
798
    break;
5726
838
  case 2:
5727
838
    if (fieldFromInstruction_4(Insn, 4, 2))
5728
0
      return MCDisassembler_Fail; // UNDEFINED
5729
838
    index = fieldFromInstruction_4(Insn, 7, 1);
5730
838
    if (fieldFromInstruction_4(Insn, 6, 1))
5731
322
      inc = 2;
5732
838
    break;
5733
2.37k
  }
5734
5735
2.37k
  if (Rm != 0xF) { // Writeback
5736
1.39k
    if (!Check(&S,
5737
1.39k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5738
0
      return MCDisassembler_Fail;
5739
1.39k
  }
5740
2.37k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5741
0
    return MCDisassembler_Fail;
5742
2.37k
  MCOperand_CreateImm0(Inst, (align));
5743
2.37k
  if (Rm != 0xF) {
5744
1.39k
    if (Rm != 0xD) {
5745
1.02k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5746
1.02k
                    Decoder)))
5747
0
        return MCDisassembler_Fail;
5748
1.02k
    } else
5749
374
      MCOperand_CreateReg0(Inst, (0));
5750
1.39k
  }
5751
5752
2.37k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5753
0
    return MCDisassembler_Fail;
5754
2.37k
  if (!Check(&S,
5755
2.37k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5756
2
    return MCDisassembler_Fail;
5757
2.37k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5758
2.37k
                Decoder)))
5759
2
    return MCDisassembler_Fail;
5760
2.37k
  MCOperand_CreateImm0(Inst, (index));
5761
5762
2.37k
  return S;
5763
2.37k
}
5764
5765
static DecodeStatus DecodeVLD4LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5766
         const void *Decoder)
5767
4.02k
{
5768
4.02k
  DecodeStatus S = MCDisassembler_Success;
5769
5770
4.02k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5771
4.02k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5772
4.02k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5773
4.02k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5774
4.02k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5775
5776
4.02k
  unsigned align = 0;
5777
4.02k
  unsigned index = 0;
5778
4.02k
  unsigned inc = 1;
5779
4.02k
  switch (size) {
5780
0
  default:
5781
0
    return MCDisassembler_Fail;
5782
1.52k
  case 0:
5783
1.52k
    if (fieldFromInstruction_4(Insn, 4, 1))
5784
235
      align = 4;
5785
1.52k
    index = fieldFromInstruction_4(Insn, 5, 3);
5786
1.52k
    break;
5787
2.00k
  case 1:
5788
2.00k
    if (fieldFromInstruction_4(Insn, 4, 1))
5789
803
      align = 8;
5790
2.00k
    index = fieldFromInstruction_4(Insn, 6, 2);
5791
2.00k
    if (fieldFromInstruction_4(Insn, 5, 1))
5792
681
      inc = 2;
5793
2.00k
    break;
5794
500
  case 2:
5795
500
    switch (fieldFromInstruction_4(Insn, 4, 2)) {
5796
156
    case 0:
5797
156
      align = 0;
5798
156
      break;
5799
5
    case 3:
5800
5
      return MCDisassembler_Fail;
5801
339
    default:
5802
339
      align = 4 << fieldFromInstruction_4(Insn, 4, 2);
5803
339
      break;
5804
500
    }
5805
5806
495
    index = fieldFromInstruction_4(Insn, 7, 1);
5807
495
    if (fieldFromInstruction_4(Insn, 6, 1))
5808
254
      inc = 2;
5809
495
    break;
5810
4.02k
  }
5811
5812
4.02k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5813
0
    return MCDisassembler_Fail;
5814
4.02k
  if (!Check(&S,
5815
4.02k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5816
2
    return MCDisassembler_Fail;
5817
4.02k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5818
4.02k
                Decoder)))
5819
3
    return MCDisassembler_Fail;
5820
4.01k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 3 * inc, Address,
5821
4.01k
                Decoder)))
5822
2
    return MCDisassembler_Fail;
5823
5824
4.01k
  if (Rm != 0xF) { // Writeback
5825
2.91k
    if (!Check(&S,
5826
2.91k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5827
0
      return MCDisassembler_Fail;
5828
2.91k
  }
5829
4.01k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5830
0
    return MCDisassembler_Fail;
5831
4.01k
  MCOperand_CreateImm0(Inst, (align));
5832
4.01k
  if (Rm != 0xF) {
5833
2.91k
    if (Rm != 0xD) {
5834
1.70k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5835
1.70k
                    Decoder)))
5836
0
        return MCDisassembler_Fail;
5837
1.70k
    } else
5838
1.21k
      MCOperand_CreateReg0(Inst, (0));
5839
2.91k
  }
5840
5841
4.01k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5842
0
    return MCDisassembler_Fail;
5843
4.01k
  if (!Check(&S,
5844
4.01k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5845
0
    return MCDisassembler_Fail;
5846
4.01k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5847
4.01k
                Decoder)))
5848
0
    return MCDisassembler_Fail;
5849
4.01k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 3 * inc, Address,
5850
4.01k
                Decoder)))
5851
0
    return MCDisassembler_Fail;
5852
4.01k
  MCOperand_CreateImm0(Inst, (index));
5853
5854
4.01k
  return S;
5855
4.01k
}
5856
5857
static DecodeStatus DecodeVST4LN(MCInst *Inst, unsigned Insn, uint64_t Address,
5858
         const void *Decoder)
5859
4.72k
{
5860
4.72k
  DecodeStatus S = MCDisassembler_Success;
5861
5862
4.72k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
5863
4.72k
  unsigned Rm = fieldFromInstruction_4(Insn, 0, 4);
5864
4.72k
  unsigned Rd = fieldFromInstruction_4(Insn, 12, 4);
5865
4.72k
  Rd |= fieldFromInstruction_4(Insn, 22, 1) << 4;
5866
4.72k
  unsigned size = fieldFromInstruction_4(Insn, 10, 2);
5867
5868
4.72k
  unsigned align = 0;
5869
4.72k
  unsigned index = 0;
5870
4.72k
  unsigned inc = 1;
5871
4.72k
  switch (size) {
5872
0
  default:
5873
0
    return MCDisassembler_Fail;
5874
975
  case 0:
5875
975
    if (fieldFromInstruction_4(Insn, 4, 1))
5876
539
      align = 4;
5877
975
    index = fieldFromInstruction_4(Insn, 5, 3);
5878
975
    break;
5879
2.66k
  case 1:
5880
2.66k
    if (fieldFromInstruction_4(Insn, 4, 1))
5881
1.94k
      align = 8;
5882
2.66k
    index = fieldFromInstruction_4(Insn, 6, 2);
5883
2.66k
    if (fieldFromInstruction_4(Insn, 5, 1))
5884
1.02k
      inc = 2;
5885
2.66k
    break;
5886
1.08k
  case 2:
5887
1.08k
    switch (fieldFromInstruction_4(Insn, 4, 2)) {
5888
528
    case 0:
5889
528
      align = 0;
5890
528
      break;
5891
2
    case 3:
5892
2
      return MCDisassembler_Fail;
5893
552
    default:
5894
552
      align = 4 << fieldFromInstruction_4(Insn, 4, 2);
5895
552
      break;
5896
1.08k
    }
5897
5898
1.08k
    index = fieldFromInstruction_4(Insn, 7, 1);
5899
1.08k
    if (fieldFromInstruction_4(Insn, 6, 1))
5900
201
      inc = 2;
5901
1.08k
    break;
5902
4.72k
  }
5903
5904
4.71k
  if (Rm != 0xF) { // Writeback
5905
2.82k
    if (!Check(&S,
5906
2.82k
         DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5907
0
      return MCDisassembler_Fail;
5908
2.82k
  }
5909
4.71k
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
5910
0
    return MCDisassembler_Fail;
5911
4.71k
  MCOperand_CreateImm0(Inst, (align));
5912
4.71k
  if (Rm != 0xF) {
5913
2.82k
    if (Rm != 0xD) {
5914
1.98k
      if (!Check(&S, DecodeGPRRegisterClass(Inst, Rm, Address,
5915
1.98k
                    Decoder)))
5916
0
        return MCDisassembler_Fail;
5917
1.98k
    } else
5918
844
      MCOperand_CreateReg0(Inst, (0));
5919
2.82k
  }
5920
5921
4.71k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
5922
0
    return MCDisassembler_Fail;
5923
4.71k
  if (!Check(&S,
5924
4.71k
       DecodeDPRRegisterClass(Inst, Rd + inc, Address, Decoder)))
5925
5
    return MCDisassembler_Fail;
5926
4.71k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 2 * inc, Address,
5927
4.71k
                Decoder)))
5928
2
    return MCDisassembler_Fail;
5929
4.71k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Rd + 3 * inc, Address,
5930
4.71k
                Decoder)))
5931
2
    return MCDisassembler_Fail;
5932
4.70k
  MCOperand_CreateImm0(Inst, (index));
5933
5934
4.70k
  return S;
5935
4.71k
}
5936
5937
static DecodeStatus DecodeVMOVSRR(MCInst *Inst, unsigned Insn, uint64_t Address,
5938
          const void *Decoder)
5939
589
{
5940
589
  DecodeStatus S = MCDisassembler_Success;
5941
589
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5942
589
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
5943
589
  unsigned Rm = fieldFromInstruction_4(Insn, 5, 1);
5944
589
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5945
589
  Rm |= fieldFromInstruction_4(Insn, 0, 4) << 1;
5946
5947
589
  if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
5948
242
    S = MCDisassembler_SoftFail;
5949
5950
589
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm, Address, Decoder)))
5951
0
    return MCDisassembler_Fail;
5952
589
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm + 1, Address, Decoder)))
5953
3
    return MCDisassembler_Fail;
5954
586
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5955
0
    return MCDisassembler_Fail;
5956
586
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2, Address, Decoder)))
5957
0
    return MCDisassembler_Fail;
5958
586
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5959
4
    return MCDisassembler_Fail;
5960
5961
582
  return S;
5962
586
}
5963
5964
static DecodeStatus DecodeVMOVRRS(MCInst *Inst, unsigned Insn, uint64_t Address,
5965
          const void *Decoder)
5966
504
{
5967
504
  DecodeStatus S = MCDisassembler_Success;
5968
504
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
5969
504
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
5970
504
  unsigned Rm = fieldFromInstruction_4(Insn, 5, 1);
5971
504
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
5972
504
  Rm |= fieldFromInstruction_4(Insn, 0, 4) << 1;
5973
5974
504
  if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
5975
390
    S = MCDisassembler_SoftFail;
5976
5977
504
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
5978
0
    return MCDisassembler_Fail;
5979
504
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2, Address, Decoder)))
5980
0
    return MCDisassembler_Fail;
5981
504
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm, Address, Decoder)))
5982
0
    return MCDisassembler_Fail;
5983
504
  if (!Check(&S, DecodeSPRRegisterClass(Inst, Rm + 1, Address, Decoder)))
5984
3
    return MCDisassembler_Fail;
5985
501
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
5986
2
    return MCDisassembler_Fail;
5987
5988
499
  return S;
5989
501
}
5990
5991
static DecodeStatus DecodeIT(MCInst *Inst, unsigned Insn, uint64_t Address,
5992
           const void *Decoder)
5993
13.8k
{
5994
13.8k
  DecodeStatus S = MCDisassembler_Success;
5995
13.8k
  unsigned pred = fieldFromInstruction_4(Insn, 4, 4);
5996
13.8k
  unsigned mask = fieldFromInstruction_4(Insn, 0, 4);
5997
5998
13.8k
  if (pred == 0xF) {
5999
880
    pred = 0xE;
6000
880
    S = MCDisassembler_SoftFail;
6001
880
  }
6002
6003
13.8k
  if (mask == 0x0)
6004
0
    return MCDisassembler_Fail;
6005
6006
  // IT masks are encoded as a sequence of replacement low-order bits
6007
  // for the condition code. So if the low bit of the starting
6008
  // condition code is 1, then we have to flip all the bits above the
6009
  // terminating bit (which is the lowest 1 bit).
6010
13.8k
  if (pred & 1) {
6011
8.71k
    unsigned LowBit = mask & -mask;
6012
8.71k
    unsigned BitsAboveLowBit = 0xF & (-LowBit << 1);
6013
8.71k
    mask ^= BitsAboveLowBit;
6014
8.71k
  }
6015
6016
13.8k
  MCOperand_CreateImm0(Inst, (pred));
6017
13.8k
  MCOperand_CreateImm0(Inst, (mask));
6018
13.8k
  return S;
6019
13.8k
}
6020
6021
static DecodeStatus DecodeT2LDRDPreInstruction(MCInst *Inst, unsigned Insn,
6022
                 uint64_t Address,
6023
                 const void *Decoder)
6024
5.82k
{
6025
5.82k
  DecodeStatus S = MCDisassembler_Success;
6026
6027
5.82k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
6028
5.82k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 8, 4);
6029
5.82k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
6030
5.82k
  unsigned addr = fieldFromInstruction_4(Insn, 0, 8);
6031
5.82k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
6032
5.82k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
6033
5.82k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
6034
5.82k
  bool writeback = (W == 1) | (P == 0);
6035
6036
5.82k
  addr |= (U << 8) | (Rn << 9);
6037
6038
5.82k
  if (writeback && (Rn == Rt || Rn == Rt2))
6039
1.97k
    Check(&S, MCDisassembler_SoftFail);
6040
5.82k
  if (Rt == Rt2)
6041
872
    Check(&S, MCDisassembler_SoftFail);
6042
6043
  // Rt
6044
5.82k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
6045
0
    return MCDisassembler_Fail;
6046
  // Rt2
6047
5.82k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
6048
0
    return MCDisassembler_Fail;
6049
  // Writeback operand
6050
5.82k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
6051
0
    return MCDisassembler_Fail;
6052
  // addr
6053
5.82k
  if (!Check(&S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
6054
0
    return MCDisassembler_Fail;
6055
6056
5.82k
  return S;
6057
5.82k
}
6058
6059
static DecodeStatus DecodeT2STRDPreInstruction(MCInst *Inst, unsigned Insn,
6060
                 uint64_t Address,
6061
                 const void *Decoder)
6062
4.91k
{
6063
4.91k
  DecodeStatus S = MCDisassembler_Success;
6064
6065
4.91k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
6066
4.91k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 8, 4);
6067
4.91k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
6068
4.91k
  unsigned addr = fieldFromInstruction_4(Insn, 0, 8);
6069
4.91k
  unsigned W = fieldFromInstruction_4(Insn, 21, 1);
6070
4.91k
  unsigned U = fieldFromInstruction_4(Insn, 23, 1);
6071
4.91k
  unsigned P = fieldFromInstruction_4(Insn, 24, 1);
6072
4.91k
  bool writeback = (W == 1) | (P == 0);
6073
6074
4.91k
  addr |= (U << 8) | (Rn << 9);
6075
6076
4.91k
  if (writeback && (Rn == Rt || Rn == Rt2))
6077
2.34k
    Check(&S, MCDisassembler_SoftFail);
6078
6079
  // Writeback operand
6080
4.91k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
6081
0
    return MCDisassembler_Fail;
6082
  // Rt
6083
4.91k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
6084
0
    return MCDisassembler_Fail;
6085
  // Rt2
6086
4.91k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
6087
0
    return MCDisassembler_Fail;
6088
  // addr
6089
4.91k
  if (!Check(&S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
6090
0
    return MCDisassembler_Fail;
6091
6092
4.91k
  return S;
6093
4.91k
}
6094
6095
static DecodeStatus DecodeT2Adr(MCInst *Inst, uint32_t Insn, uint64_t Address,
6096
        const void *Decoder)
6097
1.00k
{
6098
1.00k
  unsigned sign1 = fieldFromInstruction_4(Insn, 21, 1);
6099
1.00k
  unsigned sign2 = fieldFromInstruction_4(Insn, 23, 1);
6100
1.00k
  if (sign1 != sign2)
6101
1
    return MCDisassembler_Fail;
6102
1.00k
  const unsigned Rd = fieldFromInstruction_4(Insn, 8, 4);
6103
1.00k
  CS_ASSERT(MCInst_getNumOperands(Inst) == 0 &&
6104
1.00k
      "We should receive an empty Inst");
6105
1.00k
  DecodeStatus S = DecoderGPRRegisterClass(Inst, Rd, Address, Decoder);
6106
6107
1.00k
  unsigned Val = fieldFromInstruction_4(Insn, 0, 8);
6108
1.00k
  Val |= fieldFromInstruction_4(Insn, 12, 3) << 8;
6109
1.00k
  Val |= fieldFromInstruction_4(Insn, 26, 1) << 11;
6110
  // If sign, then it is decreasing the address.
6111
1.00k
  if (sign1) {
6112
    // Following ARMv7 Architecture Manual, when the offset
6113
    // is zero, it is decoded as a subw, not as a adr.w
6114
536
    if (!Val) {
6115
369
      MCInst_setOpcode(Inst, (ARM_t2SUBri12));
6116
369
      MCOperand_CreateReg0(Inst, (ARM_PC));
6117
369
    } else
6118
167
      Val = -Val;
6119
536
  }
6120
1.00k
  MCOperand_CreateImm0(Inst, (Val));
6121
1.00k
  return S;
6122
1.00k
}
6123
6124
static DecodeStatus DecodeT2ShifterImmOperand(MCInst *Inst, uint32_t Val,
6125
                uint64_t Address,
6126
                const void *Decoder)
6127
984
{
6128
984
  DecodeStatus S = MCDisassembler_Success;
6129
6130
  // Shift of "asr #32" is not allowed in Thumb2 mode.
6131
984
  if (Val == 0x20)
6132
1
    S = MCDisassembler_Fail;
6133
984
  MCOperand_CreateImm0(Inst, (Val));
6134
984
  return S;
6135
984
}
6136
6137
static DecodeStatus DecodeSwap(MCInst *Inst, unsigned Insn, uint64_t Address,
6138
             const void *Decoder)
6139
2.70k
{
6140
2.70k
  unsigned Rt = fieldFromInstruction_4(Insn, 12, 4);
6141
2.70k
  unsigned Rt2 = fieldFromInstruction_4(Insn, 0, 4);
6142
2.70k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
6143
2.70k
  unsigned pred = fieldFromInstruction_4(Insn, 28, 4);
6144
6145
2.70k
  if (pred == 0xF)
6146
997
    return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
6147
6148
1.70k
  DecodeStatus S = MCDisassembler_Success;
6149
6150
1.70k
  if (Rt == Rn || Rn == Rt2)
6151
389
    S = MCDisassembler_SoftFail;
6152
6153
1.70k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
6154
0
    return MCDisassembler_Fail;
6155
1.70k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
6156
0
    return MCDisassembler_Fail;
6157
1.70k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
6158
0
    return MCDisassembler_Fail;
6159
1.70k
  if (!Check(&S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
6160
0
    return MCDisassembler_Fail;
6161
6162
1.70k
  return S;
6163
1.70k
}
6164
6165
static DecodeStatus DecodeVCVTD(MCInst *Inst, unsigned Insn, uint64_t Address,
6166
        const void *Decoder)
6167
4.99k
{
6168
4.99k
  bool hasFullFP16 =
6169
4.99k
    ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureFullFP16);
6170
6171
4.99k
  unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0);
6172
4.99k
  Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4);
6173
4.99k
  unsigned Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0);
6174
4.99k
  Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4);
6175
4.99k
  unsigned imm = fieldFromInstruction_4(Insn, 16, 6);
6176
4.99k
  unsigned cmode = fieldFromInstruction_4(Insn, 8, 4);
6177
4.99k
  unsigned op = fieldFromInstruction_4(Insn, 5, 1);
6178
6179
4.99k
  DecodeStatus S = MCDisassembler_Success;
6180
6181
  // If the top 3 bits of imm are clear, this is a VMOV (immediate)
6182
4.99k
  if (!(imm & 0x38)) {
6183
2.21k
    if (cmode == 0xF) {
6184
562
      if (op == 1)
6185
6
        return MCDisassembler_Fail;
6186
556
      MCInst_setOpcode(Inst, (ARM_VMOVv2f32));
6187
556
    }
6188
2.21k
    if (hasFullFP16) {
6189
2.21k
      if (cmode == 0xE) {
6190
0
        if (op == 1) {
6191
0
          MCInst_setOpcode(Inst, (ARM_VMOVv1i64));
6192
0
        } else {
6193
0
          MCInst_setOpcode(Inst, (ARM_VMOVv8i8));
6194
0
        }
6195
0
      }
6196
2.21k
      if (cmode == 0xD) {
6197
761
        if (op == 1) {
6198
250
          MCInst_setOpcode(Inst, (ARM_VMVNv2i32));
6199
511
        } else {
6200
511
          MCInst_setOpcode(Inst, (ARM_VMOVv2i32));
6201
511
        }
6202
761
      }
6203
2.21k
      if (cmode == 0xC) {
6204
893
        if (op == 1) {
6205
358
          MCInst_setOpcode(Inst, (ARM_VMVNv2i32));
6206
535
        } else {
6207
535
          MCInst_setOpcode(Inst, (ARM_VMOVv2i32));
6208
535
        }
6209
893
      }
6210
2.21k
    }
6211
2.21k
    return DecodeVMOVModImmInstruction(Inst, Insn, Address,
6212
2.21k
               Decoder);
6213
2.21k
  }
6214
6215
2.78k
  if (!(imm & 0x20))
6216
7
    return MCDisassembler_Fail;
6217
6218
2.77k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
6219
0
    return MCDisassembler_Fail;
6220
2.77k
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder)))
6221
0
    return MCDisassembler_Fail;
6222
2.77k
  MCOperand_CreateImm0(Inst, (64 - imm));
6223
6224
2.77k
  return S;
6225
2.77k
}
6226
6227
static DecodeStatus DecodeVCVTQ(MCInst *Inst, unsigned Insn, uint64_t Address,
6228
        const void *Decoder)
6229
1.36k
{
6230
1.36k
  bool hasFullFP16 =
6231
1.36k
    ARM_getFeatureBits(Inst->csh->mode, ARM_FeatureFullFP16);
6232
6233
1.36k
  unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0);
6234
1.36k
  Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4);
6235
1.36k
  unsigned Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0);
6236
1.36k
  Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4);
6237
1.36k
  unsigned imm = fieldFromInstruction_4(Insn, 16, 6);
6238
1.36k
  unsigned cmode = fieldFromInstruction_4(Insn, 8, 4);
6239
1.36k
  unsigned op = fieldFromInstruction_4(Insn, 5, 1);
6240
6241
1.36k
  DecodeStatus S = MCDisassembler_Success;
6242
6243
  // If the top 3 bits of imm are clear, this is a VMOV (immediate)
6244
1.36k
  if (!(imm & 0x38)) {
6245
637
    if (cmode == 0xF) {
6246
50
      if (op == 1)
6247
1
        return MCDisassembler_Fail;
6248
49
      MCInst_setOpcode(Inst, (ARM_VMOVv4f32));
6249
49
    }
6250
636
    if (hasFullFP16) {
6251
636
      if (cmode == 0xE) {
6252
0
        if (op == 1) {
6253
0
          MCInst_setOpcode(Inst, (ARM_VMOVv2i64));
6254
0
        } else {
6255
0
          MCInst_setOpcode(Inst, (ARM_VMOVv16i8));
6256
0
        }
6257
0
      }
6258
636
      if (cmode == 0xD) {
6259
159
        if (op == 1) {
6260
34
          MCInst_setOpcode(Inst, (ARM_VMVNv4i32));
6261
125
        } else {
6262
125
          MCInst_setOpcode(Inst, (ARM_VMOVv4i32));
6263
125
        }
6264
159
      }
6265
636
      if (cmode == 0xC) {
6266
428
        if (op == 1) {
6267
75
          MCInst_setOpcode(Inst, (ARM_VMVNv4i32));
6268
353
        } else {
6269
353
          MCInst_setOpcode(Inst, (ARM_VMOVv4i32));
6270
353
        }
6271
428
      }
6272
636
    }
6273
636
    return DecodeVMOVModImmInstruction(Inst, Insn, Address,
6274
636
               Decoder);
6275
637
  }
6276
6277
726
  if (!(imm & 0x20))
6278
3
    return MCDisassembler_Fail;
6279
6280
723
  if (!Check(&S, DecodeQPRRegisterClass(Inst, Vd, Address, Decoder)))
6281
2
    return MCDisassembler_Fail;
6282
721
  if (!Check(&S, DecodeQPRRegisterClass(Inst, Vm, Address, Decoder)))
6283
2
    return MCDisassembler_Fail;
6284
719
  MCOperand_CreateImm0(Inst, (64 - imm));
6285
6286
719
  return S;
6287
721
}
6288
6289
static DecodeStatus DecodeNEONComplexLane64Instruction(MCInst *Inst,
6290
                   unsigned Insn,
6291
                   uint64_t Address,
6292
                   const void *Decoder)
6293
390
{
6294
390
  unsigned Vd = (fieldFromInstruction_4(Insn, 12, 4) << 0);
6295
390
  Vd |= (fieldFromInstruction_4(Insn, 22, 1) << 4);
6296
390
  unsigned Vn = (fieldFromInstruction_4(Insn, 16, 4) << 0);
6297
390
  Vn |= (fieldFromInstruction_4(Insn, 7, 1) << 4);
6298
390
  unsigned Vm = (fieldFromInstruction_4(Insn, 0, 4) << 0);
6299
390
  Vm |= (fieldFromInstruction_4(Insn, 5, 1) << 4);
6300
390
  unsigned q = (fieldFromInstruction_4(Insn, 6, 1) << 0);
6301
390
  unsigned rotate = (fieldFromInstruction_4(Insn, 20, 2) << 0);
6302
6303
390
  DecodeStatus S = MCDisassembler_Success;
6304
6305
390
  typedef DecodeStatus (*DecoderFunction)(MCInst *Inst, unsigned RegNo,
6306
390
            uint64_t Address,
6307
390
            const void *Decoder);
6308
6309
390
  DecoderFunction DestRegDecoder = q ? DecodeQPRRegisterClass :
6310
390
               DecodeDPRRegisterClass;
6311
6312
390
  if (!Check(&S, DestRegDecoder(Inst, Vd, Address, Decoder)))
6313
1
    return MCDisassembler_Fail;
6314
389
  if (!Check(&S, DestRegDecoder(Inst, Vd, Address, Decoder)))
6315
0
    return MCDisassembler_Fail;
6316
389
  if (!Check(&S, DestRegDecoder(Inst, Vn, Address, Decoder)))
6317
2
    return MCDisassembler_Fail;
6318
387
  if (!Check(&S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder)))
6319
0
    return MCDisassembler_Fail;
6320
  // The lane index does not have any bits in the encoding, because it can
6321
  // only be 0.
6322
387
  MCOperand_CreateImm0(Inst, (0));
6323
387
  MCOperand_CreateImm0(Inst, (rotate));
6324
6325
387
  return S;
6326
387
}
6327
6328
static DecodeStatus DecodeLDR(MCInst *Inst, unsigned Val, uint64_t Address,
6329
            const void *Decoder)
6330
2.31k
{
6331
2.31k
  DecodeStatus S = MCDisassembler_Success;
6332
6333
2.31k
  unsigned Rn = fieldFromInstruction_4(Val, 16, 4);
6334
2.31k
  unsigned Rt = fieldFromInstruction_4(Val, 12, 4);
6335
2.31k
  unsigned Rm = fieldFromInstruction_4(Val, 0, 4);
6336
2.31k
  Rm |= (fieldFromInstruction_4(Val, 23, 1) << 4);
6337
2.31k
  unsigned Cond = fieldFromInstruction_4(Val, 28, 4);
6338
6339
2.31k
  if (fieldFromInstruction_4(Val, 8, 4) != 0 || Rn == Rt)
6340
1.12k
    S = MCDisassembler_SoftFail;
6341
6342
2.31k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
6343
0
    return MCDisassembler_Fail;
6344
2.31k
  if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
6345
0
    return MCDisassembler_Fail;
6346
2.31k
  if (!Check(&S, DecodeAddrMode7Operand(Inst, Rn, Address, Decoder)))
6347
0
    return MCDisassembler_Fail;
6348
2.31k
  if (!Check(&S, DecodePostIdxReg(Inst, Rm, Address, Decoder)))
6349
0
    return MCDisassembler_Fail;
6350
2.31k
  if (!Check(&S, DecodePredicateOperand(Inst, Cond, Address, Decoder)))
6351
2
    return MCDisassembler_Fail;
6352
6353
2.31k
  return S;
6354
2.31k
}
6355
6356
static DecodeStatus DecoderForMRRC2AndMCRR2(MCInst *Inst, unsigned Val,
6357
              uint64_t Address,
6358
              const void *Decoder)
6359
2.07k
{
6360
2.07k
  DecodeStatus S = MCDisassembler_Success;
6361
6362
2.07k
  unsigned CRm = fieldFromInstruction_4(Val, 0, 4);
6363
2.07k
  unsigned opc1 = fieldFromInstruction_4(Val, 4, 4);
6364
2.07k
  unsigned cop = fieldFromInstruction_4(Val, 8, 4);
6365
2.07k
  unsigned Rt = fieldFromInstruction_4(Val, 12, 4);
6366
2.07k
  unsigned Rt2 = fieldFromInstruction_4(Val, 16, 4);
6367
6368
2.07k
  if ((cop & ~0x1) == 0xa)
6369
9
    return MCDisassembler_Fail;
6370
6371
2.06k
  if (Rt == Rt2)
6372
291
    S = MCDisassembler_SoftFail;
6373
6374
  // We have to check if the instruction is MRRC2
6375
  // or MCRR2 when constructing the operands for
6376
  // Inst. Reason is because MRRC2 stores to two
6377
  // registers so its tablegen desc has two
6378
  // outputs whereas MCRR doesn't store to any
6379
  // registers so all of its operands are listed
6380
  // as inputs, therefore the operand order for
6381
  // MRRC2 needs to be [Rt, Rt2, cop, opc1, CRm]
6382
  // and MCRR2 operand order is [cop, opc1, Rt, Rt2, CRm]
6383
6384
2.06k
  if (MCInst_getOpcode(Inst) == ARM_MRRC2) {
6385
1.05k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address,
6386
1.05k
                Decoder)))
6387
0
      return MCDisassembler_Fail;
6388
1.05k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address,
6389
1.05k
                Decoder)))
6390
0
      return MCDisassembler_Fail;
6391
1.05k
  }
6392
2.06k
  MCOperand_CreateImm0(Inst, (cop));
6393
2.06k
  MCOperand_CreateImm0(Inst, (opc1));
6394
2.06k
  if (MCInst_getOpcode(Inst) == ARM_MCRR2) {
6395
1.01k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address,
6396
1.01k
                Decoder)))
6397
0
      return MCDisassembler_Fail;
6398
1.01k
    if (!Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address,
6399
1.01k
                Decoder)))
6400
0
      return MCDisassembler_Fail;
6401
1.01k
  }
6402
2.06k
  MCOperand_CreateImm0(Inst, (CRm));
6403
6404
2.06k
  return S;
6405
2.06k
}
6406
6407
static DecodeStatus DecodeForVMRSandVMSR(MCInst *Inst, unsigned Val,
6408
           uint64_t Address, const void *Decoder)
6409
1.84k
{
6410
1.84k
  DecodeStatus S = MCDisassembler_Success;
6411
6412
  // Add explicit operand for the destination sysreg, for cases where
6413
  // we have to model it for code generation purposes.
6414
1.84k
  switch (MCInst_getOpcode(Inst)) {
6415
232
  case ARM_VMSR_FPSCR_NZCVQC:
6416
232
    MCOperand_CreateReg0(Inst, (ARM_FPSCR_NZCV));
6417
232
    break;
6418
0
  case ARM_VMSR_P0:
6419
0
    MCOperand_CreateReg0(Inst, (ARM_VPR));
6420
0
    break;
6421
1.84k
  }
6422
6423
1.84k
  if (MCInst_getOpcode(Inst) != ARM_FMSTAT) {
6424
1.81k
    unsigned Rt = fieldFromInstruction_4(Val, 12, 4);
6425
6426
1.81k
    if (ARM_getFeatureBits(Inst->csh->mode, ARM_ModeThumb) &&
6427
1.81k
        !ARM_getFeatureBits(Inst->csh->mode, ARM_HasV8Ops)) {
6428
945
      if (Rt == 13 || Rt == 15)
6429
160
        S = MCDisassembler_SoftFail;
6430
945
      Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address,
6431
945
               Decoder));
6432
945
    } else
6433
865
      Check(&S, DecodeGPRnopcRegisterClass(Inst, Rt, Address,
6434
865
                   Decoder));
6435
1.81k
  }
6436
6437
  // Add explicit operand for the source sysreg, similarly to above.
6438
1.84k
  switch (MCInst_getOpcode(Inst)) {
6439
87
  case ARM_VMRS_FPSCR_NZCVQC:
6440
87
    MCOperand_CreateReg0(Inst, (ARM_FPSCR_NZCV));
6441
87
    break;
6442
0
  case ARM_VMRS_P0:
6443
0
    MCOperand_CreateReg0(Inst, (ARM_VPR));
6444
0
    break;
6445
1.84k
  }
6446
6447
1.84k
  if (ARM_getFeatureBits(Inst->csh->mode, ARM_ModeThumb)) {
6448
1.26k
    MCOperand_CreateImm0(Inst, (ARMCC_AL));
6449
1.26k
    MCOperand_CreateReg0(Inst, (0));
6450
1.26k
  } else {
6451
579
    unsigned pred = fieldFromInstruction_4(Val, 28, 4);
6452
579
    if (!Check(&S, DecodePredicateOperand(Inst, pred, Address,
6453
579
                  Decoder)))
6454
1
      return MCDisassembler_Fail;
6455
579
  }
6456
6457
1.84k
  return S;
6458
1.84k
}
6459
6460
#define DEFINE_DecodeBFLabelOperand(isSigned, isNeg, zeroPermitted, size) \
6461
  static DecodeStatus CONCAT( \
6462
    DecodeBFLabelOperand, \
6463
    CONCAT(isSigned, CONCAT(isNeg, CONCAT(zeroPermitted, size))))( \
6464
    MCInst * Inst, unsigned Val, uint64_t Address, \
6465
    const void *Decoder) \
6466
2.06k
  { \
6467
2.06k
    DecodeStatus S = MCDisassembler_Success; \
6468
2.06k
    if (Val == 0 && !zeroPermitted) \
6469
2.06k
      S = MCDisassembler_Fail; \
6470
2.06k
\
6471
2.06k
    uint64_t DecVal; \
6472
2.06k
    if (isSigned) \
6473
2.06k
      DecVal = SignExtend32((Val << 1), size + 1); \
6474
2.06k
    else \
6475
2.06k
      DecVal = (Val << 1); \
6476
2.06k
\
6477
2.06k
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6478
2.06k
                true, 4, Inst, Decoder)) \
6479
2.06k
      MCOperand_CreateImm0(Inst, \
6480
2.06k
               (isNeg ? -DecVal : DecVal)); \
6481
2.06k
    return S; \
6482
2.06k
  }
ARMDisassembler.c:DecodeBFLabelOperand_0_1_1_11
Line
Count
Source
6466
154
  { \
6467
154
    DecodeStatus S = MCDisassembler_Success; \
6468
154
    if (Val == 0 && !zeroPermitted) \
6469
154
      S = MCDisassembler_Fail; \
6470
154
\
6471
154
    uint64_t DecVal; \
6472
154
    if (isSigned) \
6473
154
      DecVal = SignExtend32((Val << 1), size + 1); \
6474
154
    else \
6475
154
      DecVal = (Val << 1); \
6476
154
\
6477
154
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6478
154
                true, 4, Inst, Decoder)) \
6479
154
      MCOperand_CreateImm0(Inst, \
6480
154
               (isNeg ? -DecVal : DecVal)); \
6481
154
    return S; \
6482
154
  }
ARMDisassembler.c:DecodeBFLabelOperand_0_0_1_11
Line
Count
Source
6466
686
  { \
6467
686
    DecodeStatus S = MCDisassembler_Success; \
6468
686
    if (Val == 0 && !zeroPermitted) \
6469
686
      S = MCDisassembler_Fail; \
6470
686
\
6471
686
    uint64_t DecVal; \
6472
686
    if (isSigned) \
6473
686
      DecVal = SignExtend32((Val << 1), size + 1); \
6474
686
    else \
6475
686
      DecVal = (Val << 1); \
6476
686
\
6477
686
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6478
686
                true, 4, Inst, Decoder)) \
6479
686
      MCOperand_CreateImm0(Inst, \
6480
686
               (isNeg ? -DecVal : DecVal)); \
6481
686
    return S; \
6482
686
  }
ARMDisassembler.c:DecodeBFLabelOperand_0_0_0_4
Line
Count
Source
6466
723
  { \
6467
723
    DecodeStatus S = MCDisassembler_Success; \
6468
723
    if (Val == 0 && !zeroPermitted) \
6469
723
      S = MCDisassembler_Fail; \
6470
723
\
6471
723
    uint64_t DecVal; \
6472
723
    if (isSigned) \
6473
723
      DecVal = SignExtend32((Val << 1), size + 1); \
6474
723
    else \
6475
723
      DecVal = (Val << 1); \
6476
723
\
6477
723
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6478
723
                true, 4, Inst, Decoder)) \
6479
723
      MCOperand_CreateImm0(Inst, \
6480
723
               (isNeg ? -DecVal : DecVal)); \
6481
723
    return S; \
6482
723
  }
ARMDisassembler.c:DecodeBFLabelOperand_1_0_1_18
Line
Count
Source
6466
133
  { \
6467
133
    DecodeStatus S = MCDisassembler_Success; \
6468
133
    if (Val == 0 && !zeroPermitted) \
6469
133
      S = MCDisassembler_Fail; \
6470
133
\
6471
133
    uint64_t DecVal; \
6472
133
    if (isSigned) \
6473
133
      DecVal = SignExtend32((Val << 1), size + 1); \
6474
133
    else \
6475
133
      DecVal = (Val << 1); \
6476
133
\
6477
133
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6478
133
                true, 4, Inst, Decoder)) \
6479
133
      MCOperand_CreateImm0(Inst, \
6480
133
               (isNeg ? -DecVal : DecVal)); \
6481
133
    return S; \
6482
133
  }
ARMDisassembler.c:DecodeBFLabelOperand_1_0_1_12
Line
Count
Source
6466
223
  { \
6467
223
    DecodeStatus S = MCDisassembler_Success; \
6468
223
    if (Val == 0 && !zeroPermitted) \
6469
223
      S = MCDisassembler_Fail; \
6470
223
\
6471
223
    uint64_t DecVal; \
6472
223
    if (isSigned) \
6473
223
      DecVal = SignExtend32((Val << 1), size + 1); \
6474
223
    else \
6475
223
      DecVal = (Val << 1); \
6476
223
\
6477
223
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6478
223
                true, 4, Inst, Decoder)) \
6479
223
      MCOperand_CreateImm0(Inst, \
6480
223
               (isNeg ? -DecVal : DecVal)); \
6481
223
    return S; \
6482
223
  }
ARMDisassembler.c:DecodeBFLabelOperand_1_0_1_16
Line
Count
Source
6466
143
  { \
6467
143
    DecodeStatus S = MCDisassembler_Success; \
6468
143
    if (Val == 0 && !zeroPermitted) \
6469
143
      S = MCDisassembler_Fail; \
6470
143
\
6471
143
    uint64_t DecVal; \
6472
143
    if (isSigned) \
6473
143
      DecVal = SignExtend32((Val << 1), size + 1); \
6474
143
    else \
6475
143
      DecVal = (Val << 1); \
6476
143
\
6477
143
    if (!tryAddingSymbolicOperand(Address, Address + DecVal + 4, \
6478
143
                true, 4, Inst, Decoder)) \
6479
143
      MCOperand_CreateImm0(Inst, \
6480
143
               (isNeg ? -DecVal : DecVal)); \
6481
143
    return S; \
6482
143
  }
6483
DEFINE_DecodeBFLabelOperand(false, false, false, 4);
6484
DEFINE_DecodeBFLabelOperand(true, false, true, 18);
6485
DEFINE_DecodeBFLabelOperand(true, false, true, 12);
6486
DEFINE_DecodeBFLabelOperand(true, false, true, 16);
6487
DEFINE_DecodeBFLabelOperand(false, true, true, 11);
6488
DEFINE_DecodeBFLabelOperand(false, false, true, 11);
6489
6490
static DecodeStatus DecodeBFAfterTargetOperand(MCInst *Inst, unsigned Val,
6491
                 uint64_t Address,
6492
                 const void *Decoder)
6493
223
{
6494
223
  uint64_t LocImm = MCOperand_getImm(MCInst_getOperand(Inst, (0)));
6495
223
  Val = LocImm + (2 << Val);
6496
223
  if (!tryAddingSymbolicOperand(Address, Address + Val + 4, true, 4, Inst,
6497
223
              Decoder))
6498
223
    MCOperand_CreateImm0(Inst, (Val));
6499
223
  return MCDisassembler_Success;
6500
223
}
6501
6502
static DecodeStatus DecodePredNoALOperand(MCInst *Inst, unsigned Val,
6503
            uint64_t Address, const void *Decoder)
6504
1.40k
{
6505
1.40k
  if (Val >= ARMCC_AL) // also exclude the non-condition NV
6506
2
    return MCDisassembler_Fail;
6507
1.40k
  MCOperand_CreateImm0(Inst, (Val));
6508
1.40k
  return MCDisassembler_Success;
6509
1.40k
}
6510
6511
static DecodeStatus DecodeLOLoop(MCInst *Inst, unsigned Insn, uint64_t Address,
6512
         const void *Decoder)
6513
2.58k
{
6514
2.58k
  DecodeStatus S = MCDisassembler_Success;
6515
6516
2.58k
  if (MCInst_getOpcode(Inst) == ARM_MVE_LCTP)
6517
0
    return S;
6518
6519
2.58k
  unsigned Imm = fieldFromInstruction_4(Insn, 11, 1) |
6520
2.58k
           fieldFromInstruction_4(Insn, 1, 10) << 1;
6521
2.58k
  switch (MCInst_getOpcode(Inst)) {
6522
66
  case ARM_t2LEUpdate:
6523
84
  case ARM_MVE_LETP:
6524
84
    MCOperand_CreateReg0(Inst, (ARM_LR));
6525
84
    MCOperand_CreateReg0(Inst, (ARM_LR));
6526
    // fall through
6527
154
  case ARM_t2LE:
6528
154
    if (!Check(&S, CONCAT(DecodeBFLabelOperand,
6529
154
              CONCAT(false,
6530
154
               CONCAT(true, CONCAT(true, 11))))(
6531
154
               Inst, Imm, Address, Decoder)))
6532
0
      return MCDisassembler_Fail;
6533
154
    break;
6534
154
  case ARM_t2WLS:
6535
389
  case ARM_MVE_WLSTP_8:
6536
430
  case ARM_MVE_WLSTP_16:
6537
588
  case ARM_MVE_WLSTP_32:
6538
686
  case ARM_MVE_WLSTP_64:
6539
686
    MCOperand_CreateReg0(Inst, (ARM_LR));
6540
686
    if (!Check(&S,
6541
686
         DecoderGPRRegisterClass(
6542
686
           Inst, fieldFromInstruction_4(Insn, 16, 4),
6543
686
           Address, Decoder)) ||
6544
686
        !Check(&S, CONCAT(DecodeBFLabelOperand,
6545
686
              CONCAT(false,
6546
686
               CONCAT(false, CONCAT(true, 11))))(
6547
686
               Inst, Imm, Address, Decoder)))
6548
0
      return MCDisassembler_Fail;
6549
686
    break;
6550
980
  case ARM_t2DLS:
6551
1.48k
  case ARM_MVE_DLSTP_8:
6552
1.55k
  case ARM_MVE_DLSTP_16:
6553
1.66k
  case ARM_MVE_DLSTP_32:
6554
1.74k
  case ARM_MVE_DLSTP_64: {
6555
1.74k
    unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
6556
1.74k
    if (Rn == 0xF) {
6557
      // Enforce all the rest of the instruction bits in LCTP, which
6558
      // won't have been reliably checked based on LCTP's own tablegen
6559
      // record, because we came to this decode by a roundabout route.
6560
527
      uint32_t CanonicalLCTP = 0xF00FE001,
6561
527
         SBZMask = 0x00300FFE;
6562
527
      if ((Insn & ~SBZMask) != CanonicalLCTP)
6563
2
        return MCDisassembler_Fail; // a mandatory bit is wrong: hard
6564
          // fail
6565
525
      if (Insn != CanonicalLCTP)
6566
324
        Check(&S,
6567
324
              MCDisassembler_SoftFail); // an SBZ bit is wrong: soft fail
6568
6569
525
      MCInst_setOpcode(Inst, (ARM_MVE_LCTP));
6570
1.21k
    } else {
6571
1.21k
      MCOperand_CreateReg0(Inst, (ARM_LR));
6572
1.21k
      if (!Check(&S,
6573
1.21k
           DecoderGPRRegisterClass(
6574
1.21k
             Inst,
6575
1.21k
             fieldFromInstruction_4(Insn, 16, 4),
6576
1.21k
             Address, Decoder)))
6577
0
        return MCDisassembler_Fail;
6578
1.21k
    }
6579
1.73k
    break;
6580
1.74k
  }
6581
2.58k
  }
6582
2.57k
  return S;
6583
2.58k
}
6584
6585
static DecodeStatus DecodeLongShiftOperand(MCInst *Inst, unsigned Val,
6586
             uint64_t Address,
6587
             const void *Decoder)
6588
499
{
6589
499
  DecodeStatus S = MCDisassembler_Success;
6590
6591
499
  if (Val == 0)
6592
67
    Val = 32;
6593
6594
499
  MCOperand_CreateImm0(Inst, (Val));
6595
6596
499
  return S;
6597
499
}
6598
6599
static DecodeStatus DecodetGPROddRegisterClass(MCInst *Inst, unsigned RegNo,
6600
                 uint64_t Address,
6601
                 const void *Decoder)
6602
5.94k
{
6603
5.94k
  if ((RegNo) + 1 > 11)
6604
922
    return MCDisassembler_Fail;
6605
6606
5.02k
  unsigned Register = GPRDecoderTable[(RegNo) + 1];
6607
5.02k
  MCOperand_CreateReg0(Inst, (Register));
6608
5.02k
  return MCDisassembler_Success;
6609
5.94k
}
6610
6611
static DecodeStatus DecodetGPREvenRegisterClass(MCInst *Inst, unsigned RegNo,
6612
            uint64_t Address,
6613
            const void *Decoder)
6614
11.2k
{
6615
11.2k
  if ((RegNo) > 14)
6616
0
    return MCDisassembler_Fail;
6617
6618
11.2k
  unsigned Register = GPRDecoderTable[(RegNo)];
6619
11.2k
  MCOperand_CreateReg0(Inst, (Register));
6620
11.2k
  return MCDisassembler_Success;
6621
11.2k
}
6622
6623
static DecodeStatus DecodeGPRwithAPSR_NZCVnospRegisterClass(MCInst *Inst,
6624
                  unsigned RegNo,
6625
                  uint64_t Address,
6626
                  const void *Decoder)
6627
0
{
6628
0
  if (RegNo == 15) {
6629
0
    MCOperand_CreateReg0(Inst, (ARM_APSR_NZCV));
6630
0
    return MCDisassembler_Success;
6631
0
  }
6632
6633
0
  unsigned Register = GPRDecoderTable[RegNo];
6634
0
  MCOperand_CreateReg0(Inst, (Register));
6635
6636
0
  if (RegNo == 13)
6637
0
    return MCDisassembler_SoftFail;
6638
6639
0
  return MCDisassembler_Success;
6640
0
}
6641
6642
static DecodeStatus DecodeVSCCLRM(MCInst *Inst, unsigned Insn, uint64_t Address,
6643
          const void *Decoder)
6644
191
{
6645
191
  DecodeStatus S = MCDisassembler_Success;
6646
6647
191
  MCOperand_CreateImm0(Inst, (ARMCC_AL));
6648
191
  MCOperand_CreateReg0(Inst, (0));
6649
191
  if (MCInst_getOpcode(Inst) == ARM_VSCCLRMD) {
6650
21
    unsigned reglist = (fieldFromInstruction_4(Insn, 1, 7) << 1) |
6651
21
           (fieldFromInstruction_4(Insn, 12, 4) << 8) |
6652
21
           (fieldFromInstruction_4(Insn, 22, 1) << 12);
6653
21
    if (!Check(&S, DecodeDPRRegListOperand(Inst, reglist, Address,
6654
21
                   Decoder))) {
6655
0
      return MCDisassembler_Fail;
6656
0
    }
6657
170
  } else {
6658
170
    unsigned reglist = fieldFromInstruction_4(Insn, 0, 8) |
6659
170
           (fieldFromInstruction_4(Insn, 22, 1) << 8) |
6660
170
           (fieldFromInstruction_4(Insn, 12, 4) << 9);
6661
170
    if (!Check(&S, DecodeSPRRegListOperand(Inst, reglist, Address,
6662
170
                   Decoder))) {
6663
0
      return MCDisassembler_Fail;
6664
0
    }
6665
170
  }
6666
191
  MCOperand_CreateReg0(Inst, (ARM_VPR));
6667
6668
191
  return S;
6669
191
}
6670
6671
static DecodeStatus DecodeMQPRRegisterClass(MCInst *Inst, unsigned RegNo,
6672
              uint64_t Address,
6673
              const void *Decoder)
6674
98.8k
{
6675
98.8k
  if (RegNo > 7)
6676
15.7k
    return MCDisassembler_Fail;
6677
6678
83.0k
  unsigned Register = QPRDecoderTable[RegNo];
6679
83.0k
  MCOperand_CreateReg0(Inst, (Register));
6680
83.0k
  return MCDisassembler_Success;
6681
98.8k
}
6682
6683
static const uint16_t QQPRDecoderTable[] = { ARM_Q0_Q1, ARM_Q1_Q2, ARM_Q2_Q3,
6684
               ARM_Q3_Q4, ARM_Q4_Q5, ARM_Q5_Q6,
6685
               ARM_Q6_Q7 };
6686
6687
static DecodeStatus DecodeMQQPRRegisterClass(MCInst *Inst, unsigned RegNo,
6688
               uint64_t Address,
6689
               const void *Decoder)
6690
1.55k
{
6691
1.55k
  if (RegNo > 6)
6692
465
    return MCDisassembler_Fail;
6693
6694
1.09k
  unsigned Register = QQPRDecoderTable[RegNo];
6695
1.09k
  MCOperand_CreateReg0(Inst, (Register));
6696
1.09k
  return MCDisassembler_Success;
6697
1.55k
}
6698
6699
static const uint16_t QQQQPRDecoderTable[] = { ARM_Q0_Q1_Q2_Q3, ARM_Q1_Q2_Q3_Q4,
6700
                 ARM_Q2_Q3_Q4_Q5, ARM_Q3_Q4_Q5_Q6,
6701
                 ARM_Q4_Q5_Q6_Q7 };
6702
6703
static DecodeStatus DecodeMQQQQPRRegisterClass(MCInst *Inst, unsigned RegNo,
6704
                 uint64_t Address,
6705
                 const void *Decoder)
6706
3.08k
{
6707
3.08k
  if (RegNo > 4)
6708
397
    return MCDisassembler_Fail;
6709
6710
2.68k
  unsigned Register = QQQQPRDecoderTable[RegNo];
6711
2.68k
  MCOperand_CreateReg0(Inst, (Register));
6712
2.68k
  return MCDisassembler_Success;
6713
3.08k
}
6714
6715
static DecodeStatus DecodeVPTMaskOperand(MCInst *Inst, unsigned Val,
6716
           uint64_t Address, const void *Decoder)
6717
8.98k
{
6718
8.98k
  DecodeStatus S = MCDisassembler_Success;
6719
6720
  // Parse VPT mask and encode it in the MCInst as an immediate with the same
6721
  // format as the it_mask.  That is, from the second 'e|t' encode 'e' as 1
6722
  // and 't' as 0 and finish with a 1.
6723
8.98k
  unsigned Imm = 0;
6724
  // We always start with a 't'.
6725
8.98k
  unsigned CurBit = 0;
6726
30.4k
  for (int i = 3; i >= 0; --i) {
6727
    // If the bit we are looking at is not the same as last one, invert the
6728
    // CurBit, if it is the same leave it as is.
6729
30.4k
    CurBit ^= (Val >> i) & 1U;
6730
6731
    // Encode the CurBit at the right place in the immediate.
6732
30.4k
    Imm |= (CurBit << i);
6733
6734
    // If we are done, finish the encoding with a 1.
6735
30.4k
    if ((Val & ~(~0U << i)) == 0) {
6736
8.98k
      Imm |= 1U << i;
6737
8.98k
      break;
6738
8.98k
    }
6739
30.4k
  }
6740
6741
8.98k
  MCOperand_CreateImm0(Inst, (Imm));
6742
6743
8.98k
  return S;
6744
8.98k
}
6745
6746
static DecodeStatus DecodeVpredROperand(MCInst *Inst, unsigned RegNo,
6747
          uint64_t Address, const void *Decoder)
6748
6.66k
{
6749
  // The vpred_r operand type includes an MQPR register field derived
6750
  // from the encoding. But we don't actually want to add an operand
6751
  // to the MCInst at this stage, because AddThumbPredicate will do it
6752
  // later, and will infer the register number from the TIED_TO
6753
  // constraint. So this is a deliberately empty decoder method that
6754
  // will inhibit the auto-generated disassembly code from adding an
6755
  // operand at all.
6756
6.66k
  return MCDisassembler_Success;
6757
6.66k
}
6758
6759
static DecodeStatus DecodeRestrictedIPredicateOperand(MCInst *Inst,
6760
                  unsigned Val,
6761
                  uint64_t Address,
6762
                  const void *Decoder)
6763
2.35k
{
6764
2.35k
  MCOperand_CreateImm0(Inst, ((Val & 0x1) == 0 ? ARMCC_EQ : ARMCC_NE));
6765
2.35k
  return MCDisassembler_Success;
6766
2.35k
}
6767
6768
static DecodeStatus DecodeRestrictedSPredicateOperand(MCInst *Inst,
6769
                  unsigned Val,
6770
                  uint64_t Address,
6771
                  const void *Decoder)
6772
4.08k
{
6773
4.08k
  unsigned Code;
6774
4.08k
  switch (Val & 0x3) {
6775
980
  case 0:
6776
980
    Code = ARMCC_GE;
6777
980
    break;
6778
1.28k
  case 1:
6779
1.28k
    Code = ARMCC_LT;
6780
1.28k
    break;
6781
800
  case 2:
6782
800
    Code = ARMCC_GT;
6783
800
    break;
6784
1.01k
  case 3:
6785
1.01k
    Code = ARMCC_LE;
6786
1.01k
    break;
6787
4.08k
  }
6788
4.08k
  MCOperand_CreateImm0(Inst, (Code));
6789
4.08k
  return MCDisassembler_Success;
6790
4.08k
}
6791
6792
static DecodeStatus DecodeRestrictedUPredicateOperand(MCInst *Inst,
6793
                  unsigned Val,
6794
                  uint64_t Address,
6795
                  const void *Decoder)
6796
2.58k
{
6797
2.58k
  MCOperand_CreateImm0(Inst, ((Val & 0x1) == 0 ? ARMCC_HS : ARMCC_HI));
6798
2.58k
  return MCDisassembler_Success;
6799
2.58k
}
6800
6801
static DecodeStatus DecodeRestrictedFPPredicateOperand(MCInst *Inst,
6802
                   unsigned Val,
6803
                   uint64_t Address,
6804
                   const void *Decoder)
6805
3.01k
{
6806
3.01k
  unsigned Code;
6807
3.01k
  switch (Val) {
6808
692
  default:
6809
692
    return MCDisassembler_Fail;
6810
550
  case 0:
6811
550
    Code = ARMCC_EQ;
6812
550
    break;
6813
451
  case 1:
6814
451
    Code = ARMCC_NE;
6815
451
    break;
6816
426
  case 4:
6817
426
    Code = ARMCC_GE;
6818
426
    break;
6819
277
  case 5:
6820
277
    Code = ARMCC_LT;
6821
277
    break;
6822
435
  case 6:
6823
435
    Code = ARMCC_GT;
6824
435
    break;
6825
185
  case 7:
6826
185
    Code = ARMCC_LE;
6827
185
    break;
6828
3.01k
  }
6829
6830
2.32k
  MCOperand_CreateImm0(Inst, (Code));
6831
2.32k
  return MCDisassembler_Success;
6832
3.01k
}
6833
6834
static DecodeStatus DecodeVCVTImmOperand(MCInst *Inst, unsigned Val,
6835
           uint64_t Address, const void *Decoder)
6836
771
{
6837
771
  DecodeStatus S = MCDisassembler_Success;
6838
6839
771
  unsigned DecodedVal = 64 - Val;
6840
6841
771
  switch (MCInst_getOpcode(Inst)) {
6842
75
  case ARM_MVE_VCVTf16s16_fix:
6843
269
  case ARM_MVE_VCVTs16f16_fix:
6844
341
  case ARM_MVE_VCVTf16u16_fix:
6845
441
  case ARM_MVE_VCVTu16f16_fix:
6846
441
    if (DecodedVal > 16)
6847
0
      return MCDisassembler_Fail;
6848
441
    break;
6849
441
  case ARM_MVE_VCVTf32s32_fix:
6850
171
  case ARM_MVE_VCVTs32f32_fix:
6851
262
  case ARM_MVE_VCVTf32u32_fix:
6852
330
  case ARM_MVE_VCVTu32f32_fix:
6853
330
    if (DecodedVal > 32)
6854
0
      return MCDisassembler_Fail;
6855
330
    break;
6856
771
  }
6857
6858
771
  MCOperand_CreateImm0(Inst, (64 - Val));
6859
6860
771
  return S;
6861
771
}
6862
6863
static unsigned FixedRegForVSTRVLDR_SYSREG(unsigned Opcode)
6864
4.26k
{
6865
4.26k
  switch (Opcode) {
6866
0
  case ARM_VSTR_P0_off:
6867
0
  case ARM_VSTR_P0_pre:
6868
0
  case ARM_VSTR_P0_post:
6869
0
  case ARM_VLDR_P0_off:
6870
0
  case ARM_VLDR_P0_pre:
6871
0
  case ARM_VLDR_P0_post:
6872
0
    return ARM_P0;
6873
4.26k
  default:
6874
4.26k
    return 0;
6875
4.26k
  }
6876
4.26k
}
6877
6878
#define DEFINE_DecodeVSTRVLDR_SYSREG(Writeback) \
6879
  static DecodeStatus CONCAT(DecodeVSTRVLDR_SYSREG, Writeback)( \
6880
    MCInst * Inst, unsigned Val, uint64_t Address, \
6881
    const void *Decoder) \
6882
4.26k
  { \
6883
4.26k
    switch (MCInst_getOpcode(Inst)) { \
6884
378
    case ARM_VSTR_FPSCR_pre: \
6885
388
    case ARM_VSTR_FPSCR_NZCVQC_pre: \
6886
874
    case ARM_VLDR_FPSCR_pre: \
6887
929
    case ARM_VLDR_FPSCR_NZCVQC_pre: \
6888
1.01k
    case ARM_VSTR_FPSCR_off: \
6889
1.36k
    case ARM_VSTR_FPSCR_NZCVQC_off: \
6890
1.44k
    case ARM_VLDR_FPSCR_off: \
6891
1.56k
    case ARM_VLDR_FPSCR_NZCVQC_off: \
6892
1.78k
    case ARM_VSTR_FPSCR_post: \
6893
1.85k
    case ARM_VSTR_FPSCR_NZCVQC_post: \
6894
2.25k
    case ARM_VLDR_FPSCR_post: \
6895
2.54k
    case ARM_VLDR_FPSCR_NZCVQC_post: \
6896
2.54k
\
6897
2.54k
      if (!ARM_getFeatureBits(Inst->csh->mode, \
6898
2.54k
            ARM_HasMVEIntegerOps) && \
6899
2.54k
          !ARM_getFeatureBits(Inst->csh->mode, \
6900
2.54k
            ARM_FeatureVFP2)) \
6901
2.54k
        return MCDisassembler_Fail; \
6902
4.26k
    } \
6903
4.26k
\
6904
4.26k
    DecodeStatus S = MCDisassembler_Success; \
6905
4.26k
    unsigned Sysreg = \
6906
4.26k
      FixedRegForVSTRVLDR_SYSREG(MCInst_getOpcode(Inst)); \
6907
4.26k
    if (Sysreg) \
6908
4.26k
      MCOperand_CreateReg0(Inst, (Sysreg)); \
6909
4.26k
    unsigned Rn = fieldFromInstruction_4(Val, 16, 4); \
6910
4.26k
    unsigned addr = fieldFromInstruction_4(Val, 0, 7) | \
6911
4.26k
        (fieldFromInstruction_4(Val, 23, 1) << 7) | \
6912
4.26k
        (Rn << 8); \
6913
4.26k
\
6914
4.26k
    if (Writeback) { \
6915
3.22k
      if (!Check(&S, DecodeGPRnopcRegisterClass( \
6916
3.22k
                 Inst, Rn, Address, Decoder))) \
6917
3.22k
        return MCDisassembler_Fail; \
6918
3.22k
    } \
6919
4.26k
    if (!Check(&S, DecodeT2AddrModeImm7s4(Inst, addr, Address, \
6920
4.26k
                  Decoder))) \
6921
4.26k
      return MCDisassembler_Fail; \
6922
4.26k
\
6923
4.26k
    MCOperand_CreateImm0(Inst, (ARMCC_AL)); \
6924
4.26k
    MCOperand_CreateReg0(Inst, (0)); \
6925
4.26k
\
6926
4.26k
    return S; \
6927
4.26k
  }
ARMDisassembler.c:DecodeVSTRVLDR_SYSREG_0
Line
Count
Source
6882
1.03k
  { \
6883
1.03k
    switch (MCInst_getOpcode(Inst)) { \
6884
0
    case ARM_VSTR_FPSCR_pre: \
6885
0
    case ARM_VSTR_FPSCR_NZCVQC_pre: \
6886
0
    case ARM_VLDR_FPSCR_pre: \
6887
0
    case ARM_VLDR_FPSCR_NZCVQC_pre: \
6888
84
    case ARM_VSTR_FPSCR_off: \
6889
436
    case ARM_VSTR_FPSCR_NZCVQC_off: \
6890
514
    case ARM_VLDR_FPSCR_off: \
6891
632
    case ARM_VLDR_FPSCR_NZCVQC_off: \
6892
632
    case ARM_VSTR_FPSCR_post: \
6893
632
    case ARM_VSTR_FPSCR_NZCVQC_post: \
6894
632
    case ARM_VLDR_FPSCR_post: \
6895
632
    case ARM_VLDR_FPSCR_NZCVQC_post: \
6896
632
\
6897
632
      if (!ARM_getFeatureBits(Inst->csh->mode, \
6898
632
            ARM_HasMVEIntegerOps) && \
6899
632
          !ARM_getFeatureBits(Inst->csh->mode, \
6900
632
            ARM_FeatureVFP2)) \
6901
632
        return MCDisassembler_Fail; \
6902
1.03k
    } \
6903
1.03k
\
6904
1.03k
    DecodeStatus S = MCDisassembler_Success; \
6905
1.03k
    unsigned Sysreg = \
6906
1.03k
      FixedRegForVSTRVLDR_SYSREG(MCInst_getOpcode(Inst)); \
6907
1.03k
    if (Sysreg) \
6908
1.03k
      MCOperand_CreateReg0(Inst, (Sysreg)); \
6909
1.03k
    unsigned Rn = fieldFromInstruction_4(Val, 16, 4); \
6910
1.03k
    unsigned addr = fieldFromInstruction_4(Val, 0, 7) | \
6911
1.03k
        (fieldFromInstruction_4(Val, 23, 1) << 7) | \
6912
1.03k
        (Rn << 8); \
6913
1.03k
\
6914
1.03k
    if (Writeback) { \
6915
0
      if (!Check(&S, DecodeGPRnopcRegisterClass( \
6916
0
                 Inst, Rn, Address, Decoder))) \
6917
0
        return MCDisassembler_Fail; \
6918
0
    } \
6919
1.03k
    if (!Check(&S, DecodeT2AddrModeImm7s4(Inst, addr, Address, \
6920
1.03k
                  Decoder))) \
6921
1.03k
      return MCDisassembler_Fail; \
6922
1.03k
\
6923
1.03k
    MCOperand_CreateImm0(Inst, (ARMCC_AL)); \
6924
1.03k
    MCOperand_CreateReg0(Inst, (0)); \
6925
1.03k
\
6926
1.03k
    return S; \
6927
1.03k
  }
ARMDisassembler.c:DecodeVSTRVLDR_SYSREG_1
Line
Count
Source
6882
3.22k
  { \
6883
3.22k
    switch (MCInst_getOpcode(Inst)) { \
6884
378
    case ARM_VSTR_FPSCR_pre: \
6885
388
    case ARM_VSTR_FPSCR_NZCVQC_pre: \
6886
874
    case ARM_VLDR_FPSCR_pre: \
6887
929
    case ARM_VLDR_FPSCR_NZCVQC_pre: \
6888
929
    case ARM_VSTR_FPSCR_off: \
6889
929
    case ARM_VSTR_FPSCR_NZCVQC_off: \
6890
929
    case ARM_VLDR_FPSCR_off: \
6891
929
    case ARM_VLDR_FPSCR_NZCVQC_off: \
6892
1.15k
    case ARM_VSTR_FPSCR_post: \
6893
1.22k
    case ARM_VSTR_FPSCR_NZCVQC_post: \
6894
1.62k
    case ARM_VLDR_FPSCR_post: \
6895
1.91k
    case ARM_VLDR_FPSCR_NZCVQC_post: \
6896
1.91k
\
6897
1.91k
      if (!ARM_getFeatureBits(Inst->csh->mode, \
6898
1.91k
            ARM_HasMVEIntegerOps) && \
6899
1.91k
          !ARM_getFeatureBits(Inst->csh->mode, \
6900
1.91k
            ARM_FeatureVFP2)) \
6901
1.91k
        return MCDisassembler_Fail; \
6902
3.22k
    } \
6903
3.22k
\
6904
3.22k
    DecodeStatus S = MCDisassembler_Success; \
6905
3.22k
    unsigned Sysreg = \
6906
3.22k
      FixedRegForVSTRVLDR_SYSREG(MCInst_getOpcode(Inst)); \
6907
3.22k
    if (Sysreg) \
6908
3.22k
      MCOperand_CreateReg0(Inst, (Sysreg)); \
6909
3.22k
    unsigned Rn = fieldFromInstruction_4(Val, 16, 4); \
6910
3.22k
    unsigned addr = fieldFromInstruction_4(Val, 0, 7) | \
6911
3.22k
        (fieldFromInstruction_4(Val, 23, 1) << 7) | \
6912
3.22k
        (Rn << 8); \
6913
3.22k
\
6914
3.22k
    if (Writeback) { \
6915
3.22k
      if (!Check(&S, DecodeGPRnopcRegisterClass( \
6916
3.22k
                 Inst, Rn, Address, Decoder))) \
6917
3.22k
        return MCDisassembler_Fail; \
6918
3.22k
    } \
6919
3.22k
    if (!Check(&S, DecodeT2AddrModeImm7s4(Inst, addr, Address, \
6920
3.22k
                  Decoder))) \
6921
3.22k
      return MCDisassembler_Fail; \
6922
3.22k
\
6923
3.22k
    MCOperand_CreateImm0(Inst, (ARMCC_AL)); \
6924
3.22k
    MCOperand_CreateReg0(Inst, (0)); \
6925
3.22k
\
6926
3.22k
    return S; \
6927
3.22k
  }
6928
DEFINE_DecodeVSTRVLDR_SYSREG(false);
6929
DEFINE_DecodeVSTRVLDR_SYSREG(true);
6930
6931
static inline DecodeStatus DecodeMVE_MEM_pre(MCInst *Inst, unsigned Val,
6932
               uint64_t Address,
6933
               const void *Decoder, unsigned Rn,
6934
               OperandDecoder RnDecoder,
6935
               OperandDecoder AddrDecoder)
6936
4.20k
{
6937
4.20k
  DecodeStatus S = MCDisassembler_Success;
6938
6939
4.20k
  unsigned Qd = fieldFromInstruction_4(Val, 13, 3);
6940
4.20k
  unsigned addr = fieldFromInstruction_4(Val, 0, 7) |
6941
4.20k
      (fieldFromInstruction_4(Val, 23, 1) << 7) | (Rn << 8);
6942
6943
4.20k
  if (!Check(&S, RnDecoder(Inst, Rn, Address, Decoder)))
6944
0
    return MCDisassembler_Fail;
6945
4.20k
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
6946
0
    return MCDisassembler_Fail;
6947
4.20k
  if (!Check(&S, AddrDecoder(Inst, addr, Address, Decoder)))
6948
0
    return MCDisassembler_Fail;
6949
6950
4.20k
  return S;
6951
4.20k
}
6952
6953
#define DEFINE_DecodeMVE_MEM_1_pre(shift) \
6954
  static DecodeStatus CONCAT(DecodeMVE_MEM_1_pre, shift)( \
6955
    MCInst * Inst, unsigned Val, uint64_t Address, \
6956
    const void *Decoder) \
6957
976
  { \
6958
976
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6959
976
           fieldFromInstruction_4(Val, 16, 3), \
6960
976
           DecodetGPRRegisterClass, \
6961
976
           CONCAT(DecodeTAddrModeImm7, shift)); \
6962
976
  }
ARMDisassembler.c:DecodeMVE_MEM_1_pre_0
Line
Count
Source
6957
778
  { \
6958
778
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6959
778
           fieldFromInstruction_4(Val, 16, 3), \
6960
778
           DecodetGPRRegisterClass, \
6961
778
           CONCAT(DecodeTAddrModeImm7, shift)); \
6962
778
  }
ARMDisassembler.c:DecodeMVE_MEM_1_pre_1
Line
Count
Source
6957
198
  { \
6958
198
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6959
198
           fieldFromInstruction_4(Val, 16, 3), \
6960
198
           DecodetGPRRegisterClass, \
6961
198
           CONCAT(DecodeTAddrModeImm7, shift)); \
6962
198
  }
6963
DEFINE_DecodeMVE_MEM_1_pre(0);
6964
DEFINE_DecodeMVE_MEM_1_pre(1);
6965
6966
#define DEFINE_DecodeMVE_MEM_2_pre(shift) \
6967
  static DecodeStatus CONCAT(DecodeMVE_MEM_2_pre, shift)( \
6968
    MCInst * Inst, unsigned Val, uint64_t Address, \
6969
    const void *Decoder) \
6970
2.09k
  { \
6971
2.09k
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6972
2.09k
           fieldFromInstruction_4(Val, 16, 4), \
6973
2.09k
           DecoderGPRRegisterClass, \
6974
2.09k
           CONCAT(DecodeT2AddrModeImm7, \
6975
2.09k
            CONCAT(shift, 1))); \
6976
2.09k
  }
ARMDisassembler.c:DecodeMVE_MEM_2_pre_0
Line
Count
Source
6970
503
  { \
6971
503
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6972
503
           fieldFromInstruction_4(Val, 16, 4), \
6973
503
           DecoderGPRRegisterClass, \
6974
503
           CONCAT(DecodeT2AddrModeImm7, \
6975
503
            CONCAT(shift, 1))); \
6976
503
  }
ARMDisassembler.c:DecodeMVE_MEM_2_pre_1
Line
Count
Source
6970
820
  { \
6971
820
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6972
820
           fieldFromInstruction_4(Val, 16, 4), \
6973
820
           DecoderGPRRegisterClass, \
6974
820
           CONCAT(DecodeT2AddrModeImm7, \
6975
820
            CONCAT(shift, 1))); \
6976
820
  }
ARMDisassembler.c:DecodeMVE_MEM_2_pre_2
Line
Count
Source
6970
768
  { \
6971
768
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6972
768
           fieldFromInstruction_4(Val, 16, 4), \
6973
768
           DecoderGPRRegisterClass, \
6974
768
           CONCAT(DecodeT2AddrModeImm7, \
6975
768
            CONCAT(shift, 1))); \
6976
768
  }
6977
DEFINE_DecodeMVE_MEM_2_pre(0);
6978
DEFINE_DecodeMVE_MEM_2_pre(1);
6979
DEFINE_DecodeMVE_MEM_2_pre(2);
6980
6981
#define DEFINE_DecodeMVE_MEM_3_pre(shift) \
6982
  static DecodeStatus CONCAT(DecodeMVE_MEM_3_pre, shift)( \
6983
    MCInst * Inst, unsigned Val, uint64_t Address, \
6984
    const void *Decoder) \
6985
1.13k
  { \
6986
1.13k
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6987
1.13k
           fieldFromInstruction_4(Val, 17, 3), \
6988
1.13k
           DecodeMQPRRegisterClass, \
6989
1.13k
           CONCAT(DecodeMveAddrModeQ, shift)); \
6990
1.13k
  }
ARMDisassembler.c:DecodeMVE_MEM_3_pre_2
Line
Count
Source
6985
937
  { \
6986
937
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6987
937
           fieldFromInstruction_4(Val, 17, 3), \
6988
937
           DecodeMQPRRegisterClass, \
6989
937
           CONCAT(DecodeMveAddrModeQ, shift)); \
6990
937
  }
ARMDisassembler.c:DecodeMVE_MEM_3_pre_3
Line
Count
Source
6985
201
  { \
6986
201
    return DecodeMVE_MEM_pre(Inst, Val, Address, Decoder, \
6987
201
           fieldFromInstruction_4(Val, 17, 3), \
6988
201
           DecodeMQPRRegisterClass, \
6989
201
           CONCAT(DecodeMveAddrModeQ, shift)); \
6990
201
  }
6991
DEFINE_DecodeMVE_MEM_3_pre(2);
6992
DEFINE_DecodeMVE_MEM_3_pre(3);
6993
6994
#define DEFINE_DecodePowerTwoOperand(MinLog, MaxLog) \
6995
  static DecodeStatus CONCAT(DecodePowerTwoOperand, \
6996
           CONCAT(MinLog, MaxLog))( \
6997
    MCInst * Inst, unsigned Val, uint64_t Address, \
6998
    const void *Decoder) \
6999
1.56k
  { \
7000
1.56k
    DecodeStatus S = MCDisassembler_Success; \
7001
1.56k
\
7002
1.56k
    if (Val < MinLog || Val > MaxLog) \
7003
1.56k
      return MCDisassembler_Fail; \
7004
1.56k
\
7005
1.56k
    MCOperand_CreateImm0(Inst, (1LL << Val)); \
7006
1.56k
    return S; \
7007
1.56k
  }
7008
DEFINE_DecodePowerTwoOperand(0, 3);
7009
7010
#define DEFINE_DecodeMVEPairVectorIndexOperand(start) \
7011
  static DecodeStatus CONCAT(DecodeMVEPairVectorIndexOperand, start)( \
7012
    MCInst * Inst, unsigned Val, uint64_t Address, \
7013
    const void *Decoder) \
7014
0
  { \
7015
0
    DecodeStatus S = MCDisassembler_Success; \
7016
0
\
7017
0
    MCOperand_CreateImm0(Inst, (start + Val)); \
7018
0
\
7019
0
    return S; \
7020
0
  }
Unexecuted instantiation: ARMDisassembler.c:DecodeMVEPairVectorIndexOperand_2
Unexecuted instantiation: ARMDisassembler.c:DecodeMVEPairVectorIndexOperand_0
7021
DEFINE_DecodeMVEPairVectorIndexOperand(2);
7022
DEFINE_DecodeMVEPairVectorIndexOperand(0);
7023
7024
static DecodeStatus DecodeMVEVMOVQtoDReg(MCInst *Inst, unsigned Insn,
7025
           uint64_t Address, const void *Decoder)
7026
0
{
7027
0
  DecodeStatus S = MCDisassembler_Success;
7028
0
  unsigned Rt = fieldFromInstruction_4(Insn, 0, 4);
7029
0
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
7030
0
  unsigned Qd = ((fieldFromInstruction_4(Insn, 22, 1) << 3) |
7031
0
           fieldFromInstruction_4(Insn, 13, 3));
7032
0
  unsigned index = fieldFromInstruction_4(Insn, 4, 1);
7033
7034
0
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
7035
0
    return MCDisassembler_Fail;
7036
0
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2, Address, Decoder)))
7037
0
    return MCDisassembler_Fail;
7038
0
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
7039
0
    return MCDisassembler_Fail;
7040
0
  if (!Check(&S, CONCAT(DecodeMVEPairVectorIndexOperand,
7041
0
            2)(Inst, index, Address, Decoder)))
7042
0
    return MCDisassembler_Fail;
7043
0
  if (!Check(&S, CONCAT(DecodeMVEPairVectorIndexOperand,
7044
0
            0)(Inst, index, Address, Decoder)))
7045
0
    return MCDisassembler_Fail;
7046
7047
0
  return S;
7048
0
}
7049
7050
static DecodeStatus DecodeMVEVMOVDRegtoQ(MCInst *Inst, unsigned Insn,
7051
           uint64_t Address, const void *Decoder)
7052
0
{
7053
0
  DecodeStatus S = MCDisassembler_Success;
7054
0
  unsigned Rt = fieldFromInstruction_4(Insn, 0, 4);
7055
0
  unsigned Rt2 = fieldFromInstruction_4(Insn, 16, 4);
7056
0
  unsigned Qd = ((fieldFromInstruction_4(Insn, 22, 1) << 3) |
7057
0
           fieldFromInstruction_4(Insn, 13, 3));
7058
0
  unsigned index = fieldFromInstruction_4(Insn, 4, 1);
7059
7060
0
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
7061
0
    return MCDisassembler_Fail;
7062
0
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
7063
0
    return MCDisassembler_Fail;
7064
0
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
7065
0
    return MCDisassembler_Fail;
7066
0
  if (!Check(&S, DecodeGPRRegisterClass(Inst, Rt2, Address, Decoder)))
7067
0
    return MCDisassembler_Fail;
7068
0
  if (!Check(&S, CONCAT(DecodeMVEPairVectorIndexOperand,
7069
0
            2)(Inst, index, Address, Decoder)))
7070
0
    return MCDisassembler_Fail;
7071
0
  if (!Check(&S, CONCAT(DecodeMVEPairVectorIndexOperand,
7072
0
            0)(Inst, index, Address, Decoder)))
7073
0
    return MCDisassembler_Fail;
7074
7075
0
  return S;
7076
0
}
7077
7078
static DecodeStatus DecodeMVEOverlappingLongShift(MCInst *Inst, unsigned Insn,
7079
              uint64_t Address,
7080
              const void *Decoder)
7081
0
{
7082
0
  DecodeStatus S = MCDisassembler_Success;
7083
7084
0
  unsigned RdaLo = fieldFromInstruction_4(Insn, 17, 3) << 1;
7085
0
  unsigned RdaHi = fieldFromInstruction_4(Insn, 9, 3) << 1;
7086
0
  unsigned Rm = fieldFromInstruction_4(Insn, 12, 4);
7087
7088
0
  if (RdaHi == 14) {
7089
    // This value of RdaHi (really indicating pc, because RdaHi has to
7090
    // be an odd-numbered register, so the low bit will be set by the
7091
    // decode function below) indicates that we must decode as SQRSHR
7092
    // or UQRSHL, which both have a single Rda register field with all
7093
    // four bits.
7094
0
    unsigned Rda = fieldFromInstruction_4(Insn, 16, 4);
7095
7096
0
    switch (MCInst_getOpcode(Inst)) {
7097
0
    case ARM_MVE_ASRLr:
7098
0
    case ARM_MVE_SQRSHRL:
7099
0
      MCInst_setOpcode(Inst, (ARM_MVE_SQRSHR));
7100
0
      break;
7101
0
    case ARM_MVE_LSLLr:
7102
0
    case ARM_MVE_UQRSHLL:
7103
0
      MCInst_setOpcode(Inst, (ARM_MVE_UQRSHL));
7104
0
      break;
7105
0
    default:
7106
      // llvm_unreachable("Unexpected starting opcode!");
7107
0
      break;
7108
0
    }
7109
7110
    // Rda as output parameter
7111
0
    if (!Check(&S, DecoderGPRRegisterClass(Inst, Rda, Address,
7112
0
                   Decoder)))
7113
0
      return MCDisassembler_Fail;
7114
7115
    // Rda again as input parameter
7116
0
    if (!Check(&S, DecoderGPRRegisterClass(Inst, Rda, Address,
7117
0
                   Decoder)))
7118
0
      return MCDisassembler_Fail;
7119
7120
    // Rm, the amount to shift by
7121
0
    if (!Check(&S,
7122
0
         DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
7123
0
      return MCDisassembler_Fail;
7124
7125
0
    if (fieldFromInstruction_4(Insn, 6, 3) != 4)
7126
0
      return MCDisassembler_SoftFail;
7127
7128
0
    if (Rda == Rm)
7129
0
      return MCDisassembler_SoftFail;
7130
7131
0
    return S;
7132
0
  }
7133
7134
  // Otherwise, we decode as whichever opcode our caller has already
7135
  // put into Inst. Those all look the same:
7136
7137
  // RdaLo,RdaHi as output parameters
7138
0
  if (!Check(&S,
7139
0
       DecodetGPREvenRegisterClass(Inst, RdaLo, Address, Decoder)))
7140
0
    return MCDisassembler_Fail;
7141
0
  if (!Check(&S,
7142
0
       DecodetGPROddRegisterClass(Inst, RdaHi, Address, Decoder)))
7143
0
    return MCDisassembler_Fail;
7144
7145
  // RdaLo,RdaHi again as input parameters
7146
0
  if (!Check(&S,
7147
0
       DecodetGPREvenRegisterClass(Inst, RdaLo, Address, Decoder)))
7148
0
    return MCDisassembler_Fail;
7149
0
  if (!Check(&S,
7150
0
       DecodetGPROddRegisterClass(Inst, RdaHi, Address, Decoder)))
7151
0
    return MCDisassembler_Fail;
7152
7153
  // Rm, the amount to shift by
7154
0
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
7155
0
    return MCDisassembler_Fail;
7156
7157
0
  if (MCInst_getOpcode(Inst) == ARM_MVE_SQRSHRL ||
7158
0
      MCInst_getOpcode(Inst) == ARM_MVE_UQRSHLL) {
7159
0
    unsigned Saturate = fieldFromInstruction_4(Insn, 7, 1);
7160
    // Saturate, the bit position for saturation
7161
0
    MCOperand_CreateImm0(Inst, (Saturate));
7162
0
  }
7163
7164
0
  return S;
7165
0
}
7166
7167
static DecodeStatus DecodeMVEVCVTt1fp(MCInst *Inst, unsigned Insn,
7168
              uint64_t Address, const void *Decoder)
7169
1.20k
{
7170
1.20k
  DecodeStatus S = MCDisassembler_Success;
7171
1.20k
  unsigned Qd = ((fieldFromInstruction_4(Insn, 22, 1) << 3) |
7172
1.20k
           fieldFromInstruction_4(Insn, 13, 3));
7173
1.20k
  unsigned Qm = ((fieldFromInstruction_4(Insn, 5, 1) << 3) |
7174
1.20k
           fieldFromInstruction_4(Insn, 1, 3));
7175
1.20k
  unsigned imm6 = fieldFromInstruction_4(Insn, 16, 6);
7176
7177
1.20k
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qd, Address, Decoder)))
7178
347
    return MCDisassembler_Fail;
7179
859
  if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qm, Address, Decoder)))
7180
88
    return MCDisassembler_Fail;
7181
771
  if (!Check(&S, DecodeVCVTImmOperand(Inst, imm6, Address, Decoder)))
7182
0
    return MCDisassembler_Fail;
7183
7184
771
  return S;
7185
771
}
7186
7187
#define DEFINE_DecodeMVEVCMP(scalar, predicate_decoder) \
7188
  static DecodeStatus CONCAT(DecodeMVEVCMP, \
7189
           CONCAT(scalar, predicate_decoder))( \
7190
    MCInst * Inst, unsigned Insn, uint64_t Address, \
7191
    const void *Decoder) \
7192
4.97k
  { \
7193
4.97k
    DecodeStatus S = MCDisassembler_Success; \
7194
4.97k
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7195
4.97k
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7196
4.97k
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7197
4.97k
                   Decoder))) \
7198
4.97k
      return MCDisassembler_Fail; \
7199
4.97k
\
7200
4.97k
    unsigned fc; \
7201
4.97k
\
7202
4.97k
    if (scalar) { \
7203
2.65k
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7204
2.65k
           fieldFromInstruction_4(Insn, 7, 1) | \
7205
2.65k
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7206
2.65k
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7207
2.65k
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7208
2.65k
                 Inst, Rm, Address, Decoder))) \
7209
2.65k
        return MCDisassembler_Fail; \
7210
2.65k
    } else { \
7211
2.32k
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7212
2.32k
           fieldFromInstruction_4(Insn, 7, 1) | \
7213
2.32k
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7214
2.32k
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7215
2.32k
                << 4 | \
7216
2.32k
              fieldFromInstruction_4(Insn, 1, 3); \
7217
2.32k
      if (!Check(&S, DecodeMQPRRegisterClass( \
7218
2.32k
                 Inst, Qm, Address, Decoder))) \
7219
2.32k
        return MCDisassembler_Fail; \
7220
2.32k
    } \
7221
4.97k
\
7222
4.97k
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7223
4.04k
      return MCDisassembler_Fail; \
7224
4.04k
\
7225
4.04k
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7226
3.72k
    MCOperand_CreateReg0(Inst, (0)); \
7227
3.72k
    MCOperand_CreateImm0(Inst, (0)); \
7228
3.72k
\
7229
3.72k
    return S; \
7230
4.04k
  }
ARMDisassembler.c:DecodeMVEVCMP_0_DecodeRestrictedIPredicateOperand
Line
Count
Source
7192
562
  { \
7193
562
    DecodeStatus S = MCDisassembler_Success; \
7194
562
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7195
562
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7196
562
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7197
562
                   Decoder))) \
7198
562
      return MCDisassembler_Fail; \
7199
562
\
7200
562
    unsigned fc; \
7201
562
\
7202
562
    if (scalar) { \
7203
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7204
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7205
0
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7206
0
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7207
0
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7208
0
                 Inst, Rm, Address, Decoder))) \
7209
0
        return MCDisassembler_Fail; \
7210
562
    } else { \
7211
562
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7212
562
           fieldFromInstruction_4(Insn, 7, 1) | \
7213
562
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7214
562
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7215
562
                << 4 | \
7216
562
              fieldFromInstruction_4(Insn, 1, 3); \
7217
562
      if (!Check(&S, DecodeMQPRRegisterClass( \
7218
562
                 Inst, Qm, Address, Decoder))) \
7219
562
        return MCDisassembler_Fail; \
7220
562
    } \
7221
562
\
7222
562
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7223
328
      return MCDisassembler_Fail; \
7224
328
\
7225
328
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7226
328
    MCOperand_CreateReg0(Inst, (0)); \
7227
328
    MCOperand_CreateImm0(Inst, (0)); \
7228
328
\
7229
328
    return S; \
7230
328
  }
ARMDisassembler.c:DecodeMVEVCMP_0_DecodeRestrictedUPredicateOperand
Line
Count
Source
7192
794
  { \
7193
794
    DecodeStatus S = MCDisassembler_Success; \
7194
794
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7195
794
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7196
794
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7197
794
                   Decoder))) \
7198
794
      return MCDisassembler_Fail; \
7199
794
\
7200
794
    unsigned fc; \
7201
794
\
7202
794
    if (scalar) { \
7203
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7204
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7205
0
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7206
0
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7207
0
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7208
0
                 Inst, Rm, Address, Decoder))) \
7209
0
        return MCDisassembler_Fail; \
7210
794
    } else { \
7211
794
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7212
794
           fieldFromInstruction_4(Insn, 7, 1) | \
7213
794
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7214
794
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7215
794
                << 4 | \
7216
794
              fieldFromInstruction_4(Insn, 1, 3); \
7217
794
      if (!Check(&S, DecodeMQPRRegisterClass( \
7218
794
                 Inst, Qm, Address, Decoder))) \
7219
794
        return MCDisassembler_Fail; \
7220
794
    } \
7221
794
\
7222
794
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7223
448
      return MCDisassembler_Fail; \
7224
448
\
7225
448
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7226
448
    MCOperand_CreateReg0(Inst, (0)); \
7227
448
    MCOperand_CreateImm0(Inst, (0)); \
7228
448
\
7229
448
    return S; \
7230
448
  }
ARMDisassembler.c:DecodeMVEVCMP_0_DecodeRestrictedSPredicateOperand
Line
Count
Source
7192
575
  { \
7193
575
    DecodeStatus S = MCDisassembler_Success; \
7194
575
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7195
575
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7196
575
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7197
575
                   Decoder))) \
7198
575
      return MCDisassembler_Fail; \
7199
575
\
7200
575
    unsigned fc; \
7201
575
\
7202
575
    if (scalar) { \
7203
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7204
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7205
0
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7206
0
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7207
0
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7208
0
                 Inst, Rm, Address, Decoder))) \
7209
0
        return MCDisassembler_Fail; \
7210
575
    } else { \
7211
575
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7212
575
           fieldFromInstruction_4(Insn, 7, 1) | \
7213
575
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7214
575
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7215
575
                << 4 | \
7216
575
              fieldFromInstruction_4(Insn, 1, 3); \
7217
575
      if (!Check(&S, DecodeMQPRRegisterClass( \
7218
575
                 Inst, Qm, Address, Decoder))) \
7219
575
        return MCDisassembler_Fail; \
7220
575
    } \
7221
575
\
7222
575
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7223
312
      return MCDisassembler_Fail; \
7224
312
\
7225
312
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7226
312
    MCOperand_CreateReg0(Inst, (0)); \
7227
312
    MCOperand_CreateImm0(Inst, (0)); \
7228
312
\
7229
312
    return S; \
7230
312
  }
ARMDisassembler.c:DecodeMVEVCMP_1_DecodeRestrictedIPredicateOperand
Line
Count
Source
7192
572
  { \
7193
572
    DecodeStatus S = MCDisassembler_Success; \
7194
572
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7195
572
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7196
572
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7197
572
                   Decoder))) \
7198
572
      return MCDisassembler_Fail; \
7199
572
\
7200
572
    unsigned fc; \
7201
572
\
7202
572
    if (scalar) { \
7203
572
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7204
572
           fieldFromInstruction_4(Insn, 7, 1) | \
7205
572
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7206
572
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7207
572
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7208
572
                 Inst, Rm, Address, Decoder))) \
7209
572
        return MCDisassembler_Fail; \
7210
572
    } else { \
7211
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7212
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7213
0
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7214
0
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7215
0
                << 4 | \
7216
0
              fieldFromInstruction_4(Insn, 1, 3); \
7217
0
      if (!Check(&S, DecodeMQPRRegisterClass( \
7218
0
                 Inst, Qm, Address, Decoder))) \
7219
0
        return MCDisassembler_Fail; \
7220
0
    } \
7221
572
\
7222
572
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7223
572
      return MCDisassembler_Fail; \
7224
572
\
7225
572
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7226
572
    MCOperand_CreateReg0(Inst, (0)); \
7227
572
    MCOperand_CreateImm0(Inst, (0)); \
7228
572
\
7229
572
    return S; \
7230
572
  }
ARMDisassembler.c:DecodeMVEVCMP_1_DecodeRestrictedUPredicateOperand
Line
Count
Source
7192
472
  { \
7193
472
    DecodeStatus S = MCDisassembler_Success; \
7194
472
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7195
472
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7196
472
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7197
472
                   Decoder))) \
7198
472
      return MCDisassembler_Fail; \
7199
472
\
7200
472
    unsigned fc; \
7201
472
\
7202
472
    if (scalar) { \
7203
472
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7204
472
           fieldFromInstruction_4(Insn, 7, 1) | \
7205
472
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7206
472
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7207
472
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7208
472
                 Inst, Rm, Address, Decoder))) \
7209
472
        return MCDisassembler_Fail; \
7210
472
    } else { \
7211
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7212
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7213
0
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7214
0
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7215
0
                << 4 | \
7216
0
              fieldFromInstruction_4(Insn, 1, 3); \
7217
0
      if (!Check(&S, DecodeMQPRRegisterClass( \
7218
0
                 Inst, Qm, Address, Decoder))) \
7219
0
        return MCDisassembler_Fail; \
7220
0
    } \
7221
472
\
7222
472
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7223
472
      return MCDisassembler_Fail; \
7224
472
\
7225
472
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7226
472
    MCOperand_CreateReg0(Inst, (0)); \
7227
472
    MCOperand_CreateImm0(Inst, (0)); \
7228
472
\
7229
472
    return S; \
7230
472
  }
ARMDisassembler.c:DecodeMVEVCMP_1_DecodeRestrictedSPredicateOperand
Line
Count
Source
7192
1.13k
  { \
7193
1.13k
    DecodeStatus S = MCDisassembler_Success; \
7194
1.13k
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7195
1.13k
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7196
1.13k
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7197
1.13k
                   Decoder))) \
7198
1.13k
      return MCDisassembler_Fail; \
7199
1.13k
\
7200
1.13k
    unsigned fc; \
7201
1.13k
\
7202
1.13k
    if (scalar) { \
7203
1.13k
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7204
1.13k
           fieldFromInstruction_4(Insn, 7, 1) | \
7205
1.13k
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7206
1.13k
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7207
1.13k
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7208
1.13k
                 Inst, Rm, Address, Decoder))) \
7209
1.13k
        return MCDisassembler_Fail; \
7210
1.13k
    } else { \
7211
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7212
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7213
0
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7214
0
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7215
0
                << 4 | \
7216
0
              fieldFromInstruction_4(Insn, 1, 3); \
7217
0
      if (!Check(&S, DecodeMQPRRegisterClass( \
7218
0
                 Inst, Qm, Address, Decoder))) \
7219
0
        return MCDisassembler_Fail; \
7220
0
    } \
7221
1.13k
\
7222
1.13k
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7223
1.13k
      return MCDisassembler_Fail; \
7224
1.13k
\
7225
1.13k
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7226
1.13k
    MCOperand_CreateReg0(Inst, (0)); \
7227
1.13k
    MCOperand_CreateImm0(Inst, (0)); \
7228
1.13k
\
7229
1.13k
    return S; \
7230
1.13k
  }
ARMDisassembler.c:DecodeMVEVCMP_0_DecodeRestrictedFPPredicateOperand
Line
Count
Source
7192
395
  { \
7193
395
    DecodeStatus S = MCDisassembler_Success; \
7194
395
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7195
395
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7196
395
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7197
395
                   Decoder))) \
7198
395
      return MCDisassembler_Fail; \
7199
395
\
7200
395
    unsigned fc; \
7201
395
\
7202
395
    if (scalar) { \
7203
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7204
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7205
0
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7206
0
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7207
0
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7208
0
                 Inst, Rm, Address, Decoder))) \
7209
0
        return MCDisassembler_Fail; \
7210
395
    } else { \
7211
395
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7212
395
           fieldFromInstruction_4(Insn, 7, 1) | \
7213
395
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7214
395
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7215
395
                << 4 | \
7216
395
              fieldFromInstruction_4(Insn, 1, 3); \
7217
395
      if (!Check(&S, DecodeMQPRRegisterClass( \
7218
395
                 Inst, Qm, Address, Decoder))) \
7219
395
        return MCDisassembler_Fail; \
7220
395
    } \
7221
395
\
7222
395
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7223
307
      return MCDisassembler_Fail; \
7224
307
\
7225
307
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7226
233
    MCOperand_CreateReg0(Inst, (0)); \
7227
233
    MCOperand_CreateImm0(Inst, (0)); \
7228
233
\
7229
233
    return S; \
7230
307
  }
ARMDisassembler.c:DecodeMVEVCMP_1_DecodeRestrictedFPPredicateOperand
Line
Count
Source
7192
478
  { \
7193
478
    DecodeStatus S = MCDisassembler_Success; \
7194
478
    MCOperand_CreateReg0(Inst, (ARM_VPR)); \
7195
478
    unsigned Qn = fieldFromInstruction_4(Insn, 17, 3); \
7196
478
    if (!Check(&S, DecodeMQPRRegisterClass(Inst, Qn, Address, \
7197
478
                   Decoder))) \
7198
478
      return MCDisassembler_Fail; \
7199
478
\
7200
478
    unsigned fc; \
7201
478
\
7202
478
    if (scalar) { \
7203
478
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7204
478
           fieldFromInstruction_4(Insn, 7, 1) | \
7205
478
           fieldFromInstruction_4(Insn, 5, 1) << 1; \
7206
478
      unsigned Rm = fieldFromInstruction_4(Insn, 0, 4); \
7207
478
      if (!Check(&S, DecodeGPRwithZRRegisterClass( \
7208
478
                 Inst, Rm, Address, Decoder))) \
7209
478
        return MCDisassembler_Fail; \
7210
478
    } else { \
7211
0
      fc = fieldFromInstruction_4(Insn, 12, 1) << 2 | \
7212
0
           fieldFromInstruction_4(Insn, 7, 1) | \
7213
0
           fieldFromInstruction_4(Insn, 0, 1) << 1; \
7214
0
      unsigned Qm = fieldFromInstruction_4(Insn, 5, 1) \
7215
0
                << 4 | \
7216
0
              fieldFromInstruction_4(Insn, 1, 3); \
7217
0
      if (!Check(&S, DecodeMQPRRegisterClass( \
7218
0
                 Inst, Qm, Address, Decoder))) \
7219
0
        return MCDisassembler_Fail; \
7220
0
    } \
7221
478
\
7222
478
    if (!Check(&S, predicate_decoder(Inst, fc, Address, Decoder))) \
7223
478
      return MCDisassembler_Fail; \
7224
478
\
7225
478
    MCOperand_CreateImm0(Inst, (ARMVCC_None)); \
7226
230
    MCOperand_CreateReg0(Inst, (0)); \
7227
230
    MCOperand_CreateImm0(Inst, (0)); \
7228
230
\
7229
230
    return S; \
7230
478
  }
7231
DEFINE_DecodeMVEVCMP(false, DecodeRestrictedIPredicateOperand);
7232
DEFINE_DecodeMVEVCMP(false, DecodeRestrictedUPredicateOperand);
7233
DEFINE_DecodeMVEVCMP(false, DecodeRestrictedSPredicateOperand);
7234
DEFINE_DecodeMVEVCMP(true, DecodeRestrictedIPredicateOperand);
7235
DEFINE_DecodeMVEVCMP(true, DecodeRestrictedUPredicateOperand);
7236
DEFINE_DecodeMVEVCMP(true, DecodeRestrictedSPredicateOperand);
7237
DEFINE_DecodeMVEVCMP(false, DecodeRestrictedFPPredicateOperand);
7238
DEFINE_DecodeMVEVCMP(true, DecodeRestrictedFPPredicateOperand);
7239
7240
static DecodeStatus DecodeMveVCTP(MCInst *Inst, unsigned Insn, uint64_t Address,
7241
          const void *Decoder)
7242
1.10k
{
7243
1.10k
  DecodeStatus S = MCDisassembler_Success;
7244
1.10k
  MCOperand_CreateReg0(Inst, (ARM_VPR));
7245
1.10k
  unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
7246
1.10k
  if (!Check(&S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
7247
0
    return MCDisassembler_Fail;
7248
1.10k
  return S;
7249
1.10k
}
7250
7251
static DecodeStatus DecodeMVEVPNOT(MCInst *Inst, unsigned Insn,
7252
           uint64_t Address, const void *Decoder)
7253
1.05k
{
7254
1.05k
  DecodeStatus S = MCDisassembler_Success;
7255
1.05k
  MCOperand_CreateReg0(Inst, (ARM_VPR));
7256
1.05k
  MCOperand_CreateReg0(Inst, (ARM_VPR));
7257
1.05k
  return S;
7258
1.05k
}
7259
7260
static DecodeStatus DecodeT2AddSubSPImm(MCInst *Inst, unsigned Insn,
7261
          uint64_t Address, const void *Decoder)
7262
538
{
7263
538
  const unsigned Rd = fieldFromInstruction_4(Insn, 8, 4);
7264
538
  const unsigned Rn = fieldFromInstruction_4(Insn, 16, 4);
7265
538
  const unsigned Imm12 = fieldFromInstruction_4(Insn, 26, 1) << 11 |
7266
538
             fieldFromInstruction_4(Insn, 12, 3) << 8 |
7267
538
             fieldFromInstruction_4(Insn, 0, 8);
7268
538
  const unsigned TypeT3 = fieldFromInstruction_4(Insn, 25, 1);
7269
538
  unsigned sign1 = fieldFromInstruction_4(Insn, 21, 1);
7270
538
  unsigned sign2 = fieldFromInstruction_4(Insn, 23, 1);
7271
538
  unsigned S = fieldFromInstruction_4(Insn, 20, 1);
7272
538
  if (sign1 != sign2)
7273
0
    return MCDisassembler_Fail;
7274
7275
  // T3 does a zext of imm12, where T2 does a ThumbExpandImm (T2SOImm)
7276
538
  DecodeStatus DS = MCDisassembler_Success;
7277
538
  if ((!Check(&DS, DecodeGPRspRegisterClass(Inst, Rd, Address,
7278
538
              Decoder))) || // dst
7279
538
      (!Check(&DS, DecodeGPRspRegisterClass(Inst, Rn, Address, Decoder))))
7280
0
    return MCDisassembler_Fail;
7281
538
  if (TypeT3) {
7282
204
    MCInst_setOpcode(Inst,
7283
204
         (sign1 ? ARM_t2SUBspImm12 : ARM_t2ADDspImm12));
7284
204
    MCOperand_CreateImm0(Inst, (Imm12)); // zext imm12
7285
334
  } else {
7286
334
    MCInst_setOpcode(Inst,
7287
334
         (sign1 ? ARM_t2SUBspImm : ARM_t2ADDspImm));
7288
334
    if (!Check(&DS, DecodeT2SOImm(Inst, Imm12, Address,
7289
334
                Decoder)))      // imm12
7290
0
      return MCDisassembler_Fail;
7291
334
    if (!Check(&DS, DecodeCCOutOperand(Inst, S, Address,
7292
334
               Decoder))) // cc_out
7293
0
      return MCDisassembler_Fail;
7294
334
  }
7295
7296
538
  return DS;
7297
538
}
7298
7299
DecodeStatus ARM_LLVM_getInstruction(csh handle, const uint8_t *code,
7300
             size_t code_len, MCInst *instr,
7301
             uint16_t *size, uint64_t address,
7302
             void *info)
7303
1.16M
{
7304
1.16M
  return getInstruction(handle, code, code_len, instr, size, address,
7305
1.16M
            info);
7306
1.16M
}