Coverage Report

Created: 2023-08-28 06:23

/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
0
#define _NFP_ERR_STOP -1
39
0
#define _NFP_ERR_CONT -8
40
41
0
#define _BTST(v, b)               (((v) >> b) & 1)
42
0
#define _BF(v, msb, lsb)          (((v) >> (lsb)) & \
43
0
           ((1U << ((msb) - (lsb) + 1)) - 1))
44
0
#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
0
#define _NFP_ISLAND_MAX 64
50
0
#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
0
{
930
0
  const char * err_msg = N_("<invalid_instruction>:");
931
0
  dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
932
0
  return _NFP_ERR_CONT;
933
0
}
934
935
static bool
936
nfp_me_is_imm_opnd10 (unsigned int opnd)
937
0
{
938
0
  return _BF (opnd, 9, 8) == 0x3;
939
0
}
940
941
static bool
942
nfp_me_is_imm_opnd8 (unsigned int opnd)
943
0
{
944
0
  return _BTST (opnd, 5);
945
0
}
946
947
static unsigned int
948
nfp_me_imm_opnd10 (unsigned int opnd)
949
0
{
950
0
  return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
951
0
}
952
953
static unsigned int
954
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
955
0
{
956
0
  unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
957
958
0
  return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
959
0
}
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
0
{
967
0
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
968
969
  /* Absolute GPR.  */
970
0
  if (_BF (opnd, 9, 7) == 0x1)
971
0
    dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
972
973
  /* Relative GPR.  */
974
0
  else if (_BF (opnd, 9, 6) == 0x0)
975
0
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
976
977
  /* Indexed Xfer.  */
978
0
  else if (_BF (opnd, 9, 7) == 0x2)
979
0
    {
980
0
      dinfo->fprintf_func (dinfo->stream, "*$index");
981
0
      if (_BF (opnd, 2, 1) == 0x1)
982
0
  dinfo->fprintf_func (dinfo->stream, "++");
983
0
      else if (_BF (opnd, 2, 1) == 0x2)
984
0
  dinfo->fprintf_func (dinfo->stream, "--");
985
0
    }
986
987
  /* Relative Xfer.  */
988
0
  else if (_BF (opnd, 9, 7) == 0x3)
989
0
    {
990
0
      if (_BTST (opnd, 6))
991
0
  n += (num_ctx == 8 ? 16 : 32);
992
0
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
993
0
    }
994
995
  /* Indexed Next Neighbour.  */
996
0
  else if (_BF (opnd, 9, 6) == 0x9)
997
0
    {
998
0
      dinfo->fprintf_func (dinfo->stream, "*n$index");
999
0
      if (_BTST (opnd, 1))
1000
0
  dinfo->fprintf_func (dinfo->stream, "++");
1001
0
    }
1002
1003
  /* Relative Next Neighbour.  */
1004
0
  else if (_BF (opnd, 9, 6) == 0xa)
1005
0
    {
1006
0
      dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1007
0
    }
1008
1009
  /* Indexed LMEM.  */
1010
0
  else if (_BF (opnd, 9, 6) == 0x8)
1011
0
    {
1012
0
      n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1013
0
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1014
0
      if (_BTST (opnd, 4))
1015
0
  dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1016
0
      else if (_BF (opnd, 3, 0))
1017
0
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1018
0
    }
1019
1020
  /* 8-bit Constant value.  */
1021
0
  else if (_BF (opnd, 9, 8) == 0x3)
1022
0
    dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1023
1024
0
  else
1025
0
    {
1026
0
      dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1027
0
      return false;
1028
0
    }
1029
1030
0
  return true;
1031
0
}
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
0
{
1040
0
  unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1041
1042
  /* Relative GPR.  */
1043
0
  if (_BF (opnd, 7, 5) == 0x0)
1044
0
    dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1045
1046
  /* Relative Xfer.  */
1047
0
  else if (_BF (opnd, 7, 5) == 0x4)
1048
0
    dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1049
1050
  /* Relative Xfer.  */
1051
0
  else if (_BF (opnd, 7, 5) == 0x6)
1052
0
    {
1053
0
      n += (num_ctx == 8 ? 16 : 32);
1054
0
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1055
0
    }
1056
1057
  /* Indexed Xfer.  */
1058
0
  else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1059
0
    {
1060
0
      dinfo->fprintf_func (dinfo->stream, "*$index");
1061
0
      if (_BF (opnd, 2, 1) == 0x1)
1062
0
  dinfo->fprintf_func (dinfo->stream, "++");
1063
0
      else if (_BF (opnd, 2, 1) == 0x2)
1064
0
  dinfo->fprintf_func (dinfo->stream, "--");
1065
0
    }
1066
1067
  /* Indexed NN.  */
1068
0
  else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1069
0
    {
1070
0
      dinfo->fprintf_func (dinfo->stream, "*n$index");
1071
0
      if (_BTST (opnd, 1))
1072
0
  dinfo->fprintf_func (dinfo->stream, "++");
1073
0
    }
1074
1075
  /* Indexed LMEM.  */
1076
0
  else if (_BF (opnd, 7, 4) == 0x5)
1077
0
    {
1078
0
      n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1079
0
      dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1080
0
      if (_BF (opnd, 2, 0))
1081
0
  dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1082
0
    }
1083
1084
  /* 7+1-bit Constant value.  */
1085
0
  else if (_BTST (opnd, 5))
1086
0
    {
1087
0
      n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1088
0
      dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1089
0
    }
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
0
  return true;
1098
0
}
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
0
{
1106
0
  unsigned int op = _BF (instr, 35, 33);
1107
0
  unsigned int srcA = _BF (instr, 7, 0);
1108
0
  unsigned int srcB = _BF (instr, 17, 10);
1109
0
  unsigned int dst = _BF (instr, 27, 20);
1110
0
  unsigned int sc = _BF (instr, 9, 8);
1111
0
  unsigned int imm_msb = _BTST (instr, 18);
1112
0
  unsigned int swap = _BTST (instr, 19);
1113
0
  unsigned int shift = _BF (instr, 32, 28);
1114
0
  char dst_bank = 'A' + _BTST (instr, 36);
1115
0
  unsigned int nocc = _BTST (instr, 40);
1116
0
  bool err = false;
1117
1118
0
  if (swap)
1119
0
    {
1120
0
      unsigned int tmp = srcA;
1121
0
      srcA = srcB;
1122
0
      srcB = tmp;
1123
0
    }
1124
1125
  /* alu_shf, dbl_shf, asr.  */
1126
0
  if (op < 7)
1127
0
    {
1128
0
      if (sc == 3)
1129
0
  dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1130
0
      else if (op == 6)
1131
0
  dinfo->fprintf_func (dinfo->stream, "asr[");
1132
0
      else
1133
0
  dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1134
1135
      /* dest operand */
1136
0
      if (nfp_me_is_imm_opnd8 (dst))
1137
0
  dinfo->fprintf_func (dinfo->stream, "--");
1138
0
      else
1139
0
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1140
0
            dst_lmext, imm_msb, dinfo);
1141
1142
0
      dinfo->fprintf_func (dinfo->stream, ", ");
1143
1144
      /* A operand.  */
1145
0
      if (op != 6)
1146
0
  {
1147
0
    if ((op < 2) && (sc != 3)) /* Not dbl_shf.  */
1148
0
      dinfo->fprintf_func (dinfo->stream, "--"); /* B or ~B operator.  */
1149
0
    else
1150
0
      err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1151
0
                num_ctx, src_lmext, imm_msb,
1152
0
                dinfo);
1153
1154
0
    dinfo->fprintf_func (dinfo->stream, ", ");
1155
1156
    /* Operator (not for dbl_shf).  */
1157
0
    if (sc != 3)
1158
0
      {
1159
0
        dinfo->fprintf_func (dinfo->stream, "%s, ",
1160
0
           nfp_mealu_shf_op[op]);
1161
0
      }
1162
0
  }
