Coverage Report

Created: 2026-01-17 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/capstonenext/arch/Xtensa/XtensaInstPrinter.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
//===- XtensaInstPrinter.cpp - Convert Xtensa MCInst to asm syntax --------===//
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 class prints an Xtensa MCInst to a .s file.
26
//
27
//===----------------------------------------------------------------------===//
28
29
#include <stdio.h>
30
#include <string.h>
31
#include <stdlib.h>
32
#include <capstone/platform.h>
33
34
#include "../../MCInstPrinter.h"
35
#include "../../SStream.h"
36
#include "./priv.h"
37
#include "../../Mapping.h"
38
39
#include "XtensaMapping.h"
40
#include "../../MathExtras.h"
41
42
#define CONCAT(a, b) CONCAT_(a, b)
43
#define CONCAT_(a, b) a##_##b
44
45
#define DEBUG_TYPE "asm-printer"
46
static MnemonicBitsInfo getMnemonic(MCInst *MI, SStream *O);
47
static const char *getRegisterName(unsigned RegNo);
48
49
typedef MCRegister Register;
50
51
static void printRegName(SStream *O, MCRegister Reg)
52
75
{
53
75
  SStream_concat0(O, getRegisterName(Reg));
54
75
}
55
56
static void printOp(MCInst *MI, MCOperand *MC, SStream *O)
57
219k
{
58
219k
  if (MCOperand_isReg(MC))
59
209k
    SStream_concat0(O, getRegisterName(MCOperand_getReg(MC)));
60
10.7k
  else if (MCOperand_isImm(MC))
61
10.7k
    printInt64(O, MCOperand_getImm(MC));
62
0
  else if (MCOperand_isExpr(MC))
63
0
    printExpr(MCOperand_getExpr(MC), O);
64
0
  else
65
0
    CS_ASSERT(0 && "Invalid operand");
66
219k
}
67
68
static void printOperand(MCInst *MI, const int op_num, SStream *O)
69
209k
{
70
209k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Operand, op_num);
71
209k
  printOp(MI, MCInst_getOperand(MI, op_num), O);
72
209k
}
73
74
static inline void printMemOperand(MCInst *MI, int OpNum, SStream *OS)
75
10.7k
{
76
10.7k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_MemOperand, OpNum);
77
10.7k
  SStream_concat0(OS, getRegisterName(MCOperand_getReg(
78
10.7k
            MCInst_getOperand(MI, (OpNum)))));
79
10.7k
  SStream_concat0(OS, ", ");
80
10.7k
  printOp(MI, MCInst_getOperand(MI, OpNum + 1), OS);
81
10.7k
}
82
83
static inline void printBranchTarget(MCInst *MI, int OpNum, SStream *OS)
84
17.5k
{
85
17.5k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_BranchTarget, OpNum);
86
17.5k
  MCOperand *MC = MCInst_getOperand(MI, (OpNum));
87
17.5k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
88
17.5k
    int64_t Val = MCOperand_getImm(MC) + 4;
89
17.5k
    SStream_concat0(OS, ". ");
90
17.5k
    if (Val > 0)
91
7.85k
      SStream_concat0(OS, "+");
92
93
17.5k
    printInt64(OS, Val);
94
17.5k
  } else if (MCOperand_isExpr(MC))
95
0
    CS_ASSERT_RET(0 && "unimplemented expr printing");
96
0
  else
97
0
    CS_ASSERT(0 && "Invalid operand");
98
17.5k
}
99
100
static inline void printLoopTarget(MCInst *MI, int OpNum, SStream *OS)
101
94
{
102
94
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_LoopTarget, OpNum);
103
94
  MCOperand *MC = MCInst_getOperand(MI, (OpNum));
104
94
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
105
94
    int64_t Val = MCOperand_getImm(MC) + 4;
106
94
    SStream_concat0(OS, ". ");
107
94
    if (Val > 0)
