Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/opcodes/nfp-dis.c
Line
Count
Source (jump to first uncovered line)
1
/* Print NFP instructions for objdump.
2
   Copyright (C) 2017-2025 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
1.43k
#define _NFP_ERR_STOP -1
39
2.10M
#define _NFP_ERR_CONT -8
40
41
3.85M
#define _BTST(v, b)               (((v) >> b) & 1)
42
22.5M
#define _BF(v, msb, lsb)          (((v) >> (lsb)) & \
43
22.5M
           ((1U << ((msb) - (lsb) + 1)) - 1))
44
1.41M
#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
2.59M
#define _NFP_ISLAND_MAX 64
50
1.29M
#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
190k
{
930
190k
  const char * err_msg = N_("<invalid_instruction>:");
931
190k
  dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
932
190k
  return _NFP_ERR_CONT;
933
190k
}
934
935
static bool
936
nfp_me_is_imm_opnd10 (unsigned int opnd)
937
128k
{
938
128k
  return _BF (opnd, 9, 8) == 0x3;
939
128k
}
940
941
static bool
942
nfp_me_is_imm_opnd8 (unsigned int opnd)
943
182k
{
944
182k
  return _BTST (opnd, 5);
945
182k
}
946
947
static unsigned int
948
nfp_me_imm_opnd10 (unsigned int opnd)
949
13.0k
{
950
13.0k
  return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
951
13.0k
}
952
953
static unsigned int
954
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
955
10.5k
{
956
10.5k
  unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
957
958
10.5k
  return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
959
10.5k
}
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
186k
{
967
186k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
968
969
  /* Absolute GPR.  */
970
186k
  if (_BF (opnd, 9, 7) == 0x1)
971
28.6k
    dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
972
973
  /* Relative GPR.  */
974
158k
  else if (_BF (opnd, 9, 6) == 0x0)
975
28.6k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
976
977
  /* Indexed Xfer.  */
978
129k
  else if (_BF (opnd, 9, 7) == 0x2)
979
17.6k
    {
980
17.6k
      dinfo->fprintf_func (dinfo->stream, "*$index");
981
17.6k
      if (_BF (opnd, 2, 1) == 0x1)
982
3.40k
  dinfo->fprintf_func (dinfo->stream, "++");
983
14.2k
      else if (_BF (opnd, 2, 1) == 0x2)
984
5.84k
  dinfo->fprintf_func (dinfo->stream, "--");
985
17.6k
    }
986
987
  /* Relative Xfer.  */
988
111k
  else if (_BF (opnd, 9, 7) == 0x3)
989
21.0k
    {
990
21.0k
      if (_BTST (opnd, 6))
991
10.8k
  n += (num_ctx == 8 ? 16 : 32);
992
21.0k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
993
21.0k
    }
994
995
  /* Indexed Next Neighbour.  */
996
90.8k
  else if (_BF (opnd, 9, 6) == 0x9)
997
15.2k
    {
998
15.2k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
999
15.2k
      if (_BTST (opnd, 1))
1000
9.96k
  dinfo->fprintf_func (dinfo->stream, "++");
1001
15.2k
    }
1002
1003
  /* Relative Next Neighbour.  */
1004
75.6k
  else if (_BF (opnd, 9, 6) == 0xa)
1005
14.2k
    {
1006
14.2k
      dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1007
14.2k
    }
1008
1009
  /* Indexed LMEM.  */
1010
61.4k
  else if (_BF (opnd, 9, 6) == 0x8)
1011
17.0k
    {
1012
17.0k
      n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1013
17.0k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1014
17.0k
      if (_BTST (opnd, 4))
1015
4.78k
  dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1016
12.2k
      else if (_BF (opnd, 3, 0))
1017
11.0k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1018
17.0k
    }
1019
1020
  /* 8-bit Constant value.  */
1021
44.3k
  else if (_BF (opnd, 9, 8) == 0x3)
1022
20.7k
    dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1023
1024
23.6k
  else
1025
23.6k
    {
1026
23.6k
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1027
23.6k
      return false;
1028
23.6k
    }
1029
1030
163k
  return true;
1031
186k
}
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
1.42M
{
1040
1.42M
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1041
1042
  /* Relative GPR.  */
1043
1.42M
  if (_BF (opnd, 7, 5) == 0x0)
1044
700k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1045
1046
  /* Relative Xfer.  */
1047
728k
  else if (_BF (opnd, 7, 5) == 0x4)
1048
139k
    dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1049
1050
  /* Relative Xfer.  */
1051
589k
  else if (_BF (opnd, 7, 5) == 0x6)
1052
93.0k
    {
1053
93.0k
      n += (num_ctx == 8 ? 16 : 32);
1054
93.0k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1055
93.0k
    }
1056
1057
  /* Indexed Xfer.  */
1058
496k
  else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1059
67.2k
    {
1060
67.2k
      dinfo->fprintf_func (dinfo->stream, "*$index");
1061
67.2k
      if (_BF (opnd, 2, 1) == 0x1)
1062
12.6k
  dinfo->fprintf_func (dinfo->stream, "++");
1063
54.5k
      else if (_BF (opnd, 2, 1) == 0x2)
1064
7.12k
  dinfo->fprintf_func (dinfo->stream, "--");
1065
67.2k
    }
1066
1067
  /* Indexed NN.  */
1068
428k
  else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1069
36.5k
    {
1070
36.5k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
1071
36.5k
      if (_BTST (opnd, 1))
1072
9.61k
  dinfo->fprintf_func (dinfo->stream, "++");
1073
36.5k
    }
1074
1075
  /* Indexed LMEM.  */
1076
392k
  else if (_BF (opnd, 7, 4) == 0x5)
1077
66.5k
    {
1078
66.5k
      n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1079
66.5k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1080
66.5k
      if (_BF (opnd, 2, 0))
1081
46.6k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1082
66.5k
    }
1083
1084
  /* 7+1-bit Constant value.  */
1085
325k
  else if (_BTST (opnd, 5))
1086
325k
    {
1087
325k
      n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1088
325k
      dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1089
325k
    }
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
1.42M
  return true;
1098
1.42M
}
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
118k
{
1106
118k
  unsigned int op = _BF (instr, 35, 33);
1107
118k
  unsigned int srcA = _BF (instr, 7, 0);
1108
118k
  unsigned int srcB = _BF (instr, 17, 10);
1109
118k
  unsigned int dst = _BF (instr, 27, 20);
1110
118k
  unsigned int sc = _BF (instr, 9, 8);
1111
118k
  unsigned int imm_msb = _BTST (instr, 18);
1112
118k
  unsigned int swap = _BTST (instr, 19);
1113
118k
  unsigned int shift = _BF (instr, 32, 28);
1114
118k
  char dst_bank = 'A' + _BTST (instr, 36);
1115
118k
  unsigned int nocc = _BTST (instr, 40);
1116
118k
  bool err = false;
1117
1118
118k
  if (swap)
1119
54.7k
    {
1120
54.7k
      unsigned int tmp = srcA;
1121
54.7k
      srcA = srcB;
1122
54.7k
      srcB = tmp;
1123
54.7k
    }
1124
1125
  /* alu_shf, dbl_shf, asr.  */
1126
118k
  if (op < 7)
1127
107k
    {
1128
107k
      if (sc == 3)
1129
21.3k
  dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1130
85.9k
      else if (op == 6)
1131
5.57k
  dinfo->fprintf_func (dinfo->stream, "asr[");
1132
80.4k
      else
1133
80.4k
  dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1134
1135
      /* dest operand */
1136
107k
      if (nfp_me_is_imm_opnd8 (dst))
1137
40.7k
  dinfo->fprintf_func (dinfo->stream, "--");
1138
66.5k
      else
1139
66.5k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1140
66.5k
            dst_lmext, imm_msb, dinfo);
1141
1142
107k
      dinfo->fprintf_func (dinfo->stream, ", ");
1143
1144
      /* A operand.  */
1145
107k
      if (op != 6)
1146
98.7k
  {
1147
98.7k
    if ((op < 2) && (sc != 3))  /* Not dbl_shf.  */
1148
22.5k
      dinfo->fprintf_func (dinfo->stream, "--");  /* B or ~B operator.  */
1149
76.1k
    else
1150
76.1k
      err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1151
76.1k
                num_ctx, src_lmext, imm_msb,
1152
76.1k
                dinfo);
1153
1154
98.7k
    dinfo->fprintf_func (dinfo->stream, ", ");
1155
1156
    /* Operator (not for dbl_shf).  */
1157
98.7k
    if (sc != 3)
1158
80.4k
      {
1159
80.4k
        dinfo->fprintf_func (dinfo->stream, "%s, ",
1160
80.4k
           nfp_mealu_shf_op[op]);
1161
80.4k
      }
1162
98.7k
  }
