Coverage Report

Created: 2026-04-04 08:16

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
554
#define _NFP_ERR_STOP -1
39
432k
#define _NFP_ERR_CONT -8
40
41
810k
#define _BTST(v, b)               (((v) >> b) & 1)
42
4.18M
#define _BF(v, msb, lsb)          (((v) >> (lsb)) & \
43
4.18M
           ((1U << ((msb) - (lsb) + 1)) - 1))
44
265k
#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
317k
#define _NFP_ISLAND_MAX 64
50
158k
#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
48.0k
{
930
48.0k
  const char * err_msg = N_("<invalid_instruction>:");
931
48.0k
  dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
932
48.0k
  return _NFP_ERR_CONT;
933
48.0k
}
934
935
static bool
936
nfp_me_is_imm_opnd10 (unsigned int opnd)
937
33.7k
{
938
33.7k
  return _BF (opnd, 9, 8) == 0x3;
939
33.7k
}
940
941
static bool
942
nfp_me_is_imm_opnd8 (unsigned int opnd)
943
40.8k
{
944
40.8k
  return _BTST (opnd, 5);
945
40.8k
}
946
947
static unsigned int
948
nfp_me_imm_opnd10 (unsigned int opnd)
949
3.60k
{
950
3.60k
  return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
951
3.60k
}
952
953
static unsigned int
954
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
955
2.34k
{
956
2.34k
  unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
957
958
2.34k
  return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
959
2.34k
}
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.2k
{
967
46.2k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
968
969
  /* Absolute GPR.  */
970
46.2k
  if (_BF (opnd, 9, 7) == 0x1)
971
6.63k
    dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
972
973
  /* Relative GPR.  */
974
39.6k
  else if (_BF (opnd, 9, 6) == 0x0)
975
5.59k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
976
977
  /* Indexed Xfer.  */
978
34.0k
  else if (_BF (opnd, 9, 7) == 0x2)
979
4.26k
    {
980
4.26k
      dinfo->fprintf_func (dinfo->stream, "*$index");
981
4.26k
      if (_BF (opnd, 2, 1) == 0x1)
982
847
  dinfo->fprintf_func (dinfo->stream, "++");
983
3.41k
      else if (_BF (opnd, 2, 1) == 0x2)
984
1.43k
  dinfo->fprintf_func (dinfo->stream, "--");
985
4.26k
    }
986
987
  /* Relative Xfer.  */
988
29.7k
  else if (_BF (opnd, 9, 7) == 0x3)
989
5.63k
    {
990
5.63k
      if (_BTST (opnd, 6))
991
2.54k
  n += (num_ctx == 8 ? 16 : 32);
992
5.63k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
993
5.63k
    }
994
995
  /* Indexed Next Neighbour.  */
996
24.1k
  else if (_BF (opnd, 9, 6) == 0x9)
997
4.69k
    {
998
4.69k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
999
4.69k
      if (_BTST (opnd, 1))
1000
3.56k
  dinfo->fprintf_func (dinfo->stream, "++");
1001
4.69k
    }
1002
1003
  /* Relative Next Neighbour.  */
1004
19.4k
  else if (_BF (opnd, 9, 6) == 0xa)
1005
4.58k
    {
1006
4.58k
      dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1007
4.58k
    }
1008
1009
  /* Indexed LMEM.  */
1010
14.8k
  else if (_BF (opnd, 9, 6) == 0x8)
1011
3.37k
    {
1012
3.37k
      n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1013
3.37k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1014
3.37k
      if (_BTST (opnd, 4))
1015
1.24k
  dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1016
2.13k
      else if (_BF (opnd, 3, 0))
1017
1.90k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1018
3.37k
    }
1019
1020
  /* 8-bit Constant value.  */
1021
11.4k
  else if (_BF (opnd, 9, 8) == 0x3)
1022
5.66k
    dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1023
1024
5.79k
  else
1025
5.79k
    {
1026
5.79k
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1027
5.79k
      return false;
1028
5.79k
    }
1029
1030
40.4k
  return true;
1031
46.2k
}
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
235k
{
1040
235k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1041
1042
  /* Relative GPR.  */
1043
235k
  if (_BF (opnd, 7, 5) == 0x0)
1044
101k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1045
1046
  /* Relative Xfer.  */
1047
134k
  else if (_BF (opnd, 7, 5) == 0x4)
1048
23.3k
    dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1049
1050
  /* Relative Xfer.  */
1051
110k
  else if (_BF (opnd, 7, 5) == 0x6)
1052
20.9k
    {
1053
20.9k
      n += (num_ctx == 8 ? 16 : 32);
1054
20.9k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1055
20.9k
    }
1056
1057
  /* Indexed Xfer.  */
1058
89.8k
  else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1059
11.0k
    {
1060
11.0k
      dinfo->fprintf_func (dinfo->stream, "*$index");
1061
11.0k
      if (_BF (opnd, 2, 1) == 0x1)
1062
3.29k
  dinfo->fprintf_func (dinfo->stream, "++");
1063
7.75k
      else if (_BF (opnd, 2, 1) == 0x2)
1064
1.18k
  dinfo->fprintf_func (dinfo->stream, "--");
1065
11.0k
    }
1066
1067
  /* Indexed NN.  */
1068
78.8k
  else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1069
5.62k
    {
1070
5.62k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
1071
5.62k
      if (_BTST (opnd, 1))
1072
2.55k
  dinfo->fprintf_func (dinfo->stream, "++");
1073
5.62k
    }
1074
1075
  /* Indexed LMEM.  */
1076
73.1k
  else if (_BF (opnd, 7, 4) == 0x5)
1077
9.04k
    {
1078
9.04k
      n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1079
9.04k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1080
9.04k
      if (_BF (opnd, 2, 0))
1081
7.10k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1082
9.04k
    }
1083
1084
  /* 7+1-bit Constant value.  */
1085
64.1k
  else if (_BTST (opnd, 5))
1086
64.1k
    {
1087
64.1k
      n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1088
64.1k
      dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1089
64.1k
    }
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
235k
  return true;
1098
235k
}
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
21.7k
{
1106
21.7k
  unsigned int op = _BF (instr, 35, 33);
1107
21.7k
  unsigned int srcA = _BF (instr, 7, 0);
1108
21.7k
  unsigned int srcB = _BF (instr, 17, 10);
1109
21.7k
  unsigned int dst = _BF (instr, 27, 20);
1110
21.7k
  unsigned int sc = _BF (instr, 9, 8);
1111
21.7k
  unsigned int imm_msb = _BTST (instr, 18);
1112
21.7k
  unsigned int swap = _BTST (instr, 19);
1113
21.7k
  unsigned int shift = _BF (instr, 32, 28);
1114
21.7k
  char dst_bank = 'A' + _BTST (instr, 36);
1115
21.7k
  unsigned int nocc = _BTST (instr, 40);
1116
21.7k
  bool err = false;
1117
1118
21.7k
  if (swap)
1119
10.2k
    {
1120
10.2k
      unsigned int tmp = srcA;
1121
10.2k
      srcA = srcB;
1122
10.2k
      srcB = tmp;
1123
10.2k
    }
1124
1125
  /* alu_shf, dbl_shf, asr.  */
1126
21.7k
  if (op < 7)
1127
18.5k
    {
1128
18.5k
      if (sc == 3)
1129
4.28k
  dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1130
14.2k
      else if (op == 6)
1131
1.41k
  dinfo->fprintf_func (dinfo->stream, "asr[");
1132
12.8k
      else
1133
12.8k
  dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1134
1135
      /* dest operand */
1136
18.5k
      if (nfp_me_is_imm_opnd8 (dst))
1137
8.19k
  dinfo->fprintf_func (dinfo->stream, "--");
1138
10.3k
      else
1139
10.3k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1140
10.3k
            dst_lmext, imm_msb, dinfo);
1141
1142
18.5k
      dinfo->fprintf_func (dinfo->stream, ", ");
1143
1144
      /* A operand.  */
1145
18.5k
      if (op != 6)
1146
16.6k
  {
1147
16.6k
    if ((op < 2) && (sc != 3))  /* Not dbl_shf.  */
1148
4.93k
      dinfo->fprintf_func (dinfo->stream, "--");  /* B or ~B operator.  */
1149
11.7k
    else
1150
11.7k
      err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1151
11.7k
                num_ctx, src_lmext, imm_msb,
1152
11.7k
                dinfo);
1153
1154
16.6k
    dinfo->fprintf_func (dinfo->stream, ", ");
1155
1156
    /* Operator (not for dbl_shf).  */
1157
16.6k
    if (sc != 3)
1158
12.8k
      {
1159
12.8k
        dinfo->fprintf_func (dinfo->stream, "%s, ",
1160
12.8k
           nfp_mealu_shf_op[op]);
1161
12.8k
      }
1162
16.6k
  }
