Coverage Report

Created: 2026-07-25 10:20

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
989
#define _NFP_ERR_STOP -1
39
769k
#define _NFP_ERR_CONT -8
40
41
1.44M
#define _BTST(v, b)               (((v) >> b) & 1)
42
7.63M
#define _BF(v, msb, lsb)          (((v) >> (lsb)) & \
43
7.63M
           ((1U << ((msb) - (lsb) + 1)) - 1))
44
484k
#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
634k
#define _NFP_ISLAND_MAX 64
50
317k
#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
77.5k
{
930
77.5k
  const char * err_msg = N_("<invalid_instruction>:");
931
77.5k
  dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
932
77.5k
  return _NFP_ERR_CONT;
933
77.5k
}
934
935
static bool
936
nfp_me_is_imm_opnd10 (unsigned int opnd)
937
72.3k
{
938
72.3k
  return _BF (opnd, 9, 8) == 0x3;
939
72.3k
}
940
941
static bool
942
nfp_me_is_imm_opnd8 (unsigned int opnd)
943
65.7k
{
944
65.7k
  return _BTST (opnd, 5);
945
65.7k
}
946
947
static unsigned int
948
nfp_me_imm_opnd10 (unsigned int opnd)
949
10.0k
{
950
10.0k
  return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
951
10.0k
}
952
953
static unsigned int
954
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
955
4.11k
{
956
4.11k
  unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
957
958
4.11k
  return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
959
4.11k
}
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
77.6k
{
967
77.6k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
968
969
  /* Absolute GPR.  */
970
77.6k
  if (_BF (opnd, 9, 7) == 0x1)
971
10.1k
    dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
972
973
  /* Relative GPR.  */
974
67.4k
  else if (_BF (opnd, 9, 6) == 0x0)
975
11.3k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
976
977
  /* Indexed Xfer.  */
978
56.0k
  else if (_BF (opnd, 9, 7) == 0x2)
979
6.79k
    {
980
6.79k
      dinfo->fprintf_func (dinfo->stream, "*$index");
981
6.79k
      if (_BF (opnd, 2, 1) == 0x1)
982
1.14k
  dinfo->fprintf_func (dinfo->stream, "++");
983
5.65k
      else if (_BF (opnd, 2, 1) == 0x2)
984
1.94k
  dinfo->fprintf_func (dinfo->stream, "--");
985
6.79k
    }
986
987
  /* Relative Xfer.  */
988
49.2k
  else if (_BF (opnd, 9, 7) == 0x3)
989
8.07k
    {
990
8.07k
      if (_BTST (opnd, 6))
991
3.81k
  n += (num_ctx == 8 ? 16 : 32);
992
8.07k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
993
8.07k
    }
994
995
  /* Indexed Next Neighbour.  */
996
41.1k
  else if (_BF (opnd, 9, 6) == 0x9)
997
6.57k
    {
998
6.57k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
999
6.57k
      if (_BTST (opnd, 1))
1000
4.31k
  dinfo->fprintf_func (dinfo->stream, "++");
1001
6.57k
    }
1002
1003
  /* Relative Next Neighbour.  */
1004
34.6k
  else if (_BF (opnd, 9, 6) == 0xa)
1005
7.39k
    {
1006
7.39k
      dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1007
7.39k
    }
1008
1009
  /* Indexed LMEM.  */
1010
27.2k
  else if (_BF (opnd, 9, 6) == 0x8)
1011
5.17k
    {
1012
5.17k
      n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1013
5.17k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1014
5.17k
      if (_BTST (opnd, 4))
1015
1.57k
  dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1016
3.60k
      else if (_BF (opnd, 3, 0))
1017
2.94k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1018
5.17k
    }
1019
1020
  /* 8-bit Constant value.  */
1021
22.0k
  else if (_BF (opnd, 9, 8) == 0x3)
1022
9.64k
    dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1023
1024
12.3k
  else
1025
12.3k
    {
1026
12.3k
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1027
12.3k
      return false;
1028
12.3k
    }
1029
1030
65.2k
  return true;
1031
77.6k
}
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
440k
{
1040
440k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1041
1042
  /* Relative GPR.  */
1043
440k
  if (_BF (opnd, 7, 5) == 0x0)
1044
206k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1045
1046
  /* Relative Xfer.  */
1047
233k
  else if (_BF (opnd, 7, 5) == 0x4)
1048
42.6k
    dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1049
1050
  /* Relative Xfer.  */
1051
191k
  else if (_BF (opnd, 7, 5) == 0x6)
1052
34.7k
    {
1053
34.7k
      n += (num_ctx == 8 ? 16 : 32);
1054
34.7k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1055
34.7k
    }
1056
1057
  /* Indexed Xfer.  */
1058
156k
  else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1059
18.6k
    {
1060
18.6k
      dinfo->fprintf_func (dinfo->stream, "*$index");
1061
18.6k
      if (_BF (opnd, 2, 1) == 0x1)
1062
5.17k
  dinfo->fprintf_func (dinfo->stream, "++");
1063
13.4k
      else if (_BF (opnd, 2, 1) == 0x2)
1064
2.04k
  dinfo->fprintf_func (dinfo->stream, "--");
1065
18.6k
    }
1066
1067
  /* Indexed NN.  */
1068
137k
  else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1069
9.14k
    {
1070
9.14k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
1071
9.14k
      if (_BTST (opnd, 1))
1072
3.51k
  dinfo->fprintf_func (dinfo->stream, "++");
1073
9.14k
    }
1074
1075
  /* Indexed LMEM.  */
1076
128k
  else if (_BF (opnd, 7, 4) == 0x5)
1077
15.6k
    {
1078
15.6k
      n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1079
15.6k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1080
15.6k
      if (_BF (opnd, 2, 0))
1081
12.9k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1082
15.6k
    }
1083
1084
  /* 7+1-bit Constant value.  */
1085
112k
  else if (_BTST (opnd, 5))
1086
112k
    {
1087
112k
      n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1088
112k
      dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1089
112k
    }
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
440k
  return true;
1098
440k
}
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
38.1k
{
1106
38.1k
  unsigned int op = _BF (instr, 35, 33);
1107
38.1k
  unsigned int srcA = _BF (instr, 7, 0);
1108
38.1k
  unsigned int srcB = _BF (instr, 17, 10);
1109
38.1k
  unsigned int dst = _BF (instr, 27, 20);
1110
38.1k
  unsigned int sc = _BF (instr, 9, 8);
1111
38.1k
  unsigned int imm_msb = _BTST (instr, 18);
1112
38.1k
  unsigned int swap = _BTST (instr, 19);
1113
38.1k
  unsigned int shift = _BF (instr, 32, 28);
1114
38.1k
  char dst_bank = 'A' + _BTST (instr, 36);
1115
38.1k
  unsigned int nocc = _BTST (instr, 40);
1116
38.1k
  bool err = false;
1117
1118
38.1k
  if (swap)
1119
18.3k
    {
1120
18.3k
      unsigned int tmp = srcA;
1121
18.3k
      srcA = srcB;
1122
18.3k
      srcB = tmp;
1123
18.3k
    }
1124
1125
  /* alu_shf, dbl_shf, asr.  */
1126
38.1k
  if (op < 7)
1127
32.6k
    {
1128
32.6k
      if (sc == 3)
1129
6.88k
  dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1130
25.7k
      else if (op == 6)
1131
3.10k
  dinfo->fprintf_func (dinfo->stream, "asr[");
1132
22.6k
      else
1133
22.6k
  dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1134
1135
      /* dest operand */
1136
32.6k
      if (nfp_me_is_imm_opnd8 (dst))
1137
13.3k
  dinfo->fprintf_func (dinfo->stream, "--");
1138
19.2k
      else
1139
19.2k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1140
19.2k
            dst_lmext, imm_msb, dinfo);
1141
1142
32.6k
      dinfo->fprintf_func (dinfo->stream, ", ");
1143
1144
      /* A operand.  */
1145
32.6k
      if (op != 6)
1146
28.9k
  {
1147
28.9k
    if ((op < 2) && (sc != 3))  /* Not dbl_shf.  */
1148
8.13k
      dinfo->fprintf_func (dinfo->stream, "--");  /* B or ~B operator.  */
1149
20.8k
    else
1150
20.8k
      err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1151
20.8k
                num_ctx, src_lmext, imm_msb,
1152
20.8k
                dinfo);
1153
1154
28.9k
    dinfo->fprintf_func (dinfo->stream, ", ");
1155
1156
    /* Operator (not for dbl_shf).  */
1157
28.9k
    if (sc != 3)
1158
22.6k
      {
1159
22.6k
        dinfo->fprintf_func (dinfo->stream, "%s, ",
1160
22.6k
           nfp_mealu_shf_op[op]);
1161
22.6k
      }
1162
28.9k
  }
