Coverage Report

Created: 2026-10-02 09:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/opcodes/nfp-dis.c
Line
Count
Source
1
/* Print NFP instructions for objdump.
2
   Copyright (C) 2017-2026 Free Software Foundation, Inc.
3
   Contributed by Francois H. Theron <francois.theron@netronome.com>
4
5
   This file is part of the GNU opcodes library.
6
7
   This library is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3, or (at your option)
10
   any later version.
11
12
   It is distributed in the hope that it will be useful, but WITHOUT
13
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15
   License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
/* There will be many magic numbers here that are based on hardware.
23
   Making #define macros for each encoded bit field will probably reduce
24
   readability far more than the simple numbers will, so we make sure that
25
   the context of the magic numbers make it clear what they are used for.  */
26
27
#include "sysdep.h"
28
#include <stdio.h>
29
#include "disassemble.h"
30
#include "libiberty.h"
31
#include "elf/nfp.h"
32
#include "opcode/nfp.h"
33
#include "opintl.h"
34
#include "elf-bfd.h"
35
#include "bfd.h"
36
#include <stdint.h>
37
38
1.00k
#define _NFP_ERR_STOP -1
39
707k
#define _NFP_ERR_CONT -8
40
41
1.29M
#define _BTST(v, b)               (((v) >> b) & 1)
42
6.94M
#define _BF(v, msb, lsb)          (((v) >> (lsb)) & \
43
6.94M
           ((1U << ((msb) - (lsb) + 1)) - 1))
44
442k
#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
554k
#define _NFP_ISLAND_MAX 64
50
277k
#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
74.9k
{
930
74.9k
  const char * err_msg = N_("<invalid_instruction>:");
931
74.9k
  dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
932
74.9k
  return _NFP_ERR_CONT;
933
74.9k
}
934
935
static bool
936
nfp_me_is_imm_opnd10 (unsigned int opnd)
937
63.3k
{
938
63.3k
  return _BF (opnd, 9, 8) == 0x3;
939
63.3k
}
940
941
static bool
942
nfp_me_is_imm_opnd8 (unsigned int opnd)
943
61.6k
{
944
61.6k
  return _BTST (opnd, 5);
945
61.6k
}
946
947
static unsigned int
948
nfp_me_imm_opnd10 (unsigned int opnd)
949
8.54k
{
950
8.54k
  return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
951
8.54k
}
952
953
static unsigned int
954
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
955
4.06k
{
956
4.06k
  unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
957
958
4.06k
  return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
959
4.06k
}
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
69.8k
{
967
69.8k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
968
969
  /* Absolute GPR.  */
970
69.8k
  if (_BF (opnd, 9, 7) == 0x1)
971
9.77k
    dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
972
973
  /* Relative GPR.  */
974
60.0k
  else if (_BF (opnd, 9, 6) == 0x0)
975
10.5k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
976
977
  /* Indexed Xfer.  */
978
49.5k
  else if (_BF (opnd, 9, 7) == 0x2)
979
5.98k
    {
980
5.98k
      dinfo->fprintf_func (dinfo->stream, "*$index");
981
5.98k
      if (_BF (opnd, 2, 1) == 0x1)
982
1.09k
  dinfo->fprintf_func (dinfo->stream, "++");
983
4.88k
      else if (_BF (opnd, 2, 1) == 0x2)
984
1.87k
  dinfo->fprintf_func (dinfo->stream, "--");
985
5.98k
    }
986
987
  /* Relative Xfer.  */
988
43.5k
  else if (_BF (opnd, 9, 7) == 0x3)
989
7.37k
    {
990
7.37k
      if (_BTST (opnd, 6))
991
3.91k
  n += (num_ctx == 8 ? 16 : 32);
992
7.37k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
993
7.37k
    }
994
995
  /* Indexed Next Neighbour.  */
996
36.1k
  else if (_BF (opnd, 9, 6) == 0x9)
997
5.47k
    {
998
5.47k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
999
5.47k
      if (_BTST (opnd, 1))
1000
3.53k
  dinfo->fprintf_func (dinfo->stream, "++");
1001
5.47k
    }
1002
1003
  /* Relative Next Neighbour.  */
1004
30.6k
  else if (_BF (opnd, 9, 6) == 0xa)
1005
7.32k
    {
1006
7.32k
      dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1007
7.32k
    }
1008
1009
  /* Indexed LMEM.  */
1010
23.3k
  else if (_BF (opnd, 9, 6) == 0x8)
1011
4.39k
    {
1012
4.39k
      n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1013
4.39k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1014
4.39k
      if (_BTST (opnd, 4))
1015
1.48k
  dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1016
2.91k
      else if (_BF (opnd, 3, 0))
1017
2.39k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1018
4.39k
    }
1019
1020
  /* 8-bit Constant value.  */
1021
18.9k
  else if (_BF (opnd, 9, 8) == 0x3)
1022
8.65k
    dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1023
1024
10.3k
  else
1025
10.3k
    {
1026
10.3k
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1027
10.3k
      return false;
1028
10.3k
    }
1029
1030
59.4k
  return true;
1031
69.8k
}
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
400k
{
1040
400k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1041
1042
  /* Relative GPR.  */
1043
400k
  if (_BF (opnd, 7, 5) == 0x0)
1044
186k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1045
1046
  /* Relative Xfer.  */
1047
214k
  else if (_BF (opnd, 7, 5) == 0x4)
1048
38.0k
    dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1049
1050
  /* Relative Xfer.  */
1051
176k
  else if (_BF (opnd, 7, 5) == 0x6)
1052
31.2k
    {
1053
31.2k
      n += (num_ctx == 8 ? 16 : 32);
1054
31.2k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1055
31.2k
    }
1056
1057
  /* Indexed Xfer.  */
1058
144k
  else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1059
17.5k
    {
1060
17.5k
      dinfo->fprintf_func (dinfo->stream, "*$index");
1061
17.5k
      if (_BF (opnd, 2, 1) == 0x1)
1062
5.01k
  dinfo->fprintf_func (dinfo->stream, "++");
1063
12.4k
      else if (_BF (opnd, 2, 1) == 0x2)
1064
2.04k
  dinfo->fprintf_func (dinfo->stream, "--");
1065
17.5k
    }
1066
1067
  /* Indexed NN.  */
1068
127k
  else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1069
8.88k
    {
1070
8.88k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
1071
8.88k
      if (_BTST (opnd, 1))
1072
3.21k
  dinfo->fprintf_func (dinfo->stream, "++");
1073
8.88k
    }
1074
1075
  /* Indexed LMEM.  */
1076
118k
  else if (_BF (opnd, 7, 4) == 0x5)
1077
15.3k
    {
1078
15.3k
      n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1079
15.3k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1080
15.3k
      if (_BF (opnd, 2, 0))
1081
12.3k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1082
15.3k
    }
1083
1084
  /* 7+1-bit Constant value.  */
1085
103k
  else if (_BTST (opnd, 5))
1086
103k
    {
1087
103k
      n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1088
103k
      dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1089
103k
    }
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
400k
  return true;
1098
400k
}
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
34.8k
{
1106
34.8k
  unsigned int op = _BF (instr, 35, 33);
1107
34.8k
  unsigned int srcA = _BF (instr, 7, 0);
1108
34.8k
  unsigned int srcB = _BF (instr, 17, 10);
1109
34.8k
  unsigned int dst = _BF (instr, 27, 20);
1110
34.8k
  unsigned int sc = _BF (instr, 9, 8);
1111
34.8k
  unsigned int imm_msb = _BTST (instr, 18);
1112
34.8k
  unsigned int swap = _BTST (instr, 19);
1113
34.8k
  unsigned int shift = _BF (instr, 32, 28);
1114
34.8k
  char dst_bank = 'A' + _BTST (instr, 36);
1115
34.8k
  unsigned int nocc = _BTST (instr, 40);
1116
34.8k
  bool err = false;
1117
1118
34.8k
  if (swap)
1119
16.8k
    {
1120
16.8k
      unsigned int tmp = srcA;
1121
16.8k
      srcA = srcB;
1122
16.8k
      srcB = tmp;
1123
16.8k
    }
1124
1125
  /* alu_shf, dbl_shf, asr.  */
1126
34.8k
  if (op < 7)
1127
28.8k
    {
1128
28.8k
      if (sc == 3)
1129
6.13k
  dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1130
22.7k
      else if (op == 6)
1131
2.92k
  dinfo->fprintf_func (dinfo->stream, "asr[");
1132
19.8k
      else
1133
19.8k
  dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1134
1135
      /* dest operand */
1136
28.8k
      if (nfp_me_is_imm_opnd8 (dst))
1137
11.7k
  dinfo->fprintf_func (dinfo->stream, "--");
1138
17.1k
      else
1139
17.1k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1140
17.1k
            dst_lmext, imm_msb, dinfo);
1141
1142
28.8k
      dinfo->fprintf_func (dinfo->stream, ", ");
1143
1144
      /* A operand.  */
1145
28.8k
      if (op != 6)
1146
25.4k
  {
1147
25.4k
    if ((op < 2) && (sc != 3))  /* Not dbl_shf.  */
1148
8.05k
      dinfo->fprintf_func (dinfo->stream, "--");  /* B or ~B operator.  */
1149
17.4k
    else
1150
17.4k
      err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1151
17.4k
                num_ctx, src_lmext, imm_msb,
1152
17.4k
                dinfo);
1153
1154
25.4k
    dinfo->fprintf_func (dinfo->stream, ", ");
1155
1156
    /* Operator (not for dbl_shf).  */
1157
25.4k
    if (sc != 3)
1158
19.8k
      {
1159
19.8k
        dinfo->fprintf_func (dinfo->stream, "%s, ",
1160
19.8k
           nfp_mealu_shf_op[op]);
1161
19.8k
      }
1162
25.4k
  }