1163
1164
      /* B operand.  */
1165
107k
      err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1166
107k
          num_ctx, src_lmext, imm_msb, dinfo);
1167
1168
107k
      dinfo->fprintf_func (dinfo->stream, ", ");
1169
1170
      /* Shift */
1171
107k
      if (sc == 0)
1172
42.8k
  dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1173
64.5k
      else if (sc == 2)
1174
18.1k
  {
1175
18.1k
    if (shift)
1176
16.7k
      dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1177
1.40k
    else
1178
1.40k
      dinfo->fprintf_func (dinfo->stream, "<<indirect");
1179
18.1k
  }
1180
46.3k
      else
1181
46.3k
  {
1182
46.3k
    if (shift)
1183
42.2k
      dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1184
4.12k
    else
1185
4.12k
      dinfo->fprintf_func (dinfo->stream, ">>indirect");
1186
46.3k
  }
1187
107k
    }
1188
  /* Byte Align.  */
1189
11.2k
  else if (op == 7)
1190
11.2k
    {
1191
11.2k
      dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1192
11.2k
         ((sc == 2) ? "le" : "be"));
1193
1194
      /* Dest operand.  */
1195
11.2k
      if (nfp_me_is_imm_opnd8 (dst))
1196
6.72k
  dinfo->fprintf_func (dinfo->stream, "--");
1197
4.55k
      else
1198
4.55k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1199
4.55k
            dst_lmext, imm_msb, dinfo);
1200
1201
11.2k
      dinfo->fprintf_func (dinfo->stream, ", ");
1202
1203
11.2k
      if (sc == 2)
1204
2.89k
  err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1205
2.89k
            0, imm_msb, dinfo);
1206
8.37k
      else
1207
8.37k
  err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1208
8.37k
            0, imm_msb, dinfo);
1209
11.2k
    }
1210
1211
118k
  dinfo->fprintf_func (dinfo->stream, "]");
1212
118k
  if (nocc)
1213
56.9k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1214
118k
  if (gpr_wrboth)
1215
50.6k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1216
118k
  if (pred_cc)
1217
50.7k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1218
1219
118k
  if (err)
1220
0
    return _NFP_ERR_CONT;
1221
118k
  return 0;
1222
118k
}
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
91.6k
{
1230
91.6k
  unsigned int op = _BF (instr, 35, 31);
1231
91.6k
  unsigned int srcA = _BF (instr, 9, 0);
1232
91.6k
  unsigned int srcB = _BF (instr, 19, 10);
1233
91.6k
  unsigned int dst = _BF (instr, 29, 20);
1234
91.6k
  unsigned int swap = _BTST (instr, 30);
1235
91.6k
  char dst_bank = 'A' + _BTST (instr, 36);
1236
91.6k
  unsigned int nocc = _BTST (instr, 40);
1237
91.6k
  int do_close_bracket = 1;
1238
91.6k
  bool err = false;
1239
1240
91.6k
  if (swap)
1241
29.5k
    {
1242
29.5k
      unsigned int tmp = srcA;
1243
29.5k
      srcA = srcB;
1244
29.5k
      srcB = tmp;
1245
29.5k
    }
1246
1247
91.6k
  switch (op)
1248
91.6k
    {
1249
2.58k
    case 3:     /* pop_count3[dst, srcB] */
1250
4.81k
    case 6:     /* pop_count1[srcB] */
1251
7.15k
    case 7:     /* pop_count2[srcB] */
1252
9.63k
    case 14:      /* ffs[dst, srcB] */
1253
15.2k
    case 15:      /* cam_read_tag[dst, srcB] */
1254
18.3k
    case 31:      /* cam_read_state[dst, srcB] */
1255
18.3k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1256
1257
      /* No dest for pop_count1/2.  */
1258
18.3k
      if ((op != 6) && (op != 7))
1259
13.7k
  {
1260
    /* dest operand */
1261
13.7k
    if (nfp_me_is_imm_opnd10 (dst))
1262
2.48k
      dinfo->fprintf_func (dinfo->stream, "--");
1263
11.2k
    else
1264
11.2k
      err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1265
11.2k
                 dst_lmext, dinfo);
1266
1267
13.7k
    dinfo->fprintf_func (dinfo->stream, ", ");
1268
13.7k
  }
1269
1270
      /* B operand.  */
1271
18.3k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1272
16.1k
           num_ctx, src_lmext, dinfo);
1273
18.3k
      break;
1274
 
1275
      /* cam_clear.  */
1276
2.85k
    case 11:
1277
2.85k
      do_close_bracket = 0;
1278
2.85k
      dinfo->fprintf_func (dinfo->stream, "cam_clear");
1279
2.85k
      break;
1280
1281
      /* cam_lookup.  */
1282
2.84k
    case 23:
1283
2.84k
      do_close_bracket = 0;
1284
2.84k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1285
1286
      /* Dest operand.  */
1287
2.84k
      if (nfp_me_is_imm_opnd10 (dst))
1288
922
  dinfo->fprintf_func (dinfo->stream, "--");
1289
1.92k
      else
1290
1.92k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1291
1.92k
             dst_lmext, dinfo);
1292
1293
2.84k
      dinfo->fprintf_func (dinfo->stream, ", ");
1294
1295
      /* A operand.  */
1296
2.84k
      err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1297
2.59k
           num_ctx, src_lmext, dinfo);
1298
1299
2.84k
      dinfo->fprintf_func (dinfo->stream, "]");
1300
1301
2.84k
      if (_BF (srcB, 1, 0))
1302
2.35k
  {
1303
2.35k
    unsigned int n = _BTST (srcB, 1);
1304
2.35k
    if (_BTST (srcB, 4))  /* Only for MEv28.  */
1305
717
      n += 2;
1306
2.35k
    dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1307
2.35k
             _BF (srcB, 3, 2));
1308
2.35k
  }
1309
1310
2.84k
      break;
1311
1312
5.78k
    case 19:      /* cam_write.  */
1313
9.18k
    case 27:      /* cam_write_state.  */
1314
9.18k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1315
9.18k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1316
9.18k
           num_ctx, src_lmext, dinfo);
1317
9.18k
      dinfo->fprintf_func (dinfo->stream, ", ");
1318
9.18k
      if (op == 19)
1319
5.78k
  {
1320
5.78k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1321
5.47k
               num_ctx, src_lmext, dinfo);
1322
5.78k
    dinfo->fprintf_func (dinfo->stream, ", ");
1323
5.78k
  }
1324
9.18k
      dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1325
9.18k
      break;
1326
1327
      /* CRC.  */
1328
2.32k
    case 18:  
1329
2.32k
      do_close_bracket = 0;
1330
2.32k
      dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1331
2.32k
         _BTST (srcA, 3) ? "le" : "be");
1332
2.32k
      if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
1333
408
  {
1334
408
    dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1335
408
    err = true;
1336
408
  }
1337
1.91k
      else
1338
1.91k
  {
1339
1.91k
    dinfo->fprintf_func (dinfo->stream, "%s, ",
1340
1.91k
             nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
1341
1.91k
  }
1342
1343
      /* Dest operand.  */
1344
2.32k
      if (nfp_me_is_imm_opnd10 (dst))
1345
672
  dinfo->fprintf_func (dinfo->stream, "--");
1346
1.65k
      else
1347
1.65k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1348
1.32k
             dst_lmext, dinfo);
1349
1350
2.32k
      dinfo->fprintf_func (dinfo->stream, ", ");
1351
1352
      /* B operand.  */
1353
2.32k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1354
1.60k
           num_ctx, src_lmext, dinfo);
1355
1356
2.32k
      dinfo->fprintf_func (dinfo->stream, "]");
1357
2.32k
      if (_BF (srcA, 2, 0))
1358
1.85k
  dinfo->fprintf_func (dinfo->stream, ", %s",
1359
1.85k
           nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
1360
2.32k
      if (_BTST (srcA, 4))
1361
1.04k
  dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1362
2.32k
      break;
1363
1364
56.1k
    default:
1365
      /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs).  */
1366
56.1k
      dinfo->fprintf_func (dinfo->stream, "alu[");
1367
1368
      /* Dest operand.  */
1369
56.1k
      if (nfp_me_is_imm_opnd10 (dst))
1370
11.9k
  dinfo->fprintf_func (dinfo->stream, "--");
1371
44.1k
      else
1372
44.1k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1373
44.1k
             dst_lmext, dinfo);
1374
56.1k
      dinfo->fprintf_func (dinfo->stream, ", ");
1375
1376
      /* A operand.  */
