Coverage Report

Created: 2026-03-10 08:46

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
586
#define _NFP_ERR_STOP -1
39
454k
#define _NFP_ERR_CONT -8
40
41
839k
#define _BTST(v, b)               (((v) >> b) & 1)
42
4.37M
#define _BF(v, msb, lsb)          (((v) >> (lsb)) & \
43
4.37M
           ((1U << ((msb) - (lsb) + 1)) - 1))
44
279k
#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
325k
#define _NFP_ISLAND_MAX 64
50
162k
#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
50.2k
{
930
50.2k
  const char * err_msg = N_("<invalid_instruction>:");
931
50.2k
  dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
932
50.2k
  return _NFP_ERR_CONT;
933
50.2k
}
934
935
static bool
936
nfp_me_is_imm_opnd10 (unsigned int opnd)
937
36.9k
{
938
36.9k
  return _BF (opnd, 9, 8) == 0x3;
939
36.9k
}
940
941
static bool
942
nfp_me_is_imm_opnd8 (unsigned int opnd)
943
43.0k
{
944
43.0k
  return _BTST (opnd, 5);
945
43.0k
}
946
947
static unsigned int
948
nfp_me_imm_opnd10 (unsigned int opnd)
949
4.20k
{
950
4.20k
  return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
951
4.20k
}
952
953
static unsigned int
954
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
955
2.71k
{
956
2.71k
  unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
957
958
2.71k
  return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
959
2.71k
}
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
46.4k
{
967
46.4k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
968
969
  /* Absolute GPR.  */
970
46.4k
  if (_BF (opnd, 9, 7) == 0x1)
971
6.99k
    dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
972
973
  /* Relative GPR.  */
974
39.4k
  else if (_BF (opnd, 9, 6) == 0x0)
975
6.24k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
976
977
  /* Indexed Xfer.  */
978
33.2k
  else if (_BF (opnd, 9, 7) == 0x2)
979
4.35k
    {
980
4.35k
      dinfo->fprintf_func (dinfo->stream, "*$index");
981
4.35k
      if (_BF (opnd, 2, 1) == 0x1)
982
882
  dinfo->fprintf_func (dinfo->stream, "++");
983
3.46k
      else if (_BF (opnd, 2, 1) == 0x2)
984
1.33k
  dinfo->fprintf_func (dinfo->stream, "--");
985
4.35k
    }
986
987
  /* Relative Xfer.  */
988
28.8k
  else if (_BF (opnd, 9, 7) == 0x3)
989
4.98k
    {
990
4.98k
      if (_BTST (opnd, 6))
991
2.58k
  n += (num_ctx == 8 ? 16 : 32);
992
4.98k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
993
4.98k
    }
994
995
  /* Indexed Next Neighbour.  */
996
23.8k
  else if (_BF (opnd, 9, 6) == 0x9)
997
3.93k
    {
998
3.93k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
999
3.93k
      if (_BTST (opnd, 1))
1000
2.76k
  dinfo->fprintf_func (dinfo->stream, "++");
1001
3.93k
    }
1002
1003
  /* Relative Next Neighbour.  */
1004
19.9k
  else if (_BF (opnd, 9, 6) == 0xa)
1005
4.39k
    {
1006
4.39k
      dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1007
4.39k
    }
1008
1009
  /* Indexed LMEM.  */
1010
15.5k
  else if (_BF (opnd, 9, 6) == 0x8)
1011
3.49k
    {
1012
3.49k
      n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1013
3.49k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1014
3.49k
      if (_BTST (opnd, 4))
1015
1.27k
  dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1016
2.21k
      else if (_BF (opnd, 3, 0))
1017
1.95k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1018
3.49k
    }
1019
1020
  /* 8-bit Constant value.  */
1021
12.0k
  else if (_BF (opnd, 9, 8) == 0x3)
1022
5.81k
    dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1023
1024
6.23k
  else
1025
6.23k
    {
1026
6.23k
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1027
6.23k
      return false;
1028
6.23k
    }
1029
1030
40.2k
  return true;
1031
46.4k
}
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
246k
{
1040
246k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1041
1042
  /* Relative GPR.  */
1043
246k
  if (_BF (opnd, 7, 5) == 0x0)
1044
107k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1045
1046
  /* Relative Xfer.  */
1047
139k
  else if (_BF (opnd, 7, 5) == 0x4)
1048
24.0k
    dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1049
1050
  /* Relative Xfer.  */
1051
115k
  else if (_BF (opnd, 7, 5) == 0x6)
1052
21.5k
    {
1053
21.5k
      n += (num_ctx == 8 ? 16 : 32);
1054
21.5k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1055
21.5k
    }
1056
1057
  /* Indexed Xfer.  */
1058
94.0k
  else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1059
11.1k
    {
1060
11.1k
      dinfo->fprintf_func (dinfo->stream, "*$index");
1061
11.1k
      if (_BF (opnd, 2, 1) == 0x1)
1062
3.19k
  dinfo->fprintf_func (dinfo->stream, "++");
1063
7.99k
      else if (_BF (opnd, 2, 1) == 0x2)
1064
1.27k
  dinfo->fprintf_func (dinfo->stream, "--");
1065
11.1k
    }
1066
1067
  /* Indexed NN.  */
1068
82.8k
  else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1069
5.90k
    {
1070
5.90k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
1071
5.90k
      if (_BTST (opnd, 1))
1072
2.54k
  dinfo->fprintf_func (dinfo->stream, "++");
1073
5.90k
    }
1074
1075
  /* Indexed LMEM.  */
1076
76.9k
  else if (_BF (opnd, 7, 4) == 0x5)
1077
9.78k
    {
1078
9.78k
      n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1079
9.78k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1080
9.78k
      if (_BF (opnd, 2, 0))
1081
7.63k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1082
9.78k
    }
1083
1084
  /* 7+1-bit Constant value.  */
1085
67.2k
  else if (_BTST (opnd, 5))
1086
67.2k
    {
1087
67.2k
      n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1088
67.2k
      dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1089
67.2k
    }
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
246k
  return true;
1098
246k
}
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
22.7k
{
1106
22.7k
  unsigned int op = _BF (instr, 35, 33);
1107
22.7k
  unsigned int srcA = _BF (instr, 7, 0);
1108
22.7k
  unsigned int srcB = _BF (instr, 17, 10);
1109
22.7k
  unsigned int dst = _BF (instr, 27, 20);
1110
22.7k
  unsigned int sc = _BF (instr, 9, 8);
1111
22.7k
  unsigned int imm_msb = _BTST (instr, 18);
1112
22.7k
  unsigned int swap = _BTST (instr, 19);
1113
22.7k
  unsigned int shift = _BF (instr, 32, 28);
1114
22.7k
  char dst_bank = 'A' + _BTST (instr, 36);
1115
22.7k
  unsigned int nocc = _BTST (instr, 40);
1116
22.7k
  bool err = false;
1117
1118
22.7k
  if (swap)
1119
10.5k
    {
1120
10.5k
      unsigned int tmp = srcA;
1121
10.5k
      srcA = srcB;
1122
10.5k
      srcB = tmp;
1123
10.5k
    }
1124
1125
  /* alu_shf, dbl_shf, asr.  */
1126
22.7k
  if (op < 7)
1127
19.3k
    {
1128
19.3k
      if (sc == 3)
1129
4.36k
  dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1130
14.9k
      else if (op == 6)
1131
1.34k
  dinfo->fprintf_func (dinfo->stream, "asr[");
1132
13.5k
      else
1133
13.5k
  dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1134
1135
      /* dest operand */
1136
19.3k
      if (nfp_me_is_imm_opnd8 (dst))
1137
8.32k
  dinfo->fprintf_func (dinfo->stream, "--");
1138
10.9k
      else
1139
10.9k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1140
10.9k
            dst_lmext, imm_msb, dinfo);
1141
1142
19.3k
      dinfo->fprintf_func (dinfo->stream, ", ");
1143
1144
      /* A operand.  */
1145
19.3k
      if (op != 6)
1146
17.5k
  {
1147
17.5k
    if ((op < 2) && (sc != 3))  /* Not dbl_shf.  */
1148
5.49k
      dinfo->fprintf_func (dinfo->stream, "--");  /* B or ~B operator.  */
1149
12.0k
    else
1150
12.0k
      err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1151
12.0k
                num_ctx, src_lmext, imm_msb,
1152
12.0k
                dinfo);
1153
1154
17.5k
    dinfo->fprintf_func (dinfo->stream, ", ");
1155
1156
    /* Operator (not for dbl_shf).  */
1157
17.5k
    if (sc != 3)
1158
13.5k
      {
1159
13.5k
        dinfo->fprintf_func (dinfo->stream, "%s, ",
1160
13.5k
           nfp_mealu_shf_op[op]);
1161
13.5k
      }
1162
17.5k
  }