1163
1164
      /* B operand.  */
1165
28.8k
      err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1166
28.8k
          num_ctx, src_lmext, imm_msb, dinfo);
1167
1168
28.8k
      dinfo->fprintf_func (dinfo->stream, ", ");
1169
1170
      /* Shift */
1171
28.8k
      if (sc == 0)
1172
9.74k
  dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1173
19.1k
      else if (sc == 2)
1174
5.40k
  {
1175
5.40k
    if (shift)
1176
4.91k
      dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1177
483
    else
1178
483
      dinfo->fprintf_func (dinfo->stream, "<<indirect");
1179
5.40k
  }
1180
13.7k
      else
1181
13.7k
  {
1182
13.7k
    if (shift)
1183
12.6k
      dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1184
1.09k
    else
1185
1.09k
      dinfo->fprintf_func (dinfo->stream, ">>indirect");
1186
13.7k
  }
1187
28.8k
    }
1188
  /* Byte Align.  */
1189
5.93k
  else if (op == 7)
1190
5.93k
    {
1191
5.93k
      dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1192
5.93k
         ((sc == 2) ? "le" : "be"));
1193
1194
      /* Dest operand.  */
1195
5.93k
      if (nfp_me_is_imm_opnd8 (dst))
1196
4.05k
  dinfo->fprintf_func (dinfo->stream, "--");
1197
1.88k
      else
1198
1.88k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1199
1.88k
            dst_lmext, imm_msb, dinfo);
1200
1201
5.93k
      dinfo->fprintf_func (dinfo->stream, ", ");
1202
1203
5.93k
      if (sc == 2)
1204
1.11k
  err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1205
1.11k
            0, imm_msb, dinfo);
1206
4.81k
      else
1207
4.81k
  err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1208
4.81k
            0, imm_msb, dinfo);
1209
5.93k
    }
1210
1211
34.8k
  dinfo->fprintf_func (dinfo->stream, "]");
1212
34.8k
  if (nocc)
1213
17.4k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1214
34.8k
  if (gpr_wrboth)
1215
15.5k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1216
34.8k
  if (pred_cc)
1217
13.7k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1218
1219
34.8k
  if (err)
1220
0
    return _NFP_ERR_CONT;
1221
34.8k
  return 0;
1222
34.8k
}
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
32.9k
{
1230
32.9k
  unsigned int op = _BF (instr, 35, 31);
1231
32.9k
  unsigned int srcA = _BF (instr, 9, 0);
1232
32.9k
  unsigned int srcB = _BF (instr, 19, 10);
1233
32.9k
  unsigned int dst = _BF (instr, 29, 20);
1234
32.9k
  unsigned int swap = _BTST (instr, 30);
1235
32.9k
  char dst_bank = 'A' + _BTST (instr, 36);
1236
32.9k
  unsigned int nocc = _BTST (instr, 40);
1237
32.9k
  int do_close_bracket = 1;
1238
32.9k
  bool err = false;
1239
1240
32.9k
  if (swap)
1241
10.3k
    {
1242
10.3k
      unsigned int tmp = srcA;
1243
10.3k
      srcA = srcB;
1244
10.3k
      srcB = tmp;
1245
10.3k
    }
1246
1247
32.9k
  switch (op)
1248
32.9k
    {
1249
1.12k
    case 3:     /* pop_count3[dst, srcB] */
1250
1.62k
    case 6:     /* pop_count1[srcB] */
1251
2.57k
    case 7:     /* pop_count2[srcB] */
1252
3.60k
    case 14:      /* ffs[dst, srcB] */
1253
5.63k
    case 15:      /* cam_read_tag[dst, srcB] */
1254
7.14k
    case 31:      /* cam_read_state[dst, srcB] */
1255
7.14k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1256
1257
      /* No dest for pop_count1/2.  */
1258
7.14k
      if ((op != 6) && (op != 7))
1259
5.68k
  {
1260
    /* dest operand */
1261
5.68k
    if (nfp_me_is_imm_opnd10 (dst))
1262
1.83k
      dinfo->fprintf_func (dinfo->stream, "--");
1263
3.85k
    else
1264
3.85k
      err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1265
3.85k
                 dst_lmext, dinfo);
1266
1267
5.68k
    dinfo->fprintf_func (dinfo->stream, ", ");
1268
5.68k
  }
1269
1270
      /* B operand.  */
1271
7.14k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1272
6.27k
           num_ctx, src_lmext, dinfo);
1273
7.14k
      break;
1274
 
1275
      /* cam_clear.  */
1276
769
    case 11:
1277
769
      do_close_bracket = 0;
1278
769
      dinfo->fprintf_func (dinfo->stream, "cam_clear");
1279
769
      break;
1280
1281
      /* cam_lookup.  */
1282
1.94k
    case 23:
1283
1.94k
      do_close_bracket = 0;
1284
1.94k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1285
1286
      /* Dest operand.  */
1287
1.94k
      if (nfp_me_is_imm_opnd10 (dst))
1288
727
  dinfo->fprintf_func (dinfo->stream, "--");
1289
1.22k
      else
1290
1.22k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1291
1.22k
             dst_lmext, dinfo);
1292
1293
1.94k
      dinfo->fprintf_func (dinfo->stream, ", ");
1294
1295
      /* A operand.  */
1296
1.94k
      err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1297
1.77k
           num_ctx, src_lmext, dinfo);
1298
1299
1.94k
      dinfo->fprintf_func (dinfo->stream, "]");
1300
1301
1.94k
      if (_BF (srcB, 1, 0))
1302
1.58k
  {
1303
1.58k
    unsigned int n = _BTST (srcB, 1);
1304
1.58k
    if (_BTST (srcB, 4))  /* Only for MEv28.  */
1305
274
      n += 2;
1306
1.58k
    dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1307
1.58k
             _BF (srcB, 3, 2));
1308
1.58k
  }
1309
1310
1.94k
      break;
1311
1312
1.89k
    case 19:      /* cam_write.  */
1313
3.13k
    case 27:      /* cam_write_state.  */
1314
3.13k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1315
3.13k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1316
3.13k
           num_ctx, src_lmext, dinfo);
1317
3.13k
      dinfo->fprintf_func (dinfo->stream, ", ");
1318
3.13k
      if (op == 19)
1319
1.89k
  {
1320
1.89k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1321
1.75k
               num_ctx, src_lmext, dinfo);
1322
1.89k
    dinfo->fprintf_func (dinfo->stream, ", ");
1323
1.89k
  }
1324
3.13k
      dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1325
3.13k
      break;
1326
1327
      /* CRC.  */
1328
1.75k
    case 18:  
1329
1.75k
      do_close_bracket = 0;
1330
1.75k
      dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1331
1.75k
         _BTST (srcA, 3) ? "le" : "be");
1332
1.75k
      if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
1333
202
  {
1334
202
    dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1335
202
    err = true;
1336
202
  }
1337
1.54k
      else
1338
1.54k
  {
1339
1.54k
    dinfo->fprintf_func (dinfo->stream, "%s, ",
1340
1.54k
             nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
1341
1.54k
  }
1342
1343
      /* Dest operand.  */
1344
1.75k
      if (nfp_me_is_imm_opnd10 (dst))
1345
548
  dinfo->fprintf_func (dinfo->stream, "--");
1346
1.20k
      else
1347
1.20k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1348
1.01k
             dst_lmext, dinfo);
1349
1350
1.75k
      dinfo->fprintf_func (dinfo->stream, ", ");
1351
1352
      /* B operand.  */
1353
1.75k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1354
1.42k
           num_ctx, src_lmext, dinfo);
1355
1356
1.75k
      dinfo->fprintf_func (dinfo->stream, "]");
1357
1.75k
      if (_BF (srcA, 2, 0))
1358
1.11k
  dinfo->fprintf_func (dinfo->stream, ", %s",
1359
1.11k
           nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
1360
1.75k
      if (_BTST (srcA, 4))
1361
751
  dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1362
1.75k
      break;
1363
1364
18.2k
    default:
1365
      /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs).  */
1366
18.2k
      dinfo->fprintf_func (dinfo->stream, "alu[");
1367
1368
      /* Dest operand.  */
1369
18.2k
      if (nfp_me_is_imm_opnd10 (dst))
1370
5.07k
  dinfo->fprintf_func (dinfo->stream, "--");
1371
13.1k
      else
1372
13.1k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1373
13.1k
             dst_lmext, dinfo);
1374
18.2k
      dinfo->fprintf_func (dinfo->stream, ", ");
1375
1376
      /* A operand.  */
1377
18.2k
      if ((op == 0) || (op == 4))  /* B only operators.  */
1378
1.55k
  dinfo->fprintf_func (dinfo->stream, "--");
1379
16.6k
      else
1380
16.6k
  err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1381
14.2k
             num_ctx, src_lmext, dinfo);
1382
1383
18.2k
      if (!nfp_me27_28_alu_op[op])
1384
5.57k
  {
1385
5.57k
    dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1386
5.57k
    err = true;
1387
5.57k
  }
1388
12.6k
      else
1389
12.6k
  {
1390
12.6k
    dinfo->fprintf_func (dinfo->stream, ", %s, ",
1391
12.6k
             nfp_me27_28_alu_op[op]);
1392
12.6k
  }
1393
1394
      /* B operand.  */
1395
18.2k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1396
10.2k
           num_ctx, src_lmext, dinfo);
1397
18.2k
      break;
1398
32.9k
    }
1399
1400
32.9k
  if (do_close_bracket)
1401
28.4k
    dinfo->fprintf_func (dinfo->stream, "]");
1402
1403
32.9k
  if (nocc)
1404
16.5k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1405
32.9k
  if (gpr_wrboth)
1406
16.8k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1407
32.9k
  if (pred_cc)
1408
14.0k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1409
1410
32.9k
  if (err)
1411
11.6k
    return _NFP_ERR_CONT;