1377
56.1k
      if ((op == 0) || (op == 4))  /* B only operators.  */
1378
5.98k
  dinfo->fprintf_func (dinfo->stream, "--");
1379
50.1k
      else
1380
50.1k
  err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1381
44.9k
             num_ctx, src_lmext, dinfo);
1382
1383
56.1k
      if (!nfp_me27_28_alu_op[op])
1384
16.9k
  {
1385
16.9k
    dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1386
16.9k
    err = true;
1387
16.9k
  }
1388
39.1k
      else
1389
39.1k
  {
1390
39.1k
    dinfo->fprintf_func (dinfo->stream, ", %s, ",
1391
39.1k
             nfp_me27_28_alu_op[op]);
1392
39.1k
  }
1393
1394
      /* B operand.  */
1395
56.1k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1396
32.1k
           num_ctx, src_lmext, dinfo);
1397
56.1k
      break;
1398
91.6k
    }
1399
1400
91.6k
  if (do_close_bracket)
1401
83.6k
    dinfo->fprintf_func (dinfo->stream, "]");
1402
1403
91.6k
  if (nocc)
1404
44.8k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1405
91.6k
  if (gpr_wrboth)
1406
41.9k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1407
91.6k
  if (pred_cc)
1408
37.9k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1409
1410
91.6k
  if (err)
1411
34.6k
    return _NFP_ERR_CONT;
1412
57.0k
  return 0;
1413
91.6k
}
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.55k
{
1421
8.55k
  unsigned int srcA = _BF (instr, 9, 0);
1422
8.55k
  unsigned int srcB = _BF (instr, 19, 10);
1423
8.55k
  unsigned int imm = _BF (instr, 27, 20);
1424
8.55k
  unsigned int by = _BTST (instr, 29);
1425
8.55k
  unsigned int wd = _BTST (instr, 30);
1426
8.55k
  unsigned int inv = _BTST (instr, 31);
1427
8.55k
  unsigned int byte_shift = _BF (instr, 34, 33);
1428
8.55k
  bool err = false;
1429
1430
8.55k
  if (nfp_me_is_imm_opnd10 (srcB))
1431
1.87k
    {
1432
1.87k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1433
1.87k
      if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
1434
0
  {
1435
0
    dinfo->fprintf_func (dinfo->stream, "nop");
1436
0
    return 0;
1437
0
  }
1438
1.87k
    }
1439
6.68k
  else
1440
6.68k
    {
1441
6.68k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1442
6.68k
    }
1443
1444
8.55k
  if (inv)
1445
5.05k
    imm = (imm ^ 0xffff) | 0xffff0000U;
1446
1447
8.55k
  if (by)
1448
4.97k
    {
1449
4.97k
      dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1450
4.97k
      imm &= 0xff;
1451
4.97k
    }
1452
3.58k
  else if (wd)
1453
1.23k
    {
1454
1.23k
      dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1455
1.23k
      imm &= 0xffff;
1456
1.23k
    }
1457
2.35k
  else
1458
2.35k
    dinfo->fprintf_func (dinfo->stream, "immed[");
1459
1460
  /* Dest.  */
1461
8.55k
  if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1462
308
    dinfo->fprintf_func (dinfo->stream, "--");  /* No Dest.  */
1463
8.24k
  else if (nfp_me_is_imm_opnd10 (srcA))
1464
906
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1465
7.34k
  else
1466
7.34k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1467
1468
8.55k
  dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1469
1470
8.55k
  if ((!by) && (!wd) && (byte_shift))
1471
1.77k
    dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1472
1473
8.55k
  dinfo->fprintf_func (dinfo->stream, "]");
1474
1475
8.55k
  if (gpr_wrboth)
1476
4.08k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1477
8.55k
  if (pred_cc)
1478
5.04k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1479
1480
8.55k
  if (err)
1481
2.15k
    return _NFP_ERR_CONT;
1482
6.40k
  return 0;
1483
8.55k
}
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.33k
{
1491
2.33k
  unsigned int load_cc = _BTST (instr, 34);
1492
2.33k
  unsigned int shift = _BF (instr, 32, 28);
1493
2.33k
  unsigned int byte_mask = _BF (instr, 27, 24);
1494
2.33k
  unsigned int zerof = _BTST (instr, 20);
1495
2.33k
  unsigned int swap = _BTST (instr, 19);
1496
2.33k
  unsigned int imm_msb = _BTST (instr, 18);
1497
2.33k
  unsigned int src = _BF (instr, 17, 10);
1498
2.33k
  unsigned int sc = _BF (instr, 9, 8);
1499
2.33k
  unsigned int dst = _BF (instr, 7, 0);
1500
2.33k
  bool err = false;
1501
1502
2.33k
  if (swap)
1503
733
    {
1504
733
      unsigned int tmp = src;
1505
733
      src = dst;
1506
733
      dst = tmp;
1507
733
    }
1508
1509
2.33k
  if (zerof)
1510
440
    dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1511
1.89k
  else
1512
1.89k
    dinfo->fprintf_func (dinfo->stream, "ld_field[");
1513
1514
2.33k
  err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1515
2.33k
            dst_lmext, imm_msb, dinfo);
1516
2.33k
  dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1517
2.33k
           _BTST (byte_mask, 3),
1518
2.33k
           _BTST (byte_mask, 2),
1519
2.33k
           _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1520
2.33k
  err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1521
2.33k
            src_lmext, imm_msb, dinfo);
1522
1523
2.33k
  if ((sc == 0) && (shift != 0))
1524
602
    dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1525
1.73k
  else if (sc == 1)
1526
675
    {
1527
675
      if (shift)
1528
604
  dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1529
71
      else
1530
71
  dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1531
675
    }
1532
1.05k
  else if (sc == 2)
1533
344
    {
1534
344
      if (shift)
1535
190
  dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1536
154
      else
1537
154
  dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1538
344
    }
1539
712
  else if (sc == 3)
1540
400
    dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1541
1542
2.33k
  dinfo->fprintf_func (dinfo->stream, "]");
1543
1544
2.33k
  if (load_cc)
1545
458
    dinfo->fprintf_func (dinfo->stream, ", load_cc");
1546
2.33k
  if (gpr_wrboth)
1547
355
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1548
2.33k
  if (pred_cc)
1549
797
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1550
1551
2.33k
  if (err)
1552
0
    return _NFP_ERR_CONT;
1553
2.33k
  return 0;
1554
2.33k
}
1555
1556
static int
1557
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
1558
25.6k
{
1559
25.6k
  unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1560
25.6k
  unsigned int defer = _BF (instr, 21, 20);
1561
25.6k
  unsigned int no_load = _BTST (instr, 19);
1562
25.6k
  unsigned int resume = _BTST (instr, 18);
1563
25.6k
  unsigned int bpt = _BTST (instr, 17);
1564
25.6k
  unsigned int sig_or = _BTST (instr, 16);
1565
25.6k
  unsigned int ev_mask = _BF (instr, 15, 0);
1566
1567
25.6k
  dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1568
25.6k
  if (bpt)
1569
10.2k
    dinfo->fprintf_func (dinfo->stream, "bpt");
1570
15.3k
  else if (ev_mask == 1)
1571
72
    dinfo->fprintf_func (dinfo->stream, "voluntary");
1572
15.2k
  else if ((!no_load) && (ev_mask == 0))
1573
1.08k
    {
1574
1.08k
      dinfo->fprintf_func (dinfo->stream, "kill");
1575
1.08k
      sig_or = 0;
1576
1.08k
    }
1577
14.2k
  else if (ev_mask == 0)
1578
169
    dinfo->fprintf_func (dinfo->stream, "--");
1579
14.0k
  else
1580
14.0k
    {
1581
14.0k
      int first_print = 1;
1582
14.0k
      unsigned int n;
1583
1584
224k
      for (n = 1; n < 16; n++)
1585
210k
  {
1586
210k
    if (!_BTST (ev_mask, n))
1587
115k
      continue;
1588
94.7k
    dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1589
94.7k
             (first_print) ? "" : ", ", n);
1590
94.7k
    first_print = 0;
1591
94.7k
  }
1592
14.0k
    }
1593
1594
25.6k
  dinfo->fprintf_func (dinfo->stream, "]");
1595
1596
25.6k
  if (sig_or)
1597
9.47k
    dinfo->fprintf_func (dinfo->stream, ", any");
1598
25.6k
  if (resume)
1599
11.5k
    dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1600
25.6k
  if (defer)
1601
17.4k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1602
1603
25.6k
  return 0;
