Coverage Report

Created: 2025-07-08 11:15

/src/binutils-gdb/opcodes/nfp-dis.c
Line
Count
Source (jump to first uncovered line)
1
/* Print NFP instructions for objdump.
2
   Copyright (C) 2017-2025 Free Software Foundation, Inc.
3
   Contributed by Francois H. Theron <francois.theron@netronome.com>
4
5
   This file is part of the GNU opcodes library.
6
7
   This library is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3, or (at your option)
10
   any later version.
11
12
   It is distributed in the hope that it will be useful, but WITHOUT
13
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15
   License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
/* There will be many magic numbers here that are based on hardware.
23
   Making #define macros for each encoded bit field will probably reduce
24
   readability far more than the simple numbers will, so we make sure that
25
   the context of the magic numbers make it clear what they are used for.  */
26
27
#include "sysdep.h"
28
#include <stdio.h>
29
#include "disassemble.h"
30
#include "libiberty.h"
31
#include "elf/nfp.h"
32
#include "opcode/nfp.h"
33
#include "opintl.h"
34
#include "elf-bfd.h"
35
#include "bfd.h"
36
#include <stdint.h>
37
38
609
#define _NFP_ERR_STOP -1
39
644k
#define _NFP_ERR_CONT -8
40
41
1.15M
#define _BTST(v, b)               (((v) >> b) & 1)
42
6.54M
#define _BF(v, msb, lsb)          (((v) >> (lsb)) & \
43
6.54M
           ((1U << ((msb) - (lsb) + 1)) - 1))
44
418k
#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
545k
#define _NFP_ISLAND_MAX 64
50
272k
#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
62.2k
{
930
62.2k
  const char * err_msg = N_("<invalid_instruction>:");
931
62.2k
  dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
932
62.2k
  return _NFP_ERR_CONT;
933
62.2k
}
934
935
static bool
936
nfp_me_is_imm_opnd10 (unsigned int opnd)
937
45.4k
{
938
45.4k
  return _BF (opnd, 9, 8) == 0x3;
939
45.4k
}
940
941
static bool
942
nfp_me_is_imm_opnd8 (unsigned int opnd)
943
55.0k
{
944
55.0k
  return _BTST (opnd, 5);
945
55.0k
}
946
947
static unsigned int
948
nfp_me_imm_opnd10 (unsigned int opnd)
949
5.04k
{
950
5.04k
  return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
951
5.04k
}
952
953
static unsigned int
954
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
955
3.14k
{
956
3.14k
  unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
957
958
3.14k
  return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
959
3.14k
}
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
58.9k
{
967
58.9k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
968
969
  /* Absolute GPR.  */
970
58.9k
  if (_BF (opnd, 9, 7) == 0x1)
971
9.34k
    dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
972
973
  /* Relative GPR.  */
974
49.5k
  else if (_BF (opnd, 9, 6) == 0x0)
975
8.20k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
976
977
  /* Indexed Xfer.  */
978
41.3k
  else if (_BF (opnd, 9, 7) == 0x2)
979
5.68k
    {
980
5.68k
      dinfo->fprintf_func (dinfo->stream, "*$index");
981
5.68k
      if (_BF (opnd, 2, 1) == 0x1)
982
1.26k
  dinfo->fprintf_func (dinfo->stream, "++");
983
4.41k
      else if (_BF (opnd, 2, 1) == 0x2)
984
1.72k
  dinfo->fprintf_func (dinfo->stream, "--");
985
5.68k
    }
986
987
  /* Relative Xfer.  */
988
35.7k
  else if (_BF (opnd, 9, 7) == 0x3)
989
6.80k
    {
990
6.80k
      if (_BTST (opnd, 6))
991
3.52k
  n += (num_ctx == 8 ? 16 : 32);
992
6.80k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
993
6.80k
    }
994
995
  /* Indexed Next Neighbour.  */
996
28.9k
  else if (_BF (opnd, 9, 6) == 0x9)
997
5.83k
    {
998
5.83k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
999
5.83k
      if (_BTST (opnd, 1))
1000
4.26k
  dinfo->fprintf_func (dinfo->stream, "++");
1001
5.83k
    }
1002
1003
  /* Relative Next Neighbour.  */
1004
23.0k
  else if (_BF (opnd, 9, 6) == 0xa)
1005
3.35k
    {
1006
3.35k
      dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1007
3.35k
    }
1008
1009
  /* Indexed LMEM.  */
1010
19.7k
  else if (_BF (opnd, 9, 6) == 0x8)
1011
4.57k
    {
1012
4.57k
      n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1013
4.57k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1014
4.57k
      if (_BTST (opnd, 4))
1015
1.58k
  dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1016
2.99k
      else if (_BF (opnd, 3, 0))
1017
2.55k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1018
4.57k
    }
1019
1020
  /* 8-bit Constant value.  */
1021
15.1k
  else if (_BF (opnd, 9, 8) == 0x3)
1022
6.78k
    dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1023
1024
8.34k
  else
1025
8.34k
    {
1026
8.34k
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1027
8.34k
      return false;
1028
8.34k
    }
1029
1030
50.5k
  return true;
1031
58.9k
}
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
372k
{
1040
372k
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1041
1042
  /* Relative GPR.  */
1043
372k
  if (_BF (opnd, 7, 5) == 0x0)
1044
155k
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1045
1046
  /* Relative Xfer.  */
1047
217k
  else if (_BF (opnd, 7, 5) == 0x4)
1048
39.4k
    dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1049
1050
  /* Relative Xfer.  */
1051
177k
  else if (_BF (opnd, 7, 5) == 0x6)
1052
29.5k
    {
1053
29.5k
      n += (num_ctx == 8 ? 16 : 32);
1054
29.5k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1055
29.5k
    }
1056
1057
  /* Indexed Xfer.  */
1058
148k
  else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1059
19.2k
    {
1060
19.2k
      dinfo->fprintf_func (dinfo->stream, "*$index");
1061
19.2k
      if (_BF (opnd, 2, 1) == 0x1)
1062
4.15k
  dinfo->fprintf_func (dinfo->stream, "++");
1063
15.0k
      else if (_BF (opnd, 2, 1) == 0x2)
1064
2.62k
  dinfo->fprintf_func (dinfo->stream, "--");
1065
19.2k
    }
1066
1067
  /* Indexed NN.  */
1068
129k
  else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1069
6.98k
    {
1070
6.98k
      dinfo->fprintf_func (dinfo->stream, "*n$index");
1071
6.98k
      if (_BTST (opnd, 1))
1072
2.95k
  dinfo->fprintf_func (dinfo->stream, "++");
1073
6.98k
    }
1074
1075
  /* Indexed LMEM.  */
1076
122k
  else if (_BF (opnd, 7, 4) == 0x5)
1077
20.3k
    {
1078
20.3k
      n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1079
20.3k
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1080
20.3k
      if (_BF (opnd, 2, 0))
1081
18.0k
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1082
20.3k
    }
1083
1084
  /* 7+1-bit Constant value.  */
1085
101k
  else if (_BTST (opnd, 5))
1086
101k
    {
1087
101k
      n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1088
101k
      dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1089
101k
    }
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
372k
  return true;
1098
372k
}
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
32.7k
{
1106
32.7k
  unsigned int op = _BF (instr, 35, 33);
1107
32.7k
  unsigned int srcA = _BF (instr, 7, 0);
1108
32.7k
  unsigned int srcB = _BF (instr, 17, 10);
1109
32.7k
  unsigned int dst = _BF (instr, 27, 20);
1110
32.7k
  unsigned int sc = _BF (instr, 9, 8);
1111
32.7k
  unsigned int imm_msb = _BTST (instr, 18);
1112
32.7k
  unsigned int swap = _BTST (instr, 19);
1113
32.7k
  unsigned int shift = _BF (instr, 32, 28);
1114
32.7k
  char dst_bank = 'A' + _BTST (instr, 36);
1115
32.7k
  unsigned int nocc = _BTST (instr, 40);
1116
32.7k
  bool err = false;
1117
1118
32.7k
  if (swap)
1119
15.2k
    {
1120
15.2k
      unsigned int tmp = srcA;
1121
15.2k
      srcA = srcB;
1122
15.2k
      srcB = tmp;
1123
15.2k
    }
1124
1125
  /* alu_shf, dbl_shf, asr.  */
1126
32.7k
  if (op < 7)
1127
29.2k
    {
1128
29.2k
      if (sc == 3)
1129
5.58k
  dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1130
23.6k
      else if (op == 6)
1131
1.62k
  dinfo->fprintf_func (dinfo->stream, "asr[");
1132
22.0k
      else
1133
22.0k
  dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1134
1135
      /* dest operand */
1136
29.2k
      if (nfp_me_is_imm_opnd8 (dst))
1137
11.0k
  dinfo->fprintf_func (dinfo->stream, "--");
1138
18.1k
      else
1139
18.1k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1140
18.1k
            dst_lmext, imm_msb, dinfo);
1141
1142
29.2k
      dinfo->fprintf_func (dinfo->stream, ", ");
1143
1144
      /* A operand.  */
1145
29.2k
      if (op != 6)
1146
26.9k
  {
1147
26.9k
    if ((op < 2) && (sc != 3))  /* Not dbl_shf.  */
1148
7.65k
      dinfo->fprintf_func (dinfo->stream, "--");  /* B or ~B operator.  */
1149
19.2k
    else
1150
19.2k
      err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1151
19.2k
                num_ctx, src_lmext, imm_msb,
1152
19.2k
                dinfo);
1153
1154
26.9k
    dinfo->fprintf_func (dinfo->stream, ", ");
1155
1156
    /* Operator (not for dbl_shf).  */
1157
26.9k
    if (sc != 3)
1158
22.0k
      {
1159
22.0k
        dinfo->fprintf_func (dinfo->stream, "%s, ",
1160
22.0k
           nfp_mealu_shf_op[op]);
1161
22.0k
      }
1162
26.9k
  }