1412
21.2k
  return 0;
1413
32.9k
}
1414
1415
static int
1416
nfp_me27_28_print_immed (uint64_t instr, unsigned int pred_cc,
1417
       unsigned int dst_lmext,
1418
       unsigned int gpr_wrboth,
1419
       int num_ctx, struct disassemble_info *dinfo)
1420
5.99k
{
1421
5.99k
  unsigned int srcA = _BF (instr, 9, 0);
1422
5.99k
  unsigned int srcB = _BF (instr, 19, 10);
1423
5.99k
  unsigned int imm = _BF (instr, 27, 20);
1424
5.99k
  unsigned int by = _BTST (instr, 29);
1425
5.99k
  unsigned int wd = _BTST (instr, 30);
1426
5.99k
  unsigned int inv = _BTST (instr, 31);
1427
5.99k
  unsigned int byte_shift = _BF (instr, 34, 33);
1428
5.99k
  bool err = false;
1429
1430
5.99k
  if (nfp_me_is_imm_opnd10 (srcB))
1431
1.00k
    {
1432
1.00k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1433
1.00k
      if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
1434
86
  {
1435
86
    dinfo->fprintf_func (dinfo->stream, "nop");
1436
86
    return 0;
1437
86
  }
1438
1.00k
    }
1439
4.99k
  else
1440
4.99k
    {
1441
4.99k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1442
4.99k
    }
1443
1444
5.90k
  if (inv)
1445
3.96k
    imm = (imm ^ 0xffff) | 0xffff0000U;
1446
1447
5.90k
  if (by)
1448
3.74k
    {
1449
3.74k
      dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1450
3.74k
      imm &= 0xff;
1451
3.74k
    }
1452
2.16k
  else if (wd)
1453
798
    {
1454
798
      dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1455
798
      imm &= 0xffff;
1456
798
    }
1457
1.36k
  else
1458
1.36k
    dinfo->fprintf_func (dinfo->stream, "immed[");
1459
1460
  /* Dest.  */
1461
5.90k
  if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1462
251
    dinfo->fprintf_func (dinfo->stream, "--");  /* No Dest.  */
1463
5.65k
  else if (nfp_me_is_imm_opnd10 (srcA))
1464
582
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1465
5.07k
  else
1466
5.07k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1467
1468
5.90k
  dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1469
1470
5.90k
  if ((!by) && (!wd) && (byte_shift))
1471
734
    dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1472
1473
5.90k
  dinfo->fprintf_func (dinfo->stream, "]");
1474
1475
5.90k
  if (gpr_wrboth)
1476
3.42k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1477
5.90k
  if (pred_cc)
1478
3.52k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1479
1480
5.90k
  if (err)
1481
1.91k
    return _NFP_ERR_CONT;
1482
3.99k
  return 0;
1483
5.90k
}
1484
1485
static int
1486
nfp_me27_28_print_ld_field (uint64_t instr, unsigned int pred_cc,
1487
          unsigned int dst_lmext, unsigned int src_lmext,
1488
          unsigned int gpr_wrboth,
1489
          int num_ctx, struct disassemble_info *dinfo)
1490
2.41k
{
1491
2.41k
  unsigned int load_cc = _BTST (instr, 34);
1492
2.41k
  unsigned int shift = _BF (instr, 32, 28);
1493
2.41k
  unsigned int byte_mask = _BF (instr, 27, 24);
1494
2.41k
  unsigned int zerof = _BTST (instr, 20);
1495
2.41k
  unsigned int swap = _BTST (instr, 19);
1496
2.41k
  unsigned int imm_msb = _BTST (instr, 18);
1497
2.41k
  unsigned int src = _BF (instr, 17, 10);
1498
2.41k
  unsigned int sc = _BF (instr, 9, 8);
1499
2.41k
  unsigned int dst = _BF (instr, 7, 0);
1500
2.41k
  bool err = false;
1501
1502
2.41k
  if (swap)
1503
521
    {
1504
521
      unsigned int tmp = src;
1505
521
      src = dst;
1506
521
      dst = tmp;
1507
521
    }
1508
1509
2.41k
  if (zerof)
1510
587
    dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1511
1.82k
  else
1512
1.82k
    dinfo->fprintf_func (dinfo->stream, "ld_field[");
1513
1514
2.41k
  err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1515
2.41k
            dst_lmext, imm_msb, dinfo);
1516
2.41k
  dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1517
2.41k
           _BTST (byte_mask, 3),
1518
2.41k
           _BTST (byte_mask, 2),
1519
2.41k
           _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1520
2.41k
  err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1521
2.41k
            src_lmext, imm_msb, dinfo);
1522
1523
2.41k
  if ((sc == 0) && (shift != 0))
1524
912
    dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1525
1.50k
  else if (sc == 1)
1526
498
    {
1527
498
      if (shift)
1528
317
  dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1529
181
      else
1530
181
  dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1531
498
    }
1532
1.00k
  else if (sc == 2)
1533
258
    {
1534
258
      if (shift)
1535
167
  dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1536
91
      else
1537
91
  dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1538
258
    }
1539
745
  else if (sc == 3)
1540
385
    dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1541
1542
2.41k
  dinfo->fprintf_func (dinfo->stream, "]");
1543
1544
2.41k
  if (load_cc)
1545
652
    dinfo->fprintf_func (dinfo->stream, ", load_cc");
1546
2.41k
  if (gpr_wrboth)
1547
432
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1548
2.41k
  if (pred_cc)
1549
592
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1550
1551
2.41k
  if (err)
1552
0
    return _NFP_ERR_CONT;
1553
2.41k
  return 0;
1554
2.41k
}
1555
1556
static int
1557
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
1558
11.3k
{
1559
11.3k
  unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1560
11.3k
  unsigned int defer = _BF (instr, 21, 20);
1561
11.3k
  unsigned int no_load = _BTST (instr, 19);
1562
11.3k
  unsigned int resume = _BTST (instr, 18);
1563
11.3k
  unsigned int bpt = _BTST (instr, 17);
1564
11.3k
  unsigned int sig_or = _BTST (instr, 16);
1565
11.3k
  unsigned int ev_mask = _BF (instr, 15, 0);
1566
1567
11.3k
  dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1568
11.3k
  if (bpt)
1569
4.05k
    dinfo->fprintf_func (dinfo->stream, "bpt");
1570
7.28k
  else if (ev_mask == 1)
1571
329
    dinfo->fprintf_func (dinfo->stream, "voluntary");
1572
6.95k
  else if ((!no_load) && (ev_mask == 0))
1573
410
    {
1574
410
      dinfo->fprintf_func (dinfo->stream, "kill");
1575
410
      sig_or = 0;
1576
410
    }
1577
6.54k
  else if (ev_mask == 0)
1578
341
    dinfo->fprintf_func (dinfo->stream, "--");
1579
6.20k
  else
1580
6.20k
    {
1581
6.20k
      int first_print = 1;
1582
6.20k
      unsigned int n;
1583
1584
99.3k
      for (n = 1; n < 16; n++)
1585
93.1k
  {
1586
93.1k
    if (!_BTST (ev_mask, n))
1587
49.8k
      continue;
1588
43.2k
    dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1589
43.2k
             (first_print) ? "" : ", ", n);
1590
43.2k
    first_print = 0;
1591
43.2k
  }
1592
6.20k
    }
1593
1594
11.3k
  dinfo->fprintf_func (dinfo->stream, "]");
1595
1596
11.3k
  if (sig_or)
1597
4.74k
    dinfo->fprintf_func (dinfo->stream, ", any");
1598
11.3k
  if (resume)
1599
5.51k
    dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1600
11.3k
  if (defer)
1601
7.95k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1602
1603
11.3k
  return 0;
1604
11.3k
}
1605
1606
static int
1607
nfp_me27_28_print_local_csr (uint64_t instr,
1608
           unsigned int src_lmext,
1609
           int num_ctx, struct disassemble_info *dinfo)
1610
2.39k
{
1611
2.39k
  unsigned int srcA = _BF (instr, 9, 0);
1612
2.39k
  unsigned int srcB = _BF (instr, 19, 10);
1613
2.39k
  unsigned int wr = _BTST (instr, 21);
1614
2.39k
  unsigned int csr_num = _BF (instr, 32, 22);
1615
2.39k
  unsigned int src = srcA;
1616
2.39k
  char src_bank = 'A';
1617
2.39k
  bool err = false;
1618
1619
2.39k
  if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1620
196
    {
1621
196
      src_bank = 'B';
1622
196
      src = srcB;
1623
196
    }
1624
1625
  /* MEv28 does not have urd/uwr.  */
1626
2.39k
  if (csr_num == 1)
1627
181
    {
1628
181
      if (wr)
1629
84
  {
1630
84
    dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1631
84
             (int) _BTST (instr, 20));
1632
84
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1633
84
               src_lmext, dinfo);
1634
84
  }
1635
97
      else
1636
97
  {
1637
97
    dinfo->fprintf_func (dinfo->stream, "urd[");
1638
97
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1639
97
               src_lmext, dinfo);
1640
97
    dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1641
97
             (int) _BTST (instr, 20));
1642
97
  }
1643
181
      dinfo->fprintf_func (dinfo->stream, "]");
1644
181
    }
1645
2.21k
  else
1646
2.21k
    {
1647
2.21k
      const char *nm = NULL;
1648
1649
2.21k
      if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1650
313
  nm = nfp_me27_28_mecsrs[csr_num];
1651
1652
2.21k
      dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1653
2.21k
         (wr) ? "wr" : "rd");
1654
2.21k
      if (nm)
1655
309
  dinfo->fprintf_func (dinfo->stream, "%s", nm);
1656
1.90k
      else
1657
1.90k
  dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1658
1659
2.21k
      if (wr)