1604
25.6k
}
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.68k
{
1611
2.68k
  unsigned int srcA = _BF (instr, 9, 0);
1612
2.68k
  unsigned int srcB = _BF (instr, 19, 10);
1613
2.68k
  unsigned int wr = _BTST (instr, 21);
1614
2.68k
  unsigned int csr_num = _BF (instr, 32, 22);
1615
2.68k
  unsigned int src = srcA;
1616
2.68k
  char src_bank = 'A';
1617
2.68k
  bool err = false;
1618
1619
2.68k
  if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1620
345
    {
1621
345
      src_bank = 'B';
1622
345
      src = srcB;
1623
345
    }
1624
1625
  /* MEv28 does not have urd/uwr.  */
1626
2.68k
  if (csr_num == 1)
1627
36
    {
1628
36
      if (wr)
1629
24
  {
1630
24
    dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1631
24
             (int) _BTST (instr, 20));
1632
24
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1633
24
               src_lmext, dinfo);
1634
24
  }
1635
12
      else
1636
12
  {
1637
12
    dinfo->fprintf_func (dinfo->stream, "urd[");
1638
12
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1639
12
               src_lmext, dinfo);
1640
12
    dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1641
12
             (int) _BTST (instr, 20));
1642
12
  }
1643
36
      dinfo->fprintf_func (dinfo->stream, "]");
1644
36
    }
1645
2.65k
  else
1646
2.65k
    {
1647
2.65k
      const char *nm = NULL;
1648
1649
2.65k
      if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1650
204
  nm = nfp_me27_28_mecsrs[csr_num];
1651
1652
2.65k
      dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1653
2.65k
         (wr) ? "wr" : "rd");
1654
2.65k
      if (nm)
1655
189
  dinfo->fprintf_func (dinfo->stream, "%s", nm);
1656
2.46k
      else
1657
2.46k
  dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1658
1659
2.65k
      if (wr)
1660
828
  {
1661
828
    dinfo->fprintf_func (dinfo->stream, ", ");
1662
828
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1663
828
               src_lmext, dinfo);
1664
828
  }
1665
2.65k
      dinfo->fprintf_func (dinfo->stream, "]");
1666
2.65k
    }
1667
1668
2.68k
  if (err)
1669
185
    return _NFP_ERR_CONT;
1670
2.50k
  return 0;
1671
2.68k
}
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
303
{
1678
303
  unsigned int br_op = _BF (instr, 4, 0);
1679
303
  unsigned int ctx_sig_state = _BF (instr, 17, 14);
1680
303
  unsigned int defer = _BF (instr, 21, 20);
1681
303
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1682
303
  int ret = 0;
1683
1684
303
  if (!nfp_me27_28_br_ops[br_op])
1685
188
    {
1686
188
      dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
1687
188
      ret = _NFP_ERR_CONT;
1688
188
    }
1689
115
  else
1690
115
    dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1691
1692
303
  switch (br_op)
1693
303
    {
1694
18
    case 16:      /* br=ctx */
1695
28
    case 17:      /* br!=ctx */
1696
35
    case 18:      /* br_signal */
1697
39
    case 19:      /* br_!signal */
1698
39
      dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1699
39
      break;
1700
10
    case 20:      /* "br_inp_state" */
1701
22
    case 21:      /* "br_!inp_state" */
1702
22
      dinfo->fprintf_func (dinfo->stream, "%s, ",
1703
22
         br_inpstates[ctx_sig_state]);
1704
22
      break;
1705
14
    case 22:      /* "br_cls_state" */
1706
22
    case 23:      /* "br_!cls_state" */
1707
22
      dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1708
22
         ctx_sig_state);
1709
22
      break;
1710
220
    default:
1711
220
      break;
1712
303
    }
1713
1714
303
  dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1715
1716
303
  if (defer)
1717
51
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1718
1719
303
  return ret;
1720
303
}
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
21.2k
{
1727
21.2k
  unsigned int srcA = _BF (instr, 7, 0);
1728
21.2k
  unsigned int by = _BF (instr, 9, 8);
1729
21.2k
  unsigned int srcB = _BF (instr, 17, 10);
1730
21.2k
  unsigned int imm_msb = _BTST (instr, 18);
1731
21.2k
  unsigned int eq = _BTST (instr, 19);
1732
21.2k
  unsigned int defer = _BF (instr, 21, 20);
1733
21.2k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1734
21.2k
  bool err = false;
1735
1736
21.2k
  if (eq)
1737
11.4k
    dinfo->fprintf_func (dinfo->stream, "br=byte[");
1738
9.76k
  else
1739
9.76k
    dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1740
1741
21.2k
  if (nfp_me_is_imm_opnd8 (srcA))
1742
7.58k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1743
7.58k
              src_lmext, imm_msb, dinfo);
1744
13.6k
  else
1745
13.6k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1746
13.6k
              src_lmext, imm_msb, dinfo);
1747
1748
21.2k
  dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1749
1750
21.2k
  if (nfp_me_is_imm_opnd8 (srcA))
1751
7.58k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1752
7.58k
              src_lmext, imm_msb, dinfo);
1753
13.6k
  else
1754
13.6k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1755
13.6k
              src_lmext, imm_msb, dinfo);
1756
1757
21.2k
  dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1758
1759
21.2k
  if (defer)
1760
10.6k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1761
1762
21.2k
  if (err)
1763
0
    return _NFP_ERR_CONT;
1764
21.2k
  return 0;
1765
21.2k
}
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
10.5k
{
1771
10.5k
  unsigned int srcA = _BF (instr, 7, 0);
1772
10.5k
  unsigned int srcB = _BF (instr, 17, 10);
1773
10.5k
  unsigned int b = _BTST (instr, 18);
1774
10.5k
  unsigned int defer = _BF (instr, 21, 20);
1775
10.5k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1776
10.5k
  bool err = false;
1777
1778
10.5k
  if (b)
1779
6.56k
    dinfo->fprintf_func (dinfo->stream, "br_bset[");
1780
4.02k
  else
1781
4.02k
    dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1782
1783
10.5k
  if (nfp_me_is_imm_opnd8 (srcA))
1784
1.16k
    {
1785
1.16k
      err = err
1786
1.16k
  || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1787
1.16k
      b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1788
1.16k
    }
1789
9.41k
  else
1790
9.41k
    {
1791
9.41k
      err = err
1792
9.41k
  || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1793
9.41k
      b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1794
9.41k
    }
1795
1796
10.5k
  dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1797
1798
10.5k
  if (defer)
1799
8.07k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1800
1801
10.5k
  if (err)
1802
0
    return _NFP_ERR_CONT;
1803
10.5k
  return 0;
1804
10.5k
}
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
4.45k
{
1810
4.45k
  unsigned int srcA = _BF (instr, 9, 0);
1811
4.45k
  unsigned int srcB = _BF (instr, 19, 10);
1812
4.45k
  unsigned int defer = _BF (instr, 21, 20);
1813
4.45k
  unsigned int imm = _BF (instr, 30, 22);
1814
4.45k
  bool err = false;
1815
1816
4.45k
  if (nfp_me_is_imm_opnd10 (srcA))
1817
765
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1818
3.68k
  else
1819
3.68k
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1820
1821
4.45k
  if (!imm)
1822
11
    dinfo->fprintf_func (dinfo->stream, "rtn[");
1823
4.44k
  else
1824
4.44k
    dinfo->fprintf_func (dinfo->stream, "jump[");
1825
1826
4.45k
  if (nfp_me_is_imm_opnd10 (srcA))
1827
765
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1828
3.68k
  else
1829
3.68k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1830
1831
4.45k
  if (imm)
1832
4.44k
    dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1833
1834
4.45k
  dinfo->fprintf_func (dinfo->stream, "]");
1835
1836
4.45k
  if (defer)
1837
1.91k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1838
1839
4.45k
  if (err)
1840
355
    return _NFP_ERR_CONT;
1841
4.09k
  return 0;
1842
4.45k
}
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.56k
{
1850
1.56k
  unsigned int srcA = _BF (instr, 9, 0);
1851
1.56k
  unsigned int srcB = _BF (instr, 19, 10);
1852
1.56k
  unsigned int mstep = _BF (instr, 22, 20);
1853
1.56k
  char dst_bank = 'A' + _BTST (instr, 23);
1854
1.56k
  unsigned int swap = _BTST (instr, 30);
1855
1.56k
  unsigned int mtype = _BF (instr, 32, 31);
1856
1.56k
  unsigned int nocc = _BTST (instr, 40);
1857
1.56k
  bool err = false;
1858
1859
1.56k
  if (swap)
1860
167
    {
1861
167
      unsigned int tmp = srcA;
1862
167
      srcA = srcB;
1863
167
      srcB = tmp;
1864
167
    }
1865
1866
1.56k
  dinfo->fprintf_func (dinfo->stream, "mul_step[");
1867
1868
1.56k
  if (mstep >= 4)
1869
442
    err = err
1870
442
      || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1871
1.12k
  else
1872
1.12k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1873
1.12k
               src_lmext, dinfo);