1163
1164
      /* B operand.  */
1165
0
      err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1166
0
          num_ctx, src_lmext, imm_msb, dinfo);
1167
1168
0
      dinfo->fprintf_func (dinfo->stream, ", ");
1169
1170
      /* Shift */
1171
0
      if (sc == 0)
1172
0
  dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1173
0
      else if (sc == 2)
1174
0
  {
1175
0
    if (shift)
1176
0
      dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1177
0
    else
1178
0
      dinfo->fprintf_func (dinfo->stream, "<<indirect");
1179
0
  }
1180
0
      else
1181
0
  {
1182
0
    if (shift)
1183
0
      dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1184
0
    else
1185
0
      dinfo->fprintf_func (dinfo->stream, ">>indirect");
1186
0
  }
1187
0
    }
1188
  /* Byte Align.  */
1189
0
  else if (op == 7)
1190
0
    {
1191
0
      dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1192
0
         ((sc == 2) ? "le" : "be"));
1193
1194
      /* Dest operand.  */
1195
0
      if (nfp_me_is_imm_opnd8 (dst))
1196
0
  dinfo->fprintf_func (dinfo->stream, "--");
1197
0
      else
1198
0
  err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1199
0
            dst_lmext, imm_msb, dinfo);
1200
1201
0
      dinfo->fprintf_func (dinfo->stream, ", ");
1202
1203
0
      if (sc == 2)
1204
0
  err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1205
0
            0, imm_msb, dinfo);
1206
0
      else
1207
0
  err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1208
0
            0, imm_msb, dinfo);
1209
0
    }
1210
1211
0
  dinfo->fprintf_func (dinfo->stream, "]");
1212
0
  if (nocc)
1213
0
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1214
0
  if (gpr_wrboth)
1215
0
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1216
0
  if (pred_cc)
1217
0
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1218
1219
0
  if (err)
1220
0
    return _NFP_ERR_CONT;
1221
0
  return 0;
1222
0
}
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
0
{
1230
0
  unsigned int op = _BF (instr, 35, 31);
1231
0
  unsigned int srcA = _BF (instr, 9, 0);
1232
0
  unsigned int srcB = _BF (instr, 19, 10);
1233
0
  unsigned int dst = _BF (instr, 29, 20);
1234
0
  unsigned int swap = _BTST (instr, 30);
1235
0
  char dst_bank = 'A' + _BTST (instr, 36);
1236
0
  unsigned int nocc = _BTST (instr, 40);
1237
0
  int do_close_bracket = 1;
1238
0
  bool err = false;
1239
1240
0
  if (swap)
1241
0
    {
1242
0
      unsigned int tmp = srcA;
1243
0
      srcA = srcB;
1244
0
      srcB = tmp;
1245
0
    }
1246
1247
0
  switch (op)
1248
0
    {
1249
0
    case 3:     /* pop_count3[dst, srcB] */
1250
0
    case 6:     /* pop_count1[srcB] */
1251
0
    case 7:     /* pop_count2[srcB] */
1252
0
    case 14:      /* ffs[dst, srcB] */
1253
0
    case 15:      /* cam_read_tag[dst, srcB] */
1254
0
    case 31:      /* cam_read_state[dst, srcB] */
1255
0
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1256
1257
      /* No dest for pop_count1/2.  */
1258
0
      if ((op != 6) && (op != 7))
1259
0
  {
1260
    /* dest operand */
1261
0
    if (nfp_me_is_imm_opnd10 (dst))
1262
0
      dinfo->fprintf_func (dinfo->stream, "--");
1263
0
    else
1264
0
      err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1265
0
                 dst_lmext, dinfo);
1266
1267
0
    dinfo->fprintf_func (dinfo->stream, ", ");
1268
0
  }
1269
1270
      /* B operand.  */
1271
0
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1272
0
           num_ctx, src_lmext, dinfo);
1273
0
      break;
1274
 
1275
      /* cam_clear.  */
1276
0
    case 11:
1277
0
      do_close_bracket = 0;
1278
0
      dinfo->fprintf_func (dinfo->stream, "cam_clear");
1279
0
      break;
1280
1281
      /* cam_lookup.  */
1282
0
    case 23:
1283
0
      do_close_bracket = 0;
1284
0
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1285
1286
      /* Dest operand.  */
1287
0
      if (nfp_me_is_imm_opnd10 (dst))
1288
0
  dinfo->fprintf_func (dinfo->stream, "--");
1289
0
      else
1290
0
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1291
0
             dst_lmext, dinfo);
1292
1293
0
      dinfo->fprintf_func (dinfo->stream, ", ");
1294
1295
      /* A operand.  */
1296
0
      err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1297
0
           num_ctx, src_lmext, dinfo);
1298
1299
0
      dinfo->fprintf_func (dinfo->stream, "]");
1300
1301
0
      if (_BF (srcB, 1, 0))
1302
0
  {
1303
0
    unsigned int n = _BTST (srcB, 1);
1304
0
    if (_BTST (srcB, 4)) /* Only for MEv28.  */
1305
0
      n += 2;
1306
0
    dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1307
0
             _BF (srcB, 3, 2));
1308
0
  }
1309
1310
0
      break;
1311
1312
0
    case 19:      /* cam_write.  */
1313
0
    case 27:      /* cam_write_state.  */
1314
0
      dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1315
0
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1316
0
           num_ctx, src_lmext, dinfo);
1317
0
      dinfo->fprintf_func (dinfo->stream, ", ");
1318
0
      if (op == 19)
1319
0
  {
1320
0
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1321
0
               num_ctx, src_lmext, dinfo);
1322
0
    dinfo->fprintf_func (dinfo->stream, ", ");
1323
0
  }
1324
0
      dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1325
0
      break;
1326
1327
      /* CRC.  */
1328
0
    case 18:  
1329
0
      do_close_bracket = 0;
1330
0
      dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1331
0
         _BTST (srcA, 3) ? "le" : "be");
1332
0
      if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
1333
0
  {
1334
0
    dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1335
0
    err = true;
1336
0
  }
1337
0
      else
1338
0
  {
1339
0
    dinfo->fprintf_func (dinfo->stream, "%s, ",
1340
0
             nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
1341
0
  }
1342
1343
      /* Dest operand.  */
1344
0
      if (nfp_me_is_imm_opnd10 (dst))
1345
0
  dinfo->fprintf_func (dinfo->stream, "--");
1346
0
      else
1347
0
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1348
0
             dst_lmext, dinfo);
1349
1350
0
      dinfo->fprintf_func (dinfo->stream, ", ");
1351
1352
      /* B operand.  */
1353
0
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1354
0
           num_ctx, src_lmext, dinfo);
1355
1356
0
      dinfo->fprintf_func (dinfo->stream, "]");
1357
0
      if (_BF (srcA, 2, 0))
1358
0
  dinfo->fprintf_func (dinfo->stream, ", %s",
1359
0
           nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
1360
0
      if (_BTST (srcA, 4))
1361
0
  dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1362
0
      break;
1363
1364
0
    default:
1365
      /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs).  */