1163
1164
      /* B operand.  */
1165
19.3k
      err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1166
19.3k
          num_ctx, src_lmext, imm_msb, dinfo);
1167
1168
19.3k
      dinfo->fprintf_func (dinfo->stream, ", ");
1169
1170
      /* Shift */
1171
19.3k
      if (sc == 0)
1172
7.03k
  dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1173
12.2k
      else if (sc == 2)
1174
3.73k
  {
1175
3.73k
    if (shift)
1176
3.43k
      dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1177
302
    else
1178
302
      dinfo->fprintf_func (dinfo->stream, "<<indirect");
1179
3.73k
  }
1180
8.53k
      else
1181
8.53k
  {
1182
8.53k
    if (shift)
1183
7.69k
      dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1184
843
    else
1185
843
      dinfo->fprintf_func (dinfo->stream, ">>indirect");
1186
8.53k
  }
1187
19.3k
    }
1188
  /* Byte Align.  */
1189
3.49k
  else if (op == 7)
1190
3.49k
    {
1191
3.49k
      dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1192
3.49k
         ((sc == 2) ? "le" : "be"));
1193
1194
      /* Dest operand.  */
1195
3.49k
      if (nfp_me_is_imm_opnd8 (dst))
1196
2.32k
  dinfo->fprintf_func (dinfo->stream, "--");
1197
1.17k
      else
1198
1.17k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1199
1.17k
            dst_lmext, imm_msb, dinfo);
1200
1201
3.49k
      dinfo->fprintf_func (dinfo->stream, ", ");
1202
1203
3.49k
      if (sc == 2)
1204
521
  err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1205
521
            0, imm_msb, dinfo);
1206
2.97k
      else
1207
2.97k
  err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1208
2.97k
            0, imm_msb, dinfo);
1209
3.49k
    }
1210
1211
22.7k
  dinfo->fprintf_func (dinfo->stream, "]");
1212
22.7k
  if (nocc)
1213
11.4k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1214
22.7k
  if (gpr_wrboth)
1215
10.6k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1216
22.7k
  if (pred_cc)
1217
9.07k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1218
1219
22.7k
  if (err)
1220
0
    return _NFP_ERR_CONT;
1221
22.7k
  return 0;
1222
22.7k
}
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
22.9k
{
1230
22.9k
  unsigned int op = _BF (instr, 35, 31);
1231
22.9k
  unsigned int srcA = _BF (instr, 9, 0);
1232
22.9k
  unsigned int srcB = _BF (instr, 19, 10);
1233
22.9k
  unsigned int dst = _BF (instr, 29, 20);
1234
22.9k
  unsigned int swap = _BTST (instr, 30);
1235
22.9k
  char dst_bank = 'A' + _BTST (instr, 36);
1236
22.9k
  unsigned int nocc = _BTST (instr, 40);
1237
22.9k
  int do_close_bracket = 1;
1238
22.9k
  bool err = false;
1239
1240
22.9k
  if (swap)
1241
6.59k
    {
1242
6.59k
      unsigned int tmp = srcA;
1243
6.59k
      srcA = srcB;
1244
6.59k
      srcB = tmp;
1245
6.59k
    }
1246
1247
22.9k
  switch (op)
1248
22.9k
    {
1249
769
    case 3:     /* pop_count3[dst, srcB] */
1250
1.22k
    case 6:     /* pop_count1[srcB] */
1251
1.74k
    case 7:     /* pop_count2[srcB] */
1252
2.56k
    case 14:      /* ffs[dst, srcB] */
1253
4.33k
    case 15:      /* cam_read_tag[dst, srcB] */
1254
5.18k
    case 31:      /* cam_read_state[dst, srcB] */
1255
5.18k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1256
1257
      /* No dest for pop_count1/2.  */
1258
5.18k
      if ((op != 6) && (op != 7))
1259
4.21k
  {
1260
    /* dest operand */
1261
4.21k
    if (nfp_me_is_imm_opnd10 (dst))
1262
1.11k
      dinfo->fprintf_func (dinfo->stream, "--");
1263
3.09k
    else
1264
3.09k
      err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1265
3.09k
                 dst_lmext, dinfo);
1266
1267
4.21k
    dinfo->fprintf_func (dinfo->stream, ", ");
1268
4.21k
  }
1269
1270
      /* B operand.  */
1271
5.18k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1272
4.67k
           num_ctx, src_lmext, dinfo);
1273
5.18k
      break;
1274
 
1275
      /* cam_clear.  */
1276
529
    case 11:
1277
529
      do_close_bracket = 0;
1278
529
      dinfo->fprintf_func (dinfo->stream, "cam_clear");
1279
529
      break;
1280
1281
      /* cam_lookup.  */
1282
1.36k
    case 23:
1283
1.36k
      do_close_bracket = 0;
1284
1.36k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1285
1286
      /* Dest operand.  */
1287
1.36k
      if (nfp_me_is_imm_opnd10 (dst))
1288
264
  dinfo->fprintf_func (dinfo->stream, "--");
1289
1.10k
      else
1290
1.10k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1291
1.10k
             dst_lmext, dinfo);
1292
1293
1.36k
      dinfo->fprintf_func (dinfo->stream, ", ");
1294
1295
      /* A operand.  */
1296
1.36k
      err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1297
1.23k
           num_ctx, src_lmext, dinfo);
1298
1299
1.36k
      dinfo->fprintf_func (dinfo->stream, "]");
1300
1301
1.36k
      if (_BF (srcB, 1, 0))
1302
1.09k
  {
1303
1.09k
    unsigned int n = _BTST (srcB, 1);
1304
1.09k
    if (_BTST (srcB, 4))  /* Only for MEv28.  */
1305
217
      n += 2;
1306
1.09k
    dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1307
1.09k
             _BF (srcB, 3, 2));
1308
1.09k
  }
1309
1310
1.36k
      break;
1311
1312
1.63k
    case 19:      /* cam_write.  */
1313
2.30k
    case 27:      /* cam_write_state.  */
1314
2.30k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1315
2.30k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1316
2.30k
           num_ctx, src_lmext, dinfo);
1317
2.30k
      dinfo->fprintf_func (dinfo->stream, ", ");
1318
2.30k
      if (op == 19)
1319
1.63k
  {
1320
1.63k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1321
1.48k
               num_ctx, src_lmext, dinfo);
1322
1.63k
    dinfo->fprintf_func (dinfo->stream, ", ");
1323
1.63k
  }
1324
2.30k
      dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1325
2.30k
      break;
1326
1327
      /* CRC.  */
1328
963
    case 18:  
1329
963
      do_close_bracket = 0;
1330
963
      dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1331
963
         _BTST (srcA, 3) ? "le" : "be");
1332
963
      if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
1333
187
  {
1334
187
    dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1335
187
    err = true;
1336
187
  }
1337
776
      else
1338
776
  {
1339
776
    dinfo->fprintf_func (dinfo->stream, "%s, ",
1340
776
             nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
1341
776
  }
1342
1343
      /* Dest operand.  */
1344
963
      if (nfp_me_is_imm_opnd10 (dst))
1345
190
  dinfo->fprintf_func (dinfo->stream, "--");
1346
773
      else
1347
773
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1348
615
             dst_lmext, dinfo);
1349
1350
963
      dinfo->fprintf_func (dinfo->stream, ", ");
1351
1352
      /* B operand.  */
1353
963
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1354
696
           num_ctx, src_lmext, dinfo);
1355
1356
963
      dinfo->fprintf_func (dinfo->stream, "]");
1357
963
      if (_BF (srcA, 2, 0))