1163
1164
      /* B operand.  */
1165
32.6k
      err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1166
32.6k
          num_ctx, src_lmext, imm_msb, dinfo);
1167
1168
32.6k
      dinfo->fprintf_func (dinfo->stream, ", ");
1169
1170
      /* Shift */
1171
32.6k
      if (sc == 0)
1172
11.2k
  dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1173
21.3k
      else if (sc == 2)
1174
5.85k
  {
1175
5.85k
    if (shift)
1176
5.31k
      dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1177
534
    else
1178
534
      dinfo->fprintf_func (dinfo->stream, "<<indirect");
1179
5.85k
  }
1180
15.5k
      else
1181
15.5k
  {
1182
15.5k
    if (shift)
1183
14.2k
      dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1184
1.28k
    else
1185
1.28k
      dinfo->fprintf_func (dinfo->stream, ">>indirect");
1186
15.5k
  }
1187
32.6k
    }
1188
  /* Byte Align.  */
1189
5.57k
  else if (op == 7)
1190
5.57k
    {
1191
5.57k
      dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1192
5.57k
         ((sc == 2) ? "le" : "be"));
1193
1194
      /* Dest operand.  */
1195
5.57k
      if (nfp_me_is_imm_opnd8 (dst))
1196
3.55k
  dinfo->fprintf_func (dinfo->stream, "--");
1197
2.02k
      else
1198
2.02k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1199
2.02k
            dst_lmext, imm_msb, dinfo);
1200
1201
5.57k
      dinfo->fprintf_func (dinfo->stream, ", ");
1202
1203
5.57k
      if (sc == 2)
1204
1.10k
  err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1205
1.10k
            0, imm_msb, dinfo);
1206
4.47k
      else
1207
4.47k
  err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1208
4.47k
            0, imm_msb, dinfo);
1209
5.57k
    }
1210
1211
38.1k
  dinfo->fprintf_func (dinfo->stream, "]");
1212
38.1k
  if (nocc)
1213
19.0k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1214
38.1k
  if (gpr_wrboth)
1215
17.3k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1216
38.1k
  if (pred_cc)
1217
15.9k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1218
1219
38.1k
  if (err)
1220
0
    return _NFP_ERR_CONT;
1221
38.1k
  return 0;
1222
38.1k
}
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
37.1k
{
1230
37.1k
  unsigned int op = _BF (instr, 35, 31);
1231
37.1k
  unsigned int srcA = _BF (instr, 9, 0);
1232
37.1k
  unsigned int srcB = _BF (instr, 19, 10);
1233
37.1k
  unsigned int dst = _BF (instr, 29, 20);
1234
37.1k
  unsigned int swap = _BTST (instr, 30);
1235
37.1k
  char dst_bank = 'A' + _BTST (instr, 36);
1236
37.1k
  unsigned int nocc = _BTST (instr, 40);
1237
37.1k
  int do_close_bracket = 1;
1238
37.1k
  bool err = false;
1239
1240
37.1k
  if (swap)
1241
11.0k
    {
1242
11.0k
      unsigned int tmp = srcA;
1243
11.0k
      srcA = srcB;
1244
11.0k
      srcB = tmp;
1245
11.0k
    }
1246
1247
37.1k
  switch (op)
1248
37.1k
    {
1249
983
    case 3:     /* pop_count3[dst, srcB] */
1250
1.74k
    case 6:     /* pop_count1[srcB] */
1251
2.68k
    case 7:     /* pop_count2[srcB] */
1252
3.90k
    case 14:      /* ffs[dst, srcB] */
1253
6.16k
    case 15:      /* cam_read_tag[dst, srcB] */
1254
8.18k
    case 31:      /* cam_read_state[dst, srcB] */
1255
8.18k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1256
1257
      /* No dest for pop_count1/2.  */
1258
8.18k
      if ((op != 6) && (op != 7))
1259
6.48k
  {
1260
    /* dest operand */
1261
6.48k
    if (nfp_me_is_imm_opnd10 (dst))
1262
1.81k
      dinfo->fprintf_func (dinfo->stream, "--");
1263
4.67k
    else
1264
4.67k
      err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1265
4.67k
                 dst_lmext, dinfo);
1266
1267
6.48k
    dinfo->fprintf_func (dinfo->stream, ", ");
1268
6.48k
  }
1269
1270
      /* B operand.  */
1271
8.18k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1272
6.92k
           num_ctx, src_lmext, dinfo);
1273
8.18k
      break;
1274
 
1275
      /* cam_clear.  */
1276
1.08k
    case 11:
1277
1.08k
      do_close_bracket = 0;
1278
1.08k
      dinfo->fprintf_func (dinfo->stream, "cam_clear");
1279
1.08k
      break;
1280
1281
      /* cam_lookup.  */
1282
2.14k
    case 23:
1283
2.14k
      do_close_bracket = 0;
1284
2.14k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1285
1286
      /* Dest operand.  */
1287
2.14k
      if (nfp_me_is_imm_opnd10 (dst))
1288
804
  dinfo->fprintf_func (dinfo->stream, "--");
1289
1.34k
      else
1290
1.34k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1291
1.34k
             dst_lmext, dinfo);
1292
1293
2.14k
      dinfo->fprintf_func (dinfo->stream, ", ");
1294
1295
      /* A operand.  */
1296
2.14k
      err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1297
1.95k
           num_ctx, src_lmext, dinfo);
1298
1299
2.14k
      dinfo->fprintf_func (dinfo->stream, "]");
1300
1301
2.14k
      if (_BF (srcB, 1, 0))
1302
1.81k
  {
1303
1.81k
    unsigned int n = _BTST (srcB, 1);
1304
1.81k
    if (_BTST (srcB, 4))  /* Only for MEv28.  */
1305
300
      n += 2;
1306
1.81k
    dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1307
1.81k
             _BF (srcB, 3, 2));
1308
1.81k
  }
1309
1310
2.14k
      break;
1311
1312
2.79k
    case 19:      /* cam_write.  */
1313
4.59k
    case 27:      /* cam_write_state.  */
1314
4.59k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1315
4.59k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1316
4.59k
           num_ctx, src_lmext, dinfo);
1317
4.59k
      dinfo->fprintf_func (dinfo->stream, ", ");
1318
4.59k
      if (op == 19)
1319
2.79k
  {
1320
2.79k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1321
2.64k
               num_ctx, src_lmext, dinfo);
1322
2.79k
    dinfo->fprintf_func (dinfo->stream, ", ");
1323
2.79k
  }
1324
4.59k
      dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1325
4.59k
      break;
1326
1327
      /* CRC.  */
1328
1.39k
    case 18:  
1329
1.39k
      do_close_bracket = 0;
1330
1.39k
      dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1331
1.39k
         _BTST (srcA, 3) ? "le" : "be");
1332
1.39k
      if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
1333
190
  {
1334
190
    dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1335
190
    err = true;
1336
190
  }
1337
1.20k
      else
1338
1.20k
  {
1339
1.20k
    dinfo->fprintf_func (dinfo->stream, "%s, ",
1340
1.20k
             nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
1341
1.20k
  }
1342
1343
      /* Dest operand.  */
1344
1.39k
      if (nfp_me_is_imm_opnd10 (dst))
1345
322
  dinfo->fprintf_func (dinfo->stream, "--");
1346
1.07k
      else
1347
1.07k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1348
948
             dst_lmext, dinfo);
1349
1350
1.39k
      dinfo->fprintf_func (dinfo->stream, ", ");
1351
1352
      /* B operand.  */
1353
1.39k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1354
1.01k
           num_ctx, src_lmext, dinfo);
1355
1356
1.39k
      dinfo->fprintf_func (dinfo->stream, "]");
1357
1.39k
      if (_BF (srcA, 2, 0))
1358
989
  dinfo->fprintf_func (dinfo->stream, ", %s",
1359
989
           nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
1360
1.39k
      if (_BTST (srcA, 4))
1361
694
  dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1362
1.39k
      break;
1363
1364
19.7k
    default:
1365
      /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs).  */
1366
19.7k
      dinfo->fprintf_func (dinfo->stream, "alu[");
1367
1368
      /* Dest operand.  */
1369
19.7k
      if (nfp_me_is_imm_opnd10 (dst))
1370
5.48k
  dinfo->fprintf_func (dinfo->stream, "--");
