Coverage Report

Created: 2026-01-09 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/capstonenext/arch/Xtensa/XtensaDisassembler.c
Line
Count
Source
1
/* Capstone Disassembly Engine, http://www.capstone-engine.org */
2
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2022, */
3
/*    Rot127 <unisono@quyllur.org> 2022-2023 */
4
/* Automatically translated source file from LLVM. */
5
6
/* LLVM-commit: <commit> */
7
/* LLVM-tag: <tag> */
8
9
/* Only small edits allowed. */
10
/* For multiple similar edits, please create a Patch for the translator. */
11
12
/* Capstone's C++ file translator: */
13
/* https://github.com/capstone-engine/capstone/tree/next/suite/auto-sync */
14
15
//===-- XtensaDisassembler.cpp - Disassembler for Xtensa ------------------===//
16
//
17
//                     The LLVM Compiler Infrastructure
18
//
19
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
20
// See https://llvm.org/LICENSE.txt for license information.
21
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
22
//
23
//===----------------------------------------------------------------------===//
24
//
25
// This file implements the XtensaDisassembler class.
26
//
27
//===----------------------------------------------------------------------===//
28
29
#include <stdio.h>
30
#include <string.h>
31
#include <stdlib.h>
32
#include <capstone/platform.h>
33
34
#include "../../MathExtras.h"
35
#include "../../MCDisassembler.h"
36
#include "../../MCFixedLenDisassembler.h"
37
#include "../../SStream.h"
38
#include "../../cs_priv.h"
39
#include "../../utils.h"
40
41
#include "priv.h"
42
43
#define GET_INSTRINFO_MC_DESC
44
#include "XtensaGenInstrInfo.inc"
45
46
#define CONCAT(a, b) CONCAT_(a, b)
47
#define CONCAT_(a, b) a##_##b
48
49
#define DEBUG_TYPE "Xtensa-disassembler"
50
51
static const unsigned ARDecoderTable[] = {
52
  Xtensa_A0,  Xtensa_SP,  Xtensa_A2,  Xtensa_A3, Xtensa_A4,  Xtensa_A5,
53
  Xtensa_A6,  Xtensa_A7,  Xtensa_A8,  Xtensa_A9, Xtensa_A10, Xtensa_A11,
54
  Xtensa_A12, Xtensa_A13, Xtensa_A14, Xtensa_A15
55
};
56
57
static const unsigned AE_DRDecoderTable[] = {
58
  Xtensa_AED0,  Xtensa_AED1,  Xtensa_AED2,  Xtensa_AED3,
59
  Xtensa_AED4,  Xtensa_AED5,  Xtensa_AED6,  Xtensa_AED7,
60
  Xtensa_AED8,  Xtensa_AED9,  Xtensa_AED10, Xtensa_AED11,
61
  Xtensa_AED12, Xtensa_AED13, Xtensa_AED14, Xtensa_AED15
62
};
63
64
static const unsigned AE_VALIGNDecoderTable[] = { Xtensa_U0, Xtensa_U1,
65
              Xtensa_U2, Xtensa_U3 };
66
67
static DecodeStatus DecodeAE_DRRegisterClass(MCInst *Inst, uint64_t RegNo,
68
               uint64_t Address,
69
               const void *Decoder)
70
274
{
71
274
  if (RegNo >= ARR_SIZE(AE_DRDecoderTable))
72
0
    return MCDisassembler_Fail;
73
74
274
  unsigned Reg = AE_DRDecoderTable[RegNo];
75
274
  MCOperand_CreateReg0(Inst, (Reg));
76
274
  return MCDisassembler_Success;
77
274
}
78
79
static DecodeStatus DecodeAE_VALIGNRegisterClass(MCInst *Inst, uint64_t RegNo,
80
             uint64_t Address,
81
             const void *Decoder)
82
287
{
83
287
  if (RegNo >= ARR_SIZE(AE_VALIGNDecoderTable))
84
0
    return MCDisassembler_Fail;
85
86
287
  unsigned Reg = AE_VALIGNDecoderTable[RegNo];
87
287
  MCOperand_CreateReg0(Inst, (Reg));
88
287
  return MCDisassembler_Success;
89
287
}
90
91
static DecodeStatus DecodeARRegisterClass(MCInst *Inst, uint64_t RegNo,
92
            uint64_t Address, const void *Decoder)
93
144k
{
94
144k
  if (RegNo >= ARR_SIZE(ARDecoderTable))
95
0
    return MCDisassembler_Fail;
96
97
144k
  unsigned Reg = ARDecoderTable[RegNo];
98
144k
  MCOperand_CreateReg0(Inst, (Reg));
99
144k
  return MCDisassembler_Success;
100
144k
}
101
102
static const unsigned QRDecoderTable[] = { Xtensa_Q0, Xtensa_Q1, Xtensa_Q2,
103
             Xtensa_Q3, Xtensa_Q4, Xtensa_Q5,
104
             Xtensa_Q6, Xtensa_Q7 };
105
106
static DecodeStatus DecodeQRRegisterClass(MCInst *Inst, uint64_t RegNo,
107
            uint64_t Address, const void *Decoder)
108
47.7k
{
109
47.7k
  if (RegNo >= ARR_SIZE(QRDecoderTable))
110
0
    return MCDisassembler_Fail;
111
112
47.7k
  unsigned Reg = QRDecoderTable[RegNo];
113
47.7k
  MCOperand_CreateReg0(Inst, (Reg));
114
47.7k
  return MCDisassembler_Success;
115
47.7k
}
116
117
static const unsigned FPRDecoderTable[] = {
118
  Xtensa_F0,  Xtensa_F1,  Xtensa_F2,  Xtensa_F3, Xtensa_F4,  Xtensa_F5,
119
  Xtensa_F6,  Xtensa_F7,  Xtensa_F8,  Xtensa_F9, Xtensa_F10, Xtensa_F11,
120
  Xtensa_F12, Xtensa_F13, Xtensa_F14, Xtensa_F15
121
};
122
123
static DecodeStatus DecodeFPRRegisterClass(MCInst *Inst, uint64_t RegNo,
124
             uint64_t Address,
125
             const void *Decoder)
126
17.5k
{
127
17.5k
  if (RegNo >= ARR_SIZE(FPRDecoderTable))
128
0
    return MCDisassembler_Fail;
129
130
17.5k
  unsigned Reg = FPRDecoderTable[RegNo];
131
17.5k
  MCOperand_CreateReg0(Inst, (Reg));
132
17.5k
  return MCDisassembler_Success;
133
17.5k
}
134
135
static const unsigned BRDecoderTable[] = {
136
  Xtensa_B0,  Xtensa_B1,  Xtensa_B2,  Xtensa_B3, Xtensa_B4,  Xtensa_B5,
137
  Xtensa_B6,  Xtensa_B7,  Xtensa_B8,  Xtensa_B9, Xtensa_B10, Xtensa_B11,
138
  Xtensa_B12, Xtensa_B13, Xtensa_B14, Xtensa_B15
139
};
140
141
static const unsigned BR2DecoderTable[] = { Xtensa_B0_B1,   Xtensa_B2_B3,
142
              Xtensa_B4_B5,   Xtensa_B6_B7,
143
              Xtensa_B8_B9,   Xtensa_B10_B11,
144
              Xtensa_B12_B13, Xtensa_B14_B15 };