1358
731
  dinfo->fprintf_func (dinfo->stream, ", %s",
1359
731
           nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
1360
963
      if (_BTST (srcA, 4))
1361
398
  dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1362
963
      break;
1363
1364
12.5k
    default:
1365
      /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs).  */
1366
12.5k
      dinfo->fprintf_func (dinfo->stream, "alu[");
1367
1368
      /* Dest operand.  */
1369
12.5k
      if (nfp_me_is_imm_opnd10 (dst))
1370
4.15k
  dinfo->fprintf_func (dinfo->stream, "--");
1371
8.39k
      else
1372
8.39k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1373
8.39k
             dst_lmext, dinfo);
1374
12.5k
      dinfo->fprintf_func (dinfo->stream, ", ");
1375
1376
      /* A operand.  */
1377
12.5k
      if ((op == 0) || (op == 4))  /* B only operators.  */
1378
1.10k
  dinfo->fprintf_func (dinfo->stream, "--");
1379
11.4k
      else
1380
11.4k
  err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1381
10.1k
             num_ctx, src_lmext, dinfo);
1382
1383
12.5k
      if (!nfp_me27_28_alu_op[op])
1384
3.66k
  {
1385
3.66k
    dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1386
3.66k
    err = true;
1387
3.66k
  }
1388
8.88k
      else
1389
8.88k
  {
1390
8.88k
    dinfo->fprintf_func (dinfo->stream, ", %s, ",
1391
8.88k
             nfp_me27_28_alu_op[op]);
1392
8.88k
  }
1393
1394
      /* B operand.  */
1395
12.5k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1396
7.33k
           num_ctx, src_lmext, dinfo);
1397
12.5k
      break;
1398
22.9k
    }
1399
1400
22.9k
  if (do_close_bracket)
1401
20.0k
    dinfo->fprintf_func (dinfo->stream, "]");
1402
1403
22.9k
  if (nocc)
1404
11.9k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1405
22.9k
  if (gpr_wrboth)
1406
10.7k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1407
22.9k
  if (pred_cc)
1408
9.80k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1409
1410
22.9k
  if (err)
1411
7.89k
    return _NFP_ERR_CONT;
1412
15.0k
  return 0;
1413
22.9k
}
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
2.84k
{
1421
2.84k
  unsigned int srcA = _BF (instr, 9, 0);
1422
2.84k
  unsigned int srcB = _BF (instr, 19, 10);
1423
2.84k
  unsigned int imm = _BF (instr, 27, 20);
1424
2.84k
  unsigned int by = _BTST (instr, 29);
1425
2.84k
  unsigned int wd = _BTST (instr, 30);
1426
2.84k
  unsigned int inv = _BTST (instr, 31);
1427
2.84k
  unsigned int byte_shift = _BF (instr, 34, 33);
1428
2.84k
  bool err = false;
1429
1430
2.84k
  if (nfp_me_is_imm_opnd10 (srcB))
1431
577
    {
1432
577
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1433
577
      if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
1434
0
  {
1435
0
    dinfo->fprintf_func (dinfo->stream, "nop");
1436
0
    return 0;
1437
0
  }
1438
577
    }
1439
2.26k
  else
1440
2.26k
    {
1441
2.26k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1442
2.26k
    }
1443
1444
2.84k
  if (inv)
1445
1.76k
    imm = (imm ^ 0xffff) | 0xffff0000U;
1446
1447
2.84k
  if (by)
1448
1.85k
    {
1449
1.85k
      dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1450
1.85k
      imm &= 0xff;
1451
1.85k
    }
1452
993
  else if (wd)
1453
306
    {
1454
306
      dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1455
306
      imm &= 0xffff;
1456
306
    }
1457
687
  else
1458
687
    dinfo->fprintf_func (dinfo->stream, "immed[");
1459
1460
  /* Dest.  */
1461
2.84k
  if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1462
178
    dinfo->fprintf_func (dinfo->stream, "--");  /* No Dest.  */
1463
2.66k
  else if (nfp_me_is_imm_opnd10 (srcA))
1464
170
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1465
2.49k
  else
1466
2.49k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1467
1468
2.84k
  dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1469
1470
2.84k
  if ((!by) && (!wd) && (byte_shift))
1471
437
    dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1472
1473
2.84k
  dinfo->fprintf_func (dinfo->stream, "]");
1474
1475
2.84k
  if (gpr_wrboth)
1476
1.12k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1477
2.84k
  if (pred_cc)
1478
1.70k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1479
1480
2.84k
  if (err)
1481
859
    return _NFP_ERR_CONT;
1482
1.98k
  return 0;
1483
2.84k
}
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.33k
{
1491
1.33k
  unsigned int load_cc = _BTST (instr, 34);
1492
1.33k
  unsigned int shift = _BF (instr, 32, 28);
1493
1.33k
  unsigned int byte_mask = _BF (instr, 27, 24);
1494
1.33k
  unsigned int zerof = _BTST (instr, 20);
1495
1.33k
  unsigned int swap = _BTST (instr, 19);
1496
1.33k
  unsigned int imm_msb = _BTST (instr, 18);
1497
1.33k
  unsigned int src = _BF (instr, 17, 10);
1498
1.33k
  unsigned int sc = _BF (instr, 9, 8);
1499
1.33k
  unsigned int dst = _BF (instr, 7, 0);
1500
1.33k
  bool err = false;
1501
1502
1.33k
  if (swap)
1503
221
    {
1504
221
      unsigned int tmp = src;
1505
221
      src = dst;
1506
221
      dst = tmp;
1507
221
    }
1508
1509
1.33k
  if (zerof)
1510
268
    dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1511
1.06k
  else
1512
1.06k
    dinfo->fprintf_func (dinfo->stream, "ld_field[");
1513
1514
1.33k
  err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1515
1.33k
            dst_lmext, imm_msb, dinfo);
1516
1.33k
  dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1517
1.33k
           _BTST (byte_mask, 3),
1518
1.33k
           _BTST (byte_mask, 2),
1519
1.33k
           _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1520
1.33k
  err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1521
1.33k
            src_lmext, imm_msb, dinfo);
1522
1523
1.33k
  if ((sc == 0) && (shift != 0))
1524
426
    dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1525
905
  else if (sc == 1)
1526
318
    {
1527
318
      if (shift)
1528
215
  dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1529
103
      else
1530
103
  dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1531
318
    }
1532
587
  else if (sc == 2)
1533
176
    {
1534
176
      if (shift)
1535
133
  dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1536
43
      else
1537
43
  dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1538
176
    }
1539
411
  else if (sc == 3)
1540
169
    dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1541
1542
1.33k
  dinfo->fprintf_func (dinfo->stream, "]");
1543
1544
1.33k
  if (load_cc)
1545
305
    dinfo->fprintf_func (dinfo->stream, ", load_cc");
1546
1.33k
  if (gpr_wrboth)
1547
173
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1548
1.33k
  if (pred_cc)
1549
333
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1550
1551
1.33k
  if (err)
1552
0
    return _NFP_ERR_CONT;
1553
1.33k
  return 0;
1554
1.33k
}
1555
1556
static int
1557
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
1558
7.43k
{
1559
7.43k
  unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1560
7.43k
  unsigned int defer = _BF (instr, 21, 20);
1561
7.43k
  unsigned int no_load = _BTST (instr, 19);
1562
7.43k
  unsigned int resume = _BTST (instr, 18);
1563
7.43k
  unsigned int bpt = _BTST (instr, 17);
1564
7.43k
  unsigned int sig_or = _BTST (instr, 16);
1565
7.43k
  unsigned int ev_mask = _BF (instr, 15, 0);
1566
1567
7.43k
  dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1568
7.43k
  if (bpt)
1569
3.26k
    dinfo->fprintf_func (dinfo->stream, "bpt");
1570
4.16k
  else if (ev_mask == 1)
1571
38
    dinfo->fprintf_func (dinfo->stream, "voluntary");
1572
4.12k
  else if ((!no_load) && (ev_mask == 0))
1573
366
    {
1574
366
      dinfo->fprintf_func (dinfo->stream, "kill");
1575
366
      sig_or = 0;
1576
366
    }
1577
3.76k
  else if (ev_mask == 0)
1578
48
    dinfo->fprintf_func (dinfo->stream, "--");
1579
3.71k
  else
1580
3.71k
    {
1581
3.71k
      int first_print = 1;
1582
3.71k
      unsigned int n;
1583
1584
59.4k
      for (n = 1; n < 16; n++)
1585
55.7k
  {
1586
55.7k
    if (!_BTST (ev_mask, n))
1587
29.6k
      continue;
1588
26.0k
    dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1589
26.0k
             (first_print) ? "" : ", ", n);
1590
26.0k
    first_print = 0;
1591
26.0k
  }
1592
3.71k
    }