1163
1164
      /* B operand.  */
1165
18.5k
      err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1166
18.5k
          num_ctx, src_lmext, imm_msb, dinfo);
1167
1168
18.5k
      dinfo->fprintf_func (dinfo->stream, ", ");
1169
1170
      /* Shift */
1171
18.5k
      if (sc == 0)
1172
6.55k
  dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1173
11.9k
      else if (sc == 2)
1174
3.71k
  {
1175
3.71k
    if (shift)
1176
3.46k
      dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1177
248
    else
1178
248
      dinfo->fprintf_func (dinfo->stream, "<<indirect");
1179
3.71k
  }
1180
8.26k
      else
1181
8.26k
  {
1182
8.26k
    if (shift)
1183
7.58k
      dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1184
684
    else
1185
684
      dinfo->fprintf_func (dinfo->stream, ">>indirect");
1186
8.26k
  }
1187
18.5k
    }
1188
  /* Byte Align.  */
1189
3.25k
  else if (op == 7)
1190
3.25k
    {
1191
3.25k
      dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1192
3.25k
         ((sc == 2) ? "le" : "be"));
1193
1194
      /* Dest operand.  */
1195
3.25k
      if (nfp_me_is_imm_opnd8 (dst))
1196
2.22k
  dinfo->fprintf_func (dinfo->stream, "--");
1197
1.03k
      else
1198
1.03k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1199
1.03k
            dst_lmext, imm_msb, dinfo);
1200
1201
3.25k
      dinfo->fprintf_func (dinfo->stream, ", ");
1202
1203
3.25k
      if (sc == 2)
1204
434
  err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1205
434
            0, imm_msb, dinfo);
1206
2.82k
      else
1207
2.82k
  err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1208
2.82k
            0, imm_msb, dinfo);
1209
3.25k
    }
1210
1211
21.7k
  dinfo->fprintf_func (dinfo->stream, "]");
1212
21.7k
  if (nocc)
1213
11.3k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1214
21.7k
  if (gpr_wrboth)
1215
10.5k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1216
21.7k
  if (pred_cc)
1217
8.93k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1218
1219
21.7k
  if (err)
1220
0
    return _NFP_ERR_CONT;
1221
21.7k
  return 0;
1222
21.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
23.1k
{
1230
23.1k
  unsigned int op = _BF (instr, 35, 31);
1231
23.1k
  unsigned int srcA = _BF (instr, 9, 0);
1232
23.1k
  unsigned int srcB = _BF (instr, 19, 10);
1233
23.1k
  unsigned int dst = _BF (instr, 29, 20);
1234
23.1k
  unsigned int swap = _BTST (instr, 30);
1235
23.1k
  char dst_bank = 'A' + _BTST (instr, 36);
1236
23.1k
  unsigned int nocc = _BTST (instr, 40);
1237
23.1k
  int do_close_bracket = 1;
1238
23.1k
  bool err = false;
1239
1240
23.1k
  if (swap)
1241
6.40k
    {
1242
6.40k
      unsigned int tmp = srcA;
1243
6.40k
      srcA = srcB;
1244
6.40k
      srcB = tmp;
1245
6.40k
    }
1246
1247
23.1k
  switch (op)
1248
23.1k
    {
1249
642
    case 3:     /* pop_count3[dst, srcB] */
1250
1.10k
    case 6:     /* pop_count1[srcB] */
1251
1.62k
    case 7:     /* pop_count2[srcB] */
1252
2.39k
    case 14:      /* ffs[dst, srcB] */
1253
4.29k
    case 15:      /* cam_read_tag[dst, srcB] */
1254
5.11k
    case 31:      /* cam_read_state[dst, srcB] */
1255
5.11k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1256
1257
      /* No dest for pop_count1/2.  */
1258
5.11k
      if ((op != 6) && (op != 7))
1259
4.13k
  {
1260
    /* dest operand */
1261
4.13k
    if (nfp_me_is_imm_opnd10 (dst))
1262
1.22k
      dinfo->fprintf_func (dinfo->stream, "--");
1263
2.91k
    else
1264
2.91k
      err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1265
2.91k
                 dst_lmext, dinfo);
1266
1267
4.13k
    dinfo->fprintf_func (dinfo->stream, ", ");
1268
4.13k
  }
1269
1270
      /* B operand.  */
1271
5.11k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1272
4.62k
           num_ctx, src_lmext, dinfo);
1273
5.11k
      break;
1274
 
1275
      /* cam_clear.  */
1276
534
    case 11:
1277
534
      do_close_bracket = 0;
1278
534
      dinfo->fprintf_func (dinfo->stream, "cam_clear");
1279
534
      break;
1280
1281
      /* cam_lookup.  */
1282
1.23k
    case 23:
1283
1.23k
      do_close_bracket = 0;
1284
1.23k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1285
1286
      /* Dest operand.  */
1287
1.23k
      if (nfp_me_is_imm_opnd10 (dst))
1288
207
  dinfo->fprintf_func (dinfo->stream, "--");
1289
1.02k
      else
1290
1.02k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1291
1.02k
             dst_lmext, dinfo);
1292
1293
1.23k
      dinfo->fprintf_func (dinfo->stream, ", ");
1294
1295
      /* A operand.  */
1296
1.23k
      err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1297
1.13k
           num_ctx, src_lmext, dinfo);
1298
1299
1.23k
      dinfo->fprintf_func (dinfo->stream, "]");
1300
1301
1.23k
      if (_BF (srcB, 1, 0))
1302
992
  {
1303
992
    unsigned int n = _BTST (srcB, 1);
1304
992
    if (_BTST (srcB, 4))  /* Only for MEv28.  */
1305
194
      n += 2;
1306
992
    dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1307
992
             _BF (srcB, 3, 2));
1308
992
  }
1309
1310
1.23k
      break;
1311
1312
2.48k
    case 19:      /* cam_write.  */
1313
3.18k
    case 27:      /* cam_write_state.  */
1314
3.18k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1315
3.18k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1316
3.18k
           num_ctx, src_lmext, dinfo);
1317
3.18k
      dinfo->fprintf_func (dinfo->stream, ", ");
1318
3.18k
      if (op == 19)
1319
2.48k
  {
1320
2.48k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1321
2.34k
               num_ctx, src_lmext, dinfo);
1322
2.48k
    dinfo->fprintf_func (dinfo->stream, ", ");
1323
2.48k
  }
1324
3.18k
      dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1325
3.18k
      break;
1326
1327
      /* CRC.  */
1328
896
    case 18:  
1329
896
      do_close_bracket = 0;
1330
896
      dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1331
896
         _BTST (srcA, 3) ? "le" : "be");
1332
896
      if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
1333
164
  {
1334
164
    dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1335
164
    err = true;
1336
164
  }
1337
732
      else
1338
732
  {
1339
732
    dinfo->fprintf_func (dinfo->stream, "%s, ",
1340
732
             nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
1341
732
  }
1342
1343
      /* Dest operand.  */
1344
896
      if (nfp_me_is_imm_opnd10 (dst))
1345
167
  dinfo->fprintf_func (dinfo->stream, "--");
1346
729
      else
1347
729
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1348
589
             dst_lmext, dinfo);
1349
1350
896
      dinfo->fprintf_func (dinfo->stream, ", ");
1351
1352
      /* B operand.  */
1353
896
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1354
641
           num_ctx, src_lmext, dinfo);
1355
1356
896
      dinfo->fprintf_func (dinfo->stream, "]");