145
146
static const unsigned BR4DecoderTable[] = { Xtensa_B0_B1_B2_B3,
147
              Xtensa_B4_B5_B6_B7,
148
              Xtensa_B8_B9_B10_B11,
149
              Xtensa_B12_B13_B14_B15 };
150
151
static DecodeStatus DecodeXtensaRegisterClass(MCInst *Inst, uint64_t RegNo,
152
                uint64_t Address,
153
                const void *Decoder,
154
                const unsigned *DecoderTable,
155
                size_t DecoderTableLen)
156
0
{
157
0
  if (RegNo >= DecoderTableLen)
158
0
    return MCDisassembler_Fail;
159
160
0
  unsigned Reg = DecoderTable[RegNo];
161
0
  MCOperand_CreateReg0(Inst, (Reg));
162
0
  return MCDisassembler_Success;
163
0
}
164
165
static DecodeStatus DecodeBR2RegisterClass(MCInst *Inst, uint64_t RegNo,
166
             uint64_t Address,
167
             const void *Decoder)
168
0
{
169
0
  return DecodeXtensaRegisterClass(Inst, RegNo, Address, Decoder,
170
0
           BR2DecoderTable,
171
0
           ARR_SIZE(BR2DecoderTable));
172
0
}
173
174
static DecodeStatus DecodeBR4RegisterClass(MCInst *Inst, uint64_t RegNo,
175
             uint64_t Address,
176
             const void *Decoder)
177
0
{
178
0
  return DecodeXtensaRegisterClass(Inst, RegNo, Address, Decoder,
179
0
           BR4DecoderTable,
180
0
           ARR_SIZE(BR4DecoderTable));
181
0
}
182
183
static DecodeStatus DecodeBRRegisterClass(MCInst *Inst, uint64_t RegNo,
184
            uint64_t Address, const void *Decoder)
185
2.40k
{
186
2.40k
  if (RegNo >= ARR_SIZE(BRDecoderTable))
187
0
    return MCDisassembler_Fail;
188
189
2.40k
  unsigned Reg = BRDecoderTable[RegNo];
190
2.40k
  MCOperand_CreateReg0(Inst, (Reg));
191
2.40k
  return MCDisassembler_Success;
192
2.40k
}
193
194
static const unsigned MRDecoderTable[] = { Xtensa_M0, Xtensa_M1, Xtensa_M2,
195
             Xtensa_M3 };
196
197
static DecodeStatus DecodeMRRegisterClass(MCInst *Inst, uint64_t RegNo,
198
            uint64_t Address, const void *Decoder)
199
591
{
200
591
  if (RegNo >= ARR_SIZE(MRDecoderTable))
201
0
    return MCDisassembler_Fail;
202
203
591
  unsigned Reg = MRDecoderTable[RegNo];
204
591
  MCOperand_CreateReg0(Inst, (Reg));
205
591
  return MCDisassembler_Success;
206
591
}
207
208
static const unsigned MR01DecoderTable[] = { Xtensa_M0, Xtensa_M1 };
209
210
static DecodeStatus DecodeMR01RegisterClass(MCInst *Inst, uint64_t RegNo,
211
              uint64_t Address,
212
              const void *Decoder)
213
772
{
214
772
  if (RegNo >= ARR_SIZE(MR01DecoderTable))
215
0
    return MCDisassembler_Fail;
216
217
772
  unsigned Reg = MR01DecoderTable[RegNo];
218
772
  MCOperand_CreateReg0(Inst, (Reg));
219
772
  return MCDisassembler_Success;
220
772
}
221
222
static const unsigned MR23DecoderTable[] = { Xtensa_M2, Xtensa_M3 };
223
224
static DecodeStatus DecodeMR23RegisterClass(MCInst *Inst, uint64_t RegNo,
225
              uint64_t Address,
226
              const void *Decoder)
227
905
{
228
905
  if (RegNo >= ARR_SIZE(MR23DecoderTable))
229
0
    return MCDisassembler_Fail;
230
231
905
  unsigned Reg = MR23DecoderTable[RegNo];
232
905
  MCOperand_CreateReg0(Inst, (Reg));
233
905
  return MCDisassembler_Success;
234
905
}
235
236
bool Xtensa_getFeatureBits(unsigned int mode, unsigned int feature)
237
68.0k
{
238
  // we support everything
239
68.0k
  return true;
240
68.0k
}
241
242
// Verify SR and UR
243
bool CheckRegister(MCInst *Inst, unsigned RegNo)
244
7.79k
{
245
7.79k
  unsigned NumIntLevels = 0;
246
7.79k
  unsigned NumTimers = 0;
247
7.79k
  unsigned NumMiscSR = 0;
248
7.79k
  bool IsESP32 = false;
249
7.79k
  bool IsESP32S2 = false;
250
7.79k
  bool Res = true;
251
252
  // Assume that CPU is esp32 by default
253
7.79k
  if ((Inst->csh->mode & CS_MODE_XTENSA_ESP32)) {
254
5.01k
    NumIntLevels = 6;
255
5.01k
    NumTimers = 3;
256
5.01k
    NumMiscSR = 4;
257
5.01k
    IsESP32 = true;
258
5.01k
  } else if (Inst->csh->mode & CS_MODE_XTENSA_ESP32S2) {
259
969
    NumIntLevels = 6;
260
969
    NumTimers = 3;
261
969
    NumMiscSR = 4;
262
969
    IsESP32S2 = true;
263
1.80k
  } else if (Inst->csh->mode & CS_MODE_XTENSA_ESP8266) {
264
1.80k
    NumIntLevels = 2;
265
1.80k
    NumTimers = 1;
266
1.80k
  }
267
268
7.79k
  switch (RegNo) {
269
185
  case Xtensa_LBEG:
270
189
  case Xtensa_LEND:
271
191
  case Xtensa_LCOUNT:
272
191
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
273
191
              Xtensa_FeatureLoop);
274
191
    break;
275
0
  case Xtensa_BREG:
276
0
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
277
0
              Xtensa_FeatureBoolean);
278
0
    break;
279
1
  case Xtensa_LITBASE:
280
1
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
281
1
              Xtensa_FeatureExtendedL32R);
282
1
    break;
283
0
  case Xtensa_SCOMPARE1:
284
0
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
285
0
              Xtensa_FeatureS32C1I);
286
0
    break;
287
176
  case Xtensa_ACCLO:
288
178
  case Xtensa_ACCHI:
289
179
  case Xtensa_M0:
290
179
  case Xtensa_M1:
291
179
  case Xtensa_M2:
292
179
  case Xtensa_M3:
293
179
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
294
179
              Xtensa_FeatureMAC16);
295
179
    break;
296
2
  case Xtensa_WINDOWBASE:
297
2
  case Xtensa_WINDOWSTART:
298
2
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
299
2
              Xtensa_FeatureWindowed);
300
2
    break;
301
0
  case Xtensa_IBREAKENABLE:
302
0
  case Xtensa_IBREAKA0:
303
0
  case Xtensa_IBREAKA1:
304
0
  case Xtensa_DBREAKA0:
305
0
  case Xtensa_DBREAKA1:
306
16
  case Xtensa_DBREAKC0:
307
16
  case Xtensa_DBREAKC1:
308
16
  case Xtensa_DEBUGCAUSE:
309
17
  case Xtensa_ICOUNT:
310
17
  case Xtensa_ICOUNTLEVEL:
311
17
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
312
17
              Xtensa_FeatureDebug);
313
17
    break;
314
7
  case Xtensa_ATOMCTL:
315
7
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
316
7
              Xtensa_FeatureATOMCTL);
317
7
    break;
318
2
  case Xtensa_MEMCTL:
319
2
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
320
2
              Xtensa_FeatureMEMCTL);
321
2
    break;
322
0
  case Xtensa_EPC1:
323
0
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
324
0
              Xtensa_FeatureException);
325
0
    break;
326
214
  case Xtensa_EPC2:
327
482
  case Xtensa_EPC3:
328
908
  case Xtensa_EPC4:
329
1.01k
  case Xtensa_EPC5:
330
1.11k
  case Xtensa_EPC6:
331
1.18k
  case Xtensa_EPC7:
332
1.18k
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
333
1.18k
              Xtensa_FeatureHighPriInterrupts);
334
1.18k
    Res = Res & (NumIntLevels >= (RegNo - Xtensa_EPC1));
335
1.18k
    break;
336
206
  case Xtensa_EPS2:
337
730
  case Xtensa_EPS3:
338
1.13k
  case Xtensa_EPS4:
339
1.40k
  case Xtensa_EPS5:
340
1.50k
  case Xtensa_EPS6:
341
1.56k
  case Xtensa_EPS7:
342
1.56k
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
343
1.56k
              Xtensa_FeatureHighPriInterrupts);
344
1.56k
    Res = Res & (NumIntLevels > (RegNo - Xtensa_EPS2));
345
1.56k
    break;
346
0
  case Xtensa_EXCSAVE1:
347
0
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
348
0
              Xtensa_FeatureException);
349
0
    break;
350
74
  case Xtensa_EXCSAVE2:
351
141
  case Xtensa_EXCSAVE3:
352
233
  case Xtensa_EXCSAVE4:
353
347
  case Xtensa_EXCSAVE5:
354
550
  case Xtensa_EXCSAVE6:
355
623
  case Xtensa_EXCSAVE7:
356
623
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
357
623
              Xtensa_FeatureHighPriInterrupts);
358
623
    Res = Res & (NumIntLevels >= (RegNo - Xtensa_EXCSAVE1));
359
623
    break;
360
2
  case Xtensa_DEPC:
361
136
  case Xtensa_EXCCAUSE:
362
136
  case Xtensa_EXCVADDR:
363
136
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
364
136
              Xtensa_FeatureException);
365
136
    break;
366
0
  case Xtensa_CPENABLE:
367
0
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
368
0
              Xtensa_FeatureCoprocessor);
369
0
    break;
370
2
  case Xtensa_VECBASE:
371
2
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
372
2
              Xtensa_FeatureRelocatableVector);
373
2
    break;
374
78
  case Xtensa_CCOUNT:
375
78
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
376
78
              Xtensa_FeatureTimerInt);
377
78
    Res &= (NumTimers > 0);
378
78
    break;
379
36
  case Xtensa_CCOMPARE0:
380
102
  case Xtensa_CCOMPARE1:
381
322
  case Xtensa_CCOMPARE2:
382
322
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
383
322
              Xtensa_FeatureTimerInt);
384
322
    Res &= (NumTimers > (RegNo - Xtensa_CCOMPARE0));
385
322
    break;
386
0
  case Xtensa_PRID:
387
0
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
388
0
              Xtensa_FeaturePRID);
389
0
    break;
390
74
  case Xtensa_INTERRUPT:
391
74
  case Xtensa_INTCLEAR:
392
74
  case Xtensa_INTENABLE:
393
74
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
394
74
              Xtensa_FeatureInterrupt);
395
74
    break;
396
139
  case Xtensa_MISC0:
397
216
  case Xtensa_MISC1:
398
610
  case Xtensa_MISC2:
399
685
  case Xtensa_MISC3:
400
685
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
401
685
              Xtensa_FeatureMiscSR);
402
685
    Res &= (NumMiscSR > (RegNo - Xtensa_MISC0));
403
685
    break;
404
599
  case Xtensa_THREADPTR:
405
599
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
406
599
              Xtensa_FeatureTHREADPTR);
407
599
    break;
408
441
  case Xtensa_GPIO_OUT:
409
441
    Res = IsESP32S2;
410
441
    break;
411
461
  case Xtensa_EXPSTATE:
412
461
    Res = IsESP32;
413
461
    break;
414
358
  case Xtensa_FCR:
415
372
  case Xtensa_FSR:
416
372
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
417
372
              Xtensa_FeatureSingleFloat);
418
372
    break;
419
703
  case Xtensa_F64R_LO:
420
824
  case Xtensa_F64R_HI:
421
851
  case Xtensa_F64S:
422
851
    Res = Xtensa_getFeatureBits(Inst->csh->mode,
423
851
              Xtensa_FeatureDFPAccel);
424
851
    break;
425
7.79k
  }
426
427
7.79k
  return Res;