1593
1594
7.43k
  dinfo->fprintf_func (dinfo->stream, "]");
1595
1596
7.43k
  if (sig_or)
1597
2.87k
    dinfo->fprintf_func (dinfo->stream, ", any");
1598
7.43k
  if (resume)
1599
3.97k
    dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1600
7.43k
  if (defer)
1601
5.25k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1602
1603
7.43k
  return 0;
1604
7.43k
}
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
1.42k
{
1611
1.42k
  unsigned int srcA = _BF (instr, 9, 0);
1612
1.42k
  unsigned int srcB = _BF (instr, 19, 10);
1613
1.42k
  unsigned int wr = _BTST (instr, 21);
1614
1.42k
  unsigned int csr_num = _BF (instr, 32, 22);
1615
1.42k
  unsigned int src = srcA;
1616
1.42k
  char src_bank = 'A';
1617
1.42k
  bool err = false;
1618
1619
1.42k
  if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1620
180
    {
1621
180
      src_bank = 'B';
1622
180
      src = srcB;
1623
180
    }
1624
1625
  /* MEv28 does not have urd/uwr.  */
1626
1.42k
  if (csr_num == 1)
1627
53
    {
1628
53
      if (wr)
1629
24
  {
1630
24
    dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1631
24
             (int) _BTST (instr, 20));
1632
24
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1633
24
               src_lmext, dinfo);
1634
24
  }
1635
29
      else
1636
29
  {
1637
29
    dinfo->fprintf_func (dinfo->stream, "urd[");
1638
29
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1639
29
               src_lmext, dinfo);
1640
29
    dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1641
29
             (int) _BTST (instr, 20));
1642
29
  }
1643
53
      dinfo->fprintf_func (dinfo->stream, "]");
1644
53
    }
1645
1.36k
  else
1646
1.36k
    {
1647
1.36k
      const char *nm = NULL;
1648
1649
1.36k
      if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1650
171
  nm = nfp_me27_28_mecsrs[csr_num];
1651
1652
1.36k
      dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1653
1.36k
         (wr) ? "wr" : "rd");
1654
1.36k
      if (nm)
1655
165
  dinfo->fprintf_func (dinfo->stream, "%s", nm);
1656
1.20k
      else
1657
1.20k
  dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1658
1659
1.36k
      if (wr)
1660
360
  {
1661
360
    dinfo->fprintf_func (dinfo->stream, ", ");
1662
360
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1663
360
               src_lmext, dinfo);
1664
360
  }
1665
1.36k
      dinfo->fprintf_func (dinfo->stream, "]");
1666
1.36k
    }
1667
1668
1.42k
  if (err)
1669
131
    return _NFP_ERR_CONT;
1670
1.28k
  return 0;
1671
1.42k
}
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
403
{
1678
403
  unsigned int br_op = _BF (instr, 4, 0);
1679
403
  unsigned int ctx_sig_state = _BF (instr, 17, 14);
1680
403
  unsigned int defer = _BF (instr, 21, 20);
1681
403
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1682
403
  int ret = 0;
1683
1684
403
  if (!nfp_me27_28_br_ops[br_op])
1685
51
    {
1686
51
      dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
1687
51
      ret = _NFP_ERR_CONT;
1688
51
    }
1689
352
  else
1690
352
    dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1691
1692
403
  switch (br_op)
1693
403
    {
1694
22
    case 16:      /* br=ctx */
1695
165
    case 17:      /* br!=ctx */
1696
220
    case 18:      /* br_signal */
1697
261
    case 19:      /* br_!signal */
1698
261
      dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1699
261
      break;
1700
5
    case 20:      /* "br_inp_state" */
1701
47
    case 21:      /* "br_!inp_state" */
1702
47
      dinfo->fprintf_func (dinfo->stream, "%s, ",
1703
47
         br_inpstates[ctx_sig_state]);
1704
47
      break;
1705
32
    case 22:      /* "br_cls_state" */
1706
35
    case 23:      /* "br_!cls_state" */
1707
35
      dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1708
35
         ctx_sig_state);
1709
35
      break;
1710
60
    default:
1711
60
      break;
1712
403
    }
1713
1714
403
  dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1715
1716
403
  if (defer)
1717
90
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1718
1719
403
  return ret;
1720
403
}
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
7.42k
{
1727
7.42k
  unsigned int srcA = _BF (instr, 7, 0);
1728
7.42k
  unsigned int by = _BF (instr, 9, 8);
1729
7.42k
  unsigned int srcB = _BF (instr, 17, 10);
1730
7.42k
  unsigned int imm_msb = _BTST (instr, 18);
1731
7.42k
  unsigned int eq = _BTST (instr, 19);
1732
7.42k
  unsigned int defer = _BF (instr, 21, 20);
1733
7.42k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1734
7.42k
  bool err = false;
1735
1736
7.42k
  if (eq)
1737
4.95k
    dinfo->fprintf_func (dinfo->stream, "br=byte[");
1738
2.47k
  else
1739
2.47k
    dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1740
1741
7.42k
  if (nfp_me_is_imm_opnd8 (srcA))
1742
2.20k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1743
2.20k
              src_lmext, imm_msb, dinfo);
1744
5.22k
  else
1745
5.22k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1746
5.22k
              src_lmext, imm_msb, dinfo);
1747
1748
7.42k
  dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1749
1750
7.42k
  if (nfp_me_is_imm_opnd8 (srcA))
1751
2.20k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1752
2.20k
              src_lmext, imm_msb, dinfo);
1753
5.22k
  else
1754
5.22k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1755
5.22k
              src_lmext, imm_msb, dinfo);
1756
1757
7.42k
  dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1758
1759
7.42k
  if (defer)
1760
2.58k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1761
1762
7.42k
  if (err)
1763
0
    return _NFP_ERR_CONT;
1764
7.42k
  return 0;
1765
7.42k
}
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
2.71k
{
1771
2.71k
  unsigned int srcA = _BF (instr, 7, 0);
1772
2.71k
  unsigned int srcB = _BF (instr, 17, 10);
1773
2.71k
  unsigned int b = _BTST (instr, 18);
1774
2.71k
  unsigned int defer = _BF (instr, 21, 20);
1775
2.71k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1776
2.71k
  bool err = false;
1777
1778
2.71k
  if (b)
1779
2.04k
    dinfo->fprintf_func (dinfo->stream, "br_bset[");
1780
665
  else
1781
665
    dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1782
1783
2.71k
  if (nfp_me_is_imm_opnd8 (srcA))
1784
339
    {
1785
339
      err = err
1786
339
  || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1787
339
      b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1788
339
    }
1789
2.37k
  else
1790
2.37k
    {
1791
2.37k
      err = err
1792
2.37k
  || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1793
2.37k
      b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1794
2.37k
    }
1795
1796
2.71k
  dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1797
1798
2.71k
  if (defer)
1799
2.21k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1800
1801
2.71k
  if (err)
1802
0
    return _NFP_ERR_CONT;
1803
2.71k
  return 0;
1804
2.71k
}
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.35k
{
1810
1.35k
  unsigned int srcA = _BF (instr, 9, 0);
1811
1.35k
  unsigned int srcB = _BF (instr, 19, 10);
1812
1.35k
  unsigned int defer = _BF (instr, 21, 20);
1813
1.35k
  unsigned int imm = _BF (instr, 30, 22);
1814
1.35k
  bool err = false;
1815
1816
1.35k
  if (nfp_me_is_imm_opnd10 (srcA))
1817
666
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1818
689
  else
1819
689
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1820
1821
1.35k
  if (!imm)
1822
42
    dinfo->fprintf_func (dinfo->stream, "rtn[");
1823
1.31k
  else
1824
1.31k
    dinfo->fprintf_func (dinfo->stream, "jump[");
1825
1826
1.35k
  if (nfp_me_is_imm_opnd10 (srcA))
1827
666
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1828
689
  else
1829
689
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1830
1831
1.35k
  if (imm)
1832
1.31k
    dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1833
1834
1.35k
  dinfo->fprintf_func (dinfo->stream, "]");
1835
1836
1.35k
  if (defer)
1837
426
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1838
1839
1.35k
  if (err)
1840
82
    return _NFP_ERR_CONT;
1841
1.27k
  return 0;
1842
1.35k
}
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
620
{
1850
620
  unsigned int srcA = _BF (instr, 9, 0);
1851
620
  unsigned int srcB = _BF (instr, 19, 10);
1852
620
  unsigned int mstep = _BF (instr, 22, 20);
1853
620
  char dst_bank = 'A' + _BTST (instr, 23);
1854
620
  unsigned int swap = _BTST (instr, 30);
1855
620
  unsigned int mtype = _BF (instr, 32, 31);
1856
620
  unsigned int nocc = _BTST (instr, 40);
1857
620
  bool err = false;
1858
1859
620
  if (swap)
1860
124
    {
1861
124
      unsigned int tmp = srcA;
1862
124
      srcA = srcB;
1863
124
      srcB = tmp;
1864
124
    }
1865
1866
620
  dinfo->fprintf_func (dinfo->stream, "mul_step[");
1867
1868
620
  if (mstep >= 4)
1869
185
    err = err
1870
185
      || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1871
435
  else
1872
435
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1873
435
               src_lmext, dinfo);