1357
896
      if (_BF (srcA, 2, 0))
1358
707
  dinfo->fprintf_func (dinfo->stream, ", %s",
1359
707
           nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
1360
896
      if (_BTST (srcA, 4))
1361
374
  dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1362
896
      break;
1363
1364
12.1k
    default:
1365
      /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs).  */
1366
12.1k
      dinfo->fprintf_func (dinfo->stream, "alu[");
1367
1368
      /* Dest operand.  */
1369
12.1k
      if (nfp_me_is_imm_opnd10 (dst))
1370
3.99k
  dinfo->fprintf_func (dinfo->stream, "--");
1371
8.19k
      else
1372
8.19k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1373
8.19k
             dst_lmext, dinfo);
1374
12.1k
      dinfo->fprintf_func (dinfo->stream, ", ");
1375
1376
      /* A operand.  */
1377
12.1k
      if ((op == 0) || (op == 4))  /* B only operators.  */
1378
1.11k
  dinfo->fprintf_func (dinfo->stream, "--");
1379
11.0k
      else
1380
11.0k
  err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1381
9.80k
             num_ctx, src_lmext, dinfo);
1382
1383
12.1k
      if (!nfp_me27_28_alu_op[op])
1384
3.58k
  {
1385
3.58k
    dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1386
3.58k
    err = true;
1387
3.58k
  }
1388
8.60k
      else
1389
8.60k
  {
1390
8.60k
    dinfo->fprintf_func (dinfo->stream, ", %s, ",
1391
8.60k
             nfp_me27_28_alu_op[op]);
1392
8.60k
  }
1393
1394
      /* B operand.  */
1395
12.1k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1396
7.21k
           num_ctx, src_lmext, dinfo);
1397
12.1k
      break;
1398
23.1k
    }
1399
1400
23.1k
  if (do_close_bracket)
1401
20.4k
    dinfo->fprintf_func (dinfo->stream, "]");
1402
1403
23.1k
  if (nocc)
1404
12.4k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1405
23.1k
  if (gpr_wrboth)
1406
10.7k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1407
23.1k
  if (pred_cc)
1408
10.4k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1409
1410
23.1k
  if (err)
1411
7.58k
    return _NFP_ERR_CONT;
1412
15.5k
  return 0;
1413
23.1k
}
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.30k
{
1421
2.30k
  unsigned int srcA = _BF (instr, 9, 0);
1422
2.30k
  unsigned int srcB = _BF (instr, 19, 10);
1423
2.30k
  unsigned int imm = _BF (instr, 27, 20);
1424
2.30k
  unsigned int by = _BTST (instr, 29);
1425
2.30k
  unsigned int wd = _BTST (instr, 30);
1426
2.30k
  unsigned int inv = _BTST (instr, 31);
1427
2.30k
  unsigned int byte_shift = _BF (instr, 34, 33);
1428
2.30k
  bool err = false;
1429
1430
2.30k
  if (nfp_me_is_imm_opnd10 (srcB))
1431
536
    {
1432
536
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1433
536
      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
536
    }
1439
1.76k
  else
1440
1.76k
    {
1441
1.76k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1442
1.76k
    }
1443
1444
2.30k
  if (inv)
1445
1.37k
    imm = (imm ^ 0xffff) | 0xffff0000U;
1446
1447
2.30k
  if (by)
1448
1.49k
    {
1449
1.49k
      dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1450
1.49k
      imm &= 0xff;
1451
1.49k
    }
1452
806
  else if (wd)
1453
289
    {
1454
289
      dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1455
289
      imm &= 0xffff;
1456
289
    }
1457
517
  else
1458
517
    dinfo->fprintf_func (dinfo->stream, "immed[");
1459
1460
  /* Dest.  */
1461
2.30k
  if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1462
166
    dinfo->fprintf_func (dinfo->stream, "--");  /* No Dest.  */
1463
2.13k
  else if (nfp_me_is_imm_opnd10 (srcA))
1464
180
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1465
1.95k
  else
1466
1.95k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1467
1468
2.30k
  dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1469
1470
2.30k
  if ((!by) && (!wd) && (byte_shift))
1471
341
    dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1472
1473
2.30k
  dinfo->fprintf_func (dinfo->stream, "]");
1474
1475
2.30k
  if (gpr_wrboth)
1476
839
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1477
2.30k
  if (pred_cc)
1478
1.28k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1479
1480
2.30k
  if (err)
1481
670
    return _NFP_ERR_CONT;
1482
1.63k
  return 0;
1483
2.30k
}
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.30k
{
1491
1.30k
  unsigned int load_cc = _BTST (instr, 34);
1492
1.30k
  unsigned int shift = _BF (instr, 32, 28);
1493
1.30k
  unsigned int byte_mask = _BF (instr, 27, 24);
1494
1.30k
  unsigned int zerof = _BTST (instr, 20);
1495
1.30k
  unsigned int swap = _BTST (instr, 19);
1496
1.30k
  unsigned int imm_msb = _BTST (instr, 18);
1497
1.30k
  unsigned int src = _BF (instr, 17, 10);
1498
1.30k
  unsigned int sc = _BF (instr, 9, 8);
1499
1.30k
  unsigned int dst = _BF (instr, 7, 0);
1500
1.30k
  bool err = false;
1501
1502
1.30k
  if (swap)
1503
242
    {
1504
242
      unsigned int tmp = src;
1505
242
      src = dst;
1506
242
      dst = tmp;
1507
242
    }
1508
1509
1.30k
  if (zerof)
1510
259
    dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1511
1.04k
  else
1512
1.04k
    dinfo->fprintf_func (dinfo->stream, "ld_field[");
1513
1514
1.30k
  err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1515
1.30k
            dst_lmext, imm_msb, dinfo);
1516
1.30k
  dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1517
1.30k
           _BTST (byte_mask, 3),
1518
1.30k
           _BTST (byte_mask, 2),
1519
1.30k
           _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1520
1.30k
  err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1521
1.30k
            src_lmext, imm_msb, dinfo);
1522
1523
1.30k
  if ((sc == 0) && (shift != 0))
1524
406
    dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1525
894
  else if (sc == 1)
1526
295
    {
1527
295
      if (shift)
1528
217
  dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1529
78
      else
1530
78
  dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1531
295
    }
1532
599
  else if (sc == 2)
1533
215
    {
1534
215
      if (shift)
1535
182
  dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1536
33
      else
1537
33
  dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1538
215
    }
1539
384
  else if (sc == 3)
1540
165
    dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1541
1542
1.30k
  dinfo->fprintf_func (dinfo->stream, "]");
1543
1544
1.30k
  if (load_cc)
1545
289
    dinfo->fprintf_func (dinfo->stream, ", load_cc");
1546
1.30k
  if (gpr_wrboth)
1547
196
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1548
1.30k
  if (pred_cc)
1549
382
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1550
1551
1.30k
  if (err)
1552
0
    return _NFP_ERR_CONT;
1553
1.30k
  return 0;
1554
1.30k
}
1555
1556
static int
1557
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
1558
7.02k
{
1559
7.02k
  unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1560
7.02k
  unsigned int defer = _BF (instr, 21, 20);
1561
7.02k
  unsigned int no_load = _BTST (instr, 19);
1562
7.02k
  unsigned int resume = _BTST (instr, 18);
1563
7.02k
  unsigned int bpt = _BTST (instr, 17);
1564
7.02k
  unsigned int sig_or = _BTST (instr, 16);
1565
7.02k
  unsigned int ev_mask = _BF (instr, 15, 0);
1566
1567
7.02k
  dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1568
7.02k
  if (bpt)
1569
3.10k
    dinfo->fprintf_func (dinfo->stream, "bpt");
1570
3.92k
  else if (ev_mask == 1)
1571
42
    dinfo->fprintf_func (dinfo->stream, "voluntary");
1572
3.88k
  else if ((!no_load) && (ev_mask == 0))
1573
279
    {
1574
279
      dinfo->fprintf_func (dinfo->stream, "kill");
1575
279
      sig_or = 0;
1576
279
    }
1577
3.60k
  else if (ev_mask == 0)
1578
23
    dinfo->fprintf_func (dinfo->stream, "--");
1579
3.58k
  else
1580
3.58k
    {
1581
3.58k
      int first_print = 1;
1582
3.58k
      unsigned int n;
1583
1584
57.3k
      for (n = 1; n < 16; n++)
1585
53.7k
  {
1586
53.7k
    if (!_BTST (ev_mask, n))
1587
28.3k
      continue;
1588
25.3k
    dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1589
25.3k
             (first_print) ? "" : ", ", n);
1590
25.3k
    first_print = 0;
1591
25.3k
  }
1592
3.58k
    }