108
94
      SStream_concat0(OS, "+");
109
110
94
    printInt64(OS, Val);
111
94
  } else if (MCOperand_isExpr(MC))
112
0
    CS_ASSERT_RET(0 && "unimplemented expr printing");
113
0
  else
114
0
    CS_ASSERT(0 && "Invalid operand");
115
94
}
116
117
static inline void printJumpTarget(MCInst *MI, int OpNum, SStream *OS)
118
1.46k
{
119
1.46k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_JumpTarget, OpNum);
120
1.46k
  MCOperand *MC = MCInst_getOperand(MI, (OpNum));
121
1.46k
  if (MCOperand_isImm(MC)) {
122
1.46k
    int64_t Val = MCOperand_getImm(MC) + 4;
123
1.46k
    SStream_concat0(OS, ". ");
124
1.46k
    if (Val > 0)
125
654
      SStream_concat0(OS, "+");
126
127
1.46k
    printInt64(OS, Val);
128
1.46k
  } else if (MCOperand_isExpr(MC))
129
0
    CS_ASSERT_RET(0 && "unimplemented expr printing");
130
0
  else
131
0
    CS_ASSERT(0 && "Invalid operand");
132
1.46k
  ;
133
1.46k
}
134
135
static inline void printCallOperand(MCInst *MI, int OpNum, SStream *OS)
136
3.91k
{
137
3.91k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_CallOperand, OpNum);
138
3.91k
  MCOperand *MC = MCInst_getOperand(MI, (OpNum));
139
3.91k
  if (MCOperand_isImm(MC)) {
140
3.91k
    int64_t Val = MCOperand_getImm(MC) + 4;
141
3.91k
    SStream_concat0(OS, ". ");
142
3.91k
    if (Val > 0)
143
2.45k
      SStream_concat0(OS, "+");
144
145
3.91k
    printInt64(OS, Val);
146
3.91k
  } else if (MCOperand_isExpr(MC))
147
0
    CS_ASSERT_RET(0 && "unimplemented expr printing");
148
0
  else
149
0
    CS_ASSERT(0 && "Invalid operand");
150
3.91k
}
151
152
static inline void printL32RTarget(MCInst *MI, int OpNum, SStream *O)
153
6.80k
{
154
6.80k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_L32RTarget, OpNum);
155
6.80k
  MCOperand *MC = MCInst_getOperand(MI, (OpNum));
156
6.80k
  if (MCOperand_isImm(MC)) {
157
6.80k
    SStream_concat0(O, ". ");
158
6.80k
    printInt64(O, Xtensa_L32R_Value(MI, OpNum));
159
6.80k
  } else if (MCOperand_isExpr(MC))
160
0
    CS_ASSERT_RET(0 && "unimplemented expr printing");
161
0
  else
162
0
    CS_ASSERT(0 && "Invalid operand");
163
6.80k
}
164
165
static inline void printImm8_AsmOperand(MCInst *MI, int OpNum, SStream *O)
166
305
{
167
305
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm8_AsmOperand, OpNum);
168
305
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
169
305
    int64_t Value =
170
305
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
171
305
    CS_ASSERT_RET(
172
305
      isIntN(8, Value) &&
173
305
      "Invalid argument, value must be in ranges [-128,127]");
174
305
    printInt64(O, Value);
175
305
  } else {
176
0
    printOperand(MI, OpNum, O);
177
0
  }
178
305
}
179
180
static inline void printImm8_sh8_AsmOperand(MCInst *MI, int OpNum, SStream *O)
181
326
{
182
326
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm8_sh8_AsmOperand, OpNum);
183
326
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
184
326
    int64_t Value =
185
326
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
186
326
    CS_ASSERT_RET(
187
326
      (isIntN(16, Value) && ((Value & 0xFF) == 0)) &&
188
326
      "Invalid argument, value must be multiples of 256 in range "
189
326
      "[-32768,32512]");