1874
1875
620
  dinfo->fprintf_func (dinfo->stream, ", ");
1876
1877
620
  if (mstep >= 4)
1878
185
    dinfo->fprintf_func (dinfo->stream, "--");
1879
435
  else
1880
435
    err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1881
317
               src_lmext, dinfo);
1882
1883
620
  dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1884
620
  if (mtype > 0)
1885
500
    {
1886
500
      const char *s = nfp_me27_28_mult_steps[mstep];
1887
500
      if (!s)
1888
78
  {
1889
78
    s = "<invalid mul_step>";
1890
78
    err = true;
1891
78
  }
1892
500
      dinfo->fprintf_func (dinfo->stream, "_%s", s);
1893
500
    }
1894
1895
620
  if (nocc)
1896
268
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1897
620
  if (gpr_wrboth)
1898
299
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1899
620
  if (pred_cc)
1900
389
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1901
1902
620
  if (err)
1903
268
    return _NFP_ERR_CONT;
1904
352
  return 0;
1905
620
}
1906
1907
static int
1908
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1909
1.49M
{
1910
1.49M
  const nfp_cmd_mnemonic *a = arg_a;
1911
1.49M
  const nfp_cmd_mnemonic *b = arg_b;
1912
1913
1.49M
  if (a->cpp_target != b->cpp_target)
1914
693k
    return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
1915
1916
805k
  if (a->cpp_action != b->cpp_action)
1917
423k
    return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1918
1919
382k
  return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
1920
805k
}
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
169k
{
1928
169k
  nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1929
169k
  const nfp_cmd_mnemonic *cmd = NULL;
1930
1931
169k
  cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1932
169k
     sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1933
1934
169k
  if (!cmd)
1935
55.4k
    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
122k
  while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1940
7.91k
    --cmd;
1941
1942
  /* Now compare by cpp_len and make sure we stay in range.  */
1943
125k
  for (; (cmd < (mnemonics + mnemonics_cnt))
1944
125k
       && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1945
122k
    {
1946
122k
      if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1947
111k
  return cmd->mnemonic;
1948
122k
    }
1949
1950
2.86k
  return NULL;
1951
114k
}
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
22.7k
{
1959
22.7k
  unsigned int srcA = _BF (instr, 7, 0);
1960
22.7k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
1961
22.7k
  unsigned int srcB = _BF (instr, 17, 10);
1962
22.7k
  unsigned int token = _BF (instr, 19, 18);
1963
22.7k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1964
22.7k
  unsigned int cpp_len = _BF (instr, 27, 25);
1965
22.7k
  unsigned int sig = _BF (instr, 31, 28);
1966
22.7k
  unsigned int tgtcmd = _BF (instr, 38, 32);
1967
22.7k
  unsigned int indref = _BTST (instr, 41);
1968
22.7k
  unsigned int mode = _BF (instr, 44, 42);
1969
1970
22.7k
  bool err = false;
1971
22.7k
  int cpp_target = -1;
1972
22.7k
  int cpp_action = -1;
1973
22.7k
  const char *mnemonic = NULL;
1974
22.7k
  unsigned int imm;
1975
22.7k
  unsigned int valBA;
1976
22.7k
  int visswap = ((mode == 1) || (mode == 3));
1977
1978
22.7k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1979
22.7k
  valBA = (srcB << 8) | srcA;
1980
1981
22.7k
  if (mode == 6)
1982
1.62k
    {
1983
1.62k
      token = 0;
1984
1.62k
      sig = 0;
1985
1.62k
      xfer = 0;
1986
1.62k
    }
1987
1988
  /* Convert tgtcmd to action/token tuple.  */
1989
22.7k
  if (_BF (tgtcmd, 6, 5) == 0x0)
1990
12.9k
    {
1991
12.9k
      switch (_BF (tgtcmd, 4, 2))
1992
12.9k
  {
1993
9.58k
  case 0:
1994
9.58k
    cpp_target = NFP_3200_CPPTGT_CAP;
1995
9.58k
    dinfo->fprintf_func (dinfo->stream, "cap[");
1996
9.58k
    break;
1997
1.05k
  case 1:
1998
1.05k
    cpp_target = NFP_3200_CPPTGT_MSF0;
1999
1.05k
    dinfo->fprintf_func (dinfo->stream, "msf0[");
2000
1.05k
    break;
2001
486
  case 2:
2002
486
    cpp_target = NFP_3200_CPPTGT_MSF1;
2003
486
    dinfo->fprintf_func (dinfo->stream, "msf1[");
2004
486
    break;
2005
362
  case 3:
2006
362
    cpp_target = NFP_3200_CPPTGT_PCIE;
2007
362
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2008
362
    break;
2009
348
  case 4:
2010
348
    cpp_target = NFP_3200_CPPTGT_HASH;
2011
348
    break;
2012
591
  case 5:
2013
591
    cpp_target = NFP_3200_CPPTGT_CRYPTO;
2014
591
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2015
591
    break;
2016
337
  case 6:
2017
337
    cpp_target = NFP_3200_CPPTGT_ARM;
2018
337
    dinfo->fprintf_func (dinfo->stream, "arm[");
2019
337
    break;
2020
214
  case 7:
2021
214
    cpp_target = NFP_3200_CPPTGT_CT;
2022
214
    dinfo->fprintf_func (dinfo->stream, "ct[");
2023
214
    break;
2024
12.9k
  }
2025
12.9k
      cpp_action = _BF (tgtcmd, 1, 0);
2026
12.9k
    }
2027
9.78k
  else
2028
9.78k
    {
2029
9.78k
      switch (_BF (tgtcmd, 6, 4))
2030
9.78k
  {
2031
802
  case 2:
2032
802
    cpp_target = NFP_3200_CPPTGT_GS;
2033
802
    dinfo->fprintf_func (dinfo->stream, "scratch[");
2034
802
    break;
2035
1.99k
  case 3:
2036
1.99k
    cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM.  */
2037
1.99k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2038
1.99k
    break;
2039
1.28k
  case 4:
2040
2.27k
  case 5:
2041
2.27k
    cpp_target = NFP_3200_CPPTGT_MU;
2042
2.27k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2043
2.27k
    break;
2044
3.01k
  case 6:
2045
4.71k
  case 7:
2046
4.71k
    cpp_target = NFP_3200_CPPTGT_CLS;
2047
4.71k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2048
4.71k
    break;
2049
9.78k
  }
2050
9.78k
      cpp_action = _BF (tgtcmd, 3, 0);
2051
9.78k
    }
2052
2053
22.7k
  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
22.7k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2061
22.7k
           nfp_me27_mnemonics,
2062
22.7k
           ARRAY_SIZE (nfp_me27_mnemonics));
2063
2064
22.7k
  if (!mnemonic)
2065
4.13k
    {
2066
4.13k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2067
4.13k
         cpp_target, cpp_action, token);
2068
4.13k
      return _NFP_ERR_CONT;
2069
4.13k
    }