1371
14.2k
      else
1372
14.2k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1373
14.2k
             dst_lmext, dinfo);
1374
19.7k
      dinfo->fprintf_func (dinfo->stream, ", ");
1375
1376
      /* A operand.  */
1377
19.7k
      if ((op == 0) || (op == 4))  /* B only operators.  */
1378
2.02k
  dinfo->fprintf_func (dinfo->stream, "--");
1379
17.6k
      else
1380
17.6k
  err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1381
15.2k
             num_ctx, src_lmext, dinfo);
1382
1383
19.7k
      if (!nfp_me27_28_alu_op[op])
1384
6.05k
  {
1385
6.05k
    dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1386
6.05k
    err = true;
1387
6.05k
  }
1388
13.6k
      else
1389
13.6k
  {
1390
13.6k
    dinfo->fprintf_func (dinfo->stream, ", %s, ",
1391
13.6k
             nfp_me27_28_alu_op[op]);
1392
13.6k
  }
1393
1394
      /* B operand.  */
1395
19.7k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1396
11.1k
           num_ctx, src_lmext, dinfo);
1397
19.7k
      break;
1398
37.1k
    }
1399
1400
37.1k
  if (do_close_bracket)
1401
32.4k
    dinfo->fprintf_func (dinfo->stream, "]");
1402
1403
37.1k
  if (nocc)
1404
19.5k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1405
37.1k
  if (gpr_wrboth)
1406
18.1k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1407
37.1k
  if (pred_cc)
1408
16.3k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1409
1410
37.1k
  if (err)
1411
12.6k
    return _NFP_ERR_CONT;
1412
24.4k
  return 0;
1413
37.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
8.11k
{
1421
8.11k
  unsigned int srcA = _BF (instr, 9, 0);
1422
8.11k
  unsigned int srcB = _BF (instr, 19, 10);
1423
8.11k
  unsigned int imm = _BF (instr, 27, 20);
1424
8.11k
  unsigned int by = _BTST (instr, 29);
1425
8.11k
  unsigned int wd = _BTST (instr, 30);
1426
8.11k
  unsigned int inv = _BTST (instr, 31);
1427
8.11k
  unsigned int byte_shift = _BF (instr, 34, 33);
1428
8.11k
  bool err = false;
1429
1430
8.11k
  if (nfp_me_is_imm_opnd10 (srcB))
1431
1.22k
    {
1432
1.22k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1433
1.22k
      if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
1434
230
  {
1435
230
    dinfo->fprintf_func (dinfo->stream, "nop");
1436
230
    return 0;
1437
230
  }
1438
1.22k
    }
1439
6.89k
  else
1440
6.89k
    {
1441
6.89k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1442
6.89k
    }
1443
1444
7.88k
  if (inv)
1445
5.55k
    imm = (imm ^ 0xffff) | 0xffff0000U;
1446
1447
7.88k
  if (by)
1448
5.53k
    {
1449
5.53k
      dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1450
5.53k
      imm &= 0xff;
1451
5.53k
    }
1452
2.35k
  else if (wd)
1453
654
    {
1454
654
      dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1455
654
      imm &= 0xffff;
1456
654
    }
1457
1.70k
  else
1458
1.70k
    dinfo->fprintf_func (dinfo->stream, "immed[");
1459
1460
  /* Dest.  */
1461
7.88k
  if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1462
359
    dinfo->fprintf_func (dinfo->stream, "--");  /* No Dest.  */
1463
7.52k
  else if (nfp_me_is_imm_opnd10 (srcA))
1464
734
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1465
6.79k
  else
1466
6.79k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1467
1468
7.88k
  dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1469
1470
7.88k
  if ((!by) && (!wd) && (byte_shift))
1471
993
    dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1472
1473
7.88k
  dinfo->fprintf_func (dinfo->stream, "]");
1474
1475
7.88k
  if (gpr_wrboth)
1476
5.00k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1477
7.88k
  if (pred_cc)
1478
5.51k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1479
1480
7.88k
  if (err)
1481
3.35k
    return _NFP_ERR_CONT;
1482
4.53k
  return 0;
1483
7.88k
}
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
2.08k
{
1491
2.08k
  unsigned int load_cc = _BTST (instr, 34);
1492
2.08k
  unsigned int shift = _BF (instr, 32, 28);
1493
2.08k
  unsigned int byte_mask = _BF (instr, 27, 24);
1494
2.08k
  unsigned int zerof = _BTST (instr, 20);
1495
2.08k
  unsigned int swap = _BTST (instr, 19);
1496
2.08k
  unsigned int imm_msb = _BTST (instr, 18);
1497
2.08k
  unsigned int src = _BF (instr, 17, 10);
1498
2.08k
  unsigned int sc = _BF (instr, 9, 8);
1499
2.08k
  unsigned int dst = _BF (instr, 7, 0);
1500
2.08k
  bool err = false;
1501
1502
2.08k
  if (swap)
1503
374
    {
1504
374
      unsigned int tmp = src;
1505
374
      src = dst;
1506
374
      dst = tmp;
1507
374
    }
1508
1509
2.08k
  if (zerof)
1510
431
    dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1511
1.65k
  else
1512
1.65k
    dinfo->fprintf_func (dinfo->stream, "ld_field[");
1513
1514
2.08k
  err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1515
2.08k
            dst_lmext, imm_msb, dinfo);
1516
2.08k
  dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1517
2.08k
           _BTST (byte_mask, 3),
1518
2.08k
           _BTST (byte_mask, 2),
1519
2.08k
           _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1520
2.08k
  err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1521
2.08k
            src_lmext, imm_msb, dinfo);
1522
1523
2.08k
  if ((sc == 0) && (shift != 0))
1524
818
    dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1525
1.26k
  else if (sc == 1)
1526
403
    {
1527
403
      if (shift)
1528
248
  dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1529
155
      else
1530
155
  dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1531
403
    }
1532
864
  else if (sc == 2)
1533
304
    {
1534
304
      if (shift)
1535
212
  dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1536
92
      else
1537
92
  dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1538
304
    }
1539
560
  else if (sc == 3)
1540
287
    dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1541
1542
2.08k
  dinfo->fprintf_func (dinfo->stream, "]");
1543
1544
2.08k
  if (load_cc)
1545
596
    dinfo->fprintf_func (dinfo->stream, ", load_cc");
1546
2.08k
  if (gpr_wrboth)
1547
473
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1548
2.08k
  if (pred_cc)
1549
642
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1550
1551
2.08k
  if (err)
1552
0
    return _NFP_ERR_CONT;
1553
2.08k
  return 0;
1554
2.08k
}
1555
1556
static int
1557
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
1558
13.3k
{
1559
13.3k
  unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1560
13.3k
  unsigned int defer = _BF (instr, 21, 20);
1561
13.3k
  unsigned int no_load = _BTST (instr, 19);
1562
13.3k
  unsigned int resume = _BTST (instr, 18);
1563
13.3k
  unsigned int bpt = _BTST (instr, 17);
1564
13.3k
  unsigned int sig_or = _BTST (instr, 16);
1565
13.3k
  unsigned int ev_mask = _BF (instr, 15, 0);
1566
1567
13.3k
  dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1568
13.3k
  if (bpt)
1569
4.83k
    dinfo->fprintf_func (dinfo->stream, "bpt");
1570
8.56k
  else if (ev_mask == 1)
1571
297
    dinfo->fprintf_func (dinfo->stream, "voluntary");
1572
8.26k
  else if ((!no_load) && (ev_mask == 0))
1573
515
    {
1574
515
      dinfo->fprintf_func (dinfo->stream, "kill");
1575
515
      sig_or = 0;
1576
515
    }
1577
7.75k
  else if (ev_mask == 0)
1578
331
    dinfo->fprintf_func (dinfo->stream, "--");
1579
7.42k
  else
1580
7.42k
    {
1581
7.42k
      int first_print = 1;
1582
7.42k
      unsigned int n;
1583
1584
118k
      for (n = 1; n < 16; n++)
1585
111k
  {
1586
111k
    if (!_BTST (ev_mask, n))
1587
59.1k
      continue;
1588
52.1k
    dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1589
52.1k
             (first_print) ? "" : ", ", n);
1590
52.1k
    first_print = 0;
1591
52.1k
  }
1592
7.42k
    }
1593
1594
13.3k
  dinfo->fprintf_func (dinfo->stream, "]");
1595
1596
13.3k
  if (sig_or)
1597
5.58k
    dinfo->fprintf_func (dinfo->stream, ", any");
1598
13.3k
  if (resume)