1366
0
      dinfo->fprintf_func (dinfo->stream, "alu[");
1367
1368
      /* Dest operand.  */
1369
0
      if (nfp_me_is_imm_opnd10 (dst))
1370
0
  dinfo->fprintf_func (dinfo->stream, "--");
1371
0
      else
1372
0
  err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1373
0
             dst_lmext, dinfo);
1374
0
      dinfo->fprintf_func (dinfo->stream, ", ");
1375
1376
      /* A operand.  */
1377
0
      if ((op == 0) || (op == 4)) /* B only operators.  */
1378
0
  dinfo->fprintf_func (dinfo->stream, "--");
1379
0
      else
1380
0
  err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1381
0
             num_ctx, src_lmext, dinfo);
1382
1383
0
      if (!nfp_me27_28_alu_op[op])
1384
0
  {
1385
0
    dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1386
0
    err = true;
1387
0
  }
1388
0
      else
1389
0
  {
1390
0
    dinfo->fprintf_func (dinfo->stream, ", %s, ",
1391
0
             nfp_me27_28_alu_op[op]);
1392
0
  }
1393
1394
      /* B operand.  */
1395
0
      err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1396
0
           num_ctx, src_lmext, dinfo);
1397
0
      break;
1398
0
    }
1399
1400
0
  if (do_close_bracket)
1401
0
    dinfo->fprintf_func (dinfo->stream, "]");
1402
1403
0
  if (nocc)
1404
0
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1405
0
  if (gpr_wrboth)
1406
0
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1407
0
  if (pred_cc)
1408
0
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1409
1410
0
  if (err)
1411
0
    return _NFP_ERR_CONT;
1412
0
  return 0;
1413
0
}
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
0
{
1421
0
  unsigned int srcA = _BF (instr, 9, 0);
1422
0
  unsigned int srcB = _BF (instr, 19, 10);
1423
0
  unsigned int imm = _BF (instr, 27, 20);
1424
0
  unsigned int by = _BTST (instr, 29);
1425
0
  unsigned int wd = _BTST (instr, 30);
1426
0
  unsigned int inv = _BTST (instr, 31);
1427
0
  unsigned int byte_shift = _BF (instr, 34, 33);
1428
0
  bool err = false;
1429
1430
0
  if (nfp_me_is_imm_opnd10 (srcB))
1431
0
    {
1432
0
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1433
0
      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
0
    }
1439
0
  else
1440
0
    {
1441
0
      imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1442
0
    }
1443
1444
0
  if (inv)
1445
0
    imm = (imm ^ 0xffff) | 0xffff0000U;
1446
1447
0
  if (by)
1448
0
    {
1449
0
      dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1450
0
      imm &= 0xff;
1451
0
    }
1452
0
  else if (wd)
1453
0
    {
1454
0
      dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1455
0
      imm &= 0xffff;
1456
0
    }
1457
0
  else
1458
0
    dinfo->fprintf_func (dinfo->stream, "immed[");
1459
1460
  /* Dest.  */
1461
0
  if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1462
0
    dinfo->fprintf_func (dinfo->stream, "--"); /* No Dest.  */
1463
0
  else if (nfp_me_is_imm_opnd10 (srcA))
1464
0
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1465
0
  else
1466
0
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1467
1468
0
  dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1469
1470
0
  if ((!by) && (!wd) && (byte_shift))
1471
0
    dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1472
1473
0
  dinfo->fprintf_func (dinfo->stream, "]");
1474
1475
0
  if (gpr_wrboth)
1476
0
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1477
0
  if (pred_cc)
1478
0
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1479
1480
0
  if (err)
1481
0
    return _NFP_ERR_CONT;
1482
0
  return 0;
1483
0
}
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
0
{
1491
0
  unsigned int load_cc = _BTST (instr, 34);
1492
0
  unsigned int shift = _BF (instr, 32, 28);
1493
0
  unsigned int byte_mask = _BF (instr, 27, 24);
1494
0
  unsigned int zerof = _BTST (instr, 20);
1495
0
  unsigned int swap = _BTST (instr, 19);
1496
0
  unsigned int imm_msb = _BTST (instr, 18);
1497
0
  unsigned int src = _BF (instr, 17, 10);
1498
0
  unsigned int sc = _BF (instr, 9, 8);
1499
0
  unsigned int dst = _BF (instr, 7, 0);
1500
0
  bool err = false;
1501
1502
0
  if (swap)
1503
0
    {
1504
0
      unsigned int tmp = src;
1505
0
      src = dst;
1506
0
      dst = tmp;
1507
0
    }
1508
1509
0
  if (zerof)
1510
0
    dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1511
0
  else
1512
0
    dinfo->fprintf_func (dinfo->stream, "ld_field[");
1513
1514
0
  err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1515
0
            dst_lmext, imm_msb, dinfo);
1516
0
  dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1517
0
           _BTST (byte_mask, 3),
1518
0
           _BTST (byte_mask, 2),
1519
0
           _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1520
0
  err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1521
0
            src_lmext, imm_msb, dinfo);
1522
1523
0
  if ((sc == 0) && (shift != 0))
1524
0
    dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1525
0
  else if (sc == 1)
1526
0
    {
1527
0
      if (shift)
1528
0
  dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1529
0
      else
1530
0
  dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1531
0
    }
1532
0
  else if (sc == 2)
1533
0
    {
1534
0
      if (shift)
1535
0
  dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1536
0
      else
1537
0
  dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1538
0
    }
1539
0
  else if (sc == 3)
1540
0
    dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1541
1542
0
  dinfo->fprintf_func (dinfo->stream, "]");
1543
1544
0
  if (load_cc)
1545
0
    dinfo->fprintf_func (dinfo->stream, ", load_cc");
1546
0
  if (gpr_wrboth)
1547
0
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1548
0
  if (pred_cc)
1549
0
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1550
1551
0
  if (err)
1552
0
    return _NFP_ERR_CONT;
1553
0
  return 0;
1554
0
}
1555
1556
static int
1557
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
1558
0
{
1559
0
  unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1560
0
  unsigned int defer = _BF (instr, 21, 20);
1561
0
  unsigned int no_load = _BTST (instr, 19);
1562
0
  unsigned int resume = _BTST (instr, 18);
1563
0
  unsigned int bpt = _BTST (instr, 17);
1564
0
  unsigned int sig_or = _BTST (instr, 16);
1565
0
  unsigned int ev_mask = _BF (instr, 15, 0);
1566
1567
0
  dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1568
0
  if (bpt)
1569
0
    dinfo->fprintf_func (dinfo->stream, "bpt");
1570
0
  else if (ev_mask == 1)
1571
0
    dinfo->fprintf_func (dinfo->stream, "voluntary");
1572
0
  else if ((!no_load) && (ev_mask == 0))
1573
0
    {
1574
0
      dinfo->fprintf_func (dinfo->stream, "kill");
1575
0
      sig_or = 0;
1576
0
    }
1577
0
  else if (ev_mask == 0)
1578
0
    dinfo->fprintf_func (dinfo->stream, "--");
1579
0
  else
1580
0
    {
1581
0
      int first_print = 1;
1582
0
      unsigned int n;
1583
1584
0
      for (n = 1; n < 16; n++)
1585
0
  {
1586
0
    if (!_BTST (ev_mask, n))
1587
0
      continue;
1588
0
    dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1589
0
             (first_print) ? "" : ", ", n);
1590
0
    first_print = 0;
1591
0
  }
1592
0
    }