1874
1875
1.56k
  dinfo->fprintf_func (dinfo->stream, ", ");
1876
1877
1.56k
  if (mstep >= 4)
1878
442
    dinfo->fprintf_func (dinfo->stream, "--");
1879
1.12k
  else
1880
1.12k
    err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1881
1.03k
               src_lmext, dinfo);
1882
1883
1.56k
  dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1884
1.56k
  if (mtype > 0)
1885
867
    {
1886
867
      const char *s = nfp_me27_28_mult_steps[mstep];
1887
867
      if (!s)
1888
387
  {
1889
387
    s = "<invalid mul_step>";
1890
387
    err = true;
1891
387
  }
1892
867
      dinfo->fprintf_func (dinfo->stream, "_%s", s);
1893
867
    }
1894
1895
1.56k
  if (nocc)
1896
1.10k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1897
1.56k
  if (gpr_wrboth)
1898
572
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1899
1.56k
  if (pred_cc)
1900
620
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1901
1902
1.56k
  if (err)
1903
487
    return _NFP_ERR_CONT;
1904
1.08k
  return 0;
1905
1.56k
}
1906
1907
static int
1908
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1909
8.00M
{
1910
8.00M
  const nfp_cmd_mnemonic *a = arg_a;
1911
8.00M
  const nfp_cmd_mnemonic *b = arg_b;
1912
1913
8.00M
  if (a->cpp_target != b->cpp_target)
1914
3.70M
    return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
1915
1916
4.29M
  if (a->cpp_action != b->cpp_action)
1917
2.23M
    return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1918
1919
2.06M
  return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
1920
4.29M
}
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
910k
{
1928
910k
  nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1929
910k
  const nfp_cmd_mnemonic *cmd = NULL;
1930
1931
910k
  cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1932
910k
     sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1933
1934
910k
  if (!cmd)
1935
251k
    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
689k
  while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1940
30.9k
    --cmd;
1941
1942
  /* Now compare by cpp_len and make sure we stay in range.  */
1943
696k
  for (; (cmd < (mnemonics + mnemonics_cnt))
1944
696k
       && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1945
690k
    {
1946
690k
      if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1947
652k
  return cmd->mnemonic;
1948
690k
    }
1949
1950
5.80k
  return NULL;
1951
658k
}
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
24.1k
{
1959
24.1k
  unsigned int srcA = _BF (instr, 7, 0);
1960
24.1k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
1961
24.1k
  unsigned int srcB = _BF (instr, 17, 10);
1962
24.1k
  unsigned int token = _BF (instr, 19, 18);
1963
24.1k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1964
24.1k
  unsigned int cpp_len = _BF (instr, 27, 25);
1965
24.1k
  unsigned int sig = _BF (instr, 31, 28);
1966
24.1k
  unsigned int tgtcmd = _BF (instr, 38, 32);
1967
24.1k
  unsigned int indref = _BTST (instr, 41);
1968
24.1k
  unsigned int mode = _BF (instr, 44, 42);
1969
1970
24.1k
  bool err = false;
1971
24.1k
  int cpp_target = -1;
1972
24.1k
  int cpp_action = -1;
1973
24.1k
  const char *mnemonic = NULL;
1974
24.1k
  unsigned int imm;
1975
24.1k
  unsigned int valBA;
1976
24.1k
  int visswap = ((mode == 1) || (mode == 3));
1977
1978
24.1k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1979
24.1k
  valBA = (srcB << 8) | srcA;
1980
1981
24.1k
  if (mode == 6)
1982
2.88k
    {
1983
2.88k
      token = 0;
1984
2.88k
      sig = 0;
1985
2.88k
      xfer = 0;
1986
2.88k
    }
1987
1988
  /* Convert tgtcmd to action/token tuple.  */
1989
24.1k
  if (_BF (tgtcmd, 6, 5) == 0x0)
1990
13.4k
    {
1991
13.4k
      switch (_BF (tgtcmd, 4, 2))
1992
13.4k
  {
1993
8.25k
  case 0:
1994
8.25k
    cpp_target = NFP_3200_CPPTGT_CAP;
1995
8.25k
    dinfo->fprintf_func (dinfo->stream, "cap[");
1996
8.25k
    break;
1997
931
  case 1:
1998
931
    cpp_target = NFP_3200_CPPTGT_MSF0;
1999
931
    dinfo->fprintf_func (dinfo->stream, "msf0[");
2000
931
    break;
2001
896
  case 2:
2002
896
    cpp_target = NFP_3200_CPPTGT_MSF1;
2003
896
    dinfo->fprintf_func (dinfo->stream, "msf1[");
2004
896
    break;
2005
517
  case 3:
2006
517
    cpp_target = NFP_3200_CPPTGT_PCIE;
2007
517
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2008
517
    break;
2009
969
  case 4:
2010
969
    cpp_target = NFP_3200_CPPTGT_HASH;
2011
969
    break;
2012
578
  case 5:
2013
578
    cpp_target = NFP_3200_CPPTGT_CRYPTO;
2014
578
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2015
578
    break;
2016
903
  case 6:
2017
903
    cpp_target = NFP_3200_CPPTGT_ARM;
2018
903
    dinfo->fprintf_func (dinfo->stream, "arm[");
2019
903
    break;
2020
389
  case 7:
2021
389
    cpp_target = NFP_3200_CPPTGT_CT;
2022
389
    dinfo->fprintf_func (dinfo->stream, "ct[");
2023
389
    break;
2024
13.4k
  }
2025
13.4k
      cpp_action = _BF (tgtcmd, 1, 0);
2026
13.4k
    }
2027
10.6k
  else
2028
10.6k
    {
2029
10.6k
      switch (_BF (tgtcmd, 6, 4))
2030
10.6k
  {
2031
1.59k
  case 2:
2032
1.59k
    cpp_target = NFP_3200_CPPTGT_GS;
2033
1.59k
    dinfo->fprintf_func (dinfo->stream, "scratch[");
2034
1.59k
    break;
2035
1.91k
  case 3:
2036
1.91k
    cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM.  */
2037
1.91k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2038
1.91k
    break;
2039
1.56k
  case 4:
2040
3.17k
  case 5:
2041
3.17k
    cpp_target = NFP_3200_CPPTGT_MU;
2042
3.17k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2043
3.17k
    break;
2044
1.95k
  case 6:
2045
3.97k
  case 7:
2046
3.97k
    cpp_target = NFP_3200_CPPTGT_CLS;
2047
3.97k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2048
3.97k
    break;
2049
10.6k
  }
2050
10.6k
      cpp_action = _BF (tgtcmd, 3, 0);
2051
10.6k
    }
2052
2053
24.1k
  if (cpp_target < 0)
2054
0
    {
2055
0
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2056
0
         cpp_target, cpp_action, token);
2057
0
      return _NFP_ERR_CONT;
2058
0
    }
2059
2060
24.1k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2061
24.1k
           nfp_me27_mnemonics,
2062
24.1k
           ARRAY_SIZE (nfp_me27_mnemonics));
2063
2064
24.1k
  if (!mnemonic)
2065
5.51k
    {
2066
5.51k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2067
5.51k
         cpp_target, cpp_action, token);
2068
5.51k
      return _NFP_ERR_CONT;
2069
5.51k
    }
2070
2071
18.5k
  if (cpp_target == NFP_3200_CPPTGT_HASH)
2072
545
    {
2073
545
      dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2074
545
         mnemonic, xfer, cpp_len);
2075
545
      goto print_opt_toks;
2076
545
    }
2077
2078
18.0k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2079
2080
18.0k
  if (visswap)
2081
3.13k
    {
2082
3.13k
      unsigned int tmp = srcA;
2083
3.13k
      srcA = srcB;
2084
3.13k
      srcB = tmp;
2085
3.13k
    }
2086
2087
18.0k
  switch (mode)
2088
18.0k
    {
2089
7.26k
    case 0:     /* (A << 8) + B.  */
2090
9.30k
    case 1:     /* (B << 8) + A.  */
2091
9.30k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2092
9.30k
      err = err
2093
9.30k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2094
9.30k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2095
9.30k
      err = err
2096
9.30k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2097
9.30k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2098
9.30k
      break;
2099
1.22k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2100
2.32k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2101
2.32k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2102
2.32k
      err = err
2103
2.32k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2104
2.32k
      if (third_party_32bit)
2105
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2106
2.32k
      else
2107
2.32k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2108
2.32k
      err = err
2109
2.32k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2110
2.32k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2111
2.32k
      break;
2112
1.78k
    case 4:     /* A + B.  */
2113
1.78k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2114
1.78k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2115
1.78k
      dinfo->fprintf_func (dinfo->stream, ", ");
2116
1.78k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2117
1.78k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2118
1.78k
      break;
2119
1.06k
    case 5:     /* Immediate address.  */
2120
1.06k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2121
1.06k
         (cpp_len + 1));