1599
6.66k
    dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1600
13.3k
  if (defer)
1601
9.57k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1602
1603
13.3k
  return 0;
1604
13.3k
}
1605
1606
static int
1607
nfp_me27_28_print_local_csr (uint64_t instr,
1608
           unsigned int src_lmext,
1609
           int num_ctx, struct disassemble_info *dinfo)
1610
2.38k
{
1611
2.38k
  unsigned int srcA = _BF (instr, 9, 0);
1612
2.38k
  unsigned int srcB = _BF (instr, 19, 10);
1613
2.38k
  unsigned int wr = _BTST (instr, 21);
1614
2.38k
  unsigned int csr_num = _BF (instr, 32, 22);
1615
2.38k
  unsigned int src = srcA;
1616
2.38k
  char src_bank = 'A';
1617
2.38k
  bool err = false;
1618
1619
2.38k
  if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1620
172
    {
1621
172
      src_bank = 'B';
1622
172
      src = srcB;
1623
172
    }
1624
1625
  /* MEv28 does not have urd/uwr.  */
1626
2.38k
  if (csr_num == 1)
1627
126
    {
1628
126
      if (wr)
1629
85
  {
1630
85
    dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1631
85
             (int) _BTST (instr, 20));
1632
85
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1633
85
               src_lmext, dinfo);
1634
85
  }
1635
41
      else
1636
41
  {
1637
41
    dinfo->fprintf_func (dinfo->stream, "urd[");
1638
41
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1639
41
               src_lmext, dinfo);
1640
41
    dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1641
41
             (int) _BTST (instr, 20));
1642
41
  }
1643
126
      dinfo->fprintf_func (dinfo->stream, "]");
1644
126
    }
1645
2.25k
  else
1646
2.25k
    {
1647
2.25k
      const char *nm = NULL;
1648
1649
2.25k
      if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1650
320
  nm = nfp_me27_28_mecsrs[csr_num];
1651
1652
2.25k
      dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1653
2.25k
         (wr) ? "wr" : "rd");
1654
2.25k
      if (nm)
1655
310
  dinfo->fprintf_func (dinfo->stream, "%s", nm);
1656
1.94k
      else
1657
1.94k
  dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1658
1659
2.25k
      if (wr)
1660
793
  {
1661
793
    dinfo->fprintf_func (dinfo->stream, ", ");
1662
793
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1663
793
               src_lmext, dinfo);
1664
793
  }
1665
2.25k
      dinfo->fprintf_func (dinfo->stream, "]");
1666
2.25k
    }
1667
1668
2.38k
  if (err)
1669
434
    return _NFP_ERR_CONT;
1670
1.94k
  return 0;
1671
2.38k
}
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
943
{
1678
943
  unsigned int br_op = _BF (instr, 4, 0);
1679
943
  unsigned int ctx_sig_state = _BF (instr, 17, 14);
1680
943
  unsigned int defer = _BF (instr, 21, 20);
1681
943
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1682
943
  int ret = 0;
1683
1684
943
  if (!nfp_me27_28_br_ops[br_op])
1685
112
    {
1686
112
      dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
1687
112
      ret = _NFP_ERR_CONT;
1688
112
    }
1689
831
  else
1690
831
    dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1691
1692
943
  switch (br_op)
1693
943
    {
1694
55
    case 16:      /* br=ctx */
1695
336
    case 17:      /* br!=ctx */
1696
512
    case 18:      /* br_signal */
1697
586
    case 19:      /* br_!signal */
1698
586
      dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1699
586
      break;
1700
14
    case 20:      /* "br_inp_state" */
1701
107
    case 21:      /* "br_!inp_state" */
1702
107
      dinfo->fprintf_func (dinfo->stream, "%s, ",
1703
107
         br_inpstates[ctx_sig_state]);
1704
107
      break;
1705
87
    case 22:      /* "br_cls_state" */
1706
109
    case 23:      /* "br_!cls_state" */
1707
109
      dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1708
109
         ctx_sig_state);
1709
109
      break;
1710
141
    default:
1711
141
      break;
1712
943
    }
1713
1714
943
  dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1715
1716
943
  if (defer)
1717
229
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1718
1719
943
  return ret;
1720
943
}
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
9.65k
{
1727
9.65k
  unsigned int srcA = _BF (instr, 7, 0);
1728
9.65k
  unsigned int by = _BF (instr, 9, 8);
1729
9.65k
  unsigned int srcB = _BF (instr, 17, 10);
1730
9.65k
  unsigned int imm_msb = _BTST (instr, 18);
1731
9.65k
  unsigned int eq = _BTST (instr, 19);
1732
9.65k
  unsigned int defer = _BF (instr, 21, 20);
1733
9.65k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1734
9.65k
  bool err = false;
1735
1736
9.65k
  if (eq)
1737
6.01k
    dinfo->fprintf_func (dinfo->stream, "br=byte[");
1738
3.63k
  else
1739
3.63k
    dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1740
1741
9.65k
  if (nfp_me_is_imm_opnd8 (srcA))
1742
3.09k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1743
3.09k
              src_lmext, imm_msb, dinfo);
1744
6.56k
  else
1745
6.56k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1746
6.56k
              src_lmext, imm_msb, dinfo);
1747
1748
9.65k
  dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1749
1750
9.65k
  if (nfp_me_is_imm_opnd8 (srcA))
1751
3.09k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1752
3.09k
              src_lmext, imm_msb, dinfo);
1753
6.56k
  else
1754
6.56k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1755
6.56k
              src_lmext, imm_msb, dinfo);
1756
1757
9.65k
  dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1758
1759
9.65k
  if (defer)
1760
4.13k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1761
1762
9.65k
  if (err)
1763
0
    return _NFP_ERR_CONT;
1764
9.65k
  return 0;
1765
9.65k
}
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
4.11k
{
1771
4.11k
  unsigned int srcA = _BF (instr, 7, 0);
1772
4.11k
  unsigned int srcB = _BF (instr, 17, 10);
1773
4.11k
  unsigned int b = _BTST (instr, 18);
1774
4.11k
  unsigned int defer = _BF (instr, 21, 20);
1775
4.11k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1776
4.11k
  bool err = false;
1777
1778
4.11k
  if (b)
1779
2.79k
    dinfo->fprintf_func (dinfo->stream, "br_bset[");
1780
1.32k
  else
1781
1.32k
    dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1782
1783
4.11k
  if (nfp_me_is_imm_opnd8 (srcA))
1784
500
    {
1785
500
      err = err
1786
500
  || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1787
500
      b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1788
500
    }
1789
3.61k
  else
1790
3.61k
    {
1791
3.61k
      err = err
1792
3.61k
  || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1793
3.61k
      b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1794
3.61k
    }
1795
1796
4.11k
  dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1797
1798
4.11k
  if (defer)
1799
3.22k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1800
1801
4.11k
  if (err)
1802
0
    return _NFP_ERR_CONT;
1803
4.11k
  return 0;
1804
4.11k
}
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.97k
{
1810
1.97k
  unsigned int srcA = _BF (instr, 9, 0);
1811
1.97k
  unsigned int srcB = _BF (instr, 19, 10);
1812
1.97k
  unsigned int defer = _BF (instr, 21, 20);
1813
1.97k
  unsigned int imm = _BF (instr, 30, 22);
1814
1.97k
  bool err = false;
1815
1816
1.97k
  if (nfp_me_is_imm_opnd10 (srcA))
1817
815
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1818
1.15k
  else
1819
1.15k
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1820
1821
1.97k
  if (!imm)
1822
45
    dinfo->fprintf_func (dinfo->stream, "rtn[");
1823
1.92k
  else
1824
1.92k
    dinfo->fprintf_func (dinfo->stream, "jump[");
1825
1826
1.97k
  if (nfp_me_is_imm_opnd10 (srcA))
1827
815
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1828
1.15k
  else
1829
1.15k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1830
1831
1.97k
  if (imm)
1832
1.92k
    dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1833
1834
1.97k
  dinfo->fprintf_func (dinfo->stream, "]");
1835
1836
1.97k
  if (defer)
1837
545
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1838
1839
1.97k
  if (err)
1840
89
    return _NFP_ERR_CONT;
1841
1.88k
  return 0;
1842
1.97k
}
1843
1844
static int
1845
nfp_me27_28_print_mult (uint64_t instr, unsigned int pred_cc,
1846
      unsigned int dst_lmext, unsigned int src_lmext,
1847
      unsigned int gpr_wrboth,
1848
      int num_ctx, struct disassemble_info *dinfo)
