Coverage Report

Created: 2024-05-21 06:29

/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-2024 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
408
#define _NFP_ERR_STOP -1
39
268k
#define _NFP_ERR_CONT -8
40
41
473k
#define _BTST(v, b)               (((v) >> b) & 1)
42
2.52M
#define _BF(v, msb, lsb)          (((v) >> (lsb)) & \
43
2.52M
           ((1U << ((msb) - (lsb) + 1)) - 1))
44
163k
#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
76.9k
#define _NFP_ISLAND_MAX 64
50
38.4k
#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
34.5k
{
930
34.5k
  const char * err_msg = N_("<invalid_instruction>:");
931
34.5k
  dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
932
34.5k
  return _NFP_ERR_CONT;
933
34.5k
}
934
935
static bool
936
nfp_me_is_imm_opnd10 (unsigned int opnd)
937
16.1k
{
938
16.1k
  return _BF (opnd, 9, 8) == 0x3;
939
16.1k
}
940
941
static bool
942
nfp_me_is_imm_opnd8 (unsigned int opnd)
943
22.8k
{
944
22.8k
  return _BTST (opnd, 5);
945
22.8k
}
946
947
static unsigned int
948
nfp_me_imm_opnd10 (unsigned int opnd)
949
1.38k
{
950
1.38k
  return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
951
1.38k
}
952
953
static unsigned int
954
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
955
564
{
956
564
  unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
957
958
564
  return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
959
564
}
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
22.6k
{
967
22.6k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
968
969
  /* Absolute GPR.  */
970
22.6k
  if (_BF (opnd, 9, 7) == 0x1)
971
3.75k
    dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
972
973
  /* Relative GPR.  */
974
18.8k
  else if (_BF (opnd, 9, 6) == 0x0)
975
3.35k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
976
977
  /* Indexed Xfer.  */
978
15.5k
  else if (_BF (opnd, 9, 7) == 0x2)
979
2.13k
    {
980
2.13k
      dinfo->fprintf_func (dinfo->stream, "*$index");
981
2.13k
      if (_BF (opnd, 2, 1) == 0x1)
982
270
  dinfo->fprintf_func (dinfo->stream, "++");
983
1.86k
      else if (_BF (opnd, 2, 1) == 0x2)
984
420
  dinfo->fprintf_func (dinfo->stream, "--");
985
2.13k
    }
986
987
  /* Relative Xfer.  */
988
13.3k
  else if (_BF (opnd, 9, 7) == 0x3)
989
1.87k
    {
990
1.87k
      if (_BTST (opnd, 6))
991
951
  n += (num_ctx == 8 ? 16 : 32);
992
1.87k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
993
1.87k
    }
994
995
  /* Indexed Next Neighbour.  */
996
11.5k
  else if (_BF (opnd, 9, 6) == 0x9)
997
1.85k
    {
998
1.85k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
999
1.85k
      if (_BTST (opnd, 1))
1000
1.25k
  dinfo->fprintf_func (dinfo->stream, "++");
1001
1.85k
    }
1002
1003
  /* Relative Next Neighbour.  */
1004
9.64k
  else if (_BF (opnd, 9, 6) == 0xa)
1005
1.90k
    {
1006
1.90k
      dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1007
1.90k
    }
1008
1009
  /* Indexed LMEM.  */
1010
7.73k
  else if (_BF (opnd, 9, 6) == 0x8)
1011
2.29k
    {
1012
2.29k
      n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1013
2.29k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1014
2.29k
      if (_BTST (opnd, 4))
1015
668
  dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1016
1.62k
      else if (_BF (opnd, 3, 0))
1017
1.43k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1018
2.29k
    }
1019
1020
  /* 8-bit Constant value.  */
1021
5.44k
  else if (_BF (opnd, 9, 8) == 0x3)
1022
2.70k
    dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1023
1024
2.73k
  else
1025
2.73k
    {
1026
2.73k
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1027
2.73k
      return false;
1028
2.73k
    }
1029
1030
19.8k
  return true;
1031
22.6k
}
1032
1033
/* Print a restricted/8-bit operand.
1034
   This can mostly be generic across NFP families at the moment.  */
1035
1036
static bool
1037
nfp_me_print_opnd8 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
1038
        unsigned int imm8_msb, struct disassemble_info *dinfo)
1039
144k
{
1040
144k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1041
1042
  /* Relative GPR.  */
1043
144k
  if (_BF (opnd, 7, 5) == 0x0)
1044
61.0k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1045
1046
  /* Relative Xfer.  */
1047
83.2k
  else if (_BF (opnd, 7, 5) == 0x4)
1048
15.3k
    dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1049
1050
  /* Relative Xfer.  */
1051
67.8k
  else if (_BF (opnd, 7, 5) == 0x6)
1052
11.4k
    {
1053
11.4k
      n += (num_ctx == 8 ? 16 : 32);
1054
11.4k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1055
11.4k
    }
1056
1057
  /* Indexed Xfer.  */
1058
56.4k
  else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1059
5.70k
    {
1060
5.70k
      dinfo->fprintf_func (dinfo->stream, "*$index");
1061
5.70k
      if (_BF (opnd, 2, 1) == 0x1)
1062
803
  dinfo->fprintf_func (dinfo->stream, "++");
1063
4.89k
      else if (_BF (opnd, 2, 1) == 0x2)
1064
1.07k
  dinfo->fprintf_func (dinfo->stream, "--");
1065
5.70k
    }
1066
1067
  /* Indexed NN.  */
1068
50.7k
  else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1069
3.45k
    {
1070
3.45k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
1071
3.45k
      if (_BTST (opnd, 1))
1072
1.77k
  dinfo->fprintf_func (dinfo->stream, "++");
1073
3.45k
    }
1074
1075
  /* Indexed LMEM.  */
1076
47.2k
  else if (_BF (opnd, 7, 4) == 0x5)
1077
5.89k
    {
1078
5.89k
      n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1079
5.89k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1080
5.89k
      if (_BF (opnd, 2, 0))
1081
4.77k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1082
5.89k
    }
1083
1084
  /* 7+1-bit Constant value.  */
1085
41.4k
  else if (_BTST (opnd, 5))
1086
41.4k
    {
1087
41.4k
      n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1088
41.4k
      dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1089
41.4k
    }
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
144k
  return true;
1098
144k
}
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
14.3k
{
1106
14.3k
  unsigned int op = _BF (instr, 35, 33);
1107
14.3k
  unsigned int srcA = _BF (instr, 7, 0);
1108
14.3k
  unsigned int srcB = _BF (instr, 17, 10);
1109
14.3k
  unsigned int dst = _BF (instr, 27, 20);
1110
14.3k
  unsigned int sc = _BF (instr, 9, 8);
1111
14.3k
  unsigned int imm_msb = _BTST (instr, 18);
1112
14.3k
  unsigned int swap = _BTST (instr, 19);
1113
14.3k
  unsigned int shift = _BF (instr, 32, 28);
1114
14.3k
  char dst_bank = 'A' + _BTST (instr, 36);
1115
14.3k
  unsigned int nocc = _BTST (instr, 40);
1116
14.3k
  bool err = false;
1117
1118
14.3k
  if (swap)
1119
5.71k
    {
1120
5.71k
      unsigned int tmp = srcA;
1121
5.71k
      srcA = srcB;
1122
5.71k
      srcB = tmp;
1123
5.71k
    }
1124
1125
  /* alu_shf, dbl_shf, asr.  */
1126
14.3k
  if (op < 7)
1127
12.7k
    {
1128
12.7k
      if (sc == 3)
1129
4.12k
  dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1130
8.57k
      else if (op == 6)
1131
999
  dinfo->fprintf_func (dinfo->stream, "asr[");
1132
7.57k
      else
1133
7.57k
  dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1134
1135
      /* dest operand */
1136
12.7k
      if (nfp_me_is_imm_opnd8 (dst))
1137
6.50k
  dinfo->fprintf_func (dinfo->stream, "--");
1138
6.19k
      else
1139
6.19k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1140
6.19k
            dst_lmext, imm_msb, dinfo);
1141
1142
12.7k
      dinfo->fprintf_func (dinfo->stream, ", ");
1143
1144
      /* A operand.  */
1145
12.7k
      if (op != 6)
1146
11.5k
  {
1147
11.5k
    if ((op < 2) && (sc != 3))  /* Not dbl_shf.  */
1148
2.83k
      dinfo->fprintf_func (dinfo->stream, "--");  /* B or ~B operator.  */
1149
8.69k
    else
1150
8.69k
      err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1151
8.69k
                num_ctx, src_lmext, imm_msb,
1152
8.69k
                dinfo);
1153
1154
11.5k
    dinfo->fprintf_func (dinfo->stream, ", ");
1155
1156
    /* Operator (not for dbl_shf).  */
1157
11.5k
    if (sc != 3)
1158
7.57k
      {
1159
7.57k
        dinfo->fprintf_func (dinfo->stream, "%s, ",
1160
7.57k
           nfp_mealu_shf_op[op]);
1161
7.57k
      }
1162
11.5k
  }
1163
1164
      /* B operand.  */
1165
12.7k
      err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1166
