Coverage Report

Created: 2023-06-29 07:13

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