2070
2071
18.6k
  if (cpp_target == NFP_3200_CPPTGT_HASH)
2072
109
    {
2073
109
      dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2074
109
         mnemonic, xfer, cpp_len);
2075
109
      goto print_opt_toks;
2076
109
    }
2077
2078
18.5k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2079
2080
18.5k
  if (visswap)
2081
2.20k
    {
2082
2.20k
      unsigned int tmp = srcA;
2083
2.20k
      srcA = srcB;
2084
2.20k
      srcB = tmp;
2085
2.20k
    }
2086
2087
18.5k
  switch (mode)
2088
18.5k
    {
2089
9.45k
    case 0:     /* (A << 8) + B.  */
2090
10.8k
    case 1:     /* (B << 8) + A.  */
2091
10.8k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2092
10.8k
      err = err
2093
10.8k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2094
10.8k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2095
10.8k
      err = err
2096
10.8k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2097
10.8k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2098
10.8k
      break;
2099
1.01k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2100
1.82k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2101
1.82k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2102
1.82k
      err = err
2103
1.82k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2104
1.82k
      if (third_party_32bit)
2105
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2106
1.82k
      else
2107
1.82k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2108
1.82k
      err = err
2109
1.82k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2110
1.82k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2111
1.82k
      break;
2112
1.78k
    case 4:     /* A + B.  */
2113
1.78k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2114
1.78k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2115
1.78k
      dinfo->fprintf_func (dinfo->stream, ", ");
2116
1.78k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2117
1.78k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2118
1.78k
      break;
2119
1.27k
    case 5:     /* Immediate address.  */
2120
1.27k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2121
1.27k
         (cpp_len + 1));
2122
1.27k
      break;
2123
1.54k
    case 6:     /* Immediate address and data.  */
2124
1.54k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2125
1.54k
      break;
2126
1.24k
    case 7:     /* Immediate data.  */
2127
1.24k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2128
1.24k
         ((xfer << 16) | valBA), (cpp_len + 1));
2129
1.24k
      break;
2130
18.5k
    }
2131
2132
18.6k
 print_opt_toks:
2133
18.6k
  dinfo->fprintf_func (dinfo->stream, "]");
2134
2135
18.6k
  if (indref && (mode != 2) && (mode != 3))
2136
4.71k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2137
2138
18.6k
  if (ctxswap_defer != 3)
2139
15.6k
    {
2140
15.6k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2141
15.6k
      if (sig)
2142
7.03k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2143
8.57k
      else
2144
8.57k
  dinfo->fprintf_func (dinfo->stream, "--]");
2145
2146
15.6k
      if (ctxswap_defer != 0)
2147
5.86k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2148
15.6k
    }
2149
3.02k
  else if (sig)
2150
1.89k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2151
2152
18.6k
  if (err)
2153
0
    return _NFP_ERR_CONT;
2154
18.6k
  return 0;
2155
18.6k
}
2156
2157
static int
2158
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
2159
      struct disassemble_info *dinfo)
2160
568
{
2161
568
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2162
568
}
2163
2164
static int
2165
nfp_me27_print_alu (uint64_t instr, int num_ctx,
2166
        struct disassemble_info *dinfo)
2167
371
{
2168
371
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2169
371
}
2170
2171
static int
2172
nfp_me27_print_immed (uint64_t instr, int num_ctx,
2173
          struct disassemble_info *dinfo)
2174
135
{
2175
135
  return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2176
135
}
2177
2178
static int
2179
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
2180
       struct disassemble_info *dinfo)
2181
261
{
2182
261
  return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2183
261
}
2184
2185
static int
2186
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2187
1.96k
{
2188
1.96k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2189
1.96k
}
2190
2191
static int
2192
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
2193
        struct disassemble_info *dinfo)
2194
72
{
2195
72
  return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2196
72
}
2197
2198
static int
2199
nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2200
195
{
2201
195
  return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
2202
195
}
2203
2204
static int
2205
nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
2206
      struct disassemble_info *dinfo)
2207
754
{
2208
754
  return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2209
754
}
2210
2211
static int
2212
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
2213
           struct disassemble_info *dinfo)
2214
254
{
2215
254
  return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2216
254
}
2217
2218
static int
2219
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
2220
           struct disassemble_info *dinfo)
2221
35
{
2222
35
  return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2223
35
}
2224
2225
static int
2226
nfp_me27_print_mult (uint64_t instr, int num_ctx,
2227
         struct disassemble_info *dinfo)
2228
67
{
2229
67
  return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2230
67
}
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
168k
{
2238
168k
  unsigned int srcA = _BF (instr, 7, 0);
2239
168k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
2240
168k
  unsigned int srcB = _BF (instr, 17, 10);
2241
168k
  unsigned int token = _BF (instr, 19, 18);
2242
168k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2243
168k
  unsigned int cpp_len = _BF (instr, 27, 25);
2244
168k
  unsigned int sig = _BF (instr, 31, 28);
2245
168k
  unsigned int tgtcmd = _BF (instr, 38, 32);
2246
168k
  unsigned int indref = _BTST (instr, 41);
2247
168k
  unsigned int mode = _BF (instr, 44, 42);
2248
2249
168k
  bool err = false;
2250
168k
  int cpp_target = -1;
2251
168k
  int cpp_action = -1;
2252
168k
  const char *mnemonic = NULL;
2253
168k
  unsigned int imm;
2254
168k
  unsigned int valBA;
2255
168k
  int visswap = ((mode == 1) || (mode == 3));
2256
2257
168k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2258
168k
  valBA = (srcB << 8) | srcA;
2259
2260
168k
  if (mode == 6)
2261
10.6k
    {
2262
10.6k
      token = 0;
2263
10.6k
      sig = 0;
2264
10.6k
      xfer = 0;
2265
10.6k
    }
2266
2267
  /* Convert tgtcmd to action/token tuple.  */
2268
168k
  if (_BF (tgtcmd, 6, 5) == 0x0)
2269
95.0k
    {
2270
95.0k
      switch (_BF (tgtcmd, 4, 2))
2271
95.0k
  {
2272
64.1k
  case 0:
2273
64.1k
    cpp_target = NFP_6000_CPPTGT_ILA;
2274
64.1k
    dinfo->fprintf_func (dinfo->stream, "ila[");
2275
64.1k
    break;
2276
8.11k
  case 1:
2277
8.11k
    cpp_target = NFP_6000_CPPTGT_NBI;
2278
8.11k
    dinfo->fprintf_func (dinfo->stream, "nbi[");
2279
8.11k
    break;
2280
4.70k
  case 3:
2281
4.70k
    cpp_target = NFP_6000_CPPTGT_PCIE;
2282
4.70k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2283
4.70k
    break;
2284
2.56k
  case 5:
2285
2.56k
    cpp_target = NFP_6000_CPPTGT_CRYPTO;
2286
2.56k
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2287
2.56k
    break;
2288
2.42k
  case 6:
2289
2.42k
    cpp_target = NFP_6000_CPPTGT_ARM;
2290
2.42k
    dinfo->fprintf_func (dinfo->stream, "arm[");
2291
2.42k
    break;
2292
2.96k
  case 7:
2293
2.96k
    cpp_target = NFP_6000_CPPTGT_CTXPB;
2294
2.96k
    dinfo->fprintf_func (dinfo->stream, "ct[");
2295
2.96k
    break;
2296
95.0k
  }
2297
95.0k
      cpp_action = _BF (tgtcmd, 1, 0);
2298
95.0k
    }
2299
73.5k
  else
2300
73.5k
    {
2301
      /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2302
   for mem/cls it's "a".  */
2303
73.5k
      cpp_action = _BF (tgtcmd, 4, 0);
2304
73.5k
      switch (_BF (tgtcmd, 6, 4))
2305
73.5k
  {
2306
12.9k
  case 3:
2307
12.9k
    cpp_target = NFP_6000_CPPTGT_VQDR;
2308
12.9k
    cpp_action = _BF (tgtcmd, 3, 0);
2309
12.9k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2310
12.9k
    break;
2311
15.2k
  case 4:
2312
24.4k
  case 5:
2313
24.4k
    cpp_target = NFP_6000_CPPTGT_MU;
2314
24.4k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2315
24.4k
    break;
2316
12.7k
  case 6:
2317
24.9k
  case 7:
2318
24.9k
    cpp_target = NFP_6000_CPPTGT_CLS;
2319
24.9k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2320
24.9k
    break;
2321
73.5k
  }
2322
73.5k
    }
2323
2324
168k
  if (cpp_target < 0)
2325
21.4k
    {
2326
21.4k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2327
21.4k
         cpp_target, cpp_action, token);
2328
21.4k
      return _NFP_ERR_CONT;
2329
21.4k
    }