1163
1164
      /* B operand.  */
1165
29.2k
      err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1166
29.2k
          num_ctx, src_lmext, imm_msb, dinfo);
1167
1168
29.2k
      dinfo->fprintf_func (dinfo->stream, ", ");
1169
1170
      /* Shift */
1171
29.2k
      if (sc == 0)
1172
11.2k
  dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1173
18.0k
      else if (sc == 2)
1174
5.24k
  {
1175
5.24k
    if (shift)
1176
4.79k
      dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1177
447
    else
1178
447
      dinfo->fprintf_func (dinfo->stream, "<<indirect");
1179
5.24k
  }
1180
12.7k
      else
1181
12.7k
  {
1182
12.7k
    if (shift)
1183
11.6k
      dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1184
1.18k
    else
1185
1.18k
      dinfo->fprintf_func (dinfo->stream, ">>indirect");
1186
12.7k
  }
1187
29.2k
    }
1188
  /* Byte Align.  */
1189
3.48k
  else if (op == 7)
1190
3.48k
    {
1191
3.48k
      dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1192
3.48k
         ((sc == 2) ? "le" : "be"));
1193
1194
      /* Dest operand.  */
1195
3.48k
      if (nfp_me_is_imm_opnd8 (dst))
1196
2.02k
  dinfo->fprintf_func (dinfo->stream, "--");
1197
1.46k
      else
1198
1.46k
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1199
1.46k
            dst_lmext, imm_msb, dinfo);
1200
1201
3.48k
      dinfo->fprintf_func (dinfo->stream, ", ");
1202
1203
3.48k
      if (sc == 2)
1204
960
  err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1205
960
            0, imm_msb, dinfo);
1206
2.52k
      else
1207
2.52k
  err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1208
2.52k
            0, imm_msb, dinfo);
1209
3.48k
    }
1210
1211
32.7k
  dinfo->fprintf_func (dinfo->stream, "]");
1212
32.7k
  if (nocc)
1213
15.6k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1214
32.7k
  if (gpr_wrboth)
1215
13.4k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1216
32.7k
  if (pred_cc)
1217
13.6k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1218
1219
32.7k
  if (err)
1220
0
    return _NFP_ERR_CONT;
1221
32.7k
  return 0;
1222
32.7k
}
1223
1224
static int
1225
nfp_me27_28_print_alu (uint64_t instr, unsigned int pred_cc,
1226
           unsigned int dst_lmext, unsigned int src_lmext,
1227
           unsigned int gpr_wrboth,
1228
           int num_ctx, struct disassemble_info *dinfo)
1229
30.0k
{
1230
30.0k
  unsigned int op = _BF (instr, 35, 31);
1231
30.0k
  unsigned int srcA = _BF (instr, 9, 0);
1232
30.0k
  unsigned int srcB = _BF (instr, 19, 10);
1233
30.0k
  unsigned int dst = _BF (instr, 29, 20);
1234
30.0k
  unsigned int swap = _BTST (instr, 30);
1235
30.0k
  char dst_bank = 'A' + _BTST (instr, 36);
1236
30.0k
  unsigned int nocc = _BTST (instr, 40);
1237
30.0k
  int do_close_bracket = 1;
1238
30.0k
  bool err = false;
1239
1240
30.0k
  if (swap)
1241
9.36k
    {
1242
9.36k
      unsigned int tmp = srcA;
1243
9.36k
      srcA = srcB;
1244
9.36k
      srcB = tmp;
1245
9.36k
    }
1246
1247
30.0k
  switch (op)
1248
30.0k
    {
1249
813
    case 3:     /* pop_count3[dst, srcB] */
1250
1.51k
    case 6:     /* pop_count1[srcB] */
1251
2.27k
    case 7:     /* pop_count2[srcB] */
1252
2.97k
    case 14:      /* ffs[dst, srcB] */
1253
5.44k
    case 15:      /* cam_read_tag[dst, srcB] */
1254
6.61k
    case 31:      /* cam_read_state[dst, srcB] */
1255
6.61k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1256
1257
      /* No dest for pop_count1/2.  */
1258
6.61k
      if ((op != 6) && (op != 7))
1259
5.15k
  {
1260
    /* dest operand */
1261
5.15k
    if (nfp_me_is_imm_opnd10 (dst))
1262
807
      dinfo->fprintf_func (dinfo->stream, "--");
1263
4.34k
    else
1264
4.34k
      err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1265
4.34k
                 dst_lmext, dinfo);
1266
1267
5.15k
    dinfo->fprintf_func (dinfo->stream, ", ");
1268
5.15k
  }
1269
1270
      /* B operand.  */
1271
6.61k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1272
5.75k
           num_ctx, src_lmext, dinfo);
1273
6.61k
      break;
1274
 
1275
      /* cam_clear.  */
1276
1.20k
    case 11:
1277
1.20k
      do_close_bracket = 0;
1278
1.20k
      dinfo->fprintf_func (dinfo->stream, "cam_clear");
1279
1.20k
      break;
1280
1281
      /* cam_lookup.  */
1282
1.11k
    case 23:
1283
1.11k
      do_close_bracket = 0;
1284
1.11k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1285
1286
      /* Dest operand.  */
1287
1.11k
      if (nfp_me_is_imm_opnd10 (dst))
1288
623
  dinfo->fprintf_func (dinfo->stream, "--");
1289
491
      else
1290
491
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1291
491
             dst_lmext, dinfo);
1292
1293
1.11k
      dinfo->fprintf_func (dinfo->stream, ", ");
1294
1295
      /* A operand.  */
1296
1.11k
      err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1297
974
           num_ctx, src_lmext, dinfo);
1298
1299
1.11k
      dinfo->fprintf_func (dinfo->stream, "]");
1300
1301
1.11k
      if (_BF (srcB, 1, 0))
1302
964
  {
1303
964
    unsigned int n = _BTST (srcB, 1);
1304
964
    if (_BTST (srcB, 4))  /* Only for MEv28.  */
1305
247
      n += 2;
1306
964
    dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1307
964
             _BF (srcB, 3, 2));
1308
964
  }
1309
1310
1.11k
      break;
1311
1312
2.38k
    case 19:      /* cam_write.  */
1313
3.24k
    case 27:      /* cam_write_state.  */
1314
3.24k
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1315
3.24k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1316
3.24k
           num_ctx, src_lmext, dinfo);
1317
3.24k
      dinfo->fprintf_func (dinfo->stream, ", ");
1318
3.24k
      if (op == 19)
1319
2.38k
  {
1320
2.38k
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1321
2.13k
               num_ctx, src_lmext, dinfo);
1322
2.38k
    dinfo->fprintf_func (dinfo->stream, ", ");
1323
2.38k
  }
1324
3.24k
      dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1325
3.24k
      break;
1326
1327
      /* CRC.  */
1328
921
    case 18:  
1329
921
      do_close_bracket = 0;
1330
921
      dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1331
921
         _BTST (srcA, 3) ? "le" : "be");
1332
921
      if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
1333
173
  {
1334
173
    dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1335
173
    err = true;
1336
173
  }
1337
748
      else
1338
748
  {
1339
748
    dinfo->fprintf_func (dinfo->stream, "%s, ",
1340
748
             nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
1341
748
  }
1342
1343
      /* Dest operand.  */
1344
921
      if (nfp_me_is_imm_opnd10 (dst))
1345
320
  dinfo->fprintf_func (dinfo->stream, "--");
1346
601
      else
1347
601
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1348
441
             dst_lmext, dinfo);
1349
1350
921
      dinfo->fprintf_func (dinfo->stream, ", ");
1351
1352
      /* B operand.  */
1353
921
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1354
665
           num_ctx, src_lmext, dinfo);
1355
1356
921
      dinfo->fprintf_func (dinfo->stream, "]");
1357
921
      if (_BF (srcA, 2, 0))
