Coverage Report

Created: 2025-12-05 06:11

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