190
326
    printInt64(O, Value);
191
326
  } else
192
0
    printOperand(MI, OpNum, O);
193
326
}
194
195
static inline void printImm12_AsmOperand(MCInst *MI, int OpNum, SStream *O)
196
0
{
197
0
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm12_AsmOperand, OpNum);
198
0
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
199
0
    int64_t Value =
200
0
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
201
0
    CS_ASSERT_RET(
202
0
      (Value >= -2048 && Value <= 2047) &&
203
0
      "Invalid argument, value must be in ranges [-2048,2047]");
204
0
    printInt64(O, Value);
205
0
  } else
206
0
    printOperand(MI, OpNum, O);
207
0
}
208
209
static inline void printImm12m_AsmOperand(MCInst *MI, int OpNum, SStream *O)
210
405
{
211
405
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm12m_AsmOperand, OpNum);
212
405
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
213
405
    int64_t Value =
214
405
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
215
405
    CS_ASSERT_RET(
216
405
      (Value >= -2048 && Value <= 2047) &&
217
405
      "Invalid argument, value must be in ranges [-2048,2047]");
218
405
    printInt64(O, Value);
219
405
  } else
220
0
    printOperand(MI, OpNum, O);
221
405
}
222
223
static inline void printUimm4_AsmOperand(MCInst *MI, int OpNum, SStream *O)
224
3.03k
{
225
3.03k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Uimm4_AsmOperand, OpNum);
226
3.03k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
227
3.03k
    int64_t Value =
228
3.03k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
229
3.03k
    CS_ASSERT_RET((Value >= 0 && Value <= 15) &&
230
3.03k
            "Invalid argument");
231
3.03k
    printInt64(O, Value);
232
3.03k
  } else
233
0
    printOperand(MI, OpNum, O);
234
3.03k
}
235
236
static inline void printUimm5_AsmOperand(MCInst *MI, int OpNum, SStream *O)
237
3.61k
{
238
3.61k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Uimm5_AsmOperand, OpNum);
239
3.61k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
240
3.61k
    int64_t Value =
241
3.61k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
242
3.61k
    CS_ASSERT_RET((Value >= 0 && Value <= 31) &&
243
3.61k
            "Invalid argument");
244
3.61k
    printInt64(O, Value);
245
3.61k
  } else
246
0
    printOperand(MI, OpNum, O);
247
3.61k
}
248
249
static inline void printShimm1_31_AsmOperand(MCInst *MI, int OpNum, SStream *O)
250
0
{
251
0
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Shimm1_31_AsmOperand, OpNum);
252
0
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
253
0
    int64_t Value =
254
0
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
255
0
    CS_ASSERT_RET(
256
0
      (Value >= 1 && Value <= 31) &&
257
0
      "Invalid argument, value must be in range [1,31]");
258
0
    printInt64(O, Value);
259
0
  } else
260
0
    printOperand(MI, OpNum, O);
261
0
}
262
263
static inline void printShimm0_31_AsmOperand(MCInst *MI, int OpNum, SStream *O)
264
844
{
265
844
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Shimm0_31_AsmOperand, OpNum);
266
844
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
267
844
    int64_t Value =
268
844
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
269
844
    CS_ASSERT_RET(
270
844
      (Value >= 0 && Value <= 31) &&
271
844
      "Invalid argument, value must be in range [0,31]");
272
533
    printInt64(O, Value);
273
533
  } else
274
0
    printOperand(MI, OpNum, O);
275
844
}
276
277
static inline void printImm1_16_AsmOperand(MCInst *MI, int OpNum, SStream *O)
278
1.06k
{
279
1.06k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm1_16_AsmOperand, OpNum);
280
1.06k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
281
1.06k
    int64_t Value =
282
1.06k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
283
1.06k
    CS_ASSERT_RET(
284
1.06k
      (Value >= 1 && Value <= 16) &&
285
1.06k
      "Invalid argument, value must be in range [1,16]");