1660
707
  {
1661
707
    dinfo->fprintf_func (dinfo->stream, ", ");
1662
707
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1663
707
               src_lmext, dinfo);
1664
707
  }
1665
2.21k
      dinfo->fprintf_func (dinfo->stream, "]");
1666
2.21k
    }
1667
1668
2.39k
  if (err)
1669
416
    return _NFP_ERR_CONT;
1670
1.98k
  return 0;
1671
2.39k
}
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
1.19k
{
1678
1.19k
  unsigned int br_op = _BF (instr, 4, 0);
1679
1.19k
  unsigned int ctx_sig_state = _BF (instr, 17, 14);
1680
1.19k
  unsigned int defer = _BF (instr, 21, 20);
1681
1.19k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1682
1.19k
  int ret = 0;
1683
1684
1.19k
  if (!nfp_me27_28_br_ops[br_op])
1685
117
    {
1686
117
      dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
1687
117
      ret = _NFP_ERR_CONT;
1688
117
    }
1689
1.07k
  else
1690
1.07k
    dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1691
1692
1.19k
  switch (br_op)
1693
1.19k
    {
1694
111
    case 16:      /* br=ctx */
1695
291
    case 17:      /* br!=ctx */
1696
548
    case 18:      /* br_signal */
1697
692
    case 19:      /* br_!signal */
1698
692
      dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1699
692
      break;
1700
12
    case 20:      /* "br_inp_state" */
1701
168
    case 21:      /* "br_!inp_state" */
1702
168
      dinfo->fprintf_func (dinfo->stream, "%s, ",
1703
168
         br_inpstates[ctx_sig_state]);
1704
168
      break;
1705
163
    case 22:      /* "br_cls_state" */
1706
184
    case 23:      /* "br_!cls_state" */
1707
184
      dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1708
184
         ctx_sig_state);
1709
184
      break;
1710
151
    default:
1711
151
      break;
1712
1.19k
    }
1713
1714
1.19k
  dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1715
1716
1.19k
  if (defer)
1717
347
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1718
1719
1.19k
  return ret;
1720
1.19k
}
1721
1722
static int
1723
nfp_me27_28_print_br_byte (uint64_t instr,
1724
         unsigned int src_lmext, int num_ctx,
1725
         struct disassemble_info *dinfo)
1726
9.32k
{
1727
9.32k
  unsigned int srcA = _BF (instr, 7, 0);
1728
9.32k
  unsigned int by = _BF (instr, 9, 8);
1729
9.32k
  unsigned int srcB = _BF (instr, 17, 10);
1730
9.32k
  unsigned int imm_msb = _BTST (instr, 18);
1731
9.32k
  unsigned int eq = _BTST (instr, 19);
1732
9.32k
  unsigned int defer = _BF (instr, 21, 20);
1733
9.32k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1734
9.32k
  bool err = false;
1735
1736
9.32k
  if (eq)
1737
5.79k
    dinfo->fprintf_func (dinfo->stream, "br=byte[");
1738
3.53k
  else
1739
3.53k
    dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1740
1741
9.32k
  if (nfp_me_is_imm_opnd8 (srcA))
1742
3.09k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1743
3.09k
              src_lmext, imm_msb, dinfo);
1744
6.23k
  else
1745
6.23k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1746
6.23k
              src_lmext, imm_msb, dinfo);
1747
1748
9.32k
  dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1749
1750
9.32k
  if (nfp_me_is_imm_opnd8 (srcA))
1751
3.09k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1752
3.09k
              src_lmext, imm_msb, dinfo);
1753
6.23k
  else
1754
6.23k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1755
6.23k
              src_lmext, imm_msb, dinfo);
1756
1757
9.32k
  dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1758
1759
9.32k
  if (defer)
1760
3.90k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1761
1762
9.32k
  if (err)
1763
0
    return _NFP_ERR_CONT;
1764
9.32k
  return 0;
1765
9.32k
}
1766
1767
static int
1768
nfp_me27_28_print_br_bit (uint64_t instr, unsigned int src_lmext,
1769
        int num_ctx, struct disassemble_info *dinfo)
1770
4.06k
{
1771
4.06k
  unsigned int srcA = _BF (instr, 7, 0);
1772
4.06k
  unsigned int srcB = _BF (instr, 17, 10);
1773
4.06k
  unsigned int b = _BTST (instr, 18);
1774
4.06k
  unsigned int defer = _BF (instr, 21, 20);
1775
4.06k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1776
4.06k
  bool err = false;
1777
1778
4.06k
  if (b)
1779
2.45k
    dinfo->fprintf_func (dinfo->stream, "br_bset[");
1780
1.61k
  else
1781
1.61k
    dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1782
1783
4.06k
  if (nfp_me_is_imm_opnd8 (srcA))
1784
668
    {
1785
668
      err = err
1786
668
  || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1787
668
      b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1788
668
    }
1789
3.39k
  else
1790
3.39k
    {
1791
3.39k
      err = err
1792
3.39k
  || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1793
3.39k
      b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1794
3.39k
    }
1795
1796
4.06k
  dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1797
1798
4.06k
  if (defer)
1799
3.19k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1800
1801
4.06k
  if (err)
1802
0
    return _NFP_ERR_CONT;
1803
4.06k
  return 0;
1804
4.06k
}
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
2.54k
{
1810
2.54k
  unsigned int srcA = _BF (instr, 9, 0);
1811
2.54k
  unsigned int srcB = _BF (instr, 19, 10);
1812
2.54k
  unsigned int defer = _BF (instr, 21, 20);
1813
2.54k
  unsigned int imm = _BF (instr, 30, 22);
1814
2.54k
  bool err = false;
1815
1816
2.54k
  if (nfp_me_is_imm_opnd10 (srcA))
1817
1.39k
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1818
1.15k
  else
1819
1.15k
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1820
1821
2.54k
  if (!imm)
1822
82
    dinfo->fprintf_func (dinfo->stream, "rtn[");
1823
2.46k
  else
1824
2.46k
    dinfo->fprintf_func (dinfo->stream, "jump[");
1825
1826
2.54k
  if (nfp_me_is_imm_opnd10 (srcA))
1827
1.39k
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1828
1.15k
  else
1829
1.15k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1830
1831
2.54k
  if (imm)
1832
2.46k
    dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1833
1834
2.54k
  dinfo->fprintf_func (dinfo->stream, "]");
1835
1836
2.54k
  if (defer)
1837
541
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1838
1839
2.54k
  if (err)
1840
93
    return _NFP_ERR_CONT;
1841
2.45k
  return 0;
1842
2.54k
}
1843
1844
static int
1845
nfp_me27_28_print_mult (uint64_t instr, unsigned int pred_cc,
1846
      unsigned int dst_lmext, unsigned int src_lmext,
1847
      unsigned int gpr_wrboth,
1848
      int num_ctx, struct disassemble_info *dinfo)
1849
1.68k
{
1850
1.68k
  unsigned int srcA = _BF (instr, 9, 0);
1851
1.68k
  unsigned int srcB = _BF (instr, 19, 10);
1852
1.68k
  unsigned int mstep = _BF (instr, 22, 20);
1853
1.68k
  char dst_bank = 'A' + _BTST (instr, 23);
1854
1.68k
  unsigned int swap = _BTST (instr, 30);
1855
1.68k
  unsigned int mtype = _BF (instr, 32, 31);
1856
1.68k
  unsigned int nocc = _BTST (instr, 40);
1857
1.68k
  bool err = false;
1858
1859
1.68k
  if (swap)
1860
141
    {
1861
141
      unsigned int tmp = srcA;
1862
141
      srcA = srcB;
1863
141
      srcB = tmp;
1864
141
    }
1865
1866
1.68k
  dinfo->fprintf_func (dinfo->stream, "mul_step[");
1867
1868
1.68k
  if (mstep >= 4)
1869
308
    err = err
1870
308
      || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1871
1.38k
  else
1872
1.38k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1873
1.38k
               src_lmext, dinfo);
1874
1875
1.68k
  dinfo->fprintf_func (dinfo->stream, ", ");
1876
1877
1.68k
  if (mstep >= 4)
1878
308
    dinfo->fprintf_func (dinfo->stream, "--");
1879
1.38k
  else
1880
1.38k
    err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1881
974
               src_lmext, dinfo);
1882
1883
1.68k
  dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1884
1.68k
  if (mtype > 0)
1885
1.08k
    {
1886
1.08k
      const char *s = nfp_me27_28_mult_steps[mstep];
1887
1.08k
      if (!s)
1888
182
  {
1889
182
    s = "<invalid mul_step>";
1890
182
    err = true;
1891
182
  }
1892
1.08k
      dinfo->fprintf_func (dinfo->stream, "_%s", s);
1893
1.08k
    }
1894
1895
1.68k
  if (nocc)
1896
759
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1897
1.68k
  if (gpr_wrboth)
1898
787
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1899
1.68k
  if (pred_cc)
1900
956
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1901
1902
1.68k
  if (err)
1903
697
    return _NFP_ERR_CONT;
1904
991
  return 0;
1905
1.68k
}
1906
1907
static int
1908
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1909
2.43M
{
1910
2.43M
  const nfp_cmd_mnemonic *a = arg_a;
1911
2.43M
  const nfp_cmd_mnemonic *b = arg_b;
1912
1913
2.43M
  if (a->cpp_target != b->cpp_target)
1914
1.14M
    return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
1915
1916
1.29M
  if (a->cpp_action != b->cpp_action)
1917
679k
    return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1918
1919
617k
  return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
1920
1.29M
}
1921
1922
static const char *
1923
nfp_me_find_mnemonic (unsigned int cpp_tgt, unsigned int cpp_act,
1924
          unsigned int cpp_tok, unsigned int cpp_len,
1925
          const nfp_cmd_mnemonic * mnemonics,
1926
          size_t mnemonics_cnt)
