Coverage Report

Created: 2026-07-12 09:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/opcodes/nfp-dis.c
Line
Count
Source
1
/* Print NFP instructions for objdump.
2
   Copyright (C) 2017-2026 Free Software Foundation, Inc.
3
   Contributed by Francois H. Theron <francois.theron@netronome.com>
4
5
   This file is part of the GNU opcodes library.
6
7
   This library is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3, or (at your option)
10
   any later version.
11
12
   It is distributed in the hope that it will be useful, but WITHOUT
13
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15
   License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
/* There will be many magic numbers here that are based on hardware.
23
   Making #define macros for each encoded bit field will probably reduce
24
   readability far more than the simple numbers will, so we make sure that
25
   the context of the magic numbers make it clear what they are used for.  */
26
27
#include "sysdep.h"
28
#include <stdio.h>
29
#include "disassemble.h"
30
#include "libiberty.h"
31
#include "elf/nfp.h"
32
#include "opcode/nfp.h"
33
#include "opintl.h"
34
#include "elf-bfd.h"
35
#include "bfd.h"
36
#include <stdint.h>
37
38
787
#define _NFP_ERR_STOP -1
39
683k
#define _NFP_ERR_CONT -8
40
41
1.25M
#define _BTST(v, b)               (((v) >> b) & 1)
42
6.72M
#define _BF(v, msb, lsb)          (((v) >> (lsb)) & \
43
6.72M
           ((1U << ((msb) - (lsb) + 1)) - 1))
44
428k
#define _BFS(v, msb, lsb, lshift) (_BF(v, msb, lsb) << (lshift))
45
46
0
#define _NFP_ME27_28_CSR_CTX_ENABLES     0x18
47
0
#define _NFP_ME27_28_CSR_MISC_CONTROL    0x160
48
49
493k
#define _NFP_ISLAND_MAX 64
50
246k
#define _NFP_ME_MAX     12
51
52
typedef struct
53
{
54
  unsigned char ctx4_mode:1;
55
  unsigned char addr_3rdparty32:1;
56
  unsigned char scs_cnt:2;
57
  unsigned char _future:4;
58
}
59
nfp_priv_mecfg;
60
61
typedef struct
62
{
63
  unsigned char show_pc;
64
  unsigned char ctx_mode;
65
}
66
nfp_opts;
67
68
/* mecfgs[island][menum][is-text] */
69
typedef struct
70
{
71
  nfp_priv_mecfg mecfgs[_NFP_ISLAND_MAX][_NFP_ME_MAX][2];
72
}
73
nfp_priv_data;
74
75
static const char *nfp_mealu_shf_op[8] =
76
{
77
  /* 0b000 (0) */ "B",
78
  /* 0b001 (1) */ "~B",
79
  /* 0b010 (2) */ "AND",
80
  /* 0b011 (3) */ "~AND",
81
  /* 0b100 (4) */ "AND~",
82
  /* 0b101 (5) */ "OR",
83
  /* 0b110 (6) */ "asr",
84
  /* 0b111 (7) */ "byte_align"
85
};
86
87
static const char *nfp_me27_28_alu_op[32] =
88
{
89
  /* 0b00000 (0) */ "B",
90
  /* 0b00001 (1) */ "+",
91
  NULL,
92
  /* 0b00011 (3) */ "pop_count3",
93
  /* 0b00100 (4) */ "~B",
94
  /* 0b00101 (5) */ "+16",
95
  /* 0b00110 (6) */ "pop_count1",
96
  /* 0b00111 (7) */ "pop_count2",
97
  /* 0b01000 (8) */ "AND",
98
  /* 0b01001 (9) */ "+8",
99
  NULL,
100
  /* 0b01011 (11) */ "cam_clear",
101
  /* 0b01100 (12) */ "~AND",
102
  /* 0b01101 (13) */ "-carry",
103
  /* 0b01110 (14) */ "ffs",
104
  /* 0b01111 (15) */ "cam_read_tag",
105
  /* 0b10000 (16) */ "AND~",
106
  /* 0b10001 (17) */ "+carry",
107
  /* 0b10010 (18) */ "CRC",
108
  /* 0b10011 (19) */ "cam_write",
109
  /* 0b10100 (20) */ "OR",
110
  /* 0b10101 (21) */ "-",
111
  NULL,
112
  /* 0b10111 (23) */ "cam_lookup",
113
  /* 0b11000 (24) */ "XOR",
114
  /* 0b11001 (25) */ "B-A",
115
  NULL,
116
  /* 0b11011 (27) */ "cam_write_state",
117
  NULL,
118
  NULL,
119
  NULL,
120
  /* 0b11111 (31) */ "cam_read_state"
121
};
122
123
static const char *nfp_me27_28_crc_op[8] =
124
{
125
  /* 0b000 (0) */ "--",
126
  NULL,
127
  /* 0b010 (2) */ "crc_ccitt",
128
  NULL,
129
  /* 0b100 (4) */ "crc_32",
130
  /* 0b101 (5) */ "crc_iscsi",
131
  /* 0b110 (6) */ "crc_10",
132
  /* 0b111 (7) */ "crc_5"
133
};
134
135
static const char *nfp_me27_28_crc_bytes[8] =
136
{
137
  /* 0b000 (0) */ "bytes_0_3",
138
  /* 0b001 (1) */ "bytes_1_3",
139
  /* 0b010 (2) */ "bytes_2_3",
140
  /* 0b011 (3) */ "byte_3",
141
  /* 0b100 (4) */ "bytes_0_2",
142
  /* 0b101 (5) */ "bytes_0_1",
143
  /* 0b110 (6) */ "byte_0"
144
};
145
146
static const char *nfp_me27_28_mecsrs[] =
147
{
148
  /* 0x000 (0) */ "UstorAddr",
149
  /* 0x004 (1) */ "UstorDataLwr",
150
  /* 0x008 (2) */ "UstorDataUpr",
151
  /* 0x00c (3) */ "UstorErrStat",
152
  /* 0x010 (4) */ "ALUOut",
153
  /* 0x014 (5) */ "CtxArbCtrl",
154
  /* 0x018 (6) */ "CtxEnables",
155
  /* 0x01c (7) */ "CondCodeEn",
156
  /* 0x020 (8) */ "CSRCtxPtr",
157
  /* 0x024 (9) */ "PcBreakpoint0",
158
  /* 0x028 (10) */ "PcBreakpoint1",
159
  /* 0x02c (11) */ "PcBreakpointStatus",
160
  /* 0x030 (12) */ "RegErrStatus",
161
  /* 0x034 (13) */ "LMErrStatus",
162
  /* 0x038 (14) */ "LMeccErrorMask",
163
  NULL,
164
  /* 0x040 (16) */ "IndCtxStatus",
165
  /* 0x044 (17) */ "ActCtxStatus",
166
  /* 0x048 (18) */ "IndCtxSglEvt",
167
  /* 0x04c (19) */ "ActCtxSglEvt",
168
  /* 0x050 (20) */ "IndCtxWkpEvt",
169
  /* 0x054 (21) */ "ActCtxWkpEvt",
170
  /* 0x058 (22) */ "IndCtxFtrCnt",
171
  /* 0x05c (23) */ "ActCtxFtrCnt",
172
  /* 0x060 (24) */ "IndLMAddr0",
173
  /* 0x064 (25) */ "ActLMAddr0",
174
  /* 0x068 (26) */ "IndLMAddr1",
175
  /* 0x06c (27) */ "ActLMAddr1",
176
  /* 0x070 (28) */ "ByteIndex",
177
  /* 0x074 (29) */ "XferIndex",
178
  /* 0x078 (30) */ "IndFtrCntSgl",
179
  /* 0x07c (31) */ "ActFtrCntSgl",
180
  /* 0x080 (32) */ "NNPut",
181
  /* 0x084 (33) */ "NNGet",
182
  NULL,
183
  NULL,
184
  /* 0x090 (36) */ "IndLMAddr2",
185
  /* 0x094 (37) */ "ActLMAddr2",
186
  /* 0x098 (38) */ "IndLMAddr3",
187
  /* 0x09c (39) */ "ActLMAddr3",
188
  /* 0x0a0 (40) */ "IndLMAddr2BytIdx",
189
  /* 0x0a4 (41) */ "ActLMAddr2BytIdx",
190
  /* 0x0a8 (42) */ "IndLMAddr3BytIdx",
191
  /* 0x0ac (43) */ "ActLMAddr3BytIdx",
192
  /* 0x0b0 (44) */ "IndPredCC",
193
  NULL,
194
  NULL,
195
  NULL,
196
  /* 0x0c0 (48) */ "TimestampLow",
197
  /* 0x0c4 (49) */ "TimestampHgh",
198
  NULL,
199
  NULL,
200
  NULL,
201
  NULL,
202
  NULL,
203
  NULL,
204
  /* 0x0e0 (56) */ "IndLMAddr0BytIdx",
205
  /* 0x0e4 (57) */ "ActLMAddr0BytIdx",
206
  /* 0x0e8 (58) */ "IndLMAddr1BytIdx",
207
  /* 0x0ec (59) */ "ActLMAddr1BytIdx",
208
  NULL,
209
  /* 0x0f4 (61) */ "XfrAndBytIdx",
210
  NULL,
211
  NULL,
212
  /* 0x100 (64) */ "NxtNghbrSgl",
213
  /* 0x104 (65) */ "PrvNghbrSgl",
214
  /* 0x108 (66) */ "SameMESignal",
215
  NULL,
216
  NULL,
217
  NULL,
218
  NULL,
219
  NULL,
220
  NULL,
221
  NULL,
222
  NULL,
223
  NULL,
224
  NULL,
225
  NULL,
226
  NULL,
227
  NULL,
228
  /* 0x140 (80) */ "CRCRemainder",
229
  /* 0x144 (81) */ "ProfileCnt",
230
  /* 0x148 (82) */ "PseudoRndNum",
231
  NULL,
232
  NULL,
233
  NULL,
234
  NULL,
235
  NULL,
236
  /* 0x160 (88) */ "MiscControl",
237
  /* 0x164 (89) */ "PcBreakpoint0Mask",
238
  /* 0x168 (90) */ "PcBreakpoint1Mask",
239
  NULL,
240
  /* 0x170 (92) */ "Mailbox0",
241
  /* 0x174 (93) */ "Mailbox1",
242
  /* 0x178 (94) */ "Mailbox2",
243
  /* 0x17c (95) */ "Mailbox3",
244
  NULL,
245
  NULL,
246
  NULL,
247
  NULL,
248
  /* 0x190 (100) */ "CmdIndirectRef0"
249
};
250
251
const char *nfp_me27_28_br_ops[32] =
252
{
253
  /* 0b00000 (0) */ "beq",
254
  /* 0b00001 (1) */ "bne",
255
  /* 0b00010 (2) */ "bmi",
256
  /* 0b00011 (3) */ "bpl",
257
  /* 0b00100 (4) */ "bcs",
258
  /* 0b00101 (5) */ "bcc",
259
  /* 0b00110 (6) */ "bvs",
260
  /* 0b00111 (7) */ "bvc",
261
  /* 0b01000 (8) */ "bge",
262
  /* 0b01001 (9) */ "blt",
263
  /* 0b01010 (10) */ "ble",
264
  /* 0b01011 (11) */ "bgt",
265
  /* (12) */ NULL,
266
  /* (13) */ NULL,
267
  /* (14) */ NULL,
268
  /* (15) */ NULL,
269
  /* 0b10000 (16) */ "br=ctx",
270
  /* 0b10001 (17) */ "br!=ctx",
271
  /* 0b10010 (18) */ "br_signal",
272
  /* 0b10011 (19) */ "br_!signal",
273
  /* 0b10100 (20) */ "br_inp_state",
274
  /* 0b10101 (21) */ "br_!inp_state",
275
  /* 0b10110 (22) */ "br_cls_state",
276
  /* 0b10111 (23) */ "br_!cls_state",
277
  /* 0b11000 (24) */ "br",
278
  /* (25) */ NULL,
279
  /* (26) */ NULL,
280
  /* (27) */ NULL,
281
  /* (28) */ NULL,
282
  /* (29) */ NULL,
283
  /* (30) */ NULL,
284
  /* (31) */ NULL
285
};
286
287
static const char *nfp_me27_br_inpstates[16] =
288
{
289
  /* 0 */ "nn_empty",
290
  /* 1 */ "nn_full",
291
  /* 2 */ "scr_ring0_status",
292
  /* 3 */ "scr_ring1_status",
293
  /* 4 */ "scr_ring2_status",
294
  /* 5 */ "scr_ring3_status",
295
  /* 6 */ "scr_ring4_status",
296
  /* 7 */ "scr_ring5_status",
297
  /* 8 */ "scr_ring6_status",
298
  /* 9 */ "scr_ring7_status",
299
  /* 10 */ "scr_ring8_status",
300
  /* 11 */ "scr_ring9_status",
301
  /* 12 */ "scr_ring10_status",
302
  /* 13 */ "scr_ring11_status",
303
  /* 14 */ "fci_not_empty",
304
  /* 15 */ "fci_full"
305
};
306
307
static const char *nfp_me28_br_inpstates[16] =
308
{
309
  /* 0 */ "nn_empty",
310
  /* 1 */ "nn_full",
311
  /* 2 */ "ctm_ring0_status",
312
  /* 3 */ "ctm_ring1_status",
313
  /* 4 */ "ctm_ring2_status",
314
  /* 5 */ "ctm_ring3_status",
315
  /* 6 */ "ctm_ring4_status",
316
  /* 7 */ "ctm_ring5_status",
317
  /* 8 */ "ctm_ring6_status",
318
  /* 9 */ "ctm_ring7_status",
319
  /* 10 */ "ctm_ring8_status",
320
  /* 11 */ "ctm_ring9_status",
321
  /* 12 */ "ctm_ring10_status",
322
  /* 13 */ "ctm_ring11_status",
323
  /* 14 */ "ctm_ring12_status",
324
  /* 15 */ "ctm_ring13_status"
325
};
326
327
static const char *nfp_me27_28_mult_steps[8] =
328
{
329
  /* 0 */ "step1",
330
  /* 1 */ "step2",
331
  /* 2 */ "step3",
332
  /* 3 */ "step4",
333
  /* 4 */ "last",
334
  /* 5 */ "last2",
335
  NULL,
336
  NULL
337
};
338
339
static const char *nfp_me27_28_mult_types[4] =
340
{
341
  "start",
342
  "24x8",
343
  "16x16",
344
  "32x32"
345
};
346
347
/* The cmd_mnemonics arrays are sorted here in its definition so that we can
348
   use bsearch () on the first three fields.  There can be multiple matches
349
   and we assume that bsearch can return any of them, so we manually step
350
   back to the first one.  */