1593
1594
0
  dinfo->fprintf_func (dinfo->stream, "]");
1595
1596
0
  if (sig_or)
1597
0
    dinfo->fprintf_func (dinfo->stream, ", any");
1598
0
  if (resume)
1599
0
    dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1600
0
  if (defer)
1601
0
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1602
1603
0
  return 0;
1604
0
}
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
0
{
1611
0
  unsigned int srcA = _BF (instr, 9, 0);
1612
0
  unsigned int srcB = _BF (instr, 19, 10);
1613
0
  unsigned int wr = _BTST (instr, 21);
1614
0
  unsigned int csr_num = _BF (instr, 32, 22);
1615
0
  unsigned int src = srcA;
1616
0
  char src_bank = 'A';
1617
0
  bool err = false;
1618
1619
0
  if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1620
0
    {
1621
0
      src_bank = 'B';
1622
0
      src = srcB;
1623
0
    }
1624
1625
  /* MEv28 does not have urd/uwr.  */
1626
0
  if (csr_num == 1)
1627
0
    {
1628
0
      if (wr)
1629
0
  {
1630
0
    dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1631
0
             (int) _BTST (instr, 20));
1632
0
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1633
0
               src_lmext, dinfo);
1634
0
  }
1635
0
      else
1636
0
  {
1637
0
    dinfo->fprintf_func (dinfo->stream, "urd[");
1638
0
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1639
0
               src_lmext, dinfo);
1640
0
    dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1641
0
             (int) _BTST (instr, 20));
1642
0
  }
1643
0
      dinfo->fprintf_func (dinfo->stream, "]");
1644
0
    }
1645
0
  else
1646
0
    {
1647
0
      const char *nm = NULL;
1648
1649
0
      if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1650
0
  nm = nfp_me27_28_mecsrs[csr_num];
1651
1652
0
      dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1653
0
         (wr) ? "wr" : "rd");
1654
0
      if (nm)
1655
0
  dinfo->fprintf_func (dinfo->stream, "%s", nm);
1656
0
      else
1657
0
  dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1658
1659
0
      if (wr)
1660
0
  {
1661
0
    dinfo->fprintf_func (dinfo->stream, ", ");
1662
0
    err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1663
0
               src_lmext, dinfo);
1664
0
  }
1665
0
      dinfo->fprintf_func (dinfo->stream, "]");
1666
0
    }
1667
1668
0
  if (err)
1669
0
    return _NFP_ERR_CONT;
1670
0
  return 0;
1671
0
}
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
0
{
1678
0
  unsigned int br_op = _BF (instr, 4, 0);
1679
0
  unsigned int ctx_sig_state = _BF (instr, 17, 14);
1680
0
  unsigned int defer = _BF (instr, 21, 20);
1681
0
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1682
0
  int ret = 0;
1683
1684
0
  if (!nfp_me27_28_br_ops[br_op])
1685
0
    {
1686
0
      dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
1687
0
      ret = _NFP_ERR_CONT;
1688
0
    }
1689
0
  else
1690
0
    dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1691
1692
0
  switch (br_op)
1693
0
    {
1694
0
    case 16:      /* br=ctx */
1695
0
    case 17:      /* br!=ctx */
1696
0
    case 18:      /* br_signal */
1697
0
    case 19:      /* br_!signal */
1698
0
      dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1699
0
      break;
1700
0
    case 20:      /* "br_inp_state" */
1701
0
    case 21:      /* "br_!inp_state" */
1702
0
      dinfo->fprintf_func (dinfo->stream, "%s, ",
1703
0
         br_inpstates[ctx_sig_state]);
1704
0
      break;
1705
0
    case 22:      /* "br_cls_state" */
1706
0
    case 23:      /* "br_!cls_state" */
1707
0
      dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1708
0
         ctx_sig_state);
1709
0
      break;
1710
0
    default:
1711
0
      break;
1712
0
    }
1713
1714
0
  dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1715
1716
0
  if (defer)
1717
0
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1718
1719
0
  return ret;
1720
0
}
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
0
{
1727
0
  unsigned int srcA = _BF (instr, 7, 0);
1728
0
  unsigned int by = _BF (instr, 9, 8);
1729
0
  unsigned int srcB = _BF (instr, 17, 10);
1730
0
  unsigned int imm_msb = _BTST (instr, 18);
1731
0
  unsigned int eq = _BTST (instr, 19);
1732
0
  unsigned int defer = _BF (instr, 21, 20);
1733
0
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1734
0
  bool err = false;
1735
1736
0
  if (eq)
1737
0
    dinfo->fprintf_func (dinfo->stream, "br=byte[");
1738
0
  else
1739
0
    dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1740
1741
0
  if (nfp_me_is_imm_opnd8 (srcA))
1742
0
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1743
0
              src_lmext, imm_msb, dinfo);
1744
0
  else
1745
0
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1746
0
              src_lmext, imm_msb, dinfo);
1747
1748
0
  dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1749
1750
0
  if (nfp_me_is_imm_opnd8 (srcA))
1751
0
    err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1752
0
              src_lmext, imm_msb, dinfo);
1753
0
  else
1754
0
    err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1755
0
              src_lmext, imm_msb, dinfo);
1756
1757
0
  dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1758
1759
0
  if (defer)
1760
0
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1761
1762
0
  if (err)
1763
0
    return _NFP_ERR_CONT;
1764
0
  return 0;
1765
0
}
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
0
{
1771
0
  unsigned int srcA = _BF (instr, 7, 0);
1772
0
  unsigned int srcB = _BF (instr, 17, 10);
1773
0
  unsigned int b = _BTST (instr, 18);
1774
0
  unsigned int defer = _BF (instr, 21, 20);
1775
0
  unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1776
0
  bool err = false;
1777
1778
0
  if (b)
1779
0
    dinfo->fprintf_func (dinfo->stream, "br_bset[");
1780
0
  else
1781
0
    dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1782
1783
0
  if (nfp_me_is_imm_opnd8 (srcA))
1784
0
    {
1785
0
      err = err
1786
0
  || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1787
0
      b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1788
0
    }
1789
0
  else
1790
0
    {
1791
0
      err = err
1792
0
  || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1793
0
      b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1794
0
    }
1795
1796
0
  dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1797
1798
0
  if (defer)
1799
0
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1800
1801
0
  if (err)
1802
0
    return _NFP_ERR_CONT;
1803
0
  return 0;
1804
0
}
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
0
{
1810
0
  unsigned int srcA = _BF (instr, 9, 0);
1811
0
  unsigned int srcB = _BF (instr, 19, 10);
1812
0
  unsigned int defer = _BF (instr, 21, 20);
1813
0
  unsigned int imm = _BF (instr, 30, 22);
1814
0
  bool err = false;
1815
1816
0
  if (nfp_me_is_imm_opnd10 (srcA))
1817
0
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1818
0
  else
1819
0
    imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1820
1821
0
  if (!imm)
1822
0
    dinfo->fprintf_func (dinfo->stream, "rtn[");
1823
0
  else
1824
0
    dinfo->fprintf_func (dinfo->stream, "jump[");
1825
1826
0
  if (nfp_me_is_imm_opnd10 (srcA))
1827
0
    err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1828
0
  else
1829
0
    err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1830
1831
0
  if (imm)
1832
0
    dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1833
1834
0
  dinfo->fprintf_func (dinfo->stream, "]");
1835
1836
0
  if (defer)
1837
0
    dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1838
1839
0
  if (err)
1840
0
    return _NFP_ERR_CONT;
1841
0
  return 0;
1842
0
}
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
0
{
1850
0
  unsigned int srcA = _BF (instr, 9, 0);
1851
0
  unsigned int srcB = _BF (instr, 19, 10);
1852
0
  unsigned int mstep = _BF (instr, 22, 20);
1853
0
  char dst_bank = 'A' + _BTST (instr, 23);
1854
0
  unsigned int swap = _BTST (instr, 30);
1855
0
  unsigned int mtype = _BF (instr, 32, 31);
1856
0
  unsigned int nocc = _BTST (instr, 40);
1857
0
  bool err = false;
1858
1859
0
  if (swap)
1860
0
    {
1861
0
      unsigned int tmp = srcA;
1862
0
      srcA = srcB;
1863
0
      srcB = tmp;
1864
0
    }
1865
1866
0
  dinfo->fprintf_func (dinfo->stream, "mul_step[");
1867
1868
0
  if (mstep >= 4)
1869
0
    err = err
1870
0
      || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1871
0
  else
1872
0
    err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1873
0
               src_lmext, dinfo);