2122
1.06k
      break;
2123
2.30k
    case 6:     /* Immediate address and data.  */
2124
2.30k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2125
2.30k
      break;
2126
1.25k
    case 7:     /* Immediate data.  */
2127
1.25k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2128
1.25k
         ((xfer << 16) | valBA), (cpp_len + 1));
2129
1.25k
      break;
2130
18.0k
    }
2131
2132
18.5k
 print_opt_toks:
2133
18.5k
  dinfo->fprintf_func (dinfo->stream, "]");
2134
2135
18.5k
  if (indref && (mode != 2) && (mode != 3))
2136
4.48k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2137
2138
18.5k
  if (ctxswap_defer != 3)
2139
15.4k
    {
2140
15.4k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2141
15.4k
      if (sig)
2142
7.12k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2143
8.33k
      else
2144
8.33k
  dinfo->fprintf_func (dinfo->stream, "--]");
2145
2146
15.4k
      if (ctxswap_defer != 0)
2147
6.27k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2148
15.4k
    }
2149
3.12k
  else if (sig)
2150
1.88k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2151
2152
18.5k
  if (err)
2153
0
    return _NFP_ERR_CONT;
2154
18.5k
  return 0;
2155
18.5k
}
2156
2157
static int
2158
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
2159
      struct disassemble_info *dinfo)
2160
577
{
2161
577
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2162
577
}
2163
2164
static int
2165
nfp_me27_print_alu (uint64_t instr, int num_ctx,
2166
        struct disassemble_info *dinfo)
2167
667
{
2168
667
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2169
667
}
2170
2171
static int
2172
nfp_me27_print_immed (uint64_t instr, int num_ctx,
2173
          struct disassemble_info *dinfo)
2174
60
{
2175
60
  return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2176
60
}
2177
2178
static int
2179
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
2180
       struct disassemble_info *dinfo)
2181
34
{
2182
34
  return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2183
34
}
2184
2185
static int
2186
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2187
862
{
2188
862
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2189
862
}
2190
2191
static int
2192
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
2193
        struct disassemble_info *dinfo)
2194
46
{
2195
46
  return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2196
46
}
2197
2198
static int
2199
nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2200
12
{
2201
12
  return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
2202
12
}
2203
2204
static int
2205
nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
2206
      struct disassemble_info *dinfo)
2207
1.10k
{
2208
1.10k
  return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2209
1.10k
}
2210
2211
static int
2212
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
2213
           struct disassemble_info *dinfo)
2214
298
{
2215
298
  return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2216
298
}
2217
2218
static int
2219
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
2220
           struct disassemble_info *dinfo)
2221
64
{
2222
64
  return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2223
64
}
2224
2225
static int
2226
nfp_me27_print_mult (uint64_t instr, int num_ctx,
2227
         struct disassemble_info *dinfo)
2228
15
{
2229
15
  return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2230
15
}
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
998k
{
2238
998k
  unsigned int srcA = _BF (instr, 7, 0);
2239
998k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
2240
998k
  unsigned int srcB = _BF (instr, 17, 10);
2241
998k
  unsigned int token = _BF (instr, 19, 18);
2242
998k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2243
998k
  unsigned int cpp_len = _BF (instr, 27, 25);
2244
998k
  unsigned int sig = _BF (instr, 31, 28);
2245
998k
  unsigned int tgtcmd = _BF (instr, 38, 32);
2246
998k
  unsigned int indref = _BTST (instr, 41);
2247
998k
  unsigned int mode = _BF (instr, 44, 42);
2248
2249
998k
  bool err = false;
2250
998k
  int cpp_target = -1;
2251
998k
  int cpp_action = -1;
2252
998k
  const char *mnemonic = NULL;
2253
998k
  unsigned int imm;
2254
998k
  unsigned int valBA;
2255
998k
  int visswap = ((mode == 1) || (mode == 3));
2256
2257
998k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2258
998k
  valBA = (srcB << 8) | srcA;
2259
2260
998k
  if (mode == 6)
2261
47.6k
    {
2262
47.6k
      token = 0;
2263
47.6k
      sig = 0;
2264
47.6k
      xfer = 0;
2265
47.6k
    }
2266
2267
  /* Convert tgtcmd to action/token tuple.  */
2268
998k
  if (_BF (tgtcmd, 6, 5) == 0x0)
2269
589k
    {
2270
589k
      switch (_BF (tgtcmd, 4, 2))
2271
589k
  {
2272
432k
  case 0:
2273
432k
    cpp_target = NFP_6000_CPPTGT_ILA;
2274
432k
    dinfo->fprintf_func (dinfo->stream, "ila[");
2275
432k
    break;
2276
36.8k
  case 1:
2277
36.8k
    cpp_target = NFP_6000_CPPTGT_NBI;
2278
36.8k
    dinfo->fprintf_func (dinfo->stream, "nbi[");
2279
36.8k
    break;
2280
24.2k
  case 3:
2281
24.2k
    cpp_target = NFP_6000_CPPTGT_PCIE;
2282
24.2k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2283
24.2k
    break;
2284
14.1k
  case 5:
2285
14.1k
    cpp_target = NFP_6000_CPPTGT_CRYPTO;
2286
14.1k
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2287
14.1k
    break;
2288
11.9k
  case 6:
2289
11.9k
    cpp_target = NFP_6000_CPPTGT_ARM;
2290
11.9k
    dinfo->fprintf_func (dinfo->stream, "arm[");
2291
11.9k
    break;
2292
11.5k
  case 7:
2293
11.5k
    cpp_target = NFP_6000_CPPTGT_CTXPB;
2294
11.5k
    dinfo->fprintf_func (dinfo->stream, "ct[");
2295
11.5k
    break;
2296
589k
  }
2297
589k
      cpp_action = _BF (tgtcmd, 1, 0);
2298
589k
    }
2299
409k
  else
2300
409k
    {
2301
      /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2302
   for mem/cls it's "a".  */
2303
409k
      cpp_action = _BF (tgtcmd, 4, 0);
2304
409k
      switch (_BF (tgtcmd, 6, 4))
2305
409k
  {
2306
51.8k
  case 3:
2307
51.8k
    cpp_target = NFP_6000_CPPTGT_VQDR;
2308
51.8k
    cpp_action = _BF (tgtcmd, 3, 0);
2309
51.8k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2310
51.8k
    break;
2311
84.4k
  case 4:
2312
133k
  case 5:
2313
133k
    cpp_target = NFP_6000_CPPTGT_MU;
2314
133k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2315
133k
    break;
2316
86.1k
  case 6:
2317
169k
  case 7:
2318
169k
    cpp_target = NFP_6000_CPPTGT_CLS;
2319
169k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2320
169k
    break;
2321
409k
  }
2322
409k
    }
2323
2324
998k
  if (cpp_target < 0)
2325
112k
    {
2326
112k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2327
112k
         cpp_target, cpp_action, token);
2328
112k
      return _NFP_ERR_CONT;
2329
112k
    }
2330
2331
886k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2332
886k
           nfp_me28_mnemonics,
2333
886k
           ARRAY_SIZE (nfp_me28_mnemonics));
2334
2335
886k
  if (!mnemonic)
2336
251k
    {
2337
251k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2338
251k
         cpp_target, cpp_action, token);
2339
251k
      return _NFP_ERR_CONT;
2340
251k
    }
2341
2342
634k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2343
2344
634k
  if (visswap)
2345
83.0k
    {
2346
83.0k
      unsigned int tmp = srcA;
2347
83.0k
      srcA = srcB;
2348
83.0k
      srcB = tmp;
2349
83.0k
    }
2350
2351
634k
  switch (mode)
2352
634k
    {
2353
363k
    case 0:     /* (A << 8) + B.  */
2354
409k
    case 1:     /* (B << 8) + A.  */
2355
409k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2356
409k
      err = err
2357
409k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2358
409k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2359
409k
      err = err
2360
409k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2361
409k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2362
409k
      break;
2363
46.5k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2364
84.2k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2365
84.2k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2366
84.2k
      err = err
2367
84.2k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2368
84.2k
      if (third_party_32bit)
2369
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2370
84.2k
      else
2371
84.2k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2372
84.2k
      err = err
2373
84.2k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2374
84.2k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2375
84.2k
      break;
2376
46.2k
    case 4:     /* A + B.  */
2377
46.2k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2378
46.2k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2379
46.2k
      dinfo->fprintf_func (dinfo->stream, ", ");
2380
46.2k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2381
46.2k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2382
46.2k
      break;
2383
30.6k
    case 5:     /* Immediate address.  */
2384
30.6k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2385
30.6k
         (cpp_len + 1));