428
7.79k
}
429
430
static const unsigned SRDecoderTable[] = {
431
  Xtensa_LBEG,      0,   Xtensa_LEND,       1,
432
  Xtensa_LCOUNT,      2,   Xtensa_SAR,        3,
433
  Xtensa_BREG,      4,   Xtensa_LITBASE,      5,
434
  Xtensa_SCOMPARE1,   12,  Xtensa_ACCLO,        16,
435
  Xtensa_ACCHI,     17,  Xtensa_M0,       32,
436
  Xtensa_M1,      33,  Xtensa_M2,       34,
437
  Xtensa_M3,      35,  Xtensa_WINDOWBASE,   72,
438
  Xtensa_WINDOWSTART, 73,  Xtensa_IBREAKENABLE, 96,
439
  Xtensa_MEMCTL,      97,  Xtensa_ATOMCTL,      99,
440
  Xtensa_DDR,     104, Xtensa_IBREAKA0,     128,
441
  Xtensa_IBREAKA1,    129, Xtensa_DBREAKA0,     144,
442
  Xtensa_DBREAKA1,    145, Xtensa_DBREAKC0,     160,
443
  Xtensa_DBREAKC1,    161, Xtensa_CONFIGID0,    176,
444
  Xtensa_EPC1,      177, Xtensa_EPC2,       178,
445
  Xtensa_EPC3,      179, Xtensa_EPC4,       180,
446
  Xtensa_EPC5,      181, Xtensa_EPC6,       182,
447
  Xtensa_EPC7,      183, Xtensa_DEPC,       192,
448
  Xtensa_EPS2,      194, Xtensa_EPS3,       195,
449
  Xtensa_EPS4,      196, Xtensa_EPS5,       197,
450
  Xtensa_EPS6,      198, Xtensa_EPS7,       199,
451
  Xtensa_CONFIGID1,   208, Xtensa_EXCSAVE1,     209,
452
  Xtensa_EXCSAVE2,    210, Xtensa_EXCSAVE3,     211,
453
  Xtensa_EXCSAVE4,    212, Xtensa_EXCSAVE5,     213,
454
  Xtensa_EXCSAVE6,    214, Xtensa_EXCSAVE7,     215,
455
  Xtensa_CPENABLE,    224, Xtensa_INTERRUPT,    226,
456
  Xtensa_INTCLEAR,    227, Xtensa_INTENABLE,    228,
457
  Xtensa_PS,      230, Xtensa_VECBASE,      231,
458
  Xtensa_EXCCAUSE,    232, Xtensa_DEBUGCAUSE,   233,
459
  Xtensa_CCOUNT,      234, Xtensa_PRID,       235,
460
  Xtensa_ICOUNT,      236, Xtensa_ICOUNTLEVEL,  237,
461
  Xtensa_EXCVADDR,    238, Xtensa_CCOMPARE0,    240,
462
  Xtensa_CCOMPARE1,   241, Xtensa_CCOMPARE2,    242,
463
  Xtensa_MISC0,     244, Xtensa_MISC1,        245,
464
  Xtensa_MISC2,     246, Xtensa_MISC3,        247
465
};
466
467
static DecodeStatus DecodeSRRegisterClass(MCInst *Inst, uint64_t RegNo,
468
            uint64_t Address, const void *Decoder)
469
5.07k
{
470
  //  const llvm_MCSubtargetInfo STI =
471
  //    ((const MCDisassembler *)Decoder)->getSubtargetInfo();
472
473
5.07k
  if (RegNo > 255)
474
0
    return MCDisassembler_Fail;
475
476
205k
  for (unsigned i = 0; i < ARR_SIZE(SRDecoderTable); i += 2) {
477
205k
    if (SRDecoderTable[i + 1] == RegNo) {
478
5.07k
      unsigned Reg = SRDecoderTable[i];
479
480
5.07k
      if (!CheckRegister(Inst, Reg))
481
8
        return MCDisassembler_Fail;
482
483
5.06k
      MCOperand_CreateReg0(Inst, (Reg));
484
5.06k
      return MCDisassembler_Success;
485
5.07k
    }
486
205k
  }
487
488
2
  return MCDisassembler_Fail;
489
5.07k
}
490
491
static const unsigned URDecoderTable[] = {
492
  Xtensa_GPIO_OUT, 0,   Xtensa_EXPSTATE, 230, Xtensa_THREADPTR, 231,
493
  Xtensa_FCR,  232, Xtensa_FSR,      233, Xtensa_F64R_LO,   234,
494
  Xtensa_F64R_HI,  235, Xtensa_F64S,     236
495
};
496
497
static DecodeStatus DecodeURRegisterClass(MCInst *Inst, uint64_t RegNo,
498
            uint64_t Address, const void *Decoder)
499
3.30k
{
500
3.30k
  if (RegNo > 255)
501
0
    return MCDisassembler_Fail;
502
503
15.2k
  for (unsigned i = 0; i < ARR_SIZE(URDecoderTable); i += 2) {
504
14.6k
    if (URDecoderTable[i + 1] == RegNo) {
505
2.72k
      unsigned Reg = URDecoderTable[i];
506
507
2.72k
      if (!CheckRegister(Inst, Reg))
508
437
        return MCDisassembler_Fail;
509
510
2.28k
      MCOperand_CreateReg0(Inst, (Reg));
511
2.28k
      return MCDisassembler_Success;
512
2.72k
    }
513
14.6k
  }
514
515
585
  return MCDisassembler_Fail;
516
3.30k
}
517
518
static bool tryAddingSymbolicOperand(int64_t Value, bool isBranch,
519
             uint64_t Address, uint64_t Offset,
520
             uint64_t InstSize, MCInst *MI,
521
             const void *Decoder)
522
16.8k
{
523
  //  return Dis->tryAddingSymbolicOperand(MI, Value, Address, isBranch,
524
  //               Offset, /*OpSize=*/0, InstSize);
525
16.8k
  return false;
526
16.8k
}
527
528
static DecodeStatus decodeCallOperand(MCInst *Inst, uint64_t Imm,
529
              int64_t Address, const void *Decoder)
530
3.42k
{
531
3.42k
  CS_ASSERT_RET_VAL(isUIntN(18, Imm) && "Invalid immediate",
532
3.42k
        MCDisassembler_Fail);
533
3.42k
  MCOperand_CreateImm0(Inst, (SignExtend64((Imm << 2), 20)));
534
3.42k
  return MCDisassembler_Success;
535
3.42k
}
536
537
static DecodeStatus decodeJumpOperand(MCInst *Inst, uint64_t Imm,
538
              int64_t Address, const void *Decoder)
539
1.38k
{
540
1.38k
  CS_ASSERT_RET_VAL(isUIntN(18, Imm) && "Invalid immediate",
541
1.38k
        MCDisassembler_Fail);
542
1.38k
  MCOperand_CreateImm0(Inst, (SignExtend64((Imm), 18)));
543
1.38k
  return MCDisassembler_Success;
544
1.38k
}
545
546
static DecodeStatus decodeBranchOperand(MCInst *Inst, uint64_t Imm,
547
          int64_t Address, const void *Decoder)
548
16.7k
{
549
16.7k
  switch (MCInst_getOpcode(Inst)) {
550
497
  case Xtensa_BEQZ:
551
1.26k
  case Xtensa_BGEZ:
552
2.41k
  case Xtensa_BLTZ:
553
3.29k
  case Xtensa_BNEZ:
554
3.29k
    CS_ASSERT_RET_VAL(isUIntN(12, Imm) && "Invalid immediate",
555
3.29k
          MCDisassembler_Fail);
556
3.29k
    if (!tryAddingSymbolicOperand(
557
3.29k
          SignExtend64((Imm), 12) + 4 + Address, true,
558
3.29k
          Address, 0, 3, Inst, Decoder))
559
3.29k
      MCOperand_CreateImm0(Inst, (SignExtend64((Imm), 12)));
560
3.29k
    break;
561
13.4k
  default:
562
13.4k
    CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
563
13.4k
          MCDisassembler_Fail);
564
13.4k
    if (!tryAddingSymbolicOperand(
565
13.4k
          SignExtend64((Imm), 8) + 4 + Address, true, Address,
566
13.4k
          0, 3, Inst, Decoder))
567
13.4k
      MCOperand_CreateImm0(Inst, (SignExtend64((Imm), 8)));
568
16.7k
  }
569
16.7k
  return MCDisassembler_Success;
570
16.7k
}
571
572
static DecodeStatus decodeLoopOperand(MCInst *Inst, uint64_t Imm,
573
              int64_t Address, const void *Decoder)