1358
668
  dinfo->fprintf_func (dinfo->stream, ", %s",
1359
668
           nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
1360
921
      if (_BTST (srcA, 4))
1361
312
  dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1362
921
      break;
1363
1364
16.9k
    default:
1365
      /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs).  */
1366
16.9k
      dinfo->fprintf_func (dinfo->stream, "alu[");
1367
1368
      /* Dest operand.  */
1369
16.9k
      if (nfp_me_is_imm_opnd10 (dst))
1370
4.01k
  dinfo->fprintf_func (dinfo->stream, "--");
1371
12.9k
      else
1372
12.9k
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1373
12.9k
             dst_lmext, dinfo);
1374
16.9k
      dinfo->fprintf_func (dinfo->stream, ", ");
1375
1376
      /* A operand.  */
1377
16.9k
      if ((op == 0) || (op == 4))  /* B only operators.  */
1378
2.09k
  dinfo->fprintf_func (dinfo->stream, "--");
1379
14.8k
      else
1380
14.8k
  err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1381
12.9k
             num_ctx, src_lmext, dinfo);
1382
1383
16.9k
      if (!nfp_me27_28_alu_op[op])
1384
5.31k
  {
1385
5.31k
    dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1386
5.31k
    err = true;
1387
5.31k
  }
1388
11.6k
      else
1389
11.6k
  {
1390
11.6k
    dinfo->fprintf_func (dinfo->stream, ", %s, ",
1391
11.6k
             nfp_me27_28_alu_op[op]);
1392
11.6k
  }
1393
1394
      /* B operand.  */
1395
16.9k
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1396
9.04k
           num_ctx, src_lmext, dinfo);
1397
16.9k
      break;
1398
30.0k
    }
1399
1400
30.0k
  if (do_close_bracket)
1401
26.7k
    dinfo->fprintf_func (dinfo->stream, "]");
1402
1403
30.0k
  if (nocc)
1404
15.1k
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1405
30.0k
  if (gpr_wrboth)
1406
14.4k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1407
30.0k
  if (pred_cc)
1408
12.5k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1409
1410
30.0k
  if (err)
1411
11.5k
    return _NFP_ERR_CONT;
1412
18.5k
  return 0;
1413
30.0k
}
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
3.94k
{
1421
3.94k
  unsigned int srcA = _BF (instr, 9, 0);
1422
3.94k
  unsigned int srcB = _BF (instr, 19, 10);
1423
3.94k
  unsigned int imm = _BF (instr, 27, 20);
1424
3.94k
  unsigned int by = _BTST (instr, 29);
1425
3.94k
  unsigned int wd = _BTST (instr, 30);
1426
3.94k
  unsigned int inv = _BTST (instr, 31);
1427
3.94k
  unsigned int byte_shift = _BF (instr, 34, 33);
1428
3.94k
  bool err = false;
1429
1430
3.94k
  if (nfp_me_is_imm_opnd10 (srcB))
1431
657
    {
1432
657
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1433
657
      if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
1434
0
  {
1435
0
    dinfo->fprintf_func (dinfo->stream, "nop");
1436
0
    return 0;
1437
0
  }
1438
657
    }
1439
3.28k
  else
1440
3.28k
    {
1441
3.28k
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1442
3.28k
    }
1443
1444
3.94k
  if (inv)
1445
2.68k
    imm = (imm ^ 0xffff) | 0xffff0000U;
1446
1447
3.94k
  if (by)
1448
2.79k
    {
1449
2.79k
      dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1450
2.79k
      imm &= 0xff;
1451
2.79k
    }
1452
1.15k
  else if (wd)
1453
354
    {
1454
354
      dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1455
354
      imm &= 0xffff;
1456
354
    }
1457
796
  else
1458
796
    dinfo->fprintf_func (dinfo->stream, "immed[");
1459
1460
  /* Dest.  */
1461
3.94k
  if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1462
113
    dinfo->fprintf_func (dinfo->stream, "--");  /* No Dest.  */
1463
3.83k
  else if (nfp_me_is_imm_opnd10 (srcA))
1464
365
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1465
3.46k
  else
1466
3.46k
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1467
1468
3.94k
  dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1469
1470
3.94k
  if ((!by) && (!wd) && (byte_shift))
1471
590
    dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1472
1473
3.94k
  dinfo->fprintf_func (dinfo->stream, "]");
1474
1475
3.94k
  if (gpr_wrboth)
1476
1.87k
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1477
3.94k
  if (pred_cc)
1478
2.60k
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1479
1480
3.94k
  if (err)
1481
1.10k
    return _NFP_ERR_CONT;
1482
2.83k
  return 0;
1483
3.94k
}
1484
1485
static int
1486
nfp_me27_28_print_ld_field (uint64_t instr, unsigned int pred_cc,
1487
          unsigned int dst_lmext, unsigned int src_lmext,
1488
          unsigned int gpr_wrboth,
1489
          int num_ctx, struct disassemble_info *dinfo)
1490
1.16k
{
1491
1.16k
  unsigned int load_cc = _BTST (instr, 34);
1492
1.16k
  unsigned int shift = _BF (instr, 32, 28);
1493
1.16k
  unsigned int byte_mask = _BF (instr, 27, 24);
1494
1.16k
  unsigned int zerof = _BTST (instr, 20);
1495
1.16k
  unsigned int swap = _BTST (instr, 19);
1496
1.16k
  unsigned int imm_msb = _BTST (instr, 18);
1497
1.16k
  unsigned int src = _BF (instr, 17, 10);
1498
1.16k
  unsigned int sc = _BF (instr, 9, 8);
1499
1.16k
  unsigned int dst = _BF (instr, 7, 0);
1500
1.16k
  bool err = false;
1501
1502
1.16k
  if (swap)
1503
265
    {
1504
265
      unsigned int tmp = src;
1505
265
      src = dst;
1506
265
      dst = tmp;
1507
265
    }
1508
1509
1.16k
  if (zerof)
1510
166
    dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1511
995
  else
1512
995
    dinfo->fprintf_func (dinfo->stream, "ld_field[");
1513
1514
1.16k
  err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1515
1.16k
            dst_lmext, imm_msb, dinfo);
1516
1.16k
  dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1517
1.16k
           _BTST (byte_mask, 3),
1518
1.16k
           _BTST (byte_mask, 2),
1519
1.16k
           _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1520
1.16k
  err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1521
1.16k
            src_lmext, imm_msb, dinfo);
1522
1523
1.16k
  if ((sc == 0) && (shift != 0))
1524
278
    dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1525
883
  else if (sc == 1)
1526
291
    {
1527
291
      if (shift)
1528
260
  dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1529
31
      else
1530
31
  dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1531
291
    }
1532
592
  else if (sc == 2)
1533
302
    {
1534
302
      if (shift)
1535
101
  dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1536
201
      else
1537
201
  dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1538
302
    }
1539
290
  else if (sc == 3)
1540
158
    dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1541
1542
1.16k
  dinfo->fprintf_func (dinfo->stream, "]");
1543
1544
1.16k
  if (load_cc)
1545
262
    dinfo->fprintf_func (dinfo->stream, ", load_cc");
1546
1.16k
  if (gpr_wrboth)
1547
221
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1548
1.16k
  if (pred_cc)
1549
320
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1550
1551
1.16k
  if (err)
1552
0
    return _NFP_ERR_CONT;
1553
1.16k
  return 0;
1554
1.16k
}
1555
1556
static int
1557
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
1558
9.12k
{
1559
9.12k
  unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1560
9.12k
  unsigned int defer = _BF (instr, 21, 20);
1561
9.12k
  unsigned int no_load = _BTST (instr, 19);
1562
9.12k
  unsigned int resume = _BTST (instr, 18);
1563
9.12k
  unsigned int bpt = _BTST (instr, 17);
1564
9.12k
  unsigned int sig_or = _BTST (instr, 16);
1565
9.12k
  unsigned int ev_mask = _BF (instr, 15, 0);
1566
1567
9.12k
  dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1568
9.12k
  if (bpt)
1569
4.36k
    dinfo->fprintf_func (dinfo->stream, "bpt");
1570
4.75k
  else if (ev_mask == 1)
1571
11
    dinfo->fprintf_func (dinfo->stream, "voluntary");
1572
4.74k
  else if ((!no_load) && (ev_mask == 0))
1573
273
    {
1574
273
      dinfo->fprintf_func (dinfo->stream, "kill");
1575
273
      sig_or = 0;
1576
273
    }
1577
4.47k
  else if (ev_mask == 0)
1578
47
    dinfo->fprintf_func (dinfo->stream, "--");
1579
4.42k
  else
1580
4.42k
    {
1581
4.42k
      int first_print = 1;
1582
4.42k
      unsigned int n;
1583
1584
70.7k
      for (n = 1; n < 16; n++)
1585
66.3k
  {
1586
66.3k
    if (!_BTST (ev_mask, n))
1587
35.7k
      continue;
1588
30.6k
    dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1589
30.6k
             (first_print) ? "" : ", ", n);
1590
30.6k
    first_print = 0;
1591
30.6k
  }
1592
4.42k
    }