2386
30.6k
      break;
2387
28.0k
    case 6:     /* Immediate address and data.  */
2388
28.0k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2389
28.0k
      break;
2390
35.7k
    case 7:     /* Immediate data.  */
2391
35.7k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2392
35.7k
         ((xfer << 16) | valBA), (cpp_len + 1));
2393
35.7k
      break;
2394
634k
    }
2395
2396
634k
  dinfo->fprintf_func (dinfo->stream, "]");
2397
2398
634k
  if (indref && (mode != 2) && (mode != 3))
2399
122k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2400
2401
634k
  if (ctxswap_defer != 3)
2402
541k
    {
2403
541k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2404
541k
      if (sig)
2405
213k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2406
327k
      else
2407
327k
  dinfo->fprintf_func (dinfo->stream, "--]");
2408
2409
541k
      if (ctxswap_defer != 0)
2410
199k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2411
541k
    }
2412
92.5k
  else if (sig)
2413
51.2k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2414
2415
634k
  if (err)
2416
0
    return _NFP_ERR_CONT;
2417
634k
  return 0;
2418
634k
}
2419
2420
static int
2421
nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
2422
      struct disassemble_info *dinfo)
2423
117k
{
2424
117k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2425
117k
  unsigned int src_lmext = _BTST (instr, 42);
2426
117k
  unsigned int dst_lmext = _BTST (instr, 43);
2427
117k
  unsigned int pred_cc = _BTST (instr, 44);
2428
2429
117k
  return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2430
117k
            src_lmext, gpr_wrboth, num_ctx, dinfo);
2431
117k
}
2432
2433
static int
2434
nfp_me28_print_alu (uint64_t instr, int num_ctx,
2435
        struct disassemble_info *dinfo)
2436
91.6k
{
2437
91.6k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2438
91.6k
  unsigned int src_lmext = _BTST (instr, 42);
2439
91.6k
  unsigned int dst_lmext = _BTST (instr, 43);
2440
91.6k
  unsigned int pred_cc = _BTST (instr, 44);
2441
2442
91.6k
  return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2443
91.6k
        gpr_wrboth, num_ctx, dinfo);
2444
91.6k
}
2445
2446
static int
2447
nfp_me28_print_immed (uint64_t instr, int num_ctx,
2448
          struct disassemble_info *dinfo)
2449
8.49k
{
2450
8.49k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2451
8.49k
  unsigned int dst_lmext = _BTST (instr, 43);
2452
8.49k
  unsigned int pred_cc = _BTST (instr, 44);
2453
2454
8.49k
  return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2455
8.49k
          num_ctx, dinfo);
2456
8.49k
}
2457
2458
static int
2459
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
2460
       struct disassemble_info *dinfo)
2461
2.29k
{
2462
2.29k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2463
2.29k
  unsigned int src_lmext = _BTST (instr, 42);
2464
2.29k
  unsigned int dst_lmext = _BTST (instr, 43);
2465
2.29k
  unsigned int pred_cc = _BTST (instr, 44);
2466
2467
2.29k
  return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2468
2.29k
             src_lmext, gpr_wrboth, num_ctx, dinfo);
2469
2.29k
}
2470
2471
static int
2472
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2473
24.7k
{
2474
24.7k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2475
24.7k
}
2476
2477
static int
2478
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
2479
        struct disassemble_info *dinfo)
2480
2.64k
{
2481
2.64k
  unsigned int src_lmext = _BTST (instr, 42);
2482
2483
2.64k
  return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2484
2.64k
}
2485
2486
static int
2487
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2488
291
{
2489
291
  return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2490
291
}
2491
2492
static int
2493
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
2494
      struct disassemble_info *dinfo)
2495
20.1k
{
2496
20.1k
  unsigned int src_lmext = _BTST (instr, 42);
2497
20.1k
  return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2498
20.1k
}
2499
2500
static int
2501
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
2502
           struct disassemble_info *dinfo)
2503
10.2k
{
2504
10.2k
  unsigned int src_lmext = _BTST (instr, 42);
2505
10.2k
  return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2506
10.2k
}
2507
2508
static int
2509
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
2510
           struct disassemble_info *dinfo)
2511
4.39k
{
2512
4.39k
  unsigned int src_lmext = _BTST (instr, 42);
2513
4.39k
  return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2514
4.39k
}
2515
2516
static int
2517
nfp_me28_print_mult (uint64_t instr, int num_ctx,
2518
         struct disassemble_info *dinfo)
2519
1.55k
{
2520
1.55k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2521
1.55k
  unsigned int src_lmext = _BTST (instr, 42);
2522
1.55k
  unsigned int dst_lmext = _BTST (instr, 43);
2523
1.55k
  unsigned int pred_cc = _BTST (instr, 44);
2524
2525
1.55k
  return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2526
1.55k
         gpr_wrboth, num_ctx, dinfo);