574
68
{
575
68
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
576
68
        MCDisassembler_Fail);
577
68
  if (!tryAddingSymbolicOperand(Imm + 4 + Address, true, Address, 0, 3,
578
68
              Inst, Decoder))
579
68
    MCOperand_CreateImm0(Inst, (Imm));
580
68
  return MCDisassembler_Success;
581
68
}
582
583
static DecodeStatus decodeL32ROperand(MCInst *Inst, uint64_t Imm,
584
              int64_t Address, const void *Decoder)
585
5.62k
{
586
5.62k
  CS_ASSERT_RET_VAL(isUIntN(16, Imm) && "Invalid immediate",
587
5.62k
        MCDisassembler_Fail);
588
5.62k
  MCOperand_CreateImm0(Inst, OneExtend64(Imm << 2, 18));
589
5.62k
  return MCDisassembler_Success;
590
5.62k
}
591
592
static DecodeStatus decodeImm8Operand(MCInst *Inst, uint64_t Imm,
593
              int64_t Address, const void *Decoder)
594
425
{
595
425
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
596
425
        MCDisassembler_Fail);
597
425
  MCOperand_CreateImm0(Inst, (SignExtend64((Imm), 8)));
598
425
  return MCDisassembler_Success;
599
425
}
600
601
static DecodeStatus decodeImm8_sh8Operand(MCInst *Inst, uint64_t Imm,
602
            int64_t Address, const void *Decoder)
603
379
{
604
379
  CS_ASSERT_RET_VAL(isUIntN(16, Imm) && ((Imm & 0xff) == 0) &&
605
379
          "Invalid immediate",
606
379
        MCDisassembler_Fail);
607
379
  MCOperand_CreateImm0(Inst, (SignExtend64((Imm), 16)));
608
379
  return MCDisassembler_Success;
609
379
}
610
611
static DecodeStatus decodeImm12Operand(MCInst *Inst, uint64_t Imm,
612
               int64_t Address, const void *Decoder)
613
344
{
614
344
  CS_ASSERT_RET_VAL(isUIntN(12, Imm) && "Invalid immediate",
615
344
        MCDisassembler_Fail);
616
344
  MCOperand_CreateImm0(Inst, (SignExtend64((Imm), 12)));
617
344
  return MCDisassembler_Success;
618
344
}
619
620
static DecodeStatus decodeUimm4Operand(MCInst *Inst, uint64_t Imm,
621
               int64_t Address, const void *Decoder)
622
2.65k
{
623
2.65k
  CS_ASSERT_RET_VAL(isUIntN(4, Imm) && "Invalid immediate",
624
2.65k
        MCDisassembler_Fail);
625
2.65k
  MCOperand_CreateImm0(Inst, (Imm));
626
2.65k
  return MCDisassembler_Success;
627
2.65k
}
628
629
static DecodeStatus decodeUimm5Operand(MCInst *Inst, uint64_t Imm,
630
               int64_t Address, const void *Decoder)
631
3.40k
{
632
3.40k
  CS_ASSERT_RET_VAL(isUIntN(5, Imm) && "Invalid immediate",
633
3.40k
        MCDisassembler_Fail);
634
3.40k
  MCOperand_CreateImm0(Inst, (Imm));
635
3.40k
  return MCDisassembler_Success;
636
3.40k
}
637
638
static DecodeStatus decodeImm1_16Operand(MCInst *Inst, uint64_t Imm,
639
           int64_t Address, const void *Decoder)
640
1.15k
{
641
1.15k
  CS_ASSERT_RET_VAL(isUIntN(4, Imm) && "Invalid immediate",
642
1.15k
        MCDisassembler_Fail);
643
1.15k
  MCOperand_CreateImm0(Inst, (Imm + 1));
644
1.15k
  return MCDisassembler_Success;
645
1.15k
}
646
647
static DecodeStatus decodeImm1n_15Operand(MCInst *Inst, uint64_t Imm,
648
            int64_t Address, const void *Decoder)
649
4.66k
{
650
4.66k
  CS_ASSERT_RET_VAL(isUIntN(4, Imm) && "Invalid immediate",
651
4.66k
        MCDisassembler_Fail);
652
4.66k
  if (!Imm)
653
298
    MCOperand_CreateImm0(Inst, (-1));
654
4.36k
  else
655
4.36k
    MCOperand_CreateImm0(Inst, (Imm));
656
4.66k
  return MCDisassembler_Success;
657
4.66k
}
658
659
static DecodeStatus decodeImm32n_95Operand(MCInst *Inst, uint64_t Imm,
660
             int64_t Address, const void *Decoder)
661
1.68k
{
662
1.68k
  CS_ASSERT_RET_VAL(isUIntN(7, Imm) && "Invalid immediate",
663
1.68k
        MCDisassembler_Fail);
664
1.68k
  if ((Imm & 0x60) == 0x60)
665
503
    MCOperand_CreateImm0(Inst, ((~0x1f) | Imm));
666
1.18k
  else
667
1.18k
    MCOperand_CreateImm0(Inst, (Imm));
668
1.68k
  return MCDisassembler_Success;
669
1.68k
}
670
671
static DecodeStatus decodeImm8n_7Operand(MCInst *Inst, uint64_t Imm,
672
           int64_t Address, const void *Decoder)
673
235
{
674
235
  CS_ASSERT_RET_VAL(isUIntN(4, Imm) && "Invalid immediate",
675
235
        MCDisassembler_Fail);
676
235
  if (Imm > 7)
677
122
    MCOperand_CreateImm0(Inst, (Imm - 16));
678
113
  else
679
113
    MCOperand_CreateImm0(Inst, (Imm));
680
235
  return MCDisassembler_Success;
681
235
}
682
683
static DecodeStatus decodeImm64n_4nOperand(MCInst *Inst, uint64_t Imm,
684
             int64_t Address, const void *Decoder)
685
81
{
686
81
  CS_ASSERT_RET_VAL(isUIntN(6, Imm) && ((Imm & 0x3) == 0) &&
687
81
          "Invalid immediate",
688
81
        MCDisassembler_Fail);
689
81
  MCOperand_CreateImm0(Inst, ((~0x3f) | (Imm)));
690
81
  return MCDisassembler_Success;
691
81
}
692
693
static DecodeStatus decodeOffset8m32Operand(MCInst *Inst, uint64_t Imm,
694
              int64_t Address,
695
              const void *Decoder)
696
1.06k
{
697
1.06k
  CS_ASSERT_RET_VAL(isUIntN(10, Imm) && ((Imm & 0x3) == 0) &&
698
1.06k
          "Invalid immediate",
699
1.06k
        MCDisassembler_Fail);
700
1.06k
  MCOperand_CreateImm0(Inst, (Imm));
701
1.06k
  return MCDisassembler_Success;
702
1.06k
}
703
704
static DecodeStatus decodeEntry_Imm12OpValue(MCInst *Inst, uint64_t Imm,
705
               int64_t Address,
706
               const void *Decoder)