12.7k
          num_ctx, src_lmext, imm_msb, dinfo);
1167
1168
12.7k
      dinfo->fprintf_func (dinfo->stream, ", ");
1169
1170
      /* Shift */
1171
12.7k
      if (sc == 0)
1172
3.79k
  dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1173
8.91k
      else if (sc == 2)
1174
2.28k
  {
1175
2.28k
    if (shift)
1176
2.17k
      dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1177
110
    else
1178
110
      dinfo->fprintf_func (dinfo->stream, "<<indirect");
1179
2.28k
  }
1180
6.62k
      else
1181
6.62k
  {
1182
6.62k
    if (shift)
1183
6.32k
      dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1184
309
    else
1185
309
      dinfo->fprintf_func (dinfo->stream, ">>indirect");
1186
6.62k
  }
1187
12.7k
    }
1188
  /* Byte Align.  */
1189
1.65k
  else if (op == 7)
1190
1.65k
    {
1191
1.65k
      dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1192
1.65k
         ((sc == 2) ? "le" : "be"));
1193
1194
      /* Dest operand.  */
1195
1.65k
      if (nfp_me_is_imm_opnd8 (dst))
1196
883
  dinfo->fprintf_func (dinfo->stream, "--");
1197
768
      else
1198
768
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1199
768
            dst_lmext, imm_msb, dinfo);
1200
1201
1.65k
      dinfo->fprintf_func (dinfo->stream, ", ");
1202
1203
1.65k
      if (sc == 2)
1204
351
  err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1205
351
            0, imm_msb, dinfo);
1206
1.30k
      else
1207
1.30k
  err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1208
1.30k
            0, imm_msb, dinfo);
1209
1.65k
    }
1210
1211
14.3k
  dinfo->fprintf_func (dinfo->stream, "]");
1212
14.3k
  if (nocc)
1213
7.48k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1214
14.3k
  if (gpr_wrboth)
1215
6.93k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1216
14.3k
  if (pred_cc)
1217
4.85k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1218
1219
14.3k
  if (err)
1220
0
    return _NFP_ERR_CONT;
1221
14.3k
  return 0;
1222
14.3k
}
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
11.7k
{
1230
11.7k
  unsigned int op = _BF (instr, 35, 31);
1231
11.7k
  unsigned int srcA = _BF (instr, 9, 0);
1232
11.7k
  unsigned int srcB = _BF (instr, 19, 10);
1233
11.7k
  unsigned int dst = _BF (instr, 29, 20);
1234
11.7k
  unsigned int swap = _BTST (instr, 30);
1235
11.7k
  char dst_bank = 'A' + _BTST (instr, 36);
1236
11.7k
  unsigned int nocc = _BTST (instr, 40);
1237
11.7k
  int do_close_bracket = 1;
1238
11.7k
  bool err = false;
1239
1240
11.7k
  if (swap)
1241
2.99k
    {
1242
2.99k
      unsigned int tmp = srcA;
1243
2.99k
      srcA = srcB;
1244
2.99k
      srcB = tmp;
1245
2.99k
    }
1246
1247
11.7k
  switch (op)
1248
11.7k
    {
1249
479
    case 3:     /* pop_count3[dst, srcB] */
1250
821
    case 6:     /* pop_count1[srcB] */
1251
1.29k
    case 7:     /* pop_count2[srcB] */
1252
1.52k
    case 14:      /* ffs[dst, srcB] */
1253
1.86k
    case 15:      /* cam_read_tag[dst, srcB] */
1254
2.38k
    case 31:      /* cam_read_state[dst, srcB] */
1255
2.38k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1256
1257
      /* No dest for pop_count1/2.  */
1258
2.38k
      if ((op != 6) && (op != 7))
1259
1.56k
  {
1260
    /* dest operand */
1261
1.56k
    if (nfp_me_is_imm_opnd10 (dst))
1262
537
      dinfo->fprintf_func (dinfo->stream, "--");
1263
1.03k
    else
1264
1.03k
      err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1265
1.03k
                 dst_lmext, dinfo);
1266
1267
1.56k
    dinfo->fprintf_func (dinfo->stream, ", ");
1268
1.56k
  }
1269
1270
      /* B operand.  */
1271
2.38k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1272
2.04k
           num_ctx, src_lmext, dinfo);
1273
2.38k
      break;
1274
 
1275
      /* cam_clear.  */
1276
485
    case 11:
1277
485
      do_close_bracket = 0;
1278
485
      dinfo->fprintf_func (dinfo->stream, "cam_clear");
1279
485
      break;
1280
1281
      /* cam_lookup.  */
1282
622
    case 23:
1283
622
      do_close_bracket = 0;
1284
622
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1285
1286
      /* Dest operand.  */
1287
622
      if (nfp_me_is_imm_opnd10 (dst))
1288
117
  dinfo->fprintf_func (dinfo->stream, "--");
1289
505
      else
1290
505
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1291
505
             dst_lmext, dinfo);
1292
1293
622
      dinfo->fprintf_func (dinfo->stream, ", ");
1294
1295
      /* A operand.  */
1296
622
      err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1297
588
           num_ctx, src_lmext, dinfo);
1298
1299
622
      dinfo->fprintf_func (dinfo->stream, "]");
1300
1301
622
      if (_BF (srcB, 1, 0))
1302
508
  {
1303
508
    unsigned int n = _BTST (srcB, 1);
1304
508
    if (_BTST (srcB, 4))  /* Only for MEv28.  */
1305
103
      n += 2;
1306
508
    dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1307
508
             _BF (srcB, 3, 2));
1308
508
  }
1309
1310
622
      break;
1311
1312
327
    case 19:      /* cam_write.  */
1313
814
    case 27:      /* cam_write_state.  */
1314
814
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1315
814
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1316
814
           num_ctx, src_lmext, dinfo);
1317
814
      dinfo->fprintf_func (dinfo->stream, ", ");
1318
814
      if (op == 19)
1319
327
  {
1320
327
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1321
308
               num_ctx, src_lmext, dinfo);
1322
327
    dinfo->fprintf_func (dinfo->stream, ", ");
1323
327
  }
1324
814
      dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1325
814
      break;
1326
1327
      /* CRC.  */
1328
198
    case 18:  
1329
198
      do_close_bracket = 0;
1330
198
      dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1331
198
         _BTST (srcA, 3) ? "le" : "be");
1332
198
      if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
1333
60
  {
1334
60
    dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1335
60
    err = true;
1336
60
  }
1337
138
      else
1338
138
  {
1339
138
    dinfo->fprintf_func (dinfo->stream, "%s, ",
1340
138
             nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
1341
138
  }
1342
1343
      /* Dest operand.  */
1344
198
      if (nfp_me_is_imm_opnd10 (dst))
1345
25
  dinfo->fprintf_func (dinfo->stream, "--");
1346
173
      else
1347
173
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1348
125
             dst_lmext, dinfo);
1349
1350
198
      dinfo->fprintf_func (dinfo->stream, ", ");
1351
1352
      /* B operand.  */
1353
198
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1354
117
           num_ctx, src_lmext, dinfo);
1355
1356
198
      dinfo->fprintf_func (dinfo->stream, "]");
1357
198
      if (_BF (srcA, 2, 0))
1358
132
  dinfo->fprintf_func (dinfo->stream, ", %s",
1359
132
           nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
1360
198
      if (_BTST (srcA, 4))
1361
85
  dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1362
198
      break;
1363
1364
7.24k
    default:
1365
      /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs).  */
1366
7.24k
      dinfo->fprintf_func (dinfo->stream, "alu[");
1367
1368
      /* Dest operand.  */
1369
7.24k
      if (nfp_me_is_imm_opnd10 (dst))
1370
2.70k
  dinfo->fprintf_func (dinfo->stream, "--");
1371
4.53k
      else
1372
4.53k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1373
4.53k
             dst_lmext, dinfo);
1374
7.24k
      dinfo->fprintf_func (dinfo->stream, ", ");
1375
1376
      /* A operand.  */
1377
7.24k
      if ((op == 0) || (op == 4))  /* B only operators.  */
1378
485
  dinfo->fprintf_func (dinfo->stream, "--");
1379
6.75k
      else
1380
6.75k
  err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1381
6.13k
             num_ctx, src_lmext, dinfo);
1382
1383
7.24k
      if (!nfp_me27_28_alu_op[op])
1384
1.80k
  {
1385
1.80k
    dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1386
1.80k
    err = true;
1387
1.80k
  }
1388
5.43k
      else
1389
5.43k
  {
1390
5.43k
    dinfo->fprintf_func (dinfo->stream, ", %s, ",
1391
5.43k
             nfp_me27_28_alu_op[op]);
1392
5.43k
  }
1393
1394
      /* B operand.  */
1395
7.24k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1396
4.63k
           num_ctx, src_lmext, dinfo);
1397
7.24k
      break;
1398
11.7k
    }
1399
1400
11.7k
  if (do_close_bracket)
1401
10.4k
    dinfo->fprintf_func (dinfo->stream, "]");
1402
1403
11.7k
  if (nocc)
1404
5.31k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1405
11.7k
  if (gpr_wrboth)
1406
5.09k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1407
11.7k
  if (pred_cc)