2527
1.55k
}
2528
2529
static bool
2530
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2531
247
{
2532
247
  Elf_Internal_Shdr *sec = NULL;
2533
247
  Elf_Nfp_MeConfig mecfg_ent;
2534
247
  unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2535
247
  file_ptr roff = 0;
2536
247
  unsigned int sec_cnt = 0;
2537
247
  unsigned int sec_idx;
2538
247
  size_t menum_linear = 0;
2539
2540
247
  if (!dinfo->section)
2541
    /* No section info, will use default values.  */
2542
247
    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
904
{
2678
904
  int mecfg_orders[64][2];
2679
904
  size_t isl;
2680
904
  unsigned int sec_cnt = 0;
2681
904
  unsigned int sec_idx;
2682
904
  bool is_for_text;
2683
2684
904
  memset (mecfg_orders, -1, sizeof (mecfg_orders));
2685
2686
904
  if (dinfo->section == NULL
2687
904
      || dinfo->section->owner == NULL
2688
904
      || elf_elfsections (dinfo->section->owner) == NULL)
2689
    /* No section info, will use default values.  */
2690
902
    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
46
  for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2696
44
    {
2697
44
      Elf_Internal_Shdr *sec;
2698
44
      int sec_order;
2699
2700
44
      sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2701
44
      sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
2702
2703
44
      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
44
      if (sec->sh_flags & SHF_NFP_INIT2)
2709
4
  sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
2710
2711
44
      if (sec->sh_type != SHT_NFP_INITREG)
2712
44
  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 int
2735
parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
2736
1.50M
{
2737
1.50M
  const char *option;
2738
2739
1.50M
  if (dinfo->disassembler_options == NULL)
2740
1.50M
    return 0;
2741
2742
0
  FOR_EACH_DISASSEMBLER_OPTION (option, dinfo->disassembler_options)
2743
0
  {
2744
0
    if (disassembler_options_cmp (option, "no-pc") == 0)
2745
0
      opts->show_pc = 0;
2746
0
    else if (disassembler_options_cmp (option, "ctx4") == 0)
2747
0
      {
2748
0
  if (!opts->ctx_mode)
2749
0
    opts->ctx_mode = 4;
2750
0
      }
2751
0
    else if (disassembler_options_cmp (option, "ctx8") == 0)
2752
0
      opts->ctx_mode = 8;
2753
0
    else
2754
0
      {
2755
0
  dinfo->fprintf_func (dinfo->stream, _("Invalid NFP option: %s"), option);
2756
0
  return _NFP_ERR_STOP;
2757
0
      }
2758
0
  }
2759
2760
0
  return 0;
2761
0
}
2762
2763
/* Called on first disassembly attempt so that dinfo->section is valid
2764
   so that we can get the bfd owner to find ME configs.  */
2765
2766
static nfp_priv_data *
2767
init_nfp_priv (struct disassemble_info *dinfo)
2768
1.50M
{
2769
1.50M
  nfp_priv_data *priv;
2770
1.50M
  int ret = false;
2771
2772
1.50M
  if (dinfo->private_data)
2773
1.50M
    return (nfp_priv_data *) dinfo->private_data;
2774
2775
#if 0  /* Right now only section-related info is kept in priv.
2776
    So don't even calloc it if we don't need it.  */
2777
  if (!dinfo->section)
2778
     return NULL;
2779
#endif
2780
2781
  /* Alloc with no free, seems to be either this or a static global variable
2782
     and this at least keeps a large struct unallocated until really needed.  */
2783
1.41k
  priv = calloc (1, sizeof (*priv));
2784
1.41k
  if (!priv)
2785
0
    return NULL;
2786
2787
1.41k
  switch (dinfo->mach)
2788
1.41k
    {
2789
247
    case E_NFP_MACH_3200:
2790
247
      ret = init_nfp3200_priv (priv, dinfo);
2791
247
      break;
2792
904
    case E_NFP_MACH_6000:
2793
904
      ret = init_nfp6000_priv (priv, dinfo);
2794
904
      break;
2795
1.41k
    }
2796
2797
1.41k
  if (!ret)
2798
260
    {
2799
260
      free (priv);
2800
260
      return NULL;
2801
260
    }
2802
2803
1.15k
  dinfo->private_data = priv;
2804
1.15k
  return priv;
2805
1.41k
}
2806
2807
static int
2808
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2809
1.50M
{
2810
1.50M
  nfp_priv_data *priv = init_nfp_priv (dinfo);
2811
1.50M
  bfd_byte buffer[8];
2812
1.50M
  int err;
2813
1.50M
  uint64_t instr = 0;
2814
1.50M
  size_t island, menum;
2815
1.50M
  int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2816
1.50M
  int is_text = 1;
2817
2818
1.50M
  err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2819
1.50M
  if (err)
2820
1.43k
    return _NFP_ERR_STOP;
2821
2822
1.50M
  if (!dinfo->section)
2823
205k
    {
2824
205k
      num_ctx = 8;
2825
205k
      scs_cnt = 0;
2826
205k
      addr_3rdparty32 = 0;
2827
205k
    }
2828
1.29M
  else
2829
1.29M
    {
2830
1.29M
      unsigned int sh_info = 0;
2831
1.29M
      nfp_priv_mecfg *mecfg;
2832
2833
      /* We have a section, presumably all ELF sections.  Try to find
2834
   proper ME configs to produce better disassembly.  */
2835
1.29M
      if (!priv)
2836
0
  return _NFP_ERR_STOP; /* Sanity check */
2837
2838
1.29M
      is_text = (elf_section_flags (dinfo->section)
2839
1.29M
     & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2840
2841
1.29M
      sh_info = elf_section_info (dinfo->section);
2842
2843
1.29M
      switch (dinfo->mach)
2844
1.29M
  {
2845
0
  case E_NFP_MACH_3200:
2846
0
    island = SHI_NFP_3200_ISLAND (sh_info);
2847
0
    menum = SHI_NFP_3200_MENUM (sh_info);
2848
0
    break;
2849
1.29M
  default:
2850
1.29M
    island = SHI_NFP_ISLAND (sh_info);
2851
1.29M
    menum = SHI_NFP_MENUM (sh_info);
2852
1.29M
    break;
2853
1.29M
  }
2854
2855
1.29M
      if (island >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2856
2
  {
2857
2
    dinfo->fprintf_func (dinfo->stream, "Invalid island or me.");
2858
2
    return _NFP_ERR_STOP;
2859
2
  }
2860
2861
1.29M
      mecfg = &priv->mecfgs[island][menum][is_text];
2862
1.29M
      num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2863
1.29M
      addr_3rdparty32 = mecfg->addr_3rdparty32;
2864
1.29M
      scs_cnt = mecfg->scs_cnt;
2865
1.29M
    }
2866
2867
1.50M
  if (opts->ctx_mode)
2868
0
    num_ctx = opts->ctx_mode;
2869
2870
1.50M
  dinfo->bytes_per_line = 8;
2871
1.50M
  dinfo->bytes_per_chunk = 8;
2872
2873
1.50M
  instr = bfd_getl64 (buffer);
2874
2875
1.50M
  if (opts->show_pc)
2876
1.50M
    {
2877
1.50M
      pc = (int) (addr >> 3);
2878
2879
      /* Guess max PC for formatting */
2880
1.50M
      tmpj = (int) (dinfo->buffer_length >> 3);
2881
1.50M
      if (scs_cnt == 1)
2882
0
  {
2883
0
    pc *= 2;
2884
0
    tmpj *= 2;
2885
0
    if (! !(menum & 1))
2886
0
      {
2887
0
        pc++;
2888
0
        tmpj++;
2889
0
      }
2890
0
  }
2891
2892
5.31M
      for (tmpi = 1; tmpj > 9; tmpj /= 10)
2893
3.81M
  tmpi++;
2894
2895
1.50M
      tmpj = pc;
2896
5.18M
      for (; tmpj > 9; tmpj /= 10)
2897
3.68M
  tmpi--;
2898
2899
1.50M
      dinfo->fprintf_func (dinfo->stream, "%*c%d  ", tmpi, '.', pc);
2900
1.50M
    }
2901
2902
1.50M
  switch (dinfo->mach)
2903
1.50M
    {
2904
37.3k
    case E_NFP_MACH_3200:
2905
37.3k
      if (NFP_ME27_INSTR_IS_CMD (instr))
2906
24.1k
  err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2907
13.2k
      else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2908
577
  err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2909
12.6k
      else if (NFP_ME27_INSTR_IS_ALU (instr))
2910
667
  err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2911
11.9k
      else if (NFP_ME27_INSTR_IS_IMMED (instr))
2912
60
  err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2913
11.8k
      else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2914
34
  err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2915
11.8k
      else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2916
862
  err = nfp_me27_print_ctx_arb (instr, dinfo);
2917
11.0k
      else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2918
46
  err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2919
10.9k
      else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2920
12
  err = nfp_me27_print_branch (instr, dinfo);
2921
10.9k
      else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2922
1.10k
  err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2923
9.84k
      else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2924
298
  err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2925
9.54k
      else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2926
64
  err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2927
9.47k
      else if (NFP_ME27_INSTR_IS_MULT (instr))
2928
15
  err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2929
9.46k
      else
2930
9.46k
  err = nfp_me_print_invalid (instr, dinfo);
2931
37.3k
      break;
2932
2933
1.46M
    case E_NFP_MACH_6000:
2934
1.46M
      if (NFP_ME28_INSTR_IS_CMD (instr))
2935
998k
  err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2936
464k
      else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2937
117k
  err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2938
347k
      else if (NFP_ME28_INSTR_IS_ALU (instr))
2939
91.6k
  err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2940
255k
      else if (NFP_ME28_INSTR_IS_IMMED (instr))
2941
8.49k
  err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2942
246k
      else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2943
2.29k
  err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2944
244k
      else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2945
24.7k
  err = nfp_me28_print_ctx_arb (instr, dinfo);
2946
219k
      else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2947
2.64k
  err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2948
217k
      else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2949
291
  err = nfp_me28_print_branch (instr, dinfo);
2950
216k
      else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2951
20.1k
  err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2952
196k
      else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2953
10.2k
  err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2954
186k
      else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2955
4.39k
  err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2956
182k
      else if (NFP_ME28_INSTR_IS_MULT (instr))
2957
1.55k
  err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2958
180k
      else
2959
180k
  err = nfp_me_print_invalid (instr, dinfo);
2960
1.46M
      break;
2961
1.50M
    }
2962
2963
1.50M
  if (err < 0)
2964
598k
    return err;
2965
902k
  return 8;
2966
1.50M
}
2967
2968
int
2969
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2970
1.50M
{
2971
1.50M
  nfp_opts opts;
2972
1.50M
  int err;
2973
2974
1.50M
  opts.show_pc = 1;
2975
1.50M
  opts.ctx_mode = 0;
2976
1.50M
  err = parse_disassembler_options (&opts, dinfo);
2977
1.50M
  if (err < 0)
2978
0
    goto end;
2979
2980
1.50M
  err = _print_instrs (addr, dinfo, &opts);
2981
2982
1.50M
 end:
2983
1.50M
  if (err != 8)
2984
599k
    dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2985
1.50M
  if (err == _NFP_ERR_CONT)
2986
598k
    return 8;
2987
904k
  return err;
2988
1.50M
}
2989
2990
void
2991
print_nfp_disassembler_options (FILE * stream)
2992
0
{
2993
0
  fprintf (stream, _("\n\
2994
0
The following NFP specific disassembler options are supported for use\n\
2995
0
with the -M switch (multiple options should be separated by commas):\n"));
2996
2997
0
  fprintf (stream, _("\n\
2998
0
  no-pc       Don't print program counter prefix.\n\
2999
0
  ctx4        Force disassembly using 4-context mode.\n\
3000
0
  ctx8        Force 8-context mode, takes precedence."));
3001
3002
0
  fprintf (stream, _("\n"));
3003
0
}