1927
277k
{
1928
277k
  nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1929
277k
  const nfp_cmd_mnemonic *cmd = NULL;
1930
1931
277k
  cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1932
277k
     sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1933
1934
277k
  if (!cmd)
1935
88.8k
    return NULL;
1936
1937
  /* Make sure we backtrack to the first entry that still matches the three
1938
     bsearched fields - then we simply iterate and compare cpp_len.  */
1939
198k
  while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1940
10.3k
    --cmd;
1941
1942
  /* Now compare by cpp_len and make sure we stay in range.  */
1943
203k
  for (; (cmd < (mnemonics + mnemonics_cnt))
1944
203k
       && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1945
199k
    {
1946
199k
      if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1947
185k
  return cmd->mnemonic;
1948
199k
    }
1949
1950
3.40k
  return NULL;
1951
188k
}
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
36.6k
{
1959
36.6k
  unsigned int srcA = _BF (instr, 7, 0);
1960
36.6k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
1961
36.6k
  unsigned int srcB = _BF (instr, 17, 10);
1962
36.6k
  unsigned int token = _BF (instr, 19, 18);
1963
36.6k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1964
36.6k
  unsigned int cpp_len = _BF (instr, 27, 25);
1965
36.6k
  unsigned int sig = _BF (instr, 31, 28);
1966
36.6k
  unsigned int tgtcmd = _BF (instr, 38, 32);
1967
36.6k
  unsigned int indref = _BTST (instr, 41);
1968
36.6k
  unsigned int mode = _BF (instr, 44, 42);
1969
1970
36.6k
  bool err = false;
1971
36.6k
  int cpp_target = -1;
1972
36.6k
  int cpp_action = -1;
1973
36.6k
  const char *mnemonic = NULL;
1974
36.6k
  unsigned int imm;
1975
36.6k
  unsigned int valBA;
1976
36.6k
  int visswap = ((mode == 1) || (mode == 3));
1977
1978
36.6k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1979
36.6k
  valBA = (srcB << 8) | srcA;
1980
1981
36.6k
  if (mode == 6)
1982
2.70k
    {
1983
2.70k
      token = 0;
1984
2.70k
      sig = 0;
1985
2.70k
      xfer = 0;
1986
2.70k
    }
1987
1988
  /* Convert tgtcmd to action/token tuple.  */
1989
36.6k
  if (_BF (tgtcmd, 6, 5) == 0x0)
1990
21.3k
    {
1991
21.3k
      switch (_BF (tgtcmd, 4, 2))
1992
21.3k
  {
1993
15.2k
  case 0:
1994
15.2k
    cpp_target = NFP_3200_CPPTGT_CAP;
1995
15.2k
    dinfo->fprintf_func (dinfo->stream, "cap[");
1996
15.2k
    break;
1997
1.59k
  case 1:
1998
1.59k
    cpp_target = NFP_3200_CPPTGT_MSF0;
1999
1.59k
    dinfo->fprintf_func (dinfo->stream, "msf0[");
2000
1.59k
    break;
2001
699
  case 2:
2002
699
    cpp_target = NFP_3200_CPPTGT_MSF1;
2003
699
    dinfo->fprintf_func (dinfo->stream, "msf1[");
2004
699
    break;
2005
1.09k
  case 3:
2006
1.09k
    cpp_target = NFP_3200_CPPTGT_PCIE;
2007
1.09k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2008
1.09k
    break;
2009
836
  case 4:
2010
836
    cpp_target = NFP_3200_CPPTGT_HASH;
2011
836
    break;
2012
634
  case 5:
2013
634
    cpp_target = NFP_3200_CPPTGT_CRYPTO;
2014
634
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2015
634
    break;
2016
722
  case 6:
2017
722
    cpp_target = NFP_3200_CPPTGT_ARM;
2018
722
    dinfo->fprintf_func (dinfo->stream, "arm[");
2019
722
    break;
2020
509
  case 7:
2021
509
    cpp_target = NFP_3200_CPPTGT_CT;
2022
509
    dinfo->fprintf_func (dinfo->stream, "ct[");
2023
509
    break;
2024
21.3k
  }
2025
21.3k
      cpp_action = _BF (tgtcmd, 1, 0);
2026
21.3k
    }
2027
15.3k
  else
2028
15.3k
    {
2029
15.3k
      switch (_BF (tgtcmd, 6, 4))
2030
15.3k
  {
2031
2.53k
  case 2:
2032
2.53k
    cpp_target = NFP_3200_CPPTGT_GS;
2033
2.53k
    dinfo->fprintf_func (dinfo->stream, "scratch[");
2034
2.53k
    break;
2035
3.53k
  case 3:
2036
3.53k
    cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM.  */
2037
3.53k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2038
3.53k
    break;
2039
3.73k
  case 4:
2040
4.60k
  case 5:
2041
4.60k
    cpp_target = NFP_3200_CPPTGT_MU;
2042
4.60k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2043
4.60k
    break;
2044
2.29k
  case 6:
2045
4.72k
  case 7:
2046
4.72k
    cpp_target = NFP_3200_CPPTGT_CLS;
2047
4.72k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2048
4.72k
    break;
2049
15.3k
  }
2050
15.3k
      cpp_action = _BF (tgtcmd, 3, 0);
2051
15.3k
    }
2052
2053
36.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
36.6k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2061
36.6k
           nfp_me27_mnemonics,
2062
36.6k
           ARRAY_SIZE (nfp_me27_mnemonics));
2063
2064
36.6k
  if (!mnemonic)
2065
8.01k
    {
2066
8.01k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2067
8.01k
         cpp_target, cpp_action, token);
2068
8.01k
      return _NFP_ERR_CONT;
2069
8.01k
    }
2070
2071
28.6k
  if (cpp_target == NFP_3200_CPPTGT_HASH)
2072
406
    {
2073
406
      dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2074
406
         mnemonic, xfer, cpp_len);
2075
406
      goto print_opt_toks;
2076
406
    }
2077
2078
28.2k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2079
2080
28.2k
  if (visswap)
2081
4.11k
    {
2082
4.11k
      unsigned int tmp = srcA;
2083
4.11k
      srcA = srcB;
2084
4.11k
      srcB = tmp;
2085
4.11k
    }
2086
2087
28.2k
  switch (mode)
2088
28.2k
    {
2089
14.3k
    case 0:     /* (A << 8) + B.  */
2090
17.1k
    case 1:     /* (B << 8) + A.  */
2091
17.1k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2092
17.1k
      err = err
2093
17.1k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2094
17.1k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2095
17.1k
      err = err
2096
17.1k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2097
17.1k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2098
17.1k
      break;
2099
1.23k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2100
2.49k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2101
2.49k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2102
2.49k
      err = err
2103
2.49k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2104
2.49k
      if (third_party_32bit)
2105
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2106
2.49k
      else
2107
2.49k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2108
2.49k
      err = err
2109
2.49k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2110
2.49k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2111
2.49k
      break;
2112
2.29k
    case 4:     /* A + B.  */
2113
2.29k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2114
2.29k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2115
2.29k
      dinfo->fprintf_func (dinfo->stream, ", ");
2116
2.29k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2117
2.29k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2118
2.29k
      break;
2119
1.94k
    case 5:     /* Immediate address.  */
2120
1.94k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2121
1.94k
         (cpp_len + 1));
2122
1.94k
      break;
2123
2.59k
    case 6:     /* Immediate address and data.  */
2124
2.59k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2125
2.59k
      break;
2126
1.75k
    case 7:     /* Immediate data.  */
2127
1.75k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2128
1.75k
         ((xfer << 16) | valBA), (cpp_len + 1));
2129
1.75k
      break;
2130
28.2k
    }
2131
2132
28.6k
 print_opt_toks:
2133
28.6k
  dinfo->fprintf_func (dinfo->stream, "]");
2134
2135
28.6k
  if (indref && (mode != 2) && (mode != 3))
2136
6.94k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2137
2138
28.6k
  if (ctxswap_defer != 3)
2139
24.0k
    {
2140
24.0k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2141
24.0k
      if (sig)
2142
10.5k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2143
13.5k
      else
2144
13.5k
  dinfo->fprintf_func (dinfo->stream, "--]");
2145
2146
24.0k
      if (ctxswap_defer != 0)
2147
9.30k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2148
24.0k
    }
2149
4.64k
  else if (sig)
2150
3.10k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2151
2152
28.6k
  if (err)
2153
0
    return _NFP_ERR_CONT;
2154
28.6k
  return 0;
2155
28.6k
}
2156
2157
static int
2158
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
2159
      struct disassemble_info *dinfo)
2160
1.10k
{
2161
1.10k
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2162
1.10k
}
2163
2164
static int
2165
nfp_me27_print_alu (uint64_t instr, int num_ctx,
2166
        struct disassemble_info *dinfo)
2167
515
{
2168
515
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2169
515
}
2170
2171
static int
2172
nfp_me27_print_immed (uint64_t instr, int num_ctx,
2173
          struct disassemble_info *dinfo)
2174
288
{
2175
288
  return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2176
288
}
2177
2178
static int
2179
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
2180
       struct disassemble_info *dinfo)
2181
359
{
2182
359
  return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2183
359
}
2184
2185
static int
2186
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2187
2.84k
{
2188
2.84k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2189
2.84k
}
2190
2191
static int
2192
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
2193
        struct disassemble_info *dinfo)
2194
193
{
2195
193
  return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2196
193
}
2197
2198
static int
2199
nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2200
305
{
2201
305
  return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
2202
305
}
2203
2204
static int
2205
nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
2206
      struct disassemble_info *dinfo)
2207
696
{
2208
696
  return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2209
696
}
2210
2211
static int
2212
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
2213
           struct disassemble_info *dinfo)
2214
962
{
2215
962
  return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2216
962
}
2217
2218
static int
2219
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
2220
           struct disassemble_info *dinfo)