1593
1594
9.12k
  dinfo->fprintf_func (dinfo->stream, "]");
1595
1596
9.12k
  if (sig_or)
1597
4.09k
    dinfo->fprintf_func (dinfo->stream, ", any");
1598
9.12k
  if (resume)
1599
5.04k
    dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1600
9.12k
  if (defer)
1601
6.69k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1602
1603
9.12k
  return 0;
1604
9.12k
}
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
967
{
1611
967
  unsigned int srcA = _BF (instr, 9, 0);
1612
967
  unsigned int srcB = _BF (instr, 19, 10);
1613
967
  unsigned int wr = _BTST (instr, 21);
1614
967
  unsigned int csr_num = _BF (instr, 32, 22);
1615
967
  unsigned int src = srcA;
1616
967
  char src_bank = 'A';
1617
967
  bool err = false;
1618
1619
967
  if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1620
156
    {
1621
156
      src_bank = 'B';
1622
156
      src = srcB;
1623
156
    }
1624
1625
  /* MEv28 does not have urd/uwr.  */
1626
967
  if (csr_num == 1)
1627
16
    {
1628
16
      if (wr)
1629
6
  {
1630
6
    dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1631
6
             (int) _BTST (instr, 20));
1632
6
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1633
6
               src_lmext, dinfo);
1634
6
  }
1635
10
      else
1636
10
  {
1637
10
    dinfo->fprintf_func (dinfo->stream, "urd[");
1638
10
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1639
10
               src_lmext, dinfo);
1640
10
    dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1641
10
             (int) _BTST (instr, 20));
1642
10
  }
1643
16
      dinfo->fprintf_func (dinfo->stream, "]");
1644
16
    }
1645
951
  else
1646
951
    {
1647
951
      const char *nm = NULL;
1648
1649
951
      if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1650
93
  nm = nfp_me27_28_mecsrs[csr_num];
1651
1652
951
      dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1653
951
         (wr) ? "wr" : "rd");
1654
951
      if (nm)
1655
89
  dinfo->fprintf_func (dinfo->stream, "%s", nm);
1656
862
      else
1657
862
  dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1658
1659
951
      if (wr)
1660
294
  {
1661
294
    dinfo->fprintf_func (dinfo->stream, ", ");
1662
294
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1663
294
               src_lmext, dinfo);
1664
294
  }
1665
951
      dinfo->fprintf_func (dinfo->stream, "]");
1666
951
    }
1667
1668
967
  if (err)
1669
32
    return _NFP_ERR_CONT;
1670
935
  return 0;
1671
967
}
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
74
{
1678
74
  unsigned int br_op = _BF (instr, 4, 0);
1679
74
  unsigned int ctx_sig_state = _BF (instr, 17, 14);
1680
74
  unsigned int defer = _BF (instr, 21, 20);
1681
74
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1682
74
  int ret = 0;
1683
1684
74
  if (!nfp_me27_28_br_ops[br_op])
1685
18
    {
1686
18
      dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
1687
18
      ret = _NFP_ERR_CONT;
1688
18
    }
1689
56
  else
1690
56
    dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1691
1692
74
  switch (br_op)
1693
74
    {
1694
15
    case 16:      /* br=ctx */
1695
23
    case 17:      /* br!=ctx */
1696
29
    case 18:      /* br_signal */
1697
33
    case 19:      /* br_!signal */
1698
33
      dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1699
33
      break;
1700
6
    case 20:      /* "br_inp_state" */
1701
7
    case 21:      /* "br_!inp_state" */
1702
7
      dinfo->fprintf_func (dinfo->stream, "%s, ",
1703
7
         br_inpstates[ctx_sig_state]);
1704
7
      break;
1705
7
    case 22:      /* "br_cls_state" */
1706
15
    case 23:      /* "br_!cls_state" */
1707
15
      dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1708
15
         ctx_sig_state);
1709
15
      break;
1710
19
    default:
1711
19
      break;
1712
74
    }
1713
1714
74
  dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1715
1716
74
  if (defer)
1717
28
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1718
1719
74
  return ret;
1720
74
}
1721
1722
static int
1723
nfp_me27_28_print_br_byte (uint64_t instr,
1724
         unsigned int src_lmext, int num_ctx,
1725
         struct disassemble_info *dinfo)
1726
7.99k
{
1727
7.99k
  unsigned int srcA = _BF (instr, 7, 0);
1728
7.99k
  unsigned int by = _BF (instr, 9, 8);
1729
7.99k
  unsigned int srcB = _BF (instr, 17, 10);
1730
7.99k
  unsigned int imm_msb = _BTST (instr, 18);
1731
7.99k
  unsigned int eq = _BTST (instr, 19);
1732
7.99k
  unsigned int defer = _BF (instr, 21, 20);
1733
7.99k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1734
7.99k
  bool err = false;
1735
1736
7.99k
  if (eq)
1737
3.94k
    dinfo->fprintf_func (dinfo->stream, "br=byte[");
1738
4.05k
  else
1739
4.05k
    dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1740
1741
7.99k
  if (nfp_me_is_imm_opnd8 (srcA))
1742
2.95k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1743
2.95k
              src_lmext, imm_msb, dinfo);
1744
5.04k
  else
1745
5.04k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1746
5.04k
              src_lmext, imm_msb, dinfo);
1747
1748
7.99k
  dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1749
1750
7.99k
  if (nfp_me_is_imm_opnd8 (srcA))
1751
2.95k
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1752
2.95k
              src_lmext, imm_msb, dinfo);
1753
5.04k
  else
1754
5.04k
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1755
5.04k
              src_lmext, imm_msb, dinfo);
1756
1757
7.99k
  dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1758
1759
7.99k
  if (defer)
1760
3.55k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1761
1762
7.99k
  if (err)
1763
0
    return _NFP_ERR_CONT;
1764
7.99k
  return 0;
1765
7.99k
}
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
3.14k
{
1771
3.14k
  unsigned int srcA = _BF (instr, 7, 0);
1772
3.14k
  unsigned int srcB = _BF (instr, 17, 10);
1773
3.14k
  unsigned int b = _BTST (instr, 18);
1774
3.14k
  unsigned int defer = _BF (instr, 21, 20);
1775
3.14k
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1776
3.14k
  bool err = false;
1777
1778
3.14k
  if (b)
1779
2.12k
    dinfo->fprintf_func (dinfo->stream, "br_bset[");
1780
1.02k
  else
1781
1.02k
    dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1782
1783
3.14k
  if (nfp_me_is_imm_opnd8 (srcA))
1784
377
    {
1785
377
      err = err
1786
377
  || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1787
377
      b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1788
377
    }
1789
2.76k
  else
1790
2.76k
    {
1791
2.76k
      err = err
1792
2.76k
  || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1793
2.76k
      b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1794
2.76k
    }
1795
1796
3.14k
  dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1797
1798
3.14k
  if (defer)
1799
2.43k
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1800
1801
3.14k
  if (err)
1802
0
    return _NFP_ERR_CONT;
1803
3.14k
  return 0;
1804
3.14k
}
1805
1806
static int
1807
nfp_me27_28_print_br_alu (uint64_t instr, unsigned int src_lmext,
1808
        int num_ctx, struct disassemble_info *dinfo)
1809
1.10k
{
1810
1.10k
  unsigned int srcA = _BF (instr, 9, 0);
1811
1.10k
  unsigned int srcB = _BF (instr, 19, 10);
1812
1.10k
  unsigned int defer = _BF (instr, 21, 20);
1813
1.10k
  unsigned int imm = _BF (instr, 30, 22);
1814
1.10k
  bool err = false;
1815
1816
1.10k
  if (nfp_me_is_imm_opnd10 (srcA))
1817
114
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1818
987
  else
1819
987
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1820
1821
1.10k
  if (!imm)
1822
3
    dinfo->fprintf_func (dinfo->stream, "rtn[");
1823
1.09k
  else
1824
1.09k
    dinfo->fprintf_func (dinfo->stream, "jump[");
1825
1826
1.10k
  if (nfp_me_is_imm_opnd10 (srcA))
1827
114
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1828
987
  else
1829
987
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1830
1831
1.10k
  if (imm)
1832
1.09k
    dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1833
1834
1.10k
  dinfo->fprintf_func (dinfo->stream, "]");
1835
1836
1.10k
  if (defer)
1837
452
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1838
1839
1.10k
  if (err)
1840
89
    return _NFP_ERR_CONT;
1841
1.01k
  return 0;
1842
1.10k
}
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
492
{
1850
492
  unsigned int srcA = _BF (instr, 9, 0);
1851
492
  unsigned int srcB = _BF (instr, 19, 10);
1852
492
  unsigned int mstep = _BF (instr, 22, 20);
1853
492
  char dst_bank = 'A' + _BTST (instr, 23);
1854
492
  unsigned int swap = _BTST (instr, 30);
1855
492
  unsigned int mtype = _BF (instr, 32, 31);
1856
492
  unsigned int nocc = _BTST (instr, 40);
1857
492
  bool err = false;
1858
1859
492
  if (swap)
1860
60
    {
1861
60
      unsigned int tmp = srcA;
1862
60
      srcA = srcB;
1863
60
      srcB = tmp;
1864
60
    }
1865
1866
492
  dinfo->fprintf_func (dinfo->stream, "mul_step[");
1867
1868
492
  if (mstep >= 4)
1869
228
    err = err
1870
228
      || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1871
264
  else
1872
264
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1873
264
               src_lmext, dinfo);