1408
5.36k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1409
1410
11.7k
  if (err)
1411
3.78k
    return _NFP_ERR_CONT;
1412
7.96k
  return 0;
1413
11.7k
}
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
1.21k
{
1421
1.21k
  unsigned int srcA = _BF (instr, 9, 0);
1422
1.21k
  unsigned int srcB = _BF (instr, 19, 10);
1423
1.21k
  unsigned int imm = _BF (instr, 27, 20);
1424
1.21k
  unsigned int by = _BTST (instr, 29);
1425
1.21k
  unsigned int wd = _BTST (instr, 30);
1426
1.21k
  unsigned int inv = _BTST (instr, 31);
1427
1.21k
  unsigned int byte_shift = _BF (instr, 34, 33);
1428
1.21k
  bool err = false;
1429
1430
1.21k
  if (nfp_me_is_imm_opnd10 (srcB))
1431
251
    {
1432
251
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1433
251
      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
251
    }
1439
968
  else
1440
968
    {
1441
968
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1442
968
    }
1443
1444
1.21k
  if (inv)
1445
688
    imm = (imm ^ 0xffff) | 0xffff0000U;
1446
1447
1.21k
  if (by)
1448
725
    {
1449
725
      dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1450
725
      imm &= 0xff;
1451
725
    }
1452
494
  else if (wd)
1453
158
    {
1454
158
      dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1455
158
      imm &= 0xffff;
1456
158
    }
1457
336
  else
1458
336
    dinfo->fprintf_func (dinfo->stream, "immed[");
1459
1460
  /* Dest.  */
1461
1.21k
  if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1462
84
    dinfo->fprintf_func (dinfo->stream, "--");  /* No Dest.  */
1463
1.13k
  else if (nfp_me_is_imm_opnd10 (srcA))
1464
109
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1465
1.02k
  else
1466
1.02k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1467
1468
1.21k
  dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1469
1470
1.21k
  if ((!by) && (!wd) && (byte_shift))
1471
239
    dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1472
1473
1.21k
  dinfo->fprintf_func (dinfo->stream, "]");
1474
1475
1.21k
  if (gpr_wrboth)
1476
581
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1477
1.21k
  if (pred_cc)
1478
700
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1479
1480
1.21k
  if (err)
1481
347
    return _NFP_ERR_CONT;
1482
872
  return 0;
1483
1.21k
}
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
384
{
1491
384
  unsigned int load_cc = _BTST (instr, 34);
1492
384
  unsigned int shift = _BF (instr, 32, 28);
1493
384
  unsigned int byte_mask = _BF (instr, 27, 24);
1494
384
  unsigned int zerof = _BTST (instr, 20);
1495
384
  unsigned int swap = _BTST (instr, 19);
1496
384
  unsigned int imm_msb = _BTST (instr, 18);
1497
384
  unsigned int src = _BF (instr, 17, 10);
1498
384
  unsigned int sc = _BF (instr, 9, 8);
1499
384
  unsigned int dst = _BF (instr, 7, 0);
1500
384
  bool err = false;
1501
1502
384
  if (swap)
1503
55
    {
1504
55
      unsigned int tmp = src;
1505
55
      src = dst;
1506
55
      dst = tmp;
1507
55
    }
1508
1509
384
  if (zerof)
1510
34
    dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1511
350
  else
1512
350
    dinfo->fprintf_func (dinfo->stream, "ld_field[");
1513
1514
384
  err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1515
384
            dst_lmext, imm_msb, dinfo);
1516
384
  dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1517
384
           _BTST (byte_mask, 3),
1518
384
           _BTST (byte_mask, 2),
1519
384
           _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1520
384
  err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1521
384
            src_lmext, imm_msb, dinfo);
1522
1523
384
  if ((sc == 0) && (shift != 0))
1524
90
    dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1525
294
  else if (sc == 1)
1526
84
    {
1527
84
      if (shift)
1528
69
  dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1529
15
      else
1530
15
  dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1531
84
    }
1532
210
  else if (sc == 2)
1533
136
    {
1534
136
      if (shift)
1535
126
  dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1536
10
      else
1537
10
  dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1538
136
    }
1539
74
  else if (sc == 3)
1540
34
    dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1541
1542
384
  dinfo->fprintf_func (dinfo->stream, "]");
1543
1544
384
  if (load_cc)
1545
100
    dinfo->fprintf_func (dinfo->stream, ", load_cc");
1546
384
  if (gpr_wrboth)
1547
88
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1548
384
  if (pred_cc)
1549
89
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1550
1551
384
  if (err)
1552
0
    return _NFP_ERR_CONT;
1553
384
  return 0;
1554
384
}
1555
1556
static int
1557
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
1558
4.72k
{
1559
4.72k
  unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1560
4.72k
  unsigned int defer = _BF (instr, 21, 20);
1561
4.72k
  unsigned int no_load = _BTST (instr, 19);
1562
4.72k
  unsigned int resume = _BTST (instr, 18);
1563
4.72k
  unsigned int bpt = _BTST (instr, 17);
1564
4.72k
  unsigned int sig_or = _BTST (instr, 16);
1565
4.72k
  unsigned int ev_mask = _BF (instr, 15, 0);
1566
1567
4.72k
  dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1568
4.72k
  if (bpt)
1569
2.32k
    dinfo->fprintf_func (dinfo->stream, "bpt");
1570
2.40k
  else if (ev_mask == 1)
1571
4
    dinfo->fprintf_func (dinfo->stream, "voluntary");
1572
2.39k
  else if ((!no_load) && (ev_mask == 0))
1573
150
    {
1574
150
      dinfo->fprintf_func (dinfo->stream, "kill");
1575
150
      sig_or = 0;
1576
150
    }
1577
2.24k
  else if (ev_mask == 0)
1578
11
    dinfo->fprintf_func (dinfo->stream, "--");
1579
2.23k
  else
1580
2.23k
    {
1581
2.23k
      int first_print = 1;
1582
2.23k
      unsigned int n;
1583
1584
35.7k
      for (n = 1; n < 16; n++)
1585
33.5k
  {
1586
33.5k
    if (!_BTST (ev_mask, n))
1587
17.4k
      continue;
1588
16.1k
    dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1589
16.1k
             (first_print) ? "" : ", ", n);
1590
16.1k
    first_print = 0;
1591
16.1k
  }
1592
2.23k
    }
1593
1594
4.72k
  dinfo->fprintf_func (dinfo->stream, "]");
1595
1596
4.72k
  if (sig_or)
1597
2.01k
    dinfo->fprintf_func (dinfo->stream, ", any");
1598
4.72k
  if (resume)
1599
2.63k
    dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1600
4.72k
  if (defer)
1601
3.71k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1602
1603
4.72k
  return 0;
1604
4.72k
}
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
643
{
1611
643
  unsigned int srcA = _BF (instr, 9, 0);
1612
643
  unsigned int srcB = _BF (instr, 19, 10);
1613
643
  unsigned int wr = _BTST (instr, 21);
1614
643
  unsigned int csr_num = _BF (instr, 32, 22);
1615
643
  unsigned int src = srcA;
1616
643
  char src_bank = 'A';
1617
643
  bool err = false;
1618
1619
643
  if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1620
148
    {
1621
148
      src_bank = 'B';
1622
148
      src = srcB;
1623
148
    }
1624
1625
  /* MEv28 does not have urd/uwr.  */
1626
643
  if (csr_num == 1)
1627
1
    {
1628
1
      if (wr)
1629
0
  {
1630
0
    dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1631
0
             (int) _BTST (instr, 20));
1632
0
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1633
0
               src_lmext, dinfo);
1634
0
  }
1635
1
      else
1636
1
  {
1637
1
    dinfo->fprintf_func (dinfo->stream, "urd[");
1638
1
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1639
1
               src_lmext, dinfo);
1640
1
    dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1641
1
             (int) _BTST (instr, 20));
1642
1
  }
1643
1
      dinfo->fprintf_func (dinfo->stream, "]");
1644
1
    }
1645
642
  else
1646
642
    {
1647
642
      const char *nm = NULL;
1648
1649
642
      if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1650
103
  nm = nfp_me27_28_mecsrs[csr_num];
1651
1652
642
      dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1653
642
         (wr) ? "wr" : "rd");
1654
642
      if (nm)
1655
96
  dinfo->fprintf_func (dinfo->stream, "%s", nm);
1656
546
      else
1657
546
  dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1658
1659
642
      if (wr)
1660
197
  {
1661
197
    dinfo->fprintf_func (dinfo->stream, ", ");
1662
197
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1663
197
               src_lmext, dinfo);
1664
197
  }
1665
642
      dinfo->fprintf_func (dinfo->stream, "]");
1666
642
    }
1667
1668
643
  if (err)
1669
61
    return _NFP_ERR_CONT;
1670
582
  return 0;