2221
102
{
2222
102
  return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2223
102
}
2224
2225
static int
2226
nfp_me27_print_mult (uint64_t instr, int num_ctx,
2227
         struct disassemble_info *dinfo)
2228
266
{
2229
266
  return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2230
266
}
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
272k
{
2238
272k
  unsigned int srcA = _BF (instr, 7, 0);
2239
272k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
2240
272k
  unsigned int srcB = _BF (instr, 17, 10);
2241
272k
  unsigned int token = _BF (instr, 19, 18);
2242
272k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2243
272k
  unsigned int cpp_len = _BF (instr, 27, 25);
2244
272k
  unsigned int sig = _BF (instr, 31, 28);
2245
272k
  unsigned int tgtcmd = _BF (instr, 38, 32);
2246
272k
  unsigned int indref = _BTST (instr, 41);
2247
272k
  unsigned int mode = _BF (instr, 44, 42);
2248
2249
272k
  bool err = false;
2250
272k
  int cpp_target = -1;
2251
272k
  int cpp_action = -1;
2252
272k
  const char *mnemonic = NULL;
2253
272k
  unsigned int imm;
2254
272k
  unsigned int valBA;
2255
272k
  int visswap = ((mode == 1) || (mode == 3));
2256
2257
272k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2258
272k
  valBA = (srcB << 8) | srcA;
2259
2260
272k
  if (mode == 6)
2261
16.9k
    {
2262
16.9k
      token = 0;
2263
16.9k
      sig = 0;
2264
16.9k
      xfer = 0;
2265
16.9k
    }
2266
2267
  /* Convert tgtcmd to action/token tuple.  */
2268
272k
  if (_BF (tgtcmd, 6, 5) == 0x0)
2269
157k
    {
2270
157k
      switch (_BF (tgtcmd, 4, 2))
2271
157k
  {
2272
110k
  case 0:
2273
110k
    cpp_target = NFP_6000_CPPTGT_ILA;
2274
110k
    dinfo->fprintf_func (dinfo->stream, "ila[");
2275
110k
    break;
2276
12.3k
  case 1:
2277
12.3k
    cpp_target = NFP_6000_CPPTGT_NBI;
2278
12.3k
    dinfo->fprintf_func (dinfo->stream, "nbi[");
2279
12.3k
    break;
2280
7.68k
  case 3:
2281
7.68k
    cpp_target = NFP_6000_CPPTGT_PCIE;
2282
7.68k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2283
7.68k
    break;
2284
3.25k
  case 5:
2285
3.25k
    cpp_target = NFP_6000_CPPTGT_CRYPTO;
2286
3.25k
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2287
3.25k
    break;
2288
3.97k
  case 6:
2289
3.97k
    cpp_target = NFP_6000_CPPTGT_ARM;
2290
3.97k
    dinfo->fprintf_func (dinfo->stream, "arm[");
2291
3.97k
    break;
2292
5.27k
  case 7:
2293
5.27k
    cpp_target = NFP_6000_CPPTGT_CTXPB;
2294
5.27k
    dinfo->fprintf_func (dinfo->stream, "ct[");
2295
5.27k
    break;
2296
157k
  }
2297
157k
      cpp_action = _BF (tgtcmd, 1, 0);
2298
157k
    }
2299
115k
  else
2300
115k
    {
2301
      /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2302
   for mem/cls it's "a".  */
2303
115k
      cpp_action = _BF (tgtcmd, 4, 0);
2304
115k
      switch (_BF (tgtcmd, 6, 4))
2305
115k
  {
2306
19.0k
  case 3:
2307
19.0k
    cpp_target = NFP_6000_CPPTGT_VQDR;
2308
19.0k
    cpp_action = _BF (tgtcmd, 3, 0);
2309
19.0k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2310
19.0k
    break;
2311
25.0k
  case 4:
2312
38.8k
  case 5:
2313
38.8k
    cpp_target = NFP_6000_CPPTGT_MU;
2314
38.8k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2315
38.8k
    break;
2316
21.4k
  case 6:
2317
39.9k
  case 7:
2318
39.9k
    cpp_target = NFP_6000_CPPTGT_CLS;
2319
39.9k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2320
39.9k
    break;
2321
115k
  }
2322
115k
    }
2323
2324
272k
  if (cpp_target < 0)
2325
31.7k
    {
2326
31.7k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2327
31.7k
         cpp_target, cpp_action, token);
2328
31.7k
      return _NFP_ERR_CONT;
2329
31.7k
    }
2330
2331
240k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2332
240k
           nfp_me28_mnemonics,
2333
240k
           ARRAY_SIZE (nfp_me28_mnemonics));
2334
2335
240k
  if (!mnemonic)
2336
84.2k
    {
2337
84.2k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2338
84.2k
         cpp_target, cpp_action, token);
2339
84.2k
      return _NFP_ERR_CONT;
2340
84.2k
    }
2341
2342
156k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2343
2344
156k
  if (visswap)
2345
24.5k
    {
2346
24.5k
      unsigned int tmp = srcA;
2347
24.5k
      srcA = srcB;
2348
24.5k
      srcB = tmp;
2349
24.5k
    }
2350
2351
156k
  switch (mode)
2352
156k
    {
2353
80.9k
    case 0:     /* (A << 8) + B.  */
2354
94.1k
    case 1:     /* (B << 8) + A.  */
2355
94.1k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2356
94.1k
      err = err
2357
94.1k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2358
94.1k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2359
94.1k
      err = err
2360
94.1k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2361
94.1k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2362
94.1k
      break;
2363
13.1k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2364
24.5k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2365
24.5k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2366
24.5k
      err = err
2367
24.5k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2368
24.5k
      if (third_party_32bit)
2369
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2370
24.5k
      else
2371
24.5k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2372
24.5k
      err = err
2373
24.5k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2374
24.5k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2375
24.5k
      break;
2376
10.0k
    case 4:     /* A + B.  */
2377
10.0k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2378
10.0k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2379
10.0k
      dinfo->fprintf_func (dinfo->stream, ", ");
2380
10.0k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2381
10.0k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2382
10.0k
      break;
2383
7.62k
    case 5:     /* Immediate address.  */
2384
7.62k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2385
7.62k
         (cpp_len + 1));
2386
7.62k
      break;
2387
9.84k
    case 6:     /* Immediate address and data.  */
2388
9.84k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2389
9.84k
      break;
2390
10.0k
    case 7:     /* Immediate data.  */
2391
10.0k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2392
10.0k
         ((xfer << 16) | valBA), (cpp_len + 1));
2393
10.0k
      break;
2394
156k
    }
2395
2396
156k
  dinfo->fprintf_func (dinfo->stream, "]");
2397
2398
156k
  if (indref && (mode != 2) && (mode != 3))
2399
33.9k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2400
2401
156k
  if (ctxswap_defer != 3)
2402
133k
    {
2403
133k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2404
133k
      if (sig)
2405
54.9k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2406
78.3k
      else
2407
78.3k
  dinfo->fprintf_func (dinfo->stream, "--]");
2408
2409
133k
      if (ctxswap_defer != 0)
2410
49.6k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2411
133k
    }
2412
23.0k
  else if (sig)
2413
13.5k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2414
2415
156k
  if (err)
2416
0
    return _NFP_ERR_CONT;
2417
156k
  return 0;
2418
156k
}
2419
2420
static int
2421
nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
2422
      struct disassemble_info *dinfo)
2423
33.2k
{
2424
33.2k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2425
33.2k
  unsigned int src_lmext = _BTST (instr, 42);
2426
33.2k
  unsigned int dst_lmext = _BTST (instr, 43);
2427
33.2k
  unsigned int pred_cc = _BTST (instr, 44);
2428
2429
33.2k
  return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2430
33.2k
            src_lmext, gpr_wrboth, num_ctx, dinfo);
2431
33.2k
}
2432
2433
static int
2434
nfp_me28_print_alu (uint64_t instr, int num_ctx,
2435
        struct disassemble_info *dinfo)
2436
32.9k
{
2437
32.9k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2438
32.9k
  unsigned int src_lmext = _BTST (instr, 42);
2439
32.9k
  unsigned int dst_lmext = _BTST (instr, 43);
2440
32.9k
  unsigned int pred_cc = _BTST (instr, 44);
2441
2442
32.9k
  return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2443
32.9k
        gpr_wrboth, num_ctx, dinfo);
2444
32.9k
}
2445
2446
static int
2447
nfp_me28_print_immed (uint64_t instr, int num_ctx,
2448
          struct disassemble_info *dinfo)
2449
5.70k
{
2450
5.70k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2451
5.70k
  unsigned int dst_lmext = _BTST (instr, 43);
2452
5.70k
  unsigned int pred_cc = _BTST (instr, 44);
2453
2454
5.70k
  return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2455
5.70k
          num_ctx, dinfo);
2456
5.70k
}
2457
2458
static int
2459
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
2460
       struct disassemble_info *dinfo)
2461
2.05k
{
2462
2.05k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2463
2.05k
  unsigned int src_lmext = _BTST (instr, 42);
2464
2.05k
  unsigned int dst_lmext = _BTST (instr, 43);
2465
2.05k
  unsigned int pred_cc = _BTST (instr, 44);
2466
2467
2.05k
  return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2468
2.05k
             src_lmext, gpr_wrboth, num_ctx, dinfo);
2469
2.05k
}
2470
2471
static int
2472
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2473
8.49k
{
2474
8.49k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2475
8.49k
}
2476
2477
static int
2478
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
2479
        struct disassemble_info *dinfo)
2480
2.20k
{
2481
2.20k
  unsigned int src_lmext = _BTST (instr, 42);
2482
2483
2.20k
  return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2484
2.20k
}
2485
2486
static int
2487
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2488
890
{
2489
890
  return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2490
890
}
2491
2492
static int
2493
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
2494
      struct disassemble_info *dinfo)