1874
1875
0
  dinfo->fprintf_func (dinfo->stream, ", ");
1876
1877
0
  if (mstep >= 4)
1878
0
    dinfo->fprintf_func (dinfo->stream, "--");
1879
0
  else
1880
0
    err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1881
0
               src_lmext, dinfo);
1882
1883
0
  dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1884
0
  if (mtype > 0)
1885
0
    {
1886
0
      const char *s = nfp_me27_28_mult_steps[mstep];
1887
0
      if (!s)
1888
0
  {
1889
0
    s = "<invalid mul_step>";
1890
0
    err = true;
1891
0
  }
1892
0
      dinfo->fprintf_func (dinfo->stream, "_%s", s);
1893
0
    }
1894
1895
0
  if (nocc)
1896
0
    dinfo->fprintf_func (dinfo->stream, ", no_cc");
1897
0
  if (gpr_wrboth)
1898
0
    dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1899
0
  if (pred_cc)
1900
0
    dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1901
1902
0
  if (err)
1903
0
    return _NFP_ERR_CONT;
1904
0
  return 0;
1905
0
}
1906
1907
static int
1908
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1909
0
{
1910
0
  const nfp_cmd_mnemonic *a = arg_a;
1911
0
  const nfp_cmd_mnemonic *b = arg_b;
1912
1913
0
  if (a->cpp_target != b->cpp_target)
1914
0
    return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
1915
1916
0
  if (a->cpp_action != b->cpp_action)
1917
0
    return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1918
1919
0
  return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
1920
0
}
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
0
{
1928
0
  nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1929
0
  const nfp_cmd_mnemonic *cmd = NULL;
1930
1931
0
  cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1932
0
     sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1933
1934
0
  if (!cmd)
1935
0
    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
0
  while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1940
0
    --cmd;
1941
1942
  /* Now compare by cpp_len and make sure we stay in range.  */
1943
0
  for (; (cmd < (mnemonics + mnemonics_cnt))
1944
0
       && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1945
0
    {
1946
0
      if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1947
0
  return cmd->mnemonic;
1948
0
    }
1949
1950
0
  return NULL;
1951
0
}
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
0
{
1959
0
  unsigned int srcA = _BF (instr, 7, 0);
1960
0
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
1961
0
  unsigned int srcB = _BF (instr, 17, 10);
1962
0
  unsigned int token = _BF (instr, 19, 18);
1963
0
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1964
0
  unsigned int cpp_len = _BF (instr, 27, 25);
1965
0
  unsigned int sig = _BF (instr, 31, 28);
1966
0
  unsigned int tgtcmd = _BF (instr, 38, 32);
1967
0
  unsigned int indref = _BTST (instr, 41);
1968
0
  unsigned int mode = _BF (instr, 44, 42);
1969
1970
0
  bool err = false;
1971
0
  int cpp_target = -1;
1972
0
  int cpp_action = -1;
1973
0
  const char *mnemonic = NULL;
1974
0
  unsigned int imm;
1975
0
  unsigned int valBA;
1976
0
  int visswap = ((mode == 1) || (mode == 3));
1977
1978
0
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1979
0
  valBA = (srcB << 8) | srcA;
1980
1981
0
  if (mode == 6)
1982
0
    {
1983
0
      token = 0;
1984
0
      sig = 0;
1985
0
      xfer = 0;
1986
0
    }
1987
1988
  /* Convert tgtcmd to action/token tuple.  */
1989
0
  if (_BF (tgtcmd, 6, 5) == 0x0)
1990
0
    {
1991
0
      switch (_BF (tgtcmd, 4, 2))
1992
0
  {
1993
0
  case 0:
1994
0
    cpp_target = NFP_3200_CPPTGT_CAP;
1995
0
    dinfo->fprintf_func (dinfo->stream, "cap[");
1996
0
    break;
1997
0
  case 1:
1998
0
    cpp_target = NFP_3200_CPPTGT_MSF0;
1999
0
    dinfo->fprintf_func (dinfo->stream, "msf0[");
2000
0
    break;
2001
0
  case 2:
2002
0
    cpp_target = NFP_3200_CPPTGT_MSF1;
2003
0
    dinfo->fprintf_func (dinfo->stream, "msf1[");
2004
0
    break;
2005
0
  case 3:
2006
0
    cpp_target = NFP_3200_CPPTGT_PCIE;
2007
0
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2008
0
    break;
2009
0
  case 4:
2010
0
    cpp_target = NFP_3200_CPPTGT_HASH;
2011
0
    break;
2012
0
  case 5:
2013
0
    cpp_target = NFP_3200_CPPTGT_CRYPTO;
2014
0
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2015
0
    break;
2016
0
  case 6:
2017
0
    cpp_target = NFP_3200_CPPTGT_ARM;
2018
0
    dinfo->fprintf_func (dinfo->stream, "arm[");
2019
0
    break;
2020
0
  case 7:
2021
0
    cpp_target = NFP_3200_CPPTGT_CT;
2022
0
    dinfo->fprintf_func (dinfo->stream, "ct[");
2023
0
    break;
2024
0
  }
2025
0
      cpp_action = _BF (tgtcmd, 1, 0);
2026
0
    }
2027
0
  else
2028
0
    {
2029
0
      switch (_BF (tgtcmd, 6, 4))
2030
0
  {
2031
0
  case 2:
2032
0
    cpp_target = NFP_3200_CPPTGT_GS;
2033
0
    dinfo->fprintf_func (dinfo->stream, "scratch[");
2034
0
    break;
2035
0
  case 3:
2036
0
    cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM.  */
2037
0
    dinfo->fprintf_func (dinfo->stream, "sram[");
2038
0
    break;
2039
0
  case 4:
2040
0
  case 5:
2041
0
    cpp_target = NFP_3200_CPPTGT_MU;
2042
0
    dinfo->fprintf_func (dinfo->stream, "mem[");
2043
0
    break;
2044
0
  case 6:
2045
0
  case 7:
2046
0
    cpp_target = NFP_3200_CPPTGT_CLS;
2047
0
    dinfo->fprintf_func (dinfo->stream, "cls[");
2048
0
    break;
2049
0
  }
2050
0
      cpp_action = _BF (tgtcmd, 3, 0);
2051
0
    }
2052
2053
0
  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
0
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2061
0
           nfp_me27_mnemonics,
2062
0
           ARRAY_SIZE (nfp_me27_mnemonics));
2063
2064
0
  if (!mnemonic)
2065
0
    {
2066
0
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2067
0
         cpp_target, cpp_action, token);
2068
0
      return _NFP_ERR_CONT;
2069
0
    }