707
313
{
708
313
  CS_ASSERT_RET_VAL(isUIntN(15, Imm) && ((Imm & 0x7) == 0) &&
709
313
          "Invalid immediate",
710
313
        MCDisassembler_Fail);
711
313
  MCOperand_CreateImm0(Inst, (Imm));
712
313
  return MCDisassembler_Success;
713
313
}
714
715
static DecodeStatus decodeShimm1_31Operand(MCInst *Inst, uint64_t Imm,
716
             int64_t Address, const void *Decoder)
717
350
{
718
350
  CS_ASSERT_RET_VAL(isUIntN(5, Imm) && "Invalid immediate",
719
350
        MCDisassembler_Fail);
720
350
  MCOperand_CreateImm0(Inst, (32 - Imm));
721
350
  return MCDisassembler_Success;
722
350
}
723
724
//static DecodeStatus decodeShimm0_31Operand(MCInst *Inst, uint64_t Imm,
725
//             int64_t Address, const void *Decoder)
726
//{
727
//  CS_ASSERT_RET_VAL(isUIntN(5, Imm) && "Invalid immediate", MCDisassembler_Fail);
728
//  MCOperand_CreateImm0(Inst, (32 - Imm));
729
//  return MCDisassembler_Success;
730
//}
731
732
static DecodeStatus decodeImm7_22Operand(MCInst *Inst, uint64_t Imm,
733
           int64_t Address, const void *Decoder)
734
355
{
735
355
  CS_ASSERT_RET_VAL(isUIntN(4, Imm) && "Invalid immediate",
736
355
        MCDisassembler_Fail);
737
355
  MCOperand_CreateImm0(Inst, (Imm + 7));
738
355
  return MCDisassembler_Success;
739
355
}
740
741
static DecodeStatus decodeSelect_2Operand(MCInst *Inst, uint64_t Imm,
742
            int64_t Address, const void *Decoder)
743
1.17k
{
744
1.17k
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
745
1.17k
        MCDisassembler_Fail);
746
1.17k
  MCOperand_CreateImm0(Inst, (Imm));
747
1.17k
  return MCDisassembler_Success;
748
1.17k
}
749
750
static DecodeStatus decodeSelect_4Operand(MCInst *Inst, uint64_t Imm,
751
            int64_t Address, const void *Decoder)
752
2.25k
{
753
2.25k
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
754
2.25k
        MCDisassembler_Fail);
755
2.25k
  MCOperand_CreateImm0(Inst, (Imm));
756
2.25k
  return MCDisassembler_Success;
757
2.25k
}
758
759
static DecodeStatus decodeSelect_8Operand(MCInst *Inst, uint64_t Imm,
760
            int64_t Address, const void *Decoder)
761
1.11k
{
762
1.11k
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
763
1.11k
        MCDisassembler_Fail);
764
1.11k
  MCOperand_CreateImm0(Inst, (Imm));
765
1.11k
  return MCDisassembler_Success;
766
1.11k
}
767
768
static DecodeStatus decodeSelect_16Operand(MCInst *Inst, uint64_t Imm,
769
             int64_t Address, const void *Decoder)
770
419
{
771
419
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
772
419
        MCDisassembler_Fail);
773
419
  MCOperand_CreateImm0(Inst, (Imm));
774
419
  return MCDisassembler_Success;
775
419
}
776
777
static DecodeStatus decodeSelect_256Operand(MCInst *Inst, uint64_t Imm,
778
              int64_t Address,
779
              const void *Decoder)
780
282
{
781
282
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
782
282
        MCDisassembler_Fail);
783
282
  MCOperand_CreateImm0(Inst, (Imm));
784
282
  return MCDisassembler_Success;
785
282
}
786
787
static DecodeStatus decodeOffset_16_16Operand(MCInst *Inst, uint64_t Imm,
788
                int64_t Address,
789
                const void *Decoder)
790
715
{
791
715
  CS_ASSERT_RET_VAL(isIntN(Imm, 8) && "Invalid immediate",
792
715
        MCDisassembler_Fail);
793
710
  if ((Imm & 0xf) != 0)
794
710
    MCOperand_CreateImm0(Inst, (Imm << 4));
795
0
  else
796
0
    MCOperand_CreateImm0(Inst, (Imm));
797
710
  return MCDisassembler_Success;
798
715
}
799
800
static DecodeStatus decodeOffset_256_8Operand(MCInst *Inst, uint64_t Imm,
801
                int64_t Address,
802
                const void *Decoder)
803
2.51k
{
804
2.51k
  CS_ASSERT_RET_VAL(isIntN(16, Imm) && "Invalid immediate",
805
2.51k
        MCDisassembler_Fail);
806
2.51k
  if ((Imm & 0x7) != 0)
807
2.41k
    MCOperand_CreateImm0(Inst, (Imm << 3));
808
94
  else
809
94
    MCOperand_CreateImm0(Inst, (Imm));
810
2.51k
  return MCDisassembler_Success;
811
2.51k
}
812
813
static DecodeStatus decodeOffset_256_16Operand(MCInst *Inst, uint64_t Imm,
814
                 int64_t Address,
815
                 const void *Decoder)
816
1.48k
{
817
1.48k
  CS_ASSERT_RET_VAL(isIntN(16, Imm) && "Invalid immediate",
818
1.48k
        MCDisassembler_Fail);
819
1.48k
  if ((Imm & 0xf) != 0)
820
1.01k
    MCOperand_CreateImm0(Inst, (Imm << 4));
821
473
  else
822
473
    MCOperand_CreateImm0(Inst, (Imm));
823
1.48k
  return MCDisassembler_Success;
824
1.48k
}
825
826
static DecodeStatus decodeOffset_256_4Operand(MCInst *Inst, uint64_t Imm,
827
                int64_t Address,
828
                const void *Decoder)
829
701
{
830
701
  CS_ASSERT_RET_VAL(isIntN(16, Imm) && "Invalid immediate",
831
701
        MCDisassembler_Fail);
832
701
  if ((Imm & 0x2) != 0)
833
381
    MCOperand_CreateImm0(Inst, (Imm << 2));
834
320
  else
835
320
    MCOperand_CreateImm0(Inst, (Imm));
836
701
  return MCDisassembler_Success;
837
701
}
838
839
static DecodeStatus decodeOffset_128_2Operand(MCInst *Inst, uint64_t Imm,
840
                int64_t Address,
841
                const void *Decoder)
842
750
{
843
750
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
844
750
        MCDisassembler_Fail);
845
750
  if ((Imm & 0x1) != 0)
846
464
    MCOperand_CreateImm0(Inst, (Imm << 1));
847
286
  else
848
286
    MCOperand_CreateImm0(Inst, (Imm));
849
750
  return MCDisassembler_Success;
850
750
}
851
852
static DecodeStatus decodeOffset_128_1Operand(MCInst *Inst, uint64_t Imm,
853
                int64_t Address,
854
                const void *Decoder)
855
208
{
856
208
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
857
208
        MCDisassembler_Fail);
858
208
  MCOperand_CreateImm0(Inst, (Imm));
859
208
  return MCDisassembler_Success;