1593
1594
7.02k
  dinfo->fprintf_func (dinfo->stream, "]");
1595
1596
7.02k
  if (sig_or)
1597
2.87k
    dinfo->fprintf_func (dinfo->stream, ", any");
1598
7.02k
  if (resume)
1599
3.73k
    dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1600
7.02k
  if (defer)
1601
4.94k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1602
1603
7.02k
  return 0;
1604
7.02k
}
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.32k
{
1611
1.32k
  unsigned int srcA = _BF (instr, 9, 0);
1612
1.32k
  unsigned int srcB = _BF (instr, 19, 10);
1613
1.32k
  unsigned int wr = _BTST (instr, 21);
1614
1.32k
  unsigned int csr_num = _BF (instr, 32, 22);
1615
1.32k
  unsigned int src = srcA;
1616
1.32k
  char src_bank = 'A';
1617
1.32k
  bool err = false;
1618
1619
1.32k
  if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1620
129
    {
1621
129
      src_bank = 'B';
1622
129
      src = srcB;
1623
129
    }
1624
1625
  /* MEv28 does not have urd/uwr.  */
1626
1.32k
  if (csr_num == 1)
1627
50
    {
1628
50
      if (wr)
1629
23
  {
1630
23
    dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1631
23
             (int) _BTST (instr, 20));
1632
23
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1633
23
               src_lmext, dinfo);
1634
23
  }
1635
27
      else
1636
27
  {
1637
27
    dinfo->fprintf_func (dinfo->stream, "urd[");
1638
27
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1639
27
               src_lmext, dinfo);
1640
27
    dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1641
27
             (int) _BTST (instr, 20));
1642
27
  }
1643
50
      dinfo->fprintf_func (dinfo->stream, "]");
1644
50
    }
1645
1.27k
  else
1646
1.27k
    {
1647
1.27k
      const char *nm = NULL;
1648
1649
1.27k
      if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1650
175
  nm = nfp_me27_28_mecsrs[csr_num];
1651
1652
1.27k
      dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1653
1.27k
         (wr) ? "wr" : "rd");
1654
1.27k
      if (nm)
1655
169
  dinfo->fprintf_func (dinfo->stream, "%s", nm);
1656
1.10k
      else
1657
1.10k
  dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1658
1659
1.27k
      if (wr)
1660
328
  {
1661
328
    dinfo->fprintf_func (dinfo->stream, ", ");
1662
328
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1663
328
               src_lmext, dinfo);
1664
328
  }
1665
1.27k
      dinfo->fprintf_func (dinfo->stream, "]");
1666
1.27k
    }
1667
1668
1.32k
  if (err)
1669
118
    return _NFP_ERR_CONT;
1670
1.20k
  return 0;
1671
1.32k
}
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
411
{
1678
411
  unsigned int br_op = _BF (instr, 4, 0);
1679
411
  unsigned int ctx_sig_state = _BF (instr, 17, 14);
1680
411
  unsigned int defer = _BF (instr, 21, 20);
1681
411
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1682
411
  int ret = 0;
1683
1684
411
  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
360
  else
1690
360
    dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1691
1692
411
  switch (br_op)
1693
411
    {
1694
19
    case 16:      /* br=ctx */
1695
177
    case 17:      /* br!=ctx */
1696
238
    case 18:      /* br_signal */
1697
274
    case 19:      /* br_!signal */
1698
274
      dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1699
274
      break;
1700
5
    case 20:      /* "br_inp_state" */
1701
46
    case 21:      /* "br_!inp_state" */
1702
46
      dinfo->fprintf_func (dinfo->stream, "%s, ",
1703
46
         br_inpstates[ctx_sig_state]);
1704
46
      break;
1705
31
    case 22:      /* "br_cls_state" */
1706
34
    case 23:      /* "br_!cls_state" */
1707
34
      dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1708
34
         ctx_sig_state);
1709
34
      break;
1710
57
    default:
1711
57
      break;
1712
411
    }
1713
1714
411
  dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1715
1716
411
  if (defer)
1717
86
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1718
1719
411
  return ret;
1720
411
}
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.18k
{
1727
7.18k
  unsigned int srcA = _BF (instr, 7, 0);
1728
7.18k
  unsigned int by = _BF (instr, 9, 8);
1729
7.18k
  unsigned int srcB = _BF (instr, 17, 10);
1730
7.18k
  unsigned int imm_msb = _BTST (instr, 18);
1731
7.18k
  unsigned int eq = _BTST (instr, 19);
1732
7.18k
  unsigned int defer = _BF (instr, 21, 20);
1733
7.18k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1734
7.18k
  bool err = false;
1735
1736
7.18k
  if (eq)
1737
4.86k
    dinfo->fprintf_func (dinfo->stream, "br=byte[");
1738
2.32k
  else
1739
2.32k
    dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1740
1741
7.18k
  if (nfp_me_is_imm_opnd8 (srcA))
1742
2.17k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1743
2.17k
              src_lmext, imm_msb, dinfo);
1744
5.00k
  else
1745
5.00k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1746
5.00k
              src_lmext, imm_msb, dinfo);
1747
1748
7.18k
  dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1749
1750
7.18k
  if (nfp_me_is_imm_opnd8 (srcA))
1751
2.17k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1752
2.17k
              src_lmext, imm_msb, dinfo);
1753
5.00k
  else
1754
5.00k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1755
5.00k
              src_lmext, imm_msb, dinfo);
1756
1757
7.18k
  dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1758
1759
7.18k
  if (defer)
1760
2.39k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1761
1762
7.18k
  if (err)
1763
0
    return _NFP_ERR_CONT;
1764
7.18k
  return 0;
1765
7.18k
}
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.34k
{
1771
2.34k
  unsigned int srcA = _BF (instr, 7, 0);
1772
2.34k
  unsigned int srcB = _BF (instr, 17, 10);
1773
2.34k
  unsigned int b = _BTST (instr, 18);
1774
2.34k
  unsigned int defer = _BF (instr, 21, 20);
1775
2.34k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1776
2.34k
  bool err = false;
1777
1778
2.34k
  if (b)
1779
1.81k
    dinfo->fprintf_func (dinfo->stream, "br_bset[");
1780
525
  else
1781
525
    dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1782
1783
2.34k
  if (nfp_me_is_imm_opnd8 (srcA))
1784
298
    {
1785
298
      err = err
1786
298
  || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1787
298
      b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1788
298
    }
1789
2.04k
  else
1790
2.04k
    {
1791
2.04k
      err = err
1792
2.04k
  || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1793
2.04k
      b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1794
2.04k
    }
1795
1796
2.34k
  dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1797
1798
2.34k
  if (defer)
1799
1.98k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1800
1801
2.34k
  if (err)
1802
0
    return _NFP_ERR_CONT;
1803
2.34k
  return 0;
1804
2.34k
}
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.30k
{
1810
1.30k
  unsigned int srcA = _BF (instr, 9, 0);
1811
1.30k
  unsigned int srcB = _BF (instr, 19, 10);
1812
1.30k
  unsigned int defer = _BF (instr, 21, 20);
1813
1.30k
  unsigned int imm = _BF (instr, 30, 22);
1814
1.30k
  bool err = false;
1815
1816
1.30k
  if (nfp_me_is_imm_opnd10 (srcA))
1817
663
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1818
644
  else
1819
644
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1820
1821
1.30k
  if (!imm)
1822
45
    dinfo->fprintf_func (dinfo->stream, "rtn[");
1823
1.26k
  else
1824
1.26k
    dinfo->fprintf_func (dinfo->stream, "jump[");
1825
1826
1.30k
  if (nfp_me_is_imm_opnd10 (srcA))
1827
663
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1828
644
  else
1829
644
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1830
1831
1.30k
  if (imm)
1832
1.26k
    dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1833
1834
1.30k
  dinfo->fprintf_func (dinfo->stream, "]");
1835
1836
1.30k
  if (defer)
1837
395
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1838
1839
1.30k
  if (err)
1840
77
    return _NFP_ERR_CONT;
1841
1.23k
  return 0;
1842
1.30k
}
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
491
{
1850
491
  unsigned int srcA = _BF (instr, 9, 0);
1851
491
  unsigned int srcB = _BF (instr, 19, 10);
1852
491
  unsigned int mstep = _BF (instr, 22, 20);
1853
491
  char dst_bank = 'A' + _BTST (instr, 23);
1854
491
  unsigned int swap = _BTST (instr, 30);
1855
491
  unsigned int mtype = _BF (instr, 32, 31);
1856
491
  unsigned int nocc = _BTST (instr, 40);
1857
491
  bool err = false;
1858
1859
491
  if (swap)
1860
87
    {
1861
87
      unsigned int tmp = srcA;
1862
87
      srcA = srcB;
1863
87
      srcB = tmp;
1864
87
    }
1865
1866
491
  dinfo->fprintf_func (dinfo->stream, "mul_step[");
1867
1868
491
  if (mstep >= 4)
1869
126
    err = err
1870
126
      || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1871
365
  else
1872
365
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1873
365
               src_lmext, dinfo);