1874
1875
492
  dinfo->fprintf_func (dinfo->stream, ", ");
1876
1877
492
  if (mstep >= 4)
1878
228
    dinfo->fprintf_func (dinfo->stream, "--");
1879
264
  else
1880
264
    err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1881
227
               src_lmext, dinfo);
1882
1883
492
  dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1884
492
  if (mtype > 0)
1885
407
    {
1886
407
      const char *s = nfp_me27_28_mult_steps[mstep];
1887
407
      if (!s)
1888
191
  {
1889
191
    s = "<invalid mul_step>";
1890
191
    err = true;
1891
191
  }
1892
407
      dinfo->fprintf_func (dinfo->stream, "_%s", s);
1893
407
    }
1894
1895
492
  if (nocc)
1896
245
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1897
492
  if (gpr_wrboth)
1898
228
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1899
492
  if (pred_cc)
1900
254
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1901
1902
492
  if (err)
1903
240
    return _NFP_ERR_CONT;
1904
252
  return 0;
1905
492
}
1906
1907
static int
1908
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1909
2.26M
{
1910
2.26M
  const nfp_cmd_mnemonic *a = arg_a;
1911
2.26M
  const nfp_cmd_mnemonic *b = arg_b;
1912
1913
2.26M
  if (a->cpp_target != b->cpp_target)
1914
969k
    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
699k
    return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1918
1919
595k
  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
258k
{
1928
258k
  nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1929
258k
  const nfp_cmd_mnemonic *cmd = NULL;
1930
1931
258k
  cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1932
258k
     sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1933
1934
258k
  if (!cmd)
1935
83.2k
    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
185k
  while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1940
9.83k
    --cmd;
1941
1942
  /* Now compare by cpp_len and make sure we stay in range.  */
1943
189k
  for (; (cmd < (mnemonics + mnemonics_cnt))
1944
189k
       && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1945
187k
    {
1946
187k
      if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1947
173k
  return cmd->mnemonic;
1948
187k
    }
1949
1950
2.33k
  return NULL;
1951
175k
}
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
22.2k
{
1959
22.2k
  unsigned int srcA = _BF (instr, 7, 0);
1960
22.2k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
1961
22.2k
  unsigned int srcB = _BF (instr, 17, 10);
1962
22.2k
  unsigned int token = _BF (instr, 19, 18);
1963
22.2k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1964
22.2k
  unsigned int cpp_len = _BF (instr, 27, 25);
1965
22.2k
  unsigned int sig = _BF (instr, 31, 28);
1966
22.2k
  unsigned int tgtcmd = _BF (instr, 38, 32);
1967
22.2k
  unsigned int indref = _BTST (instr, 41);
1968
22.2k
  unsigned int mode = _BF (instr, 44, 42);
1969
1970
22.2k
  bool err = false;
1971
22.2k
  int cpp_target = -1;
1972
22.2k
  int cpp_action = -1;
1973
22.2k
  const char *mnemonic = NULL;
1974
22.2k
  unsigned int imm;
1975
22.2k
  unsigned int valBA;
1976
22.2k
  int visswap = ((mode == 1) || (mode == 3));
1977
1978
22.2k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1979
22.2k
  valBA = (srcB << 8) | srcA;
1980
1981
22.2k
  if (mode == 6)
1982
2.18k
    {
1983
2.18k
      token = 0;
1984
2.18k
      sig = 0;
1985
2.18k
      xfer = 0;
1986
2.18k
    }
1987
1988
  /* Convert tgtcmd to action/token tuple.  */
1989
22.2k
  if (_BF (tgtcmd, 6, 5) == 0x0)
1990
10.9k
    {
1991
10.9k
      switch (_BF (tgtcmd, 4, 2))
1992
10.9k
  {
1993
6.85k
  case 0:
1994
6.85k
    cpp_target = NFP_3200_CPPTGT_CAP;
1995
6.85k
    dinfo->fprintf_func (dinfo->stream, "cap[");
1996
6.85k
    break;
1997
576
  case 1:
1998
576
    cpp_target = NFP_3200_CPPTGT_MSF0;
1999
576
    dinfo->fprintf_func (dinfo->stream, "msf0[");
2000
576
    break;
2001
1.23k
  case 2:
2002
1.23k
    cpp_target = NFP_3200_CPPTGT_MSF1;
2003
1.23k
    dinfo->fprintf_func (dinfo->stream, "msf1[");
2004
1.23k
    break;
2005
491
  case 3:
2006
491
    cpp_target = NFP_3200_CPPTGT_PCIE;
2007
491
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2008
491
    break;
2009
672
  case 4:
2010
672
    cpp_target = NFP_3200_CPPTGT_HASH;
2011
672
    break;
2012
309
  case 5:
2013
309
    cpp_target = NFP_3200_CPPTGT_CRYPTO;
2014
309
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2015
309
    break;
2016
419
  case 6:
2017
419
    cpp_target = NFP_3200_CPPTGT_ARM;
2018
419
    dinfo->fprintf_func (dinfo->stream, "arm[");
2019
419
    break;
2020
395
  case 7:
2021
395
    cpp_target = NFP_3200_CPPTGT_CT;
2022
395
    dinfo->fprintf_func (dinfo->stream, "ct[");
2023
395
    break;
2024
10.9k
  }
2025
10.9k
      cpp_action = _BF (tgtcmd, 1, 0);
2026
10.9k
    }
2027
11.3k
  else
2028
11.3k
    {
2029
11.3k
      switch (_BF (tgtcmd, 6, 4))
2030
11.3k
  {
2031
2.12k
  case 2:
2032
2.12k
    cpp_target = NFP_3200_CPPTGT_GS;
2033
2.12k
    dinfo->fprintf_func (dinfo->stream, "scratch[");
2034
2.12k
    break;
2035
1.96k
  case 3:
2036
1.96k
    cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM.  */
2037
1.96k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2038
1.96k
    break;
2039
1.98k
  case 4:
2040
3.62k
  case 5:
2041
3.62k
    cpp_target = NFP_3200_CPPTGT_MU;
2042
3.62k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2043
3.62k
    break;
2044
2.00k
  case 6:
2045
3.60k
  case 7:
2046
3.60k
    cpp_target = NFP_3200_CPPTGT_CLS;
2047
3.60k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2048
3.60k
    break;
2049
11.3k
  }
2050
11.3k
      cpp_action = _BF (tgtcmd, 3, 0);
2051
11.3k
    }
2052
2053
22.2k
  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
22.2k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2061
22.2k
           nfp_me27_mnemonics,
2062
22.2k
           ARRAY_SIZE (nfp_me27_mnemonics));
2063
2064
22.2k
  if (!mnemonic)
2065
5.27k
    {
2066
5.27k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2067
5.27k
         cpp_target, cpp_action, token);
2068
5.27k
      return _NFP_ERR_CONT;
2069
5.27k
    }
2070
2071
16.9k
  if (cpp_target == NFP_3200_CPPTGT_HASH)
2072
277
    {
2073
277
      dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2074
277
         mnemonic, xfer, cpp_len);
2075
277
      goto print_opt_toks;
2076
277
    }
2077
2078
16.7k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2079
2080
16.7k
  if (visswap)
2081
3.62k
    {
2082
3.62k
      unsigned int tmp = srcA;
2083
3.62k
      srcA = srcB;
2084
3.62k
      srcB = tmp;
2085
3.62k
    }
2086
2087
16.7k
  switch (mode)
2088
16.7k
    {
2089
5.98k
    case 0:     /* (A << 8) + B.  */
2090
7.90k
    case 1:     /* (B << 8) + A.  */
2091
7.90k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2092
7.90k
      err = err
2093
7.90k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2094
7.90k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2095
7.90k
      err = err
2096
7.90k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2097
7.90k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2098
7.90k
      break;
2099
1.24k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2100
2.94k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2101
2.94k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2102
2.94k
      err = err
2103
2.94k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2104
2.94k
      if (third_party_32bit)
2105
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2106
2.94k
      else
2107
2.94k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2108
2.94k
      err = err
2109
2.94k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2110
2.94k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2111
2.94k
      break;
2112
1.66k
    case 4:     /* A + B.  */
2113
1.66k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2114
1.66k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2115
1.66k
      dinfo->fprintf_func (dinfo->stream, ", ");
2116
1.66k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2117
1.66k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2118
1.66k
      break;
2119
963
    case 5:     /* Immediate address.  */
2120
963
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2121
963
         (cpp_len + 1));