2330
2331
147k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2332
147k
           nfp_me28_mnemonics,
2333
147k
           ARRAY_SIZE (nfp_me28_mnemonics));
2334
2335
147k
  if (!mnemonic)
2336
54.1k
    {
2337
54.1k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2338
54.1k
         cpp_target, cpp_action, token);
2339
54.1k
      return _NFP_ERR_CONT;
2340
54.1k
    }
2341
2342
93.0k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2343
2344
93.0k
  if (visswap)
2345
14.9k
    {
2346
14.9k
      unsigned int tmp = srcA;
2347
14.9k
      srcA = srcB;
2348
14.9k
      srcB = tmp;
2349
14.9k
    }
2350
2351
93.0k
  switch (mode)
2352
93.0k
    {
2353
45.0k
    case 0:     /* (A << 8) + B.  */
2354
53.1k
    case 1:     /* (B << 8) + A.  */
2355
53.1k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2356
53.1k
      err = err
2357
53.1k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2358
53.1k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2359
53.1k
      err = err
2360
53.1k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2361
53.1k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2362
53.1k
      break;
2363
8.41k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2364
15.2k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2365
15.2k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2366
15.2k
      err = err
2367
15.2k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2368
15.2k
      if (third_party_32bit)
2369
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2370
15.2k
      else
2371
15.2k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2372
15.2k
      err = err
2373
15.2k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2374
15.2k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2375
15.2k
      break;
2376
6.95k
    case 4:     /* A + B.  */
2377
6.95k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2378
6.95k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2379
6.95k
      dinfo->fprintf_func (dinfo->stream, ", ");
2380
6.95k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2381
6.95k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2382
6.95k
      break;
2383
4.65k
    case 5:     /* Immediate address.  */
2384
4.65k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2385
4.65k
         (cpp_len + 1));
2386
4.65k
      break;
2387
6.22k
    case 6:     /* Immediate address and data.  */
2388
6.22k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2389
6.22k
      break;
2390
6.83k
    case 7:     /* Immediate data.  */
2391
6.83k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2392
6.83k
         ((xfer << 16) | valBA), (cpp_len + 1));
2393
6.83k
      break;
2394
93.0k
    }
2395
2396
93.0k
  dinfo->fprintf_func (dinfo->stream, "]");
2397
2398
93.0k
  if (indref && (mode != 2) && (mode != 3))
2399
21.2k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2400
2401
93.0k
  if (ctxswap_defer != 3)
2402
77.9k
    {
2403
77.9k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2404
77.9k
      if (sig)
2405
33.7k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2406
44.2k
      else
2407
44.2k
  dinfo->fprintf_func (dinfo->stream, "--]");
2408
2409
77.9k
      if (ctxswap_defer != 0)
2410
28.8k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2411
77.9k
    }
2412
15.0k
  else if (sig)
2413
9.10k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2414
2415
93.0k
  if (err)
2416
0
    return _NFP_ERR_CONT;
2417
93.0k
  return 0;
2418
93.0k
}
2419
2420
static int
2421
nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
2422
      struct disassemble_info *dinfo)
2423
21.8k
{
2424
21.8k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2425
21.8k
  unsigned int src_lmext = _BTST (instr, 42);
2426
21.8k
  unsigned int dst_lmext = _BTST (instr, 43);
2427
21.8k
  unsigned int pred_cc = _BTST (instr, 44);
2428
2429
21.8k
  return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2430
21.8k
            src_lmext, gpr_wrboth, num_ctx, dinfo);
2431
21.8k
}
2432
2433
static int
2434
nfp_me28_print_alu (uint64_t instr, int num_ctx,
2435
        struct disassemble_info *dinfo)
2436
22.9k
{
2437
22.9k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2438
22.9k
  unsigned int src_lmext = _BTST (instr, 42);
2439
22.9k
  unsigned int dst_lmext = _BTST (instr, 43);
2440
22.9k
  unsigned int pred_cc = _BTST (instr, 44);
2441
2442
22.9k
  return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2443
22.9k
        gpr_wrboth, num_ctx, dinfo);
2444
22.9k
}
2445
2446
static int
2447
nfp_me28_print_immed (uint64_t instr, int num_ctx,
2448
          struct disassemble_info *dinfo)
2449
2.71k
{
2450
2.71k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2451
2.71k
  unsigned int dst_lmext = _BTST (instr, 43);
2452
2.71k
  unsigned int pred_cc = _BTST (instr, 44);
2453
2454
2.71k
  return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2455
2.71k
          num_ctx, dinfo);
2456
2.71k
}
2457
2458
static int
2459
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
2460
       struct disassemble_info *dinfo)
2461
1.07k
{
2462
1.07k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2463
1.07k
  unsigned int src_lmext = _BTST (instr, 42);
2464
1.07k
  unsigned int dst_lmext = _BTST (instr, 43);
2465
1.07k
  unsigned int pred_cc = _BTST (instr, 44);
2466
2467
1.07k
  return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2468
1.07k
             src_lmext, gpr_wrboth, num_ctx, dinfo);
2469
1.07k
}
2470
2471
static int
2472
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2473
5.47k
{
2474
5.47k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2475
5.47k
}
2476
2477
static int
2478
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
2479
        struct disassemble_info *dinfo)
2480
1.34k
{
2481
1.34k
  unsigned int src_lmext = _BTST (instr, 42);
2482
2483
1.34k
  return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2484
1.34k
}
2485
2486
static int
2487
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2488
208
{
2489
208
  return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2490
208
}
2491
2492
static int
2493
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
2494
      struct disassemble_info *dinfo)
2495
6.67k
{
2496
6.67k
  unsigned int src_lmext = _BTST (instr, 42);
2497
6.67k
  return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2498
6.67k
}
2499
2500
static int
2501
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
2502
           struct disassemble_info *dinfo)
2503
2.45k
{
2504
2.45k
  unsigned int src_lmext = _BTST (instr, 42);
2505
2.45k
  return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2506
2.45k
}
2507
2508
static int
2509
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
2510
           struct disassemble_info *dinfo)
2511
1.32k
{
2512
1.32k
  unsigned int src_lmext = _BTST (instr, 42);
2513
1.32k
  return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2514
1.32k
}
2515
2516
static int
2517
nfp_me28_print_mult (uint64_t instr, int num_ctx,
2518
         struct disassemble_info *dinfo)
2519
553
{
2520
553
  unsigned int gpr_wrboth = _BTST (instr, 41);
2521
553
  unsigned int src_lmext = _BTST (instr, 42);
2522
553
  unsigned int dst_lmext = _BTST (instr, 43);
2523
553
  unsigned int pred_cc = _BTST (instr, 44);
2524
2525
553
  return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2526
553
         gpr_wrboth, num_ctx, dinfo);