1874
1875
491
  dinfo->fprintf_func (dinfo->stream, ", ");
1876
1877
491
  if (mstep >= 4)
1878
126
    dinfo->fprintf_func (dinfo->stream, "--");
1879
365
  else
1880
365
    err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1881
262
               src_lmext, dinfo);
1882
1883
491
  dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1884
491
  if (mtype > 0)
1885
379
    {
1886
379
      const char *s = nfp_me27_28_mult_steps[mstep];
1887
379
      if (!s)
1888
65
  {
1889
65
    s = "<invalid mul_step>";
1890
65
    err = true;
1891
65
  }
1892
379
      dinfo->fprintf_func (dinfo->stream, "_%s", s);
1893
379
    }
1894
1895
491
  if (nocc)
1896
253
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1897
491
  if (gpr_wrboth)
1898
198
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1899
491
  if (pred_cc)
1900
323
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1901
1902
491
  if (err)
1903
222
    return _NFP_ERR_CONT;
1904
269
  return 0;
1905
491
}
1906
1907
static int
1908
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1909
1.42M
{
1910
1.42M
  const nfp_cmd_mnemonic *a = arg_a;
1911
1.42M
  const nfp_cmd_mnemonic *b = arg_b;
1912
1913
1.42M
  if (a->cpp_target != b->cpp_target)
1914
659k
    return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
1915
1916
764k
  if (a->cpp_action != b->cpp_action)
1917
399k
    return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1918
1919
364k
  return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
1920
764k
}
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
161k
{
1928
161k
  nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1929
161k
  const nfp_cmd_mnemonic *cmd = NULL;
1930
1931
161k
  cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1932
161k
     sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1933
1934
161k
  if (!cmd)
1935
52.5k
    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
116k
  while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1940
7.31k
    --cmd;
1941
1942
  /* Now compare by cpp_len and make sure we stay in range.  */
1943
118k
  for (; (cmd < (mnemonics + mnemonics_cnt))
1944
118k
       && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1945
116k
    {
1946
116k
      if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1947
106k
  return cmd->mnemonic;
1948
116k
    }
1949
1950
2.46k
  return NULL;
1951
108k
}
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
20.1k
{
1959
20.1k
  unsigned int srcA = _BF (instr, 7, 0);
1960
20.1k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
1961
20.1k
  unsigned int srcB = _BF (instr, 17, 10);
1962
20.1k
  unsigned int token = _BF (instr, 19, 18);
1963
20.1k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1964
20.1k
  unsigned int cpp_len = _BF (instr, 27, 25);
1965
20.1k
  unsigned int sig = _BF (instr, 31, 28);
1966
20.1k
  unsigned int tgtcmd = _BF (instr, 38, 32);
1967
20.1k
  unsigned int indref = _BTST (instr, 41);
1968
20.1k
  unsigned int mode = _BF (instr, 44, 42);
1969
1970
20.1k
  bool err = false;
1971
20.1k
  int cpp_target = -1;
1972
20.1k
  int cpp_action = -1;
1973
20.1k
  const char *mnemonic = NULL;
1974
20.1k
  unsigned int imm;
1975
20.1k
  unsigned int valBA;
1976
20.1k
  int visswap = ((mode == 1) || (mode == 3));
1977
1978
20.1k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1979
20.1k
  valBA = (srcB << 8) | srcA;
1980
1981
20.1k
  if (mode == 6)
1982
1.42k
    {
1983
1.42k
      token = 0;
1984
1.42k
      sig = 0;
1985
1.42k
      xfer = 0;
1986
1.42k
    }
1987
1988
  /* Convert tgtcmd to action/token tuple.  */
1989
20.1k
  if (_BF (tgtcmd, 6, 5) == 0x0)
1990
11.3k
    {
1991
11.3k
      switch (_BF (tgtcmd, 4, 2))
1992
11.3k
  {
1993
8.37k
  case 0:
1994
8.37k
    cpp_target = NFP_3200_CPPTGT_CAP;
1995
8.37k
    dinfo->fprintf_func (dinfo->stream, "cap[");
1996
8.37k
    break;
1997
953
  case 1:
1998
953
    cpp_target = NFP_3200_CPPTGT_MSF0;
1999
953
    dinfo->fprintf_func (dinfo->stream, "msf0[");
2000
953
    break;
2001
470
  case 2:
2002
470
    cpp_target = NFP_3200_CPPTGT_MSF1;
2003
470
    dinfo->fprintf_func (dinfo->stream, "msf1[");
2004
470
    break;
2005
265
  case 3:
2006
265
    cpp_target = NFP_3200_CPPTGT_PCIE;
2007
265
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2008
265
    break;
2009
340
  case 4:
2010
340
    cpp_target = NFP_3200_CPPTGT_HASH;
2011
340
    break;
2012
481
  case 5:
2013
481
    cpp_target = NFP_3200_CPPTGT_CRYPTO;
2014
481
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2015
481
    break;
2016
307
  case 6:
2017
307
    cpp_target = NFP_3200_CPPTGT_ARM;
2018
307
    dinfo->fprintf_func (dinfo->stream, "arm[");
2019
307
    break;
2020
199
  case 7:
2021
199
    cpp_target = NFP_3200_CPPTGT_CT;
2022
199
    dinfo->fprintf_func (dinfo->stream, "ct[");
2023
199
    break;
2024
11.3k
  }
2025
11.3k
      cpp_action = _BF (tgtcmd, 1, 0);
2026
11.3k
    }
2027
8.75k
  else
2028
8.75k
    {
2029
8.75k
      switch (_BF (tgtcmd, 6, 4))
2030
8.75k
  {
2031
754
  case 2:
2032
754
    cpp_target = NFP_3200_CPPTGT_GS;
2033
754
    dinfo->fprintf_func (dinfo->stream, "scratch[");
2034
754
    break;
2035
1.98k
  case 3:
2036
1.98k
    cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM.  */
2037
1.98k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2038
1.98k
    break;
2039
1.33k
  case 4:
2040
2.16k
  case 5:
2041
2.16k
    cpp_target = NFP_3200_CPPTGT_MU;
2042
2.16k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2043
2.16k
    break;
2044
2.23k
  case 6:
2045
3.85k
  case 7:
2046
3.85k
    cpp_target = NFP_3200_CPPTGT_CLS;
2047
3.85k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2048
3.85k
    break;
2049
8.75k
  }
2050
8.75k
      cpp_action = _BF (tgtcmd, 3, 0);
2051
8.75k
    }
2052
2053
20.1k
  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
20.1k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2061
20.1k
           nfp_me27_mnemonics,
2062
20.1k
           ARRAY_SIZE (nfp_me27_mnemonics));
2063
2064
20.1k
  if (!mnemonic)
2065
3.74k
    {
2066
3.74k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2067
3.74k
         cpp_target, cpp_action, token);
2068
3.74k
      return _NFP_ERR_CONT;
2069
3.74k
    }
