Fix error messages in the NFP sources when building for 32-bit targets.
[deliverable/binutils-gdb.git] / opcodes / nfp-dis.c
CommitLineData
fe944acf
FT
1/* Print NFP instructions for objdump.
2 Copyright (C) 2017-2018 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 "bfd_stdint.h"
37#include "libbfd.h"
38
39#define _NFP_ERR_STOP -1
40#define _NFP_ERR_CONT -8
41
fe944acf 42#define _BTST(v, b) (((v) >> b) & 1)
1678bd35
FT
43#define _BF(v, msb, lsb) (((v) >> (lsb)) & \
44 ((1U << ((msb) - (lsb) + 1)) - 1))
fe944acf
FT
45#define _BFS(v, msb, lsb, lshift) (_BF(v, msb, lsb) << (lshift))
46
47#define _NFP_ME27_28_CSR_CTX_ENABLES 0x18
48#define _NFP_ME27_28_CSR_MISC_CONTROL 0x160
49
50typedef struct
51{
52 unsigned char ctx4_mode:1;
53 unsigned char addr_3rdparty32:1;
54 unsigned char scs_cnt:2;
55 unsigned char _future:4;
56}
57nfp_priv_mecfg;
58
59typedef struct
60{
61 unsigned char show_pc;
62 unsigned char ctx_mode;
63}
64nfp_opts;
65
66/* mecfgs[island][menum][is-text] */
67typedef struct
68{
69 nfp_priv_mecfg mecfgs[64][12][2];
70}
71nfp_priv_data;
72
73static const char *nfp_mealu_shf_op[8] =
74{
75 /* 0b000 (0) */ "B",
76 /* 0b001 (1) */ "~B",
77 /* 0b010 (2) */ "AND",
78 /* 0b011 (3) */ "~AND",
79 /* 0b100 (4) */ "AND~",
80 /* 0b101 (5) */ "OR",
81 /* 0b110 (6) */ "asr",
82 /* 0b111 (7) */ "byte_align"
83};
84
85static const char *nfp_me27_28_alu_op[32] =
86{
87 /* 0b00000 (0) */ "B",
88 /* 0b00001 (1) */ "+",
89 NULL,
90 /* 0b00011 (3) */ "pop_count3",
91 /* 0b00100 (4) */ "~B",
92 /* 0b00101 (5) */ "+16",
93 /* 0b00110 (6) */ "pop_count1",
94 /* 0b00111 (7) */ "pop_count2",
95 /* 0b01000 (8) */ "AND",
96 /* 0b01001 (9) */ "+8",
97 NULL,
98 /* 0b01011 (11) */ "cam_clear",
99 /* 0b01100 (12) */ "~AND",
100 /* 0b01101 (13) */ "-carry",
101 /* 0b01110 (14) */ "ffs",
102 /* 0b01111 (15) */ "cam_read_tag",
103 /* 0b10000 (16) */ "AND~",
104 /* 0b10001 (17) */ "+carry",
105 /* 0b10010 (18) */ "CRC",
106 /* 0b10011 (19) */ "cam_write",
107 /* 0b10100 (20) */ "OR",
108 /* 0b10101 (21) */ "-",
109 NULL,
110 /* 0b10111 (23) */ "cam_lookup",
111 /* 0b11000 (24) */ "XOR",
112 /* 0b11001 (25) */ "B-A",
113 NULL,
114 /* 0b11011 (27) */ "cam_write_state",
115 NULL,
116 NULL,
117 NULL,
118 /* 0b11111 (31) */ "cam_read_state"
119};
120
121static const char *nfp_me27_28_crc_op[8] =
122{
123 /* 0b000 (0) */ "--",
124 NULL,
125 /* 0b010 (2) */ "crc_ccitt",
126 NULL,
127 /* 0b100 (4) */ "crc_32",
128 /* 0b101 (5) */ "crc_iscsi",
129 /* 0b110 (6) */ "crc_10",
130 /* 0b111 (7) */ "crc_5"
131};
132
133static const char *nfp_me27_28_crc_bytes[8] =
134{
135 /* 0b000 (0) */ "bytes_0_3",
136 /* 0b001 (1) */ "bytes_1_3",
137 /* 0b010 (2) */ "bytes_2_3",
138 /* 0b011 (3) */ "byte_3",
139 /* 0b100 (4) */ "bytes_0_2",
140 /* 0b101 (5) */ "bytes_0_1",
141 /* 0b110 (6) */ "byte_0"
142};
143
144static const char *nfp_me27_28_mecsrs[] =
145{
146 /* 0x000 (0) */ "UstorAddr",
147 /* 0x004 (1) */ "UstorDataLwr",
148 /* 0x008 (2) */ "UstorDataUpr",
149 /* 0x00c (3) */ "UstorErrStat",
150 /* 0x010 (4) */ "ALUOut",
151 /* 0x014 (5) */ "CtxArbCtrl",
152 /* 0x018 (6) */ "CtxEnables",
153 /* 0x01c (7) */ "CondCodeEn",
154 /* 0x020 (8) */ "CSRCtxPtr",
155 /* 0x024 (9) */ "PcBreakpoint0",
156 /* 0x028 (10) */ "PcBreakpoint1",
157 /* 0x02c (11) */ "PcBreakpointStatus",
158 /* 0x030 (12) */ "RegErrStatus",
159 /* 0x034 (13) */ "LMErrStatus",
160 /* 0x038 (14) */ "LMeccErrorMask",
161 NULL,
162 /* 0x040 (16) */ "IndCtxStatus",
163 /* 0x044 (17) */ "ActCtxStatus",
164 /* 0x048 (18) */ "IndCtxSglEvt",
165 /* 0x04c (19) */ "ActCtxSglEvt",
166 /* 0x050 (20) */ "IndCtxWkpEvt",
167 /* 0x054 (21) */ "ActCtxWkpEvt",
168 /* 0x058 (22) */ "IndCtxFtrCnt",
169 /* 0x05c (23) */ "ActCtxFtrCnt",
170 /* 0x060 (24) */ "IndLMAddr0",
171 /* 0x064 (25) */ "ActLMAddr0",
172 /* 0x068 (26) */ "IndLMAddr1",
173 /* 0x06c (27) */ "ActLMAddr1",
174 /* 0x070 (28) */ "ByteIndex",
175 /* 0x074 (29) */ "XferIndex",
176 /* 0x078 (30) */ "IndFtrCntSgl",
177 /* 0x07c (31) */ "ActFtrCntSgl",
178 /* 0x080 (32) */ "NNPut",
179 /* 0x084 (33) */ "NNGet",
180 NULL,
181 NULL,
182 /* 0x090 (36) */ "IndLMAddr2",
183 /* 0x094 (37) */ "ActLMAddr2",
184 /* 0x098 (38) */ "IndLMAddr3",
185 /* 0x09c (39) */ "ActLMAddr3",
186 /* 0x0a0 (40) */ "IndLMAddr2BytIdx",
187 /* 0x0a4 (41) */ "ActLMAddr2BytIdx",
188 /* 0x0a8 (42) */ "IndLMAddr3BytIdx",
189 /* 0x0ac (43) */ "ActLMAddr3BytIdx",
190 /* 0x0b0 (44) */ "IndPredCC",
191 NULL,
192 NULL,
193 NULL,
194 /* 0x0c0 (48) */ "TimestampLow",
195 /* 0x0c4 (49) */ "TimestampHgh",
196 NULL,
197 NULL,
198 NULL,
199 NULL,
200 NULL,
201 NULL,
202 /* 0x0e0 (56) */ "IndLMAddr0BytIdx",
203 /* 0x0e4 (57) */ "ActLMAddr0BytIdx",
204 /* 0x0e8 (58) */ "IndLMAddr1BytIdx",
205 /* 0x0ec (59) */ "ActLMAddr1BytIdx",
206 NULL,
207 /* 0x0f4 (61) */ "XfrAndBytIdx",
208 NULL,
209 NULL,
210 /* 0x100 (64) */ "NxtNghbrSgl",
211 /* 0x104 (65) */ "PrvNghbrSgl",
212 /* 0x108 (66) */ "SameMESignal",
213 NULL,
214 NULL,
215 NULL,
216 NULL,
217 NULL,
218 NULL,
219 NULL,
220 NULL,
221 NULL,
222 NULL,
223 NULL,
224 NULL,
225 NULL,
226 /* 0x140 (80) */ "CRCRemainder",
227 /* 0x144 (81) */ "ProfileCnt",
228 /* 0x148 (82) */ "PseudoRndNum",
229 NULL,
230 NULL,
231 NULL,
232 NULL,
233 NULL,
234 /* 0x160 (88) */ "MiscControl",
235 /* 0x164 (89) */ "PcBreakpoint0Mask",
236 /* 0x168 (90) */ "PcBreakpoint1Mask",
237 NULL,
238 /* 0x170 (92) */ "Mailbox0",
239 /* 0x174 (93) */ "Mailbox1",
240 /* 0x178 (94) */ "Mailbox2",
241 /* 0x17c (95) */ "Mailbox3",
242 NULL,
243 NULL,
244 NULL,
245 NULL,
246 /* 0x190 (100) */ "CmdIndirectRef0"
247};
248
249const char *nfp_me27_28_br_ops[32] =
250{
251 /* 0b00000 (0) */ "beq",
252 /* 0b00001 (1) */ "bne",
253 /* 0b00010 (2) */ "bmi",
254 /* 0b00011 (3) */ "bpl",
255 /* 0b00100 (4) */ "bcs",
256 /* 0b00101 (5) */ "bcc",
257 /* 0b00110 (6) */ "bvs",
258 /* 0b00111 (7) */ "bvc",
259 /* 0b01000 (8) */ "bge",
260 /* 0b01001 (9) */ "blt",
261 /* 0b01010 (10) */ "ble",
262 /* 0b01011 (11) */ "bgt",
263 /* (12) */ NULL,
264 /* (13) */ NULL,
265 /* (14) */ NULL,
266 /* (15) */ NULL,
267 /* 0b10000 (16) */ "br=ctx",
268 /* 0b10001 (17) */ "br!=ctx",
269 /* 0b10010 (18) */ "br_signal",
270 /* 0b10011 (19) */ "br_!signal",
271 /* 0b10100 (20) */ "br_inp_state",
272 /* 0b10101 (21) */ "br_!inp_state",
273 /* 0b10110 (22) */ "br_cls_state",
274 /* 0b10111 (23) */ "br_!cls_state",
275 /* 0b11000 (24) */ "br",
276 /* (25) */ NULL,
277 /* (26) */ NULL,
278 /* (27) */ NULL,
279 /* (28) */ NULL,
280 /* (29) */ NULL,
281 /* (30) */ NULL,
282 /* (31) */ NULL
283};
284
285static const char *nfp_me27_br_inpstates[16] =
286{
287 /* 0 */ "nn_empty",
288 /* 1 */ "nn_full",
289 /* 2 */ "scr_ring0_status",
290 /* 3 */ "scr_ring1_status",
291 /* 4 */ "scr_ring2_status",
292 /* 5 */ "scr_ring3_status",
293 /* 6 */ "scr_ring4_status",
294 /* 7 */ "scr_ring5_status",
295 /* 8 */ "scr_ring6_status",
296 /* 9 */ "scr_ring7_status",
297 /* 10 */ "scr_ring8_status",
298 /* 11 */ "scr_ring9_status",
299 /* 12 */ "scr_ring10_status",
300 /* 13 */ "scr_ring11_status",
301 /* 14 */ "fci_not_empty",
302 /* 15 */ "fci_full"
303};
304
305static const char *nfp_me28_br_inpstates[16] =
306{
307 /* 0 */ "nn_empty",
308 /* 1 */ "nn_full",
309 /* 2 */ "ctm_ring0_status",
310 /* 3 */ "ctm_ring1_status",
311 /* 4 */ "ctm_ring2_status",
312 /* 5 */ "ctm_ring3_status",
313 /* 6 */ "ctm_ring4_status",
314 /* 7 */ "ctm_ring5_status",
315 /* 8 */ "ctm_ring6_status",
316 /* 9 */ "ctm_ring7_status",
317 /* 10 */ "ctm_ring8_status",
318 /* 11 */ "ctm_ring9_status",
319 /* 12 */ "ctm_ring10_status",
320 /* 13 */ "ctm_ring11_status",
321 /* 14 */ "ctm_ring12_status",
322 /* 15 */ "ctm_ring13_status"
323};
324
325static const char *nfp_me27_28_mult_steps[8] =
326{
327 /* 0 */ "step1",
328 /* 1 */ "step2",
329 /* 2 */ "step3",
330 /* 3 */ "step4",
331 /* 4 */ "last",
332 /* 5 */ "last2",
333 NULL,
334 NULL
335};
336
337static const char *nfp_me27_28_mult_types[4] =
338{
339 "start",
340 "24x8",
341 "16x16",
342 "32x32"
343};
344
345/* The cmd_mnemonics arrays are sorted here in its definition so that we can
346 use bsearch () on the first three fields. There can be multiple matches
347 and we assume that bsearch can return any of them, so we manually step
348 back to the first one. */
349
350static const nfp_cmd_mnemonic nfp_me27_mnemonics[] =
351{
352 {NFP_3200_CPPTGT_MSF0, 0, 0, 0, 0, "read"},
353 {NFP_3200_CPPTGT_MSF0, 0, 2, 0, 0, "read64"},
354 {NFP_3200_CPPTGT_MSF0, 1, 0, 0, 0, "write"},
355 {NFP_3200_CPPTGT_MSF0, 1, 1, 0, 0, "fast_wr"},
356 {NFP_3200_CPPTGT_MSF0, 1, 2, 0, 0, "write64"},
357 {NFP_3200_CPPTGT_QDR, 0, 0, 0, 0, "read"},
358 {NFP_3200_CPPTGT_QDR, 1, 0, 0, 0, "write"},
359 {NFP_3200_CPPTGT_QDR, 2, 0, 0, 0, "write_atomic"},
360 {NFP_3200_CPPTGT_QDR, 2, 1, 0, 0, "swap"},
361 {NFP_3200_CPPTGT_QDR, 3, 0, 0, 0, "set"},
362 {NFP_3200_CPPTGT_QDR, 3, 1, 0, 0, "test_and_set"},
363 {NFP_3200_CPPTGT_QDR, 4, 0, 0, 0, "clr"},
364 {NFP_3200_CPPTGT_QDR, 4, 1, 0, 0, "test_and_clr"},
365 {NFP_3200_CPPTGT_QDR, 5, 0, 0, 0, "add"},
366 {NFP_3200_CPPTGT_QDR, 5, 1, 0, 0, "test_and_add"},
367 {NFP_3200_CPPTGT_QDR, 6, 0, 0, 0, "read_queue"},
368 {NFP_3200_CPPTGT_QDR, 6, 1, 0, 0, "read_queue_ring"},
369 {NFP_3200_CPPTGT_QDR, 6, 2, 0, 0, "write_queue"},
370 {NFP_3200_CPPTGT_QDR, 6, 3, 0, 0, "write_queue_ring"},
371 {NFP_3200_CPPTGT_QDR, 7, 0, 0, 0, "incr"},
372 {NFP_3200_CPPTGT_QDR, 7, 1, 0, 0, "test_and_incr"},
373 {NFP_3200_CPPTGT_QDR, 8, 0, 0, 0, "decr"},
374 {NFP_3200_CPPTGT_QDR, 8, 1, 0, 0, "test_and_decr"},
375 {NFP_3200_CPPTGT_QDR, 9, 0, 0, 0, "put"},
376 {NFP_3200_CPPTGT_QDR, 9, 1, 0, 0, "get"},
377 {NFP_3200_CPPTGT_QDR, 9, 2, 0, 0, "put_imm"},
378 {NFP_3200_CPPTGT_QDR, 9, 3, 0, 0, "pop"},
379 {NFP_3200_CPPTGT_QDR, 10, 0, 0, 0, "journal"},
380 {NFP_3200_CPPTGT_QDR, 10, 1, 0, 0, "fast_journal"},
381 {NFP_3200_CPPTGT_QDR, 11, 0, 0, 0, "dequeue"},
382 {NFP_3200_CPPTGT_QDR, 12, 0, 0, 0, "enqueue"},
383 {NFP_3200_CPPTGT_QDR, 12, 1, 0, 0, "enueue_tail"},
384 {NFP_3200_CPPTGT_QDR, 12, 2, 0, 0, "nfp_enqueue"},
385 {NFP_3200_CPPTGT_QDR, 12, 3, 0, 0, "nfp_enueue_tail"},
386 {NFP_3200_CPPTGT_QDR, 13, 0, 0, 0, "csr_wr"},
387 {NFP_3200_CPPTGT_QDR, 13, 1, 0, 0, "csr_rd"},
388 {NFP_3200_CPPTGT_QDR, 14, 0, 0, 0, "wr_qdesc"},
389 {NFP_3200_CPPTGT_QDR, 14, 1, 0, 0, "nfp_wr_qdesc"},
390 {NFP_3200_CPPTGT_QDR, 14, 2, 0, 0, "wr_qdesc_count"},
391 {NFP_3200_CPPTGT_QDR, 14, 3, 0, 0, "push_qdesc"},
392 {NFP_3200_CPPTGT_QDR, 15, 0, 0, 0, "rd_qdesc_other"},
393 {NFP_3200_CPPTGT_QDR, 15, 1, 0, 0, "rd_qdesc_tail"},
394 {NFP_3200_CPPTGT_QDR, 15, 2, 0, 0, "rd_qdesc_head"},
395 {NFP_3200_CPPTGT_QDR, 15, 3, 0, 0, "nfp_rd_qdesc"},
396 {NFP_3200_CPPTGT_MSF1, 0, 0, 0, 0, "read"},
397 {NFP_3200_CPPTGT_MSF1, 0, 2, 0, 0, "read64"},
398 {NFP_3200_CPPTGT_MSF1, 1, 0, 0, 0, "write"},
399 {NFP_3200_CPPTGT_MSF1, 1, 1, 0, 0, "fast_wr"},
400 {NFP_3200_CPPTGT_MSF1, 1, 2, 0, 0, "write64"},
401 {NFP_3200_CPPTGT_HASH, 0, 0, 0, 0, "hash_48"},
402 {NFP_3200_CPPTGT_HASH, 0, 1, 0, 0, "hash_64"},
403 {NFP_3200_CPPTGT_HASH, 0, 2, 0, 0, "hash_128"},
404 {NFP_3200_CPPTGT_MU, 0, 0, 0, 0, "read"},
405 {NFP_3200_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
406 {NFP_3200_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
407 {NFP_3200_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
408 {NFP_3200_CPPTGT_MU, 1, 0, 0, 0, "write"},
409 {NFP_3200_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
410 {NFP_3200_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
411 {NFP_3200_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
412 {NFP_3200_CPPTGT_MU, 2, 0, 0, 0, "write8"},
413 {NFP_3200_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
414 {NFP_3200_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
415 {NFP_3200_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
416 {NFP_3200_CPPTGT_MU, 3, 0, 0, 0, "read_atomic"},
417 {NFP_3200_CPPTGT_MU, 3, 1, 0, 0, "read8"},
418 {NFP_3200_CPPTGT_MU, 3, 2, 0, 0, "compare_write"},
419 {NFP_3200_CPPTGT_MU, 3, 3, 0, 0, "test_and_compare_write"},
420 {NFP_3200_CPPTGT_MU, 4, 0, 0, 0, "write_atomic"},
421 {NFP_3200_CPPTGT_MU, 4, 1, 0, 0, "swap"},
422 {NFP_3200_CPPTGT_MU, 4, 2, 0, 0, "write_atomic_imm"},
423 {NFP_3200_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
424 {NFP_3200_CPPTGT_MU, 5, 0, 0, 0, "set"},
425 {NFP_3200_CPPTGT_MU, 5, 1, 0, 0, "test_and_set"},
426 {NFP_3200_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
427 {NFP_3200_CPPTGT_MU, 5, 3, 0, 0, "test_and_set_imm"},
428 {NFP_3200_CPPTGT_MU, 6, 0, 0, 0, "clr"},
429 {NFP_3200_CPPTGT_MU, 6, 1, 0, 0, "test_and_clr"},
430 {NFP_3200_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
431 {NFP_3200_CPPTGT_MU, 6, 3, 0, 0, "test_and_clr_imm"},
432 {NFP_3200_CPPTGT_MU, 7, 0, 0, 4, "add"},
433 {NFP_3200_CPPTGT_MU, 7, 0, 4, 4, "add64"},
434 {NFP_3200_CPPTGT_MU, 7, 1, 0, 4, "test_and_add"},
435 {NFP_3200_CPPTGT_MU, 7, 1, 4, 4, "test_and_add64"},
436 {NFP_3200_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
437 {NFP_3200_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
438 {NFP_3200_CPPTGT_MU, 7, 3, 0, 4, "test_and_add_imm"},
439 {NFP_3200_CPPTGT_MU, 7, 3, 4, 4, "test_and_add64_imm"},
440 {NFP_3200_CPPTGT_MU, 8, 0, 0, 4, "add_sat"},
441 {NFP_3200_CPPTGT_MU, 8, 0, 4, 4, "add64_sat"},
442 {NFP_3200_CPPTGT_MU, 8, 1, 0, 4, "test_and_add_sat"},
443 {NFP_3200_CPPTGT_MU, 8, 1, 4, 4, "test_and_add64_sat"},
444 {NFP_3200_CPPTGT_MU, 8, 2, 0, 4, "add_imm_sat"},
445 {NFP_3200_CPPTGT_MU, 8, 2, 4, 4, "add_imm_sat"},
446 {NFP_3200_CPPTGT_MU, 8, 3, 0, 0, "test_and_add_sat_imm"},
447 {NFP_3200_CPPTGT_MU, 9, 0, 0, 4, "sub"},
448 {NFP_3200_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
449 {NFP_3200_CPPTGT_MU, 9, 1, 0, 4, "test_and_sub"},
450 {NFP_3200_CPPTGT_MU, 9, 1, 4, 4, "test_and_sub64"},
451 {NFP_3200_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
452 {NFP_3200_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
453 {NFP_3200_CPPTGT_MU, 9, 3, 0, 0, "tes_and_sub_imm"},
454 {NFP_3200_CPPTGT_MU, 10, 0, 0, 4, "sub_sat"},
455 {NFP_3200_CPPTGT_MU, 10, 0, 4, 4, "sub64_sat"},
456 {NFP_3200_CPPTGT_MU, 10, 1, 0, 4, "test_and_sub_sat"},
457 {NFP_3200_CPPTGT_MU, 10, 1, 4, 4, "test_and_sub64_sat"},
458 {NFP_3200_CPPTGT_MU, 10, 2, 0, 4, "sub_imm_sat"},
459 {NFP_3200_CPPTGT_MU, 10, 2, 4, 4, "sub64_imm_sat"},
460 {NFP_3200_CPPTGT_MU, 10, 3, 0, 0, "test_and_sub_sat_imm"},
461 {NFP_3200_CPPTGT_MU, 11, 0, 0, 0, "release_ticket"},
462 {NFP_3200_CPPTGT_MU, 11, 1, 0, 0, "release_ticket_ind"},
463 {NFP_3200_CPPTGT_MU, 12, 0, 0, 0, "cam_lookup"},
464 {NFP_3200_CPPTGT_MU, 12, 1, 0, 0, "cam_lookup_add"},
465 {NFP_3200_CPPTGT_MU, 12, 2, 0, 0, "tcam_lookup"},
466 {NFP_3200_CPPTGT_MU, 12, 3, 0, 3, "lock"},
467 {NFP_3200_CPPTGT_MU, 12, 3, 2, 3, "cam_lookup_add_inc"},
468 {NFP_3200_CPPTGT_MU, 13, 0, 0, 4, "microq128_get"},
469 {NFP_3200_CPPTGT_MU, 13, 0, 4, 4, "microq256_get"},
470 {NFP_3200_CPPTGT_MU, 13, 1, 0, 4, "microq128_pop"},
471 {NFP_3200_CPPTGT_MU, 13, 1, 4, 4, "microq256_pop"},
472 {NFP_3200_CPPTGT_MU, 13, 2, 0, 4, "microq128_put"},
473 {NFP_3200_CPPTGT_MU, 13, 2, 4, 4, "microq256_put"},
474 {NFP_3200_CPPTGT_MU, 14, 0, 0, 4, "queue128_lock"},
475 {NFP_3200_CPPTGT_MU, 14, 0, 4, 4, "queue256_lock"},
476 {NFP_3200_CPPTGT_MU, 14, 1, 0, 4, "queue128_unlock"},
477 {NFP_3200_CPPTGT_MU, 14, 1, 4, 4, "queue256_unlock"},
478 {NFP_3200_CPPTGT_MU, 15, 0, 0, 0, "xor"},
479 {NFP_3200_CPPTGT_MU, 15, 1, 0, 0, "test_and_xor"},
480 {NFP_3200_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
481 {NFP_3200_CPPTGT_MU, 15, 3, 0, 0, "test_and_xor_imm"},
482 {NFP_3200_CPPTGT_MU, 16, 0, 0, 0, "rd_qdesc"},
483 {NFP_3200_CPPTGT_MU, 16, 1, 0, 0, "wr_qdesc"},
484 {NFP_3200_CPPTGT_MU, 16, 2, 0, 0, "push_qdesc"},
485 {NFP_3200_CPPTGT_MU, 16, 3, 0, 0, "tag_writeback"},
486 {NFP_3200_CPPTGT_MU, 17, 0, 0, 0, "enqueue"},
487 {NFP_3200_CPPTGT_MU, 17, 1, 0, 0, "enqueue_tail"},
488 {NFP_3200_CPPTGT_MU, 17, 2, 0, 0, "dequeue"},
489 {NFP_3200_CPPTGT_MU, 18, 0, 0, 0, "read_queue"},
490 {NFP_3200_CPPTGT_MU, 18, 1, 0, 0, "read_queue_ring"},
491 {NFP_3200_CPPTGT_MU, 18, 2, 0, 0, "write_queue"},
492 {NFP_3200_CPPTGT_MU, 18, 3, 0, 0, "write_queue_ring"},
493 {NFP_3200_CPPTGT_MU, 19, 0, 0, 0, "add_tail"},
494 {NFP_3200_CPPTGT_MU, 19, 1, 0, 0, "qadd_thread"},
495 {NFP_3200_CPPTGT_MU, 19, 2, 0, 0, "qadd_work"},
496 {NFP_3200_CPPTGT_MU, 19, 3, 0, 0, "qadd_work_imm"},
497 {NFP_3200_CPPTGT_MU, 20, 0, 0, 0, "put"},
498 {NFP_3200_CPPTGT_MU, 20, 1, 0, 0, "put_tag"},
499 {NFP_3200_CPPTGT_MU, 20, 2, 0, 0, "journal"},
500 {NFP_3200_CPPTGT_MU, 20, 3, 0, 0, "journal_tag"},
501 {NFP_3200_CPPTGT_MU, 21, 0, 0, 0, "get"},
502 {NFP_3200_CPPTGT_MU, 21, 1, 0, 0, "get_eop"},
503 {NFP_3200_CPPTGT_MU, 21, 2, 0, 0, "get_safe"},
504 {NFP_3200_CPPTGT_MU, 21, 3, 0, 0, "get_tag_safe"},
505 {NFP_3200_CPPTGT_MU, 22, 0, 0, 0, "pop"},
506 {NFP_3200_CPPTGT_MU, 22, 1, 0, 0, "pop_eop"},
507 {NFP_3200_CPPTGT_MU, 22, 2, 0, 0, "pop_safe"},
508 {NFP_3200_CPPTGT_MU, 22, 3, 0, 0, "pop_tag_safe"},
509 {NFP_3200_CPPTGT_MU, 23, 0, 0, 0, "fast_journal"},
510 {NFP_3200_CPPTGT_MU, 23, 1, 0, 0, "fast_journal_sig"},
511 {NFP_3200_CPPTGT_GS, 0, 0, 0, 0, "read"},
512 {NFP_3200_CPPTGT_GS, 1, 0, 0, 0, "write"},
513 {NFP_3200_CPPTGT_GS, 2, 0, 0, 0, "write_atomic"},
514 {NFP_3200_CPPTGT_GS, 2, 1, 0, 0, "swap"},
515 {NFP_3200_CPPTGT_GS, 3, 0, 0, 0, "set"},
516 {NFP_3200_CPPTGT_GS, 3, 1, 0, 0, "test_and_set"},
517 {NFP_3200_CPPTGT_GS, 4, 0, 0, 0, "clr"},
518 {NFP_3200_CPPTGT_GS, 4, 1, 0, 0, "test_and_clr"},
519 {NFP_3200_CPPTGT_GS, 5, 0, 0, 0, "add"},
520 {NFP_3200_CPPTGT_GS, 5, 1, 0, 0, "test_and_add"},
521 {NFP_3200_CPPTGT_GS, 6, 0, 0, 0, "sub"},
522 {NFP_3200_CPPTGT_GS, 6, 1, 0, 0, "test_and_sub"},
523 {NFP_3200_CPPTGT_GS, 7, 0, 0, 0, "inc"},
524 {NFP_3200_CPPTGT_GS, 7, 1, 0, 0, "test_and_inc"},
525 {NFP_3200_CPPTGT_GS, 8, 0, 0, 0, "dec"},
526 {NFP_3200_CPPTGT_GS, 8, 1, 0, 0, "test_and_dec"},
527 {NFP_3200_CPPTGT_GS, 9, 0, 0, 0, "get"},
528 {NFP_3200_CPPTGT_GS, 10, 0, 0, 0, "put"},
529 {NFP_3200_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
530 {NFP_3200_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
531 {NFP_3200_CPPTGT_PCIE, 2, 0, 0, 0, "read_internal"},
532 {NFP_3200_CPPTGT_PCIE, 3, 0, 0, 0, "write_internal"},
533 {NFP_3200_CPPTGT_ARM, 0, 0, 0, 0, "read"},
534 {NFP_3200_CPPTGT_ARM, 1, 0, 0, 0, "write"},
535 {NFP_3200_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
536 {NFP_3200_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
537 {NFP_3200_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
538 {NFP_3200_CPPTGT_CAP, 0, 0, 0, 0, "read_enum"},
539 {NFP_3200_CPPTGT_CAP, 0, 1, 0, 0, "read"},
540 {NFP_3200_CPPTGT_CAP, 0, 2, 0, 0, "read_reflect"},
541 {NFP_3200_CPPTGT_CAP, 1, 0, 0, 0, "write_enum"},
542 {NFP_3200_CPPTGT_CAP, 1, 1, 0, 0, "write"},
543 {NFP_3200_CPPTGT_CAP, 1, 2, 0, 0, "write_reflect"},
544 {NFP_3200_CPPTGT_CAP, 2, 0, 0, 0, "fast_wr_alu"},
545 {NFP_3200_CPPTGT_CAP, 3, 0, 0, 0, "fast_wr"},
546 {NFP_3200_CPPTGT_CT, 1, 0, 0, 0, "write"},
547 {NFP_3200_CPPTGT_CLS, 0, 0, 0, 0, "read_be"},
548 {NFP_3200_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
549 {NFP_3200_CPPTGT_CLS, 0, 2, 0, 0, "test_and_compare_write"},
550 {NFP_3200_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
551 {NFP_3200_CPPTGT_CLS, 1, 0, 0, 0, "write_be"},
552 {NFP_3200_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
553 {NFP_3200_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
554 {NFP_3200_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
555 {NFP_3200_CPPTGT_CLS, 2, 0, 0, 0, "set"},
556 {NFP_3200_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
557 {NFP_3200_CPPTGT_CLS, 2, 2, 0, 0, "test_and_set"},
558 {NFP_3200_CPPTGT_CLS, 2, 3, 0, 0, "test_and_clr"},
559 {NFP_3200_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
560 {NFP_3200_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
561 {NFP_3200_CPPTGT_CLS, 3, 2, 0, 0, "test_and_set_imm"},
562 {NFP_3200_CPPTGT_CLS, 3, 3, 0, 0, "test_and_clr_imm"},
563 {NFP_3200_CPPTGT_CLS, 4, 0, 0, 0, "add"},
564 {NFP_3200_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
565 {NFP_3200_CPPTGT_CLS, 4, 2, 0, 0, "add_sat"},
566 {NFP_3200_CPPTGT_CLS, 4, 3, 0, 0, "test_and_add_sat"},
567 {NFP_3200_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
568 {NFP_3200_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
569 {NFP_3200_CPPTGT_CLS, 5, 2, 0, 0, "add_imm_sat"},
570 {NFP_3200_CPPTGT_CLS, 5, 3, 0, 0, "test_and_add_imm_sat"},
571 {NFP_3200_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
572 {NFP_3200_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
573 {NFP_3200_CPPTGT_CLS, 6, 2, 0, 0, "sub_sat"},
574 {NFP_3200_CPPTGT_CLS, 6, 3, 0, 0, "test_and_sub_sat"},
575 {NFP_3200_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
576 {NFP_3200_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
577 {NFP_3200_CPPTGT_CLS, 7, 2, 0, 0, "sub_imm_sat"},
578 {NFP_3200_CPPTGT_CLS, 7, 3, 0, 0, "test_and_sub_imm_sat"},
579 {NFP_3200_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
580 {NFP_3200_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
581 {NFP_3200_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
582 {NFP_3200_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
583 {NFP_3200_CPPTGT_CLS, 9, 0, 0, 0, "get"},
584 {NFP_3200_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
585 {NFP_3200_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
586 {NFP_3200_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
587 {NFP_3200_CPPTGT_CLS, 10, 0, 0, 0, "put"},
588 {NFP_3200_CPPTGT_CLS, 10, 1, 0, 0, "put_offset"},
589 {NFP_3200_CPPTGT_CLS, 10, 2, 0, 0, "journal"},
590 {NFP_3200_CPPTGT_CLS, 10, 3, 0, 0, "add_tail"},
591 {NFP_3200_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
592 {NFP_3200_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
593 {NFP_3200_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
594 {NFP_3200_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
595 {NFP_3200_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
596 {NFP_3200_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
597 {NFP_3200_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
598 {NFP_3200_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
599 {NFP_3200_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
600 {NFP_3200_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
601 {NFP_3200_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
602 {NFP_3200_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
603 {NFP_3200_CPPTGT_CLS, 14, 0, 0, 0, "reflect_from_sig_src"},
604 {NFP_3200_CPPTGT_CLS, 14, 1, 0, 0, "reflect_from_sig_dst"},
605 {NFP_3200_CPPTGT_CLS, 14, 2, 0, 0, "reflect_from_sig_both"},
606 {NFP_3200_CPPTGT_CLS, 15, 0, 0, 0, "reflect_to_sig_src"},
607 {NFP_3200_CPPTGT_CLS, 15, 1, 0, 0, "reflect_to_sig_dst"},
608 {NFP_3200_CPPTGT_CLS, 15, 2, 0, 0, "reflect_to_sig_both"}
609};
610
611static const nfp_cmd_mnemonic nfp_me28_mnemonics[] =
612{
613 {NFP_6000_CPPTGT_NBI, 0, 0, 0, 0, "read"},
614 {NFP_6000_CPPTGT_NBI, 1, 0, 0, 0, "write"},
615 {NFP_6000_CPPTGT_NBI, 3, 0, 0, 0, "packet_ready_drop"},
616 {NFP_6000_CPPTGT_NBI, 3, 1, 0, 0, "packet_ready_unicast"},
617 {NFP_6000_CPPTGT_NBI, 3, 2, 0, 0, "packet_ready_multicast_dont_free"},
618 {NFP_6000_CPPTGT_NBI, 3, 3, 0, 0, "packet_ready_multicast_free_on_last"},
619 {NFP_6000_CPPTGT_ILA, 0, 0, 0, 0, "read"},
620 {NFP_6000_CPPTGT_ILA, 0, 1, 0, 0, "read_check_error"},
621 {NFP_6000_CPPTGT_ILA, 1, 0, 0, 0, "write"},
622 {NFP_6000_CPPTGT_ILA, 1, 1, 0, 0, "write_check_error"},
623 {NFP_6000_CPPTGT_ILA, 2, 0, 0, 0, "read_int"},
624 {NFP_6000_CPPTGT_ILA, 3, 0, 0, 7, "write_int"},
625 {NFP_6000_CPPTGT_ILA, 3, 0, 3, 7, "write_dma"},
626 {NFP_6000_CPPTGT_MU, 0, 0, 0, 0, "read"},
627 {NFP_6000_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
628 {NFP_6000_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
629 {NFP_6000_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
630 {NFP_6000_CPPTGT_MU, 1, 0, 0, 0, "write"},
631 {NFP_6000_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
632 {NFP_6000_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
633 {NFP_6000_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
634 {NFP_6000_CPPTGT_MU, 2, 0, 0, 0, "write8"},
635 {NFP_6000_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
636 {NFP_6000_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
637 {NFP_6000_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
638 {NFP_6000_CPPTGT_MU, 3, 0, 0, 0, "atomic_read"},
639 {NFP_6000_CPPTGT_MU, 3, 1, 0, 0, "read8"},
640 {NFP_6000_CPPTGT_MU, 3, 2, 0, 0,
641 "compare_write_or_incr/mask_compare_write"},
642 {NFP_6000_CPPTGT_MU, 3, 3, 0, 0,
643 "test_compare_write_or_incr/test_mask_compare_write"},
644 {NFP_6000_CPPTGT_MU, 4, 0, 0, 0, "atomic_write"},
645 {NFP_6000_CPPTGT_MU, 4, 1, 0, 0, "swap"},
646 {NFP_6000_CPPTGT_MU, 4, 2, 0, 0, "atomic_write_imm"},
647 {NFP_6000_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
648 {NFP_6000_CPPTGT_MU, 5, 0, 0, 0, "set"},
649 {NFP_6000_CPPTGT_MU, 5, 1, 0, 0, "test_set"},
650 {NFP_6000_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
651 {NFP_6000_CPPTGT_MU, 5, 3, 0, 0, "test_set_imm"},
652 {NFP_6000_CPPTGT_MU, 6, 0, 0, 0, "clr"},
653 {NFP_6000_CPPTGT_MU, 6, 1, 0, 0, "test_clr"},
654 {NFP_6000_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
655 {NFP_6000_CPPTGT_MU, 6, 3, 0, 0, "test_clr_imm"},
656 {NFP_6000_CPPTGT_MU, 7, 0, 0, 4, "add"},
657 {NFP_6000_CPPTGT_MU, 7, 0, 4, 4, "add64"},
658 {NFP_6000_CPPTGT_MU, 7, 1, 0, 4, "test_add"},
659 {NFP_6000_CPPTGT_MU, 7, 1, 4, 4, "test_add64"},
660 {NFP_6000_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
661 {NFP_6000_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
662 {NFP_6000_CPPTGT_MU, 7, 3, 0, 4, "test_add_imm"},
663 {NFP_6000_CPPTGT_MU, 7, 3, 4, 4, "test_add64_imm"},
664 {NFP_6000_CPPTGT_MU, 8, 0, 0, 4, "addsat"},
665 {NFP_6000_CPPTGT_MU, 8, 0, 4, 4, "addsat64"},
666 {NFP_6000_CPPTGT_MU, 8, 1, 0, 4, "test_addsat"},
667 {NFP_6000_CPPTGT_MU, 8, 1, 4, 4, "test_addsat64"},
668 {NFP_6000_CPPTGT_MU, 8, 2, 0, 4, "addsat_imm"},
669 {NFP_6000_CPPTGT_MU, 8, 2, 4, 4, "addsat64_imm"},
670 {NFP_6000_CPPTGT_MU, 8, 3, 0, 4, "test_addsat_imm"},
671 {NFP_6000_CPPTGT_MU, 8, 3, 4, 4, "test_addsat64_imm"},
672 {NFP_6000_CPPTGT_MU, 9, 0, 0, 4, "sub"},
673 {NFP_6000_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
674 {NFP_6000_CPPTGT_MU, 9, 1, 0, 4, "test_sub"},
675 {NFP_6000_CPPTGT_MU, 9, 1, 4, 4, "test_sub64"},
676 {NFP_6000_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
677 {NFP_6000_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
678 {NFP_6000_CPPTGT_MU, 9, 3, 0, 4, "test_sub_imm"},
679 {NFP_6000_CPPTGT_MU, 9, 3, 4, 4, "test_sub64_imm"},
680 {NFP_6000_CPPTGT_MU, 10, 0, 0, 4, "subsat"},
681 {NFP_6000_CPPTGT_MU, 10, 0, 4, 4, "subsat64"},
682 {NFP_6000_CPPTGT_MU, 10, 1, 0, 4, "test_subsat"},
683 {NFP_6000_CPPTGT_MU, 10, 1, 4, 4, "test_subsat64"},
684 {NFP_6000_CPPTGT_MU, 10, 2, 0, 4, "subsat_imm"},
685 {NFP_6000_CPPTGT_MU, 10, 2, 4, 4, "subsat64_imm"},
686 {NFP_6000_CPPTGT_MU, 10, 3, 0, 4, "test_subsat_imm"},
687 {NFP_6000_CPPTGT_MU, 10, 3, 4, 4, "test_subsat64_imm"},
688 {NFP_6000_CPPTGT_MU, 11, 0, 0, 0, "ticket_release"},
689 {NFP_6000_CPPTGT_MU, 11, 1, 0, 0, "ticket_release_ind"},
690 {NFP_6000_CPPTGT_MU, 12, 0, 0, 7, "cam128_lookup8/cam384_lookup8"},
691 {NFP_6000_CPPTGT_MU, 12, 0, 1, 7, "cam128_lookup16/cam384_lookup16"},
692 {NFP_6000_CPPTGT_MU, 12, 0, 2, 7, "cam128_lookup24/cam384_lookup24"},
693 {NFP_6000_CPPTGT_MU, 12, 0, 3, 7, "cam128_lookup32/cam384_lookup32"},
694 {NFP_6000_CPPTGT_MU, 12, 0, 4, 7, "cam256_lookup8/cam512_lookup8"},
695 {NFP_6000_CPPTGT_MU, 12, 0, 5, 7, "cam256_lookup16/cam512_lookup16"},
696 {NFP_6000_CPPTGT_MU, 12, 0, 6, 7, "cam256_lookup24/cam512_lookup24"},
697 {NFP_6000_CPPTGT_MU, 12, 0, 7, 7, "cam256_lookup32/cam512_lookup32"},
698 {NFP_6000_CPPTGT_MU, 12, 1, 0, 7,
699 "cam128_lookup8_add/cam384_lookup8_add"},
700 {NFP_6000_CPPTGT_MU, 12, 1, 1, 7,
701 "cam128_lookup16_add/cam384_lookup16_add"},
702 {NFP_6000_CPPTGT_MU, 12, 1, 2, 7,
703 "cam128_lookup24_add/cam384_lookup24_add"},
704 {NFP_6000_CPPTGT_MU, 12, 1, 3, 7,
705 "cam128_lookup32_add/cam384_lookup32_add"},
706 {NFP_6000_CPPTGT_MU, 12, 1, 4, 7,
707 "cam256_lookup8_add/cam512_lookup8_add"},
708 {NFP_6000_CPPTGT_MU, 12, 1, 5, 7,
709 "cam256_lookup16_add/cam512_lookup16_add"},
710 {NFP_6000_CPPTGT_MU, 12, 1, 6, 7,
711 "cam256_lookup24_add/cam512_lookup24_add"},
712 {NFP_6000_CPPTGT_MU, 12, 1, 7, 7,
713 "cam256_lookup32_add/cam512_lookup32_add"},
714 {NFP_6000_CPPTGT_MU, 12, 2, 0, 7, "tcam128_lookup8/tcam384_lookup8"},
715 {NFP_6000_CPPTGT_MU, 12, 2, 1, 7, "tcam128_lookup16/tcam384_lookup16"},
716 {NFP_6000_CPPTGT_MU, 12, 2, 2, 7, "tcam128_lookup24/tcam384_lookup24"},
717 {NFP_6000_CPPTGT_MU, 12, 2, 3, 7, "tcam128_lookup32/tcam384_lookup32"},
718 {NFP_6000_CPPTGT_MU, 12, 2, 4, 7, "tcam256_lookup8/tcam512_lookup8"},
719 {NFP_6000_CPPTGT_MU, 12, 2, 5, 7, "tcam256_lookup16/tcam512_lookup16"},
720 {NFP_6000_CPPTGT_MU, 12, 2, 6, 7, "tcam256_lookup24/tcam512_lookup24"},
721 {NFP_6000_CPPTGT_MU, 12, 2, 7, 7, "tcam256_lookup32/tcam512_lookup32"},
722 {NFP_6000_CPPTGT_MU, 12, 3, 0, 7, "lock128/lock384"},
723 {NFP_6000_CPPTGT_MU, 12, 3, 2, 7,
724 "cam128_lookup24_add_inc/cam384_lookup24_add_inc"},
725 {NFP_6000_CPPTGT_MU, 12, 3, 4, 7, "lock256/lock512"},
726 {NFP_6000_CPPTGT_MU, 12, 3, 6, 7,
727 "cam256_lookup24_add_inc/cam512_lookup24_add_inc"},
728 {NFP_6000_CPPTGT_MU, 13, 0, 0, 7, "microq128_get"},
729 {NFP_6000_CPPTGT_MU, 13, 0, 4, 7, "microq256_get"},
730 {NFP_6000_CPPTGT_MU, 13, 1, 0, 7, "microq128_pop"},
731 {NFP_6000_CPPTGT_MU, 13, 1, 4, 7, "microq256_pop"},
732 {NFP_6000_CPPTGT_MU, 13, 2, 0, 7, "microq128_put"},
733 {NFP_6000_CPPTGT_MU, 13, 2, 4, 7, "microq256_put"},
734 {NFP_6000_CPPTGT_MU, 14, 0, 0, 7, "queue128_lock"},
735 {NFP_6000_CPPTGT_MU, 14, 0, 4, 7, "queue256_lock"},
736 {NFP_6000_CPPTGT_MU, 14, 1, 0, 7, "queue128_unlock"},
737 {NFP_6000_CPPTGT_MU, 14, 1, 4, 7, "queue256_unlock"},
738 {NFP_6000_CPPTGT_MU, 15, 0, 0, 0, "xor"},
739 {NFP_6000_CPPTGT_MU, 15, 1, 0, 0, "test_xor"},
740 {NFP_6000_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
741 {NFP_6000_CPPTGT_MU, 15, 3, 0, 0, "test_xor_imm"},
742 {NFP_6000_CPPTGT_MU, 16, 0, 0, 0,
743 "ctm.packet_wait_packet_status/emem.rd_qdesc/imem.stats_log"},
744 {NFP_6000_CPPTGT_MU, 16, 1, 0, 0,
745 "ctm.packet_read_packet_status/emem.wr_qdesc/imem.stats_log_sat"},
746 {NFP_6000_CPPTGT_MU, 16, 2, 0, 0,
747 "emem.push_qdesc/imem.stats_log_event"},
748 {NFP_6000_CPPTGT_MU, 16, 3, 0, 0, "imem.stats_log_sat_event"},
749 {NFP_6000_CPPTGT_MU, 17, 0, 0, 0,
750 "ctm.packet_alloc/emem.enqueue/imem.stats_push"},
751 {NFP_6000_CPPTGT_MU, 17, 1, 0, 0,
752 "ctm.packet_credit_get/emem.enqueue_tail/imem.stats_push_clear"},
753 {NFP_6000_CPPTGT_MU, 17, 2, 0, 0, "ctm.packet_alloc_poll/emem.dequeue"},
754 {NFP_6000_CPPTGT_MU, 17, 3, 0, 0, "ctm.packet_add_thread"},
755 {NFP_6000_CPPTGT_MU, 18, 0, 0, 0,
756 "ctm.packet_free/emem.read_queue/imem.lb_write_desc"},
757 {NFP_6000_CPPTGT_MU, 18, 1, 0, 0,
758 "ctm.packet_free_and_signal/emem.read_queue_ring/imem.lb_read_desc"},
759 {NFP_6000_CPPTGT_MU, 18, 2, 0, 0,
760 "ctm.packet_free_and_return_pointer/emem.write_queue"},
761 {NFP_6000_CPPTGT_MU, 18, 3, 0, 0,
762 "ctm.packet_return_pointer/emem.write_queue_ring"},
763 {NFP_6000_CPPTGT_MU, 19, 0, 0, 0,
764 "ctm.packet_complete_drop/emem.add_tail/imem.lb_write_idtable"},
765 {NFP_6000_CPPTGT_MU, 19, 1, 0, 0,
766 "ctm.packet_complete_unicast/emem.qadd_thread/imem.lb_read_idtable"},
767 {NFP_6000_CPPTGT_MU, 19, 2, 0, 0,
768 "ctm.packet_complete_multicast/emem.qadd_work"},
769 {NFP_6000_CPPTGT_MU, 19, 3, 0, 0,
770 "ctm.packet_complete_multicast_free/emem.qadd_work_imm"},
771 {NFP_6000_CPPTGT_MU, 20, 0, 0, 0,
772 "ctm.pe_dma_to_memory_packet/emem.put/imem.lb_bucket_write_local"},
773 {NFP_6000_CPPTGT_MU, 20, 1, 0, 0,
774 "ctm.pe_dma_to_memory_packet_swap/imem.lb_bucket_write_dcache"},
775 {NFP_6000_CPPTGT_MU, 20, 2, 0, 0,
776 "ctm.pe_dma_to_memory_packet_free/emem.journal"},
777 {NFP_6000_CPPTGT_MU, 20, 3, 0, 0,
778 "ctm.pe_dma_to_memory_packet_free_swap"},
779 {NFP_6000_CPPTGT_MU, 21, 0, 0, 0,
780 "ctm.pe_dma_to_memory_indirect/emem.get/imem.lb_bucket_read_local"},
781 {NFP_6000_CPPTGT_MU, 21, 1, 0, 0,
782 "ctm.pe_dma_to_memory_indirect_swap/emem.get_eop/"
783 "imem.lb_bucket_read_dcache"},
784 {NFP_6000_CPPTGT_MU, 21, 2, 0, 0,
785 "ctm.pe_dma_to_memory_indirect_free/emem.get_freely"},
786 {NFP_6000_CPPTGT_MU, 21, 3, 0, 0,
787 "ctm.pe_dma_to_memory_indirect_free_swap"},
788 {NFP_6000_CPPTGT_MU, 22, 0, 0, 0,
789 "ctm.pe_dma_to_memory_buffer/emem.pop/imem.lb_lookup_bundleid"},
790 {NFP_6000_CPPTGT_MU, 22, 1, 0, 0,
791 "ctm.pe_dma_to_memory_buffer_le/emem.pop_eop/imem.lb_lookup_dcache"},
792 {NFP_6000_CPPTGT_MU, 22, 2, 0, 0,
793 "ctm.pe_dma_to_memory_buffer_swap/emem.pop_freely/imem.lb_lookup_idtable"},
794 {NFP_6000_CPPTGT_MU, 22, 3, 0, 0, "ctm.pe_dma_to_memory_buffer_le_swap"},
795 {NFP_6000_CPPTGT_MU, 23, 0, 0, 0,
796 "ctm.pe_dma_from_memory_buffer/emem.fast_journal/imem.lb_push_stats_local"},
797 {NFP_6000_CPPTGT_MU, 23, 1, 0, 0,
798 "ctm.pe_dma_from_memory_buffer_le/emem.fast_journal_sig/"
799 "imem.lb_push_stats_dcache"},
800 {NFP_6000_CPPTGT_MU, 23, 2, 0, 0,
801 "ctm.pe_dma_from_memory_buffer_swap/imem.lb_push_stats_local_clr"},
802 {NFP_6000_CPPTGT_MU, 23, 3, 0, 0,
803 "ctm.pe_dma_from_memory_buffer_le_swap/imem.lb_push_stats_dcache_clr"},
804 {NFP_6000_CPPTGT_MU, 26, 0, 0, 0, "emem.lookup/imem.lookup"},
805 {NFP_6000_CPPTGT_MU, 28, 0, 0, 0, "read32"},
806 {NFP_6000_CPPTGT_MU, 28, 1, 0, 0, "read32_le"},
807 {NFP_6000_CPPTGT_MU, 28, 2, 0, 0, "read32_swap"},
808 {NFP_6000_CPPTGT_MU, 28, 3, 0, 0, "read32_swap_le"},
809 {NFP_6000_CPPTGT_MU, 29, 1, 0, 0, "cam_lookup_add_lock"},
810 {NFP_6000_CPPTGT_MU, 29, 2, 0, 0, "cam_lookup_add_extend"},
811 {NFP_6000_CPPTGT_MU, 29, 3, 0, 0, "cam_lookup_add_inc"},
812 {NFP_6000_CPPTGT_MU, 30, 2, 0, 0, "meter"},
813 {NFP_6000_CPPTGT_MU, 31, 0, 0, 0, "write32"},
814 {NFP_6000_CPPTGT_MU, 31, 1, 0, 0, "write32_le"},
815 {NFP_6000_CPPTGT_MU, 31, 2, 0, 0, "write32_swap"},
816 {NFP_6000_CPPTGT_MU, 31, 3, 0, 0, "write32_swap_le"},
817 {NFP_6000_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
818 {NFP_6000_CPPTGT_PCIE, 0, 1, 0, 0, "read_rid"},
819 {NFP_6000_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
820 {NFP_6000_CPPTGT_PCIE, 1, 1, 0, 0, "write_rid"},
821 {NFP_6000_CPPTGT_PCIE, 1, 2, 0, 0, "write_vdm"},
822 {NFP_6000_CPPTGT_PCIE, 2, 0, 0, 0, "read_int"},
823 {NFP_6000_CPPTGT_PCIE, 3, 0, 0, 0, "write_int"},
824 {NFP_6000_CPPTGT_ARM, 0, 0, 0, 0, "read"},
825 {NFP_6000_CPPTGT_ARM, 1, 0, 0, 0, "write"},
826 {NFP_6000_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
827 {NFP_6000_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
828 {NFP_6000_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
829 {NFP_6000_CPPTGT_CTXPB, 0, 0, 0, 0, "xpb_read"},
830 {NFP_6000_CPPTGT_CTXPB, 0, 1, 0, 0, "ring_get"},
831 {NFP_6000_CPPTGT_CTXPB, 0, 2, 0, 0, "interthread_signal"},
832 {NFP_6000_CPPTGT_CTXPB, 1, 0, 0, 0, "xpb_write"},
833 {NFP_6000_CPPTGT_CTXPB, 1, 1, 0, 0, "ring_put"},
834 {NFP_6000_CPPTGT_CTXPB, 1, 2, 0, 0, "ctnn_write"},
835 {NFP_6000_CPPTGT_CTXPB, 2, 0, 0, 0, "reflect_read_none"},
836 {NFP_6000_CPPTGT_CTXPB, 2, 1, 0, 0, "reflect_read_sig_init"},
837 {NFP_6000_CPPTGT_CTXPB, 2, 2, 0, 0, "reflect_read_sig_remote"},
838 {NFP_6000_CPPTGT_CTXPB, 2, 3, 0, 0, "reflect_read_sig_both"},
839 {NFP_6000_CPPTGT_CTXPB, 3, 0, 0, 0, "reflect_write_none"},
840 {NFP_6000_CPPTGT_CTXPB, 3, 1, 0, 0, "reflect_write_sig_init"},
841 {NFP_6000_CPPTGT_CTXPB, 3, 2, 0, 0, "reflect_write_sig_remote"},
842 {NFP_6000_CPPTGT_CTXPB, 3, 3, 0, 0, "reflect_write_sig_both"},
843 {NFP_6000_CPPTGT_CLS, 0, 0, 0, 0, "read"},
844 {NFP_6000_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
845 {NFP_6000_CPPTGT_CLS, 0, 2, 0, 0, "swap/test_compare_write"},
846 {NFP_6000_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
847 {NFP_6000_CPPTGT_CLS, 1, 0, 0, 0, "write"},
848 {NFP_6000_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
849 {NFP_6000_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
850 {NFP_6000_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
851 {NFP_6000_CPPTGT_CLS, 2, 0, 0, 0, "set"},
852 {NFP_6000_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
853 {NFP_6000_CPPTGT_CLS, 2, 2, 0, 0, "test_set"},
854 {NFP_6000_CPPTGT_CLS, 2, 3, 0, 0, "test_clr"},
855 {NFP_6000_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
856 {NFP_6000_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
857 {NFP_6000_CPPTGT_CLS, 3, 2, 0, 0, "test_set_imm"},
858 {NFP_6000_CPPTGT_CLS, 3, 3, 0, 0, "test_clr_imm"},
859 {NFP_6000_CPPTGT_CLS, 4, 0, 0, 0, "add"},
860 {NFP_6000_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
861 {NFP_6000_CPPTGT_CLS, 4, 2, 0, 0, "addsat"},
862 {NFP_6000_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
863 {NFP_6000_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
864 {NFP_6000_CPPTGT_CLS, 5, 2, 0, 0, "addsat_imm"},
865 {NFP_6000_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
866 {NFP_6000_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
867 {NFP_6000_CPPTGT_CLS, 6, 2, 0, 0, "subsat"},
868 {NFP_6000_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
869 {NFP_6000_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
870 {NFP_6000_CPPTGT_CLS, 7, 2, 0, 0, "subsat_imm"},
871 {NFP_6000_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
872 {NFP_6000_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
873 {NFP_6000_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
874 {NFP_6000_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
875 {NFP_6000_CPPTGT_CLS, 9, 0, 0, 0, "get"},
876 {NFP_6000_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
877 {NFP_6000_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
878 {NFP_6000_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
879 {NFP_6000_CPPTGT_CLS, 10, 0, 0, 0, "ring_put"},
880 {NFP_6000_CPPTGT_CLS, 10, 2, 0, 0, "ring_journal"},
881 {NFP_6000_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
882 {NFP_6000_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
883 {NFP_6000_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
884 {NFP_6000_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
885 {NFP_6000_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
886 {NFP_6000_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
887 {NFP_6000_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
888 {NFP_6000_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
889 {NFP_6000_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
890 {NFP_6000_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
891 {NFP_6000_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
892 {NFP_6000_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
893 {NFP_6000_CPPTGT_CLS, 14, 0, 0, 0, "reflect_write_sig_local"},
894 {NFP_6000_CPPTGT_CLS, 14, 1, 0, 0, "reflect_write_sig_remote"},
895 {NFP_6000_CPPTGT_CLS, 14, 2, 0, 0, "reflect_write_sig_both"},
896 {NFP_6000_CPPTGT_CLS, 15, 0, 0, 0, "reflect_read_sig_remote"},
897 {NFP_6000_CPPTGT_CLS, 15, 1, 0, 0, "reflect_read_sig_local"},
898 {NFP_6000_CPPTGT_CLS, 15, 2, 0, 0, "reflect_read_sig_both"},
899 {NFP_6000_CPPTGT_CLS, 16, 1, 0, 0, "cam_lookup32_add_lock"},
900 {NFP_6000_CPPTGT_CLS, 16, 2, 0, 0, "cam_lookup24_add_inc"},
901 {NFP_6000_CPPTGT_CLS, 16, 3, 0, 0, "cam_lookup32_add_extend"},
902 {NFP_6000_CPPTGT_CLS, 17, 0, 0, 0, "meter"},
903 {NFP_6000_CPPTGT_CLS, 17, 2, 0, 0, "statistic"},
904 {NFP_6000_CPPTGT_CLS, 17, 3, 0, 0, "statistic_imm"},
905 {NFP_6000_CPPTGT_CLS, 20, 0, 0, 0, "test_add"},
906 {NFP_6000_CPPTGT_CLS, 20, 1, 0, 0, "test_add64"},
907 {NFP_6000_CPPTGT_CLS, 20, 2, 0, 0, "test_addsat"},
908 {NFP_6000_CPPTGT_CLS, 21, 0, 0, 0, "test_add_imm"},
909 {NFP_6000_CPPTGT_CLS, 21, 1, 0, 0, "test_add64_imm"},
910 {NFP_6000_CPPTGT_CLS, 21, 2, 0, 0, "test_addsat_imm"},
911 {NFP_6000_CPPTGT_CLS, 22, 0, 0, 0, "test_sub"},
912 {NFP_6000_CPPTGT_CLS, 22, 1, 0, 0, "test_sub64"},
913 {NFP_6000_CPPTGT_CLS, 22, 2, 0, 0, "test_subsat"},
914 {NFP_6000_CPPTGT_CLS, 23, 0, 0, 0, "test_sub_imm"},
915 {NFP_6000_CPPTGT_CLS, 23, 1, 0, 0, "test_sub64_imm"},
916 {NFP_6000_CPPTGT_CLS, 23, 2, 0, 0, "test_subsat_imm"},
917 {NFP_6000_CPPTGT_CLS, 24, 0, 0, 0, "ring_read"},
918 {NFP_6000_CPPTGT_CLS, 24, 1, 0, 0, "ring_write"},
919 {NFP_6000_CPPTGT_CLS, 24, 2, 0, 0, "ring_ordered_lock"},
920 {NFP_6000_CPPTGT_CLS, 24, 3, 0, 0, "ring_ordered_unlock"},
921 {NFP_6000_CPPTGT_CLS, 25, 0, 0, 0, "ring_workq_add_thread"},
922 {NFP_6000_CPPTGT_CLS, 25, 1, 0, 0, "ring_workq_add_work"}
923};
924
925static int
1678bd35 926nfp_me_print_invalid (uint64_t instr, struct disassemble_info *dinfo)
fe944acf
FT
927{
928 const char * err_msg = N_("<invalid_instruction>:");
1678bd35 929 dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
fe944acf
FT
930 return _NFP_ERR_CONT;
931}
932
933static bfd_boolean
934nfp_me_is_imm_opnd10 (unsigned int opnd)
935{
936 return _BF (opnd, 9, 8) == 0x3;
937}
938
939static bfd_boolean
940nfp_me_is_imm_opnd8 (unsigned int opnd)
941{
942 return _BTST (opnd, 5);
943}
944
945static unsigned int
946nfp_me_imm_opnd10 (unsigned int opnd)
947{
948 return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
949}
950
951static unsigned int
952nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
953{
954 unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
955
956 return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
957}
958
959/* Print an unrestricted/10-bit operand.
960 This can mostly be generic across NFP families at the moment. */
961static bfd_boolean
962nfp_me_print_opnd10 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
963 struct disassemble_info *dinfo)
964{
965 unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
966
967 /* Absolute GPR. */
968 if (_BF (opnd, 9, 7) == 0x1)
969 dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
970
971 /* Relative GPR. */
972 else if (_BF (opnd, 9, 6) == 0x0)
973 dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
974
975 /* Indexed Xfer. */
976 else if (_BF (opnd, 9, 7) == 0x2)
977 {
978 dinfo->fprintf_func (dinfo->stream, "*$index");
979 if (_BF (opnd, 2, 1) == 0x1)
980 dinfo->fprintf_func (dinfo->stream, "++");
981 else if (_BF (opnd, 2, 1) == 0x2)
982 dinfo->fprintf_func (dinfo->stream, "--");
983 }
984
985 /* Relative Xfer. */
986 else if (_BF (opnd, 9, 7) == 0x3)
987 {
988 if (_BTST (opnd, 6))
989 n += (num_ctx == 8 ? 16 : 32);
990 dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
991 }
992
993 /* Indexed Next Neighbour. */
994 else if (_BF (opnd, 9, 6) == 0x9)
995 {
996 dinfo->fprintf_func (dinfo->stream, "*n$index");
997 if (_BTST (opnd, 1))
998 dinfo->fprintf_func (dinfo->stream, "++");
999 }
1000
1001 /* Relative Next Neighbour. */
1002 else if (_BF (opnd, 9, 6) == 0xa)
1003 {
1004 dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
1005 }
1006
1007 /* Indexed LMEM. */
1008 else if (_BF (opnd, 9, 6) == 0x8)
1009 {
1010 n = _BF (opnd, 5, 5) + (lmem_ext * 2);
1011 dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1012 if (_BTST (opnd, 4))
1013 dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
1014 else if (_BF (opnd, 3, 0))
1015 dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
1016 }
1017
1018 /* 8-bit Constant value. */
1019 else if (_BF (opnd, 9, 8) == 0x3)
1020 dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
1021
1022 else
1023 {
1024 dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1025 return FALSE;
1026 }
1027
1028 return TRUE;
1029}
1030
1031/* Print a restricted/8-bit operand.
1032 This can mostly be generic across NFP families at the moment. */
1033
1034static bfd_boolean
1035nfp_me_print_opnd8 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
1036 unsigned int imm8_msb, struct disassemble_info *dinfo)
1037{
1038 unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
1039
1040 /* Relative GPR. */
1041 if (_BF (opnd, 7, 5) == 0x0)
1042 dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
1043
1044 /* Relative Xfer. */
1045 else if (_BF (opnd, 7, 5) == 0x4)
1046 dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1047
1048 /* Relative Xfer. */
1049 else if (_BF (opnd, 7, 5) == 0x6)
1050 {
1051 n += (num_ctx == 8 ? 16 : 32);
1052 dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
1053 }
1054
1055 /* Indexed Xfer. */
1056 else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
1057 {
1058 dinfo->fprintf_func (dinfo->stream, "*$index");
1059 if (_BF (opnd, 2, 1) == 0x1)
1060 dinfo->fprintf_func (dinfo->stream, "++");
1061 else if (_BF (opnd, 2, 1) == 0x2)
1062 dinfo->fprintf_func (dinfo->stream, "--");
1063 }
1064
1065 /* Indexed NN. */
1066 else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
1067 {
1068 dinfo->fprintf_func (dinfo->stream, "*n$index");
1069 if (_BTST (opnd, 1))
1070 dinfo->fprintf_func (dinfo->stream, "++");
1071 }
1072
1073 /* Indexed LMEM. */
1074 else if (_BF (opnd, 7, 4) == 0x5)
1075 {
1076 n = _BF (opnd, 3, 3) + (lmem_ext * 2);
1077 dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
1078 if (_BF (opnd, 2, 0))
1079 dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
1080 }
1081
1082 /* 7+1-bit Constant value. */
1083 else if (_BTST (opnd, 5))
1084 {
1085 n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
1086 dinfo->fprintf_func (dinfo->stream, "0x%x", n);
1087 }
1088
1089 else
1090 {
1091 dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
1092 return FALSE;
1093 }
1094
1095 return TRUE;
1096}
1097
1098static int
1678bd35 1099nfp_me27_28_print_alu_shf (uint64_t instr, unsigned int pred_cc,
fe944acf
FT
1100 unsigned int dst_lmext, unsigned int src_lmext,
1101 unsigned int gpr_wrboth,
1102 int num_ctx, struct disassemble_info *dinfo)
1103{
1104 unsigned int op = _BF (instr, 35, 33);
1105 unsigned int srcA = _BF (instr, 7, 0);
1106 unsigned int srcB = _BF (instr, 17, 10);
1107 unsigned int dst = _BF (instr, 27, 20);
1108 unsigned int sc = _BF (instr, 9, 8);
1109 unsigned int imm_msb = _BTST (instr, 18);
1110 unsigned int swap = _BTST (instr, 19);
1111 unsigned int shift = _BF (instr, 32, 28);
1112 char dst_bank = 'A' + _BTST (instr, 36);
1113 unsigned int nocc = _BTST (instr, 40);
1114 bfd_boolean err = FALSE;
1115
1116 if (swap)
1117 {
1118 unsigned int tmp = srcA;
1119 srcA = srcB;
1120 srcB = tmp;
1121 }
1122
1123 /* alu_shf, dbl_shf, asr. */
1124 if (op < 7)
1125 {
1126 if (sc == 3)
1127 dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
1128 else if (op == 6)
1129 dinfo->fprintf_func (dinfo->stream, "asr[");
1130 else
1131 dinfo->fprintf_func (dinfo->stream, "alu_shf[");
1132
1133 /* dest operand */
1134 if (nfp_me_is_imm_opnd8 (dst))
1135 dinfo->fprintf_func (dinfo->stream, "--");
1136 else
1137 err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1138 dst_lmext, imm_msb, dinfo);
1139
1140 dinfo->fprintf_func (dinfo->stream, ", ");
1141
1142 /* A operand. */
1143 if (op != 6)
1144 {
1145 if ((op < 2) && (sc != 3)) /* Not dbl_shf. */
1146 dinfo->fprintf_func (dinfo->stream, "--"); /* B or ~B operator. */
1147 else
1148 err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
1149 num_ctx, src_lmext, imm_msb,
1150 dinfo);
1151
1152 dinfo->fprintf_func (dinfo->stream, ", ");
1153
1154 /* Operator (not for dbl_shf). */
1155 if (sc != 3)
1156 {
1157 dinfo->fprintf_func (dinfo->stream, "%s, ",
1158 nfp_mealu_shf_op[op]);
1159 }
1160 }
1161
1162 /* B operand. */
1163 err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
1164 num_ctx, src_lmext, imm_msb, dinfo);
1165
1166 dinfo->fprintf_func (dinfo->stream, ", ");
1167
1168 /* Shift */
1169 if (sc == 0)
1170 dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
1171 else if (sc == 2)
1172 {
1173 if (shift)
1174 dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
1175 else
1176 dinfo->fprintf_func (dinfo->stream, "<<indirect");
1177 }
1178 else
1179 {
1180 if (shift)
1181 dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
1182 else
1183 dinfo->fprintf_func (dinfo->stream, ">>indirect");
1184 }
1185 }
1186 /* Byte Align. */
1187 else if (op == 7)
1188 {
1189 dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
1190 ((sc == 2) ? "le" : "be"));
1191
1192 /* Dest operand. */
1193 if (nfp_me_is_imm_opnd8 (dst))
1194 dinfo->fprintf_func (dinfo->stream, "--");
1195 else
1196 err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
1197 dst_lmext, imm_msb, dinfo);
1198
1199 dinfo->fprintf_func (dinfo->stream, ", ");
1200
1201 if (sc == 2)
1202 err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
1203 0, imm_msb, dinfo);
1204 else
1205 err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
1206 0, imm_msb, dinfo);
1207 }
1208
1209 dinfo->fprintf_func (dinfo->stream, "]");
1210 if (nocc)
1211 dinfo->fprintf_func (dinfo->stream, ", no_cc");
1212 if (gpr_wrboth)
1213 dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1214 if (pred_cc)
1215 dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1216
1217 if (err)
1218 return _NFP_ERR_CONT;
1219 return 0;
1220}
1221
1222static int
1678bd35 1223nfp_me27_28_print_alu (uint64_t instr, unsigned int pred_cc,
fe944acf
FT
1224 unsigned int dst_lmext, unsigned int src_lmext,
1225 unsigned int gpr_wrboth,
1226 int num_ctx, struct disassemble_info *dinfo)
1227{
1228 unsigned int op = _BF (instr, 35, 31);
1229 unsigned int srcA = _BF (instr, 9, 0);
1230 unsigned int srcB = _BF (instr, 19, 10);
1231 unsigned int dst = _BF (instr, 29, 20);
1232 unsigned int swap = _BTST (instr, 30);
1233 char dst_bank = 'A' + _BTST (instr, 36);
1234 unsigned int nocc = _BTST (instr, 40);
1235 int do_close_bracket = 1;
1236 bfd_boolean err = FALSE;
1237
1238 if (swap)
1239 {
1240 unsigned int tmp = srcA;
1241 srcA = srcB;
1242 srcB = tmp;
1243 }
1244
1245 switch (op)
1246 {
1247 case 3: /* pop_count3[dst, srcB] */
1248 case 6: /* pop_count1[srcB] */
1249 case 7: /* pop_count2[srcB] */
1250 case 14: /* ffs[dst, srcB] */
1251 case 15: /* cam_read_tag[dst, srcB] */
1252 case 31: /* cam_read_state[dst, srcB] */
1253 dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1254
1255 /* No dest for pop_count1/2. */
1256 if ((op != 6) && (op != 7))
1257 {
1258 /* dest operand */
1259 if (nfp_me_is_imm_opnd10 (dst))
1260 dinfo->fprintf_func (dinfo->stream, "--");
1261 else
1262 err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1263 dst_lmext, dinfo);
1264
1265 dinfo->fprintf_func (dinfo->stream, ", ");
1266 }
1267
1268 /* B operand. */
1269 err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1270 num_ctx, src_lmext, dinfo);
1271 break;
1272
1273 /* cam_clear. */
1274 case 11:
1275 do_close_bracket = 0;
1276 dinfo->fprintf_func (dinfo->stream, "cam_clear");
1277 break;
1278
1279 /* cam_lookup. */
1280 case 23:
1281 do_close_bracket = 0;
1282 dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1283
1284 /* Dest operand. */
1285 if (nfp_me_is_imm_opnd10 (dst))
1286 dinfo->fprintf_func (dinfo->stream, "--");
1287 else
1288 err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1289 dst_lmext, dinfo);
1290
1291 dinfo->fprintf_func (dinfo->stream, ", ");
1292
1293 /* A operand. */
1294 err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1295 num_ctx, src_lmext, dinfo);
1296
1297 dinfo->fprintf_func (dinfo->stream, "]");
1298
1299 if (_BF (srcB, 1, 0))
1300 {
1301 unsigned int n = _BTST (srcB, 1);
1302 if (_BTST (srcB, 4)) /* Only for MEv28. */
1303 n += 2;
1304 dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
1305 _BF (srcB, 3, 2));
1306 }
1307
1308 break;
1309
1310 case 19: /* cam_write. */
1311 case 27: /* cam_write_state. */
1312 dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
1313 err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1314 num_ctx, src_lmext, dinfo);
1315 dinfo->fprintf_func (dinfo->stream, ", ");
1316 if (op == 19)
1317 {
1318 err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1319 num_ctx, src_lmext, dinfo);
1320 dinfo->fprintf_func (dinfo->stream, ", ");
1321 }
1322 dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
1323 break;
1324
1325 /* CRC. */
1326 case 18:
1327 do_close_bracket = 0;
1328 dinfo->fprintf_func (dinfo->stream, "crc_%s[",
1329 _BTST (instr, 3) ? "le" : "be");
1330 if (!nfp_me27_28_crc_op[_BF (instr, 7, 5)])
1331 {
1332 dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
1333 err = TRUE;
1334 }
1335 else
1336 {
1337 dinfo->fprintf_func (dinfo->stream, "%s, ",
1338 nfp_me27_28_crc_op[_BF (instr, 7, 5)]);
1339 }
1340
1341 /* Dest operand. */
1342 if (nfp_me_is_imm_opnd10 (dst))
1343 dinfo->fprintf_func (dinfo->stream, "--");
1344 else
1345 err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1346 dst_lmext, dinfo);
1347
1348 dinfo->fprintf_func (dinfo->stream, ", ");
1349
1350 /* B operand. */
1351 err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1352 num_ctx, src_lmext, dinfo);
1353
1354 dinfo->fprintf_func (dinfo->stream, "]");
1355 if (_BF (instr, 2, 0))
1356 dinfo->fprintf_func (dinfo->stream, ", %s",
1357 nfp_me27_28_crc_bytes[_BF (instr, 2, 0)]);
1358 if (_BTST (instr, 4))
1359 dinfo->fprintf_func (dinfo->stream, ", bit_swap");
1360 break;
1361
1362 default:
1363 /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs). */
1364 dinfo->fprintf_func (dinfo->stream, "alu[");
1365
1366 /* Dest operand. */
1367 if (nfp_me_is_imm_opnd10 (dst))
1368 dinfo->fprintf_func (dinfo->stream, "--");
1369 else
1370 err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
1371 dst_lmext, dinfo);
1372 dinfo->fprintf_func (dinfo->stream, ", ");
1373
1374 /* A operand. */
1375 if ((op == 0) || (op == 4)) /* B only operators. */
1376 dinfo->fprintf_func (dinfo->stream, "--");
1377 else
1378 err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
1379 num_ctx, src_lmext, dinfo);
1380
1381 if (!nfp_me27_28_alu_op[op])
1382 {
1383 dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
1384 err = TRUE;
1385 }
1386 else
1387 {
1388 dinfo->fprintf_func (dinfo->stream, ", %s, ",
1389 nfp_me27_28_alu_op[op]);
1390 }
1391
1392 /* B operand. */
1393 err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
1394 num_ctx, src_lmext, dinfo);
1395 break;
1396 }
1397
1398 if (do_close_bracket)
1399 dinfo->fprintf_func (dinfo->stream, "]");
1400
1401 if (nocc)
1402 dinfo->fprintf_func (dinfo->stream, ", no_cc");
1403 if (gpr_wrboth)
1404 dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1405 if (pred_cc)
1406 dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1407
1408 if (err)
1409 return _NFP_ERR_CONT;
1410 return 0;
1411}
1412
1413static int
1678bd35 1414nfp_me27_28_print_immed (uint64_t instr, unsigned int pred_cc,
fe944acf
FT
1415 unsigned int dst_lmext,
1416 unsigned int gpr_wrboth,
1417 int num_ctx, struct disassemble_info *dinfo)
1418{
1419 unsigned int srcA = _BF (instr, 9, 0);
1420 unsigned int srcB = _BF (instr, 19, 10);
1421 unsigned int imm = _BF (instr, 27, 20);
1422 unsigned int by = _BTST (instr, 29);
1423 unsigned int wd = _BTST (instr, 30);
1424 unsigned int inv = _BTST (instr, 31);
1425 unsigned int byte_shift = _BF (instr, 34, 33);
1426 bfd_boolean err = FALSE;
1427
1428 if (nfp_me_is_imm_opnd10 (srcB))
1429 {
1430 imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1431 if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
1432 {
1433 dinfo->fprintf_func (dinfo->stream, "nop");
1434 return 0;
1435 }
1436 }
1437 else
1438 {
1439 imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1440 }
1441
1442 if (inv)
1443 imm = (imm ^ 0xffff) | 0xffff0000U;
1444
1445 if (by)
1446 {
1447 dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
1448 imm &= 0xff;
1449 }
1450 else if (wd)
1451 {
1452 dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
1453 imm &= 0xffff;
1454 }
1455 else
1456 dinfo->fprintf_func (dinfo->stream, "immed[");
1457
1458 /* Dest. */
1459 if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
1460 dinfo->fprintf_func (dinfo->stream, "--"); /* No Dest. */
1461 else if (nfp_me_is_imm_opnd10 (srcA))
1462 err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
1463 else
1464 err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
1465
1466 dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
1467
1468 if ((!by) && (!wd) && (byte_shift))
1469 dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
1470
1471 dinfo->fprintf_func (dinfo->stream, "]");
1472
1473 if (gpr_wrboth)
1474 dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1475 if (pred_cc)
1476 dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1477
1478 if (err)
1479 return _NFP_ERR_CONT;
1480 return 0;
1481}
1482
1483static int
1678bd35 1484nfp_me27_28_print_ld_field (uint64_t instr, unsigned int pred_cc,
fe944acf
FT
1485 unsigned int dst_lmext, unsigned int src_lmext,
1486 unsigned int gpr_wrboth,
1487 int num_ctx, struct disassemble_info *dinfo)
1488{
1489 unsigned int load_cc = _BTST (instr, 34);
1490 unsigned int shift = _BF (instr, 32, 28);
1491 unsigned int byte_mask = _BF (instr, 27, 24);
1492 unsigned int zerof = _BTST (instr, 20);
1493 unsigned int swap = _BTST (instr, 19);
1494 unsigned int imm_msb = _BTST (instr, 18);
1495 unsigned int src = _BF (instr, 17, 10);
1496 unsigned int sc = _BF (instr, 9, 8);
1497 unsigned int dst = _BF (instr, 7, 0);
1498 bfd_boolean err = FALSE;
1499
1500 if (swap)
1501 {
1502 unsigned int tmp = src;
1503 src = dst;
1504 dst = tmp;
1505 }
1506
1507 if (zerof)
1508 dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
1509 else
1510 dinfo->fprintf_func (dinfo->stream, "ld_field[");
1511
1512 err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
1513 dst_lmext, imm_msb, dinfo);
1514 dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
1515 _BTST (byte_mask, 3),
1516 _BTST (byte_mask, 2),
1517 _BTST (byte_mask, 1), _BTST (byte_mask, 0));
1518 err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
1519 src_lmext, imm_msb, dinfo);
1520
1521 if ((sc == 0) && (shift != 0))
1522 dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
1523 else if (sc == 1)
1524 {
1525 if (shift)
1526 dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
1527 else
1528 dinfo->fprintf_func (dinfo->stream, ", >>indirect");
1529 }
1530 else if (sc == 2)
1531 {
1532 if (shift)
1533 dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
1534 else
1535 dinfo->fprintf_func (dinfo->stream, ", <<indirect");
1536 }
1537 else if (sc == 3)
1538 dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
1539
1540 dinfo->fprintf_func (dinfo->stream, "]");
1541
1542 if (load_cc)
1543 dinfo->fprintf_func (dinfo->stream, ", load_cc");
1544 if (gpr_wrboth)
1545 dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1546 if (pred_cc)
1547 dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1548
1549 if (err)
1550 return _NFP_ERR_CONT;
1551 return 0;
1552}
1553
1554static int
1678bd35 1555nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
fe944acf
FT
1556{
1557 unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1558 unsigned int defer = _BF (instr, 21, 20);
1559 unsigned int no_load = _BTST (instr, 19);
1560 unsigned int resume = _BTST (instr, 18);
1561 unsigned int bpt = _BTST (instr, 17);
1562 unsigned int sig_or = _BTST (instr, 16);
1563 unsigned int ev_mask = _BF (instr, 15, 0);
1564
1565 dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
1566 if (bpt)
1567 dinfo->fprintf_func (dinfo->stream, "bpt");
1568 else if (ev_mask == 1)
1569 dinfo->fprintf_func (dinfo->stream, "voluntary");
1570 else if ((!no_load) && (ev_mask == 0))
1571 {
1572 dinfo->fprintf_func (dinfo->stream, "kill");
1573 sig_or = 0;
1574 }
1575 else if (ev_mask == 0)
1576 dinfo->fprintf_func (dinfo->stream, "--");
1577 else
1578 {
1579 int first_print = 1;
1580 unsigned int n;
1581
1582 for (n = 1; n < 16; n++)
1583 {
1584 if (!_BTST (ev_mask, n))
1585 continue;
1586 dinfo->fprintf_func (dinfo->stream, "%ssig%d",
1587 (first_print) ? "" : ", ", n);
1588 first_print = 0;
1589 }
1590 }
1591
1592 dinfo->fprintf_func (dinfo->stream, "]");
1593
1594 if (sig_or)
1595 dinfo->fprintf_func (dinfo->stream, ", any");
1596 if (resume)
1597 dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
1598 if (defer)
1599 dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1600
1601 return 0;
1602}
1603
1604static int
1678bd35 1605nfp_me27_28_print_local_csr (uint64_t instr,
fe944acf
FT
1606 unsigned int src_lmext,
1607 int num_ctx, struct disassemble_info *dinfo)
1608{
1609 unsigned int srcA = _BF (instr, 9, 0);
1610 unsigned int srcB = _BF (instr, 19, 10);
1611 unsigned int wr = _BTST (instr, 21);
1612 unsigned int csr_num = _BF (instr, 32, 22);
1613 unsigned int src = srcA;
1614 char src_bank = 'A';
1615 bfd_boolean err = FALSE;
1616
1617 if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
1618 {
1619 src_bank = 'B';
1620 src = srcB;
1621 }
1622
1623 /* MEv28 does not have urd/uwr. */
1624 if (csr_num == 1)
1625 {
1626 if (wr)
1627 {
1628 dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
1629 (int) _BTST (instr, 20));
1630 err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1631 src_lmext, dinfo);
1632 }
1633 else
1634 {
1635 dinfo->fprintf_func (dinfo->stream, "urd[");
1636 err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1637 src_lmext, dinfo);
1638 dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
1639 (int) _BTST (instr, 20));
1640 }
1641 dinfo->fprintf_func (dinfo->stream, "]");
1642 }
1643 else
1644 {
1645 const char *nm = NULL;
1646
1647 if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
1648 nm = nfp_me27_28_mecsrs[csr_num];
1649
1650 dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
1651 (wr) ? "wr" : "rd");
1652 if (nm)
1653 dinfo->fprintf_func (dinfo->stream, "%s", nm);
1654 else
1655 dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
1656
1657 if (wr)
1658 {
1659 dinfo->fprintf_func (dinfo->stream, ", ");
1660 err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
1661 src_lmext, dinfo);
1662 }
1663 dinfo->fprintf_func (dinfo->stream, "]");
1664 }
1665
1666 if (err)
1667 return _NFP_ERR_CONT;
1668 return 0;
1669}
1670
1671static int
1678bd35 1672nfp_me27_28_print_branch (uint64_t instr,
fe944acf
FT
1673 const char *br_inpstates[16],
1674 struct disassemble_info *dinfo)
1675{
1676 unsigned int br_op = _BF (instr, 4, 0);
1677 unsigned int ctx_sig_state = _BF (instr, 17, 14);
1678 unsigned int defer = _BF (instr, 21, 20);
1679 unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1680 int ret = 0;
1681
1682 if (!nfp_me27_28_br_ops[br_op])
1683 {
1684 dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
1685 ret = _NFP_ERR_CONT;
1686 }
1687 else
1688 dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
1689
1690 switch (br_op)
1691 {
1692 case 16: /* br=ctx */
1693 case 17: /* br!=ctx */
1694 case 18: /* br_signal */
1695 case 19: /* br_!signal */
1696 dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
1697 break;
1698 case 20: /* "br_inp_state" */
1699 case 21: /* "br_!inp_state" */
1700 dinfo->fprintf_func (dinfo->stream, "%s, ",
1701 br_inpstates[ctx_sig_state]);
1702 break;
1703 case 22: /* "br_cls_state" */
1704 case 23: /* "br_!cls_state" */
1705 dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
1706 ctx_sig_state);
1707 break;
1708 default:
1709 break;
1710 }
1711
1712 dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
1713
1714 if (defer)
1715 dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1716
1717 return ret;
1718}
1719
1720static int
1678bd35 1721nfp_me27_28_print_br_byte (uint64_t instr,
fe944acf
FT
1722 unsigned int src_lmext, int num_ctx,
1723 struct disassemble_info *dinfo)
1724{
1725 unsigned int srcA = _BF (instr, 7, 0);
1726 unsigned int by = _BF (instr, 9, 8);
1727 unsigned int srcB = _BF (instr, 17, 10);
1728 unsigned int imm_msb = _BTST (instr, 18);
1729 unsigned int eq = _BTST (instr, 19);
1730 unsigned int defer = _BF (instr, 21, 20);
1731 unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1732 bfd_boolean err = FALSE;
1733
1734 if (eq)
1735 dinfo->fprintf_func (dinfo->stream, "br=byte[");
1736 else
1737 dinfo->fprintf_func (dinfo->stream, "br!=byte[");
1738
1739 if (nfp_me_is_imm_opnd8 (srcA))
1740 err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1741 src_lmext, imm_msb, dinfo);
1742 else
1743 err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1744 src_lmext, imm_msb, dinfo);
1745
1746 dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
1747
1748 if (nfp_me_is_imm_opnd8 (srcA))
1749 err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
1750 src_lmext, imm_msb, dinfo);
1751 else
1752 err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
1753 src_lmext, imm_msb, dinfo);
1754
1755 dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
1756
1757 if (defer)
1758 dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1759
1760 if (err)
1761 return _NFP_ERR_CONT;
1762 return 0;
1763}
1764
1765static int
1678bd35 1766nfp_me27_28_print_br_bit (uint64_t instr, unsigned int src_lmext,
fe944acf
FT
1767 int num_ctx, struct disassemble_info *dinfo)
1768{
1769 unsigned int srcA = _BF (instr, 7, 0);
1770 unsigned int srcB = _BF (instr, 17, 10);
1771 unsigned int b = _BTST (instr, 18);
1772 unsigned int defer = _BF (instr, 21, 20);
1773 unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
1774 bfd_boolean err = FALSE;
1775
1776 if (b)
1777 dinfo->fprintf_func (dinfo->stream, "br_bset[");
1778 else
1779 dinfo->fprintf_func (dinfo->stream, "br_bclr[");
1780
1781 if (nfp_me_is_imm_opnd8 (srcA))
1782 {
1783 err = err
1784 || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
1785 b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
1786 }
1787 else
1788 {
1789 err = err
1790 || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
1791 b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
1792 }
1793
1794 dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
1795
1796 if (defer)
1797 dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1798
1799 if (err)
1800 return _NFP_ERR_CONT;
1801 return 0;
1802}
1803
1804static int
1678bd35 1805nfp_me27_28_print_br_alu (uint64_t instr, unsigned int src_lmext,
fe944acf
FT
1806 int num_ctx, struct disassemble_info *dinfo)
1807{
1808 unsigned int srcA = _BF (instr, 9, 0);
1809 unsigned int srcB = _BF (instr, 19, 10);
1810 unsigned int defer = _BF (instr, 21, 20);
1811 unsigned int imm = _BF (instr, 30, 22);
1812 bfd_boolean err = FALSE;
1813
1814 if (nfp_me_is_imm_opnd10 (srcA))
1815 imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
1816 else
1817 imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
1818
1819 if (!imm)
1820 dinfo->fprintf_func (dinfo->stream, "rtn[");
1821 else
1822 dinfo->fprintf_func (dinfo->stream, "jump[");
1823
1824 if (nfp_me_is_imm_opnd10 (srcA))
1825 err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
1826 else
1827 err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
1828
1829 if (imm)
1830 dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
1831
1832 dinfo->fprintf_func (dinfo->stream, "]");
1833
1834 if (defer)
1835 dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
1836
1837 if (err)
1838 return _NFP_ERR_CONT;
1839 return 0;
1840}
1841
1842static int
1678bd35 1843nfp_me27_28_print_mult (uint64_t instr, unsigned int pred_cc,
fe944acf
FT
1844 unsigned int dst_lmext, unsigned int src_lmext,
1845 unsigned int gpr_wrboth,
1846 int num_ctx, struct disassemble_info *dinfo)
1847{
1848 unsigned int srcA = _BF (instr, 9, 0);
1849 unsigned int srcB = _BF (instr, 19, 10);
1850 unsigned int mstep = _BF (instr, 22, 20);
1851 char dst_bank = 'A' + _BTST (instr, 23);
1852 unsigned int swap = _BTST (instr, 30);
1853 unsigned int mtype = _BF (instr, 32, 31);
1854 unsigned int nocc = _BTST (instr, 40);
1855 bfd_boolean err = FALSE;
1856
1857 if (swap)
1858 {
1859 unsigned int tmp = srcA;
1860 srcA = srcB;
1861 srcB = tmp;
1862 }
1863
1864 dinfo->fprintf_func (dinfo->stream, "mul_step[");
1865
1866 if (mstep >= 4)
1867 err = err
1868 || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
1869 else
1870 err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
1871 src_lmext, dinfo);
1872
1873 dinfo->fprintf_func (dinfo->stream, ", ");
1874
1875 if (mstep >= 4)
1876 dinfo->fprintf_func (dinfo->stream, "--");
1877 else
1878 err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
1879 src_lmext, dinfo);
1880
1881 dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
1882 if (mtype > 0)
1883 {
1884 const char *s = nfp_me27_28_mult_steps[mstep];
1885 if (!s)
1886 {
1887 s = "<invalid mul_step>";
1888 err = TRUE;
1889 }
1890 dinfo->fprintf_func (dinfo->stream, "_%s", s);
1891 }
1892
1893 if (nocc)
1894 dinfo->fprintf_func (dinfo->stream, ", no_cc");
1895 if (gpr_wrboth)
1896 dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
1897 if (pred_cc)
1898 dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
1899
1900 if (err)
1901 return _NFP_ERR_CONT;
1902 return 0;
1903}
1904
1905static int
1906_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
1907{
1908 const nfp_cmd_mnemonic *a = arg_a;
1909 const nfp_cmd_mnemonic *b = arg_b;
1910
1911 if (a->cpp_target != b->cpp_target)
1912 return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
1913
1914 if (a->cpp_action != b->cpp_action)
1915 return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
1916
1917 return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
1918}
1919
1920static const char *
1921nfp_me_find_mnemonic (unsigned int cpp_tgt, unsigned int cpp_act,
1922 unsigned int cpp_tok, unsigned int cpp_len,
1923 const nfp_cmd_mnemonic * mnemonics,
1924 size_t mnemonics_cnt)
1925{
1926 nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
1927 const nfp_cmd_mnemonic *cmd = NULL;
1928
1929 cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
1930 sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
1931
1932 if (!cmd)
1933 return NULL;
1934
1935 /* Make sure we backtrack to the first entry that still matches the three
1936 bsearched fields - then we simply iterate and compare cpp_len. */
1937 while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
1938 --cmd;
1939
1940 /* Now compare by cpp_len and make sure we stay in range. */
1941 for (; (cmd < (mnemonics + mnemonics_cnt))
1942 && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
1943 {
1944 if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
1945 return cmd->mnemonic;
1946 }
1947
1948 return NULL;
1949}
1950
1951/* NFP-32xx (ME Version 2.7). */
1952
1953static int
1678bd35 1954nfp_me27_print_cmd (uint64_t instr, int third_party_32bit,
fe944acf
FT
1955 int num_ctx, struct disassemble_info *dinfo)
1956{
1957 unsigned int srcA = _BF (instr, 7, 0);
1958 unsigned int ctxswap_defer = _BF (instr, 9, 8);
1959 unsigned int srcB = _BF (instr, 17, 10);
1960 unsigned int token = _BF (instr, 19, 18);
1961 unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
1962 unsigned int cpp_len = _BF (instr, 27, 25);
1963 unsigned int sig = _BF (instr, 31, 28);
1964 unsigned int tgtcmd = _BF (instr, 38, 32);
1965 unsigned int indref = _BTST (instr, 41);
1966 unsigned int mode = _BF (instr, 44, 42);
1967
1968 bfd_boolean err = FALSE;
1969 int cpp_target = -1;
1970 int cpp_action = -1;
1971 const char *mnemonic = NULL;
1972 unsigned int imm;
1973 unsigned int valBA;
1974 int visswap = ((mode == 1) || (mode == 3));
1975
1976 imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
1977 valBA = (srcB << 8) | srcA;
1978
1979 if (mode == 6)
1980 {
1981 token = 0;
1982 sig = 0;
1983 xfer = 0;
1984 }
1985
1986 /* Convert tgtcmd to action/token tuple. */
1987 if (_BF (tgtcmd, 6, 5) == 0x0)
1988 {
1989 switch (_BF (tgtcmd, 4, 2))
1990 {
1991 case 0:
1992 cpp_target = NFP_3200_CPPTGT_CAP;
1993 dinfo->fprintf_func (dinfo->stream, "cap[");
1994 break;
1995 case 1:
1996 cpp_target = NFP_3200_CPPTGT_MSF0;
1997 dinfo->fprintf_func (dinfo->stream, "msf0[");
1998 break;
1999 case 2:
2000 cpp_target = NFP_3200_CPPTGT_MSF1;
2001 dinfo->fprintf_func (dinfo->stream, "msf1[");
2002 break;
2003 case 3:
2004 cpp_target = NFP_3200_CPPTGT_PCIE;
2005 dinfo->fprintf_func (dinfo->stream, "pcie[");
2006 break;
2007 case 4:
2008 cpp_target = NFP_3200_CPPTGT_HASH;
2009 break;
2010 case 5:
2011 cpp_target = NFP_3200_CPPTGT_CRYPTO;
2012 dinfo->fprintf_func (dinfo->stream, "crypto[");
2013 break;
2014 case 6:
2015 cpp_target = NFP_3200_CPPTGT_ARM;
2016 dinfo->fprintf_func (dinfo->stream, "arm[");
2017 break;
2018 case 7:
2019 cpp_target = NFP_3200_CPPTGT_CT;
2020 dinfo->fprintf_func (dinfo->stream, "ct[");
2021 break;
2022 }
2023 cpp_action = _BF (tgtcmd, 1, 0);
2024 }
2025 else
2026 {
2027 switch (_BF (tgtcmd, 6, 4))
2028 {
2029 case 2:
2030 cpp_target = NFP_3200_CPPTGT_GS;
2031 dinfo->fprintf_func (dinfo->stream, "scratch[");
2032 break;
2033 case 3:
2034 cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM. */
2035 dinfo->fprintf_func (dinfo->stream, "sram[");
2036 break;
2037 case 4:
2038 case 5:
2039 cpp_target = NFP_3200_CPPTGT_MU;
2040 dinfo->fprintf_func (dinfo->stream, "mem[");
2041 break;
2042 case 6:
2043 case 7:
2044 cpp_target = NFP_3200_CPPTGT_CLS;
2045 dinfo->fprintf_func (dinfo->stream, "cls[");
2046 break;
2047 }
2048 cpp_action = _BF (tgtcmd, 3, 0);
2049 }
2050
2051 if (cpp_target < 0)
2052 {
2053 dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2054 cpp_target, cpp_action, token);
2055 return _NFP_ERR_CONT;
2056 }
2057
2058 mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2059 nfp_me27_mnemonics,
2060 ARRAY_SIZE (nfp_me27_mnemonics));
2061
2062 if (!mnemonic)
2063 {
2064 dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2065 cpp_target, cpp_action, token);
2066 return _NFP_ERR_CONT;
2067 }
2068
2069 if (cpp_target == NFP_3200_CPPTGT_HASH)
2070 {
2071 dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
2072 mnemonic, xfer, cpp_len);
2073 goto print_opt_toks;
2074 }
2075
2076 dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2077
2078 if (visswap)
2079 {
2080 unsigned int tmp = srcA;
2081 srcA = srcB;
2082 srcB = tmp;
2083 }
2084
2085 switch (mode)
2086 {
2087 case 0: /* (A << 8) + B. */
2088 case 1: /* (B << 8) + A. */
2089 dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2090 err = err
2091 || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2092 dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2093 err = err
2094 || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2095 dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2096 break;
2097 case 2: /* Accelerated 3rd party (A[ << 8]) + B. */
2098 case 3: /* Accelerated 3rd party (B[ << 8]) + A. */
2099 dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2100 err = err
2101 || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2102 if (third_party_32bit)
2103 dinfo->fprintf_func (dinfo->stream, ", ");
2104 else
2105 dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2106 err = err
2107 || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2108 dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2109 break;
2110 case 4: /* A + B. */
2111 dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2112 err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2113 dinfo->fprintf_func (dinfo->stream, ", ");
2114 err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2115 dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2116 break;
2117 case 5: /* Immediate address. */
2118 dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2119 (cpp_len + 1));
2120 break;
2121 case 6: /* Immediate address and data. */
2122 dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2123 break;
2124 case 7: /* Immediate data. */
2125 dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2126 ((xfer << 16) | valBA), (cpp_len + 1));
2127 break;
2128 }
2129
2130 print_opt_toks:
2131 dinfo->fprintf_func (dinfo->stream, "]");
2132
2133 if (indref && (mode != 2) && (mode != 3))
2134 dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2135
2136 if (ctxswap_defer != 3)
2137 {
2138 dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2139 if (sig)
2140 dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2141 else
2142 dinfo->fprintf_func (dinfo->stream, "--]");
2143
2144 if (ctxswap_defer != 0)
2145 dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2146 }
2147 else if (sig)
2148 dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2149
2150 if (err)
2151 return _NFP_ERR_CONT;
2152 return 0;
2153}
2154
2155static int
1678bd35 2156nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
fe944acf
FT
2157 struct disassemble_info *dinfo)
2158{
2159 return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2160}
2161
2162static int
1678bd35 2163nfp_me27_print_alu (uint64_t instr, int num_ctx,
fe944acf
FT
2164 struct disassemble_info *dinfo)
2165{
2166 return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
2167}
2168
2169static int
1678bd35 2170nfp_me27_print_immed (uint64_t instr, int num_ctx,
fe944acf
FT
2171 struct disassemble_info *dinfo)
2172{
2173 return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
2174}
2175
2176static int
1678bd35 2177nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
fe944acf
FT
2178 struct disassemble_info *dinfo)
2179{
2180 return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
2181}
2182
2183static int
1678bd35 2184nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
fe944acf
FT
2185{
2186 return nfp_me27_28_print_ctx_arb (instr, dinfo);
2187}
2188
2189static int
1678bd35 2190nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
fe944acf
FT
2191 struct disassemble_info *dinfo)
2192{
2193 return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
2194}
2195
2196static int
1678bd35 2197nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
fe944acf
FT
2198{
2199 return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
2200}
2201
2202static int
1678bd35 2203nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
fe944acf
FT
2204 struct disassemble_info *dinfo)
2205{
2206 return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
2207}
2208
2209static int
1678bd35 2210nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
fe944acf
FT
2211 struct disassemble_info *dinfo)
2212{
2213 return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
2214}
2215
2216static int
1678bd35 2217nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
fe944acf
FT
2218 struct disassemble_info *dinfo)
2219{
2220 return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
2221}
2222
2223static int
1678bd35 2224nfp_me27_print_mult (uint64_t instr, int num_ctx,
fe944acf
FT
2225 struct disassemble_info *dinfo)
2226{
2227 return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
2228}
2229
2230/*NFP-6xxx/4xxx (ME Version 2.8). */
2231
2232static int
1678bd35 2233nfp_me28_print_cmd (uint64_t instr, int third_party_32bit,
fe944acf
FT
2234 int num_ctx, struct disassemble_info *dinfo)
2235{
2236 unsigned int srcA = _BF (instr, 7, 0);
2237 unsigned int ctxswap_defer = _BF (instr, 9, 8);
2238 unsigned int srcB = _BF (instr, 17, 10);
2239 unsigned int token = _BF (instr, 19, 18);
2240 unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
2241 unsigned int cpp_len = _BF (instr, 27, 25);
2242 unsigned int sig = _BF (instr, 31, 28);
2243 unsigned int tgtcmd = _BF (instr, 38, 32);
2244 unsigned int indref = _BTST (instr, 41);
2245 unsigned int mode = _BF (instr, 44, 42);
2246
2247 bfd_boolean err = FALSE;
2248 int cpp_target = -1;
2249 int cpp_action = -1;
2250 const char *mnemonic = NULL;
2251 unsigned int imm;
2252 unsigned int valBA;
2253 int visswap = ((mode == 1) || (mode == 3));
2254
2255 imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
2256 valBA = (srcB << 8) | srcA;
2257
2258 if (mode == 6)
2259 {
2260 token = 0;
2261 sig = 0;
2262 xfer = 0;
2263 }
2264
2265 /* Convert tgtcmd to action/token tuple. */
2266 if (_BF (tgtcmd, 6, 5) == 0x0)
2267 {
2268 switch (_BF (tgtcmd, 4, 2))
2269 {
2270 case 0:
2271 cpp_target = NFP_6000_CPPTGT_ILA;
2272 dinfo->fprintf_func (dinfo->stream, "ila[");
2273 break;
2274 case 1:
2275 cpp_target = NFP_6000_CPPTGT_NBI;
2276 dinfo->fprintf_func (dinfo->stream, "nbi[");
2277 break;
2278 case 3:
2279 cpp_target = NFP_6000_CPPTGT_PCIE;
2280 dinfo->fprintf_func (dinfo->stream, "pcie[");
2281 break;
2282 case 5:
2283 cpp_target = NFP_6000_CPPTGT_CRYPTO;
2284 dinfo->fprintf_func (dinfo->stream, "crypto[");
2285 break;
2286 case 6:
2287 cpp_target = NFP_6000_CPPTGT_ARM;
2288 dinfo->fprintf_func (dinfo->stream, "arm[");
2289 break;
2290 case 7:
2291 cpp_target = NFP_6000_CPPTGT_CTXPB;
2292 dinfo->fprintf_func (dinfo->stream, "ct[");
2293 break;
2294 }
2295 cpp_action = _BF (tgtcmd, 1, 0);
2296 }
2297 else
2298 {
2299 /* One bit overlap between "t" and "a" fields, for sram it's "t" and
2300 for mem/cls it's "a". */
2301 cpp_action = _BF (tgtcmd, 4, 0);
2302 switch (_BF (tgtcmd, 6, 4))
2303 {
2304 case 3:
2305 cpp_target = NFP_6000_CPPTGT_VQDR;
2306 cpp_action = _BF (tgtcmd, 3, 0);
2307 dinfo->fprintf_func (dinfo->stream, "sram[");
2308 break;
2309 case 4:
2310 case 5:
2311 cpp_target = NFP_6000_CPPTGT_MU;
2312 dinfo->fprintf_func (dinfo->stream, "mem[");
2313 break;
2314 case 6:
2315 case 7:
2316 cpp_target = NFP_6000_CPPTGT_CLS;
2317 dinfo->fprintf_func (dinfo->stream, "cls[");
2318 break;
2319 }
2320 }
2321
2322 if (cpp_target < 0)
2323 {
2324 dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
2325 cpp_target, cpp_action, token);
2326 return _NFP_ERR_CONT;
2327 }
2328
2329 mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
2330 nfp_me28_mnemonics,
2331 ARRAY_SIZE (nfp_me28_mnemonics));
2332
2333 if (!mnemonic)
2334 {
2335 dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
2336 cpp_target, cpp_action, token);
2337 return _NFP_ERR_CONT;
2338 }
2339
2340 dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
2341
2342 if (visswap)
2343 {
2344 unsigned int tmp = srcA;
2345 srcA = srcB;
2346 srcB = tmp;
2347 }
2348
2349 switch (mode)
2350 {
2351 case 0: /* (A << 8) + B. */
2352 case 1: /* (B << 8) + A. */
2353 dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2354 err = err
2355 || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2356 dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2357 err = err
2358 || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2359 dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2360 break;
2361 case 2: /* Accelerated 3rd party (A[ << 8]) + B. */
2362 case 3: /* Accelerated 3rd party (B[ << 8]) + A. */
2363 dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
2364 err = err
2365 || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
2366 if (third_party_32bit)
2367 dinfo->fprintf_func (dinfo->stream, ", ");
2368 else
2369 dinfo->fprintf_func (dinfo->stream, ", <<8, ");
2370 err = err
2371 || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
2372 dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2373 break;
2374 case 4: /* A + B. */
2375 dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
2376 err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
2377 dinfo->fprintf_func (dinfo->stream, ", ");
2378 err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
2379 dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
2380 break;
2381 case 5: /* Immediate address. */
2382 dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
2383 (cpp_len + 1));
2384 break;
2385 case 6: /* Immediate address and data. */
2386 dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
2387 break;
2388 case 7: /* Immediate data. */
2389 dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
2390 ((xfer << 16) | valBA), (cpp_len + 1));
2391 break;
2392 }
2393
2394 dinfo->fprintf_func (dinfo->stream, "]");
2395
2396 if (indref && (mode != 2) && (mode != 3))
2397 dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
2398
2399 if (ctxswap_defer != 3)
2400 {
2401 dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
2402 if (sig)
2403 dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
2404 else
2405 dinfo->fprintf_func (dinfo->stream, "--]");
2406
2407 if (ctxswap_defer != 0)
2408 dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
2409 }
2410 else if (sig)
2411 dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
2412
2413 if (err)
2414 return _NFP_ERR_CONT;
2415 return 0;
2416}
2417
2418static int
1678bd35 2419nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
fe944acf
FT
2420 struct disassemble_info *dinfo)
2421{
2422 unsigned int gpr_wrboth = _BTST (instr, 41);
2423 unsigned int src_lmext = _BTST (instr, 42);
2424 unsigned int dst_lmext = _BTST (instr, 43);
2425 unsigned int pred_cc = _BTST (instr, 44);
2426
2427 return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
2428 src_lmext, gpr_wrboth, num_ctx, dinfo);
2429}
2430
2431static int
1678bd35 2432nfp_me28_print_alu (uint64_t instr, int num_ctx,
fe944acf
FT
2433 struct disassemble_info *dinfo)
2434{
2435 unsigned int gpr_wrboth = _BTST (instr, 41);
2436 unsigned int src_lmext = _BTST (instr, 42);
2437 unsigned int dst_lmext = _BTST (instr, 43);
2438 unsigned int pred_cc = _BTST (instr, 44);
2439
2440 return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
2441 gpr_wrboth, num_ctx, dinfo);
2442}
2443
2444static int
1678bd35 2445nfp_me28_print_immed (uint64_t instr, int num_ctx,
fe944acf
FT
2446 struct disassemble_info *dinfo)
2447{
2448 unsigned int gpr_wrboth = _BTST (instr, 41);
2449 unsigned int dst_lmext = _BTST (instr, 43);
2450 unsigned int pred_cc = _BTST (instr, 44);
2451
2452 return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
2453 num_ctx, dinfo);
2454}
2455
2456static int
1678bd35 2457nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
fe944acf
FT
2458 struct disassemble_info *dinfo)
2459{
2460 unsigned int gpr_wrboth = _BTST (instr, 41);
2461 unsigned int src_lmext = _BTST (instr, 42);
2462 unsigned int dst_lmext = _BTST (instr, 43);
2463 unsigned int pred_cc = _BTST (instr, 44);
2464
2465 return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
2466 src_lmext, gpr_wrboth, num_ctx, dinfo);
2467}
2468
2469static int
1678bd35 2470nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
fe944acf
FT
2471{
2472 return nfp_me27_28_print_ctx_arb (instr, dinfo);
2473}
2474
2475static int
1678bd35 2476nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
fe944acf
FT
2477 struct disassemble_info *dinfo)
2478{
2479 unsigned int src_lmext = _BTST (instr, 42);
2480
2481 return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
2482}
2483
2484static int
1678bd35 2485nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
fe944acf
FT
2486{
2487 return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
2488}
2489
2490static int
1678bd35 2491nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
fe944acf
FT
2492 struct disassemble_info *dinfo)
2493{
2494 unsigned int src_lmext = _BTST (instr, 42);
2495 return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
2496}
2497
2498static int
1678bd35 2499nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
fe944acf
FT
2500 struct disassemble_info *dinfo)
2501{
2502 unsigned int src_lmext = _BTST (instr, 42);
2503 return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
2504}
2505
2506static int
1678bd35 2507nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
fe944acf
FT
2508 struct disassemble_info *dinfo)
2509{
2510 unsigned int src_lmext = _BTST (instr, 42);
2511 return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
2512}
2513
2514static int
1678bd35 2515nfp_me28_print_mult (uint64_t instr, int num_ctx,
fe944acf
FT
2516 struct disassemble_info *dinfo)
2517{
2518 unsigned int gpr_wrboth = _BTST (instr, 41);
2519 unsigned int src_lmext = _BTST (instr, 42);
2520 unsigned int dst_lmext = _BTST (instr, 43);
2521 unsigned int pred_cc = _BTST (instr, 44);
2522
2523 return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
2524 gpr_wrboth, num_ctx, dinfo);
2525}
2526
2527static bfd_boolean
2528init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2529{
2530 Elf_Internal_Shdr *sec = NULL;
2531 Elf_Nfp_MeConfig mecfg_ent;
2532 unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
2533 file_ptr roff = 0;
2534 unsigned int sec_cnt = 0;
2535 unsigned int sec_idx;
2536 size_t menum_linear = 0;
2537
2538 if (!dinfo->section)
2539 /* No section info, will use default values. */
2540 return TRUE;
2541
2542 sec_cnt = elf_numsections (dinfo->section->owner);
2543
2544 /* Find the MECONFIG section. It's index is also in e_flags, but it has
2545 a unique SHT and we'll use that. */
2546 for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2547 {
2548 sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2549
2550 if (sec->sh_type == SHT_NFP_MECONFIG)
2551 break;
2552 }
2553
2554 if (sec_idx == sec_cnt)
2555 {
2556 dinfo->fprintf_func (dinfo->stream, _("File has no ME-Config section."));
2557 return FALSE;
2558 }
2559
2560 for (roff = 0; (bfd_size_type) roff < sec->sh_size;
2561 roff += sec->sh_entsize, menum_linear++)
2562 {
2563 nfp_priv_mecfg *mecfg;
2564 int isl = menum_linear >> 3;
2565 int menum = menum_linear & 7;
2566
2567 if (menum_linear >= 40)
2568 {
2569 dinfo->fprintf_func (dinfo->stream,
2570 _("File has invalid ME-Config section."));
2571 return FALSE;
2572 }
2573
2574 mecfg = &priv->mecfgs[isl][menum][1];
2575
2576 if (!_bfd_generic_get_section_contents (dinfo->section->owner,
2577 sec->bfd_section, buffer,
2578 roff, sizeof (buffer)))
2579 return FALSE;
2580
2581 mecfg_ent.ctx_enables = bfd_getl32 (buffer + offsetof (Elf_Nfp_MeConfig,
2582 ctx_enables));
2583 mecfg_ent.misc_control = bfd_getl32 (buffer
2584 + offsetof (Elf_Nfp_MeConfig, misc_control));
2585
2586 mecfg->ctx4_mode = _BTST (mecfg_ent.ctx_enables, 31);
2587 mecfg->addr_3rdparty32 = _BTST (mecfg_ent.misc_control, 4);
2588 mecfg->scs_cnt = _BTST (mecfg_ent.misc_control, 2);
2589 }
2590
2591 return TRUE;
2592}
2593
2594static bfd_boolean
2595init_nfp6000_mecsr_sec (nfp_priv_data * priv, Elf_Internal_Shdr * sec,
2596 int is_for_text, struct disassemble_info *dinfo)
2597{
2598 Elf_Nfp_InitRegEntry ireg;
2599 unsigned char buffer[sizeof (Elf_Nfp_InitRegEntry)];
2600 file_ptr ireg_off = 0;
2601 size_t isl, menum;
2602
2603 if (sec->sh_entsize != sizeof (ireg))
2604 return FALSE;
2605
2606 isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2607
2608 /* For these sections we know that the address will only be 32 bits
2609 so we only need cpp_offset_lo.
2610 Address is encoded as follows:
2611 <31:30> 0
2612 <29:24> island (already got this from sh_info)
2613 <23:17> 0
2614 <16:16> XferCsrRegSel (1 for these sections)
2615 <15:14> 0
2616 <13:10> DataMasterID (MEnum = this - 4)
2617 <9:2> register (index)
2618 <1:0> 0b0 (register byte address if appened to the previous field). */
2619 for (ireg_off = 0; (bfd_size_type) ireg_off < sec->sh_size;
2620 ireg_off += sec->sh_entsize)
2621 {
2622 uint32_t csr_off;
2623 nfp_priv_mecfg *mecfg;
2624
2625 if (!_bfd_generic_get_section_contents (dinfo->section->owner,
2626 sec->bfd_section, buffer,
2627 ireg_off, sizeof (buffer)))
2628 return FALSE;
2629
2630 ireg.cpp_offset_lo = bfd_getl32 (buffer
2631 + offsetof (Elf_Nfp_InitRegEntry, cpp_offset_lo));
2632 ireg.mask = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, mask));
2633 ireg.val = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, val));
2634 ireg.w0 = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, w0));
2635
2636 if (NFP_IREG_ENTRY_WO_NLW (ireg.w0))
2637 continue;
2638
2639 /* Only consider entries that are permanent for runtime. */
2640 if ((NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_CONST)
2641 && (NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_FORCE))
2642 continue;
2643
2644 menum = _BF (ireg.cpp_offset_lo, 13, 10) - 4;
2645 csr_off = _BF (ireg.cpp_offset_lo, 9, 0);
2646
2647 mecfg = &priv->mecfgs[isl][menum][is_for_text];
2648 switch (csr_off)
2649 {
2650 case _NFP_ME27_28_CSR_CTX_ENABLES:
2651 mecfg->ctx4_mode = _BTST (ireg.val, 31);
2652 break;
2653 case _NFP_ME27_28_CSR_MISC_CONTROL:
2654 mecfg->addr_3rdparty32 = _BTST (ireg.val, 4);
2655 mecfg->scs_cnt = _BTST (ireg.val, 2);
2656 break;
2657 default:
2658 break;
2659 }
2660 }
2661
2662 return TRUE;
2663}
2664
2665static bfd_boolean
2666init_nfp6000_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
2667{
2668 int mecfg_orders[64][2];
2669 size_t isl;
2670 unsigned int sec_cnt = 0;
2671 unsigned int sec_idx;
2672 int is_for_text;
2673
2674 memset (mecfg_orders, -1, sizeof (mecfg_orders));
2675
2676 if (!dinfo->section)
2677 /* No section info, will use default values. */
2678 return TRUE;
2679
2680 sec_cnt = elf_numsections (dinfo->section->owner);
2681
2682 /* Go through all MECSR init sections to find ME configs. */
2683 for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
2684 {
2685 Elf_Internal_Shdr *sec;
2686 int sec_order;
2687
2688 sec = elf_elfsections (dinfo->section->owner)[sec_idx];
2689 sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
2690
2691 is_for_text = (sec->sh_flags & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2692
2693 /* If we have an init2 section, that is the one that applies to the
2694 ME when executing init code. So we make it's order higher than
2695 any plain init section. */
2696 if (sec->sh_flags & SHF_NFP_INIT2)
2697 sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
2698
2699 if (sec->sh_type != SHT_NFP_INITREG)
2700 continue;
2701 if (!SHI_NFP_6000_IS_IREG_MECSR (sec->sh_info))
2702 continue;
2703
2704 isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
2705 if ((sec_order < mecfg_orders[isl][is_for_text]))
2706 /* Lower order or transient, skip it. */
2707 continue;
2708
2709 mecfg_orders[isl][is_for_text] = sec_order;
2710
2711 if (!init_nfp6000_mecsr_sec (priv, sec, is_for_text, dinfo))
2712 {
2713 dinfo->fprintf_func (dinfo->stream,
2714 _("Error processing section %u "), sec_idx);
2715 return FALSE;
2716 }
2717 }
2718
2719 return TRUE;
2720}
2721
2722static int
2723parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
2724{
2725 const char *option;
2726
2727 if (dinfo->disassembler_options == NULL)
2728 return 0;
2729
2730 FOR_EACH_DISASSEMBLER_OPTION (option, dinfo->disassembler_options)
2731 {
2732 if (disassembler_options_cmp (option, "no-pc") == 0)
2733 opts->show_pc = 0;
2734 else if (disassembler_options_cmp (option, "ctx4") == 0)
2735 {
2736 if (!opts->ctx_mode)
2737 opts->ctx_mode = 4;
2738 }
2739 else if (disassembler_options_cmp (option, "ctx8") == 0)
2740 opts->ctx_mode = 8;
2741 else
2742 {
2743 dinfo->fprintf_func (dinfo->stream, _("Invalid NFP option: %s"), option);
2744 return _NFP_ERR_STOP;
2745 }
2746 }
2747
2748 return 0;
2749}
2750
2751/* Called on first disassembly attempt so that dinfo->section is valid
2752 so that we can get the bfd owner to find ME configs. */
2753
2754static nfp_priv_data *
2755init_nfp_priv (struct disassemble_info *dinfo)
2756{
2757 nfp_priv_data *priv;
2758 int ret = FALSE;
2759
2760 if (dinfo->private_data)
2761 return (nfp_priv_data *) dinfo->private_data;
2762
2763#if 0 /* Right now only section-related info is kept in priv.
2764 So don't even calloc it if we don't need it. */
2765 if (!dinfo->section)
2766 return NULL;
2767#endif
2768
2769 /* Alloc with no free, seems to be either this or a static global variable
2770 and this at least keeps a large struct unallocated until really needed. */
2771 priv = calloc (1, sizeof (*priv));
2772 if (!priv)
2773 return NULL;
2774
2775 switch (dinfo->mach)
2776 {
2777 case E_NFP_MACH_3200:
2778 ret = init_nfp3200_priv (priv, dinfo);
2779 break;
2780 case E_NFP_MACH_6000:
2781 ret = init_nfp6000_priv (priv, dinfo);
2782 break;
2783 }
2784
2785 if (!ret)
2786 {
2787 free (priv);
2788 return NULL;
2789 }
2790
2791 dinfo->private_data = priv;
2792 return priv;
2793}
2794
2795static int
2796_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
2797{
2798 nfp_priv_data *priv = init_nfp_priv (dinfo);
2799 bfd_byte buffer[8];
2800 int err;
1678bd35 2801 uint64_t instr = 0;
fe944acf
FT
2802 size_t island, menum;
2803 int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
2804 int is_text = 1;
2805
2806 err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
2807 if (err)
2808 return _NFP_ERR_STOP;
2809
2810 if (!dinfo->section)
2811 {
2812 num_ctx = 8;
2813 scs_cnt = 0;
2814 addr_3rdparty32 = 0;
2815 }
2816 else
2817 {
2818 unsigned int sh_info = 0;
2819 nfp_priv_mecfg *mecfg;
2820
2821 /* We have a section, presumably all ELF sections. Try to find
2822 proper ME configs to produce better disassembly. */
2823 if (!priv)
2824 return _NFP_ERR_STOP; /* Sanity check */
2825
2826 is_text = (elf_section_flags (dinfo->section)
2827 & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
2828
2829 sh_info = elf_section_info (dinfo->section);
2830
2831 switch (dinfo->mach)
2832 {
2833 case E_NFP_MACH_3200:
2834 island = SHI_NFP_3200_ISLAND (sh_info);
2835 menum = SHI_NFP_3200_MENUM (sh_info);
2836 break;
2837 default:
2838 island = SHI_NFP_ISLAND (sh_info);
2839 menum = SHI_NFP_MENUM (sh_info);
2840 break;
2841 }
2842
2843 mecfg = &priv->mecfgs[island][menum][is_text];
2844 num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
2845 addr_3rdparty32 = mecfg->addr_3rdparty32;
2846 scs_cnt = mecfg->scs_cnt;
2847 }
2848
2849 if (opts->ctx_mode)
2850 num_ctx = opts->ctx_mode;
2851
2852 dinfo->bytes_per_line = 8;
2853 dinfo->bytes_per_chunk = 8;
2854
2855 instr = bfd_getl64 (buffer);
2856
2857 if (opts->show_pc)
2858 {
2859 pc = (int) (addr >> 3);
2860
2861 /* Guess max PC for formatting */
2862 tmpj = (int) (dinfo->buffer_length >> 3);
2863 if (scs_cnt == 1)
2864 {
2865 pc *= 2;
2866 tmpj *= 2;
2867 if (! !(menum & 1))
2868 {
2869 pc++;
2870 tmpj++;
2871 }
2872 }
2873
2874 for (tmpi = 1; tmpj > 9; tmpj /= 10)
2875 tmpi++;
2876
2877 tmpj = pc;
2878 for (; tmpj > 9; tmpj /= 10)
2879 tmpi--;
2880
2881 dinfo->fprintf_func (dinfo->stream, "%*c%d ", tmpi, '.', pc);
2882 }
2883
2884 switch (dinfo->mach)
2885 {
2886 case E_NFP_MACH_3200:
2887 if (NFP_ME27_INSTR_IS_CMD (instr))
2888 err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2889 else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
2890 err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
2891 else if (NFP_ME27_INSTR_IS_ALU (instr))
2892 err = nfp_me27_print_alu (instr, num_ctx, dinfo);
2893 else if (NFP_ME27_INSTR_IS_IMMED (instr))
2894 err = nfp_me27_print_immed (instr, num_ctx, dinfo);
2895 else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
2896 err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
2897 else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
2898 err = nfp_me27_print_ctx_arb (instr, dinfo);
2899 else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
2900 err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
2901 else if (NFP_ME27_INSTR_IS_BRANCH (instr))
2902 err = nfp_me27_print_branch (instr, dinfo);
2903 else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
2904 err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
2905 else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
2906 err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
2907 else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
2908 err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
2909 else if (NFP_ME27_INSTR_IS_MULT (instr))
2910 err = nfp_me27_print_mult (instr, num_ctx, dinfo);
2911 else
2912 err = nfp_me_print_invalid (instr, dinfo);
2913 break;
2914
2915 case E_NFP_MACH_6000:
2916 if (NFP_ME28_INSTR_IS_CMD (instr))
2917 err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
2918 else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
2919 err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
2920 else if (NFP_ME28_INSTR_IS_ALU (instr))
2921 err = nfp_me28_print_alu (instr, num_ctx, dinfo);
2922 else if (NFP_ME28_INSTR_IS_IMMED (instr))
2923 err = nfp_me28_print_immed (instr, num_ctx, dinfo);
2924 else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
2925 err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
2926 else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
2927 err = nfp_me28_print_ctx_arb (instr, dinfo);
2928 else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
2929 err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
2930 else if (NFP_ME28_INSTR_IS_BRANCH (instr))
2931 err = nfp_me28_print_branch (instr, dinfo);
2932 else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
2933 err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
2934 else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
2935 err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
2936 else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
2937 err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
2938 else if (NFP_ME28_INSTR_IS_MULT (instr))
2939 err = nfp_me28_print_mult (instr, num_ctx, dinfo);
2940 else
2941 err = nfp_me_print_invalid (instr, dinfo);
2942 break;
2943 }
2944
2945 if (err < 0)
2946 return err;
2947 return 8;
2948}
2949
2950int
2951print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
2952{
2953 nfp_opts opts;
2954 int err;
2955
2956 opts.show_pc = 1;
2957 opts.ctx_mode = 0;
2958 err = parse_disassembler_options (&opts, dinfo);
2959 if (err < 0)
2960 goto end;
2961
2962 err = _print_instrs (addr, dinfo, &opts);
2963
2964end:
2965 if (err != 8)
2966 dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
2967 if (err == _NFP_ERR_CONT)
2968 return 8;
2969 return err;
2970}
2971
2972void
2973print_nfp_disassembler_options (FILE * stream)
2974{
2975 fprintf (stream, _("\n\
2976The following NFP specific disassembler options are supported for use\n\
2977with the -M switch (multiple options should be separated by commas):\n"));
2978
2979 fprintf (stream, _("\n\
2980 no-pc Don't print program counter prefix.\n\
2981 ctx4 Force disassembly using 4-context mode.\n\
2982 ctx8 Force 8-context mode, takes presedence.\""));
2983
2984 fprintf (stream, _("\n"));
2985}
This page took 0.134519 seconds and 4 git commands to generate.