351
352
static const nfp_cmd_mnemonic nfp_me27_mnemonics[] =
353
{
354
  {NFP_3200_CPPTGT_MSF0, 0, 0, 0, 0, "read"},
355
  {NFP_3200_CPPTGT_MSF0, 0, 2, 0, 0, "read64"},
356
  {NFP_3200_CPPTGT_MSF0, 1, 0, 0, 0, "write"},
357
  {NFP_3200_CPPTGT_MSF0, 1, 1, 0, 0, "fast_wr"},
358
  {NFP_3200_CPPTGT_MSF0, 1, 2, 0, 0, "write64"},
359
  {NFP_3200_CPPTGT_QDR, 0, 0, 0, 0, "read"},
360
  {NFP_3200_CPPTGT_QDR, 1, 0, 0, 0, "write"},
361
  {NFP_3200_CPPTGT_QDR, 2, 0, 0, 0, "write_atomic"},
362
  {NFP_3200_CPPTGT_QDR, 2, 1, 0, 0, "swap"},
363
  {NFP_3200_CPPTGT_QDR, 3, 0, 0, 0, "set"},
364
  {NFP_3200_CPPTGT_QDR, 3, 1, 0, 0, "test_and_set"},
365
  {NFP_3200_CPPTGT_QDR, 4, 0, 0, 0, "clr"},
366
  {NFP_3200_CPPTGT_QDR, 4, 1, 0, 0, "test_and_clr"},
367
  {NFP_3200_CPPTGT_QDR, 5, 0, 0, 0, "add"},
368
  {NFP_3200_CPPTGT_QDR, 5, 1, 0, 0, "test_and_add"},
369
  {NFP_3200_CPPTGT_QDR, 6, 0, 0, 0, "read_queue"},
370
  {NFP_3200_CPPTGT_QDR, 6, 1, 0, 0, "read_queue_ring"},
371
  {NFP_3200_CPPTGT_QDR, 6, 2, 0, 0, "write_queue"},
372
  {NFP_3200_CPPTGT_QDR, 6, 3, 0, 0, "write_queue_ring"},
373
  {NFP_3200_CPPTGT_QDR, 7, 0, 0, 0, "incr"},
374
  {NFP_3200_CPPTGT_QDR, 7, 1, 0, 0, "test_and_incr"},
375
  {NFP_3200_CPPTGT_QDR, 8, 0, 0, 0, "decr"},
376
  {NFP_3200_CPPTGT_QDR, 8, 1, 0, 0, "test_and_decr"},
377
  {NFP_3200_CPPTGT_QDR, 9, 0, 0, 0, "put"},
378
  {NFP_3200_CPPTGT_QDR, 9, 1, 0, 0, "get"},
379
  {NFP_3200_CPPTGT_QDR, 9, 2, 0, 0, "put_imm"},
380
  {NFP_3200_CPPTGT_QDR, 9, 3, 0, 0, "pop"},
381
  {NFP_3200_CPPTGT_QDR, 10, 0, 0, 0, "journal"},
382
  {NFP_3200_CPPTGT_QDR, 10, 1, 0, 0, "fast_journal"},
383
  {NFP_3200_CPPTGT_QDR, 11, 0, 0, 0, "dequeue"},
384
  {NFP_3200_CPPTGT_QDR, 12, 0, 0, 0, "enqueue"},
385
  {NFP_3200_CPPTGT_QDR, 12, 1, 0, 0, "enueue_tail"},
386
  {NFP_3200_CPPTGT_QDR, 12, 2, 0, 0, "nfp_enqueue"},
387
  {NFP_3200_CPPTGT_QDR, 12, 3, 0, 0, "nfp_enueue_tail"},
388
  {NFP_3200_CPPTGT_QDR, 13, 0, 0, 0, "csr_wr"},
389
  {NFP_3200_CPPTGT_QDR, 13, 1, 0, 0, "csr_rd"},
390
  {NFP_3200_CPPTGT_QDR, 14, 0, 0, 0, "wr_qdesc"},
391
  {NFP_3200_CPPTGT_QDR, 14, 1, 0, 0, "nfp_wr_qdesc"},
392
  {NFP_3200_CPPTGT_QDR, 14, 2, 0, 0, "wr_qdesc_count"},
393
  {NFP_3200_CPPTGT_QDR, 14, 3, 0, 0, "push_qdesc"},
394
  {NFP_3200_CPPTGT_QDR, 15, 0, 0, 0, "rd_qdesc_other"},
395
  {NFP_3200_CPPTGT_QDR, 15, 1, 0, 0, "rd_qdesc_tail"},
396
  {NFP_3200_CPPTGT_QDR, 15, 2, 0, 0, "rd_qdesc_head"},
397
  {NFP_3200_CPPTGT_QDR, 15, 3, 0, 0, "nfp_rd_qdesc"},
398
  {NFP_3200_CPPTGT_MSF1, 0, 0, 0, 0, "read"},
399
  {NFP_3200_CPPTGT_MSF1, 0, 2, 0, 0, "read64"},
400
  {NFP_3200_CPPTGT_MSF1, 1, 0, 0, 0, "write"},
401
  {NFP_3200_CPPTGT_MSF1, 1, 1, 0, 0, "fast_wr"},
402
  {NFP_3200_CPPTGT_MSF1, 1, 2, 0, 0, "write64"},
403
  {NFP_3200_CPPTGT_HASH, 0, 0, 0, 0, "hash_48"},
404
  {NFP_3200_CPPTGT_HASH, 0, 1, 0, 0, "hash_64"},
405
  {NFP_3200_CPPTGT_HASH, 0, 2, 0, 0, "hash_128"},
406
  {NFP_3200_CPPTGT_MU, 0, 0, 0, 0, "read"},
407
  {NFP_3200_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
408
  {NFP_3200_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
409
  {NFP_3200_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
410
  {NFP_3200_CPPTGT_MU, 1, 0, 0, 0, "write"},
411
  {NFP_3200_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
412
  {NFP_3200_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
413
  {NFP_3200_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
414
  {NFP_3200_CPPTGT_MU, 2, 0, 0, 0, "write8"},
415
  {NFP_3200_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
416
  {NFP_3200_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
417
  {NFP_3200_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
418
  {NFP_3200_CPPTGT_MU, 3, 0, 0, 0, "read_atomic"},
419
  {NFP_3200_CPPTGT_MU, 3, 1, 0, 0, "read8"},
420
  {NFP_3200_CPPTGT_MU, 3, 2, 0, 0, "compare_write"},
421
  {NFP_3200_CPPTGT_MU, 3, 3, 0, 0, "test_and_compare_write"},
422
  {NFP_3200_CPPTGT_MU, 4, 0, 0, 0, "write_atomic"},
423
  {NFP_3200_CPPTGT_MU, 4, 1, 0, 0, "swap"},
424
  {NFP_3200_CPPTGT_MU, 4, 2, 0, 0, "write_atomic_imm"},
425
  {NFP_3200_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
426
  {NFP_3200_CPPTGT_MU, 5, 0, 0, 0, "set"},
427
  {NFP_3200_CPPTGT_MU, 5, 1, 0, 0, "test_and_set"},
428
  {NFP_3200_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
429
  {NFP_3200_CPPTGT_MU, 5, 3, 0, 0, "test_and_set_imm"},
430
  {NFP_3200_CPPTGT_MU, 6, 0, 0, 0, "clr"},
431
  {NFP_3200_CPPTGT_MU, 6, 1, 0, 0, "test_and_clr"},
432
  {NFP_3200_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
433
  {NFP_3200_CPPTGT_MU, 6, 3, 0, 0, "test_and_clr_imm"},
434
  {NFP_3200_CPPTGT_MU, 7, 0, 0, 4, "add"},
435
  {NFP_3200_CPPTGT_MU, 7, 0, 4, 4, "add64"},
436
  {NFP_3200_CPPTGT_MU, 7, 1, 0, 4, "test_and_add"},
437
  {NFP_3200_CPPTGT_MU, 7, 1, 4, 4, "test_and_add64"},
438
  {NFP_3200_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
439
  {NFP_3200_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
440
  {NFP_3200_CPPTGT_MU, 7, 3, 0, 4, "test_and_add_imm"},
441
  {NFP_3200_CPPTGT_MU, 7, 3, 4, 4, "test_and_add64_imm"},
442
  {NFP_3200_CPPTGT_MU, 8, 0, 0, 4, "add_sat"},
443
  {NFP_3200_CPPTGT_MU, 8, 0, 4, 4, "add64_sat"},
444
  {NFP_3200_CPPTGT_MU, 8, 1, 0, 4, "test_and_add_sat"},
445
  {NFP_3200_CPPTGT_MU, 8, 1, 4, 4, "test_and_add64_sat"},
446
  {NFP_3200_CPPTGT_MU, 8, 2, 0, 4, "add_imm_sat"},
447
  {NFP_3200_CPPTGT_MU, 8, 2, 4, 4, "add_imm_sat"},
448
  {NFP_3200_CPPTGT_MU, 8, 3, 0, 0, "test_and_add_sat_imm"},
449
  {NFP_3200_CPPTGT_MU, 9, 0, 0, 4, "sub"},
450
  {NFP_3200_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
451
  {NFP_3200_CPPTGT_MU, 9, 1, 0, 4, "test_and_sub"},
452
  {NFP_3200_CPPTGT_MU, 9, 1, 4, 4, "test_and_sub64"},
453
  {NFP_3200_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
454
  {NFP_3200_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
455
  {NFP_3200_CPPTGT_MU, 9, 3, 0, 0, "tes_and_sub_imm"},
456
  {NFP_3200_CPPTGT_MU, 10, 0, 0, 4, "sub_sat"},
457
  {NFP_3200_CPPTGT_MU, 10, 0, 4, 4, "sub64_sat"},
458
  {NFP_3200_CPPTGT_MU, 10, 1, 0, 4, "test_and_sub_sat"},
459
  {NFP_3200_CPPTGT_MU, 10, 1, 4, 4, "test_and_sub64_sat"},
460
  {NFP_3200_CPPTGT_MU, 10, 2, 0, 4, "sub_imm_sat"},
461
  {NFP_3200_CPPTGT_MU, 10, 2, 4, 4, "sub64_imm_sat"},
462
  {NFP_3200_CPPTGT_MU, 10, 3, 0, 0, "test_and_sub_sat_imm"},
463
  {NFP_3200_CPPTGT_MU, 11, 0, 0, 0, "release_ticket"},
464
  {NFP_3200_CPPTGT_MU, 11, 1, 0, 0, "release_ticket_ind"},
465
  {NFP_3200_CPPTGT_MU, 12, 0, 0, 0, "cam_lookup"},
466
  {NFP_3200_CPPTGT_MU, 12, 1, 0, 0, "cam_lookup_add"},
467
  {NFP_3200_CPPTGT_MU, 12, 2, 0, 0, "tcam_lookup"},
468
  {NFP_3200_CPPTGT_MU, 12, 3, 0, 3, "lock"},
469
  {NFP_3200_CPPTGT_MU, 12, 3, 2, 3, "cam_lookup_add_inc"},
470
  {NFP_3200_CPPTGT_MU, 13, 0, 0, 4, "microq128_get"},
471
  {NFP_3200_CPPTGT_MU, 13, 0, 4, 4, "microq256_get"},
472
  {NFP_3200_CPPTGT_MU, 13, 1, 0, 4, "microq128_pop"},
473
  {NFP_3200_CPPTGT_MU, 13, 1, 4, 4, "microq256_pop"},
474
  {NFP_3200_CPPTGT_MU, 13, 2, 0, 4, "microq128_put"},
475
  {NFP_3200_CPPTGT_MU, 13, 2, 4, 4, "microq256_put"},
476
  {NFP_3200_CPPTGT_MU, 14, 0, 0, 4, "queue128_lock"},
477
  {NFP_3200_CPPTGT_MU, 14, 0, 4, 4, "queue256_lock"},
478
  {NFP_3200_CPPTGT_MU, 14, 1, 0, 4, "queue128_unlock"},
479
  {NFP_3200_CPPTGT_MU, 14, 1, 4, 4, "queue256_unlock"},
480
  {NFP_3200_CPPTGT_MU, 15, 0, 0, 0, "xor"},
481
  {NFP_3200_CPPTGT_MU, 15, 1, 0, 0, "test_and_xor"},
482
  {NFP_3200_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
483
  {NFP_3200_CPPTGT_MU, 15, 3, 0, 0, "test_and_xor_imm"},
484
  {NFP_3200_CPPTGT_MU, 16, 0, 0, 0, "rd_qdesc"},
485
  {NFP_3200_CPPTGT_MU, 16, 1, 0, 0, "wr_qdesc"},
486
  {NFP_3200_CPPTGT_MU, 16, 2, 0, 0, "push_qdesc"},
487
  {NFP_3200_CPPTGT_MU, 16, 3, 0, 0, "tag_writeback"},
488
  {NFP_3200_CPPTGT_MU, 17, 0, 0, 0, "enqueue"},
489
  {NFP_3200_CPPTGT_MU, 17, 1, 0, 0, "enqueue_tail"},
490
  {NFP_3200_CPPTGT_MU, 17, 2, 0, 0, "dequeue"},
491
  {NFP_3200_CPPTGT_MU, 18, 0, 0, 0, "read_queue"},
492
  {NFP_3200_CPPTGT_MU, 18, 1, 0, 0, "read_queue_ring"},
493
  {NFP_3200_CPPTGT_MU, 18, 2, 0, 0, "write_queue"},
494
  {NFP_3200_CPPTGT_MU, 18, 3, 0, 0, "write_queue_ring"},
495
  {NFP_3200_CPPTGT_MU, 19, 0, 0, 0, "add_tail"},
496
  {NFP_3200_CPPTGT_MU, 19, 1, 0, 0, "qadd_thread"},
497
  {NFP_3200_CPPTGT_MU, 19, 2, 0, 0, "qadd_work"},
498
  {NFP_3200_CPPTGT_MU, 19, 3, 0, 0, "qadd_work_imm"},
499
  {NFP_3200_CPPTGT_MU, 20, 0, 0, 0, "put"},
500
  {NFP_3200_CPPTGT_MU, 20, 1, 0, 0, "put_tag"},
501
  {NFP_3200_CPPTGT_MU, 20, 2, 0, 0, "journal"},
502
  {NFP_3200_CPPTGT_MU, 20, 3, 0, 0, "journal_tag"},
503
  {NFP_3200_CPPTGT_MU, 21, 0, 0, 0, "get"},
504
  {NFP_3200_CPPTGT_MU, 21, 1, 0, 0, "get_eop"},
505
  {NFP_3200_CPPTGT_MU, 21, 2, 0, 0, "get_safe"},
506
  {NFP_3200_CPPTGT_MU, 21, 3, 0, 0, "get_tag_safe"},
507
  {NFP_3200_CPPTGT_MU, 22, 0, 0, 0, "pop"},
508
  {NFP_3200_CPPTGT_MU, 22, 1, 0, 0, "pop_eop"},
509
  {NFP_3200_CPPTGT_MU, 22, 2, 0, 0, "pop_safe"},
510
  {NFP_3200_CPPTGT_MU, 22, 3, 0, 0, "pop_tag_safe"},
511
  {NFP_3200_CPPTGT_MU, 23, 0, 0, 0, "fast_journal"},
512
  {NFP_3200_CPPTGT_MU, 23, 1, 0, 0, "fast_journal_sig"},
513
  {NFP_3200_CPPTGT_GS, 0, 0, 0, 0, "read"},
514
  {NFP_3200_CPPTGT_GS, 1, 0, 0, 0, "write"},
515
  {NFP_3200_CPPTGT_GS, 2, 0, 0, 0, "write_atomic"},
516
  {NFP_3200_CPPTGT_GS, 2, 1, 0, 0, "swap"},
517
  {NFP_3200_CPPTGT_GS, 3, 0, 0, 0, "set"},
518
  {NFP_3200_CPPTGT_GS, 3, 1, 0, 0, "test_and_set"},
519
  {NFP_3200_CPPTGT_GS, 4, 0, 0, 0, "clr"},
520
  {NFP_3200_CPPTGT_GS, 4, 1, 0, 0, "test_and_clr"},
521
  {NFP_3200_CPPTGT_GS, 5, 0, 0, 0, "add"},
522
  {NFP_3200_CPPTGT_GS, 5, 1, 0, 0, "test_and_add"},
523
  {NFP_3200_CPPTGT_GS, 6, 0, 0, 0, "sub"},
524
  {NFP_3200_CPPTGT_GS, 6, 1, 0, 0, "test_and_sub"},
525
  {NFP_3200_CPPTGT_GS, 7, 0, 0, 0, "inc"},
526
  {NFP_3200_CPPTGT_GS, 7, 1, 0, 0, "test_and_inc"},
527
  {NFP_3200_CPPTGT_GS, 8, 0, 0, 0, "dec"},
528
  {NFP_3200_CPPTGT_GS, 8, 1, 0, 0, "test_and_dec"},
529
  {NFP_3200_CPPTGT_GS, 9, 0, 0, 0, "get"},
530
  {NFP_3200_CPPTGT_GS, 10, 0, 0, 0, "put"},
531
  {NFP_3200_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
532
  {NFP_3200_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
533
  {NFP_3200_CPPTGT_PCIE, 2, 0, 0, 0, "read_internal"},
534
  {NFP_3200_CPPTGT_PCIE, 3, 0, 0, 0, "write_internal"},
535
  {NFP_3200_CPPTGT_ARM, 0, 0, 0, 0, "read"},
536
  {NFP_3200_CPPTGT_ARM, 1, 0, 0, 0, "write"},
537
  {NFP_3200_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
538
  {NFP_3200_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
539
  {NFP_3200_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
540
  {NFP_3200_CPPTGT_CAP, 0, 0, 0, 0, "read_enum"},
541
  {NFP_3200_CPPTGT_CAP, 0, 1, 0, 0, "read"},
542
  {NFP_3200_CPPTGT_CAP, 0, 2, 0, 0, "read_reflect"},
543
  {NFP_3200_CPPTGT_CAP, 1, 0, 0, 0, "write_enum"},
544
  {NFP_3200_CPPTGT_CAP, 1, 1, 0, 0, "write"},
545
  {NFP_3200_CPPTGT_CAP, 1, 2, 0, 0, "write_reflect"},
546
  {NFP_3200_CPPTGT_CAP, 2, 0, 0, 0, "fast_wr_alu"},
547
  {NFP_3200_CPPTGT_CAP, 3, 0, 0, 0, "fast_wr"},
548
  {NFP_3200_CPPTGT_CT, 1, 0, 0, 0, "write"},
549
  {NFP_3200_CPPTGT_CLS, 0, 0, 0, 0, "read_be"},
550
  {NFP_3200_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
551
  {NFP_3200_CPPTGT_CLS, 0, 2, 0, 0, "test_and_compare_write"},
552
  {NFP_3200_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
553
  {NFP_3200_CPPTGT_CLS, 1, 0, 0, 0, "write_be"},
554
  {NFP_3200_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
555
  {NFP_3200_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
556
  {NFP_3200_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
557
  {NFP_3200_CPPTGT_CLS, 2, 0, 0, 0, "set"},
558
  {NFP_3200_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
559
  {NFP_3200_CPPTGT_CLS, 2, 2, 0, 0, "test_and_set"},
560
  {NFP_3200_CPPTGT_CLS, 2, 3, 0, 0, "test_and_clr"},
561
  {NFP_3200_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
562
  {NFP_3200_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
563
  {NFP_3200_CPPTGT_CLS, 3, 2, 0, 0, "test_and_set_imm"},
564
  {NFP_3200_CPPTGT_CLS, 3, 3, 0, 0, "test_and_clr_imm"},
565
  {NFP_3200_CPPTGT_CLS, 4, 0, 0, 0, "add"},
566
  {NFP_3200_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
567
  {NFP_3200_CPPTGT_CLS, 4, 2, 0, 0, "add_sat"},
568
  {NFP_3200_CPPTGT_CLS, 4, 3, 0, 0, "test_and_add_sat"},
569
  {NFP_3200_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
570
  {NFP_3200_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
571
  {NFP_3200_CPPTGT_CLS, 5, 2, 0, 0, "add_imm_sat"},
572
  {NFP_3200_CPPTGT_CLS, 5, 3, 0, 0, "test_and_add_imm_sat"},
573
  {NFP_3200_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
574
  {NFP_3200_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
575
  {NFP_3200_CPPTGT_CLS, 6, 2, 0, 0, "sub_sat"},
576
  {NFP_3200_CPPTGT_CLS, 6, 3, 0, 0, "test_and_sub_sat"},
577
  {NFP_3200_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
578
  {NFP_3200_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
579
  {NFP_3200_CPPTGT_CLS, 7, 2, 0, 0, "sub_imm_sat"},
580
  {NFP_3200_CPPTGT_CLS, 7, 3, 0, 0, "test_and_sub_imm_sat"},
581
  {NFP_3200_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
582
  {NFP_3200_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
583
  {NFP_3200_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
584
  {NFP_3200_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
585
  {NFP_3200_CPPTGT_CLS, 9, 0, 0, 0, "get"},
586
  {NFP_3200_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
587
  {NFP_3200_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
588
  {NFP_3200_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
589
  {NFP_3200_CPPTGT_CLS, 10, 0, 0, 0, "put"},
590
  {NFP_3200_CPPTGT_CLS, 10, 1, 0, 0, "put_offset"},
591
  {NFP_3200_CPPTGT_CLS, 10, 2, 0, 0, "journal"},
592
  {NFP_3200_CPPTGT_CLS, 10, 3, 0, 0, "add_tail"},
593
  {NFP_3200_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
594
  {NFP_3200_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
595
  {NFP_3200_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
596
  {NFP_3200_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
597
  {NFP_3200_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
598
  {NFP_3200_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
599
  {NFP_3200_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
600
  {NFP_3200_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
601
  {NFP_3200_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
602
  {NFP_3200_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
603
  {NFP_3200_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
604
  {NFP_3200_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
605
  {NFP_3200_CPPTGT_CLS, 14, 0, 0, 0, "reflect_from_sig_src"},
606
  {NFP_3200_CPPTGT_CLS, 14, 1, 0, 0, "reflect_from_sig_dst"},
607
  {NFP_3200_CPPTGT_CLS, 14, 2, 0, 0, "reflect_from_sig_both"},
608
  {NFP_3200_CPPTGT_CLS, 15, 0, 0, 0, "reflect_to_sig_src"},
609
  {NFP_3200_CPPTGT_CLS, 15, 1, 0, 0, "reflect_to_sig_dst"},
610
  {NFP_3200_CPPTGT_CLS, 15, 2, 0, 0, "reflect_to_sig_both"}
611
};
612
613
static const nfp_cmd_mnemonic nfp_me28_mnemonics[] =
614
{
615
  {NFP_6000_CPPTGT_NBI, 0, 0, 0, 0, "read"},
616
  {NFP_6000_CPPTGT_NBI, 1, 0, 0, 0, "write"},
617
  {NFP_6000_CPPTGT_NBI, 3, 0, 0, 0, "packet_ready_drop"},
618
  {NFP_6000_CPPTGT_NBI, 3, 1, 0, 0, "packet_ready_unicast"},
619
  {NFP_6000_CPPTGT_NBI, 3, 2, 0, 0, "packet_ready_multicast_dont_free"},
620
  {NFP_6000_CPPTGT_NBI, 3, 3, 0, 0, "packet_ready_multicast_free_on_last"},
621
  {NFP_6000_CPPTGT_ILA, 0, 0, 0, 0, "read"},
622
  {NFP_6000_CPPTGT_ILA, 0, 1, 0, 0, "read_check_error"},
623
  {NFP_6000_CPPTGT_ILA, 1, 0, 0, 0, "write"},
624
  {NFP_6000_CPPTGT_ILA, 1, 1, 0, 0, "write_check_error"},
625
  {NFP_6000_CPPTGT_ILA, 2, 0, 0, 0, "read_int"},
626
  {NFP_6000_CPPTGT_ILA, 3, 0, 0, 7, "write_int"},
627
  {NFP_6000_CPPTGT_ILA, 3, 0, 3, 7, "write_dma"},
628
  {NFP_6000_CPPTGT_MU, 0, 0, 0, 0, "read"},
629
  {NFP_6000_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
630
  {NFP_6000_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
631
  {NFP_6000_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
632
  {NFP_6000_CPPTGT_MU, 1, 0, 0, 0, "write"},
633
  {NFP_6000_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
634
  {NFP_6000_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
635
  {NFP_6000_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
636
  {NFP_6000_CPPTGT_MU, 2, 0, 0, 0, "write8"},
637
  {NFP_6000_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
638
  {NFP_6000_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
639
  {NFP_6000_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
640
  {NFP_6000_CPPTGT_MU, 3, 0, 0, 0, "atomic_read"},
641
  {NFP_6000_CPPTGT_MU, 3, 1, 0, 0, "read8"},
642
  {NFP_6000_CPPTGT_MU, 3, 2, 0, 0,
643
   "compare_write_or_incr/mask_compare_write"},
644
  {NFP_6000_CPPTGT_MU, 3, 3, 0, 0,
645
   "test_compare_write_or_incr/test_mask_compare_write"},
646
  {NFP_6000_CPPTGT_MU, 4, 0, 0, 0, "atomic_write"},
647
  {NFP_6000_CPPTGT_MU, 4, 1, 0, 0, "swap"},
648
  {NFP_6000_CPPTGT_MU, 4, 2, 0, 0, "atomic_write_imm"},
649
  {NFP_6000_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
650
  {NFP_6000_CPPTGT_MU, 5, 0, 0, 0, "set"},
651
  {NFP_6000_CPPTGT_MU, 5, 1, 0, 0, "test_set"},
652
  {NFP_6000_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
653
  {NFP_6000_CPPTGT_MU, 5, 3, 0, 0, "test_set_imm"},
654
  {NFP_6000_CPPTGT_MU, 6, 0, 0, 0, "clr"},
655
  {NFP_6000_CPPTGT_MU, 6, 1, 0, 0, "test_clr"},
656
  {NFP_6000_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
657
  {NFP_6000_CPPTGT_MU, 6, 3, 0, 0, "test_clr_imm"},
658
  {NFP_6000_CPPTGT_MU, 7, 0, 0, 4, "add"},
659
  {NFP_6000_CPPTGT_MU, 7, 0, 4, 4, "add64"},
660
  {NFP_6000_CPPTGT_MU, 7, 1, 0, 4, "test_add"},
661
  {NFP_6000_CPPTGT_MU, 7, 1, 4, 4, "test_add64"},
662
  {NFP_6000_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
663
  {NFP_6000_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
664
  {NFP_6000_CPPTGT_MU, 7, 3, 0, 4, "test_add_imm"},
665
  {NFP_6000_CPPTGT_MU, 7, 3, 4, 4, "test_add64_imm"},
666
  {NFP_6000_CPPTGT_MU, 8, 0, 0, 4, "addsat"},
667
  {NFP_6000_CPPTGT_MU, 8, 0, 4, 4, "addsat64"},
668
  {NFP_6000_CPPTGT_MU, 8, 1, 0, 4, "test_addsat"},
669
  {NFP_6000_CPPTGT_MU, 8, 1, 4, 4, "test_addsat64"},
670
  {NFP_6000_CPPTGT_MU, 8, 2, 0, 4, "addsat_imm"},
671
  {NFP_6000_CPPTGT_MU, 8, 2, 4, 4, "addsat64_imm"},
672
  {NFP_6000_CPPTGT_MU, 8, 3, 0, 4, "test_addsat_imm"},
673
  {NFP_6000_CPPTGT_MU, 8, 3, 4, 4, "test_addsat64_imm"},
674
  {NFP_6000_CPPTGT_MU, 9, 0, 0, 4, "sub"},
675
  {NFP_6000_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
676
  {NFP_6000_CPPTGT_MU, 9, 1, 0, 4, "test_sub"},
677
  {NFP_6000_CPPTGT_MU, 9, 1, 4, 4, "test_sub64"},
678
  {NFP_6000_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
679
  {NFP_6000_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
680
  {NFP_6000_CPPTGT_MU, 9, 3, 0, 4, "test_sub_imm"},
681
  {NFP_6000_CPPTGT_MU, 9, 3, 4, 4, "test_sub64_imm"},
682
  {NFP_6000_CPPTGT_MU, 10, 0, 0, 4, "subsat"},
683
  {NFP_6000_CPPTGT_MU, 10, 0, 4, 4, "subsat64"},
684
  {NFP_6000_CPPTGT_MU, 10, 1, 0, 4, "test_subsat"},
685
  {NFP_6000_CPPTGT_MU, 10, 1, 4, 4, "test_subsat64"},
686
  {NFP_6000_CPPTGT_MU, 10, 2, 0, 4, "subsat_imm"},
687
  {NFP_6000_CPPTGT_MU, 10, 2, 4, 4, "subsat64_imm"},
688
  {NFP_6000_CPPTGT_MU, 10, 3, 0, 4, "test_subsat_imm"},
689
  {NFP_6000_CPPTGT_MU, 10, 3, 4, 4, "test_subsat64_imm"},
690
  {NFP_6000_CPPTGT_MU, 11, 0, 0, 0, "ticket_release"},
691
  {NFP_6000_CPPTGT_MU, 11, 1, 0, 0, "ticket_release_ind"},
692
  {NFP_6000_CPPTGT_MU, 12, 0, 0, 7, "cam128_lookup8/cam384_lookup8"},
693
  {NFP_6000_CPPTGT_MU, 12, 0, 1, 7, "cam128_lookup16/cam384_lookup16"},
694
  {NFP_6000_CPPTGT_MU, 12, 0, 2, 7, "cam128_lookup24/cam384_lookup24"},
695
  {NFP_6000_CPPTGT_MU, 12, 0, 3, 7, "cam128_lookup32/cam384_lookup32"},
696
  {NFP_6000_CPPTGT_MU, 12, 0, 4, 7, "cam256_lookup8/cam512_lookup8"},
697
  {NFP_6000_CPPTGT_MU, 12, 0, 5, 7, "cam256_lookup16/cam512_lookup16"},
698
  {NFP_6000_CPPTGT_MU, 12, 0, 6, 7, "cam256_lookup24/cam512_lookup24"},
699
  {NFP_6000_CPPTGT_MU, 12, 0, 7, 7, "cam256_lookup32/cam512_lookup32"},
700
  {NFP_6000_CPPTGT_MU, 12, 1, 0, 7,
701
   "cam128_lookup8_add/cam384_lookup8_add"},
702
  {NFP_6000_CPPTGT_MU, 12, 1, 1, 7,
703
   "cam128_lookup16_add/cam384_lookup16_add"},
704
  {NFP_6000_CPPTGT_MU, 12, 1, 2, 7,
705
   "cam128_lookup24_add/cam384_lookup24_add"},
706
  {NFP_6000_CPPTGT_MU, 12, 1, 3, 7,
707
   "cam128_lookup32_add/cam384_lookup32_add"},
708
  {NFP_6000_CPPTGT_MU, 12, 1, 4, 7,
709
   "cam256_lookup8_add/cam512_lookup8_add"},
710
  {NFP_6000_CPPTGT_MU, 12, 1, 5, 7,
711
   "cam256_lookup16_add/cam512_lookup16_add"},
712
  {NFP_6000_CPPTGT_MU, 12, 1, 6, 7,
713
   "cam256_lookup24_add/cam512_lookup24_add"},
714
  {NFP_6000_CPPTGT_MU, 12, 1, 7, 7,
715
   "cam256_lookup32_add/cam512_lookup32_add"},
716
  {NFP_6000_CPPTGT_MU, 12, 2, 0, 7, "tcam128_lookup8/tcam384_lookup8"},
717
  {NFP_6000_CPPTGT_MU, 12, 2, 1, 7, "tcam128_lookup16/tcam384_lookup16"},
718
  {NFP_6000_CPPTGT_MU, 12, 2, 2, 7, "tcam128_lookup24/tcam384_lookup24"},
719
  {NFP_6000_CPPTGT_MU, 12, 2, 3, 7, "tcam128_lookup32/tcam384_lookup32"},
720
  {NFP_6000_CPPTGT_MU, 12, 2, 4, 7, "tcam256_lookup8/tcam512_lookup8"},
721
  {NFP_6000_CPPTGT_MU, 12, 2, 5, 7, "tcam256_lookup16/tcam512_lookup16"},
722
  {NFP_6000_CPPTGT_MU, 12, 2, 6, 7, "tcam256_lookup24/tcam512_lookup24"},
723
  {NFP_6000_CPPTGT_MU, 12, 2, 7, 7, "tcam256_lookup32/tcam512_lookup32"},
724
  {NFP_6000_CPPTGT_MU, 12, 3, 0, 7, "lock128/lock384"},
725
  {NFP_6000_CPPTGT_MU, 12, 3, 2, 7,
726
   "cam128_lookup24_add_inc/cam384_lookup24_add_inc"},
727
  {NFP_6000_CPPTGT_MU, 12, 3, 4, 7, "lock256/lock512"},
728
  {NFP_6000_CPPTGT_MU, 12, 3, 6, 7,
729
   "cam256_lookup24_add_inc/cam512_lookup24_add_inc"},
730
  {NFP_6000_CPPTGT_MU, 13, 0, 0, 7, "microq128_get"},
731
  {NFP_6000_CPPTGT_MU, 13, 0, 4, 7, "microq256_get"},
732
  {NFP_6000_CPPTGT_MU, 13, 1, 0, 7, "microq128_pop"},
733
  {NFP_6000_CPPTGT_MU, 13, 1, 4, 7, "microq256_pop"},
734
  {NFP_6000_CPPTGT_MU, 13, 2, 0, 7, "microq128_put"},
735
  {NFP_6000_CPPTGT_MU, 13, 2, 4, 7, "microq256_put"},
736
  {NFP_6000_CPPTGT_MU, 14, 0, 0, 7, "queue128_lock"},
737
  {NFP_6000_CPPTGT_MU, 14, 0, 4, 7, "queue256_lock"},
738
  {NFP_6000_CPPTGT_MU, 14, 1, 0, 7, "queue128_unlock"},
739
  {NFP_6000_CPPTGT_MU, 14, 1, 4, 7, "queue256_unlock"},
740
  {NFP_6000_CPPTGT_MU, 15, 0, 0, 0, "xor"},
741
  {NFP_6000_CPPTGT_MU, 15, 1, 0, 0, "test_xor"},
742
  {NFP_6000_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
743
  {NFP_6000_CPPTGT_MU, 15, 3, 0, 0, "test_xor_imm"},
744
  {NFP_6000_CPPTGT_MU, 16, 0, 0, 0,
745
   "ctm.packet_wait_packet_status/emem.rd_qdesc/imem.stats_log"},
746
  {NFP_6000_CPPTGT_MU, 16, 1, 0, 0,
747
   "ctm.packet_read_packet_status/emem.wr_qdesc/imem.stats_log_sat"},
748
  {NFP_6000_CPPTGT_MU, 16, 2, 0, 0,
749
   "emem.push_qdesc/imem.stats_log_event"},
750
  {NFP_6000_CPPTGT_MU, 16, 3, 0, 0, "imem.stats_log_sat_event"},
751
  {NFP_6000_CPPTGT_MU, 17, 0, 0, 0,
752
   "ctm.packet_alloc/emem.enqueue/imem.stats_push"},
753
  {NFP_6000_CPPTGT_MU, 17, 1, 0, 0,
754
   "ctm.packet_credit_get/emem.enqueue_tail/imem.stats_push_clear"},
755
  {NFP_6000_CPPTGT_MU, 17, 2, 0, 0, "ctm.packet_alloc_poll/emem.dequeue"},
756
  {NFP_6000_CPPTGT_MU, 17, 3, 0, 0, "ctm.packet_add_thread"},
757
  {NFP_6000_CPPTGT_MU, 18, 0, 0, 0,
758
   "ctm.packet_free/emem.read_queue/imem.lb_write_desc"},
759
  {NFP_6000_CPPTGT_MU, 18, 1, 0, 0,
760
   "ctm.packet_free_and_signal/emem.read_queue_ring/imem.lb_read_desc"},
761
  {NFP_6000_CPPTGT_MU, 18, 2, 0, 0,
762
   "ctm.packet_free_and_return_pointer/emem.write_queue"},
763
  {NFP_6000_CPPTGT_MU, 18, 3, 0, 0,
764
   "ctm.packet_return_pointer/emem.write_queue_ring"},
765
  {NFP_6000_CPPTGT_MU, 19, 0, 0, 0,
766
   "ctm.packet_complete_drop/emem.add_tail/imem.lb_write_idtable"},
767
  {NFP_6000_CPPTGT_MU, 19, 1, 0, 0,
768
   "ctm.packet_complete_unicast/emem.qadd_thread/imem.lb_read_idtable"},
769
  {NFP_6000_CPPTGT_MU, 19, 2, 0, 0,
770
   "ctm.packet_complete_multicast/emem.qadd_work"},
771
  {NFP_6000_CPPTGT_MU, 19, 3, 0, 0,
772
   "ctm.packet_complete_multicast_free/emem.qadd_work_imm"},
773
  {NFP_6000_CPPTGT_MU, 20, 0, 0, 0,
774
   "ctm.pe_dma_to_memory_packet/emem.put/imem.lb_bucket_write_local"},
775
  {NFP_6000_CPPTGT_MU, 20, 1, 0, 0,
776
   "ctm.pe_dma_to_memory_packet_swap/imem.lb_bucket_write_dcache"},
777
  {NFP_6000_CPPTGT_MU, 20, 2, 0, 0,
778
   "ctm.pe_dma_to_memory_packet_free/emem.journal"},
779
  {NFP_6000_CPPTGT_MU, 20, 3, 0, 0,
780
   "ctm.pe_dma_to_memory_packet_free_swap"},
781
  {NFP_6000_CPPTGT_MU, 21, 0, 0, 0,
782
   "ctm.pe_dma_to_memory_indirect/emem.get/imem.lb_bucket_read_local"},
783
  {NFP_6000_CPPTGT_MU, 21, 1, 0, 0,
784
   "ctm.pe_dma_to_memory_indirect_swap/emem.get_eop/"
785
     "imem.lb_bucket_read_dcache"},
786
  {NFP_6000_CPPTGT_MU, 21, 2, 0, 0,
787
   "ctm.pe_dma_to_memory_indirect_free/emem.get_freely"},
788
  {NFP_6000_CPPTGT_MU, 21, 3, 0, 0,
789
   "ctm.pe_dma_to_memory_indirect_free_swap"},
790
  {NFP_6000_CPPTGT_MU, 22, 0, 0, 0,
791
   "ctm.pe_dma_to_memory_buffer/emem.pop/imem.lb_lookup_bundleid"},
792
  {NFP_6000_CPPTGT_MU, 22, 1, 0, 0,
793
   "ctm.pe_dma_to_memory_buffer_le/emem.pop_eop/imem.lb_lookup_dcache"},
794
  {NFP_6000_CPPTGT_MU, 22, 2, 0, 0,
795
   "ctm.pe_dma_to_memory_buffer_swap/emem.pop_freely/imem.lb_lookup_idtable"},
796
  {NFP_6000_CPPTGT_MU, 22, 3, 0, 0, "ctm.pe_dma_to_memory_buffer_le_swap"},
797
  {NFP_6000_CPPTGT_MU, 23, 0, 0, 0,
798
   "ctm.pe_dma_from_memory_buffer/emem.fast_journal/imem.lb_push_stats_local"},
799
  {NFP_6000_CPPTGT_MU, 23, 1, 0, 0,
800
   "ctm.pe_dma_from_memory_buffer_le/emem.fast_journal_sig/"
801
     "imem.lb_push_stats_dcache"},
802
  {NFP_6000_CPPTGT_MU, 23, 2, 0, 0,
803
   "ctm.pe_dma_from_memory_buffer_swap/imem.lb_push_stats_local_clr"},
804
  {NFP_6000_CPPTGT_MU, 23, 3, 0, 0,
805
   "ctm.pe_dma_from_memory_buffer_le_swap/imem.lb_push_stats_dcache_clr"},
806
  {NFP_6000_CPPTGT_MU, 26, 0, 0, 0, "emem.lookup/imem.lookup"},
807
  {NFP_6000_CPPTGT_MU, 28, 0, 0, 0, "read32"},
808
  {NFP_6000_CPPTGT_MU, 28, 1, 0, 0, "read32_le"},
809
  {NFP_6000_CPPTGT_MU, 28, 2, 0, 0, "read32_swap"},
810
  {NFP_6000_CPPTGT_MU, 28, 3, 0, 0, "read32_swap_le"},
811
  {NFP_6000_CPPTGT_MU, 29, 1, 0, 0, "cam_lookup_add_lock"},
812
  {NFP_6000_CPPTGT_MU, 29, 2, 0, 0, "cam_lookup_add_extend"},
813
  {NFP_6000_CPPTGT_MU, 29, 3, 0, 0, "cam_lookup_add_inc"},
814
  {NFP_6000_CPPTGT_MU, 30, 2, 0, 0, "meter"},
815
  {NFP_6000_CPPTGT_MU, 31, 0, 0, 0, "write32"},
816
  {NFP_6000_CPPTGT_MU, 31, 1, 0, 0, "write32_le"},
817
  {NFP_6000_CPPTGT_MU, 31, 2, 0, 0, "write32_swap"},
818
  {NFP_6000_CPPTGT_MU, 31, 3, 0, 0, "write32_swap_le"},
819
  {NFP_6000_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
820
  {NFP_6000_CPPTGT_PCIE, 0, 1, 0, 0, "read_rid"},
821
  {NFP_6000_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
822
  {NFP_6000_CPPTGT_PCIE, 1, 1, 0, 0, "write_rid"},
823
  {NFP_6000_CPPTGT_PCIE, 1, 2, 0, 0, "write_vdm"},
824
  {NFP_6000_CPPTGT_PCIE, 2, 0, 0, 0, "read_int"},
825
  {NFP_6000_CPPTGT_PCIE, 3, 0, 0, 0, "write_int"},
826
  {NFP_6000_CPPTGT_ARM, 0, 0, 0, 0, "read"},
827
  {NFP_6000_CPPTGT_ARM, 1, 0, 0, 0, "write"},
828
  {NFP_6000_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
829
  {NFP_6000_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
830
  {NFP_6000_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
831
  {NFP_6000_CPPTGT_CTXPB, 0, 0, 0, 0, "xpb_read"},
832
  {NFP_6000_CPPTGT_CTXPB, 0, 1, 0, 0, "ring_get"},
833
  {NFP_6000_CPPTGT_CTXPB, 0, 2, 0, 0, "interthread_signal"},
834
  {NFP_6000_CPPTGT_CTXPB, 1, 0, 0, 0, "xpb_write"},
835
  {NFP_6000_CPPTGT_CTXPB, 1, 1, 0, 0, "ring_put"},
836
  {NFP_6000_CPPTGT_CTXPB, 1, 2, 0, 0, "ctnn_write"},
837
  {NFP_6000_CPPTGT_CTXPB, 2, 0, 0, 0, "reflect_read_none"},
838
  {NFP_6000_CPPTGT_CTXPB, 2, 1, 0, 0, "reflect_read_sig_init"},
839
  {NFP_6000_CPPTGT_CTXPB, 2, 2, 0, 0, "reflect_read_sig_remote"},
840
  {NFP_6000_CPPTGT_CTXPB, 2, 3, 0, 0, "reflect_read_sig_both"},
841
  {NFP_6000_CPPTGT_CTXPB, 3, 0, 0, 0, "reflect_write_none"},
842
  {NFP_6000_CPPTGT_CTXPB, 3, 1, 0, 0, "reflect_write_sig_init"},
843
  {NFP_6000_CPPTGT_CTXPB, 3, 2, 0, 0, "reflect_write_sig_remote"},
844
  {NFP_6000_CPPTGT_CTXPB, 3, 3, 0, 0, "reflect_write_sig_both"},
845
  {NFP_6000_CPPTGT_CLS, 0, 0, 0, 0, "read"},
846
  {NFP_6000_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
847
  {NFP_6000_CPPTGT_CLS, 0, 2, 0, 0, "swap/test_compare_write"},
848
  {NFP_6000_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
849
  {NFP_6000_CPPTGT_CLS, 1, 0, 0, 0, "write"},
850
  {NFP_6000_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
851
  {NFP_6000_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
852
  {NFP_6000_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
853
  {NFP_6000_CPPTGT_CLS, 2, 0, 0, 0, "set"},
854
  {NFP_6000_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
855
  {NFP_6000_CPPTGT_CLS, 2, 2, 0, 0, "test_set"},
856
  {NFP_6000_CPPTGT_CLS, 2, 3, 0, 0, "test_clr"},
857
  {NFP_6000_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
858
  {NFP_6000_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
859
  {NFP_6000_CPPTGT_CLS, 3, 2, 0, 0, "test_set_imm"},
860
  {NFP_6000_CPPTGT_CLS, 3, 3, 0, 0, "test_clr_imm"},
861
  {NFP_6000_CPPTGT_CLS, 4, 0, 0, 0, "add"},
862
  {NFP_6000_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
863
  {NFP_6000_CPPTGT_CLS, 4, 2, 0, 0, "addsat"},
864
  {NFP_6000_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
865
  {NFP_6000_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
866
  {NFP_6000_CPPTGT_CLS, 5, 2, 0, 0, "addsat_imm"},
867
  {NFP_6000_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
868
  {NFP_6000_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
869
  {NFP_6000_CPPTGT_CLS, 6, 2, 0, 0, "subsat"},
870
  {NFP_6000_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
871
  {NFP_6000_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
872
  {NFP_6000_CPPTGT_CLS, 7, 2, 0, 0, "subsat_imm"},
873
  {NFP_6000_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
874
  {NFP_6000_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
875
  {NFP_6000_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
876
  {NFP_6000_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
877
  {NFP_6000_CPPTGT_CLS, 9, 0, 0, 0, "get"},
878
  {NFP_6000_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
879
  {NFP_6000_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
880
  {NFP_6000_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
881
  {NFP_6000_CPPTGT_CLS, 10, 0, 0, 0, "ring_put"},
882
  {NFP_6000_CPPTGT_CLS, 10, 2, 0, 0, "ring_journal"},
883
  {NFP_6000_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
884
  {NFP_6000_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
885
  {NFP_6000_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
886
  {NFP_6000_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
887
  {NFP_6000_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
888
  {NFP_6000_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
889
  {NFP_6000_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
890
  {NFP_6000_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
891
  {NFP_6000_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
892
  {NFP_6000_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
893
  {NFP_6000_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
894
  {NFP_6000_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
895
  {NFP_6000_CPPTGT_CLS, 14, 0, 0, 0, "reflect_write_sig_local"},
896
  {NFP_6000_CPPTGT_CLS, 14, 1, 0, 0, "reflect_write_sig_remote"},
897
  {NFP_6000_CPPTGT_CLS, 14, 2, 0, 0, "reflect_write_sig_both"},
898
  {NFP_6000_CPPTGT_CLS, 15, 0, 0, 0, "reflect_read_sig_remote"},
899
  {NFP_6000_CPPTGT_CLS, 15, 1, 0, 0, "reflect_read_sig_local"},
900
  {NFP_6000_CPPTGT_CLS, 15, 2, 0, 0, "reflect_read_sig_both"},
901
  {NFP_6000_CPPTGT_CLS, 16, 1, 0, 0, "cam_lookup32_add_lock"},
902
  {NFP_6000_CPPTGT_CLS, 16, 2, 0, 0, "cam_lookup24_add_inc"},
903
  {NFP_6000_CPPTGT_CLS, 16, 3, 0, 0, "cam_lookup32_add_extend"},
904
  {NFP_6000_CPPTGT_CLS, 17, 0, 0, 0, "meter"},
905
  {NFP_6000_CPPTGT_CLS, 17, 2, 0, 0, "statistic"},
906
  {NFP_6000_CPPTGT_CLS, 17, 3, 0, 0, "statistic_imm"},
907
  {NFP_6000_CPPTGT_CLS, 20, 0, 0, 0, "test_add"},
908
  {NFP_6000_CPPTGT_CLS, 20, 1, 0, 0, "test_add64"},
909
  {NFP_6000_CPPTGT_CLS, 20, 2, 0, 0, "test_addsat"},
910
  {NFP_6000_CPPTGT_CLS, 21, 0, 0, 0, "test_add_imm"},
911
  {NFP_6000_CPPTGT_CLS, 21, 1, 0, 0, "test_add64_imm"},
912
  {NFP_6000_CPPTGT_CLS, 21, 2, 0, 0, "test_addsat_imm"},
913
  {NFP_6000_CPPTGT_CLS, 22, 0, 0, 0, "test_sub"},
914
  {NFP_6000_CPPTGT_CLS, 22, 1, 0, 0, "test_sub64"},
915
  {NFP_6000_CPPTGT_CLS, 22, 2, 0, 0, "test_subsat"},
916
  {NFP_6000_CPPTGT_CLS, 23, 0, 0, 0, "test_sub_imm"},
917
  {NFP_6000_CPPTGT_CLS, 23, 1, 0, 0, "test_sub64_imm"},
918
  {NFP_6000_CPPTGT_CLS, 23, 2, 0, 0, "test_subsat_imm"},
919
  {NFP_6000_CPPTGT_CLS, 24, 0, 0, 0, "ring_read"},
920
  {NFP_6000_CPPTGT_CLS, 24, 1, 0, 0, "ring_write"},
921
  {NFP_6000_CPPTGT_CLS, 24, 2, 0, 0, "ring_ordered_lock"},
922
  {NFP_6000_CPPTGT_CLS, 24, 3, 0, 0, "ring_ordered_unlock"},
923
  {NFP_6000_CPPTGT_CLS, 25, 0, 0, 0, "ring_workq_add_thread"},
924
  {NFP_6000_CPPTGT_CLS, 25, 1, 0, 0, "ring_workq_add_work"}
925
};
926
927
static int
928
nfp_me_print_invalid (uint64_t instr, struct disassemble_info *dinfo)
929
71.7k
{
930
71.7k
  const char * err_msg = N_("<invalid_instruction>:");
931
71.7k
  dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
932
71.7k
  return _NFP_ERR_CONT;
933
71.7k
}
934
935
static bool
936
nfp_me_is_imm_opnd10 (unsigned int opnd)
937
62.8k
{
938
62.8k
  return _BF (opnd, 9, 8) == 0x3;
939
62.8k
}
940
941
static bool
942
nfp_me_is_imm_opnd8 (unsigned int opnd)
943
56.6k
{
944
56.6k
  return _BTST (opnd, 5);
945
56.6k
}
946
947
static unsigned int
948
nfp_me_imm_opnd10 (unsigned int opnd)
949
8.57k
{
950
8.57k
  return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
951
8.57k
}
952
953
static unsigned int
954
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
955
3.70k
{
956
3.70k
  unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
957
958
3.70k
  return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
959
3.70k
}
960
961
/* Print an unrestricted/10-bit operand.
962
   This can mostly be generic across NFP families at the moment.  */
963
static bool
964
nfp_me_print_opnd10 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
965
         struct disassemble_info *dinfo)
966
68.7k
{
967
68.7k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
968
969
  /* Absolute GPR.  */
970
68.7k
  if (_BF (opnd, 9, 7) == 0x1)
971
9.35k
    dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
972
973
  /* Relative GPR.  */
974
59.3k
  else if (_BF (opnd, 9, 6) == 0x0)
975
9.46k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
976
977
  /* Indexed Xfer.  */
978
49.8k
  else if (_BF (opnd, 9, 7) == 0x2)
979
6.22k
    {
980
6.22k
      dinfo->fprintf_func (dinfo->stream, "*$index");
981
6.22k
      if (_BF (opnd, 2, 1) == 0x1)
982
1.04k
  dinfo->fprintf_func (dinfo->stream, "++");
983
5.17k
      else if (_BF (opnd, 2, 1) == 0x2)
984
1.79k
  dinfo->fprintf_func (dinfo->stream, "--");
985
6.22k
    }
986
987
  /* Relative Xfer.  */
988
43.6k
  else if (_BF (opnd, 9, 7) == 0x3)
989
7.09k
    {
990
7.09k
      if (_BTST (opnd, 6))
991
3.28k
  n += (num_ctx == 8 ? 16 : 32);
992
7.09k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
993
7.09k
    }
994
995
  /* Indexed Next Neighbour.  */
996
36.5k
  else if (_BF (opnd, 9, 6) == 0x9)
997
6.19k
    {
998
6.19k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
999
6.19k
      if (_BTST (opnd, 1))
1000
4.11k
  dinfo->fprintf_func (dinfo->stream, "++");
1001
6.19k
    }
1002
1003
  /* Relative Next Neighbour.  */
1004
30.3k
  else if (_BF (opnd, 9, 6) == 0xa)
1005
6.24k
    {
1006
6.24k
      dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1007
6.24k
    }
1008
1009
  /* Indexed LMEM.  */
1010
24.1k
  else if (_BF (opnd, 9, 6) == 0x8)
1011
4.69k
    {
1012
4.69k
      n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1013
4.69k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1014
4.69k
      if (_BTST (opnd, 4))
1015
1.59k
  dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1016
3.10k
      else if (_BF (opnd, 3, 0))
1017
2.51k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1018
4.69k
    }
1019
1020
  /* 8-bit Constant value.  */
1021
19.4k
  else if (_BF (opnd, 9, 8) == 0x3)
1022
8.43k
    dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1023
1024
10.9k
  else
1025
10.9k
    {
1026
10.9k
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1027
10.9k
      return false;
1028
10.9k
    }
1029
1030
57.7k
  return true;
1031
68.7k
}
1032
1033
/* Print a restricted/8-bit operand.
1034
   This can mostly be generic across NFP families at the moment.  */
1035
1036
static bool
1037
nfp_me_print_opnd8 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
1038
        unsigned int imm8_msb, struct disassemble_info *dinfo)
1039
386k
{
1040
386k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1041
1042
  /* Relative GPR.  */
1043
386k
  if (_BF (opnd, 7, 5) == 0x0)
1044
180k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1045
1046
  /* Relative Xfer.  */
1047
205k
  else if (_BF (opnd, 7, 5) == 0x4)
1048
36.4k
    dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1049
1050
  /* Relative Xfer.  */
1051
169k
  else if (_BF (opnd, 7, 5) == 0x6)
1052
30.8k
    {
1053
30.8k
      n += (num_ctx == 8 ? 16 : 32);
1054
30.8k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1055
30.8k
    }
1056
1057
  /* Indexed Xfer.  */
1058
138k
  else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1059
16.7k
    {
1060
16.7k
      dinfo->fprintf_func (dinfo->stream, "*$index");
1061
16.7k
      if (_BF (opnd, 2, 1) == 0x1)
1062
5.06k
  dinfo->fprintf_func (dinfo->stream, "++");
1063
11.6k
      else if (_BF (opnd, 2, 1) == 0x2)
1064
1.82k
  dinfo->fprintf_func (dinfo->stream, "--");
1065
16.7k
    }
1066
1067
  /* Indexed NN.  */
1068
121k
  else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1069
7.82k
    {
1070
7.82k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
1071
7.82k
      if (_BTST (opnd, 1))
1072
3.18k
  dinfo->fprintf_func (dinfo->stream, "++");
1073
7.82k
    }
1074
1075
  /* Indexed LMEM.  */
1076
113k
  else if (_BF (opnd, 7, 4) == 0x5)
1077
13.9k
    {
1078
13.9k
      n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1079
13.9k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1080
13.9k
      if (_BF (opnd, 2, 0))
1081
11.5k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1082
13.9k
    }
1083
1084
  /* 7+1-bit Constant value.  */
1085
99.6k
  else if (_BTST (opnd, 5))
1086
99.6k
    {
1087
99.6k
      n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1088
99.6k
      dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1089
99.6k
    }
1090
1091
0
  else
1092
0
    {
1093
0
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1094
0
      return false;
1095
0
    }
1096
1097
386k
  return true;
1098
386k
}
1099
1100
static int
1101
nfp_me27_28_print_alu_shf (uint64_t instr, unsigned int pred_cc,
1102
         unsigned int dst_lmext, unsigned int src_lmext,
1103
         unsigned int gpr_wrboth,
1104
         int num_ctx, struct disassemble_info *dinfo)
1105
32.0k
{
1106
32.0k
  unsigned int op = _BF (instr, 35, 33);
1107
32.0k
  unsigned int srcA = _BF (instr, 7, 0);
1108
32.0k
  unsigned int srcB = _BF (instr, 17, 10);
1109
32.0k
  unsigned int dst = _BF (instr, 27, 20);
1110
32.0k
  unsigned int sc = _BF (instr, 9, 8);
1111
32.0k
  unsigned int imm_msb = _BTST (instr, 18);
1112
32.0k
  unsigned int swap = _BTST (instr, 19);
1113
32.0k
  unsigned int shift = _BF (instr, 32, 28);
1114
32.0k
  char dst_bank = 'A' + _BTST (instr, 36);
1115
32.0k
  unsigned int nocc = _BTST (instr, 40);
1116
32.0k
  bool err = false;
1117
1118
32.0k
  if (swap)
1119
15.2k
    {
1120
15.2k
      unsigned int tmp = srcA;
1121
15.2k
      srcA = srcB;
1122
15.2k
      srcB = tmp;
1123
15.2k
    }
1124
1125
  /* alu_shf, dbl_shf, asr.  */
1126
32.0k
  if (op < 7)
1127
27.4k
    {
1128
27.4k
      if (sc == 3)
1129
6.19k
  dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1130
21.2k
      else if (op == 6)
1131
2.98k
  dinfo->fprintf_func (dinfo->stream, "asr[");
1132
18.2k
      else
1133
18.2k
  dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1134
1135
      /* dest operand */
1136
27.4k
      if (nfp_me_is_imm_opnd8 (dst))
1137
11.6k
  dinfo->fprintf_func (dinfo->stream, "--");
1138
15.8k
      else
1139
15.8k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1140
15.8k
            dst_lmext, imm_msb, dinfo);
1141
1142
27.4k
      dinfo->fprintf_func (dinfo->stream, ", ");
1143
1144
      /* A operand.  */
1145
27.4k
      if (op != 6)
1146
23.9k
  {
1147
23.9k
    if ((op < 2) && (sc != 3))  /* Not dbl_shf.  */
1148
7.05k
      dinfo->fprintf_func (dinfo->stream, "--");  /* B or ~B operator.  */
1149
16.8k
    else
1150
16.8k
      err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1151
16.8k
                num_ctx, src_lmext, imm_msb,
1152
16.8k
                dinfo);
1153
1154
23.9k
    dinfo->fprintf_func (dinfo->stream, ", ");
1155
1156
    /* Operator (not for dbl_shf).  */
1157
23.9k
    if (sc != 3)
1158
18.2k
      {
1159
18.2k
        dinfo->fprintf_func (dinfo->stream, "%s, ",
1160
18.2k
           nfp_mealu_shf_op[op]);
1161
18.2k
      }
1162
23.9k
  }
1163
1164
      /* B operand.  */
1165
27.4k
      err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1166
27.4k
          num_ctx, src_lmext, imm_msb, dinfo);
1167
1168
27.4k
      dinfo->fprintf_func (dinfo->stream, ", ");
1169
1170
      /* Shift */
1171
27.4k
      if (sc == 0)
1172
8.96k
  dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1173
18.5k
      else if (sc == 2)
1174
5.18k
  {
1175
5.18k
    if (shift)
1176
4.68k
      dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1177
499
    else
1178
499
      dinfo->fprintf_func (dinfo->stream, "<<indirect");
1179
5.18k
  }
1180
13.3k
      else
1181
13.3k
  {
1182
13.3k
    if (shift)
1183
12.2k
      dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1184
1.03k
    else
1185
1.03k
      dinfo->fprintf_func (dinfo->stream, ">>indirect");
1186
13.3k
  }
1187
27.4k
    }
1188
  /* Byte Align.  */
1189
4.61k
  else if (op == 7)
1190
4.61k
    {
1191
4.61k
      dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1192
4.61k
         ((sc == 2) ? "le" : "be"));
1193
1194
      /* Dest operand.  */
1195
4.61k
      if (nfp_me_is_imm_opnd8 (dst))
1196
2.83k
  dinfo->fprintf_func (dinfo->stream, "--");
1197
1.78k
      else
1198
1.78k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1199
1.78k
            dst_lmext, imm_msb, dinfo);
1200
1201
4.61k
      dinfo->fprintf_func (dinfo->stream, ", ");
1202
1203
4.61k
      if (sc == 2)
1204
867
  err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1205
867
            0, imm_msb, dinfo);
1206
3.74k
      else
1207
3.74k
  err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1208
3.74k
            0, imm_msb, dinfo);
1209
4.61k
    }
1210
1211
32.0k
  dinfo->fprintf_func (dinfo->stream, "]");
1212
32.0k
  if (nocc)
1213
16.1k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1214
32.0k
  if (gpr_wrboth)
1215
14.4k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1216
32.0k
  if (pred_cc)
1217
13.2k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1218
1219
32.0k
  if (err)
1220
0
    return _NFP_ERR_CONT;
1221
32.0k
  return 0;
1222
32.0k
}
1223
1224
static int
1225
nfp_me27_28_print_alu (uint64_t instr, unsigned int pred_cc,
1226
           unsigned int dst_lmext, unsigned int src_lmext,
1227
           unsigned int gpr_wrboth,
1228
           int num_ctx, struct disassemble_info *dinfo)
1229
33.3k
{
1230
33.3k
  unsigned int op = _BF (instr, 35, 31);
1231
33.3k
  unsigned int srcA = _BF (instr, 9, 0);
1232
33.3k
  unsigned int srcB = _BF (instr, 19, 10);
1233
33.3k
  unsigned int dst = _BF (instr, 29, 20);
1234
33.3k
  unsigned int swap = _BTST (instr, 30);
1235
33.3k
  char dst_bank = 'A' + _BTST (instr, 36);
1236
33.3k
  unsigned int nocc = _BTST (instr, 40);
1237
33.3k
  int do_close_bracket = 1;
1238
33.3k
  bool err = false;
1239
1240
33.3k
  if (swap)
1241
9.69k
    {
1242
9.69k
      unsigned int tmp = srcA;
1243
9.69k
      srcA = srcB;
1244
9.69k
      srcB = tmp;
1245
9.69k
    }
1246
1247
33.3k
  switch (op)
1248
33.3k
    {
1249
961
    case 3:     /* pop_count3[dst, srcB] */
1250
1.58k
    case 6:     /* pop_count1[srcB] */
1251
2.62k
    case 7:     /* pop_count2[srcB] */
1252
3.57k
    case 14:      /* ffs[dst, srcB] */
1253
5.60k
    case 15:      /* cam_read_tag[dst, srcB] */
1254
7.72k
    case 31:      /* cam_read_state[dst, srcB] */
1255
7.72k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1256
1257
      /* No dest for pop_count1/2.  */
1258
7.72k
      if ((op != 6) && (op != 7))
1259
6.06k
  {
1260
    /* dest operand */
1261
6.06k
    if (nfp_me_is_imm_opnd10 (dst))
1262
1.46k
      dinfo->fprintf_func (dinfo->stream, "--");
1263
4.59k
    else
1264
4.59k
      err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1265
4.59k
                 dst_lmext, dinfo);
1266
1267
6.06k
    dinfo->fprintf_func (dinfo->stream, ", ");
1268
6.06k
  }
1269
1270
      /* B operand.  */
1271
7.72k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1272
6.38k
           num_ctx, src_lmext, dinfo);
1273
7.72k
      break;
1274
 
1275
      /* cam_clear.  */
1276
988
    case 11:
1277
988
      do_close_bracket = 0;
1278
988
      dinfo->fprintf_func (dinfo->stream, "cam_clear");
1279
988
      break;
1280
1281
      /* cam_lookup.  */
1282
1.81k
    case 23:
1283
1.81k
      do_close_bracket = 0;
1284
1.81k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1285
1286
      /* Dest operand.  */
1287
1.81k
      if (nfp_me_is_imm_opnd10 (dst))
1288
829
  dinfo->fprintf_func (dinfo->stream, "--");
1289
989
      else
1290
989
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1291
989
             dst_lmext, dinfo);
1292
1293
1.81k
      dinfo->fprintf_func (dinfo->stream, ", ");
1294
1295
      /* A operand.  */
1296
1.81k
      err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1297
1.62k
           num_ctx, src_lmext, dinfo);
1298
1299
1.81k
      dinfo->fprintf_func (dinfo->stream, "]");
1300
1301
1.81k
      if (_BF (srcB, 1, 0))
1302
1.51k
  {
1303
1.51k
    unsigned int n = _BTST (srcB, 1);
1304
1.51k
    if (_BTST (srcB, 4))  /* Only for MEv28.  */
1305
262
      n += 2;
1306
1.51k
    dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1307
1.51k
             _BF (srcB, 3, 2));
1308
1.51k
  }
1309
1310
1.81k
      break;
1311
1312
2.56k
    case 19:      /* cam_write.  */
1313
3.99k
    case 27:      /* cam_write_state.  */
1314
3.99k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1315
3.99k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1316
3.99k
           num_ctx, src_lmext, dinfo);
1317
3.99k
      dinfo->fprintf_func (dinfo->stream, ", ");
1318
3.99k
      if (op == 19)
1319
2.56k
  {
1320
2.56k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1321
2.41k
               num_ctx, src_lmext, dinfo);
1322
2.56k
    dinfo->fprintf_func (dinfo->stream, ", ");
1323
2.56k
  }
1324
3.99k
      dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1325
3.99k
      break;
1326
1327
      /* CRC.  */
1328
1.19k
    case 18:  
1329
1.19k
      do_close_bracket = 0;
1330
1.19k
      dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1331
1.19k
         _BTST (srcA, 3) ? "le" : "be");
1332
1.19k
      if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
1333
155
  {
1334
155
    dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1335
155
    err = true;
1336
155
  }
1337
1.03k
      else
1338
1.03k
  {
1339
1.03k
    dinfo->fprintf_func (dinfo->stream, "%s, ",
1340
1.03k
             nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
1341
1.03k
  }
1342
1343
      /* Dest operand.  */
1344
1.19k
      if (nfp_me_is_imm_opnd10 (dst))
1345
311
  dinfo->fprintf_func (dinfo->stream, "--");
1346
882
      else
1347
882
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1348
788
             dst_lmext, dinfo);
1349
1350
1.19k
      dinfo->fprintf_func (dinfo->stream, ", ");
1351
1352
      /* B operand.  */
1353
1.19k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1354
915
           num_ctx, src_lmext, dinfo);
1355
1356
1.19k
      dinfo->fprintf_func (dinfo->stream, "]");
1357
1.19k
      if (_BF (srcA, 2, 0))
1358
813
  dinfo->fprintf_func (dinfo->stream, ", %s",
1359
813
           nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
1360
1.19k
      if (_BTST (srcA, 4))
1361
525
  dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1362
1.19k
      break;
1363
1364
17.6k
    default:
1365
      /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs).  */
1366
17.6k
      dinfo->fprintf_func (dinfo->stream, "alu[");
1367
1368
      /* Dest operand.  */
1369
17.6k
      if (nfp_me_is_imm_opnd10 (dst))
1370
4.94k
  dinfo->fprintf_func (dinfo->stream, "--");
1371
12.6k
      else
1372
12.6k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1373
12.6k
             dst_lmext, dinfo);
1374
17.6k
      dinfo->fprintf_func (dinfo->stream, ", ");
1375
1376
      /* A operand.  */
1377
17.6k
      if ((op == 0) || (op == 4))  /* B only operators.  */
1378
1.68k
  dinfo->fprintf_func (dinfo->stream, "--");
1379
15.9k
      else
1380
15.9k
  err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1381
13.6k
             num_ctx, src_lmext, dinfo);
1382
1383
17.6k
      if (!nfp_me27_28_alu_op[op])
1384
5.43k
  {
1385
5.43k
    dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1386
5.43k
    err = true;
1387
5.43k
  }
1388
12.1k
      else
1389
12.1k
  {
1390
12.1k
    dinfo->fprintf_func (dinfo->stream, ", %s, ",
1391
12.1k
             nfp_me27_28_alu_op[op]);
1392
12.1k
  }
1393
1394
      /* B operand.  */
1395
17.6k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1396
9.79k
           num_ctx, src_lmext, dinfo);
1397
17.6k
      break;
1398
33.3k
    }
1399
1400
33.3k
  if (do_close_bracket)
1401
29.3k
    dinfo->fprintf_func (dinfo->stream, "]");
1402
1403
33.3k
  if (nocc)
1404
17.8k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1405
33.3k
  if (gpr_wrboth)
1406
16.7k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1407
33.3k
  if (pred_cc)
1408
14.4k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1409
1410
33.3k
  if (err)
1411
11.8k
    return _NFP_ERR_CONT;
1412
21.5k
  return 0;
1413
33.3k
}
1414
1415
static int
1416
nfp_me27_28_print_immed (uint64_t instr, unsigned int pred_cc,
1417
       unsigned int dst_lmext,
1418
       unsigned int gpr_wrboth,
1419
       int num_ctx, struct disassemble_info *dinfo)
1420
6.88k
{
1421
6.88k
  unsigned int srcA = _BF (instr, 9, 0);
1422
6.88k
  unsigned int srcB = _BF (instr, 19, 10);
1423
6.88k
  unsigned int imm = _BF (instr, 27, 20);
1424
6.88k
  unsigned int by = _BTST (instr, 29);
1425
6.88k
  unsigned int wd = _BTST (instr, 30);
1426
6.88k
  unsigned int inv = _BTST (instr, 31);
1427
6.88k
  unsigned int byte_shift = _BF (instr, 34, 33);
1428
6.88k
  bool err = false;
1429
1430
6.88k
  if (nfp_me_is_imm_opnd10 (srcB))
1431
1.01k
    {
1432
1.01k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1433
1.01k
      if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
1434
239
  {
1435
239
    dinfo->fprintf_func (dinfo->stream, "nop");
1436
239
    return 0;
1437
239
  }
1438
1.01k
    }
1439
5.86k
  else
1440
5.86k
    {
1441
5.86k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1442
5.86k
    }
1443
1444
6.64k
  if (inv)
1445
4.65k
    imm = (imm ^ 0xffff) | 0xffff0000U;
1446
1447
6.64k
  if (by)
1448
4.71k
    {
1449
4.71k
      dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1450
4.71k
      imm &= 0xff;
1451
4.71k
    }
1452
1.93k
  else if (wd)
1453
498
    {
1454
498
      dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1455
498
      imm &= 0xffff;
1456
498
    }
1457
1.44k
  else
1458
1.44k
    dinfo->fprintf_func (dinfo->stream, "immed[");
1459
1460
  /* Dest.  */
1461
6.64k
  if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1462
285
    dinfo->fprintf_func (dinfo->stream, "--");  /* No Dest.  */
1463
6.36k
  else if (nfp_me_is_imm_opnd10 (srcA))
1464
495
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1465
5.86k
  else
1466
5.86k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1467
1468
6.64k
  dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1469
1470
6.64k
  if ((!by) && (!wd) && (byte_shift))
1471
769
    dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1472
1473
6.64k
  dinfo->fprintf_func (dinfo->stream, "]");
1474
1475
6.64k
  if (gpr_wrboth)
1476
3.85k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1477
6.64k
  if (pred_cc)
1478
4.44k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1479
1480
6.64k
  if (err)
1481
2.65k
    return _NFP_ERR_CONT;
1482
3.98k
  return 0;
1483
6.64k
}
1484
1485
static int
1486
nfp_me27_28_print_ld_field (uint64_t instr, unsigned int pred_cc,
1487
          unsigned int dst_lmext, unsigned int src_lmext,
1488
          unsigned int gpr_wrboth,
1489
          int num_ctx, struct disassemble_info *dinfo)
1490
1.88k
{
1491
1.88k
  unsigned int load_cc = _BTST (instr, 34);
1492
1.88k
  unsigned int shift = _BF (instr, 32, 28);
1493
1.88k
  unsigned int byte_mask = _BF (instr, 27, 24);
1494
1.88k
  unsigned int zerof = _BTST (instr, 20);
1495
1.88k
  unsigned int swap = _BTST (instr, 19);
1496
1.88k
  unsigned int imm_msb = _BTST (instr, 18);
1497
1.88k
  unsigned int src = _BF (instr, 17, 10);
1498
1.88k
  unsigned int sc = _BF (instr, 9, 8);
1499
1.88k
  unsigned int dst = _BF (instr, 7, 0);
1500
1.88k
  bool err = false;
1501
1502
1.88k
  if (swap)
1503
322
    {
1504
322
      unsigned int tmp = src;
1505
322
      src = dst;
1506
322
      dst = tmp;
1507
322
    }
1508
1509
1.88k
  if (zerof)
1510
376
    dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1511
1.51k
  else
1512
1.51k
    dinfo->fprintf_func (dinfo->stream, "ld_field[");
1513
1514
1.88k
  err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1515
1.88k
            dst_lmext, imm_msb, dinfo);
1516
1.88k
  dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1517
1.88k
           _BTST (byte_mask, 3),
1518
1.88k
           _BTST (byte_mask, 2),
1519
1.88k
           _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1520
1.88k
  err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1521
1.88k
            src_lmext, imm_msb, dinfo);
1522
1523
1.88k
  if ((sc == 0) && (shift != 0))
1524
677
    dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1525
1.21k
  else if (sc == 1)
1526
439
    {
1527
439
      if (shift)
1528
280
  dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1529
159
      else
1530
159
  dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1531
439
    }
1532
773
  else if (sc == 2)
1533
247
    {
1534
247
      if (shift)
1535
163
  dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1536
84
      else
1537
84
  dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1538
247
    }
1539
526
  else if (sc == 3)
1540
278
    dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1541
1542
1.88k
  dinfo->fprintf_func (dinfo->stream, "]");
1543
1544
1.88k
  if (load_cc)
1545
519
    dinfo->fprintf_func (dinfo->stream, ", load_cc");
1546
1.88k
  if (gpr_wrboth)
1547
406
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1548
1.88k
  if (pred_cc)
1549
483
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1550
1551
1.88k
  if (err)
1552
0
    return _NFP_ERR_CONT;
1553
1.88k
  return 0;
1554
1.88k
}
1555
1556
static int
1557
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
1558
11.2k
{
1559
11.2k
  unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1560
11.2k
  unsigned int defer = _BF (instr, 21, 20);
1561
11.2k
  unsigned int no_load = _BTST (instr, 19);
1562
11.2k
  unsigned int resume = _BTST (instr, 18);
1563
11.2k
  unsigned int bpt = _BTST (instr, 17);
1564
11.2k
  unsigned int sig_or = _BTST (instr, 16);
1565
11.2k
  unsigned int ev_mask = _BF (instr, 15, 0);
1566
1567
11.2k
  dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1568
11.2k
  if (bpt)
1569
3.84k
    dinfo->fprintf_func (dinfo->stream, "bpt");
1570
7.36k
  else if (ev_mask == 1)
1571
257
    dinfo->fprintf_func (dinfo->stream, "voluntary");
1572
7.11k
  else if ((!no_load) && (ev_mask == 0))
1573
446
    {
1574
446
      dinfo->fprintf_func (dinfo->stream, "kill");
1575
446
      sig_or = 0;
1576
446
    }
1577
6.66k
  else if (ev_mask == 0)
1578
415
    dinfo->fprintf_func (dinfo->stream, "--");
1579
6.25k
  else
1580
6.25k
    {
1581
6.25k
      int first_print = 1;
1582
6.25k
      unsigned int n;
1583
1584
100k
      for (n = 1; n < 16; n++)
1585
93.7k
  {
1586
93.7k
    if (!_BTST (ev_mask, n))
1587
49.3k
      continue;
1588
44.4k
    dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1589
44.4k
             (first_print) ? "" : ", ", n);
1590
44.4k
    first_print = 0;
1591
44.4k
  }
1592
6.25k
    }
1593
1594
11.2k
  dinfo->fprintf_func (dinfo->stream, "]");
1595
1596
11.2k
  if (sig_or)
1597
4.91k
    dinfo->fprintf_func (dinfo->stream, ", any");
1598
11.2k
  if (resume)
1599
6.00k
    dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1600
11.2k
  if (defer)
1601
7.97k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1602
1603
11.2k
  return 0;
1604
11.2k
}
1605
1606
static int
1607
nfp_me27_28_print_local_csr (uint64_t instr,
1608
           unsigned int src_lmext,
1609
           int num_ctx, struct disassemble_info *dinfo)
1610
2.20k
{
1611
2.20k
  unsigned int srcA = _BF (instr, 9, 0);
1612
2.20k
  unsigned int srcB = _BF (instr, 19, 10);
1613
2.20k
  unsigned int wr = _BTST (instr, 21);
1614
2.20k
  unsigned int csr_num = _BF (instr, 32, 22);
1615
2.20k
  unsigned int src = srcA;
1616
2.20k
  char src_bank = 'A';
1617
2.20k
  bool err = false;
1618
1619
2.20k
  if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1620
200
    {
1621
200
      src_bank = 'B';
1622
200
      src = srcB;
1623
200
    }
1624
1625
  /* MEv28 does not have urd/uwr.  */
1626
2.20k
  if (csr_num == 1)
1627
127
    {
1628
127
      if (wr)
1629
88
  {
1630
88
    dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1631
88
             (int) _BTST (instr, 20));
1632
88
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1633
88
               src_lmext, dinfo);
1634
88
  }
1635
39
      else
1636
39
  {
1637
39
    dinfo->fprintf_func (dinfo->stream, "urd[");
1638
39
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1639
39
               src_lmext, dinfo);
1640
39
    dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1641
39
             (int) _BTST (instr, 20));
1642
39
  }
1643
127
      dinfo->fprintf_func (dinfo->stream, "]");
1644
127
    }
1645
2.08k
  else
1646
2.08k
    {
1647
2.08k
      const char *nm = NULL;
1648
1649
2.08k
      if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1650
334
  nm = nfp_me27_28_mecsrs[csr_num];
1651
1652
2.08k
      dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1653
2.08k
         (wr) ? "wr" : "rd");
1654
2.08k
      if (nm)
1655
324
  dinfo->fprintf_func (dinfo->stream, "%s", nm);
1656
1.75k
      else
1657
1.75k
  dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1658
1659
2.08k
      if (wr)
1660
690
  {
1661
690
    dinfo->fprintf_func (dinfo->stream, ", ");
1662
690
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1663
690
               src_lmext, dinfo);
1664
690
  }
1665
2.08k
      dinfo->fprintf_func (dinfo->stream, "]");
1666
2.08k
    }
1667
1668
2.20k
  if (err)
1669
318
    return _NFP_ERR_CONT;
1670
1.89k
  return 0;
1671
2.20k
}
1672
1673
static int
1674
nfp_me27_28_print_branch (uint64_t instr,
1675
        const char *br_inpstates[16],
1676
        struct disassemble_info *dinfo)
1677
921
{
1678
921
  unsigned int br_op = _BF (instr, 4, 0);
1679
921
  unsigned int ctx_sig_state = _BF (instr, 17, 14);
1680
921
  unsigned int defer = _BF (instr, 21, 20);
1681
921
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1682
921
  int ret = 0;
1683
1684
921
  if (!nfp_me27_28_br_ops[br_op])
1685
112
    {
1686
112
      dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
1687
112
      ret = _NFP_ERR_CONT;
1688
112
    }
1689
809
  else
1690
809
    dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1691
1692
921
  switch (br_op)
1693
921
    {
1694
51
    case 16:      /* br=ctx */
1695
347
    case 17:      /* br!=ctx */
1696
529
    case 18:      /* br_signal */
1697
604
    case 19:      /* br_!signal */
1698
604
      dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1699
604
      break;
1700
11
    case 20:      /* "br_inp_state" */
1701
105
    case 21:      /* "br_!inp_state" */
1702
105
      dinfo->fprintf_func (dinfo->stream, "%s, ",
1703
105
         br_inpstates[ctx_sig_state]);
1704
105
      break;
1705
67
    case 22:      /* "br_cls_state" */
1706
83
    case 23:      /* "br_!cls_state" */
1707
83
      dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1708
83
         ctx_sig_state);
1709
83
      break;
1710
129
    default:
1711
129
      break;
1712
921
    }
1713
1714
921
  dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1715
1716
921
  if (defer)
1717
227
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1718
1719
921
  return ret;
1720
921
}
1721
1722
static int
1723
nfp_me27_28_print_br_byte (uint64_t instr,
1724
         unsigned int src_lmext, int num_ctx,
1725
         struct disassemble_info *dinfo)
1726
8.59k
{
1727
8.59k
  unsigned int srcA = _BF (instr, 7, 0);
1728
8.59k
  unsigned int by = _BF (instr, 9, 8);
1729
8.59k
  unsigned int srcB = _BF (instr, 17, 10);
1730
8.59k
  unsigned int imm_msb = _BTST (instr, 18);
1731
8.59k
  unsigned int eq = _BTST (instr, 19);
1732
8.59k
  unsigned int defer = _BF (instr, 21, 20);
1733
8.59k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1734
8.59k
  bool err = false;
1735
1736
8.59k
  if (eq)
1737
5.19k
    dinfo->fprintf_func (dinfo->stream, "br=byte[");
1738
3.39k
  else
1739
3.39k
    dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1740
1741
8.59k
  if (nfp_me_is_imm_opnd8 (srcA))
1742
3.00k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1743
3.00k
              src_lmext, imm_msb, dinfo);
1744
5.58k
  else
1745
5.58k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1746
5.58k
              src_lmext, imm_msb, dinfo);
1747
1748
8.59k
  dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1749
1750
8.59k
  if (nfp_me_is_imm_opnd8 (srcA))
1751
3.00k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1752
3.00k
              src_lmext, imm_msb, dinfo);
1753
5.58k
  else
1754
5.58k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1755
5.58k
              src_lmext, imm_msb, dinfo);
1756
1757
8.59k
  dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1758
1759
8.59k
  if (defer)
1760
3.75k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1761
1762
8.59k
  if (err)
1763
0
    return _NFP_ERR_CONT;
1764
8.59k
  return 0;
1765
8.59k
}
1766
1767
static int
1768
nfp_me27_28_print_br_bit (uint64_t instr, unsigned int src_lmext,
1769
        int num_ctx, struct disassemble_info *dinfo)
1770
3.70k
{
1771
3.70k
  unsigned int srcA = _BF (instr, 7, 0);
1772
3.70k
  unsigned int srcB = _BF (instr, 17, 10);
1773
3.70k
  unsigned int b = _BTST (instr, 18);
1774
3.70k
  unsigned int defer = _BF (instr, 21, 20);
1775
3.70k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1776
3.70k
  bool err = false;
1777
1778
3.70k
  if (b)
1779
2.52k
    dinfo->fprintf_func (dinfo->stream, "br_bset[");
1780
1.18k
  else
1781
1.18k
    dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1782
1783
3.70k
  if (nfp_me_is_imm_opnd8 (srcA))
1784
431
    {
1785
431
      err = err
1786
431
  || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1787
431
      b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1788
431
    }
1789
3.27k
  else
1790
3.27k
    {
1791
3.27k
      err = err
1792
3.27k
  || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1793
3.27k
      b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1794
3.27k
    }
1795
1796
3.70k
  dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1797
1798
3.70k
  if (defer)
1799
3.13k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1800
1801
3.70k
  if (err)
1802
0
    return _NFP_ERR_CONT;
1803
3.70k
  return 0;
1804
3.70k
}
1805
1806
static int
1807
nfp_me27_28_print_br_alu (uint64_t instr, unsigned int src_lmext,
1808
        int num_ctx, struct disassemble_info *dinfo)
1809
1.68k
{
1810
1.68k
  unsigned int srcA = _BF (instr, 9, 0);
1811
1.68k
  unsigned int srcB = _BF (instr, 19, 10);
1812
1.68k
  unsigned int defer = _BF (instr, 21, 20);
1813
1.68k
  unsigned int imm = _BF (instr, 30, 22);
1814
1.68k
  bool err = false;
1815
1816
1.68k
  if (nfp_me_is_imm_opnd10 (srcA))
1817
701
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1818
987
  else
1819
987
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1820
1821
1.68k
  if (!imm)
1822
42
    dinfo->fprintf_func (dinfo->stream, "rtn[");
1823
1.64k
  else
1824
1.64k
    dinfo->fprintf_func (dinfo->stream, "jump[");
1825
1826
1.68k
  if (nfp_me_is_imm_opnd10 (srcA))
1827
701
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1828
987
  else
1829
987
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1830
1831
1.68k
  if (imm)
1832
1.64k
    dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1833
1834
1.68k
  dinfo->fprintf_func (dinfo->stream, "]");
1835
1836
1.68k
  if (defer)
1837
461
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1838
1839
1.68k
  if (err)
1840
83
    return _NFP_ERR_CONT;
1841
1.60k
  return 0;
1842
1.68k
}
1843
1844
static int
1845
nfp_me27_28_print_mult (uint64_t instr, unsigned int pred_cc,
1846
      unsigned int dst_lmext, unsigned int src_lmext,
1847
      unsigned int gpr_wrboth,
1848
      int num_ctx, struct disassemble_info *dinfo)
1849
1.18k
{
1850
1.18k
  unsigned int srcA = _BF (instr, 9, 0);
1851
1.18k
  unsigned int srcB = _BF (instr, 19, 10);
1852
1.18k
  unsigned int mstep = _BF (instr, 22, 20);
1853
1.18k
  char dst_bank = 'A' + _BTST (instr, 23);
1854
1.18k
  unsigned int swap = _BTST (instr, 30);
1855
1.18k
  unsigned int mtype = _BF (instr, 32, 31);
1856
1.18k
  unsigned int nocc = _BTST (instr, 40);
1857
1.18k
  bool err = false;
1858
1859
1.18k
  if (swap)
1860
129
    {
1861
129
      unsigned int tmp = srcA;
1862
129
      srcA = srcB;
1863
129
      srcB = tmp;
1864
129
    }
1865
1866
1.18k
  dinfo->fprintf_func (dinfo->stream, "mul_step[");
1867
1868
1.18k
  if (mstep >= 4)
1869
179
    err = err
1870
179
      || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1871
1.00k
  else
1872
1.00k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1873
1.00k
               src_lmext, dinfo);
1874
1875
1.18k
  dinfo->fprintf_func (dinfo->stream, ", ");
1876
1877
1.18k
  if (mstep >= 4)
1878
179
    dinfo->fprintf_func (dinfo->stream, "--");
1879
1.00k
  else
1880
1.00k
    err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1881
835
               src_lmext, dinfo);
1882
1883
1.18k
  dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1884
1.18k
  if (mtype > 0)
1885
882
    {
1886
882
      const char *s = nfp_me27_28_mult_steps[mstep];
1887
882
      if (!s)
1888
89
  {
1889
89
    s = "<invalid mul_step>";
1890
89
    err = true;
1891
89
  }
1892
882
      dinfo->fprintf_func (dinfo->stream, "_%s", s);
1893
882
    }
1894
1895
1.18k
  if (nocc)
1896
449
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1897
1.18k
  if (gpr_wrboth)
1898
368
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1899
1.18k
  if (pred_cc)
1900
538
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1901
1902
1.18k
  if (err)
1903
338
    return _NFP_ERR_CONT;
1904
842
  return 0;
1905
1.18k
}
1906
1907
static int
1908
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1909
2.36M
{
1910
2.36M
  const nfp_cmd_mnemonic *a = arg_a;
1911
2.36M
  const nfp_cmd_mnemonic *b = arg_b;
1912
1913
2.36M
  if (a->cpp_target != b->cpp_target)
1914
1.10M
    return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
1915
1916
1.26M
  if (a->cpp_action != b->cpp_action)
1917
661k
    return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1918
1919
601k
  return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
1920
1.26M
}
1921
1922
static const char *
1923
nfp_me_find_mnemonic (unsigned int cpp_tgt, unsigned int cpp_act,
1924
          unsigned int cpp_tok, unsigned int cpp_len,
1925
          const nfp_cmd_mnemonic * mnemonics,
1926
          size_t mnemonics_cnt)
1927
268k
{
1928
268k
  nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1929
268k
  const nfp_cmd_mnemonic *cmd = NULL;
1930
1931
268k
  cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1932
268k
     sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1933
1934
268k
  if (!cmd)
1935
84.3k
    return NULL;
1936
1937
  /* Make sure we backtrack to the first entry that still matches the three
1938
     bsearched fields - then we simply iterate and compare cpp_len.  */
1939
194k
  while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1940
9.93k
    --cmd;
1941
1942
  /* Now compare by cpp_len and make sure we stay in range.  */
1943
199k
  for (; (cmd < (mnemonics + mnemonics_cnt))
1944
199k
       && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1945
195k
    {
1946
195k
      if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1947
180k
  return cmd->mnemonic;
1948
195k
    }
1949
1950
3.77k
  return NULL;
1951
184k
}
1952
1953
/* NFP-32xx (ME Version 2.7).  */
1954
1955
static int
1956
nfp_me27_print_cmd (uint64_t instr, int third_party_32bit,
1957
        int num_ctx, struct disassemble_info *dinfo)
1958
39.3k
{
1959
39.3k
  unsigned int srcA = _BF (instr, 7, 0);
1960
39.3k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
1961
39.3k
  unsigned int srcB = _BF (instr, 17, 10);
1962
39.3k
  unsigned int token = _BF (instr, 19, 18);
1963
39.3k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1964
39.3k
  unsigned int cpp_len = _BF (instr, 27, 25);
1965
39.3k
  unsigned int sig = _BF (instr, 31, 28);
1966
39.3k
  unsigned int tgtcmd = _BF (instr, 38, 32);
1967
39.3k
  unsigned int indref = _BTST (instr, 41);
1968
39.3k
  unsigned int mode = _BF (instr, 44, 42);
1969
1970
39.3k
  bool err = false;
1971
39.3k
  int cpp_target = -1;
1972
39.3k
  int cpp_action = -1;
1973
39.3k
  const char *mnemonic = NULL;
1974
39.3k
  unsigned int imm;
1975
39.3k
  unsigned int valBA;
1976
39.3k
  int visswap = ((mode == 1) || (mode == 3));
1977
1978
39.3k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1979
39.3k
  valBA = (srcB << 8) | srcA;
1980
1981
39.3k
  if (mode == 6)
1982
2.99k
    {
1983
2.99k
      token = 0;
1984
2.99k
      sig = 0;
1985
2.99k
      xfer = 0;
1986
2.99k
    }
1987
1988
  /* Convert tgtcmd to action/token tuple.  */
1989
39.3k
  if (_BF (tgtcmd, 6, 5) == 0x0)
1990
22.9k
    {
1991
22.9k
      switch (_BF (tgtcmd, 4, 2))
1992
22.9k
  {
1993
16.4k
  case 0:
1994
16.4k
    cpp_target = NFP_3200_CPPTGT_CAP;
1995
16.4k
    dinfo->fprintf_func (dinfo->stream, "cap[");
1996
16.4k
    break;
1997
1.33k
  case 1:
1998
1.33k
    cpp_target = NFP_3200_CPPTGT_MSF0;
1999
1.33k
    dinfo->fprintf_func (dinfo->stream, "msf0[");
2000
1.33k
    break;
2001
632
  case 2:
2002
632
    cpp_target = NFP_3200_CPPTGT_MSF1;
2003
632
    dinfo->fprintf_func (dinfo->stream, "msf1[");
2004
632
    break;
2005
1.15k
  case 3:
2006
1.15k
    cpp_target = NFP_3200_CPPTGT_PCIE;
2007
1.15k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2008
1.15k
    break;
2009
786
  case 4:
2010
786
    cpp_target = NFP_3200_CPPTGT_HASH;
2011
786
    break;
2012
975
  case 5:
2013
975
    cpp_target = NFP_3200_CPPTGT_CRYPTO;
2014
975
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2015
975
    break;
2016
897
  case 6:
2017
897
    cpp_target = NFP_3200_CPPTGT_ARM;
2018
897
    dinfo->fprintf_func (dinfo->stream, "arm[");
2019
897
    break;
2020
659
  case 7:
2021
659
    cpp_target = NFP_3200_CPPTGT_CT;
2022
659
    dinfo->fprintf_func (dinfo->stream, "ct[");
2023
659
    break;
2024
22.9k
  }
2025
22.9k
      cpp_action = _BF (tgtcmd, 1, 0);
2026
22.9k
    }
2027
16.4k
  else
2028
16.4k
    {
2029
16.4k
      switch (_BF (tgtcmd, 6, 4))
2030
16.4k
  {
2031
2.11k
  case 2:
2032
2.11k
    cpp_target = NFP_3200_CPPTGT_GS;
2033
2.11k
    dinfo->fprintf_func (dinfo->stream, "scratch[");
2034
2.11k
    break;
2035
3.47k
  case 3:
2036
3.47k
    cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM.  */
2037
3.47k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2038
3.47k
    break;
2039
3.43k
  case 4:
2040
4.90k
  case 5:
2041
4.90k
    cpp_target = NFP_3200_CPPTGT_MU;
2042
4.90k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2043
4.90k
    break;
2044
3.30k
  case 6:
2045
5.99k
  case 7:
2046
5.99k
    cpp_target = NFP_3200_CPPTGT_CLS;
2047
5.99k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2048
5.99k
    break;
2049
16.4k
  }
2050
16.4k
      cpp_action = _BF (tgtcmd, 3, 0);
2051
16.4k
    }
2052
2053
39.3k
  if (cpp_target < 0)
2054
0
    {
2055
0
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2056
0
         cpp_target, cpp_action, token);
2057
0
      return _NFP_ERR_CONT;
2058
0
    }
2059
2060
39.3k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2061
39.3k
           nfp_me27_mnemonics,
2062
39.3k
           ARRAY_SIZE (nfp_me27_mnemonics));
2063
2064
39.3k
  if (!mnemonic)
2065
8.65k
    {
2066
8.65k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2067
8.65k
         cpp_target, cpp_action, token);
2068
8.65k
      return _NFP_ERR_CONT;
2069
8.65k
    }
2070
2071
30.7k
  if (cpp_target == NFP_3200_CPPTGT_HASH)
2072
288
    {
2073
288
      dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2074
288
         mnemonic, xfer, cpp_len);
2075
288
      goto print_opt_toks;
2076
288
    }
2077
2078
30.4k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2079
2080
30.4k
  if (visswap)
2081
4.64k
    {
2082
4.64k
      unsigned int tmp = srcA;
2083
4.64k
      srcA = srcB;
2084
4.64k
      srcB = tmp;
2085
4.64k
    }
2086
2087
30.4k
  switch (mode)
2088
30.4k
    {
2089
14.9k
    case 0:     /* (A << 8) + B.  */
2090
17.9k
    case 1:     /* (B << 8) + A.  */
2091
17.9k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2092
17.9k
      err = err
2093
17.9k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2094
17.9k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2095
17.9k
      err = err
2096
17.9k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2097
17.9k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2098
17.9k
      break;
2099
1.64k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2100
3.26k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2101
3.26k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2102
3.26k
      err = err
2103
3.26k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2104
3.26k
      if (third_party_32bit)
2105
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2106
3.26k
      else
2107
3.26k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2108
3.26k
      err = err
2109
3.26k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2110
3.26k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2111
3.26k
      break;
2112
2.67k
    case 4:     /* A + B.  */
2113
2.67k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2114
2.67k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2115
2.67k
      dinfo->fprintf_func (dinfo->stream, ", ");
2116
2.67k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2117
2.67k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2118
2.67k
      break;
2119
1.55k
    case 5:     /* Immediate address.  */
2120
1.55k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2121
1.55k
         (cpp_len + 1));
2122
1.55k
      break;
2123
2.85k
    case 6:     /* Immediate address and data.  */
2124
2.85k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2125
2.85k
      break;
2126
2.13k
    case 7:     /* Immediate data.  */
2127
2.13k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2128
2.13k
         ((xfer << 16) | valBA), (cpp_len + 1));
2129
2.13k
      break;
2130
30.4k
    }
2131
2132
30.7k
 print_opt_toks:
2133
30.7k
  dinfo->fprintf_func (dinfo->stream, "]");
2134
2135
30.7k
  if (indref && (mode != 2) && (mode != 3))
2136
6.84k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2137
2138
30.7k
  if (ctxswap_defer != 3)
2139
25.8k
    {
2140
25.8k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2141
25.8k
      if (sig)
2142
11.5k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2143
14.3k
      else
2144
14.3k
  dinfo->fprintf_func (dinfo->stream, "--]");
2145
2146
25.8k
      if (ctxswap_defer != 0)
2147
9.70k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2148
25.8k
    }
2149
4.84k
  else if (sig)
2150
2.89k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2151
2152
30.7k
  if (err)
2153
0
    return _NFP_ERR_CONT;
2154
30.7k
  return 0;
2155
30.7k
}
2156
2157
static int
2158
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
2159
      struct disassemble_info *dinfo)
2160
1.13k
{
2161
1.13k
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2162
1.13k
}
2163
2164
static int
2165
nfp_me27_print_alu (uint64_t instr, int num_ctx,
2166
        struct disassemble_info *dinfo)
2167
410
{
2168
410
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2169
410
}
2170
2171
static int
2172
nfp_me27_print_immed (uint64_t instr, int num_ctx,
2173
          struct disassemble_info *dinfo)
2174
188
{
2175
188
  return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2176
188
}
2177
2178
static int
2179
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
2180
       struct disassemble_info *dinfo)
2181
184
{
2182
184
  return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2183
184
}
2184
2185
static int
2186
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2187
3.55k
{
2188
3.55k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2189
3.55k
}
2190
2191
static int
2192
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
2193
        struct disassemble_info *dinfo)
2194
198
{
2195
198
  return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2196
198
}
2197
2198
static int
2199
nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2200
251
{
2201
251
  return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
2202
251
}
2203
2204
static int
2205
nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
2206
      struct disassemble_info *dinfo)
2207
993
{
2208
993
  return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2209
993
}
2210
2211
static int
2212
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
2213
           struct disassemble_info *dinfo)
2214
568
{
2215
568
  return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2216
568
}
2217
2218
static int
2219
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
2220
           struct disassemble_info *dinfo)
2221
97
{
2222
97
  return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2223
97
}
2224
2225
static int
2226
nfp_me27_print_mult (uint64_t instr, int num_ctx,
2227
         struct disassemble_info *dinfo)
2228
351
{
2229
351
  return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2230
351
}
2231
2232
/*NFP-6xxx/4xxx (ME Version 2.8).  */
2233
2234
static int
2235
nfp_me28_print_cmd (uint64_t instr, int third_party_32bit,
2236
        int num_ctx, struct disassemble_info *dinfo)
2237
260k
{
2238
260k
  unsigned int srcA = _BF (instr, 7, 0);
2239
260k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
2240
260k
  unsigned int srcB = _BF (instr, 17, 10);
2241
260k
  unsigned int token = _BF (instr, 19, 18);
2242
260k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2243
260k
  unsigned int cpp_len = _BF (instr, 27, 25);
2244
260k
  unsigned int sig = _BF (instr, 31, 28);
2245
260k
  unsigned int tgtcmd = _BF (instr, 38, 32);
2246
260k
  unsigned int indref = _BTST (instr, 41);
2247
260k
  unsigned int mode = _BF (instr, 44, 42);
2248
2249
260k
  bool err = false;
2250
260k
  int cpp_target = -1;
2251
260k
  int cpp_action = -1;
2252
260k
  const char *mnemonic = NULL;
2253
260k
  unsigned int imm;
2254
260k
  unsigned int valBA;
2255
260k
  int visswap = ((mode == 1) || (mode == 3));
2256
2257
260k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2258
260k
  valBA = (srcB << 8) | srcA;
2259
2260
260k
  if (mode == 6)
2261
16.1k
    {
2262
16.1k
      token = 0;
2263
16.1k
      sig = 0;
2264
16.1k
      xfer = 0;
2265
16.1k
    }
2266
2267
  /* Convert tgtcmd to action/token tuple.  */
2268
260k
  if (_BF (tgtcmd, 6, 5) == 0x0)
2269
151k
    {
2270
151k
      switch (_BF (tgtcmd, 4, 2))
2271
151k
  {
2272
105k
  case 0:
2273
105k
    cpp_target = NFP_6000_CPPTGT_ILA;
2274
105k
    dinfo->fprintf_func (dinfo->stream, "ila[");
2275
105k
    break;
2276
12.3k
  case 1:
2277
12.3k
    cpp_target = NFP_6000_CPPTGT_NBI;
2278
12.3k
    dinfo->fprintf_func (dinfo->stream, "nbi[");
2279
12.3k
    break;
2280
7.59k
  case 3:
2281
7.59k
    cpp_target = NFP_6000_CPPTGT_PCIE;
2282
7.59k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2283
7.59k
    break;
2284
3.49k
  case 5:
2285
3.49k
    cpp_target = NFP_6000_CPPTGT_CRYPTO;
2286
3.49k
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2287
3.49k
    break;
2288
3.73k
  case 6:
2289
3.73k
    cpp_target = NFP_6000_CPPTGT_ARM;
2290
3.73k
    dinfo->fprintf_func (dinfo->stream, "arm[");
2291
3.73k
    break;
2292
4.03k
  case 7:
2293
4.03k
    cpp_target = NFP_6000_CPPTGT_CTXPB;
2294
4.03k
    dinfo->fprintf_func (dinfo->stream, "ct[");
2295
4.03k
    break;
2296
151k
  }
2297
151k
      cpp_action = _BF (tgtcmd, 1, 0);
2298
151k
    }
2299
109k
  else
2300
109k
    {
2301
      /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2302
   for mem/cls it's "a".  */
2303
109k
      cpp_action = _BF (tgtcmd, 4, 0);
2304
109k
      switch (_BF (tgtcmd, 6, 4))
2305
109k
  {
2306
17.1k
  case 3:
2307
17.1k
    cpp_target = NFP_6000_CPPTGT_VQDR;
2308
17.1k
    cpp_action = _BF (tgtcmd, 3, 0);
2309
17.1k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2310
17.1k
    break;
2311
23.5k
  case 4:
2312
37.1k
  case 5:
2313
37.1k
    cpp_target = NFP_6000_CPPTGT_MU;
2314
37.1k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2315
37.1k
    break;
2316
19.9k
  case 6:
2317
38.2k
  case 7:
2318
38.2k
    cpp_target = NFP_6000_CPPTGT_CLS;
2319
38.2k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2320
38.2k
    break;
2321
109k
  }
2322
109k
    }
2323
2324
260k
  if (cpp_target < 0)
2325
31.5k
    {
2326
31.5k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2327
31.5k
         cpp_target, cpp_action, token);
2328
31.5k
      return _NFP_ERR_CONT;
2329
31.5k
    }
2330
2331
229k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2332
229k
           nfp_me28_mnemonics,
2333
229k
           ARRAY_SIZE (nfp_me28_mnemonics));
2334
2335
229k
  if (!mnemonic)
2336
79.4k
    {
2337
79.4k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2338
79.4k
         cpp_target, cpp_action, token);
2339
79.4k
      return _NFP_ERR_CONT;
2340
79.4k
    }
2341
2342
149k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2343
2344
149k
  if (visswap)
2345
22.6k
    {
2346
22.6k
      unsigned int tmp = srcA;
2347
22.6k
      srcA = srcB;
2348
22.6k
      srcB = tmp;
2349
22.6k
    }
2350
2351
149k
  switch (mode)
2352
149k
    {
2353
78.7k
    case 0:     /* (A << 8) + B.  */
2354
90.6k
    case 1:     /* (B << 8) + A.  */
2355
90.6k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2356
90.6k
      err = err
2357
90.6k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2358
90.6k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2359
90.6k
      err = err
2360
90.6k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2361
90.6k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2362
90.6k
      break;
2363
11.8k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2364
22.6k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2365
22.6k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2366
22.6k
      err = err
2367
22.6k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2368
22.6k
      if (third_party_32bit)
2369
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2370
22.6k
      else
2371
22.6k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2372
22.6k
      err = err
2373
22.6k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2374
22.6k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2375
22.6k
      break;
2376
10.1k
    case 4:     /* A + B.  */
2377
10.1k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2378
10.1k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2379
10.1k
      dinfo->fprintf_func (dinfo->stream, ", ");
2380
10.1k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2381
10.1k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2382
10.1k
      break;
2383
7.37k
    case 5:     /* Immediate address.  */
2384
7.37k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2385
7.37k
         (cpp_len + 1));
2386
7.37k
      break;
2387
9.36k
    case 6:     /* Immediate address and data.  */
2388
9.36k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2389
9.36k
      break;
2390
9.71k
    case 7:     /* Immediate data.  */
2391
9.71k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2392
9.71k
         ((xfer << 16) | valBA), (cpp_len + 1));
2393
9.71k
      break;
2394
149k
    }
2395
2396
149k
  dinfo->fprintf_func (dinfo->stream, "]");
2397
2398
149k
  if (indref && (mode != 2) && (mode != 3))
2399
33.5k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2400
2401
149k
  if (ctxswap_defer != 3)
2402
127k
    {
2403
127k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2404
127k
      if (sig)
2405
50.8k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2406
76.7k
      else
2407
76.7k
  dinfo->fprintf_func (dinfo->stream, "--]");
2408
2409
127k
      if (ctxswap_defer != 0)
2410
46.5k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2411
127k
    }
2412
22.3k
  else if (sig)
2413
13.1k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2414
2415
149k
  if (err)
2416
0
    return _NFP_ERR_CONT;
2417
149k
  return 0;
2418
149k
}
2419
2420
static int
2421
nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
2422
      struct disassemble_info *dinfo)
2423
30.5k
{
2424
30.5k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2425
30.5k
  unsigned int src_lmext = _BTST (instr, 42);
2426
30.5k
  unsigned int dst_lmext = _BTST (instr, 43);
2427
30.5k
  unsigned int pred_cc = _BTST (instr, 44);
2428
2429
30.5k
  return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2430
30.5k
            src_lmext, gpr_wrboth, num_ctx, dinfo);
2431
30.5k
}
2432
2433
static int
2434
nfp_me28_print_alu (uint64_t instr, int num_ctx,
2435
        struct disassemble_info *dinfo)
2436
33.3k
{
2437
33.3k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2438
33.3k
  unsigned int src_lmext = _BTST (instr, 42);
2439
33.3k
  unsigned int dst_lmext = _BTST (instr, 43);
2440
33.3k
  unsigned int pred_cc = _BTST (instr, 44);
2441
2442
33.3k
  return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2443
33.3k
        gpr_wrboth, num_ctx, dinfo);
2444
33.3k
}
2445
2446
static int
2447
nfp_me28_print_immed (uint64_t instr, int num_ctx,
2448
          struct disassemble_info *dinfo)
2449
6.69k
{
2450
6.69k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2451
6.69k
  unsigned int dst_lmext = _BTST (instr, 43);
2452
6.69k
  unsigned int pred_cc = _BTST (instr, 44);
2453
2454
6.69k
  return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2455
6.69k
          num_ctx, dinfo);
2456
6.69k
}
2457
2458
static int
2459
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
2460
       struct disassemble_info *dinfo)
2461
1.70k
{
2462
1.70k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2463
1.70k
  unsigned int src_lmext = _BTST (instr, 42);
2464
1.70k
  unsigned int dst_lmext = _BTST (instr, 43);
2465
1.70k
  unsigned int pred_cc = _BTST (instr, 44);
2466
2467
1.70k
  return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2468
1.70k
             src_lmext, gpr_wrboth, num_ctx, dinfo);
2469
1.70k
}
2470
2471
static int
2472
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2473
7.66k
{
2474
7.66k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2475
7.66k
}
2476
2477
static int
2478
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
2479
        struct disassemble_info *dinfo)
2480
2.01k
{
2481
2.01k
  unsigned int src_lmext = _BTST (instr, 42);
2482
2483
2.01k
  return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2484
2.01k
}
2485
2486
static int
2487
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2488
670
{
2489
670
  return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2490
670
}
2491
2492
static int
2493
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
2494
      struct disassemble_info *dinfo)
2495
7.59k
{
2496
7.59k
  unsigned int src_lmext = _BTST (instr, 42);
2497
7.59k
  return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2498
7.59k
}
2499
2500
static int
2501
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
2502
           struct disassemble_info *dinfo)
2503
3.14k
{
2504
3.14k
  unsigned int src_lmext = _BTST (instr, 42);
2505
3.14k
  return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2506
3.14k
}
2507
2508
static int
2509
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
2510
           struct disassemble_info *dinfo)
2511
1.59k
{
2512
1.59k
  unsigned int src_lmext = _BTST (instr, 42);
2513
1.59k
  return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2514
1.59k
}
2515
2516
static int
2517
nfp_me28_print_mult (uint64_t instr, int num_ctx,
2518
         struct disassemble_info *dinfo)
2519
829
{
2520
829
  unsigned int gpr_wrboth = _BTST (instr, 41);
2521
829
  unsigned int src_lmext = _BTST (instr, 42);
2522
829
  unsigned int dst_lmext = _BTST (instr, 43);
2523
829
  unsigned int pred_cc = _BTST (instr, 44);
2524
2525
829
  return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2526
829
         gpr_wrboth, num_ctx, dinfo);
2527
829
}
2528
2529
static bool
2530
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2531
211
{
2532
211
  Elf_Internal_Shdr *sec = NULL;
2533
211
  Elf_Nfp_MeConfig mecfg_ent;
2534
211
  unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2535
211
  file_ptr roff = 0;
2536
211
  unsigned int sec_cnt = 0;
2537
211
  unsigned int sec_idx;
2538
211
  size_t menum_linear = 0;
2539
2540
211
  if (!dinfo->section)
2541
    /* No section info, will use default values.  */
2542
211
    return true;
2543
2544
0
  sec_cnt = elf_numsections (dinfo->section->owner);
2545
2546
  /* Find the MECONFIG section.  It's index is also in e_flags, but it has
2547
     a unique SHT and we'll use that.  */
2548
0
  for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2549
0
    {
2550
0
      sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2551
2552
0
      if (sec->sh_type == SHT_NFP_MECONFIG)
2553
0
  break;
2554
0
    }
2555
2556
0
  if (sec_idx == sec_cnt)
2557
0
    {
2558
0
      dinfo->fprintf_func (dinfo->stream, _("File has no ME-Config section."));
2559
0
      return false;
2560
0
    }
2561
2562
0
  if (sec->bfd_section == NULL)
2563
0
    {
2564
      /* See PR 31843 for an example of this.  */
2565
0
      dinfo->fprintf_func (dinfo->stream, _("The ME-Config section is corrupt."));
2566
0
      return false;
2567
0
    }
2568
2569
0
  for (roff = 0; (bfd_size_type) roff < sec->sh_size;
2570
0
       roff += sec->sh_entsize, menum_linear++)
2571
0
    {
2572
0
      nfp_priv_mecfg *mecfg;
2573
0
      int isl = menum_linear >> 3;
2574
0
      int menum = menum_linear & 7;
2575
2576
0
      if (menum_linear >= 40)
2577
0
  {
2578
0
    dinfo->fprintf_func (dinfo->stream,
2579
0
             _("File has invalid ME-Config section."));
2580
0
    return false;
2581
0
  }
2582
2583
0
      mecfg = &priv->mecfgs[isl][menum][1];
2584
2585
0
      if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
2586
0
             buffer, roff, sizeof (buffer)))
2587
0
  return false;
2588
2589
0
      mecfg_ent.ctx_enables = bfd_getl32 (buffer + offsetof (Elf_Nfp_MeConfig,
2590
0
                   ctx_enables));
2591
0
      mecfg_ent.misc_control = bfd_getl32 (buffer
2592
0
  + offsetof (Elf_Nfp_MeConfig, misc_control));
2593
2594
0
      mecfg->ctx4_mode = _BTST (mecfg_ent.ctx_enables, 31);
2595
0
      mecfg->addr_3rdparty32 = _BTST (mecfg_ent.misc_control, 4);
2596
0
      mecfg->scs_cnt = _BTST (mecfg_ent.misc_control, 2);
2597
0
    }
2598
2599
0
  return true;
2600
0
}
2601
2602
static bool
2603
init_nfp6000_mecsr_sec (nfp_priv_data * priv, Elf_Internal_Shdr * sec,
2604
      bool is_for_text, struct disassemble_info *dinfo)
2605
0
{
2606
0
  Elf_Nfp_InitRegEntry ireg;
2607
0
  unsigned char buffer[sizeof (Elf_Nfp_InitRegEntry)];
2608
0
  file_ptr ireg_off = 0;
2609
0
  size_t isl, menum;
2610
2611
0
  if (sec->sh_entsize != sizeof (ireg))
2612
0
    return false;
2613
2614
0
  isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2615
2616
  /* For these sections we know that the address will only be 32 bits
2617
     so we only need cpp_offset_lo.
2618
     Address is encoded as follows:
2619
     <31:30> 0
2620
     <29:24> island (already got this from sh_info)
2621
     <23:17> 0
2622
     <16:16> XferCsrRegSel (1 for these sections)
2623
     <15:14> 0
2624
     <13:10> DataMasterID (MEnum = this - 4)
2625
     <9:2> register (index)
2626
     <1:0> 0b0 (register byte address if appened to the previous field).  */
2627
0
  for (ireg_off = 0; (bfd_size_type) ireg_off < sec->sh_size;
2628
0
       ireg_off += sec->sh_entsize)
2629
0
    {
2630
0
      uint32_t csr_off;
2631
0
      nfp_priv_mecfg *mecfg;
2632
2633
0
      if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
2634
0
             buffer, ireg_off, sizeof (buffer)))
2635
0
  return false;
2636
2637
0
      ireg.cpp_offset_lo = bfd_getl32 (buffer
2638
0
  + offsetof (Elf_Nfp_InitRegEntry, cpp_offset_lo));
2639
0
      ireg.mask = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, mask));
2640
0
      ireg.val = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, val));
2641
0
      ireg.w0 = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, w0));
2642
2643
0
      if (NFP_IREG_ENTRY_WO_NLW (ireg.w0))
2644
0
  continue;
2645
2646
      /* Only consider entries that are permanent for runtime.  */
2647
0
      if ((NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_CONST)
2648
0
    && (NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_FORCE))
2649
0
  continue;
2650
2651
0
      menum = _BF (ireg.cpp_offset_lo, 13, 10) - 4;
2652
0
      csr_off = _BF (ireg.cpp_offset_lo, 9, 0);
2653
2654
0
      if (isl >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2655
0
  return false;
2656
  
2657
0
      mecfg = &priv->mecfgs[isl][menum][is_for_text];
2658
0
      switch (csr_off)
2659
0
  {
2660
0
  case _NFP_ME27_28_CSR_CTX_ENABLES:
2661
0
    mecfg->ctx4_mode = _BTST (ireg.val, 31);
2662
0
    break;
2663
0
  case _NFP_ME27_28_CSR_MISC_CONTROL:
2664
0
    mecfg->addr_3rdparty32 = _BTST (ireg.val, 4);
2665
0
    mecfg->scs_cnt = _BTST (ireg.val, 2);
2666
0
    break;
2667
0
  default:
2668
0
    break;
2669
0
  }
2670
0
    }
2671
2672
0
  return true;
2673
0
}
2674
2675
static bool
2676
init_nfp6000_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2677
551
{
2678
551
  int mecfg_orders[64][2];
2679
551
  size_t isl;
2680
551
  unsigned int sec_cnt = 0;
2681
551
  unsigned int sec_idx;
2682
551
  bool is_for_text;
2683
2684
551
  memset (mecfg_orders, -1, sizeof (mecfg_orders));
2685
2686
551
  if (dinfo->section == NULL
2687
123
      || dinfo->section->owner == NULL
2688
123
      || elf_elfsections (dinfo->section->owner) == NULL)
2689
    /* No section info, will use default values.  */
2690
549
    return true;
2691
2692
2
  sec_cnt = elf_numsections (dinfo->section->owner);
2693
2694
  /* Go through all MECSR init sections to find ME configs.  */
2695
72
  for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2696
70
    {
2697
70
      Elf_Internal_Shdr *sec;
2698
70
      int sec_order;
2699
2700
70
      sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2701
70
      sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
2702
2703
70
      is_for_text = (sec->sh_flags & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2704
2705
      /* If we have an init2 section, that is the one that applies to the
2706
   ME when executing init code.  So we make it's order higher than
2707
   any plain init section.  */
2708
70
      if (sec->sh_flags & SHF_NFP_INIT2)
2709
0
  sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
2710
2711
70
      if (sec->sh_type != SHT_NFP_INITREG)
2712
70
  continue;
2713
0
      if (!SHI_NFP_6000_IS_IREG_MECSR (sec->sh_info))
2714
0
  continue;
2715
2716
0
      isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2717
0
      if ((sec_order < mecfg_orders[isl][is_for_text]))
2718
  /* Lower order or transient, skip it.  */
2719
0
  continue;
2720
2721
0
      mecfg_orders[isl][is_for_text] = sec_order;
2722
2723
0
      if (!init_nfp6000_mecsr_sec (priv, sec, is_for_text, dinfo))
2724
0
  {
2725
0
    dinfo->fprintf_func (dinfo->stream,
2726
0
             _("Error processing section %u "), sec_idx);
2727
0
    return false;
2728
0
  }
2729
0
    }
2730
2731
2
  return true;
2732
2
}
2733
2734
static bool
2735
nfp_parse_option (const char *option, void *data)
2736
0
{
2737
0
  nfp_opts *opts = data;
2738
2739
0
  if (strcmp (option, "no-pc") == 0)
2740
0
    opts->show_pc = 0;
2741
0
  else if (strcmp (option, "ctx4") == 0)
2742
0
    {
2743
0
      if (!opts->ctx_mode)
2744
0
  opts->ctx_mode = 4;
2745
0
    }
2746
0
  else if (strcmp (option, "ctx8") == 0)
2747
0
    opts->ctx_mode = 8;
2748
0
  else
2749
0
    {
2750
0
      opcodes_error_handler (_("invalid NFP option: %s"), option);
2751
0
      return false;
2752
0
    }
2753
0
  return true;
2754
0
}
2755
2756
static int
2757
parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
2758
477k
{
2759
477k
  if (!for_each_disassembler_option (dinfo, nfp_parse_option, opts))
2760
0
    return _NFP_ERR_STOP;
2761
2762
477k
  return 0;
2763
477k
}
2764
2765
/* Called on first disassembly attempt so that dinfo->section is valid
2766
   so that we can get the bfd owner to find ME configs.  */
2767
2768
static nfp_priv_data *
2769
init_nfp_priv (struct disassemble_info *dinfo)
2770
477k
{
2771
477k
  nfp_priv_data *priv;
2772
477k
  int ret = false;
2773
2774
477k
  if (dinfo->private_data)
2775
475k
    return (nfp_priv_data *) dinfo->private_data;
2776
2777
#if 0  /* Right now only section-related info is kept in priv.
2778
    So don't even calloc it if we don't need it.  */
2779
  if (!dinfo->section)
2780
     return NULL;
2781
#endif
2782
2783
  /* Alloc with no free, seems to be either this or a static global variable
2784
     and this at least keeps a large struct unallocated until really needed.  */
2785
1.12k
  priv = calloc (1, sizeof (*priv));
2786
1.12k
  if (!priv)
2787
0
    return NULL;
2788
2789
1.12k
  switch (dinfo->mach)
2790
1.12k
    {
2791
211
    case E_NFP_MACH_3200:
2792
211
      ret = init_nfp3200_priv (priv, dinfo);
2793
211
      break;
2794
551
    case E_NFP_MACH_6000:
2795
551
      ret = init_nfp6000_priv (priv, dinfo);
2796
551
      break;
2797
1.12k
    }
2798
2799
1.12k
  if (!ret)
2800
365
    {
2801
365
      free (priv);
2802
365
      return NULL;
2803
365
    }
2804
2805
762
  dinfo->private_data = priv;
2806
762
  return priv;
2807
1.12k
}
2808
2809
static int
2810
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2811
477k
{
2812
477k
  nfp_priv_data *priv = init_nfp_priv (dinfo);
2813
477k
  bfd_byte buffer[8];
2814
477k
  int err;
2815
477k
  uint64_t instr = 0;
2816
477k
  size_t island, menum;
2817
477k
  int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2818
477k
  int is_text = 1;
2819
2820
477k
  err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2821
477k
  if (err)
2822
786
    return _NFP_ERR_STOP;
2823
2824
476k
  if (!dinfo->section)
2825
229k
    {
2826
229k
      num_ctx = 8;
2827
229k
      scs_cnt = 0;
2828
229k
      addr_3rdparty32 = 0;
2829
229k
    }
2830
246k
  else
2831
246k
    {
2832
246k
      unsigned int sh_info = 0;
2833
246k
      nfp_priv_mecfg *mecfg;
2834
2835
      /* We have a section, presumably all ELF sections.  Try to find
2836
   proper ME configs to produce better disassembly.  */
2837
246k
      if (!priv)
2838
0
  return _NFP_ERR_STOP; /* Sanity check */
2839
2840
246k
      is_text = (elf_section_flags (dinfo->section)
2841
246k
     & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2842
2843
246k
      sh_info = elf_section_info (dinfo->section);
2844
2845
246k
      switch (dinfo->mach)
2846
246k
  {
2847
0
  case E_NFP_MACH_3200:
2848
0
    island = SHI_NFP_3200_ISLAND (sh_info);
2849
0
    menum = SHI_NFP_3200_MENUM (sh_info);
2850
0
    break;
2851
246k
  default:
2852
246k
    island = SHI_NFP_ISLAND (sh_info);
2853
246k
    menum = SHI_NFP_MENUM (sh_info);
2854
246k
    break;
2855
246k
  }
2856
2857
246k
      if (island >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2858
1
  {
2859
1
    dinfo->fprintf_func (dinfo->stream, "Invalid island or me.");
2860
1
    return _NFP_ERR_STOP;
2861
1
  }
2862
2863
246k
      mecfg = &priv->mecfgs[island][menum][is_text];
2864
246k
      num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2865
246k
      addr_3rdparty32 = mecfg->addr_3rdparty32;
2866
246k
      scs_cnt = mecfg->scs_cnt;
2867
246k
    }
2868
2869
476k
  if (opts->ctx_mode)
2870
0
    num_ctx = opts->ctx_mode;
2871
2872
476k
  dinfo->bytes_per_line = 8;
2873
476k
  dinfo->bytes_per_chunk = 8;
2874
2875
476k
  instr = bfd_getl64 (buffer);
2876
2877
476k
  if (opts->show_pc)
2878
476k
    {
2879
476k
      pc = (int) (addr >> 3);
2880
2881
      /* Guess max PC for formatting */
2882
476k
      tmpj = (int) (dinfo->buffer_length >> 3);
2883
476k
      if (scs_cnt == 1)
2884
0
  {
2885
0
    pc *= 2;
2886
0
    tmpj *= 2;
2887
0
    if (! !(menum & 1))
2888
0
      {
2889
0
        pc++;
2890
0
        tmpj++;
2891
0
      }
2892
0
  }
2893
2894
1.61M
      for (tmpi = 1; tmpj > 9; tmpj /= 10)
2895
1.13M
  tmpi++;
2896
2897
476k
      tmpj = pc;
2898
1.55M
      for (; tmpj > 9; tmpj /= 10)
2899
1.07M
  tmpi--;
2900
2901
476k
      dinfo->fprintf_func (dinfo->stream, "%*c%d  ", tmpi, '.', pc);
2902
476k
    }
2903
2904
476k
  switch (dinfo->mach)
2905
476k
    {
2906
60.3k
    case E_NFP_MACH_3200:
2907
60.3k
      if (NFP_ME27_INSTR_IS_CMD (instr))
2908
39.3k
  err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2909
20.9k
      else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2910
1.13k
  err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2911
19.8k
      else if (NFP_ME27_INSTR_IS_ALU (instr))
2912
410
  err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2913
19.4k
      else if (NFP_ME27_INSTR_IS_IMMED (instr))
2914
188
  err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2915
19.2k
      else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2916
184
  err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2917
19.0k
      else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2918
3.55k
  err = nfp_me27_print_ctx_arb (instr, dinfo);
2919
15.4k
      else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2920
198
  err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2921
15.2k
      else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2922
251
  err = nfp_me27_print_branch (instr, dinfo);
2923
15.0k
      else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2924
993
  err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2925
14.0k
      else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2926
568
  err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2927
13.4k
      else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2928
97
  err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2929
13.3k
      else if (NFP_ME27_INSTR_IS_MULT (instr))
2930
351
  err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2931
13.0k
      else
2932
13.0k
  err = nfp_me_print_invalid (instr, dinfo);
2933
60.3k
      break;
2934
2935
415k
    case E_NFP_MACH_6000:
2936
415k
      if (NFP_ME28_INSTR_IS_CMD (instr))
2937
260k
  err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2938
154k
      else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2939
30.5k
  err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2940
124k
      else if (NFP_ME28_INSTR_IS_ALU (instr))
2941
33.3k
  err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2942
90.6k
      else if (NFP_ME28_INSTR_IS_IMMED (instr))
2943
6.69k
  err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2944
83.9k
      else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2945
1.70k
  err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2946
82.2k
      else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2947
7.66k
  err = nfp_me28_print_ctx_arb (instr, dinfo);
2948
74.6k
      else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2949
2.01k
  err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2950
72.6k
      else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2951
670
  err = nfp_me28_print_branch (instr, dinfo);
2952
71.9k
      else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2953
7.59k
  err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2954
64.3k
      else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2955
3.14k
  err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2956
61.2k
      else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2957
1.59k
  err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2958
59.6k
      else if (NFP_ME28_INSTR_IS_MULT (instr))
2959
829
  err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2960
58.7k
      else
2961
58.7k
  err = nfp_me_print_invalid (instr, dinfo);
2962
415k
      break;
2963
476k
    }
2964
2965
476k
  if (err < 0)
2966
206k
    return err;
2967
269k
  return 8;
2968
476k
}
2969
2970
int
2971
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2972
477k
{
2973
477k
  nfp_opts opts;
2974
477k
  int err;
2975
2976
477k
  opts.show_pc = 1;
2977
477k
  opts.ctx_mode = 0;
2978
477k
  err = parse_disassembler_options (&opts, dinfo);
2979
477k
  if (err < 0)
2980
0
    goto end;
2981
2982
477k
  err = _print_instrs (addr, dinfo, &opts);
2983
2984
477k
 end:
2985
477k
  if (err != 8)
2986
207k
    dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2987
477k
  if (err == _NFP_ERR_CONT)
2988
206k
    return 8;
2989
270k
  return err;
2990
477k
}
2991
2992
void
2993
print_nfp_disassembler_options (FILE * stream)
2994
0
{
2995
0
  fprintf (stream, _("\n\
2996
0
The following NFP specific disassembler options are supported for use\n\
2997
0
with the -M switch (multiple options should be separated by commas):\n"));
2998
2999
0
  fprintf (stream, _("\n\
3000
0
  no-pc       Don't print program counter prefix.\n\
3001
0
  ctx4        Force disassembly using 4-context mode.\n\
3002
0
  ctx8        Force 8-context mode, takes precedence."));
3003
3004
  fprintf (stream, _("\n"));
3005
0
}