1671
643
}
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
43
{
1678
43
  unsigned int br_op = _BF (instr, 4, 0);
1679
43
  unsigned int ctx_sig_state = _BF (instr, 17, 14);
1680
43
  unsigned int defer = _BF (instr, 21, 20);
1681
43
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1682
43
  int ret = 0;
1683
1684
43
  if (!nfp_me27_28_br_ops[br_op])
1685
16
    {
1686
16
      dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
1687
16
      ret = _NFP_ERR_CONT;
1688
16
    }
1689
27
  else
1690
27
    dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1691
1692
43
  switch (br_op)
1693
43
    {
1694
1
    case 16:      /* br=ctx */
1695
1
    case 17:      /* br!=ctx */
1696
1
    case 18:      /* br_signal */
1697
1
    case 19:      /* br_!signal */
1698
1
      dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1699
1
      break;
1700
9
    case 20:      /* "br_inp_state" */
1701
9
    case 21:      /* "br_!inp_state" */
1702
9
      dinfo->fprintf_func (dinfo->stream, "%s, ",
1703
9
         br_inpstates[ctx_sig_state]);
1704
9
      break;
1705
0
    case 22:      /* "br_cls_state" */
1706
0
    case 23:      /* "br_!cls_state" */
1707
0
      dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1708
0
         ctx_sig_state);
1709
0
      break;
1710
33
    default:
1711
33
      break;
1712
43
    }
1713
1714
43
  dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1715
1716
43
  if (defer)
1717
2
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1718
1719
43
  return ret;
1720
43
}
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
3.68k
{
1727
3.68k
  unsigned int srcA = _BF (instr, 7, 0);
1728
3.68k
  unsigned int by = _BF (instr, 9, 8);
1729
3.68k
  unsigned int srcB = _BF (instr, 17, 10);
1730
3.68k
  unsigned int imm_msb = _BTST (instr, 18);
1731
3.68k
  unsigned int eq = _BTST (instr, 19);
1732
3.68k
  unsigned int defer = _BF (instr, 21, 20);
1733
3.68k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1734
3.68k
  bool err = false;
1735
1736
3.68k
  if (eq)
1737
2.35k
    dinfo->fprintf_func (dinfo->stream, "br=byte[");
1738
1.33k
  else
1739
1.33k
    dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1740
1741
3.68k
  if (nfp_me_is_imm_opnd8 (srcA))
1742
1.19k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1743
1.19k
              src_lmext, imm_msb, dinfo);
1744
2.49k
  else
1745
2.49k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1746
2.49k
              src_lmext, imm_msb, dinfo);
1747
1748
3.68k
  dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1749
1750
3.68k
  if (nfp_me_is_imm_opnd8 (srcA))
1751
1.19k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1752
1.19k
              src_lmext, imm_msb, dinfo);
1753
2.49k
  else
1754
2.49k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1755
2.49k
              src_lmext, imm_msb, dinfo);
1756
1757
3.68k
  dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1758
1759
3.68k
  if (defer)
1760
1.59k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1761
1762
3.68k
  if (err)
1763
0
    return _NFP_ERR_CONT;
1764
3.68k
  return 0;
1765
3.68k
}
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
564
{
1771
564
  unsigned int srcA = _BF (instr, 7, 0);
1772
564
  unsigned int srcB = _BF (instr, 17, 10);
1773
564
  unsigned int b = _BTST (instr, 18);
1774
564
  unsigned int defer = _BF (instr, 21, 20);
1775
564
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1776
564
  bool err = false;
1777
1778
564
  if (b)
1779
206
    dinfo->fprintf_func (dinfo->stream, "br_bset[");
1780
358
  else
1781
358
    dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1782
1783
564
  if (nfp_me_is_imm_opnd8 (srcA))
1784
146
    {
1785
146
      err = err
1786
146
  || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1787
146
      b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1788
146
    }
1789
418
  else
1790
418
    {
1791
418
      err = err
1792
418
  || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1793
418
      b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1794
418
    }
1795
1796
564
  dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1797
1798
564
  if (defer)
1799
394
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1800
1801
564
  if (err)
1802
0
    return _NFP_ERR_CONT;
1803
564
  return 0;
1804
564
}
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
165
{
1810
165
  unsigned int srcA = _BF (instr, 9, 0);
1811
165
  unsigned int srcB = _BF (instr, 19, 10);
1812
165
  unsigned int defer = _BF (instr, 21, 20);
1813
165
  unsigned int imm = _BF (instr, 30, 22);
1814
165
  bool err = false;
1815
1816
165
  if (nfp_me_is_imm_opnd10 (srcA))
1817
39
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1818
126
  else
1819
126
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1820
1821
165
  if (!imm)
1822
0
    dinfo->fprintf_func (dinfo->stream, "rtn[");
1823
165
  else
1824
165
    dinfo->fprintf_func (dinfo->stream, "jump[");
1825
1826
165
  if (nfp_me_is_imm_opnd10 (srcA))
1827
39
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1828
126
  else
1829
126
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1830
1831
165
  if (imm)
1832
165
    dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1833
1834
165
  dinfo->fprintf_func (dinfo->stream, "]");
1835
1836
165
  if (defer)
1837
100
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1838
1839
165
  if (err)
1840
27
    return _NFP_ERR_CONT;
1841
138
  return 0;
1842
165
}
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
168
{
1850
168
  unsigned int srcA = _BF (instr, 9, 0);
1851
168
  unsigned int srcB = _BF (instr, 19, 10);
1852
168
  unsigned int mstep = _BF (instr, 22, 20);
1853
168
  char dst_bank = 'A' + _BTST (instr, 23);
1854
168
  unsigned int swap = _BTST (instr, 30);
1855
168
  unsigned int mtype = _BF (instr, 32, 31);
1856
168
  unsigned int nocc = _BTST (instr, 40);
1857
168
  bool err = false;
1858
1859
168
  if (swap)
1860
37
    {
1861
37
      unsigned int tmp = srcA;
1862
37
      srcA = srcB;
1863
37
      srcB = tmp;
1864
37
    }
1865
1866
168
  dinfo->fprintf_func (dinfo->stream, "mul_step[");
1867
1868
168
  if (mstep >= 4)
1869
41
    err = err
1870
41
      || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1871
127
  else
1872
127
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1873
127
               src_lmext, dinfo);
1874
1875
168
  dinfo->fprintf_func (dinfo->stream, ", ");
1876
1877
168
  if (mstep >= 4)
1878
41
    dinfo->fprintf_func (dinfo->stream, "--");
1879
127
  else
1880
127
    err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1881
119
               src_lmext, dinfo);
1882
1883
168
  dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1884
168
  if (mtype > 0)
1885
97
    {
1886
97
      const char *s = nfp_me27_28_mult_steps[mstep];
1887
97
      if (!s)
1888
13
  {
1889
13
    s = "<invalid mul_step>";
1890
13
    err = true;
1891
13
  }
1892
97
      dinfo->fprintf_func (dinfo->stream, "_%s", s);
1893
97
    }
1894
1895
168
  if (nocc)
1896
68
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1897
168
  if (gpr_wrboth)
1898
65
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1899
168
  if (pred_cc)
1900
54
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1901
1902
168
  if (err)
1903
36
    return _NFP_ERR_CONT;
1904
132
  return 0;