860
208
}
861
862
static DecodeStatus decodeOffset_64_16Operand(MCInst *Inst, uint64_t Imm,
863
                int64_t Address,
864
                const void *Decoder)
865
2.99k
{
866
2.99k
  CS_ASSERT_RET_VAL(isIntN(16, Imm) && "Invalid immediate",
867
2.99k
        MCDisassembler_Fail);
868
2.99k
  if ((Imm & 0xf) != 0)
869
2.30k
    MCOperand_CreateImm0(Inst, (Imm << 4));
870
695
  else
871
695
    MCOperand_CreateImm0(Inst, (Imm));
872
2.99k
  return MCDisassembler_Success;
873
2.99k
}
874
875
static int64_t TableB4const[16] = { -1, 1,  2,  3,  4,  5,  6,   7,
876
            8,  10, 12, 16, 32, 64, 128, 256 };
877
static DecodeStatus decodeB4constOperand(MCInst *Inst, uint64_t Imm,
878
           int64_t Address, const void *Decoder)
879
4.85k
{
880
4.85k
  CS_ASSERT_RET_VAL(isUIntN(4, Imm) && "Invalid immediate",
881
4.85k
        MCDisassembler_Fail);
882
883
4.85k
  MCOperand_CreateImm0(Inst, (TableB4const[Imm]));
884
4.85k
  return MCDisassembler_Success;
885
4.85k
}
886
887
static int64_t TableB4constu[16] = { 32768, 65536, 2,  3,  4,  5,  6, 7,
888
             8,     10,    12, 16, 32, 64, 128, 256 };
889
static DecodeStatus decodeB4constuOperand(MCInst *Inst, uint64_t Imm,
890
            int64_t Address, const void *Decoder)
891
4.15k
{
892
4.15k
  CS_ASSERT_RET_VAL(isUIntN(4, Imm) && "Invalid immediate",
893
4.15k
        MCDisassembler_Fail);
894
895
4.15k
  MCOperand_CreateImm0(Inst, (TableB4constu[Imm]));
896
4.15k
  return MCDisassembler_Success;
897
4.15k
}
898
899
static DecodeStatus decodeMem8Operand(MCInst *Inst, uint64_t Imm,
900
              int64_t Address, const void *Decoder)
901
1.09k
{
902
1.09k
  CS_ASSERT_RET_VAL(isUIntN(12, Imm) && "Invalid immediate",
903
1.09k
        MCDisassembler_Fail);
904
1.09k
  DecodeARRegisterClass(Inst, Imm & 0xf, Address, Decoder);
905
1.09k
  MCOperand_CreateImm0(Inst, ((Imm >> 4) & 0xff));
906
1.09k
  return MCDisassembler_Success;
907
1.09k
}
908
909
static DecodeStatus decodeMem16Operand(MCInst *Inst, uint64_t Imm,
910
               int64_t Address, const void *Decoder)
911
530
{
912
530
  CS_ASSERT_RET_VAL(isUIntN(12, Imm) && "Invalid immediate",
913
530
        MCDisassembler_Fail);
914
530
  DecodeARRegisterClass(Inst, Imm & 0xf, Address, Decoder);
915
530
  MCOperand_CreateImm0(Inst, ((Imm >> 3) & 0x1fe));
916
530
  return MCDisassembler_Success;
917
530
}
918
919
static DecodeStatus decodeMem32Operand(MCInst *Inst, uint64_t Imm,
920
               int64_t Address, const void *Decoder)
921
2.03k
{
922
2.03k
  CS_ASSERT_RET_VAL(isUIntN(12, Imm) && "Invalid immediate",
923
2.03k
        MCDisassembler_Fail);
924
2.03k
  DecodeARRegisterClass(Inst, Imm & 0xf, Address, Decoder);
925
2.03k
  MCOperand_CreateImm0(Inst, ((Imm >> 2) & 0x3fc));
926
2.03k
  return MCDisassembler_Success;
927
2.03k
}
928
929
static DecodeStatus decodeMem32nOperand(MCInst *Inst, uint64_t Imm,
930
          int64_t Address, const void *Decoder)
931
6.08k
{
932
6.08k
  CS_ASSERT_RET_VAL(isUIntN(8, Imm) && "Invalid immediate",
933
6.08k
        MCDisassembler_Fail);
934
6.08k
  DecodeARRegisterClass(Inst, Imm & 0xf, Address, Decoder);
935
6.08k
  MCOperand_CreateImm0(Inst, ((Imm >> 2) & 0x3c));
936
6.08k
  return MCDisassembler_Success;
937
6.08k
}
938
939
/// Read two bytes from the ArrayRef and return 16 bit data sorted
940
/// according to the given endianness.
941
static DecodeStatus readInstruction16(MCInst *MI, const uint8_t *Bytes,
942
              size_t BytesLen, uint64_t Address,
943
              uint64_t *Size, uint64_t *Insn,
944
              bool IsLittleEndian)
945
95.5k
{
946
  // We want to read exactly 2 Bytes of data.
947
95.5k
  if (BytesLen < 2) {
948
435
    *Size = 0;
949
435
    return MCDisassembler_Fail;
950
435
  }
951
952
95.1k
  *Insn = readBytes16(MI, Bytes);
953
95.1k
  *Size = 2;
954
955
95.1k
  return MCDisassembler_Success;
956
95.5k
}
957
958
/// Read three bytes from the ArrayRef and return 24 bit data
959
static DecodeStatus readInstruction24(MCInst *MI, const uint8_t *Bytes,
960
              size_t BytesLen, uint64_t Address,
961
              uint64_t *Size, uint64_t *Insn,
962
              bool IsLittleEndian, bool CheckTIE)
963
99.3k
{
964
  // We want to read exactly 3 Bytes of data.
965
99.3k
  if (BytesLen < 3) {
966
232
    *Size = 0;
967
232
    return MCDisassembler_Fail;
968
232
  }
969
970
99.0k
  if (CheckTIE && (Bytes[0] & 0x8) != 0)
971
9.17k
    return MCDisassembler_Fail;
972
89.9k
  *Insn = readBytes24(MI, Bytes);
973
89.9k
  *Size = 3;
974
975
89.9k
  return MCDisassembler_Success;
976
99.0k
}
977
978
/// Read three bytes from the ArrayRef and return 32 bit data
979
static DecodeStatus readInstruction32(MCInst *MI, const uint8_t *Bytes,
980
              size_t BytesLen, uint64_t Address,
981
              uint64_t *Size, uint64_t *Insn,
982
              bool IsLittleEndian)
983
9.43k
{
984
  // We want to read exactly 4 Bytes of data.
985
9.43k
  if (BytesLen < 4) {
986
97
    *Size = 0;
987
97
    return MCDisassembler_Fail;
988
97
  }
989
990
9.33k
  if ((Bytes[0] & 0x8) == 0)
991
205
    return MCDisassembler_Fail;
992
9.13k
  *Insn = readBytes32(MI, Bytes);
993
9.13k
  *Size = 4;
994
995
9.13k
  return MCDisassembler_Success;
996
9.33k
}
997
998
/// Read InstSize bytes from the ArrayRef and return 24 bit data
999
static DecodeStatus readInstructionN(const uint8_t *Bytes, size_t BytesLen,
1000
             uint64_t Address, unsigned InstSize,
1001
             uint64_t *Size, uint64_t *Insn,
1002
             bool IsLittleEndian)