2122
963
      break;
2123
2.05k
    case 6:     /* Immediate address and data.  */
2124
2.05k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2125
2.05k
      break;
2126
1.18k
    case 7:     /* Immediate data.  */
2127
1.18k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2128
1.18k
         ((xfer << 16) | valBA), (cpp_len + 1));
2129
1.18k
      break;
2130
16.7k
    }
2131
2132
16.9k
 print_opt_toks:
2133
16.9k
  dinfo->fprintf_func (dinfo->stream, "]");
2134
2135
16.9k
  if (indref && (mode != 2) && (mode != 3))
2136
3.81k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2137
2138
16.9k
  if (ctxswap_defer != 3)
2139
14.0k
    {
2140
14.0k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2141
14.0k
      if (sig)
2142
7.62k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2143
6.40k
      else
2144
6.40k
  dinfo->fprintf_func (dinfo->stream, "--]");
2145
2146
14.0k
      if (ctxswap_defer != 0)
2147
6.41k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2148
14.0k
    }
2149
2.96k
  else if (sig)
2150
1.82k
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2151
2152
16.9k
  if (err)
2153
0
    return _NFP_ERR_CONT;
2154
16.9k
  return 0;
2155
16.9k
}
2156
2157
static int
2158
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
2159
      struct disassemble_info *dinfo)
2160
441
{
2161
441
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2162
441
}
2163
2164
static int
2165
nfp_me27_print_alu (uint64_t instr, int num_ctx,
2166
        struct disassemble_info *dinfo)
2167
401
{
2168
401
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2169
401
}
2170
2171
static int
2172
nfp_me27_print_immed (uint64_t instr, int num_ctx,
2173
          struct disassemble_info *dinfo)
2174
26
{
2175
26
  return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2176
26
}
2177
2178
static int
2179
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
2180
       struct disassemble_info *dinfo)
2181
33
{
2182
33
  return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2183
33
}
2184
2185
static int
2186
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2187
776
{
2188
776
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2189
776
}
2190
2191
static int
2192
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
2193
        struct disassemble_info *dinfo)
2194
23
{
2195
23
  return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2196
23
}
2197
2198
static int
2199
nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2200
7
{
2201
7
  return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
2202
7
}
2203
2204
static int
2205
nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
2206
      struct disassemble_info *dinfo)
2207
1.25k
{
2208
1.25k
  return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2209
1.25k
}
2210
2211
static int
2212
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
2213
           struct disassemble_info *dinfo)
2214
223
{
2215
223
  return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2216
223
}
2217
2218
static int
2219
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
2220
           struct disassemble_info *dinfo)
2221
18
{
2222
18
  return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2223
18
}
2224
2225
static int
2226
nfp_me27_print_mult (uint64_t instr, int num_ctx,
2227
         struct disassemble_info *dinfo)
2228
16
{
2229
16
  return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2230
16
}
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
271k
{
2238
271k
  unsigned int srcA = _BF (instr, 7, 0);
2239
271k
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
2240
271k
  unsigned int srcB = _BF (instr, 17, 10);
2241
271k
  unsigned int token = _BF (instr, 19, 18);
2242
271k
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2243
271k
  unsigned int cpp_len = _BF (instr, 27, 25);
2244
271k
  unsigned int sig = _BF (instr, 31, 28);
2245
271k
  unsigned int tgtcmd = _BF (instr, 38, 32);
2246
271k
  unsigned int indref = _BTST (instr, 41);
2247
271k
  unsigned int mode = _BF (instr, 44, 42);
2248
2249
271k
  bool err = false;
2250
271k
  int cpp_target = -1;
2251
271k
  int cpp_action = -1;
2252
271k
  const char *mnemonic = NULL;
2253
271k
  unsigned int imm;
2254
271k
  unsigned int valBA;
2255
271k
  int visswap = ((mode == 1) || (mode == 3));
2256
2257
271k
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2258
271k
  valBA = (srcB << 8) | srcA;
2259
2260
271k
  if (mode == 6)
2261
14.8k
    {
2262
14.8k
      token = 0;
2263
14.8k
      sig = 0;
2264
14.8k
      xfer = 0;
2265
14.8k
    }
2266
2267
  /* Convert tgtcmd to action/token tuple.  */
2268
271k
  if (_BF (tgtcmd, 6, 5) == 0x0)
2269
139k
    {
2270
139k
      switch (_BF (tgtcmd, 4, 2))
2271
139k
  {
2272
92.9k
  case 0:
2273
92.9k
    cpp_target = NFP_6000_CPPTGT_ILA;
2274
92.9k
    dinfo->fprintf_func (dinfo->stream, "ila[");
2275
92.9k
    break;
2276
11.1k
  case 1:
2277
11.1k
    cpp_target = NFP_6000_CPPTGT_NBI;
2278
11.1k
    dinfo->fprintf_func (dinfo->stream, "nbi[");
2279
11.1k
    break;
2280
7.00k
  case 3:
2281
7.00k
    cpp_target = NFP_6000_CPPTGT_PCIE;
2282
7.00k
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2283
7.00k
    break;
2284
3.17k
  case 5:
2285
3.17k
    cpp_target = NFP_6000_CPPTGT_CRYPTO;
2286
3.17k
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2287
3.17k
    break;
2288
3.66k
  case 6:
2289
3.66k
    cpp_target = NFP_6000_CPPTGT_ARM;
2290
3.66k
    dinfo->fprintf_func (dinfo->stream, "arm[");
2291
3.66k
    break;
2292
3.91k
  case 7:
2293
3.91k
    cpp_target = NFP_6000_CPPTGT_CTXPB;
2294
3.91k
    dinfo->fprintf_func (dinfo->stream, "ct[");
2295
3.91k
    break;
2296
139k
  }
2297
139k
      cpp_action = _BF (tgtcmd, 1, 0);
2298
139k
    }
2299
131k
  else
2300
131k
    {
2301
      /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2302
   for mem/cls it's "a".  */
2303
131k
      cpp_action = _BF (tgtcmd, 4, 0);
2304
131k
      switch (_BF (tgtcmd, 6, 4))
2305
131k
  {
2306
16.7k
  case 3:
2307
16.7k
    cpp_target = NFP_6000_CPPTGT_VQDR;
2308
16.7k
    cpp_action = _BF (tgtcmd, 3, 0);
2309
16.7k
    dinfo->fprintf_func (dinfo->stream, "sram[");
2310
16.7k
    break;
2311
20.9k
  case 4:
2312
38.2k
  case 5:
2313
38.2k
    cpp_target = NFP_6000_CPPTGT_MU;
2314
38.2k
    dinfo->fprintf_func (dinfo->stream, "mem[");
2315
38.2k
    break;
2316
33.4k
  case 6:
2317
59.5k
  case 7:
2318
59.5k
    cpp_target = NFP_6000_CPPTGT_CLS;
2319
59.5k
    dinfo->fprintf_func (dinfo->stream, "cls[");
2320
59.5k
    break;
2321
131k
  }
2322
131k
    }
2323
2324
271k
  if (cpp_target < 0)
2325
34.8k
    {
2326
34.8k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2327
34.8k
         cpp_target, cpp_action, token);
2328
34.8k
      return _NFP_ERR_CONT;
2329
34.8k
    }
2330
2331
236k
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2332
236k
           nfp_me28_mnemonics,
2333
236k
           ARRAY_SIZE (nfp_me28_mnemonics));
2334
2335
236k
  if (!mnemonic)
2336
80.2k
    {
2337
80.2k
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2338
80.2k
         cpp_target, cpp_action, token);
2339
80.2k
      return _NFP_ERR_CONT;
2340
80.2k
    }
2341
2342
156k
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2343
2344
156k
  if (visswap)
2345
29.0k
    {
2346
29.0k
      unsigned int tmp = srcA;
2347
29.0k
      srcA = srcB;
2348
29.0k
      srcB = tmp;
2349
29.0k
    }
2350
2351
156k
  switch (mode)
2352
156k
    {
2353
69.3k
    case 0:     /* (A << 8) + B.  */
2354
85.2k
    case 1:     /* (B << 8) + A.  */
2355
85.2k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2356
85.2k
      err = err
2357
85.2k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2358
85.2k
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2359
85.2k
      err = err
2360
85.2k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2361
85.2k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2362
85.2k
      break;
2363
13.8k
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2364
26.9k
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2365
26.9k
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2366
26.9k
      err = err
2367
26.9k
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2368
26.9k
      if (third_party_32bit)
2369
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2370
26.9k
      else
2371
26.9k
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2372
26.9k
      err = err
2373
26.9k
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2374
26.9k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2375
26.9k
      break;
2376
15.0k
    case 4:     /* A + B.  */
2377
15.0k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2378
15.0k
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2379
15.0k
      dinfo->fprintf_func (dinfo->stream, ", ");
2380
15.0k
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2381
15.0k
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2382
15.0k
      break;
2383
8.79k
    case 5:     /* Immediate address.  */
2384
8.79k
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2385
8.79k
         (cpp_len + 1));