1849
1.50k
{
1850
1.50k
  unsigned int srcA = _BF (instr, 9, 0);
1851
1.50k
  unsigned int srcB = _BF (instr, 19, 10);
1852
1.50k
  unsigned int mstep = _BF (instr, 22, 20);
1853
1.50k
  char dst_bank = 'A' + _BTST (instr, 23);
1854
1.50k
  unsigned int swap = _BTST (instr, 30);
1855
1.50k
  unsigned int mtype = _BF (instr, 32, 31);
1856
1.50k
  unsigned int nocc = _BTST (instr, 40);
1857
1.50k
  bool err = false;
1858
1859
1.50k
  if (swap)
1860
157
    {
1861
157
      unsigned int tmp = srcA;
1862
157
      srcA = srcB;
1863
157
      srcB = tmp;
1864
157
    }
1865
1866
1.50k
  dinfo->fprintf_func (dinfo->stream, "mul_step[");
1867
1868
1.50k
  if (mstep >= 4)
1869
248
    err = err
1870
248
      || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1871
1.25k
  else
1872
1.25k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1873
1.25k
               src_lmext, dinfo);
1874
1875
1.50k
  dinfo->fprintf_func (dinfo->stream, ", ");
1876
1877
1.50k
  if (mstep >= 4)
1878
248
    dinfo->fprintf_func (dinfo->stream, "--");
1879
1.25k
  else
1880
1.25k
    err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1881
945
               src_lmext, dinfo);
1882
1883
1.50k
  dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1884
1.50k
  if (mtype > 0)
1885
939
    {
1886
939
      const char *s = nfp_me27_28_mult_steps[mstep];
1887
939
      if (!s)
1888
112
  {
1889
112
    s = "<invalid mul_step>";
1890
112
    err = true;
1891
112
  }
1892
939
      dinfo->fprintf_func (dinfo->stream, "_%s", s);
1893
939
    }
1894
1895
1.50k
  if (nocc)
1896
533
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1897
1.50k
  if (gpr_wrboth)
1898
571
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1899
1.50k
  if (pred_cc)
1900
722
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1901
1902
1.50k
  if (err)
1903
527
    return _NFP_ERR_CONT;
1904
977
  return 0;
1905
1.50k
}
1906
1907
static int
1908
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1909
2.66M
{
1910
2.66M
  const nfp_cmd_mnemonic *a = arg_a;
1911
2.66M
  const nfp_cmd_mnemonic *b = arg_b;
1912
1913
2.66M
  if (a->cpp_target != b->cpp_target)
1914
1.25M
    return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
1915
1916
1.40M
  if (a->cpp_action != b->cpp_action)
1917
734k
    return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1918
1919
675k
  return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
1920
1.40M
}
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
302k
{
1928
302k
  nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1929
302k
  const nfp_cmd_mnemonic *cmd = NULL;
1930
1931
302k
  cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1932
302k
     sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1933
1934
302k
  if (!cmd)
1935
95.8k
    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
218k
  while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1940
11.0k
    --cmd;
1941
1942
  /* Now compare by cpp_len and make sure we stay in range.  */
1943
223k
  for (; (cmd < (mnemonics + mnemonics_cnt))
1944
223k
       && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1945
219k
    {
1946
219k
      if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1947
202k
  return cmd->mnemonic;
1948
219k
    }
1949
1950
4.11k
  return NULL;
1951
207k
}
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
38.5k
{
1959
38.5k
  unsigned int srcA = _BF (instr, 7, 0);
1960
38.5k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
1961
38.5k
  unsigned int srcB = _BF (instr, 17, 10);
1962
38.5k
  unsigned int token = _BF (instr, 19, 18);
1963
38.5k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1964
38.5k
  unsigned int cpp_len = _BF (instr, 27, 25);
1965
38.5k
  unsigned int sig = _BF (instr, 31, 28);
1966
38.5k
  unsigned int tgtcmd = _BF (instr, 38, 32);
1967
38.5k
  unsigned int indref = _BTST (instr, 41);
1968
38.5k
  unsigned int mode = _BF (instr, 44, 42);
1969
1970
38.5k
  bool err = false;
1971
38.5k
  int cpp_target = -1;
1972
38.5k
  int cpp_action = -1;
1973
38.5k
  const char *mnemonic = NULL;
1974
38.5k
  unsigned int imm;
1975
38.5k
  unsigned int valBA;
1976
38.5k
  int visswap = ((mode == 1) || (mode == 3));
1977
1978
38.5k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1979
38.5k
  valBA = (srcB << 8) | srcA;
1980
1981
38.5k
  if (mode == 6)
1982
2.83k
    {
1983
2.83k
      token = 0;
1984
2.83k
      sig = 0;
1985
2.83k
      xfer = 0;
1986
2.83k
    }
1987
1988
  /* Convert tgtcmd to action/token tuple.  */
1989
38.5k
  if (_BF (tgtcmd, 6, 5) == 0x0)
1990
22.2k
    {
1991
22.2k
      switch (_BF (tgtcmd, 4, 2))
1992
22.2k
  {
1993
15.8k
  case 0:
1994
15.8k
    cpp_target = NFP_3200_CPPTGT_CAP;
1995
15.8k
    dinfo->fprintf_func (dinfo->stream, "cap[");
1996
15.8k
    break;
1997
1.41k
  case 1:
1998
1.41k
    cpp_target = NFP_3200_CPPTGT_MSF0;
1999
1.41k
    dinfo->fprintf_func (dinfo->stream, "msf0[");
2000
1.41k
    break;
2001
706
  case 2:
2002
706
    cpp_target = NFP_3200_CPPTGT_MSF1;
2003
706
    dinfo->fprintf_func (dinfo->stream, "msf1[");
2004
706
    break;
2005
1.14k
  case 3:
2006
1.14k
    cpp_target = NFP_3200_CPPTGT_PCIE;
2007
1.14k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2008
1.14k
    break;
2009
797
  case 4:
2010
797
    cpp_target = NFP_3200_CPPTGT_HASH;
2011
797
    break;
2012
922
  case 5:
2013
922
    cpp_target = NFP_3200_CPPTGT_CRYPTO;
2014
922
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2015
922
    break;
2016
781
  case 6:
2017
781
    cpp_target = NFP_3200_CPPTGT_ARM;
2018
781
    dinfo->fprintf_func (dinfo->stream, "arm[");
2019
781
    break;
2020
667
  case 7:
2021
667
    cpp_target = NFP_3200_CPPTGT_CT;
2022
667
    dinfo->fprintf_func (dinfo->stream, "ct[");
2023
667
    break;
2024
22.2k
  }
2025
22.2k
      cpp_action = _BF (tgtcmd, 1, 0);
2026
22.2k
    }
2027
16.2k
  else
2028
16.2k
    {
2029
16.2k
      switch (_BF (tgtcmd, 6, 4))
2030
16.2k
  {
2031
2.16k
  case 2:
2032
2.16k
    cpp_target = NFP_3200_CPPTGT_GS;
2033
2.16k
    dinfo->fprintf_func (dinfo->stream, "scratch[");
2034
2.16k
    break;
2035
3.25k
  case 3:
2036
3.25k
    cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM.  */
2037
3.25k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2038
3.25k
    break;
2039
3.36k
  case 4:
2040
4.78k
  case 5:
2041
4.78k
    cpp_target = NFP_3200_CPPTGT_MU;
2042
4.78k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2043
4.78k
    break;
2044
3.41k
  case 6:
2045
6.08k
  case 7:
2046
6.08k
    cpp_target = NFP_3200_CPPTGT_CLS;
2047
6.08k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2048
6.08k
    break;
2049
16.2k
  }
2050
16.2k
      cpp_action = _BF (tgtcmd, 3, 0);
2051
16.2k
    }
2052
2053
38.5k
  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
38.5k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2061
38.5k
           nfp_me27_mnemonics,
2062
38.5k
           ARRAY_SIZE (nfp_me27_mnemonics));
2063
2064
38.5k
  if (!mnemonic)
2065
8.82k
    {
2066
8.82k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2067
8.82k
         cpp_target, cpp_action, token);
2068
8.82k
      return _NFP_ERR_CONT;
2069
8.82k
    }
2070
2071
29.7k
  if (cpp_target == NFP_3200_CPPTGT_HASH)
2072
174
    {
2073
174
      dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2074
174
         mnemonic, xfer, cpp_len);
2075
174
      goto print_opt_toks;
2076
174
    }
2077
2078
29.5k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2079
2080
29.5k
  if (visswap)