1003
424
{
1004
  // We want to read exactly 3 Bytes of data.
1005
424
  if (BytesLen < InstSize) {
1006
82
    *Size = 0;
1007
82
    return MCDisassembler_Fail;
1008
82
  }
1009
1010
342
  *Insn = 0;
1011
16.7k
  for (unsigned i = 0; i < InstSize; i++)
1012
16.4k
    *Insn |= (uint64_t)(Bytes[i]) << (8 * i);
1013
1014
342
  *Size = InstSize;
1015
342
  return MCDisassembler_Success;
1016
424
}
1017
1018
#include "XtensaGenDisassemblerTables.inc"
1019
1020
FieldFromInstruction(fieldFromInstruction_2, uint64_t);
1021
18.4k
DecodeToMCInst(decodeToMCInst_2, fieldFromInstruction_2, uint64_t);
1022
95.1k
DecodeInstruction(decodeInstruction_2, fieldFromInstruction_2, decodeToMCInst_2,
1023
      uint64_t);
1024
1025
FieldFromInstruction(fieldFromInstruction_4, uint64_t);
1026
8.71k
DecodeToMCInst(decodeToMCInst_4, fieldFromInstruction_4, uint64_t);
1027
9.13k
DecodeInstruction(decodeInstruction_4, fieldFromInstruction_4, decodeToMCInst_4,
1028
      uint64_t);
1029
1030
FieldFromInstruction(fieldFromInstruction_6, uint64_t);
1031
305
DecodeToMCInst(decodeToMCInst_6, fieldFromInstruction_6, uint64_t);
1032
342
DecodeInstruction(decodeInstruction_6, fieldFromInstruction_6, decodeToMCInst_6,
1033
      uint64_t);
1034
1035
static bool hasDensity()
1036
95.5k
{
1037
95.5k
  return true;
1038
95.5k
}
1039
static bool hasESP32S3Ops()
1040
22.6k
{
1041
22.6k
  return true;
1042
22.6k
}
1043
static bool hasHIFI3()
1044
424
{
1045
424
  return true;
1046
424
}
1047
1048
static DecodeStatus getInstruction(MCInst *MI, uint64_t *Size,
1049
           const uint8_t *Bytes, size_t BytesLen,
1050
           uint64_t Address)
1051
95.5k
{
1052
95.5k
  uint64_t Insn;
1053
95.5k
  DecodeStatus Result;
1054
95.5k
  bool IsLittleEndian = MI->csh->mode & CS_MODE_LITTLE_ENDIAN;
1055
1056
  // Parse 16-bit instructions
1057
95.5k
  if (hasDensity()) {
1058
95.5k
    Result = readInstruction16(MI, Bytes, BytesLen, Address, Size,
1059
95.5k
             &Insn, IsLittleEndian);
1060
95.5k
    if (Result == MCDisassembler_Fail)
1061
435
      return MCDisassembler_Fail;
1062
1063
95.1k
    Result = decodeInstruction_2(DecoderTable16, MI, Insn, Address,
1064
95.1k
               NULL);
1065
95.1k
    if (Result != MCDisassembler_Fail) {
1066
18.4k
      *Size = 2;
1067
18.4k
      return Result;
1068
18.4k
    }
1069
95.1k
  }
1070
1071
  // Parse Core 24-bit instructions
1072
76.6k
  Result = readInstruction24(MI, Bytes, BytesLen, Address, Size, &Insn,
1073
76.6k
           IsLittleEndian, false);
1074
76.6k
  if (Result == MCDisassembler_Fail)
1075
232
    return MCDisassembler_Fail;
1076
1077
76.4k
  Result = decodeInstruction_3(DecoderTable24, MI, Insn, Address, NULL);
1078
76.4k
  if (Result != MCDisassembler_Fail) {
1079
53.7k
    *Size = 3;
1080
53.7k
    return Result;
1081
53.7k
  }
1082
1083
22.6k
  if (hasESP32S3Ops()) {
1084
    // Parse ESP32S3 24-bit instructions
1085
22.6k
    Result = readInstruction24(MI, Bytes, BytesLen, Address, Size,
1086
22.6k
             &Insn, IsLittleEndian, true);
1087
22.6k
    if (Result != MCDisassembler_Fail) {
1088
13.4k
      Result = decodeInstruction_3(DecoderTableESP32S324, MI,
1089
13.4k
                 Insn, Address, NULL);
1090
13.4k
      if (Result != MCDisassembler_Fail) {
1091
13.2k
        *Size = 3;
1092
13.2k
        return Result;
1093
13.2k
      }
1094
13.4k
    }
1095
1096
    // Parse ESP32S3 32-bit instructions
1097
9.43k
    Result = readInstruction32(MI, Bytes, BytesLen, Address, Size,
1098
9.43k
             &Insn, IsLittleEndian);
1099
9.43k
    if (Result == MCDisassembler_Fail)
1100
302
      return MCDisassembler_Fail;
1101
1102
9.13k
    Result = decodeInstruction_4(DecoderTableESP32S332, MI, Insn,
1103
9.13k
               Address, NULL);
1104
9.13k
    if (Result != MCDisassembler_Fail) {
1105
8.70k
      *Size = 4;
1106
8.70k
      return Result;
1107
8.70k
    }
1108
9.13k
  }
1109
1110
424
  if (hasHIFI3()) {
1111
424
    Result = decodeInstruction_3(DecoderTableHIFI324, MI, Insn,
1112
424
               Address, NULL);
1113
424
    if (Result != MCDisassembler_Fail)
1114
0
      return Result;
1115
1116
424
    Result = readInstructionN(Bytes, BytesLen, Address, 48, Size,
1117
424
            &Insn, IsLittleEndian);
1118
424
    if (Result == MCDisassembler_Fail)
1119
82
      return MCDisassembler_Fail;
1120
1121
342
    Result = decodeInstruction_6(DecoderTableHIFI348, MI, Insn,
1122
342
               Address, NULL);
1123
342
    if (Result != MCDisassembler_Fail)
1124
305
      return Result;
1125
342
  }
1126
37
  return Result;
1127
424
}
1128
1129
DecodeStatus Xtensa_LLVM_getInstruction(MCInst *MI, uint16_t *size16,
1130
          const uint8_t *Bytes,
1131
          unsigned BytesSize, uint64_t Address)
1132
95.5k
{
1133
95.5k
  uint64_t size64;
1134
95.5k
  DecodeStatus status =
1135
95.5k
    getInstruction(MI, &size64, Bytes, BytesSize, Address);
1136
95.5k
  CS_ASSERT_RET_VAL(size64 < 0xffff, MCDisassembler_Fail);
1137
95.5k
  *size16 = size64;
1138
95.5k
  return status;
1139
95.5k
}