1905
168
}
1906
1907
static int
1908
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1909
899k
{
1910
899k
  const nfp_cmd_mnemonic *a = arg_a;
1911
899k
  const nfp_cmd_mnemonic *b = arg_b;
1912
1913
899k
  if (a->cpp_target != b->cpp_target)
1914
412k
    return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
1915
1916
487k
  if (a->cpp_action != b->cpp_action)
1917
255k
    return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1918
1919
231k
  return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
1920
487k
}
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
101k
{
1928
101k
  nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1929
101k
  const nfp_cmd_mnemonic *cmd = NULL;
1930
1931
101k
  cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1932
101k
     sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1933
1934
101k
  if (!cmd)
1935
32.4k
    return NULL;
1936
1937
  /* Make sure we backtrack to the first entry that still matches the three
1938
     bsearched fields - then we simply iterate and compare cpp_len.  */
1939
72.0k
  while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1940
2.76k
    --cmd;
1941
1942
  /* Now compare by cpp_len and make sure we stay in range.  */
1943
72.9k
  for (; (cmd < (mnemonics + mnemonics_cnt))
1944
72.9k
       && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1945
72.1k
    {
1946
72.1k
      if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1947
68.5k
  return cmd->mnemonic;
1948
72.1k
    }
1949
1950
767
  return NULL;
1951
69.2k
}
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
19.6k
{
1959
19.6k
  unsigned int srcA = _BF (instr, 7, 0);
1960
19.6k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
1961
19.6k
  unsigned int srcB = _BF (instr, 17, 10);
1962
19.6k
  unsigned int token = _BF (instr, 19, 18);
1963
19.6k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1964
19.6k
  unsigned int cpp_len = _BF (instr, 27, 25);
1965
19.6k
  unsigned int sig = _BF (instr, 31, 28);
1966
19.6k
  unsigned int tgtcmd = _BF (instr, 38, 32);
1967
19.6k
  unsigned int indref = _BTST (instr, 41);
1968
19.6k
  unsigned int mode = _BF (instr, 44, 42);
1969
1970
19.6k
  bool err = false;
1971
19.6k
  int cpp_target = -1;
1972
19.6k
  int cpp_action = -1;
1973
19.6k
  const char *mnemonic = NULL;
1974
19.6k
  unsigned int imm;
1975
19.6k
  unsigned int valBA;
1976
19.6k
  int visswap = ((mode == 1) || (mode == 3));
1977
1978
19.6k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1979
19.6k
  valBA = (srcB << 8) | srcA;
1980
1981
19.6k
  if (mode == 6)
1982
1.99k
    {
1983
1.99k
      token = 0;
1984
1.99k
      sig = 0;
1985
1.99k
      xfer = 0;
1986
1.99k
    }
1987
1988
  /* Convert tgtcmd to action/token tuple.  */
1989
19.6k
  if (_BF (tgtcmd, 6, 5) == 0x0)
1990
9.97k
    {
1991
9.97k
      switch (_BF (tgtcmd, 4, 2))
1992
9.97k
  {
1993
6.42k
  case 0:
1994
6.42k
    cpp_target = NFP_3200_CPPTGT_CAP;
1995
6.42k
    dinfo->fprintf_func (dinfo->stream, "cap[");
1996
6.42k
    break;
1997
670
  case 1:
1998
670
    cpp_target = NFP_3200_CPPTGT_MSF0;
1999
670
    dinfo->fprintf_func (dinfo->stream, "msf0[");
2000
670
    break;
2001
488
  case 2:
2002
488
    cpp_target = NFP_3200_CPPTGT_MSF1;
2003
488
    dinfo->fprintf_func (dinfo->stream, "msf1[");
2004
488
    break;
2005
279
  case 3:
2006
279
    cpp_target = NFP_3200_CPPTGT_PCIE;
2007
279
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2008
279
    break;
2009
1.10k
  case 4:
2010
1.10k
    cpp_target = NFP_3200_CPPTGT_HASH;
2011
1.10k
    break;
2012
269
  case 5:
2013
269
    cpp_target = NFP_3200_CPPTGT_CRYPTO;
2014
269
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2015
269
    break;
2016
479
  case 6:
2017
479
    cpp_target = NFP_3200_CPPTGT_ARM;
2018
479
    dinfo->fprintf_func (dinfo->stream, "arm[");
2019
479
    break;
2020
269
  case 7:
2021
269
    cpp_target = NFP_3200_CPPTGT_CT;
2022
269
    dinfo->fprintf_func (dinfo->stream, "ct[");
2023
269
    break;
2024
9.97k
  }
2025
9.97k
      cpp_action = _BF (tgtcmd, 1, 0);
2026
9.97k
    }
2027
9.70k
  else
2028
9.70k
    {
2029
9.70k
      switch (_BF (tgtcmd, 6, 4))
2030
9.70k
  {
2031
1.21k
  case 2:
2032
1.21k
    cpp_target = NFP_3200_CPPTGT_GS;
2033
1.21k
    dinfo->fprintf_func (dinfo->stream, "scratch[");
2034
1.21k
    break;
2035
2.47k
  case 3:
2036
2.47k
    cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM.  */
2037
2.47k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2038
2.47k
    break;
2039
1.29k
  case 4:
2040
2.50k
  case 5:
2041
2.50k
    cpp_target = NFP_3200_CPPTGT_MU;
2042
2.50k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2043
2.50k
    break;
2044
1.84k
  case 6:
2045
3.50k
  case 7:
2046
3.50k
    cpp_target = NFP_3200_CPPTGT_CLS;
2047
3.50k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2048
3.50k
    break;
2049
9.70k
  }
2050
9.70k
      cpp_action = _BF (tgtcmd, 3, 0);
2051
9.70k
    }
2052
2053
19.6k
  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
19.6k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2061
19.6k
           nfp_me27_mnemonics,
2062
19.6k
           ARRAY_SIZE (nfp_me27_mnemonics));
2063
2064
19.6k
  if (!mnemonic)
2065
4.48k
    {
2066
4.48k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2067
4.48k
         cpp_target, cpp_action, token);
2068
4.48k
      return _NFP_ERR_CONT;
2069
4.48k
    }
2070
2071
15.1k
  if (cpp_target == NFP_3200_CPPTGT_HASH)
2072
382
    {
2073
382
      dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2074
382
         mnemonic, xfer, cpp_len);
2075
382
      goto print_opt_toks;
2076
382
    }
2077
2078
14.8k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2079
2080
14.8k
  if (visswap)
2081
2.37k
    {
2082
2.37k
      unsigned int tmp = srcA;
2083
2.37k
      srcA = srcB;
2084
2.37k
      srcB = tmp;
2085
2.37k
    }
2086
2087
14.8k
  switch (mode)
2088
14.8k
    {
2089
5.81k
    case 0:     /* (A << 8) + B.  */
2090
7.40k
    case 1:     /* (B << 8) + A.  */
2091
7.40k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2092
7.40k
      err = err
2093
7.40k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2094
7.40k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2095
7.40k
      err = err
2096
7.40k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2097
7.40k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2098
7.40k
      break;
2099
739
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2100
1.53k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2101
1.53k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2102
1.53k
      err = err
2103
1.53k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2104
1.53k
      if (third_party_32bit)
2105
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2106
1.53k
      else
2107
1.53k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2108
1.53k
      err = err
2109
1.53k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2110
1.53k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2111
1.53k
      break;
2112
1.29k
    case 4:     /* A + B.  */
2113
1.29k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2114
1.29k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2115
1.29k
      dinfo->fprintf_func (dinfo->stream, ", ");
2116
1.29k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2117
1.29k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2118
1.29k
      break;
2119
1.35k
    case 5:     /* Immediate address.  */
2120
1.35k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2121
1.35k
         (cpp_len + 1));
2122
1.35k
      break;
2123
1.77k
    case 6:     /* Immediate address and data.  */
2124
1.77k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2125
1.77k
      break;
2126
1.44k
    case 7:     /* Immediate data.  */
2127
1.44k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2128
1.44k
         ((xfer << 16) | valBA), (cpp_len + 1));
2129
1.44k
      break;
2130
14.8k
    }
2131
2132
15.1k
 print_opt_toks:
2133
15.1k
  dinfo->fprintf_func (dinfo->stream, "]");
2134
2135
15.1k
  if (indref && (mode != 2) && (mode != 3))
2136
3.35k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2137
2138
15.1k
  if (ctxswap_defer != 3)
2139
13.0k
    {
2140
13.0k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2141
13.0k
      if (sig)
2142
6.74k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2143
6.32k
      else
2144
6.32k
  dinfo->fprintf_func (dinfo->stream, "--]");
2145
2146
13.0k
      if (ctxswap_defer != 0)
2147
5.08k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2148
13.0k
    }
2149
2.12k
  else if (sig)
2150
1.30k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2151
2152
15.1k
  if (err)
2153
0
    return _NFP_ERR_CONT;
2154
15.1k
  return 0;
2155
15.1k
}
2156
2157
static int
2158
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
2159
      struct disassemble_info *dinfo)
2160
347
{
2161
347
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2162
347
}
2163
2164
static int
2165
nfp_me27_print_alu (uint64_t instr, int num_ctx,
2166
        struct disassemble_info *dinfo)
2167
266
{
2168
266
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2169
266
}
2170
2171
static int
2172
nfp_me27_print_immed (uint64_t instr, int num_ctx,
2173
          struct disassemble_info *dinfo)
2174
53
{
2175
53
  return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2176
53
}
2177
2178
static int
2179
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
2180
       struct disassemble_info *dinfo)
2181
44
{
2182
44
  return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2183
44
}
2184
2185
static int
2186
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2187
890
{
2188
890
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2189
890
}
2190
2191
static int
2192
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
2193
        struct disassemble_info *dinfo)
2194
20
{
2195
20
  return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2196
20
}
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
447
{
2208
447
  return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2209
447
}
2210
2211
static int
2212
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
2213
           struct disassemble_info *dinfo)
2214
169
{
2215
169
  return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2216
169
}
2217
2218
static int
2219
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
2220
           struct disassemble_info *dinfo)
2221
31
{
2222
31
  return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2223
31
}
2224
2225
static int
2226
nfp_me27_print_mult (uint64_t instr, int num_ctx,
2227
         struct disassemble_info *dinfo)