2070
2071
16.3k
  if (cpp_target == NFP_3200_CPPTGT_HASH)
2072
130
    {
2073
130
      dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2074
130
         mnemonic, xfer, cpp_len);
2075
130
      goto print_opt_toks;
2076
130
    }
2077
2078
16.2k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2079
2080
16.2k
  if (visswap)
2081
2.17k
    {
2082
2.17k
      unsigned int tmp = srcA;
2083
2.17k
      srcA = srcB;
2084
2.17k
      srcB = tmp;
2085
2.17k
    }
2086
2087
16.2k
  switch (mode)
2088
16.2k
    {
2089
8.22k
    case 0:     /* (A << 8) + B.  */
2090
9.66k
    case 1:     /* (B << 8) + A.  */
2091
9.66k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2092
9.66k
      err = err
2093
9.66k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2094
9.66k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2095
9.66k
      err = err
2096
9.66k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2097
9.66k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2098
9.66k
      break;
2099
934
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2100
1.66k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2101
1.66k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2102
1.66k
      err = err
2103
1.66k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2104
1.66k
      if (third_party_32bit)
2105
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2106
1.66k
      else
2107
1.66k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2108
1.66k
      err = err
2109
1.66k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2110
1.66k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2111
1.66k
      break;
2112
1.50k
    case 4:     /* A + B.  */
2113
1.50k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2114
1.50k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2115
1.50k
      dinfo->fprintf_func (dinfo->stream, ", ");
2116
1.50k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2117
1.50k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2118
1.50k
      break;
2119
1.12k
    case 5:     /* Immediate address.  */
2120
1.12k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2121
1.12k
         (cpp_len + 1));
2122
1.12k
      break;
2123
1.33k
    case 6:     /* Immediate address and data.  */
2124
1.33k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2125
1.33k
      break;
2126
975
    case 7:     /* Immediate data.  */
2127
975
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2128
975
         ((xfer << 16) | valBA), (cpp_len + 1));
2129
975
      break;
2130
16.2k
    }
2131
2132
16.3k
 print_opt_toks:
2133
16.3k
  dinfo->fprintf_func (dinfo->stream, "]");
2134
2135
16.3k
  if (indref && (mode != 2) && (mode != 3))
2136
4.13k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2137
2138
16.3k
  if (ctxswap_defer != 3)
2139
13.5k
    {
2140
13.5k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2141
13.5k
      if (sig)
2142
6.01k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2143
7.55k
      else
2144
7.55k
  dinfo->fprintf_func (dinfo->stream, "--]");
2145
2146
13.5k
      if (ctxswap_defer != 0)
2147
4.79k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2148
13.5k
    }
2149
2.83k
  else if (sig)
2150
1.85k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2151
2152
16.3k
  if (err)
2153
0
    return _NFP_ERR_CONT;
2154
16.3k
  return 0;
2155
16.3k
}
2156
2157
static int
2158
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
2159
      struct disassemble_info *dinfo)
2160
442
{
2161
442
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2162
442
}
2163
2164
static int
2165
nfp_me27_print_alu (uint64_t instr, int num_ctx,
2166
        struct disassemble_info *dinfo)
2167
259
{
2168
259
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2169
259
}
2170
2171
static int
2172
nfp_me27_print_immed (uint64_t instr, int num_ctx,
2173
          struct disassemble_info *dinfo)
2174
87
{
2175
87
  return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2176
87
}
2177
2178
static int
2179
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
2180
       struct disassemble_info *dinfo)
2181
241
{
2182
241
  return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2183
241
}
2184
2185
static int
2186
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2187
1.65k
{
2188
1.65k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2189
1.65k
}
2190
2191
static int
2192
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
2193
        struct disassemble_info *dinfo)
2194
70
{
2195
70
  return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2196
70
}
2197
2198
static int
2199
nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2200
206
{
2201
206
  return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
2202
206
}
2203
2204
static int
2205
nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
2206
      struct disassemble_info *dinfo)
2207
629
{
2208
629
  return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2209
629
}
2210
2211
static int
2212
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
2213
           struct disassemble_info *dinfo)
2214
115
{
2215
115
  return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2216
115
}
2217
2218
static int
2219
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
2220
           struct disassemble_info *dinfo)
2221
7
{
2222
7
  return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2223
7
}
2224
2225
static int
2226
nfp_me27_print_mult (uint64_t instr, int num_ctx,
2227
         struct disassemble_info *dinfo)
2228
61
{
2229
61
  return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2230
61
}
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
162k
{
2238
162k
  unsigned int srcA = _BF (instr, 7, 0);
2239
162k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
2240
162k
  unsigned int srcB = _BF (instr, 17, 10);
2241
162k
  unsigned int token = _BF (instr, 19, 18);
2242
162k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2243
162k
  unsigned int cpp_len = _BF (instr, 27, 25);
2244
162k
  unsigned int sig = _BF (instr, 31, 28);
2245
162k
  unsigned int tgtcmd = _BF (instr, 38, 32);
2246
162k
  unsigned int indref = _BTST (instr, 41);
2247
162k
  unsigned int mode = _BF (instr, 44, 42);
2248
2249
162k
  bool err = false;
2250
162k
  int cpp_target = -1;
2251
162k
  int cpp_action = -1;
2252
162k
  const char *mnemonic = NULL;
2253
162k
  unsigned int imm;
2254
162k
  unsigned int valBA;
2255
162k
  int visswap = ((mode == 1) || (mode == 3));
2256
2257
162k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2258
162k
  valBA = (srcB << 8) | srcA;
2259
2260
162k
  if (mode == 6)
2261
9.93k
    {
2262
9.93k
      token = 0;
2263
9.93k
      sig = 0;
2264
9.93k
      xfer = 0;
2265
9.93k
    }
2266
2267
  /* Convert tgtcmd to action/token tuple.  */
2268
162k
  if (_BF (tgtcmd, 6, 5) == 0x0)
2269
91.3k
    {
2270
91.3k
      switch (_BF (tgtcmd, 4, 2))
2271
91.3k
  {
2272
61.2k
  case 0:
2273
61.2k
    cpp_target = NFP_6000_CPPTGT_ILA;
2274
61.2k
    dinfo->fprintf_func (dinfo->stream, "ila[");
2275
61.2k
    break;
2276
7.97k
  case 1:
2277
7.97k
    cpp_target = NFP_6000_CPPTGT_NBI;
2278
7.97k
    dinfo->fprintf_func (dinfo->stream, "nbi[");
2279
7.97k
    break;
2280
4.60k
  case 3:
2281
4.60k
    cpp_target = NFP_6000_CPPTGT_PCIE;
2282
4.60k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2283
4.60k
    break;
2284
2.38k
  case 5:
2285
2.38k
    cpp_target = NFP_6000_CPPTGT_CRYPTO;
2286
2.38k
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2287
2.38k
    break;
2288
2.17k
  case 6:
2289
2.17k
    cpp_target = NFP_6000_CPPTGT_ARM;
2290
2.17k
    dinfo->fprintf_func (dinfo->stream, "arm[");
2291
2.17k
    break;
2292
3.05k
  case 7:
2293
3.05k
    cpp_target = NFP_6000_CPPTGT_CTXPB;
2294
3.05k
    dinfo->fprintf_func (dinfo->stream, "ct[");
2295
3.05k
    break;
2296
91.3k
  }
2297
91.3k
      cpp_action = _BF (tgtcmd, 1, 0);
2298
91.3k
    }
2299
70.7k
  else
2300
70.7k
    {
2301
      /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2302
   for mem/cls it's "a".  */
2303
70.7k
      cpp_action = _BF (tgtcmd, 4, 0);
2304
70.7k
      switch (_BF (tgtcmd, 6, 4))
2305
70.7k
  {
2306
12.3k
  case 3:
2307
12.3k
    cpp_target = NFP_6000_CPPTGT_VQDR;
2308
12.3k
    cpp_action = _BF (tgtcmd, 3, 0);
2309
12.3k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2310
12.3k
    break;
2311
15.0k
  case 4:
2312
24.0k
  case 5:
2313
24.0k
    cpp_target = NFP_6000_CPPTGT_MU;
2314
24.0k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2315
24.0k
    break;
2316
11.8k
  case 6:
2317
23.3k
  case 7:
2318
23.3k
    cpp_target = NFP_6000_CPPTGT_CLS;
2319
23.3k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2320
23.3k
    break;
2321
70.7k
  }
2322
70.7k
    }
2323
2324
162k
  if (cpp_target < 0)
2325
20.8k
    {
2326
20.8k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2327
20.8k
         cpp_target, cpp_action, token);
2328
20.8k
      return _NFP_ERR_CONT;
2329
20.8k
    }