2070
2071
0
  if (cpp_target == NFP_3200_CPPTGT_HASH)
2072
0
    {
2073
0
      dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2074
0
         mnemonic, xfer, cpp_len);
2075
0
      goto print_opt_toks;
2076
0
    }
2077
2078
0
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2079
2080
0
  if (visswap)
2081
0
    {
2082
0
      unsigned int tmp = srcA;
2083
0
      srcA = srcB;
2084
0
      srcB = tmp;
2085
0
    }
2086
2087
0
  switch (mode)
2088
0
    {
2089
0
    case 0:     /* (A << 8) + B.  */
2090
0
    case 1:     /* (B << 8) + A.  */
2091
0
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2092
0
      err = err
2093
0
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2094
0
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2095
0
      err = err
2096
0
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2097
0
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2098
0
      break;
2099
0
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2100
0
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2101
0
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2102
0
      err = err
2103
0
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2104
0
      if (third_party_32bit)
2105
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2106
0
      else
2107
0
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2108
0
      err = err
2109
0
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2110
0
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2111
0
      break;
2112
0
    case 4:     /* A + B.  */
2113
0
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2114
0
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2115
0
      dinfo->fprintf_func (dinfo->stream, ", ");
2116
0
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2117
0
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2118
0
      break;
2119
0
    case 5:     /* Immediate address.  */
2120
0
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2121
0
         (cpp_len + 1));
2122
0
      break;
2123
0
    case 6:     /* Immediate address and data.  */
2124
0
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2125
0
      break;
2126
0
    case 7:     /* Immediate data.  */
2127
0
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2128
0
         ((xfer << 16) | valBA), (cpp_len + 1));
2129
0
      break;
2130
0
    }
2131
2132
0
 print_opt_toks:
2133
0
  dinfo->fprintf_func (dinfo->stream, "]");
2134
2135
0
  if (indref && (mode != 2) && (mode != 3))
2136
0
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2137
2138
0
  if (ctxswap_defer != 3)
2139
0
    {
2140
0
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2141
0
      if (sig)
2142
0
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2143
0
      else
2144
0
  dinfo->fprintf_func (dinfo->stream, "--]");
2145
2146
0
      if (ctxswap_defer != 0)
2147
0
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2148
0
    }
2149
0
  else if (sig)
2150
0
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2151
2152
0
  if (err)
2153
0
    return _NFP_ERR_CONT;
2154
0
  return 0;
2155
0
}
2156
2157
static int
2158
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
2159
      struct disassemble_info *dinfo)
2160
0
{
2161
0
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2162
0
}
2163
2164
static int
2165
nfp_me27_print_alu (uint64_t instr, int num_ctx,
2166
        struct disassemble_info *dinfo)
2167
0
{
2168
0
  return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2169
0
}
2170
2171
static int
2172
nfp_me27_print_immed (uint64_t instr, int num_ctx,
2173
          struct disassemble_info *dinfo)
2174
0
{
2175
0
  return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2176
0
}
2177
2178
static int
2179
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
2180
       struct disassemble_info *dinfo)
2181
0
{
2182
0
  return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2183
0
}
2184
2185
static int
2186
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2187
0
{
2188
0
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2189
0
}
2190
2191
static int
2192
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
2193
        struct disassemble_info *dinfo)
2194
0
{
2195
0
  return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2196
0
}
2197
2198
static int
2199
nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2200
0
{
2201
0
  return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
2202
0
}
2203
2204
static int
2205
nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
2206
      struct disassemble_info *dinfo)
2207
0
{
2208
0
  return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2209
0
}
2210
2211
static int
2212
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
2213
           struct disassemble_info *dinfo)
2214
0
{
2215
0
  return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2216
0
}
2217
2218
static int
2219
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
2220
           struct disassemble_info *dinfo)
2221
0
{
2222
0
  return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2223
0
}
2224
2225
static int
2226
nfp_me27_print_mult (uint64_t instr, int num_ctx,
2227
         struct disassemble_info *dinfo)
2228
0
{
2229
0
  return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2230
0
}
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
0
{
2238
0
  unsigned int srcA = _BF (instr, 7, 0);
2239
0
  unsigned int ctxswap_defer = _BF (instr, 9, 8);
2240
0
  unsigned int srcB = _BF (instr, 17, 10);
2241
0
  unsigned int token = _BF (instr, 19, 18);
2242
0
  unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2243
0
  unsigned int cpp_len = _BF (instr, 27, 25);
2244
0
  unsigned int sig = _BF (instr, 31, 28);
2245
0
  unsigned int tgtcmd = _BF (instr, 38, 32);
2246
0
  unsigned int indref = _BTST (instr, 41);
2247
0
  unsigned int mode = _BF (instr, 44, 42);
2248
2249
0
  bool err = false;
2250
0
  int cpp_target = -1;
2251
0
  int cpp_action = -1;
2252
0
  const char *mnemonic = NULL;
2253
0
  unsigned int imm;
2254
0
  unsigned int valBA;
2255
0
  int visswap = ((mode == 1) || (mode == 3));
2256
2257
0
  imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2258
0
  valBA = (srcB << 8) | srcA;
2259
2260
0
  if (mode == 6)
2261
0
    {
2262
0
      token = 0;
2263
0
      sig = 0;
2264
0
      xfer = 0;
2265
0
    }
2266
2267
  /* Convert tgtcmd to action/token tuple.  */
2268
0
  if (_BF (tgtcmd, 6, 5) == 0x0)
2269
0
    {
2270
0
      switch (_BF (tgtcmd, 4, 2))
2271
0
  {
2272
0
  case 0:
2273
0
    cpp_target = NFP_6000_CPPTGT_ILA;
2274
0
    dinfo->fprintf_func (dinfo->stream, "ila[");
2275
0
    break;
2276
0
  case 1:
2277
0
    cpp_target = NFP_6000_CPPTGT_NBI;
2278
0
    dinfo->fprintf_func (dinfo->stream, "nbi[");
2279
0
    break;
2280
0
  case 3:
2281
0
    cpp_target = NFP_6000_CPPTGT_PCIE;
2282
0
    dinfo->fprintf_func (dinfo->stream, "pcie[");
2283
0
    break;
2284
0
  case 5:
2285
0
    cpp_target = NFP_6000_CPPTGT_CRYPTO;
2286
0
    dinfo->fprintf_func (dinfo->stream, "crypto[");
2287
0
    break;
2288
0
  case 6:
2289
0
    cpp_target = NFP_6000_CPPTGT_ARM;
2290
0
    dinfo->fprintf_func (dinfo->stream, "arm[");
2291
0
    break;
2292
0
  case 7:
2293
0
    cpp_target = NFP_6000_CPPTGT_CTXPB;
2294
0
    dinfo->fprintf_func (dinfo->stream, "ct[");
2295
0
    break;
2296
0
  }
2297
0
      cpp_action = _BF (tgtcmd, 1, 0);
2298
0
    }
2299
0
  else
2300
0
    {
2301
      /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2302
   for mem/cls it's "a".  */
2303
0
      cpp_action = _BF (tgtcmd, 4, 0);
2304
0
      switch (_BF (tgtcmd, 6, 4))
2305
0
  {
2306
0
  case 3:
2307
0
    cpp_target = NFP_6000_CPPTGT_VQDR;
2308
0
    cpp_action = _BF (tgtcmd, 3, 0);
2309
0
    dinfo->fprintf_func (dinfo->stream, "sram[");
2310
0
    break;
2311
0
  case 4:
2312
0
  case 5:
2313
0
    cpp_target = NFP_6000_CPPTGT_MU;
2314
0
    dinfo->fprintf_func (dinfo->stream, "mem[");
2315
0
    break;
2316
0
  case 6:
2317
0
  case 7:
2318
0
    cpp_target = NFP_6000_CPPTGT_CLS;
2319
0
    dinfo->fprintf_func (dinfo->stream, "cls[");
2320
0
    break;
2321
0
  }
2322
0
    }
2323
2324
0
  if (cpp_target < 0)
2325
0
    {
2326
0
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2327
0
         cpp_target, cpp_action, token);
2328
0
      return _NFP_ERR_CONT;
2329
0
    }