2386
8.79k
      break;
2387
8.80k
    case 6:     /* Immediate address and data.  */
2388
8.80k
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2389
8.80k
      break;
2390
11.1k
    case 7:     /* Immediate data.  */
2391
11.1k
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2392
11.1k
         ((xfer << 16) | valBA), (cpp_len + 1));
2393
11.1k
      break;
2394
156k
    }
2395
2396
156k
  dinfo->fprintf_func (dinfo->stream, "]");
2397
2398
156k
  if (indref && (mode != 2) && (mode != 3))
2399
40.0k
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2400
2401
156k
  if (ctxswap_defer != 3)
2402
129k
    {
2403
129k
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2404
129k
      if (sig)
2405
61.0k
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2406
68.2k
      else
2407
68.2k
  dinfo->fprintf_func (dinfo->stream, "--]");
2408
2409
129k
      if (ctxswap_defer != 0)
2410
54.5k
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2411
129k
    }
2412
26.7k
  else if (sig)
2413
18.1k
    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
31.8k
{
2424
31.8k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2425
31.8k
  unsigned int src_lmext = _BTST (instr, 42);
2426
31.8k
  unsigned int dst_lmext = _BTST (instr, 43);
2427
31.8k
  unsigned int pred_cc = _BTST (instr, 44);
2428
2429
31.8k
  return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2430
31.8k
            src_lmext, gpr_wrboth, num_ctx, dinfo);
2431
31.8k
}
2432
2433
static int
2434
nfp_me28_print_alu (uint64_t instr, int num_ctx,
2435
        struct disassemble_info *dinfo)
2436
30.0k
{
2437
30.0k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2438
30.0k
  unsigned int src_lmext = _BTST (instr, 42);
2439
30.0k
  unsigned int dst_lmext = _BTST (instr, 43);
2440
30.0k
  unsigned int pred_cc = _BTST (instr, 44);
2441
2442
30.0k
  return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2443
30.0k
        gpr_wrboth, num_ctx, dinfo);
2444
30.0k
}
2445
2446
static int
2447
nfp_me28_print_immed (uint64_t instr, int num_ctx,
2448
          struct disassemble_info *dinfo)
2449
3.91k
{
2450
3.91k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2451
3.91k
  unsigned int dst_lmext = _BTST (instr, 43);
2452
3.91k
  unsigned int pred_cc = _BTST (instr, 44);
2453
2454
3.91k
  return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2455
3.91k
          num_ctx, dinfo);
2456
3.91k
}
2457
2458
static int
2459
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
2460
       struct disassemble_info *dinfo)
2461
1.12k
{
2462
1.12k
  unsigned int gpr_wrboth = _BTST (instr, 41);
2463
1.12k
  unsigned int src_lmext = _BTST (instr, 42);
2464
1.12k
  unsigned int dst_lmext = _BTST (instr, 43);
2465
1.12k
  unsigned int pred_cc = _BTST (instr, 44);
2466
2467
1.12k
  return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2468
1.12k
             src_lmext, gpr_wrboth, num_ctx, dinfo);
2469
1.12k
}
2470
2471
static int
2472
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2473
8.34k
{
2474
8.34k
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2475
8.34k
}
2476
2477
static int
2478
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
2479
        struct disassemble_info *dinfo)
2480
944
{
2481
944
  unsigned int src_lmext = _BTST (instr, 42);
2482
2483
944
  return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2484
944
}
2485
2486
static int
2487
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2488
67
{
2489
67
  return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2490
67
}
2491
2492
static int
2493
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
2494
      struct disassemble_info *dinfo)
2495
6.73k
{
2496
6.73k
  unsigned int src_lmext = _BTST (instr, 42);
2497
6.73k
  return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2498
6.73k
}
2499
2500
static int
2501
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
2502
           struct disassemble_info *dinfo)
2503
2.92k
{
2504
2.92k
  unsigned int src_lmext = _BTST (instr, 42);
2505
2.92k
  return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2506
2.92k
}
2507
2508
static int
2509
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
2510
           struct disassemble_info *dinfo)
2511
1.08k
{
2512
1.08k
  unsigned int src_lmext = _BTST (instr, 42);
2513
1.08k
  return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2514
1.08k
}
2515
2516
static int
2517
nfp_me28_print_mult (uint64_t instr, int num_ctx,
2518
         struct disassemble_info *dinfo)
2519
476
{
2520
476
  unsigned int gpr_wrboth = _BTST (instr, 41);
2521
476
  unsigned int src_lmext = _BTST (instr, 42);
2522
476
  unsigned int dst_lmext = _BTST (instr, 43);
2523
476
  unsigned int pred_cc = _BTST (instr, 44);
2524
2525
476
  return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2526
476
         gpr_wrboth, num_ctx, dinfo);