2330
2331
141k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2332
141k
           nfp_me28_mnemonics,
2333
141k
           ARRAY_SIZE (nfp_me28_mnemonics));
2334
2335
141k
  if (!mnemonic)
2336
51.2k
    {
2337
51.2k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2338
51.2k
         cpp_target, cpp_action, token);
2339
51.2k
      return _NFP_ERR_CONT;
2340
51.2k
    }
2341
2342
89.9k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2343
2344
89.9k
  if (visswap)
2345
14.7k
    {
2346
14.7k
      unsigned int tmp = srcA;
2347
14.7k
      srcA = srcB;
2348
14.7k
      srcB = tmp;
2349
14.7k
    }
2350
2351
89.9k
  switch (mode)
2352
89.9k
    {
2353
43.0k
    case 0:     /* (A << 8) + B.  */
2354
51.0k
    case 1:     /* (B << 8) + A.  */
2355
51.0k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2356
51.0k
      err = err
2357
51.0k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2358
51.0k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2359
51.0k
      err = err
2360
51.0k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2361
51.0k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2362
51.0k
      break;
2363
8.25k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2364
15.0k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2365
15.0k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2366
15.0k
      err = err
2367
15.0k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2368
15.0k
      if (third_party_32bit)
2369
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2370
15.0k
      else
2371
15.0k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2372
15.0k
      err = err
2373
15.0k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2374
15.0k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2375
15.0k
      break;
2376
6.73k
    case 4:     /* A + B.  */
2377
6.73k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2378
6.73k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2379
6.73k
      dinfo->fprintf_func (dinfo->stream, ", ");
2380
6.73k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2381
6.73k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2382
6.73k
      break;
2383
4.67k
    case 5:     /* Immediate address.  */
2384
4.67k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2385
4.67k
         (cpp_len + 1));
2386
4.67k
      break;
2387
5.70k
    case 6:     /* Immediate address and data.  */
2388
5.70k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2389
5.70k
      break;
2390
6.74k
    case 7:     /* Immediate data.  */
2391
6.74k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2392
6.74k
         ((xfer << 16) | valBA), (cpp_len + 1));
2393
6.74k
      break;
2394
89.9k
    }
2395
2396
89.9k
  dinfo->fprintf_func (dinfo->stream, "]");
2397
2398
89.9k
  if (indref && (mode != 2) && (mode != 3))
2399
20.5k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2400
2401
89.9k
  if (ctxswap_defer != 3)
2402
74.9k
    {
2403
74.9k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2404
74.9k
      if (sig)
2405
32.4k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2406
42.5k
      else
2407
42.5k
  dinfo->fprintf_func (dinfo->stream, "--]");
2408
2409
74.9k
      if (ctxswap_defer != 0)
2410
28.5k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2411
74.9k
    }
2412
14.9k
  else if (sig)
2413
9.22k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2414
2415
89.9k
  if (err)
2416
0
    return _NFP_ERR_CONT;
2417
89.9k
  return 0;
2418
89.9k
}
2419
2420
static int
2421
nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
2422
      struct disassemble_info *dinfo)
2423
21.0k
{
2424
21.0k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2425
21.0k
  unsigned int src_lmext = _BTST (instr, 42);
2426
21.0k
  unsigned int dst_lmext = _BTST (instr, 43);
2427
21.0k
  unsigned int pred_cc = _BTST (instr, 44);
2428
2429
21.0k
  return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2430
21.0k
            src_lmext, gpr_wrboth, num_ctx, dinfo);
2431
21.0k
}
2432
2433
static int
2434
nfp_me28_print_alu (uint64_t instr, int num_ctx,
2435
        struct disassemble_info *dinfo)
2436
23.1k
{
2437
23.1k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2438
23.1k
  unsigned int src_lmext = _BTST (instr, 42);
2439
23.1k
  unsigned int dst_lmext = _BTST (instr, 43);
2440
23.1k
  unsigned int pred_cc = _BTST (instr, 44);
2441
2442
23.1k
  return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2443
23.1k
        gpr_wrboth, num_ctx, dinfo);
2444
23.1k
}
2445
2446
static int
2447
nfp_me28_print_immed (uint64_t instr, int num_ctx,
2448
          struct disassemble_info *dinfo)
2449
2.21k
{
2450
2.21k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2451
2.21k
  unsigned int dst_lmext = _BTST (instr, 43);
2452
2.21k
  unsigned int pred_cc = _BTST (instr, 44);
2453
2454
2.21k
  return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2455
2.21k
          num_ctx, dinfo);
2456
2.21k
}
2457
2458
static int
2459
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
2460
       struct disassemble_info *dinfo)
2461
1.05k
{
2462
1.05k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2463
1.05k
  unsigned int src_lmext = _BTST (instr, 42);
2464
1.05k
  unsigned int dst_lmext = _BTST (instr, 43);
2465
1.05k
  unsigned int pred_cc = _BTST (instr, 44);
2466
2467
1.05k
  return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2468
1.05k
             src_lmext, gpr_wrboth, num_ctx, dinfo);
2469
1.05k
}
2470
2471
static int
2472
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2473
5.37k
{
2474
5.37k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2475
5.37k
}
2476
2477
static int
2478
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
2479
        struct disassemble_info *dinfo)
2480
1.25k
{
2481
1.25k
  unsigned int src_lmext = _BTST (instr, 42);
2482
2483
1.25k
  return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2484
1.25k
}
2485
2486
static int
2487
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2488
205
{
2489
205
  return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2490
205
}
2491
2492
static int
2493
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
2494
      struct disassemble_info *dinfo)
2495
6.55k
{
2496
6.55k
  unsigned int src_lmext = _BTST (instr, 42);
2497
6.55k
  return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2498
6.55k
}
2499
2500
static int
2501
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
2502
           struct disassemble_info *dinfo)
2503
2.22k
{
2504
2.22k
  unsigned int src_lmext = _BTST (instr, 42);
2505
2.22k
  return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2506
2.22k
}
2507
2508
static int
2509
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
2510
           struct disassemble_info *dinfo)
2511
1.30k
{
2512
1.30k
  unsigned int src_lmext = _BTST (instr, 42);
2513
1.30k
  return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2514
1.30k
}
2515
2516
static int
2517
nfp_me28_print_mult (uint64_t instr, int num_ctx,
2518
         struct disassemble_info *dinfo)
2519
430
{
2520
430
  unsigned int gpr_wrboth = _BTST (instr, 41);
2521
430
  unsigned int src_lmext = _BTST (instr, 42);
2522
430
  unsigned int dst_lmext = _BTST (instr, 43);
2523
430
  unsigned int pred_cc = _BTST (instr, 44);
2524
2525
430
  return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2526
430
         gpr_wrboth, num_ctx, dinfo);