2330
2331
0
  mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2332
0
           nfp_me28_mnemonics,
2333
0
           ARRAY_SIZE (nfp_me28_mnemonics));
2334
2335
0
  if (!mnemonic)
2336
0
    {
2337
0
      dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2338
0
         cpp_target, cpp_action, token);
2339
0
      return _NFP_ERR_CONT;
2340
0
    }
2341
2342
0
  dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2343
2344
0
  if (visswap)
2345
0
    {
2346
0
      unsigned int tmp = srcA;
2347
0
      srcA = srcB;
2348
0
      srcB = tmp;
2349
0
    }
2350
2351
0
  switch (mode)
2352
0
    {
2353
0
    case 0:     /* (A << 8) + B.  */
2354
0
    case 1:     /* (B << 8) + A.  */
2355
0
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2356
0
      err = err
2357
0
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2358
0
      dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2359
0
      err = err
2360
0
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2361
0
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2362
0
      break;
2363
0
    case 2:     /* Accelerated 3rd party (A[ << 8]) + B.  */
2364
0
    case 3:     /* Accelerated 3rd party (B[ << 8]) + A.  */
2365
0
      dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2366
0
      err = err
2367
0
  || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2368
0
      if (third_party_32bit)
2369
0
  dinfo->fprintf_func (dinfo->stream, ", ");
2370
0
      else
2371
0
  dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2372
0
      err = err
2373
0
  || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2374
0
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2375
0
      break;
2376
0
    case 4:     /* A + B.  */
2377
0
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2378
0
      err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2379
0
      dinfo->fprintf_func (dinfo->stream, ", ");
2380
0
      err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2381
0
      dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2382
0
      break;
2383
0
    case 5:     /* Immediate address.  */
2384
0
      dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2385
0
         (cpp_len + 1));
2386
0
      break;
2387
0
    case 6:     /* Immediate address and data.  */
2388
0
      dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2389
0
      break;
2390
0
    case 7:     /* Immediate data.  */
2391
0
      dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2392
0
         ((xfer << 16) | valBA), (cpp_len + 1));
2393
0
      break;
2394
0
    }
2395
2396
0
  dinfo->fprintf_func (dinfo->stream, "]");
2397
2398
0
  if (indref && (mode != 2) && (mode != 3))
2399
0
    dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2400
2401
0
  if (ctxswap_defer != 3)
2402
0
    {
2403
0
      dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2404
0
      if (sig)
2405
0
  dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2406
0
      else
2407
0
  dinfo->fprintf_func (dinfo->stream, "--]");
2408
2409
0
      if (ctxswap_defer != 0)
2410
0
  dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2411
0
    }
2412
0
  else if (sig)
2413
0
    dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2414
2415
0
  if (err)
2416
0
    return _NFP_ERR_CONT;
2417
0
  return 0;
2418
0
}
2419
2420
static int
2421
nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
2422
      struct disassemble_info *dinfo)
2423
0
{
2424
0
  unsigned int gpr_wrboth = _BTST (instr, 41);
2425
0
  unsigned int src_lmext = _BTST (instr, 42);
2426
0
  unsigned int dst_lmext = _BTST (instr, 43);
2427
0
  unsigned int pred_cc = _BTST (instr, 44);
2428
2429
0
  return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2430
0
            src_lmext, gpr_wrboth, num_ctx, dinfo);
2431
0
}
2432
2433
static int
2434
nfp_me28_print_alu (uint64_t instr, int num_ctx,
2435
        struct disassemble_info *dinfo)
2436
0
{
2437
0
  unsigned int gpr_wrboth = _BTST (instr, 41);
2438
0
  unsigned int src_lmext = _BTST (instr, 42);
2439
0
  unsigned int dst_lmext = _BTST (instr, 43);
2440
0
  unsigned int pred_cc = _BTST (instr, 44);
2441
2442
0
  return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2443
0
        gpr_wrboth, num_ctx, dinfo);
2444
0
}
2445
2446
static int
2447
nfp_me28_print_immed (uint64_t instr, int num_ctx,
2448
          struct disassemble_info *dinfo)
2449
0
{
2450
0
  unsigned int gpr_wrboth = _BTST (instr, 41);
2451
0
  unsigned int dst_lmext = _BTST (instr, 43);
2452
0
  unsigned int pred_cc = _BTST (instr, 44);
2453
2454
0
  return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2455
0
          num_ctx, dinfo);
2456
0
}
2457
2458
static int
2459
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
2460
       struct disassemble_info *dinfo)
2461
0
{
2462
0
  unsigned int gpr_wrboth = _BTST (instr, 41);
2463
0
  unsigned int src_lmext = _BTST (instr, 42);
2464
0
  unsigned int dst_lmext = _BTST (instr, 43);
2465
0
  unsigned int pred_cc = _BTST (instr, 44);
2466
2467
0
  return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2468
0
             src_lmext, gpr_wrboth, num_ctx, dinfo);
2469
0
}
2470
2471
static int
2472
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
2473
0
{
2474
0
  return nfp_me27_28_print_ctx_arb (instr, dinfo);
2475
0
}
2476
2477
static int
2478
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
2479
        struct disassemble_info *dinfo)
2480
0
{
2481
0
  unsigned int src_lmext = _BTST (instr, 42);
2482
2483
0
  return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2484
0
}
2485
2486
static int
2487
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
2488
0
{
2489
0
  return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2490
0
}
2491
2492
static int
2493
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
2494
      struct disassemble_info *dinfo)
2495
0
{
2496
0
  unsigned int src_lmext = _BTST (instr, 42);
2497
0
  return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2498
0
}
2499
2500
static int
2501
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
2502
           struct disassemble_info *dinfo)
2503
0
{
2504
0
  unsigned int src_lmext = _BTST (instr, 42);
2505
0
  return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2506
0
}
2507
2508
static int
2509
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
2510
           struct disassemble_info *dinfo)
2511
0
{
2512
0
  unsigned int src_lmext = _BTST (instr, 42);
2513
0
  return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2514
0
}
2515
2516
static int
2517
nfp_me28_print_mult (uint64_t instr, int num_ctx,
2518
         struct disassemble_info *dinfo)
2519
0
{
2520
0
  unsigned int gpr_wrboth = _BTST (instr, 41);
2521
0
  unsigned int src_lmext = _BTST (instr, 42);
2522
0
  unsigned int dst_lmext = _BTST (instr, 43);
2523
0
  unsigned int pred_cc = _BTST (instr, 44);
2524
2525
0
  return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2526
0
         gpr_wrboth, num_ctx, dinfo);