2228
10
{
2229
10
  return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2230
10
}
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
93.1k
{
2238
93.1k
  unsigned int srcA = _BF (instr, 7, 0);
2239
93.1k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
2240
93.1k
  unsigned int srcB = _BF (instr, 17, 10);
2241
93.1k
  unsigned int token = _BF (instr, 19, 18);
2242
93.1k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2243
93.1k
  unsigned int cpp_len = _BF (instr, 27, 25);
2244
93.1k
  unsigned int sig = _BF (instr, 31, 28);
2245
93.1k
  unsigned int tgtcmd = _BF (instr, 38, 32);
2246
93.1k
  unsigned int indref = _BTST (instr, 41);
2247
93.1k
  unsigned int mode = _BF (instr, 44, 42);
2248
2249
93.1k
  bool err = false;
2250
93.1k
  int cpp_target = -1;
2251
93.1k
  int cpp_action = -1;
2252
93.1k
  const char *mnemonic = NULL;
2253
93.1k
  unsigned int imm;
2254
93.1k
  unsigned int valBA;
2255
93.1k
  int visswap = ((mode == 1) || (mode == 3));
2256
2257
93.1k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2258
93.1k
  valBA = (srcB << 8) | srcA;
2259
2260
93.1k
  if (mode == 6)
2261
7.02k
    {
2262
7.02k
      token = 0;
2263
7.02k
      sig = 0;
2264
7.02k
      xfer = 0;
2265
7.02k
    }
2266
2267
  /* Convert tgtcmd to action/token tuple.  */
2268
93.1k
  if (_BF (tgtcmd, 6, 5) == 0x0)
2269
47.7k
    {
2270
47.7k
      switch (_BF (tgtcmd, 4, 2))
2271
47.7k
  {
2272
34.4k
  case 0:
2273
34.4k
    cpp_target = NFP_6000_CPPTGT_ILA;
2274
34.4k
    dinfo->fprintf_func (dinfo->stream, "ila[");
2275
34.4k
    break;
2276
3.52k
  case 1:
2277
3.52k
    cpp_target = NFP_6000_CPPTGT_NBI;
2278
3.52k
    dinfo->fprintf_func (dinfo->stream, "nbi[");
2279
3.52k
    break;
2280
1.77k
  case 3:
2281
1.77k
    cpp_target = NFP_6000_CPPTGT_PCIE;
2282
1.77k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2283
1.77k
    break;
2284
950
  case 5:
2285
950
    cpp_target = NFP_6000_CPPTGT_CRYPTO;
2286
950
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2287
950
    break;
2288
1.64k
  case 6:
2289
1.64k
    cpp_target = NFP_6000_CPPTGT_ARM;
2290
1.64k
    dinfo->fprintf_func (dinfo->stream, "arm[");
2291
1.64k
    break;
2292
971
  case 7:
2293
971
    cpp_target = NFP_6000_CPPTGT_CTXPB;
2294
971
    dinfo->fprintf_func (dinfo->stream, "ct[");
2295
971
    break;
2296
47.7k
  }
2297
47.7k
      cpp_action = _BF (tgtcmd, 1, 0);
2298
47.7k
    }
2299
45.4k
  else
2300
45.4k
    {
2301
      /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2302
   for mem/cls it's "a".  */
2303
45.4k
      cpp_action = _BF (tgtcmd, 4, 0);
2304
45.4k
      switch (_BF (tgtcmd, 6, 4))
2305
45.4k
  {
2306
9.10k
  case 3:
2307
9.10k
    cpp_target = NFP_6000_CPPTGT_VQDR;
2308
9.10k
    cpp_action = _BF (tgtcmd, 3, 0);
2309
9.10k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2310
9.10k
    break;
2311
8.20k
  case 4:
2312
13.0k
  case 5:
2313
13.0k
    cpp_target = NFP_6000_CPPTGT_MU;
2314
13.0k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2315
13.0k
    break;
2316
8.82k
  case 6:
2317
16.6k
  case 7:
2318
16.6k
    cpp_target = NFP_6000_CPPTGT_CLS;
2319
16.6k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2320
16.6k
    break;
2321
45.4k
  }
2322
45.4k
    }
2323
2324
93.1k
  if (cpp_target < 0)
2325
11.0k
    {
2326
11.0k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2327
11.0k
         cpp_target, cpp_action, token);
2328
11.0k
      return _NFP_ERR_CONT;
2329
11.0k
    }
2330
2331
82.0k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2332
82.0k
           nfp_me28_mnemonics,
2333
82.0k
           ARRAY_SIZE (nfp_me28_mnemonics));
2334
2335
82.0k
  if (!mnemonic)
2336
28.7k
    {
2337
28.7k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2338
28.7k
         cpp_target, cpp_action, token);
2339
28.7k
      return _NFP_ERR_CONT;
2340
28.7k
    }
2341
2342
53.3k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2343
2344
53.3k
  if (visswap)
2345
9.14k
    {
2346
9.14k
      unsigned int tmp = srcA;
2347
9.14k
      srcA = srcB;
2348
9.14k
      srcB = tmp;
2349
9.14k
    }
2350
2351
53.3k
  switch (mode)
2352
53.3k
    {
2353
26.2k
    case 0:     /* (A << 8) + B.  */
2354
30.8k
    case 1:     /* (B << 8) + A.  */
2355
30.8k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2356
30.8k
      err = err
2357
30.8k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2358
30.8k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2359
30.8k
      err = err
2360
30.8k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2361
30.8k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2362
30.8k
      break;
2363
3.37k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2364
7.92k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2365
7.92k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2366
7.92k
      err = err
2367
7.92k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2368
7.92k
      if (third_party_32bit)
2369
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2370
7.92k
      else
2371
7.92k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2372
7.92k
      err = err
2373
7.92k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2374
7.92k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2375
7.92k
      break;
2376
3.78k
    case 4:     /* A + B.  */
2377
3.78k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2378
3.78k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2379
3.78k
      dinfo->fprintf_func (dinfo->stream, ", ");
2380
3.78k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2381
3.78k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2382
3.78k
      break;
2383
3.14k
    case 5:     /* Immediate address.  */
2384
3.14k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2385
3.14k
         (cpp_len + 1));
2386
3.14k
      break;
2387
3.43k
    case 6:     /* Immediate address and data.  */
2388
3.43k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2389
3.43k
      break;
2390
4.16k
    case 7:     /* Immediate data.  */
2391
4.16k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2392
4.16k
         ((xfer << 16) | valBA), (cpp_len + 1));
2393
4.16k
      break;
2394
53.3k
    }
2395
2396
53.3k
  dinfo->fprintf_func (dinfo->stream, "]");
2397
2398
53.3k
  if (indref && (mode != 2) && (mode != 3))
2399
12.2k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2400
2401
53.3k
  if (ctxswap_defer != 3)
2402
44.1k
    {
2403
44.1k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2404
44.1k
      if (sig)
2405
19.5k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2406
24.6k
      else
2407
24.6k
  dinfo->fprintf_func (dinfo->stream, "--]");
2408
2409
44.1k
      if (ctxswap_defer != 0)
2410
15.7k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2411
44.1k
    }
2412
9.15k
  else if (sig)
2413
5.84k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2414
2415
53.3k
  if (err)
2416
0
    return _NFP_ERR_CONT;
2417
53.3k
  return 0;
2418
53.3k
}
2419
2420
static int
2421
nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
2422
      struct disassemble_info *dinfo)
2423
13.7k
{
2424
13.7k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2425
13.7k
  unsigned int src_lmext = _BTST (instr, 42);
2426
13.7k
  unsigned int dst_lmext = _BTST (instr, 43);
2427
13.7k
  unsigned int pred_cc = _BTST (instr, 44);
2428
2429
13.7k
  return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2430
13.7k
            src_lmext, gpr_wrboth, num_ctx, dinfo);
2431
13.7k
}
2432
2433
static int
2434
nfp_me28_print_alu (uint64_t instr, int num_ctx,
2435
        struct disassemble_info *dinfo)
2436
11.7k
{
2437
11.7k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2438
11.7k
  unsigned int src_lmext = _BTST (instr, 42);
2439
11.7k
  unsigned int dst_lmext = _BTST (instr, 43);
2440
11.7k
  unsigned int pred_cc = _BTST (instr, 44);
2441
2442
11.7k
  return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2443
11.7k
        gpr_wrboth, num_ctx, dinfo);
2444
11.7k
}
2445
2446
static int
2447
nfp_me28_print_immed (uint64_t instr, int num_ctx,
2448
          struct disassemble_info *dinfo)
2449
1.16k
{
2450
1.16k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2451
1.16k
  unsigned int dst_lmext = _BTST (instr, 43);
2452
1.16k
  unsigned int pred_cc = _BTST (instr, 44);
2453
2454
1.16k
  return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2455
1.16k
          num_ctx, dinfo);
2456
1.16k
}
2457
2458
static int
2459
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
2460
       struct disassemble_info *dinfo)
2461
340
{
2462
340
  unsigned int gpr_wrboth = _BTST (instr, 41);
2463
340
  unsigned int src_lmext = _BTST (instr, 42);
2464
340
  unsigned int dst_lmext = _BTST (instr, 43);
2465
340
  unsigned int pred_cc = _BTST (instr, 44);
2466
2467
340
  return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2468
340
             src_lmext, gpr_wrboth, num_ctx, dinfo);
2469
340
}
2470
2471
static int
2472
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2473
3.83k
{
2474
3.83k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2475
3.83k
}
2476
2477
static int
2478
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
2479
        struct disassemble_info *dinfo)
2480
623
{
2481
623
  unsigned int src_lmext = _BTST (instr, 42);
2482
2483
623
  return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2484
623
}
2485
2486
static int
2487
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2488
31
{
2489
31
  return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2490
31
}
2491
2492
static int
2493
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
2494
      struct disassemble_info *dinfo)
2495
3.24k
{
2496
3.24k
  unsigned int src_lmext = _BTST (instr, 42);
2497
3.24k
  return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2498
3.24k
}
2499
2500
static int
2501
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
2502
           struct disassemble_info *dinfo)
2503
395
{
2504
395
  unsigned int src_lmext = _BTST (instr, 42);
2505
395
  return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2506
395
}
2507
2508
static int
2509
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
2510
           struct disassemble_info *dinfo)