286
1.06k
    printInt64(O, Value);
287
1.06k
  } else
288
0
    printOperand(MI, OpNum, O);
289
1.06k
}
290
291
static inline void printImm1n_15_AsmOperand(MCInst *MI, int OpNum, SStream *O)
292
8.24k
{
293
8.24k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm1n_15_AsmOperand, OpNum);
294
8.24k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
295
8.24k
    int64_t Value =
296
8.24k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
297
8.24k
    CS_ASSERT_RET(
298
8.24k
      (Value >= -1 && (Value != 0) && Value <= 15) &&
299
8.24k
      "Invalid argument, value must be in ranges <-1,-1> or <1,15>");
300
8.24k
    printInt64(O, Value);
301
8.24k
  } else
302
0
    printOperand(MI, OpNum, O);
303
8.24k
}
304
305
static inline void printImm32n_95_AsmOperand(MCInst *MI, int OpNum, SStream *O)
306
1.50k
{
307
1.50k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm32n_95_AsmOperand, OpNum);
308
1.50k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
309
1.50k
    int64_t Value =
310
1.50k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
311
1.50k
    CS_ASSERT_RET(
312
1.50k
      (Value >= -32 && Value <= 95) &&
313
1.50k
      "Invalid argument, value must be in ranges <-32,95>");
314
1.50k
    printInt64(O, Value);
315
1.50k
  } else
316
0
    printOperand(MI, OpNum, O);
317
1.50k
}
318
319
static inline void printImm8n_7_AsmOperand(MCInst *MI, int OpNum, SStream *O)
320
384
{
321
384
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm8n_7_AsmOperand, OpNum);
322
384
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
323
384
    int64_t Value =
324
384
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
325
384
    CS_ASSERT_RET(
326
384
      (Value >= -8 && Value <= 7) &&
327
384
      "Invalid argument, value must be in ranges <-8,7>");
328
384
    printInt64(O, Value);
329
384
  } else
330
0
    printOperand(MI, OpNum, O);
331
384
}
332
333
static inline void printImm64n_4n_AsmOperand(MCInst *MI, int OpNum, SStream *O)
334
158
{
335
158
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm64n_4n_AsmOperand, OpNum);
336
158
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
337
158
    int64_t Value =
338
158
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
339
158
    CS_ASSERT_RET(
340
158
      (Value >= -64 && Value <= -4) & ((Value & 0x3) == 0) &&
341
158
      "Invalid argument, value must be in ranges <-64,-4>");
342
158
    printInt64(O, Value);
343
158
  } else
344
0
    printOperand(MI, OpNum, O);
345
158
}
346
347
static inline void printOffset8m32_AsmOperand(MCInst *MI, int OpNum, SStream *O)
348
1.10k
{
349
1.10k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset8m32_AsmOperand,
350
1.10k
             OpNum);
351
1.10k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
352
1.10k
    int64_t Value =
353
1.10k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
354
1.10k
    CS_ASSERT_RET(
355
1.10k
      (Value >= 0 && Value <= 1020 && ((Value & 0x3) == 0)) &&
356
1.10k
      "Invalid argument, value must be multiples of four in range [0,1020]");
357
1.10k
    printInt64(O, Value);
358
1.10k
  } else
359
0
    printOperand(MI, OpNum, O);
360
1.10k
}
361
362
static inline void printEntry_Imm12_AsmOperand(MCInst *MI, int OpNum,
363
                 SStream *O)
364
373
{
365
373
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Entry_Imm12_AsmOperand,
366
373
             OpNum);
367
373
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
368
373
    int64_t Value =
369
373
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
370
373
    CS_ASSERT_RET(
371
373
      (Value >= 0 && Value <= 32760) &&
372
373
      "Invalid argument, value must be multiples of eight in range "
373
373
      "<0,32760>");
374
373
    printInt64(O, Value);