2527
553
}
2528
2529
static bool
2530
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2531
158
{
2532
158
  Elf_Internal_Shdr *sec = NULL;
2533
158
  Elf_Nfp_MeConfig mecfg_ent;
2534
158
  unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2535
158
  file_ptr roff = 0;
2536
158
  unsigned int sec_cnt = 0;
2537
158
  unsigned int sec_idx;
2538
158
  size_t menum_linear = 0;
2539
2540
158
  if (!dinfo->section)
2541
    /* No section info, will use default values.  */
2542
158
    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
463
{
2678
463
  int mecfg_orders[64][2];
2679
463
  size_t isl;
2680
463
  unsigned int sec_cnt = 0;
2681
463
  unsigned int sec_idx;
2682
463
  bool is_for_text;
2683
2684
463
  memset (mecfg_orders, -1, sizeof (mecfg_orders));
2685
2686
463
  if (dinfo->section == NULL
2687
93
      || dinfo->section->owner == NULL
2688
93
      || elf_elfsections (dinfo->section->owner) == NULL)
2689
    /* No section info, will use default values.  */
2690
463
    return true;
2691
2692
0
  sec_cnt = elf_numsections (dinfo->section->owner);
2693
2694
  /* Go through all MECSR init sections to find ME configs.  */
2695
0
  for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2696
0
    {
2697
0
      Elf_Internal_Shdr *sec;
2698
0
      int sec_order;
2699
2700
0
      sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2701
0
      sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
2702
2703
0
      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
0
      if (sec->sh_flags & SHF_NFP_INIT2)
2709
0
  sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
2710
2711
0
      if (sec->sh_type != SHT_NFP_INITREG)
2712
0
  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
0
  return true;
2732
0
}
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
314k
{
2759
314k
  if (!for_each_disassembler_option (dinfo, nfp_parse_option, opts))
2760
0
    return _NFP_ERR_STOP;
2761
2762
314k
  return 0;
2763
314k
}
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
314k
{
2771
314k
  nfp_priv_data *priv;
2772
314k
  int ret = false;
2773
2774
314k
  if (dinfo->private_data)
2775
312k
    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
2.02k
  priv = calloc (1, sizeof (*priv));
2786
2.02k
  if (!priv)
2787
0
    return NULL;
2788
2789
2.02k
  switch (dinfo->mach)
2790
2.02k
    {
2791
158
    case E_NFP_MACH_3200:
2792
158
      ret = init_nfp3200_priv (priv, dinfo);
2793
158
      break;
2794
463
    case E_NFP_MACH_6000:
2795
463
      ret = init_nfp6000_priv (priv, dinfo);
2796
463
      break;
2797
2.02k
    }
2798
2799
2.02k
  if (!ret)
2800
1.40k
    {
2801
1.40k
      free (priv);
2802
1.40k
      return NULL;
2803
1.40k
    }
2804
2805
621
  dinfo->private_data = priv;
2806
621
  return priv;
2807
2.02k
}
2808
2809
static int
2810
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2811
314k
{
2812
314k
  nfp_priv_data *priv = init_nfp_priv (dinfo);
2813
314k
  bfd_byte buffer[8];
2814
314k
  int err;
2815
314k
  uint64_t instr = 0;
2816
314k
  size_t island, menum;
2817
314k
  int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2818
314k
  int is_text = 1;
2819
2820
314k
  err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2821
314k
  if (err)
2822
586
    return _NFP_ERR_STOP;
2823
2824
314k
  if (!dinfo->section)
2825
151k
    {
2826
151k
      num_ctx = 8;
2827
151k
      scs_cnt = 0;
2828
151k
      addr_3rdparty32 = 0;
2829
151k
    }
2830
162k
  else
2831
162k
    {
2832
162k
      unsigned int sh_info = 0;
2833
162k
      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
162k
      if (!priv)
2838
0
  return _NFP_ERR_STOP; /* Sanity check */
2839
2840
162k
      is_text = (elf_section_flags (dinfo->section)
2841
162k
     & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2842
2843
162k
      sh_info = elf_section_info (dinfo->section);
2844
2845
162k
      switch (dinfo->mach)
2846
162k
  {
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
162k
  default:
2852
162k
    island = SHI_NFP_ISLAND (sh_info);
2853
162k
    menum = SHI_NFP_MENUM (sh_info);
2854
162k
    break;
2855
162k
  }
2856
2857
162k
      if (island >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2858
0
  {
2859
0
    dinfo->fprintf_func (dinfo->stream, "Invalid island or me.");
2860
0
    return _NFP_ERR_STOP;
2861
0
  }
2862
2863
162k
      mecfg = &priv->mecfgs[island][menum][is_text];
2864
162k
      num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2865
162k
      addr_3rdparty32 = mecfg->addr_3rdparty32;
2866
162k
      scs_cnt = mecfg->scs_cnt;
2867
162k
    }
2868
2869
314k
  if (opts->ctx_mode)
2870
0
    num_ctx = opts->ctx_mode;
2871
2872
314k
  dinfo->bytes_per_line = 8;
2873
314k
  dinfo->bytes_per_chunk = 8;
2874
2875
314k
  instr = bfd_getl64 (buffer);
2876
2877
314k
  if (opts->show_pc)
2878
314k
    {
2879
314k
      pc = (int) (addr >> 3);
2880
2881
      /* Guess max PC for formatting */
2882
314k
      tmpj = (int) (dinfo->buffer_length >> 3);
2883
314k
      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.07M
      for (tmpi = 1; tmpj > 9; tmpj /= 10)
2895
757k
  tmpi++;
2896
2897
314k
      tmpj = pc;
2898
1.03M
      for (; tmpj > 9; tmpj /= 10)
2899
715k
  tmpi--;
2900
2901
314k
      dinfo->fprintf_func (dinfo->stream, "%*c%d  ", tmpi, '.', pc);
2902
314k
    }
2903
2904
314k
  switch (dinfo->mach)
2905
314k
    {
2906
36.1k
    case E_NFP_MACH_3200:
2907
36.1k
      if (NFP_ME27_INSTR_IS_CMD (instr))
2908
22.7k
  err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2909
13.4k
      else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2910
568
  err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2911
12.8k
      else if (NFP_ME27_INSTR_IS_ALU (instr))
2912
371
  err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2913
12.4k
      else if (NFP_ME27_INSTR_IS_IMMED (instr))
2914
135
  err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2915
12.3k
      else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2916
261
  err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2917
12.0k
      else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2918
1.96k
  err = nfp_me27_print_ctx_arb (instr, dinfo);
2919
10.1k
      else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2920
72
  err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2921
10.0k
      else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2922
195
  err = nfp_me27_print_branch (instr, dinfo);
2923
9.84k
      else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2924
754
  err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2925
9.08k
      else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2926
254
  err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2927
8.83k
      else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2928
35
  err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2929
8.79k
      else if (NFP_ME27_INSTR_IS_MULT (instr))
2930
67
  err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2931
8.73k
      else
2932
8.73k
  err = nfp_me_print_invalid (instr, dinfo);
2933
36.1k
      break;
2934
2935
276k
    case E_NFP_MACH_6000:
2936
276k
      if (NFP_ME28_INSTR_IS_CMD (instr))
2937
168k
  err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2938
108k
      else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2939
21.8k
  err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2940
86.2k
      else if (NFP_ME28_INSTR_IS_ALU (instr))
2941
22.9k
  err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2942
63.3k
      else if (NFP_ME28_INSTR_IS_IMMED (instr))
2943
2.71k
  err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2944
60.6k
      else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2945
1.07k
  err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2946
59.6k
      else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2947
5.47k
  err = nfp_me28_print_ctx_arb (instr, dinfo);
2948
54.1k
      else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2949
1.34k
  err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2950
52.7k
      else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2951
208
  err = nfp_me28_print_branch (instr, dinfo);
2952
52.5k
      else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2953
6.67k
  err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2954
45.8k
      else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2955
2.45k
  err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2956
43.4k
      else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2957
1.32k
  err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2958
42.1k
      else if (NFP_ME28_INSTR_IS_MULT (instr))
2959
553
  err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2960
41.5k
      else
2961
41.5k
  err = nfp_me_print_invalid (instr, dinfo);
2962
276k
      break;
2963
314k
    }
2964
2965
314k
  if (err < 0)
2966
139k
    return err;
2967
175k
  return 8;
2968
314k
}
2969
2970
int
2971
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2972
314k
{
2973
314k
  nfp_opts opts;
2974
314k
  int err;
2975
2976
314k
  opts.show_pc = 1;
2977
314k
  opts.ctx_mode = 0;
2978
314k
  err = parse_disassembler_options (&opts, dinfo);
2979
314k
  if (err < 0)
2980
0
    goto end;
2981
2982
314k
  err = _print_instrs (addr, dinfo, &opts);
2983
2984
314k
 end:
2985
314k
  if (err != 8)
2986
139k
    dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2987
314k
  if (err == _NFP_ERR_CONT)
2988
139k
    return 8;
2989
175k
  return err;
2990
314k
}
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
}