2495
8.63k
{
2496
8.63k
  unsigned int src_lmext = _BTST (instr, 42);
2497
8.63k
  return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2498
8.63k
}
2499
2500
static int
2501
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
2502
           struct disassemble_info *dinfo)
2503
3.10k
{
2504
3.10k
  unsigned int src_lmext = _BTST (instr, 42);
2505
3.10k
  return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2506
3.10k
}
2507
2508
static int
2509
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
2510
           struct disassemble_info *dinfo)
2511
2.44k
{
2512
2.44k
  unsigned int src_lmext = _BTST (instr, 42);
2513
2.44k
  return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2514
2.44k
}
2515
2516
static int
2517
nfp_me28_print_mult (uint64_t instr, int num_ctx,
2518
         struct disassemble_info *dinfo)
2519
1.42k
{
2520
1.42k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2521
1.42k
  unsigned int src_lmext = _BTST (instr, 42);
2522
1.42k
  unsigned int dst_lmext = _BTST (instr, 43);
2523
1.42k
  unsigned int pred_cc = _BTST (instr, 44);
2524
2525
1.42k
  return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2526
1.42k
         gpr_wrboth, num_ctx, dinfo);
2527
1.42k
}
2528
2529
static bool
2530
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2531
231
{
2532
231
  Elf_Internal_Shdr *sec = NULL;
2533
231
  Elf_Nfp_MeConfig mecfg_ent;
2534
231
  unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2535
231
  file_ptr roff = 0;
2536
231
  unsigned int sec_cnt = 0;
2537
231
  unsigned int sec_idx;
2538
231
  size_t menum_linear = 0;
2539
2540
231
  if (!dinfo->section)
2541
    /* No section info, will use default values.  */
2542
231
    return true;
2543
2544
0
  sec_cnt = elf_numsections (dinfo->section->owner);
2545
2546
  /* Find the MECONFIG section.  It's index is also in e_flags, but it has
2547
     a unique SHT and we'll use that.  */
2548
0
  for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2549
0
    {
2550
0
      sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2551
2552
0
      if (sec->sh_type == SHT_NFP_MECONFIG)
2553
0
  break;
2554
0
    }
2555
2556
0
  if (sec_idx == sec_cnt)
2557
0
    {
2558
0
      dinfo->fprintf_func (dinfo->stream, _("File has no ME-Config section."));
2559
0
      return false;
2560
0
    }
2561
2562
0
  if (sec->bfd_section == NULL)
2563
0
    {
2564
      /* See PR 31843 for an example of this.  */
2565
0
      dinfo->fprintf_func (dinfo->stream, _("The ME-Config section is corrupt."));
2566
0
      return false;
2567
0
    }
2568
2569
0
  for (roff = 0; (bfd_size_type) roff < sec->sh_size;
2570
0
       roff += sec->sh_entsize, menum_linear++)
2571
0
    {
2572
0
      nfp_priv_mecfg *mecfg;
2573
0
      int isl = menum_linear >> 3;
2574
0
      int menum = menum_linear & 7;
2575
2576
0
      if (menum_linear >= 40)
2577
0
  {
2578
0
    dinfo->fprintf_func (dinfo->stream,
2579
0
             _("File has invalid ME-Config section."));
2580
0
    return false;
2581
0
  }
2582
2583
0
      mecfg = &priv->mecfgs[isl][menum][1];
2584
2585
0
      if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
2586
0
             buffer, roff, sizeof (buffer)))
2587
0
  return false;
2588
2589
0
      mecfg_ent.ctx_enables = bfd_getl32 (buffer + offsetof (Elf_Nfp_MeConfig,
2590
0
                   ctx_enables));
2591
0
      mecfg_ent.misc_control = bfd_getl32 (buffer
2592
0
  + offsetof (Elf_Nfp_MeConfig, misc_control));
2593
2594
0
      mecfg->ctx4_mode = _BTST (mecfg_ent.ctx_enables, 31);
2595
0
      mecfg->addr_3rdparty32 = _BTST (mecfg_ent.misc_control, 4);
2596
0
      mecfg->scs_cnt = _BTST (mecfg_ent.misc_control, 2);
2597
0
    }
2598
2599
0
  return true;
2600
0
}
2601
2602
static bool
2603
init_nfp6000_mecsr_sec (nfp_priv_data * priv, Elf_Internal_Shdr * sec,
2604
      bool is_for_text, struct disassemble_info *dinfo)
2605
0
{
2606
0
  Elf_Nfp_InitRegEntry ireg;
2607
0
  unsigned char buffer[sizeof (Elf_Nfp_InitRegEntry)];
2608
0
  file_ptr ireg_off = 0;
2609
0
  size_t isl, menum;
2610
2611
0
  if (sec->sh_entsize != sizeof (ireg))
2612
0
    return false;
2613
2614
0
  isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2615
2616
  /* For these sections we know that the address will only be 32 bits
2617
     so we only need cpp_offset_lo.
2618
     Address is encoded as follows:
2619
     <31:30> 0
2620
     <29:24> island (already got this from sh_info)
2621
     <23:17> 0
2622
     <16:16> XferCsrRegSel (1 for these sections)
2623
     <15:14> 0
2624
     <13:10> DataMasterID (MEnum = this - 4)
2625
     <9:2> register (index)
2626
     <1:0> 0b0 (register byte address if appened to the previous field).  */
2627
0
  for (ireg_off = 0; (bfd_size_type) ireg_off < sec->sh_size;
2628
0
       ireg_off += sec->sh_entsize)
2629
0
    {
2630
0
      uint32_t csr_off;
2631
0
      nfp_priv_mecfg *mecfg;
2632
2633
0
      if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
2634
0
             buffer, ireg_off, sizeof (buffer)))
2635
0
  return false;
2636
2637
0
      ireg.cpp_offset_lo = bfd_getl32 (buffer
2638
0
  + offsetof (Elf_Nfp_InitRegEntry, cpp_offset_lo));
2639
0
      ireg.mask = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, mask));
2640
0
      ireg.val = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, val));
2641
0
      ireg.w0 = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, w0));
2642
2643
0
      if (NFP_IREG_ENTRY_WO_NLW (ireg.w0))
2644
0
  continue;
2645
2646
      /* Only consider entries that are permanent for runtime.  */
2647
0
      if ((NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_CONST)
2648
0
    && (NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_FORCE))
2649
0
  continue;
2650
2651
0
      menum = _BF (ireg.cpp_offset_lo, 13, 10) - 4;
2652
0
      csr_off = _BF (ireg.cpp_offset_lo, 9, 0);
2653
2654
0
      if (isl >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2655
0
  return false;
2656
  
2657
0
      mecfg = &priv->mecfgs[isl][menum][is_for_text];
2658
0
      switch (csr_off)
2659
0
  {
2660
0
  case _NFP_ME27_28_CSR_CTX_ENABLES:
2661
0
    mecfg->ctx4_mode = _BTST (ireg.val, 31);
2662
0
    break;
2663
0
  case _NFP_ME27_28_CSR_MISC_CONTROL:
2664
0
    mecfg->addr_3rdparty32 = _BTST (ireg.val, 4);
2665
0
    mecfg->scs_cnt = _BTST (ireg.val, 2);
2666
0
    break;
2667
0
  default:
2668
0
    break;
2669
0
  }
2670
0
    }
2671
2672
0
  return true;