375
373
  } else
376
0
    printOperand(MI, OpNum, O);
377
373
}
378
379
static inline void printB4const_AsmOperand(MCInst *MI, int OpNum, SStream *O)
380
4.22k
{
381
4.22k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_B4const_AsmOperand, OpNum);
382
4.22k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
383
4.22k
    int64_t Value =
384
4.22k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
385
386
4.22k
    switch (Value) {
387
189
    case -1:
388
289
    case 1:
389
693
    case 2:
390
907
    case 3:
391
1.17k
    case 4:
392
1.42k
    case 5:
393
1.77k
    case 6:
394
1.87k
    case 7:
395
1.98k
    case 8:
396
2.32k
    case 10:
397
2.60k
    case 12:
398
2.83k
    case 16:
399
3.51k
    case 32:
400
3.59k
    case 64:
401
3.89k
    case 128:
402
4.22k
    case 256:
403
4.22k
      break;
404
0
    default:
405
0
      CS_ASSERT_RET((0) && "Invalid B4const argument");
406
4.22k
    }
407
4.22k
    printInt64(O, Value);
408
4.22k
  } else
409
0
    printOperand(MI, OpNum, O);
410
4.22k
}
411
412
static inline void printB4constu_AsmOperand(MCInst *MI, int OpNum, SStream *O)
413
6.77k
{
414
6.77k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_B4constu_AsmOperand, OpNum);
415
6.77k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
416
6.77k
    int64_t Value =
417
6.77k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
418
419
6.77k
    switch (Value) {
420
431
    case 32768:
421
648
    case 65536:
422
739
    case 2:
423
821
    case 3:
424
1.10k
    case 4:
425
1.62k
    case 5:
426
2.58k
    case 6:
427
2.72k
    case 7:
428
2.82k
    case 8:
429
2.91k
    case 10:
430
3.11k
    case 12:
431
5.23k
    case 16:
432
5.53k
    case 32:
433
5.83k
    case 64:
434
6.09k
    case 128:
435
6.77k
    case 256:
436
6.77k
      break;
437
0
    default:
438
0
      CS_ASSERT_RET((0) && "Invalid B4constu argument");
439
6.77k
    }
440
6.77k
    printInt64(O, Value);
441
6.77k
  } else
442
0
    printOperand(MI, OpNum, O);
443
6.77k
}
444
445
static inline void printImm7_22_AsmOperand(MCInst *MI, int OpNum, SStream *O)
446
350
{
447
350
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Imm7_22_AsmOperand, OpNum);
448
350
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
449
350
    int64_t Value =
450
350
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
451
350
    CS_ASSERT_RET(
452
350
      (Value >= 7 && Value <= 22) &&
453
350
      "Invalid argument, value must be in range <7,22>");
454
350
    printInt64(O, Value);
455
350
  } else
456
0
    printOperand(MI, OpNum, O);
457
350
}
458
459
static inline void printSelect_2_AsmOperand(MCInst *MI, int OpNum, SStream *O)
460
1.41k
{
461
1.41k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_2_AsmOperand, OpNum);
462
1.41k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
463
1.41k
    int64_t Value =
464
1.41k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
465
1.41k
    CS_ASSERT_RET((Value >= 0 && Value <= 1) &&
466
1.41k
            "Invalid argument, value must be in range [0,1]");
467
1.41k
    printInt64(O, Value);
468
1.41k
  } else
469
0
    printOperand(MI, OpNum, O);
470
1.41k
}
471
472
static inline void printSelect_4_AsmOperand(MCInst *MI, int OpNum, SStream *O)
473
3.21k
{
474
3.21k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_4_AsmOperand, OpNum);
475
3.21k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
476
3.21k
    int64_t Value =
477
3.21k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
478
3.21k
    CS_ASSERT_RET((Value >= 0 && Value <= 3) &&
479
3.21k
            "Invalid argument, value must be in range [0,3]");