2511
134
{
2512
134
  unsigned int src_lmext = _BTST (instr, 42);
2513
134
  return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2514
134
}
2515
2516
static int
2517
nfp_me28_print_mult (uint64_t instr, int num_ctx,
2518
         struct disassemble_info *dinfo)
2519
158
{
2520
158
  unsigned int gpr_wrboth = _BTST (instr, 41);
2521
158
  unsigned int src_lmext = _BTST (instr, 42);
2522
158
  unsigned int dst_lmext = _BTST (instr, 43);
2523
158
  unsigned int pred_cc = _BTST (instr, 44);
2524
2525
158
  return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2526
158
         gpr_wrboth, num_ctx, dinfo);
2527
158
}
2528
2529
static bool
2530
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2531
91
{
2532
91
  Elf_Internal_Shdr *sec = NULL;
2533
91
  Elf_Nfp_MeConfig mecfg_ent;
2534
91
  unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2535
91
  file_ptr roff = 0;
2536
91
  unsigned int sec_cnt = 0;
2537
91
  unsigned int sec_idx;
2538
91
  size_t menum_linear = 0;
2539
2540
91
  if (!dinfo->section)
2541
    /* No section info, will use default values.  */
2542
91
    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
  for (roff = 0; (bfd_size_type) roff < sec->sh_size;
2563
0
       roff += sec->sh_entsize, menum_linear++)
2564
0
    {
2565
0
      nfp_priv_mecfg *mecfg;
2566
0
      int isl = menum_linear >> 3;
2567
0
      int menum = menum_linear & 7;
2568
2569
0
      if (menum_linear >= 40)
2570
0
  {
2571
0
    dinfo->fprintf_func (dinfo->stream,
2572
0
             _("File has invalid ME-Config section."));
2573
0
    return false;
2574
0
  }
2575
2576
0
      mecfg = &priv->mecfgs[isl][menum][1];
2577
2578
0
      if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
2579
0
             buffer, roff, sizeof (buffer)))
2580
0
  return false;
2581
2582
0
      mecfg_ent.ctx_enables = bfd_getl32 (buffer + offsetof (Elf_Nfp_MeConfig,
2583
0
                   ctx_enables));
2584
0
      mecfg_ent.misc_control = bfd_getl32 (buffer
2585
0
  + offsetof (Elf_Nfp_MeConfig, misc_control));
2586
2587
0
      mecfg->ctx4_mode = _BTST (mecfg_ent.ctx_enables, 31);
2588
0
      mecfg->addr_3rdparty32 = _BTST (mecfg_ent.misc_control, 4);
2589
0
      mecfg->scs_cnt = _BTST (mecfg_ent.misc_control, 2);
2590
0
    }
2591
2592
0
  return true;
2593
0
}
2594
2595
static bool
2596
init_nfp6000_mecsr_sec (nfp_priv_data * priv, Elf_Internal_Shdr * sec,
2597
      bool is_for_text, struct disassemble_info *dinfo)
2598
0
{
2599
0
  Elf_Nfp_InitRegEntry ireg;
2600
0
  unsigned char buffer[sizeof (Elf_Nfp_InitRegEntry)];
2601
0
  file_ptr ireg_off = 0;
2602
0
  size_t isl, menum;
2603
2604
0
  if (sec->sh_entsize != sizeof (ireg))
2605
0
    return false;
2606
2607
0
  isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2608
2609
  /* For these sections we know that the address will only be 32 bits
2610
     so we only need cpp_offset_lo.
2611
     Address is encoded as follows:
2612
     <31:30> 0
2613
     <29:24> island (already got this from sh_info)
2614
     <23:17> 0
2615
     <16:16> XferCsrRegSel (1 for these sections)
2616
     <15:14> 0
2617
     <13:10> DataMasterID (MEnum = this - 4)
2618
     <9:2> register (index)
2619
     <1:0> 0b0 (register byte address if appened to the previous field).  */
2620
0
  for (ireg_off = 0; (bfd_size_type) ireg_off < sec->sh_size;
2621
0
       ireg_off += sec->sh_entsize)
2622
0
    {
2623
0
      uint32_t csr_off;
2624
0
      nfp_priv_mecfg *mecfg;
2625
2626
0
      if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
2627
0
             buffer, ireg_off, sizeof (buffer)))
2628
0
  return false;
2629
2630
0
      ireg.cpp_offset_lo = bfd_getl32 (buffer
2631
0
  + offsetof (Elf_Nfp_InitRegEntry, cpp_offset_lo));
2632
0
      ireg.mask = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, mask));
2633
0
      ireg.val = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, val));
2634
0
      ireg.w0 = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, w0));
2635
2636
0
      if (NFP_IREG_ENTRY_WO_NLW (ireg.w0))
2637
0
  continue;
2638
2639
      /* Only consider entries that are permanent for runtime.  */
2640
0
      if ((NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_CONST)
2641
0
    && (NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_FORCE))
2642
0
  continue;
2643
2644
0
      menum = _BF (ireg.cpp_offset_lo, 13, 10) - 4;
2645
0
      csr_off = _BF (ireg.cpp_offset_lo, 9, 0);
2646
2647
0
      if (isl >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2648
0
  return false;
2649
  
2650
0
      mecfg = &priv->mecfgs[isl][menum][is_for_text];
2651
0
      switch (csr_off)
2652
0
  {
2653
0
  case _NFP_ME27_28_CSR_CTX_ENABLES:
2654
0
    mecfg->ctx4_mode = _BTST (ireg.val, 31);
2655
0
    break;
2656
0
  case _NFP_ME27_28_CSR_MISC_CONTROL:
2657
0
    mecfg->addr_3rdparty32 = _BTST (ireg.val, 4);
2658
0
    mecfg->scs_cnt = _BTST (ireg.val, 2);
2659
0
    break;
2660
0
  default:
2661
0
    break;
2662
0
  }
2663
0
    }
2664
2665
0
  return true;