2673
0
}
2674
2675
static bool
2676
init_nfp6000_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2677
850
{
2678
850
  int mecfg_orders[64][2];
2679
850
  size_t isl;
2680
850
  unsigned int sec_cnt = 0;
2681
850
  unsigned int sec_idx;
2682
850
  bool is_for_text;
2683
2684
850
  memset (mecfg_orders, -1, sizeof (mecfg_orders));
2685
2686
850
  if (dinfo->section == NULL
2687
275
      || dinfo->section->owner == NULL
2688
275
      || elf_elfsections (dinfo->section->owner) == NULL)
2689
    /* No section info, will use default values.  */
2690
848
    return true;
2691
2692
2
  sec_cnt = elf_numsections (dinfo->section->owner);
2693
2694
  /* Go through all MECSR init sections to find ME configs.  */
2695
72
  for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2696
70
    {
2697
70
      Elf_Internal_Shdr *sec;
2698
70
      int sec_order;
2699
2700
70
      sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2701
70
      sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
2702
2703
70
      is_for_text = (sec->sh_flags & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2704
2705
      /* If we have an init2 section, that is the one that applies to the
2706
   ME when executing init code.  So we make it's order higher than
2707
   any plain init section.  */
2708
70
      if (sec->sh_flags & SHF_NFP_INIT2)
2709
0
  sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
2710
2711
70
      if (sec->sh_type != SHT_NFP_INITREG)
2712
70
  continue;
2713
0
      if (!SHI_NFP_6000_IS_IREG_MECSR (sec->sh_info))
2714
0
  continue;
2715
2716
0
      isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2717
0
      if ((sec_order < mecfg_orders[isl][is_for_text]))
2718
  /* Lower order or transient, skip it.  */
2719
0
  continue;
2720
2721
0
      mecfg_orders[isl][is_for_text] = sec_order;
2722
2723
0
      if (!init_nfp6000_mecsr_sec (priv, sec, is_for_text, dinfo))
2724
0
  {
2725
0
    dinfo->fprintf_func (dinfo->stream,
2726
0
             _("Error processing section %u "), sec_idx);
2727
0
    return false;
2728
0
  }
2729
0
    }
2730
2731
2
  return true;
2732
2
}
2733
2734
static bool
2735
nfp_parse_option (const char *option, void *data)
2736
0
{
2737
0
  nfp_opts *opts = data;
2738
2739
0
  if (strcmp (option, "no-pc") == 0)
2740
0
    opts->show_pc = 0;
2741
0
  else if (strcmp (option, "ctx4") == 0)
2742
0
    {
2743
0
      if (!opts->ctx_mode)
2744
0
  opts->ctx_mode = 4;
2745
0
    }
2746
0
  else if (strcmp (option, "ctx8") == 0)
2747
0
    opts->ctx_mode = 8;
2748
0
  else
2749
0
    {
2750
0
      opcodes_error_handler (_("invalid NFP option: %s"), option);
2751
0
      return false;
2752
0
    }
2753
0
  return true;
2754
0
}
2755
2756
static int
2757
parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
2758
494k
{
2759
494k
  if (!for_each_disassembler_option (dinfo, nfp_parse_option, opts))
2760
0
    return _NFP_ERR_STOP;
2761
2762
494k
  return 0;
2763
494k
}
2764
2765
/* Called on first disassembly attempt so that dinfo->section is valid
2766
   so that we can get the bfd owner to find ME configs.  */
2767
2768
static nfp_priv_data *
2769
init_nfp_priv (struct disassemble_info *dinfo)
2770
494k
{
2771
494k
  nfp_priv_data *priv;
2772
494k
  int ret = false;
2773
2774
494k
  if (dinfo->private_data)
2775
492k
    return (nfp_priv_data *) dinfo->private_data;
2776
2777
#if 0  /* Right now only section-related info is kept in priv.
2778
    So don't even calloc it if we don't need it.  */
2779
  if (!dinfo->section)
2780
     return NULL;
2781
#endif
2782
2783
  /* Alloc with no free, seems to be either this or a static global variable
2784
     and this at least keeps a large struct unallocated until really needed.  */
2785
1.46k
  priv = calloc (1, sizeof (*priv));
2786
1.46k
  if (!priv)
2787
0
    return NULL;
2788
2789
1.46k
  switch (dinfo->mach)
2790
1.46k
    {
2791
231
    case E_NFP_MACH_3200:
2792
231
      ret = init_nfp3200_priv (priv, dinfo);
2793
231
      break;
2794
850
    case E_NFP_MACH_6000:
2795
850
      ret = init_nfp6000_priv (priv, dinfo);
2796
850
      break;
2797
1.46k
    }
2798
2799
1.46k
  if (!ret)
2800
387
    {
2801
387
      free (priv);
2802
387
      return NULL;
2803
387
    }
2804
2805
1.08k
  dinfo->private_data = priv;
2806
1.08k
  return priv;
2807
1.46k
}
2808
2809
static int
2810
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2811
494k
{
2812
494k
  nfp_priv_data *priv = init_nfp_priv (dinfo);
2813
494k
  bfd_byte buffer[8];
2814
494k
  int err;
2815
494k
  uint64_t instr = 0;
2816
494k
  size_t island, menum;
2817
494k
  int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2818
494k
  int is_text = 1;
2819
2820
494k
  err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2821
494k
  if (err)
2822
1.00k
    return _NFP_ERR_STOP;
2823
2824
493k
  if (!dinfo->section)
2825
215k
    {
2826
215k
      num_ctx = 8;
2827
215k
      scs_cnt = 0;
2828
215k
      addr_3rdparty32 = 0;
2829
215k
    }
2830
277k
  else
2831
277k
    {
2832
277k
      unsigned int sh_info = 0;
2833
277k
      nfp_priv_mecfg *mecfg;
2834
2835
      /* We have a section, presumably all ELF sections.  Try to find
2836
   proper ME configs to produce better disassembly.  */
2837
277k
      if (!priv)
2838
0
  return _NFP_ERR_STOP; /* Sanity check */
2839
2840
277k
      is_text = (elf_section_flags (dinfo->section)
2841
277k
     & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2842
2843
277k
      sh_info = elf_section_info (dinfo->section);
2844
2845
277k
      switch (dinfo->mach)
2846
277k
  {
2847
0
  case E_NFP_MACH_3200:
2848
0
    island = SHI_NFP_3200_ISLAND (sh_info);
2849
0
    menum = SHI_NFP_3200_MENUM (sh_info);
2850
0
    break;
2851
277k
  default:
2852
277k
    island = SHI_NFP_ISLAND (sh_info);
2853
277k
    menum = SHI_NFP_MENUM (sh_info);
2854
277k
    break;
2855
277k
  }
2856
2857
277k
      if (island >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2858
1
  {
2859
1
    dinfo->fprintf_func (dinfo->stream, "Invalid island or me.");
2860
1
    return _NFP_ERR_STOP;
2861
1
  }
2862
2863
277k
      mecfg = &priv->mecfgs[island][menum][is_text];
2864
277k
      num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2865
277k
      addr_3rdparty32 = mecfg->addr_3rdparty32;
2866
277k
      scs_cnt = mecfg->scs_cnt;
2867
277k
    }
2868
2869
493k
  if (opts->ctx_mode)
2870
0
    num_ctx = opts->ctx_mode;
2871
2872
493k
  dinfo->bytes_per_line = 8;
2873
493k
  dinfo->bytes_per_chunk = 8;
2874
2875
493k
  instr = bfd_getl64 (buffer);
2876
2877
493k
  if (opts->show_pc)
2878
493k
    {
2879
493k
      pc = (int) (addr >> 3);
2880
2881
      /* Guess max PC for formatting */
2882
493k
      tmpj = (int) (dinfo->buffer_length >> 3);
2883
493k
      if (scs_cnt == 1)
2884
0
  {
2885
0
    pc *= 2;
2886
0
    tmpj *= 2;
2887
0
    if (! !(menum & 1))
2888
0
      {
2889
0
        pc++;
2890
0
        tmpj++;
2891
0
      }
2892
0
  }
2893
2894
1.65M
      for (tmpi = 1; tmpj > 9; tmpj /= 10)
2895
1.15M
  tmpi++;
2896
2897
493k
      tmpj = pc;
2898
1.66M
      for (; tmpj > 9; tmpj /= 10)
2899
1.17M
  tmpi--;
2900
2901
493k
      dinfo->fprintf_func (dinfo->stream, "%*c%d  ", tmpi, '.', pc);
2902
493k
    }
2903
2904
493k
  switch (dinfo->mach)
2905
493k
    {
2906
55.5k
    case E_NFP_MACH_3200:
2907
55.5k
      if (NFP_ME27_INSTR_IS_CMD (instr))
2908
36.6k
  err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2909
18.8k
      else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2910
1.10k
  err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2911
17.7k
      else if (NFP_ME27_INSTR_IS_ALU (instr))
2912
515
  err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2913
17.2k
      else if (NFP_ME27_INSTR_IS_IMMED (instr))
2914
288
  err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2915
16.9k
      else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2916
359
  err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2917
16.6k
      else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2918
2.84k
  err = nfp_me27_print_ctx_arb (instr, dinfo);
2919
13.7k
      else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2920
193
  err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2921
13.5k
      else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2922
305
  err = nfp_me27_print_branch (instr, dinfo);
2923
13.2k
      else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2924
696
  err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2925
12.5k
      else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2926
962
  err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2927
11.6k
      else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2928
102
  err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2929
11.5k
      else if (NFP_ME27_INSTR_IS_MULT (instr))
2930
266
  err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2931
11.2k
      else
2932
11.2k
  err = nfp_me_print_invalid (instr, dinfo);
2933
55.5k
      break;
2934
2935
437k
    case E_NFP_MACH_6000:
2936
437k
      if (NFP_ME28_INSTR_IS_CMD (instr))
2937
272k
  err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2938
164k
      else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2939
33.2k
  err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2940
131k
      else if (NFP_ME28_INSTR_IS_ALU (instr))
2941
32.9k
  err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2942
98.6k
      else if (NFP_ME28_INSTR_IS_IMMED (instr))
2943
5.70k
  err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2944
92.9k
      else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2945
2.05k
  err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2946
90.9k
      else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2947
8.49k
  err = nfp_me28_print_ctx_arb (instr, dinfo);
2948
82.4k
      else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2949
2.20k
  err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2950
80.2k
      else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2951
890
  err = nfp_me28_print_branch (instr, dinfo);
2952
79.3k
      else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2953
8.63k
  err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2954
70.7k
      else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2955
3.10k
  err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2956
67.5k
      else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2957
2.44k
  err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2958
65.1k
      else if (NFP_ME28_INSTR_IS_MULT (instr))
2959
1.42k
  err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2960
63.7k
      else
2961
63.7k
  err = nfp_me_print_invalid (instr, dinfo);
2962
437k
      break;
2963
493k
    }
2964
2965
493k
  if (err < 0)
2966
213k
    return err;
2967
279k
  return 8;
2968
493k
}
2969
2970
int
2971
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2972
494k
{
2973
494k
  nfp_opts opts;
2974
494k
  int err;
2975
2976
494k
  opts.show_pc = 1;
2977
494k
  opts.ctx_mode = 0;
2978
494k
  err = parse_disassembler_options (&opts, dinfo);
2979
494k
  if (err < 0)
2980
0
    goto end;
2981
2982
494k
  err = _print_instrs (addr, dinfo, &opts);
2983
2984
494k
 end:
2985
494k
  if (err != 8)
2986
214k
    dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2987
494k
  if (err == _NFP_ERR_CONT)
2988
213k
    return 8;
2989
280k
  return err;
2990
494k
}
2991
2992
void
2993
print_nfp_disassembler_options (FILE * stream)
2994
0
{
2995
0
  fprintf (stream, _("\n\
2996
0
The following NFP specific disassembler options are supported for use\n\
2997
0
with the -M switch (multiple options should be separated by commas):\n"));
2998
2999
0
  fprintf (stream, _("\n\
3000
0
  no-pc       Don't print program counter prefix.\n\
3001
0
  ctx4        Force disassembly using 4-context mode.\n\
3002
0
  ctx8        Force 8-context mode, takes precedence."));
3003
3004
  fprintf (stream, _("\n"));
3005
0
}