480
3.21k
    printInt64(O, Value);
481
3.21k
  } else
482
0
    printOperand(MI, OpNum, O);
483
3.21k
}
484
485
static inline void printSelect_8_AsmOperand(MCInst *MI, int OpNum, SStream *O)
486
1.71k
{
487
1.71k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_8_AsmOperand, OpNum);
488
1.71k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
489
1.71k
    int64_t Value =
490
1.71k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
491
1.71k
    CS_ASSERT_RET((Value >= 0 && Value <= 7) &&
492
1.71k
            "Invalid argument, value must be in range [0,7]");
493
1.71k
    printInt64(O, Value);
494
1.71k
  } else
495
0
    printOperand(MI, OpNum, O);
496
1.71k
}
497
498
static inline void printSelect_16_AsmOperand(MCInst *MI, int OpNum, SStream *O)
499
187
{
500
187
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_16_AsmOperand, OpNum);
501
187
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
502
187
    int64_t Value =
503
187
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
504
187
    CS_ASSERT_RET(
505
187
      (Value >= 0 && Value <= 15) &&
506
187
      "Invalid argument, value must be in range [0,15]");
507
187
    printInt64(O, Value);
508
187
  } else
509
0
    printOperand(MI, OpNum, O);
510
187
}
511
512
static inline void printSelect_256_AsmOperand(MCInst *MI, int OpNum, SStream *O)
513
248
{
514
248
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Select_256_AsmOperand,
515
248
             OpNum);
516
248
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
517
248
    int64_t Value =
518
248
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
519
248
    CS_ASSERT_RET(
520
248
      (Value >= 0 && Value <= 255) &&
521
248
      "Invalid argument, value must be in range [0,255]");
522
248
    printInt64(O, Value);
523
248
  } else
524
0
    printOperand(MI, OpNum, O);
525
248
}
526
527
static inline void printOffset_16_16_AsmOperand(MCInst *MI, int OpNum,
528
            SStream *O)
529
660
{
530
660
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_16_16_AsmOperand,
531
660
             OpNum);
532
660
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
533
660
    int64_t Value =
534
660
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
535
660
    CS_ASSERT_RET(
536
660
      (Value >= -128 && Value <= 112 && (Value & 0xf) == 0) &&
537
660
      "Invalid argument, value must be in range [-128,112], first 4 bits "
538
660
      "should be zero");
539
358
    printInt64(O, Value);
540
358
  } else {
541
0
    printOperand(MI, OpNum, O);
542
0
  }
543
660
}
544
545
static inline void printOffset_256_8_AsmOperand(MCInst *MI, int OpNum,
546
            SStream *O)
547
2.86k
{
548
2.86k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_256_8_AsmOperand,
549
2.86k
             OpNum);
550
2.86k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
551
2.86k
    int64_t Value =
552
2.86k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
553
2.86k
    CS_ASSERT_RET(
554
2.86k
      (Value >= -1024 && Value <= 1016 &&
555
2.86k
       (Value & 0x7) == 0) &&
556
2.86k
      "Invalid argument, value must be in range [-1024,1016], first 3 "
557
2.86k
      "bits should be zero");
558
1.44k
    printInt64(O, Value);
559
1.44k
  } else
560
0
    printOperand(MI, OpNum, O);
561
2.86k
}
562
563
static inline void printOffset_256_16_AsmOperand(MCInst *MI, int OpNum,
564
             SStream *O)
565
1.83k
{
566
1.83k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_256_16_AsmOperand,
567
1.83k
             OpNum);
568
1.83k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
569
1.83k
    int64_t Value =
570
1.83k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
571
1.83k
    CS_ASSERT_RET(
572
1.83k
      (Value >= -2048 && Value <= 2032 &&
573
1.83k
       (Value & 0xf) == 0) &&
574
1.83k
      "Invalid argument, value must be in range [-2048,2032], first 4 "
575
1.83k
      "bits should be zero");