2666
0
}
2667
2668
static bool
2669
init_nfp6000_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2670
305
{
2671
305
  int mecfg_orders[64][2];
2672
305
  size_t isl;
2673
305
  unsigned int sec_cnt = 0;
2674
305
  unsigned int sec_idx;
2675
305
  bool is_for_text;
2676
2677
305
  memset (mecfg_orders, -1, sizeof (mecfg_orders));
2678
2679
305
  if (dinfo->section == NULL
2680
305
      || dinfo->section->owner == NULL
2681
305
      || elf_elfsections (dinfo->section->owner) == NULL)
2682
    /* No section info, will use default values.  */
2683
298
    return true;
2684
2685
7
  sec_cnt = elf_numsections (dinfo->section->owner);
2686
2687
  /* Go through all MECSR init sections to find ME configs.  */
2688
161
  for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2689
154
    {
2690
154
      Elf_Internal_Shdr *sec;
2691
154
      int sec_order;
2692
2693
154
      sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2694
154
      sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
2695
2696
154
      is_for_text = (sec->sh_flags & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2697
2698
      /* If we have an init2 section, that is the one that applies to the
2699
   ME when executing init code.  So we make it's order higher than
2700
   any plain init section.  */
2701
154
      if (sec->sh_flags & SHF_NFP_INIT2)
2702
13
  sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
2703
2704
154
      if (sec->sh_type != SHT_NFP_INITREG)
2705
154
  continue;
2706
0
      if (!SHI_NFP_6000_IS_IREG_MECSR (sec->sh_info))
2707
0
  continue;
2708
2709
0
      isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2710
0
      if ((sec_order < mecfg_orders[isl][is_for_text]))
2711
  /* Lower order or transient, skip it.  */
2712
0
  continue;
2713
2714
0
      mecfg_orders[isl][is_for_text] = sec_order;
2715
2716
0
      if (!init_nfp6000_mecsr_sec (priv, sec, is_for_text, dinfo))
2717
0
  {
2718
0
    dinfo->fprintf_func (dinfo->stream,
2719
0
             _("Error processing section %u "), sec_idx);
2720
0
    return false;
2721
0
  }
2722
0
    }
2723
2724
7
  return true;
2725
7
}
2726
2727
static int
2728
parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
2729
185k
{
2730
185k
  const char *option;
2731
2732
185k
  if (dinfo->disassembler_options == NULL)
2733
185k
    return 0;
2734
2735
0
  FOR_EACH_DISASSEMBLER_OPTION (option, dinfo->disassembler_options)
2736
0
  {
2737
0
    if (disassembler_options_cmp (option, "no-pc") == 0)
2738
0
      opts->show_pc = 0;
2739
0
    else if (disassembler_options_cmp (option, "ctx4") == 0)
2740
0
      {
2741
0
  if (!opts->ctx_mode)
2742
0
    opts->ctx_mode = 4;
2743
0
      }
2744
0
    else if (disassembler_options_cmp (option, "ctx8") == 0)
2745
0
      opts->ctx_mode = 8;
2746
0
    else
2747
0
      {
2748
0
  dinfo->fprintf_func (dinfo->stream, _("Invalid NFP option: %s"), option);
2749
0
  return _NFP_ERR_STOP;
2750
0
      }
2751
0
  }
2752
2753
0
  return 0;
2754
0
}
2755
2756
/* Called on first disassembly attempt so that dinfo->section is valid
2757
   so that we can get the bfd owner to find ME configs.  */
2758
2759
static nfp_priv_data *
2760
init_nfp_priv (struct disassemble_info *dinfo)
2761
185k
{
2762
185k
  nfp_priv_data *priv;
2763
185k
  int ret = false;
2764
2765
185k
  if (dinfo->private_data)
2766
185k
    return (nfp_priv_data *) dinfo->private_data;
2767
2768
#if 0  /* Right now only section-related info is kept in priv.
2769
    So don't even calloc it if we don't need it.  */
2770
  if (!dinfo->section)
2771
     return NULL;
2772
#endif
2773
2774
  /* Alloc with no free, seems to be either this or a static global variable
2775
     and this at least keeps a large struct unallocated until really needed.  */
2776
596
  priv = calloc (1, sizeof (*priv));
2777
596
  if (!priv)
2778
0
    return NULL;
2779
2780
596
  switch (dinfo->mach)
2781
596
    {
2782
91
    case E_NFP_MACH_3200:
2783
91
      ret = init_nfp3200_priv (priv, dinfo);
2784
91
      break;
2785
305
    case E_NFP_MACH_6000:
2786
305
      ret = init_nfp6000_priv (priv, dinfo);
2787
305
      break;
2788
596
    }
2789
2790
596
  if (!ret)
2791
200
    {
2792
200
      free (priv);
2793
200
      return NULL;
2794
200
    }
2795
2796
396
  dinfo->private_data = priv;
2797
396
  return priv;
2798
596
}
2799
2800
static int
2801
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2802
185k
{
2803
185k
  nfp_priv_data *priv = init_nfp_priv (dinfo);
2804
185k
  bfd_byte buffer[8];
2805
185k
  int err;
2806
185k
  uint64_t instr = 0;
2807
185k
  size_t island, menum;
2808
185k
  int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2809
185k
  int is_text = 1;
2810
2811
185k
  err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2812
185k
  if (err)
2813
401
    return _NFP_ERR_STOP;
2814
2815
185k
  if (!dinfo->section)
2816
146k
    {
2817
146k
      num_ctx = 8;
2818
146k
      scs_cnt = 0;
2819
146k
      addr_3rdparty32 = 0;
2820
146k
    }
2821
38.4k
  else
2822
38.4k
    {
2823
38.4k
      unsigned int sh_info = 0;
2824
38.4k
      nfp_priv_mecfg *mecfg;
2825
2826
      /* We have a section, presumably all ELF sections.  Try to find
2827
   proper ME configs to produce better disassembly.  */
2828
38.4k
      if (!priv)
2829
0
  return _NFP_ERR_STOP; /* Sanity check */
2830
2831
38.4k
      is_text = (elf_section_flags (dinfo->section)
2832
38.4k
     & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2833
2834
38.4k
      sh_info = elf_section_info (dinfo->section);
2835
2836
38.4k
      switch (dinfo->mach)
2837
38.4k
  {
2838
0
  case E_NFP_MACH_3200:
2839
0
    island = SHI_NFP_3200_ISLAND (sh_info);
2840
0
    menum = SHI_NFP_3200_MENUM (sh_info);
2841
0
    break;
2842
38.4k
  default:
2843
38.4k
    island = SHI_NFP_ISLAND (sh_info);
2844
38.4k
    menum = SHI_NFP_MENUM (sh_info);
2845
38.4k
    break;
2846
38.4k
  }
2847
2848
38.4k
      if (island >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2849
7
  {
2850
7
    dinfo->fprintf_func (dinfo->stream, "Invalid island or me.");
2851
7
    return _NFP_ERR_STOP;
2852
7
  }
2853
2854
38.4k
      mecfg = &priv->mecfgs[island][menum][is_text];
2855
38.4k
      num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2856
38.4k
      addr_3rdparty32 = mecfg->addr_3rdparty32;
2857
38.4k
      scs_cnt = mecfg->scs_cnt;
2858
38.4k
    }
2859
2860
185k
  if (opts->ctx_mode)
2861
0
    num_ctx = opts->ctx_mode;
2862
2863
185k
  dinfo->bytes_per_line = 8;
2864
185k
  dinfo->bytes_per_chunk = 8;
2865
2866
185k
  instr = bfd_getl64 (buffer);
2867
2868
185k
  if (opts->show_pc)
2869
185k
    {
2870
185k
      pc = (int) (addr >> 3);
2871
2872
      /* Guess max PC for formatting */
2873
185k
      tmpj = (int) (dinfo->buffer_length >> 3);
2874
185k
      if (scs_cnt == 1)
2875
0
  {
2876
0
    pc *= 2;
2877
0
    tmpj *= 2;
2878
0
    if (! !(menum & 1))
2879
0
      {
2880
0
        pc++;
2881
0
        tmpj++;
2882
0
      }
2883
0
  }
2884
2885
572k
      for (tmpi = 1; tmpj > 9; tmpj /= 10)
2886
387k
  tmpi++;
2887
2888
185k
      tmpj = pc;
2889
674k
      for (; tmpj > 9; tmpj /= 10)
2890
489k
  tmpi--;
2891
2892
185k
      dinfo->fprintf_func (dinfo->stream, "%*c%d  ", tmpi, '.', pc);
2893
185k
    }
2894
2895
185k
  switch (dinfo->mach)
2896
185k
    {
2897
30.7k
    case E_NFP_MACH_3200:
2898
30.7k
      if (NFP_ME27_INSTR_IS_CMD (instr))
2899
19.6k
  err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2900
11.1k
      else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2901
347
  err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2902
10.7k
      else if (NFP_ME27_INSTR_IS_ALU (instr))
2903
266
  err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2904
10.4k
      else if (NFP_ME27_INSTR_IS_IMMED (instr))
2905
53
  err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2906
10.4k
      else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2907
44
  err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2908
10.4k
      else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2909
890
  err = nfp_me27_print_ctx_arb (instr, dinfo);
2910
9.51k
      else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2911
20
  err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2912
9.49k
      else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2913
12
  err = nfp_me27_print_branch (instr, dinfo);
2914
9.47k
      else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2915
447
  err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2916
9.03k
      else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2917
169
  err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2918
8.86k
      else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2919
31
  err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2920
8.83k
      else if (NFP_ME27_INSTR_IS_MULT (instr))
2921
10
  err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2922
8.82k
      else
2923
8.82k
  err = nfp_me_print_invalid (instr, dinfo);
2924
30.7k
      break;
2925
2926
154k
    case E_NFP_MACH_6000:
2927
154k
      if (NFP_ME28_INSTR_IS_CMD (instr))
2928
93.1k
  err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2929
61.0k
      else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2930
13.7k
  err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2931
47.3k
      else if (NFP_ME28_INSTR_IS_ALU (instr))
2932
11.7k
  err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2933
35.6k
      else if (NFP_ME28_INSTR_IS_IMMED (instr))
2934
1.16k
  err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2935
34.4k
      else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2936
340
  err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2937
34.1k
      else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2938
3.83k
  err = nfp_me28_print_ctx_arb (instr, dinfo);
2939
30.2k
      else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2940
623
  err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2941
29.6k
      else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2942
31
  err = nfp_me28_print_branch (instr, dinfo);
2943
29.6k
      else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2944
3.24k
  err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2945
26.3k
      else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2946
395
  err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2947
25.9k
      else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2948
134
  err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2949
25.8k
      else if (NFP_ME28_INSTR_IS_MULT (instr))
2950
158
  err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2951
25.6k
      else
2952
25.6k
  err = nfp_me_print_invalid (instr, dinfo);
2953
154k
      break;
2954
185k
    }
2955
2956
185k
  if (err < 0)
2957
83.0k
    return err;
2958
102k
  return 8;
2959
185k
}
2960
2961
int
2962
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2963
185k
{
2964
185k
  nfp_opts opts;
2965
185k
  int err;
2966
2967
185k
  opts.show_pc = 1;
2968
185k
  opts.ctx_mode = 0;
2969
185k
  err = parse_disassembler_options (&opts, dinfo);
2970
185k
  if (err < 0)
2971
0
    goto end;
2972
2973
185k
  err = _print_instrs (addr, dinfo, &opts);
2974
2975
185k
 end:
2976
185k
  if (err != 8)
2977
83.4k
    dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2978
185k
  if (err == _NFP_ERR_CONT)
2979
83.0k
    return 8;
2980
102k
  return err;
2981
185k
}
2982
2983
void
2984
print_nfp_disassembler_options (FILE * stream)
2985
0
{
2986
0
  fprintf (stream, _("\n\
2987
0
The following NFP specific disassembler options are supported for use\n\
2988
0
with the -M switch (multiple options should be separated by commas):\n"));
2989
2990
0
  fprintf (stream, _("\n\
2991
0
  no-pc       Don't print program counter prefix.\n\
2992
0
  ctx4        Force disassembly using 4-context mode.\n\
2993
0
  ctx8        Force 8-context mode, takes precedence."));
2994
2995
0
  fprintf (stream, _("\n"));
2996
0
}