2081
4.62k
    {
2082
4.62k
      unsigned int tmp = srcA;
2083
4.62k
      srcA = srcB;
2084
4.62k
      srcB = tmp;
2085
4.62k
    }
2086
2087
29.5k
  switch (mode)
2088
29.5k
    {
2089
14.4k
    case 0:     /* (A << 8) + B.  */
2090
17.5k
    case 1:     /* (B << 8) + A.  */
2091
17.5k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2092
17.5k
      err = err
2093
17.5k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2094
17.5k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2095
17.5k
      err = err
2096
17.5k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2097
17.5k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2098
17.5k
      break;
2099
1.49k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2100
3.01k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2101
3.01k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2102
3.01k
      err = err
2103
3.01k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2104
3.01k
      if (third_party_32bit)
2105
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2106
3.01k
      else
2107
3.01k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2108
3.01k
      err = err
2109
3.01k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2110
3.01k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2111
3.01k
      break;
2112
2.60k
    case 4:     /* A + B.  */
2113
2.60k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2114
2.60k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2115
2.60k
      dinfo->fprintf_func (dinfo->stream, ", ");
2116
2.60k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2117
2.60k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2118
2.60k
      break;
2119
1.63k
    case 5:     /* Immediate address.  */
2120
1.63k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2121
1.63k
         (cpp_len + 1));
2122
1.63k
      break;
2123
2.66k
    case 6:     /* Immediate address and data.  */
2124
2.66k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2125
2.66k
      break;
2126
2.07k
    case 7:     /* Immediate data.  */
2127
2.07k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2128
2.07k
         ((xfer << 16) | valBA), (cpp_len + 1));
2129
2.07k
      break;
2130
29.5k
    }
2131
2132
29.7k
 print_opt_toks:
2133
29.7k
  dinfo->fprintf_func (dinfo->stream, "]");
2134
2135
29.7k
  if (indref && (mode != 2) && (mode != 3))
2136
7.08k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2137
2138
29.7k
  if (ctxswap_defer != 3)
2139
24.9k
    {
2140
24.9k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2141
24.9k
      if (sig)
2142
11.1k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2143
13.8k
      else
2144
13.8k
  dinfo->fprintf_func (dinfo->stream, "--]");
2145
2146
24.9k
      if (ctxswap_defer != 0)
2147
9.38k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2148
24.9k
    }
2149
4.79k
  else if (sig)
2150
3.01k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2151
2152
29.7k
  if (err)
2153
0
    return _NFP_ERR_CONT;
2154
29.7k
  return 0;
2155
29.7k
}
2156
2157
static int
2158
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
2159
      struct disassemble_info *dinfo)
2160
1.14k
{
2161
1.14k
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2162
1.14k
}
2163
2164
static int
2165
nfp_me27_print_alu (uint64_t instr, int num_ctx,
2166
        struct disassemble_info *dinfo)
2167
378
{
2168
378
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2169
378
}
2170
2171
static int
2172
nfp_me27_print_immed (uint64_t instr, int num_ctx,
2173
          struct disassemble_info *dinfo)
2174
175
{
2175
175
  return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2176
175
}
2177
2178
static int
2179
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
2180
       struct disassemble_info *dinfo)
2181
193
{
2182
193
  return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2183
193
}
2184
2185
static int
2186
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2187
3.31k
{
2188
3.31k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2189
3.31k
}
2190
2191
static int
2192
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
2193
        struct disassemble_info *dinfo)
2194
180
{
2195
180
  return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2196
180
}
2197
2198
static int
2199
nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2200
273
{
2201
273
  return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
2202
273
}
2203
2204
static int
2205
nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
2206
      struct disassemble_info *dinfo)
2207
893
{
2208
893
  return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2209
893
}
2210
2211
static int
2212
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
2213
           struct disassemble_info *dinfo)
2214
519
{
2215
519
  return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2216
519
}
2217
2218
static int
2219
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
2220
           struct disassemble_info *dinfo)
2221
105
{
2222
105
  return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2223
105
}
2224
2225
static int
2226
nfp_me27_print_mult (uint64_t instr, int num_ctx,
2227
         struct disassemble_info *dinfo)
2228
355
{
2229
355
  return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2230
355
}
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
301k
{
2238
301k
  unsigned int srcA = _BF (instr, 7, 0);
2239
301k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
2240
301k
  unsigned int srcB = _BF (instr, 17, 10);
2241
301k
  unsigned int token = _BF (instr, 19, 18);
2242
301k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2243
301k
  unsigned int cpp_len = _BF (instr, 27, 25);
2244
301k
  unsigned int sig = _BF (instr, 31, 28);
2245
301k
  unsigned int tgtcmd = _BF (instr, 38, 32);
2246
301k
  unsigned int indref = _BTST (instr, 41);
2247
301k
  unsigned int mode = _BF (instr, 44, 42);
2248
2249
301k
  bool err = false;
2250
301k
  int cpp_target = -1;
2251
301k
  int cpp_action = -1;
2252
301k
  const char *mnemonic = NULL;
2253
301k
  unsigned int imm;
2254
301k
  unsigned int valBA;
2255
301k
  int visswap = ((mode == 1) || (mode == 3));
2256
2257
301k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2258
301k
  valBA = (srcB << 8) | srcA;
2259
2260
301k
  if (mode == 6)
2261
18.6k
    {
2262
18.6k
      token = 0;
2263
18.6k
      sig = 0;
2264
18.6k
      xfer = 0;
2265
18.6k
    }
2266
2267
  /* Convert tgtcmd to action/token tuple.  */
2268
301k
  if (_BF (tgtcmd, 6, 5) == 0x0)
2269
177k
    {
2270
177k
      switch (_BF (tgtcmd, 4, 2))
2271
177k
  {
2272
123k
  case 0:
2273
123k
    cpp_target = NFP_6000_CPPTGT_ILA;
2274
123k
    dinfo->fprintf_func (dinfo->stream, "ila[");
2275
123k
    break;
2276
16.0k
  case 1:
2277
16.0k
    cpp_target = NFP_6000_CPPTGT_NBI;
2278
16.0k
    dinfo->fprintf_func (dinfo->stream, "nbi[");
2279
16.0k
    break;
2280
8.55k
  case 3:
2281
8.55k
    cpp_target = NFP_6000_CPPTGT_PCIE;
2282
8.55k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2283
8.55k
    break;
2284
4.29k
  case 5:
2285
4.29k
    cpp_target = NFP_6000_CPPTGT_CRYPTO;
2286
4.29k
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2287
4.29k
    break;
2288
4.26k
  case 6:
2289
4.26k
    cpp_target = NFP_6000_CPPTGT_ARM;
2290
4.26k
    dinfo->fprintf_func (dinfo->stream, "arm[");
2291
4.26k
    break;
2292
4.75k
  case 7:
2293
4.75k
    cpp_target = NFP_6000_CPPTGT_CTXPB;
2294
4.75k
    dinfo->fprintf_func (dinfo->stream, "ct[");
2295
4.75k
    break;
2296
177k
  }
2297
177k
      cpp_action = _BF (tgtcmd, 1, 0);
2298
177k
    }
2299
123k
  else
2300
123k
    {
2301
      /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2302
   for mem/cls it's "a".  */
2303
123k
      cpp_action = _BF (tgtcmd, 4, 0);
2304
123k
      switch (_BF (tgtcmd, 6, 4))
2305
123k
  {
2306
19.2k
  case 3:
2307
19.2k
    cpp_target = NFP_6000_CPPTGT_VQDR;
2308
19.2k
    cpp_action = _BF (tgtcmd, 3, 0);
2309
19.2k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2310
19.2k
    break;
2311
26.1k
  case 4:
2312
41.2k
  case 5:
2313
41.2k
    cpp_target = NFP_6000_CPPTGT_MU;
2314
41.2k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2315
41.2k
    break;
2316
21.8k
  case 6:
2317
43.0k
  case 7:
2318
43.0k
    cpp_target = NFP_6000_CPPTGT_CLS;
2319
43.0k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2320
43.0k
    break;
2321
123k
  }
2322
123k
    }
2323
2324
301k
  if (cpp_target < 0)
2325
36.7k
    {
2326
36.7k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2327
36.7k
         cpp_target, cpp_action, token);
2328
36.7k
      return _NFP_ERR_CONT;
2329
36.7k
    }
2330
2331
264k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2332
264k
           nfp_me28_mnemonics,
2333
264k
           ARRAY_SIZE (nfp_me28_mnemonics));
2334
2335
264k
  if (!mnemonic)
2336
91.1k
    {
2337
91.1k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2338
91.1k
         cpp_target, cpp_action, token);