2527
476
}
2528
2529
static bool
2530
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2531
161
{
2532
161
  Elf_Internal_Shdr *sec = NULL;
2533
161
  Elf_Nfp_MeConfig mecfg_ent;
2534
161
  unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2535
161
  file_ptr roff = 0;
2536
161
  unsigned int sec_cnt = 0;
2537
161
  unsigned int sec_idx;
2538
161
  size_t menum_linear = 0;
2539
2540
161
  if (!dinfo->section)
2541
    /* No section info, will use default values.  */
2542
161
    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
511
{
2678
511
  int mecfg_orders[64][2];
2679
511
  size_t isl;
2680
511
  unsigned int sec_cnt = 0;
2681
511
  unsigned int sec_idx;
2682
511
  bool is_for_text;
2683
2684
511
  memset (mecfg_orders, -1, sizeof (mecfg_orders));
2685
2686
511
  if (dinfo->section == NULL
2687
511
      || dinfo->section->owner == NULL
2688
511
      || elf_elfsections (dinfo->section->owner) == NULL)
2689
    /* No section info, will use default values.  */
2690
511
    return true;
2691
2692
0
  sec_cnt = elf_numsections (dinfo->section->owner);
2693
2694
  /* Go through all MECSR init sections to find ME configs.  */
2695
0
  for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2696
0
    {
2697
0
      Elf_Internal_Shdr *sec;
2698
0
      int sec_order;
2699
2700
0
      sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2701
0
      sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
2702
2703
0
      is_for_text = (sec->sh_flags & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2704
2705
      /* If we have an init2 section, that is the one that applies to the
2706
   ME when executing init code.  So we make it's order higher than
2707
   any plain init section.  */
2708
0
      if (sec->sh_flags & SHF_NFP_INIT2)
2709
0
  sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
2710
2711
0
      if (sec->sh_type != SHT_NFP_INITREG)
2712
0
  continue;
2713
0
      if (!SHI_NFP_6000_IS_IREG_MECSR (sec->sh_info))
2714
0
  continue;
2715
2716
0
      isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2717
0
      if ((sec_order < mecfg_orders[isl][is_for_text]))
2718
  /* Lower order or transient, skip it.  */
2719
0
  continue;
2720
2721
0
      mecfg_orders[isl][is_for_text] = sec_order;
2722
2723
0
      if (!init_nfp6000_mecsr_sec (priv, sec, is_for_text, dinfo))
2724
0
  {
2725
0
    dinfo->fprintf_func (dinfo->stream,
2726
0
             _("Error processing section %u "), sec_idx);
2727
0
    return false;
2728
0
  }
2729
0
    }
2730
2731
0
  return true;
2732
0
}
2733
2734
static int
2735
parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
2736
448k
{
2737
448k
  const char *option;
2738
2739
448k
  if (dinfo->disassembler_options == NULL)
2740
448k
    return 0;
2741
2742
0
  FOR_EACH_DISASSEMBLER_OPTION (option, dinfo->disassembler_options)
2743
0
  {
2744
0
    if (disassembler_options_cmp (option, "no-pc") == 0)
2745
0
      opts->show_pc = 0;
2746
0
    else if (disassembler_options_cmp (option, "ctx4") == 0)
2747
0
      {
2748
0
  if (!opts->ctx_mode)
2749
0
    opts->ctx_mode = 4;
2750
0
      }
2751
0
    else if (disassembler_options_cmp (option, "ctx8") == 0)
2752
0
      opts->ctx_mode = 8;
2753
0
    else
2754
0
      {
2755
0
  dinfo->fprintf_func (dinfo->stream, _("Invalid NFP option: %s"), option);
2756
0
  return _NFP_ERR_STOP;
2757
0
      }
2758
0
  }
2759
2760
0
  return 0;
2761
0
}
2762
2763
/* Called on first disassembly attempt so that dinfo->section is valid
2764
   so that we can get the bfd owner to find ME configs.  */
2765
2766
static nfp_priv_data *
2767
init_nfp_priv (struct disassemble_info *dinfo)
2768
448k
{
2769
448k
  nfp_priv_data *priv;
2770
448k
  int ret = false;
2771
2772
448k
  if (dinfo->private_data)
2773
446k
    return (nfp_priv_data *) dinfo->private_data;
2774
2775
#if 0  /* Right now only section-related info is kept in priv.
2776
    So don't even calloc it if we don't need it.  */
2777
  if (!dinfo->section)
2778
     return NULL;
2779
#endif
2780
2781
  /* Alloc with no free, seems to be either this or a static global variable
2782
     and this at least keeps a large struct unallocated until really needed.  */
2783
2.17k
  priv = calloc (1, sizeof (*priv));
2784
2.17k
  if (!priv)
2785
0
    return NULL;
2786
2787
2.17k
  switch (dinfo->mach)
2788
2.17k
    {
2789
161
    case E_NFP_MACH_3200:
2790
161
      ret = init_nfp3200_priv (priv, dinfo);
2791
161
      break;
2792
511
    case E_NFP_MACH_6000:
2793
511
      ret = init_nfp6000_priv (priv, dinfo);
2794
511
      break;
2795
2.17k
    }
2796
2797
2.17k
  if (!ret)
2798
1.49k
    {
2799
1.49k
      free (priv);
2800
1.49k
      return NULL;
2801
1.49k
    }
2802
2803
672
  dinfo->private_data = priv;
2804
672
  return priv;
2805
2.17k
}
2806
2807
static int
2808
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2809
448k
{
2810
448k
  nfp_priv_data *priv = init_nfp_priv (dinfo);
2811
448k
  bfd_byte buffer[8];
2812
448k
  int err;
2813
448k
  uint64_t instr = 0;
2814
448k
  size_t island, menum;
2815
448k
  int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2816
448k
  int is_text = 1;
2817
2818
448k
  err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2819
448k
  if (err)
2820
609
    return _NFP_ERR_STOP;
2821
2822
447k
  if (!dinfo->section)
2823
175k
    {
2824
175k
      num_ctx = 8;
2825
175k
      scs_cnt = 0;
2826
175k
      addr_3rdparty32 = 0;
2827
175k
    }
2828
272k
  else
2829
272k
    {
2830
272k
      unsigned int sh_info = 0;
2831
272k
      nfp_priv_mecfg *mecfg;
2832
2833
      /* We have a section, presumably all ELF sections.  Try to find
2834
   proper ME configs to produce better disassembly.  */
2835
272k
      if (!priv)
2836
0
  return _NFP_ERR_STOP; /* Sanity check */
2837
2838
272k
      is_text = (elf_section_flags (dinfo->section)
2839
272k
     & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2840
2841
272k
      sh_info = elf_section_info (dinfo->section);
2842
2843
272k
      switch (dinfo->mach)
2844
272k
  {
2845
0
  case E_NFP_MACH_3200:
2846
0
    island = SHI_NFP_3200_ISLAND (sh_info);
2847
0
    menum = SHI_NFP_3200_MENUM (sh_info);
2848
0
    break;
2849
272k
  default:
2850
272k
    island = SHI_NFP_ISLAND (sh_info);
2851
272k
    menum = SHI_NFP_MENUM (sh_info);
2852
272k
    break;
2853
272k
  }
2854
2855
272k
      if (island >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
2856
0
  {
2857
0
    dinfo->fprintf_func (dinfo->stream, "Invalid island or me.");
2858
0
    return _NFP_ERR_STOP;
2859
0
  }
2860
2861
272k
      mecfg = &priv->mecfgs[island][menum][is_text];
2862
272k
      num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2863
272k
      addr_3rdparty32 = mecfg->addr_3rdparty32;
2864
272k
      scs_cnt = mecfg->scs_cnt;
2865
272k
    }
2866
2867
447k
  if (opts->ctx_mode)
2868
0
    num_ctx = opts->ctx_mode;
2869
2870
447k
  dinfo->bytes_per_line = 8;
2871
447k
  dinfo->bytes_per_chunk = 8;
2872
2873
447k
  instr = bfd_getl64 (buffer);
2874
2875
447k
  if (opts->show_pc)
2876
447k
    {
2877
447k
      pc = (int) (addr >> 3);
2878
2879
      /* Guess max PC for formatting */
2880
447k
      tmpj = (int) (dinfo->buffer_length >> 3);
2881
447k
      if (scs_cnt == 1)
2882
0
  {
2883
0
    pc *= 2;
2884
0
    tmpj *= 2;
2885
0
    if (! !(menum & 1))
2886
0
      {
2887
0
        pc++;
2888
0
        tmpj++;
2889
0
      }
2890
0
  }
2891
2892
1.59M
      for (tmpi = 1; tmpj > 9; tmpj /= 10)
2893
1.14M
  tmpi++;
2894
2895
447k
      tmpj = pc;
2896
1.62M
      for (; tmpj > 9; tmpj /= 10)
2897
1.17M
  tmpi--;
2898
2899
447k
      dinfo->fprintf_func (dinfo->stream, "%*c%d  ", tmpi, '.', pc);
2900
447k
    }
2901
2902
447k
  switch (dinfo->mach)
2903
447k
    {
2904
33.7k
    case E_NFP_MACH_3200:
2905
33.7k
      if (NFP_ME27_INSTR_IS_CMD (instr))
2906
22.2k
  err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2907
11.4k
      else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2908
441
  err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2909
11.0k
      else if (NFP_ME27_INSTR_IS_ALU (instr))
2910
401
  err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2911
10.6k
      else if (NFP_ME27_INSTR_IS_IMMED (instr))
2912
26
  err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2913
10.6k
      else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2914
33
  err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2915
10.5k
      else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2916
776
  err = nfp_me27_print_ctx_arb (instr, dinfo);
2917
9.81k
      else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2918
23
  err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2919
9.78k
      else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2920
7
  err = nfp_me27_print_branch (instr, dinfo);
2921
9.78k
      else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2922
1.25k
  err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2923
8.52k
      else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2924
223
  err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2925
8.29k
      else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2926
18
  err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2927
8.28k
      else if (NFP_ME27_INSTR_IS_MULT (instr))
2928
16
  err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2929
8.26k
      else
2930
8.26k
  err = nfp_me_print_invalid (instr, dinfo);
2931
33.7k
      break;
2932
2933
412k
    case E_NFP_MACH_6000:
2934
412k
      if (NFP_ME28_INSTR_IS_CMD (instr))
2935
271k
  err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2936
141k
      else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2937
31.8k
  err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2938
109k
      else if (NFP_ME28_INSTR_IS_ALU (instr))
2939
30.0k
  err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2940
79.5k
      else if (NFP_ME28_INSTR_IS_IMMED (instr))
2941
3.91k
  err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2942
75.6k
      else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2943
1.12k
  err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2944
74.5k
      else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2945
8.34k
  err = nfp_me28_print_ctx_arb (instr, dinfo);
2946
66.1k
      else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2947
944
  err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2948
65.2k
      else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2949
67
  err = nfp_me28_print_branch (instr, dinfo);
2950
65.1k
      else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2951
6.73k
  err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2952
58.4k
      else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2953
2.92k
  err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2954
55.5k
      else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2955
1.08k
  err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2956
54.4k
      else if (NFP_ME28_INSTR_IS_MULT (instr))
2957
476
  err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2958
53.9k
      else
2959
53.9k
  err = nfp_me_print_invalid (instr, dinfo);
2960
412k
      break;
2961
447k
    }
2962
2963
447k
  if (err < 0)
2964
195k
    return err;
2965
252k
  return 8;
2966
447k
}
2967
2968
int
2969
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2970
448k
{
2971
448k
  nfp_opts opts;
2972
448k
  int err;
2973
2974
448k
  opts.show_pc = 1;
2975
448k
  opts.ctx_mode = 0;
2976
448k
  err = parse_disassembler_options (&opts, dinfo);
2977
448k
  if (err < 0)
2978
0
    goto end;
2979
2980
448k
  err = _print_instrs (addr, dinfo, &opts);
2981
2982
448k
 end:
2983
448k
  if (err != 8)
2984
196k
    dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2985
448k
  if (err == _NFP_ERR_CONT)
2986
195k
    return 8;
2987
252k
  return err;
2988
448k
}
2989
2990
void
2991
print_nfp_disassembler_options (FILE * stream)
2992
0
{
2993
0
  fprintf (stream, _("\n\
2994
0
The following NFP specific disassembler options are supported for use\n\
2995
0
with the -M switch (multiple options should be separated by commas):\n"));
2996
2997
0
  fprintf (stream, _("\n\
2998
0
  no-pc       Don't print program counter prefix.\n\
2999
0
  ctx4        Force disassembly using 4-context mode.\n\
3000
0
  ctx8        Force 8-context mode, takes precedence."));
3001
3002
0
  fprintf (stream, _("\n"));
3003
0
}