2527
430
}
2528
2529
static bool
2530
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2531
146
{
2532
146
  Elf_Internal_Shdr *sec = NULL;
2533
146
  Elf_Nfp_MeConfig mecfg_ent;
2534
146
  unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2535
146
  file_ptr roff = 0;
2536
146
  unsigned int sec_cnt = 0;
2537
146
  unsigned int sec_idx;
2538
146
  size_t menum_linear = 0;
2539
2540
146
  if (!dinfo->section)
2541
    /* No section info, will use default values.  */
2542
146
    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
429
{
2678
429
  int mecfg_orders[64][2];
2679
429
  size_t isl;
2680
429
  unsigned int sec_cnt = 0;
2681
429
  unsigned int sec_idx;
2682
429
  bool is_for_text;
2683
2684
429
  memset (mecfg_orders, -1, sizeof (mecfg_orders));
2685
2686
429
  if (dinfo->section == NULL
2687
83
      || dinfo->section->owner == NULL
2688
83
      || elf_elfsections (dinfo->section->owner) == NULL)
2689
    /* No section info, will use default values.  */
2690
429
    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
300k
{
2759
300k
  if (!for_each_disassembler_option (dinfo, nfp_parse_option, opts))
2760
0
    return _NFP_ERR_STOP;
2761
2762
300k
  return 0;
2763
300k
}
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
300k
{
2771
300k
  nfp_priv_data *priv;
2772
300k
  int ret = false;
2773
2774
300k
  if (dinfo->private_data)
2775
298k
    return (nfp_priv_data *) dinfo->private_data;
2776
2777
#if 0  /* Right now only section-related info is kept in priv.
2778
    So don't even calloc it if we don't need it.  */
2779
  if (!dinfo->section)
2780
     return NULL;
2781
#endif
2782
2783
  /* Alloc with no free, seems to be either this or a static global variable
2784
     and this at least keeps a large struct unallocated until really needed.  */
2785
1.47k
  priv = calloc (1, sizeof (*priv));
2786
1.47k
  if (!priv)
2787
0
    return NULL;
2788
2789
1.47k
  switch (dinfo->mach)
2790
1.47k
    {
2791
146
    case E_NFP_MACH_3200:
2792
146
      ret = init_nfp3200_priv (priv, dinfo);
2793
146
      break;
2794
429
    case E_NFP_MACH_6000:
2795
429
      ret = init_nfp6000_priv (priv, dinfo);
2796
429
      break;
2797
1.47k
    }
2798
2799
1.47k
  if (!ret)
2800
900
    {
2801
900
      free (priv);
2802
900
      return NULL;
2803
900
    }
2804
2805
575
  dinfo->private_data = priv;
2806
575
  return priv;
2807
1.47k
}
2808
2809
static int
2810
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2811
300k
{
2812
300k
  nfp_priv_data *priv = init_nfp_priv (dinfo);
2813
300k
  bfd_byte buffer[8];
2814
300k
  int err;
2815
300k
  uint64_t instr = 0;
2816
300k
  size_t island, menum;
2817
300k
  int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2818
300k
  int is_text = 1;
2819
2820
300k
  err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2821
300k
  if (err)
2822
554
    return _NFP_ERR_STOP;
2823
2824
299k
  if (!dinfo->section)
2825
141k
    {
2826
141k
      num_ctx = 8;
2827
141k
      scs_cnt = 0;
2828
141k
      addr_3rdparty32 = 0;
2829
141k
    }
2830
158k
  else
2831
158k
    {
2832
158k
      unsigned int sh_info = 0;
2833
158k
      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
158k
      if (!priv)
2838
0
  return _NFP_ERR_STOP; /* Sanity check */
2839
2840
158k
      is_text = (elf_section_flags (dinfo->section)
2841
158k
     & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2842
2843
158k
      sh_info = elf_section_info (dinfo->section);
2844
2845
158k
      switch (dinfo->mach)
2846
158k
  {
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
158k
  default:
2852
158k
    island = SHI_NFP_ISLAND (sh_info);
2853
158k
    menum = SHI_NFP_MENUM (sh_info);
2854
158k
    break;
2855
158k
  }
2856
2857
158k
      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
158k
      mecfg = &priv->mecfgs[island][menum][is_text];
2864
158k
      num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2865
158k
      addr_3rdparty32 = mecfg->addr_3rdparty32;
2866
158k
      scs_cnt = mecfg->scs_cnt;
2867
158k
    }
2868
2869
299k
  if (opts->ctx_mode)
2870
0
    num_ctx = opts->ctx_mode;
2871
2872
299k
  dinfo->bytes_per_line = 8;
2873
299k
  dinfo->bytes_per_chunk = 8;
2874
2875
299k
  instr = bfd_getl64 (buffer);
2876
2877
299k
  if (opts->show_pc)
2878
299k
    {
2879
299k
      pc = (int) (addr >> 3);
2880
2881
      /* Guess max PC for formatting */
2882
299k
      tmpj = (int) (dinfo->buffer_length >> 3);
2883
299k
      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.02M
      for (tmpi = 1; tmpj > 9; tmpj /= 10)
2895
722k
  tmpi++;
2896
2897
299k
      tmpj = pc;
2898
981k
      for (; tmpj > 9; tmpj /= 10)
2899
682k
  tmpi--;
2900
2901
299k
      dinfo->fprintf_func (dinfo->stream, "%*c%d  ", tmpi, '.', pc);
2902
299k
    }
2903
2904
299k
  switch (dinfo->mach)
2905
299k
    {
2906
32.1k
    case E_NFP_MACH_3200:
2907
32.1k
      if (NFP_ME27_INSTR_IS_CMD (instr))
2908
20.1k
  err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2909
11.9k
      else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2910
442
  err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2911
11.5k
      else if (NFP_ME27_INSTR_IS_ALU (instr))
2912
259
  err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2913
11.2k
      else if (NFP_ME27_INSTR_IS_IMMED (instr))
2914
87
  err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2915
11.1k
      else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2916
241
  err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2917
10.9k
      else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2918
1.65k
  err = nfp_me27_print_ctx_arb (instr, dinfo);
2919
9.27k
      else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2920
70
  err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2921
9.20k
      else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2922
206
  err = nfp_me27_print_branch (instr, dinfo);
2923
8.99k
      else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2924
629
  err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2925
8.36k
      else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2926
115
  err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2927
8.25k
      else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2928
7
  err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2929
8.24k
      else if (NFP_ME27_INSTR_IS_MULT (instr))
2930
61
  err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2931
8.18k
      else
2932
8.18k
  err = nfp_me_print_invalid (instr, dinfo);
2933
32.1k
      break;
2934
2935
266k
    case E_NFP_MACH_6000:
2936
266k
      if (NFP_ME28_INSTR_IS_CMD (instr))
2937
162k
  err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2938
104k
      else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2939
21.0k
  err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2940
83.6k
      else if (NFP_ME28_INSTR_IS_ALU (instr))
2941
23.1k
  err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2942
60.4k
      else if (NFP_ME28_INSTR_IS_IMMED (instr))
2943
2.21k
  err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2944
58.2k
      else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2945
1.05k
  err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2946
57.1k
      else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2947
5.37k
  err = nfp_me28_print_ctx_arb (instr, dinfo);
2948
51.8k
      else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2949
1.25k
  err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2950
50.5k
      else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2951
205
  err = nfp_me28_print_branch (instr, dinfo);
2952
50.3k
      else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2953
6.55k
  err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2954
43.8k
      else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2955
2.22k
  err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2956
41.5k
      else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2957
1.30k
  err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2958
40.2k
      else if (NFP_ME28_INSTR_IS_MULT (instr))
2959
430
  err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2960
39.8k
      else
2961
39.8k
  err = nfp_me_print_invalid (instr, dinfo);
2962
266k
      break;
2963
299k
    }
2964
2965
299k
  if (err < 0)
2966
132k
    return err;
2967
167k
  return 8;
2968
299k
}
2969
2970
int
2971
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2972
300k
{
2973
300k
  nfp_opts opts;
2974
300k
  int err;
2975
2976
300k
  opts.show_pc = 1;
2977
300k
  opts.ctx_mode = 0;
2978
300k
  err = parse_disassembler_options (&opts, dinfo);
2979
300k
  if (err < 0)
2980
0
    goto end;
2981
2982
300k
  err = _print_instrs (addr, dinfo, &opts);
2983
2984
300k
 end:
2985
300k
  if (err != 8)
2986
133k
    dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2987
300k
  if (err == _NFP_ERR_CONT)
2988
132k
    return 8;
2989
167k
  return err;
2990
300k
}
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
}