2527
0
}
2528
2529
static bool
2530
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2531
0
{
2532
0
  Elf_Internal_Shdr *sec = NULL;
2533
0
  Elf_Nfp_MeConfig mecfg_ent;
2534
0
  unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2535
0
  file_ptr roff = 0;
2536
0
  unsigned int sec_cnt = 0;
2537
0
  unsigned int sec_idx;
2538
0
  size_t menum_linear = 0;
2539
2540
0
  if (!dinfo->section)
2541
    /* No section info, will use default values.  */
2542
0
    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
0
{
2671
0
  int mecfg_orders[64][2];
2672
0
  size_t isl;
2673
0
  unsigned int sec_cnt = 0;
2674
0
  unsigned int sec_idx;
2675
0
  bool is_for_text;
2676
2677
0
  memset (mecfg_orders, -1, sizeof (mecfg_orders));
2678
2679
0
  if (dinfo->section == NULL
2680
0
      || dinfo->section->owner == NULL
2681
0
      || elf_elfsections (dinfo->section->owner) == NULL)
2682
    /* No section info, will use default values.  */
2683
0
    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
0
{
2730
0
  const char *option;
2731
2732
0
  if (dinfo->disassembler_options == NULL)
2733
0
    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
0
{
2762
0
  nfp_priv_data *priv;
2763
0
  int ret = false;
2764
2765
0
  if (dinfo->private_data)
2766
0
    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
0
  priv = calloc (1, sizeof (*priv));
2777
0
  if (!priv)
2778
0
    return NULL;
2779
2780
0
  switch (dinfo->mach)
2781
0
    {
2782
0
    case E_NFP_MACH_3200:
2783
0
      ret = init_nfp3200_priv (priv, dinfo);
2784
0
      break;
2785
0
    case E_NFP_MACH_6000:
2786
0
      ret = init_nfp6000_priv (priv, dinfo);
2787
0
      break;
2788
0
    }
2789
2790
0
  if (!ret)
2791
0
    {
2792
0
      free (priv);
2793
0
      return NULL;
2794
0
    }
2795
2796
0
  dinfo->private_data = priv;
2797
0
  return priv;
2798
0
}
2799
2800
static int
2801
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2802
0
{
2803
0
  nfp_priv_data *priv = init_nfp_priv (dinfo);
2804
0
  bfd_byte buffer[8];
2805
0
  int err;
2806
0
  uint64_t instr = 0;
2807
0
  size_t island, menum;
2808
0
  int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2809
0
  int is_text = 1;
2810
2811
0
  err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2812
0
  if (err)
2813
0
    return _NFP_ERR_STOP;
2814
2815
0
  if (!dinfo->section)
2816
0
    {
2817
0
      num_ctx = 8;
2818
0
      scs_cnt = 0;
2819
0
      addr_3rdparty32 = 0;
2820
0
    }
2821
0
  else
2822
0
    {
2823
0
      unsigned int sh_info = 0;
2824
0
      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
0
      if (!priv)
2829
0
  return _NFP_ERR_STOP; /* Sanity check */
2830
2831
0
      is_text = (elf_section_flags (dinfo->section)
2832
0
     & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2833
2834
0
      sh_info = elf_section_info (dinfo->section);
2835
2836
0
      switch (dinfo->mach)
2837
0
  {
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
0
  default:
2843
0
    island = SHI_NFP_ISLAND (sh_info);
2844
0
    menum = SHI_NFP_MENUM (sh_info);
2845
0
    break;
2846
0
  }
2847
2848
0
      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
0
      mecfg = &priv->mecfgs[island][menum][is_text];
2855
0
      num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2856
0
      addr_3rdparty32 = mecfg->addr_3rdparty32;
2857
0
      scs_cnt = mecfg->scs_cnt;
2858
0
    }
2859
2860
0
  if (opts->ctx_mode)
2861
0
    num_ctx = opts->ctx_mode;
2862
2863
0
  dinfo->bytes_per_line = 8;
2864
0
  dinfo->bytes_per_chunk = 8;
2865
2866
0
  instr = bfd_getl64 (buffer);
2867
2868
0
  if (opts->show_pc)
2869
0
    {
2870
0
      pc = (int) (addr >> 3);
2871
2872
      /* Guess max PC for formatting */
2873
0
      tmpj = (int) (dinfo->buffer_length >> 3);
2874
0
      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
0
      for (tmpi = 1; tmpj > 9; tmpj /= 10)
2886
0
  tmpi++;
2887
2888
0
      tmpj = pc;
2889
0
      for (; tmpj > 9; tmpj /= 10)
2890
0
  tmpi--;
2891
2892
0
      dinfo->fprintf_func (dinfo->stream, "%*c%d  ", tmpi, '.', pc);
2893
0
    }
2894
2895
0
  switch (dinfo->mach)
2896
0
    {
2897
0
    case E_NFP_MACH_3200:
2898
0
      if (NFP_ME27_INSTR_IS_CMD (instr))
2899
0
  err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2900
0
      else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2901
0
  err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2902
0
      else if (NFP_ME27_INSTR_IS_ALU (instr))
2903
0
  err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2904
0
      else if (NFP_ME27_INSTR_IS_IMMED (instr))
2905
0
  err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2906
0
      else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2907
0
  err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2908
0
      else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2909
0
  err = nfp_me27_print_ctx_arb (instr, dinfo);
2910
0
      else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2911
0
  err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2912
0
      else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2913
0
  err = nfp_me27_print_branch (instr, dinfo);
2914
0
      else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2915
0
  err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2916
0
      else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2917
0
  err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2918
0
      else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2919
0
  err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2920
0
      else if (NFP_ME27_INSTR_IS_MULT (instr))
2921
0
  err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2922
0
      else
2923
0
  err = nfp_me_print_invalid (instr, dinfo);
2924
0
      break;
2925
2926
0
    case E_NFP_MACH_6000:
2927
0
      if (NFP_ME28_INSTR_IS_CMD (instr))
2928
0
  err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2929
0
      else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2930
0
  err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2931
0
      else if (NFP_ME28_INSTR_IS_ALU (instr))
2932
0
  err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2933
0
      else if (NFP_ME28_INSTR_IS_IMMED (instr))
2934
0
  err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2935
0
      else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2936
0
  err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2937
0
      else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2938
0
  err = nfp_me28_print_ctx_arb (instr, dinfo);
2939
0
      else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2940
0
  err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2941
0
      else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2942
0
  err = nfp_me28_print_branch (instr, dinfo);
2943
0
      else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2944
0
  err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2945
0
      else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2946
0
  err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2947
0
      else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2948
0
  err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2949
0
      else if (NFP_ME28_INSTR_IS_MULT (instr))
2950
0
  err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2951
0
      else
2952
0
  err = nfp_me_print_invalid (instr, dinfo);
2953
0
      break;
2954
0
    }
2955
2956
0
  if (err < 0)
2957
0
    return err;
2958
0
  return 8;
2959
0
}
2960
2961
int
2962
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2963
0
{
2964
0
  nfp_opts opts;
2965
0
  int err;
2966
2967
0
  opts.show_pc = 1;
2968
0
  opts.ctx_mode = 0;
2969
0
  err = parse_disassembler_options (&opts, dinfo);
2970
0
  if (err < 0)
2971
0
    goto end;
2972
2973
0
  err = _print_instrs (addr, dinfo, &opts);
2974
2975
0
 end:
2976
0
  if (err != 8)
2977
0
    dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2978
0
  if (err == _NFP_ERR_CONT)
2979
0
    return 8;
2980
0
  return err;
2981
0
}
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
}