2339
91.1k
      return _NFP_ERR_CONT;
2340
91.1k
    }
2341
2342
173k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2343
2344
173k
  if (visswap)
2345
26.7k
    {
2346
26.7k
      unsigned int tmp = srcA;
2347
26.7k
      srcA = srcB;
2348
26.7k
      srcB = tmp;
2349
26.7k
    }
2350
2351
173k
  switch (mode)
2352
173k
    {
2353
90.4k
    case 0:     /* (A << 8) + B.  */
2354
104k
    case 1:     /* (B << 8) + A.  */
2355
104k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2356
104k
      err = err
2357
104k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2358
104k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2359
104k
      err = err
2360
104k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2361
104k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2362
104k
      break;
2363
14.1k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2364
26.2k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2365
26.2k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2366
26.2k
      err = err
2367
26.2k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2368
26.2k
      if (third_party_32bit)
2369
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2370
26.2k
      else
2371
26.2k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2372
26.2k
      err = err
2373
26.2k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2374
26.2k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2375
26.2k
      break;
2376
11.6k
    case 4:     /* A + B.  */
2377
11.6k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2378
11.6k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2379
11.6k
      dinfo->fprintf_func (dinfo->stream, ", ");
2380
11.6k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2381
11.6k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2382
11.6k
      break;
2383
8.60k
    case 5:     /* Immediate address.  */
2384
8.60k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2385
8.60k
         (cpp_len + 1));
2386
8.60k
      break;
2387
10.5k
    case 6:     /* Immediate address and data.  */
2388
10.5k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2389
10.5k
      break;
2390
11.0k
    case 7:     /* Immediate data.  */
2391
11.0k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2392
11.0k
         ((xfer << 16) | valBA), (cpp_len + 1));
2393
11.0k
      break;
2394
173k
    }
2395
2396
173k
  dinfo->fprintf_func (dinfo->stream, "]");
2397
2398
173k
  if (indref && (mode != 2) && (mode != 3))
2399
38.5k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2400
2401
173k
  if (ctxswap_defer != 3)
2402
147k
    {
2403
147k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2404
147k
      if (sig)
2405
57.7k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2406
89.4k
      else
2407
89.4k
  dinfo->fprintf_func (dinfo->stream, "--]");
2408
2409
147k
      if (ctxswap_defer != 0)
2410
54.1k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2411
147k
    }
2412
26.0k
  else if (sig)
2413
14.6k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2414
2415
173k
  if (err)
2416
0
    return _NFP_ERR_CONT;
2417
173k
  return 0;
2418
173k
}
2419
2420
static int
2421
nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
2422
      struct disassemble_info *dinfo)
2423
36.6k
{
2424
36.6k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2425
36.6k
  unsigned int src_lmext = _BTST (instr, 42);
2426
36.6k
  unsigned int dst_lmext = _BTST (instr, 43);
2427
36.6k
  unsigned int pred_cc = _BTST (instr, 44);
2428
2429
36.6k
  return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2430
36.6k
            src_lmext, gpr_wrboth, num_ctx, dinfo);
2431
36.6k
}
2432
2433
static int
2434
nfp_me28_print_alu (uint64_t instr, int num_ctx,
2435
        struct disassemble_info *dinfo)
2436
37.1k
{
2437
37.1k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2438
37.1k
  unsigned int src_lmext = _BTST (instr, 42);
2439
37.1k
  unsigned int dst_lmext = _BTST (instr, 43);
2440
37.1k
  unsigned int pred_cc = _BTST (instr, 44);
2441
2442
37.1k
  return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2443
37.1k
        gpr_wrboth, num_ctx, dinfo);
2444
37.1k
}
2445
2446
static int
2447
nfp_me28_print_immed (uint64_t instr, int num_ctx,
2448
          struct disassemble_info *dinfo)
2449
7.94k
{
2450
7.94k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2451
7.94k
  unsigned int dst_lmext = _BTST (instr, 43);
2452
7.94k
  unsigned int pred_cc = _BTST (instr, 44);
2453
2454
7.94k
  return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2455
7.94k
          num_ctx, dinfo);
2456
7.94k
}
2457
2458
static int
2459
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
2460
       struct disassemble_info *dinfo)
2461
1.89k
{
2462
1.89k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2463
1.89k
  unsigned int src_lmext = _BTST (instr, 42);
2464
1.89k
  unsigned int dst_lmext = _BTST (instr, 43);
2465
1.89k
  unsigned int pred_cc = _BTST (instr, 44);
2466
2467
1.89k
  return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2468
1.89k
             src_lmext, gpr_wrboth, num_ctx, dinfo);
2469
1.89k
}
2470
2471
static int
2472
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2473
10.0k
{
2474
10.0k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2475
10.0k
}
2476
2477
static int
2478
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
2479
        struct disassemble_info *dinfo)
2480
2.20k
{
2481
2.20k
  unsigned int src_lmext = _BTST (instr, 42);
2482
2483
2.20k
  return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2484
2.20k
}
2485
2486
static int
2487
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2488
670
{
2489
670
  return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2490
670
}
2491
2492
static int
2493
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
2494
      struct disassemble_info *dinfo)
2495
8.76k
{
2496
8.76k
  unsigned int src_lmext = _BTST (instr, 42);
2497
8.76k
  return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2498
8.76k
}
2499
2500
static int
2501
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
2502
           struct disassemble_info *dinfo)
2503
3.60k
{
2504
3.60k
  unsigned int src_lmext = _BTST (instr, 42);
2505
3.60k
  return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2506
3.60k
}
2507
2508
static int
2509
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
2510
           struct disassemble_info *dinfo)
2511
1.86k
{
2512
1.86k
  unsigned int src_lmext = _BTST (instr, 42);
2513
1.86k
  return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2514
1.86k
}
2515
2516
static int
2517
nfp_me28_print_mult (uint64_t instr, int num_ctx,
2518
         struct disassemble_info *dinfo)
2519
1.14k
{
2520
1.14k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2521
1.14k
  unsigned int src_lmext = _BTST (instr, 42);
2522
1.14k
  unsigned int dst_lmext = _BTST (instr, 43);
2523
1.14k
  unsigned int pred_cc = _BTST (instr, 44);
2524
2525
1.14k
  return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2526
1.14k
         gpr_wrboth, num_ctx, dinfo);