576
1.23k
    printInt64(O, Value);
577
1.23k
  } else {
578
0
    printOperand(MI, OpNum, O);
579
0
  }
580
1.83k
}
581
582
static inline void printOffset_256_4_AsmOperand(MCInst *MI, int OpNum,
583
            SStream *O)
584
1.18k
{
585
1.18k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_256_4_AsmOperand,
586
1.18k
             OpNum);
587
1.18k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
588
1.18k
    int64_t Value =
589
1.18k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
590
1.18k
    CS_ASSERT_RET(
591
1.18k
      (Value >= -512 && Value <= 508 && (Value & 0x3) == 0) &&
592
1.18k
      "Invalid argument, value must be in range [-512,508], first 2 bits "
593
1.18k
      "should be zero");
594
369
    printInt64(O, Value);
595
369
  } else
596
0
    printOperand(MI, OpNum, O);
597
1.18k
}
598
599
static inline void printOffset_128_2_AsmOperand(MCInst *MI, int OpNum,
600
            SStream *O)
601
364
{
602
364
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_128_2_AsmOperand,
603
364
             OpNum);
604
364
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
605
364
    int64_t Value =
606
364
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
607
364
    CS_ASSERT_RET(
608
364
      (Value >= 0 && Value <= 254 && (Value & 0x1) == 0) &&
609
364
      "Invalid argument, value must be in range [0,254], first bit should "
610
364
      "be zero");
611
364
    printInt64(O, Value);
612
364
  } else
613
0
    printOperand(MI, OpNum, O);
614
364
}
615
616
static inline void printOffset_128_1_AsmOperand(MCInst *MI, int OpNum,
617
            SStream *O)
618
901
{
619
901
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_128_1_AsmOperand,
620
901
             OpNum);
621
901
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
622
901
    int64_t Value =
623
901
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
624
901
    CS_ASSERT_RET(
625
901
      (Value >= 0 && Value <= 127) &&
626
901
      "Invalid argument, value must be in range [0,127]");
627
901
    printInt64(O, Value);
628
901
  } else
629
0
    printOperand(MI, OpNum, O);
630
901
}
631
632
static inline void printOffset_64_16_AsmOperand(MCInst *MI, int OpNum,
633
            SStream *O)
634
3.50k
{
635
3.50k
  Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_Offset_64_16_AsmOperand,
636
3.50k
             OpNum);
637
3.50k
  if (MCOperand_isImm(MCInst_getOperand(MI, (OpNum)))) {
638
3.50k
    int64_t Value =
639
3.50k
      MCOperand_getImm(MCInst_getOperand(MI, (OpNum)));
640
3.50k
    CS_ASSERT_RET(
641
3.50k
      (Value >= -512 && Value <= 496 && (Value & 0xf) == 0) &&
642
3.50k
      "Invalid argument, value must be in range [-512,496], first 4 bits "
643
3.50k
      "should be zero");
644
2.44k
    printInt64(O, Value);
645
2.44k
  } else
646
0
    printOperand(MI, OpNum, O);
647
3.50k
}
648
649
#define IMPL_printImmOperand(N, L, H, S) \
650
  static void printImmOperand_##N(MCInst *MI, int OpNum, SStream *O) \
651
58
  { \
652
58
    Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_ImmOperand_##N, \
653
58
               OpNum); \
654
58
    MCOperand *MC = MCInst_getOperand(MI, (OpNum)); \
655
58
    if (MCOperand_isImm(MC)) { \
656
58
      int64_t Value = MCOperand_getImm(MC); \
657
58
      CS_ASSERT_RET((Value >= L && Value <= H && \
658
58
               ((Value % S) == 0)) && \
659
58
              "Invalid argument"); \
660
58
      printInt64(O, Value); \
661
34
    } else { \
662
0
      printOperand(MI, OpNum, O); \
663
0
    } \
664
58
  }
Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_minus16_47_1
Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_minus16_14_2
XtensaInstPrinter.c:printImmOperand_minus32_28_4
Line
Count
Source
651
46
  { \
652
46
    Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_ImmOperand_##N, \
653
46
               OpNum); \
654
46
    MCOperand *MC = MCInst_getOperand(MI, (OpNum)); \
655
46
    if (MCOperand_isImm(MC)) { \
656
46
      int64_t Value = MCOperand_getImm(MC); \
657
46
      CS_ASSERT_RET((Value >= L && Value <= H && \
658
46
               ((Value % S) == 0)) && \
659
46
              "Invalid argument"); \
660
46
      printInt64(O, Value); \
661
34
    } else { \
662
0
      printOperand(MI, OpNum, O); \
663
0
    } \
664
46
  }
XtensaInstPrinter.c:printImmOperand_minus64_56_8
Line
Count
Source
651
12
  { \
652
12
    Xtensa_add_cs_detail_0(MI, Xtensa_OP_GROUP_ImmOperand_##N, \
653
12
               OpNum); \
654
12
    MCOperand *MC = MCInst_getOperand(MI, (OpNum)); \
655
12
    if (MCOperand_isImm(MC)) { \
656
12
      int64_t Value = MCOperand_getImm(MC); \
657
12
      CS_ASSERT_RET((Value >= L && Value <= H && \
658
12
               ((Value % S) == 0)) && \
659
12
              "Invalid argument"); \
660
12
      printInt64(O, Value); \
661
0
    } else { \
662
0
      printOperand(MI, OpNum, O); \
663
0
    } \
664
12
  }
Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_0_56_8
Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_0_3_1
Unexecuted instantiation: XtensaInstPrinter.c:printImmOperand_0_63_1
665
666
IMPL_printImmOperand(minus64_56_8, -64, 56, 8);
667
IMPL_printImmOperand(minus32_28_4, -32, 28, 4);
668
IMPL_printImmOperand(minus16_47_1, -16, 47, 1);
669
IMPL_printImmOperand(minus16_14_2, -16, 14, 2);
670
IMPL_printImmOperand(0_56_8, 0, 56, 8);
671
IMPL_printImmOperand(0_3_1, 0, 3, 1);
672
IMPL_printImmOperand(0_63_1, 0, 63, 1);
673
674
#include "XtensaGenAsmWriter.inc"
675
676
static void printInst(MCInst *MI, uint64_t Address, const char *Annot,
677
          SStream *O)
678
105k
{
679
105k
  unsigned Opcode = MCInst_getOpcode(MI);
680
681
105k
  switch (Opcode) {
682
535
  case Xtensa_WSR: {
683
    // INTERRUPT mnemonic is read-only, so use INTSET mnemonic instead
684
535
    Register SR = MCOperand_getReg(MCInst_getOperand(MI, (0)));
685
535
    if (SR == Xtensa_INTERRUPT) {
686
75
      Register Reg =
687
75
        MCOperand_getReg(MCInst_getOperand(MI, (1)));
688
75
      SStream_concat1(O, '\t');
689
75
      SStream_concat(O, "%s", "wsr");
690
75
      SStream_concat0(O, "\t");
691
692
75
      printRegName(O, Reg);
693
75
      SStream_concat(O, "%s", ", ");
694
75
      SStream_concat0(O, "intset");
695
75
      ;
696
75
      return;
697
75
    }
698
535
  }
699
105k
  }
700
105k
  printInstruction(MI, Address, O);
701
105k
}
702
703
void Xtensa_LLVM_printInstruction(MCInst *MI, uint64_t Address, SStream *O)
704
105k
{
705
105k
  printInst(MI, Address, NULL, O);
706
105k
}
707
708
const char *Xtensa_LLVM_getRegisterName(unsigned RegNo)
709
10.9k
{
710
10.9k
  return getRegisterName(RegNo);
711
10.9k
}