2527
1.14k
}
2528
2529
static bool
2530
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2531
251
{
2532
251
  Elf_Internal_Shdr *sec = NULL;
2533
251
  Elf_Nfp_MeConfig mecfg_ent;
2534
251
  unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2535
251
  file_ptr roff = 0;
2536
251
  unsigned int sec_cnt = 0;
2537
251
  unsigned int sec_idx;
2538
251
  size_t menum_linear = 0;
2539
2540
251
  if (!dinfo->section)
2541
    /* No section info, will use default values.  */
2542
251
    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
761
{
2678
761
  int mecfg_orders[64][2];
2679
761
  size_t isl;
2680
761
  unsigned int sec_cnt = 0;
2681
761
  unsigned int sec_idx;
2682
761
  bool is_for_text;
2683
2684
761
  memset (mecfg_orders, -1, sizeof (mecfg_orders));
2685
2686
761
  if (dinfo->section == NULL
2687
276
      || dinfo->section->owner == NULL
2688
276
      || elf_elfsections (dinfo->section->owner) == NULL)
2689
    /* No section info, will use default values.  */
2690
759
    return true;
2691
2692
2
  sec_cnt = elf_numsections (dinfo->section->owner);
2693
2694
  /* Go through all MECSR init sections to find ME configs.  */
2695
72
  for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2696
70
    {
2697
70
      Elf_Internal_Shdr *sec;
2698
70
      int sec_order;
2699
2700
70
      sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2701
70
      sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
2702
2703
70
      is_for_text = (sec->sh_flags & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2704
2705
      /* If we have an init2 section, that is the one that applies to the
2706
   ME when executing init code.  So we make it's order higher than
2707
   any plain init section.  */
2708
70
      if (sec->sh_flags & SHF_NFP_INIT2)
2709
0
  sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
2710
2711
70
      if (sec->sh_type != SHT_NFP_INITREG)
2712
70
  continue;
2713
0
      if (!SHI_NFP_6000_IS_IREG_MECSR (sec->sh_info))
2714
0
  continue;
2715
2716
0
      isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2717
0
      if ((sec_order < mecfg_orders[isl][is_for_text]))
2718
  /* Lower order or transient, skip it.  */
2719
0
  continue;
2720
2721
0
      mecfg_orders[isl][is_for_text] = sec_order;
2722
2723
0
      if (!init_nfp6000_mecsr_sec (priv, sec, is_for_text, dinfo))
2724
0
  {
2725
0
    dinfo->fprintf_func (dinfo->stream,
2726
0
             _("Error processing section %u "), sec_idx);
2727
0
    return false;
2728
0
  }
2729
0
    }
2730
2731
2
  return true;
2732
2
}
2733
2734
static bool
2735
nfp_parse_option (const char *option, void *data)
2736
0
{
2737
0
  nfp_opts *opts = data;
2738
2739
0
  if (strcmp (option, "no-pc") == 0)
2740
0
    opts->show_pc = 0;
2741
0
  else if (strcmp (option, "ctx4") == 0)
2742
0
    {
2743
0
      if (!opts->ctx_mode)
2744
0
  opts->ctx_mode = 4;
2745
0
    }
2746
0
  else if (strcmp (option, "ctx8") == 0)
2747
0
    opts->ctx_mode = 8;
2748
0
  else
2749
0
    {
2750
0
      opcodes_error_handler (_("invalid NFP option: %s"), option);
2751
0
      return false;
2752
0
    }
2753
0
  return true;
2754
0
}
2755
2756
static int
2757
parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
2758
538k
{
2759
538k
  if (!for_each_disassembler_option (dinfo, nfp_parse_option, opts))
2760
0
    return _NFP_ERR_STOP;
2761
2762
538k
  return 0;
2763
538k
}
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
538k
{
2771
538k
  nfp_priv_data *priv;
2772
538k
  int ret = false;
2773
2774
538k
  if (dinfo->private_data)
2775
536k
    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.36k
  priv = calloc (1, sizeof (*priv));
2786
1.36k
  if (!priv)
2787
0
    return NULL;
2788
2789
1.36k
  switch (dinfo->mach)
2790
1.36k
    {
2791
251
    case E_NFP_MACH_3200:
2792
251
      ret = init_nfp3200_priv (priv, dinfo);
2793
251
      break;
2794
761
    case E_NFP_MACH_6000:
2795
761
      ret = init_nfp6000_priv (priv, dinfo);
2796
761
      break;
2797
1.36k
    }
2798
2799
1.36k
  if (!ret)
2800
357
    {
2801
357
      free (priv);
2802
357
      return NULL;
2803
357
    }
2804
2805
1.01k
  dinfo->private_data = priv;
2806
1.01k
  return priv;
2807
1.36k
}
2808
2809
static int
2810
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2811
538k
{
2812
538k
  nfp_priv_data *priv = init_nfp_priv (dinfo);
2813
538k
  bfd_byte buffer[8];
2814
538k
  int err;
2815
538k
  uint64_t instr = 0;
2816
538k
  size_t island, menum;
2817
538k
  int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2818
538k
  int is_text = 1;
2819
2820
538k
  err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2821
538k
  if (err)
2822
988
    return _NFP_ERR_STOP;
2823
2824
537k
  if (!dinfo->section)
2825
219k
    {
2826
219k
      num_ctx = 8;
2827
219k
      scs_cnt = 0;
2828
219k
      addr_3rdparty32 = 0;
2829
219k
    }
2830
317k
  else
2831
317k
    {
2832
317k
      unsigned int sh_info = 0;
2833
317k
      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
317k
      if (!priv)
2838
0
  return _NFP_ERR_STOP; /* Sanity check */
2839
2840
317k
      is_text = (elf_section_flags (dinfo->section)
2841
317k
     & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2842
2843
317k
      sh_info = elf_section_info (dinfo->section);
2844
2845
317k
      switch (dinfo->mach)
2846
317k
  {
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
317k
  default:
2852
317k
    island = SHI_NFP_ISLAND (sh_info);
2853
317k
    menum = SHI_NFP_MENUM (sh_info);
2854
317k
    break;
2855
317k
  }
2856
2857
317k
      if (island >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2858
1
  {
2859
1
    dinfo->fprintf_func (dinfo->stream, "Invalid island or me.");
2860
1
    return _NFP_ERR_STOP;
2861
1
  }
2862
2863
317k
      mecfg = &priv->mecfgs[island][menum][is_text];
2864
317k
      num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2865
317k
      addr_3rdparty32 = mecfg->addr_3rdparty32;
2866
317k
      scs_cnt = mecfg->scs_cnt;
2867
317k
    }
2868
2869
537k
  if (opts->ctx_mode)
2870
0
    num_ctx = opts->ctx_mode;
2871
2872
537k
  dinfo->bytes_per_line = 8;
2873
537k
  dinfo->bytes_per_chunk = 8;
2874
2875
537k
  instr = bfd_getl64 (buffer);
2876
2877
537k
  if (opts->show_pc)
2878
537k
    {
2879
537k
      pc = (int) (addr >> 3);
2880
2881
      /* Guess max PC for formatting */
2882
537k
      tmpj = (int) (dinfo->buffer_length >> 3);
2883
537k
      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.82M
      for (tmpi = 1; tmpj > 9; tmpj /= 10)
2895
1.29M
  tmpi++;
2896
2897
537k
      tmpj = pc;
2898
1.72M
      for (; tmpj > 9; tmpj /= 10)
2899
1.19M
  tmpi--;
2900
2901
537k
      dinfo->fprintf_func (dinfo->stream, "%*c%d  ", tmpi, '.', pc);
2902
537k
    }
2903
2904
537k
  switch (dinfo->mach)
2905
537k
    {
2906
57.9k
    case E_NFP_MACH_3200:
2907
57.9k
      if (NFP_ME27_INSTR_IS_CMD (instr))
2908
38.5k
  err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2909
19.3k
      else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2910
1.14k
  err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2911
18.2k
      else if (NFP_ME27_INSTR_IS_ALU (instr))
2912
378
  err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2913
17.8k
      else if (NFP_ME27_INSTR_IS_IMMED (instr))
2914
175
  err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2915
17.6k
      else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2916
193
  err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2917
17.4k
      else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2918
3.31k
  err = nfp_me27_print_ctx_arb (instr, dinfo);
2919
14.1k
      else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2920
180
  err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2921
14.0k
      else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2922
273
  err = nfp_me27_print_branch (instr, dinfo);
2923
13.7k
      else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2924
893
  err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2925
12.8k
      else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2926
519
  err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2927
12.3k
      else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2928
105
  err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2929
12.2k
      else if (NFP_ME27_INSTR_IS_MULT (instr))
2930
355
  err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2931
11.8k
      else
2932
11.8k
  err = nfp_me_print_invalid (instr, dinfo);
2933
57.9k
      break;
2934
2935
478k
    case E_NFP_MACH_6000:
2936
478k
      if (NFP_ME28_INSTR_IS_CMD (instr))
2937
301k
  err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2938
177k
      else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2939
36.6k
  err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2940
140k
      else if (NFP_ME28_INSTR_IS_ALU (instr))
2941
37.1k
  err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2942
103k
      else if (NFP_ME28_INSTR_IS_IMMED (instr))
2943
7.94k
  err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2944
95.9k
      else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2945
1.89k
  err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2946
94.0k
      else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2947
10.0k
  err = nfp_me28_print_ctx_arb (instr, dinfo);
2948
83.9k
      else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2949
2.20k
  err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2950
81.7k
      else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2951
670
  err = nfp_me28_print_branch (instr, dinfo);
2952
81.0k
      else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2953
8.76k
  err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2954
72.2k
      else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2955
3.60k
  err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2956
68.6k
      else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2957
1.86k
  err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2958
66.8k
      else if (NFP_ME28_INSTR_IS_MULT (instr))
2959
1.14k
  err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2960
65.6k
      else
2961
65.6k
  err = nfp_me_print_invalid (instr, dinfo);
2962
478k
      break;
2963
537k
    }
2964
2965
537k
  if (err < 0)
2966
231k
    return err;
2967
305k
  return 8;
2968
537k
}
2969
2970
int
2971
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2972
538k
{
2973
538k
  nfp_opts opts;
2974
538k
  int err;
2975
2976
538k
  opts.show_pc = 1;
2977
538k
  opts.ctx_mode = 0;
2978
538k
  err = parse_disassembler_options (&opts, dinfo);
2979
538k
  if (err < 0)
2980
0
    goto end;
2981
2982
538k
  err = _print_instrs (addr, dinfo, &opts);
2983
2984
538k
 end:
2985
538k
  if (err != 8)
2986
232k
    dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2987
538k
  if (err == _NFP_ERR_CONT)
2988
231k
    return 8;
2989
306k
  return err;
2990
538k
}
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
}