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>
5 This file is part of the GNU opcodes library.
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)
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.
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. */
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. */
29 #include "disassemble.h"
30 #include "libiberty.h"
32 #include "opcode/nfp.h"
36 #include "bfd_stdint.h"
39 #define _NFP_ERR_STOP -1
40 #define _NFP_ERR_CONT -8
42 #define _BTST(v, b) (((v) >> b) & 1)
43 #define _BF(v, msb, lsb) (((v) >> (lsb)) & \
44 ((1U << ((msb) - (lsb) + 1)) - 1))
45 #define _BFS(v, msb, lsb, lshift) (_BF(v, msb, lsb) << (lshift))
47 #define _NFP_ME27_28_CSR_CTX_ENABLES 0x18
48 #define _NFP_ME27_28_CSR_MISC_CONTROL 0x160
52 unsigned char ctx4_mode
:1;
53 unsigned char addr_3rdparty32
:1;
54 unsigned char scs_cnt
:2;
55 unsigned char _future
:4;
61 unsigned char show_pc
;
62 unsigned char ctx_mode
;
66 /* mecfgs[island][menum][is-text] */
69 nfp_priv_mecfg mecfgs
[64][12][2];
73 static const char *nfp_mealu_shf_op
[8] =
77 /* 0b010 (2) */ "AND",
78 /* 0b011 (3) */ "~AND",
79 /* 0b100 (4) */ "AND~",
81 /* 0b110 (6) */ "asr",
82 /* 0b111 (7) */ "byte_align"
85 static const char *nfp_me27_28_alu_op
[32] =
87 /* 0b00000 (0) */ "B",
88 /* 0b00001 (1) */ "+",
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",
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) */ "-",
110 /* 0b10111 (23) */ "cam_lookup",
111 /* 0b11000 (24) */ "XOR",
112 /* 0b11001 (25) */ "B-A",
114 /* 0b11011 (27) */ "cam_write_state",
118 /* 0b11111 (31) */ "cam_read_state"
121 static const char *nfp_me27_28_crc_op
[8] =
123 /* 0b000 (0) */ "--",
125 /* 0b010 (2) */ "crc_ccitt",
127 /* 0b100 (4) */ "crc_32",
128 /* 0b101 (5) */ "crc_iscsi",
129 /* 0b110 (6) */ "crc_10",
130 /* 0b111 (7) */ "crc_5"
133 static const char *nfp_me27_28_crc_bytes
[8] =
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"
144 static const char *nfp_me27_28_mecsrs
[] =
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",
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",
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",
194 /* 0x0c0 (48) */ "TimestampLow",
195 /* 0x0c4 (49) */ "TimestampHgh",
202 /* 0x0e0 (56) */ "IndLMAddr0BytIdx",
203 /* 0x0e4 (57) */ "ActLMAddr0BytIdx",
204 /* 0x0e8 (58) */ "IndLMAddr1BytIdx",
205 /* 0x0ec (59) */ "ActLMAddr1BytIdx",
207 /* 0x0f4 (61) */ "XfrAndBytIdx",
210 /* 0x100 (64) */ "NxtNghbrSgl",
211 /* 0x104 (65) */ "PrvNghbrSgl",
212 /* 0x108 (66) */ "SameMESignal",
226 /* 0x140 (80) */ "CRCRemainder",
227 /* 0x144 (81) */ "ProfileCnt",
228 /* 0x148 (82) */ "PseudoRndNum",
234 /* 0x160 (88) */ "MiscControl",
235 /* 0x164 (89) */ "PcBreakpoint0Mask",
236 /* 0x168 (90) */ "PcBreakpoint1Mask",
238 /* 0x170 (92) */ "Mailbox0",
239 /* 0x174 (93) */ "Mailbox1",
240 /* 0x178 (94) */ "Mailbox2",
241 /* 0x17c (95) */ "Mailbox3",
246 /* 0x190 (100) */ "CmdIndirectRef0"
249 const char *nfp_me27_28_br_ops
[32] =
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",
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",
285 static const char *nfp_me27_br_inpstates
[16] =
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",
305 static const char *nfp_me28_br_inpstates
[16] =
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"
325 static const char *nfp_me27_28_mult_steps
[8] =
337 static const char *nfp_me27_28_mult_types
[4] =
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. */
350 static const nfp_cmd_mnemonic nfp_me27_mnemonics
[] =
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"}
611 static const nfp_cmd_mnemonic nfp_me28_mnemonics
[] =
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"}
926 nfp_me_print_invalid (uint64_t instr
, struct disassemble_info
*dinfo
)
928 const char * err_msg
= N_("<invalid_instruction>:");
929 dinfo
->fprintf_func (dinfo
->stream
, "%s 0x%" PRIx64
, err_msg
, instr
);
930 return _NFP_ERR_CONT
;
934 nfp_me_is_imm_opnd10 (unsigned int opnd
)
936 return _BF (opnd
, 9, 8) == 0x3;
940 nfp_me_is_imm_opnd8 (unsigned int opnd
)
942 return _BTST (opnd
, 5);
946 nfp_me_imm_opnd10 (unsigned int opnd
)
948 return nfp_me_is_imm_opnd10 (opnd
) ? (opnd
& 0xff) : ~0U;
952 nfp_me_imm_opnd8 (unsigned int opnd
, unsigned int imm8_msb
)
954 unsigned int v
= (imm8_msb
<< 7) | _BFS (opnd
, 7, 6, 5) | _BF (opnd
, 4, 0);
956 return nfp_me_is_imm_opnd8 (opnd
) ? v
: ~0U;
959 /* Print an unrestricted/10-bit operand.
960 This can mostly be generic across NFP families at the moment. */
962 nfp_me_print_opnd10 (unsigned int opnd
, char bank
, int num_ctx
, int lmem_ext
,
963 struct disassemble_info
*dinfo
)
965 unsigned int n
= _BF (opnd
, (num_ctx
== 8) ? 3 : 4, 0);
968 if (_BF (opnd
, 9, 7) == 0x1)
969 dinfo
->fprintf_func (dinfo
->stream
, "@gpr%c_%d", bank
, _BF (opnd
, 6, 0));
972 else if (_BF (opnd
, 9, 6) == 0x0)
973 dinfo
->fprintf_func (dinfo
->stream
, "gpr%c_%d", bank
, n
);
976 else if (_BF (opnd
, 9, 7) == 0x2)
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
, "--");
986 else if (_BF (opnd
, 9, 7) == 0x3)
989 n
+= (num_ctx
== 8 ? 16 : 32);
990 dinfo
->fprintf_func (dinfo
->stream
, "$xfer_%d", n
);
993 /* Indexed Next Neighbour. */
994 else if (_BF (opnd
, 9, 6) == 0x9)
996 dinfo
->fprintf_func (dinfo
->stream
, "*n$index");
998 dinfo
->fprintf_func (dinfo
->stream
, "++");
1001 /* Relative Next Neighbour. */
1002 else if (_BF (opnd
, 9, 6) == 0xa)
1004 dinfo
->fprintf_func (dinfo
->stream
, "n$reg_%d", n
);
1008 else if (_BF (opnd
, 9, 6) == 0x8)
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));
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));
1024 dinfo
->fprintf_func (dinfo
->stream
, "<opnd:0x%x>", opnd
);
1031 /* Print a restricted/8-bit operand.
1032 This can mostly be generic across NFP families at the moment. */
1035 nfp_me_print_opnd8 (unsigned int opnd
, char bank
, int num_ctx
, int lmem_ext
,
1036 unsigned int imm8_msb
, struct disassemble_info
*dinfo
)
1038 unsigned int n
= _BF (opnd
, (num_ctx
== 8) ? 3 : 4, 0);
1041 if (_BF (opnd
, 7, 5) == 0x0)
1042 dinfo
->fprintf_func (dinfo
->stream
, "gpr%c_%d", bank
, n
);
1044 /* Relative Xfer. */
1045 else if (_BF (opnd
, 7, 5) == 0x4)
1046 dinfo
->fprintf_func (dinfo
->stream
, "$xfer_%d", n
);
1048 /* Relative Xfer. */
1049 else if (_BF (opnd
, 7, 5) == 0x6)
1051 n
+= (num_ctx
== 8 ? 16 : 32);
1052 dinfo
->fprintf_func (dinfo
->stream
, "$xfer_%d", n
);
1056 else if ((_BF (opnd
, 7, 4) == 0x4) && (!_BTST (opnd
, 0)))
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
, "--");
1066 else if ((_BF (opnd
, 7, 4) == 0x4) && (_BTST (opnd
, 0)))
1068 dinfo
->fprintf_func (dinfo
->stream
, "*n$index");
1069 if (_BTST (opnd
, 1))
1070 dinfo
->fprintf_func (dinfo
->stream
, "++");
1074 else if (_BF (opnd
, 7, 4) == 0x5)
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));
1082 /* 7+1-bit Constant value. */
1083 else if (_BTST (opnd
, 5))
1085 n
= (imm8_msb
<< 7) | _BFS (opnd
, 7, 6, 5) | _BF (opnd
, 4, 0);
1086 dinfo
->fprintf_func (dinfo
->stream
, "0x%x", n
);
1091 dinfo
->fprintf_func (dinfo
->stream
, "<opnd:0x%x>", opnd
);
1099 nfp_me27_28_print_alu_shf (uint64_t instr
, unsigned int pred_cc
,
1100 unsigned int dst_lmext
, unsigned int src_lmext
,
1101 unsigned int gpr_wrboth
,
1102 int num_ctx
, struct disassemble_info
*dinfo
)
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
;
1118 unsigned int tmp
= srcA
;
1123 /* alu_shf, dbl_shf, asr. */
1127 dinfo
->fprintf_func (dinfo
->stream
, "dbl_shf[");
1129 dinfo
->fprintf_func (dinfo
->stream
, "asr[");
1131 dinfo
->fprintf_func (dinfo
->stream
, "alu_shf[");
1134 if (nfp_me_is_imm_opnd8 (dst
))
1135 dinfo
->fprintf_func (dinfo
->stream
, "--");
1137 err
= err
|| !nfp_me_print_opnd8 (dst
, dst_bank
, num_ctx
,
1138 dst_lmext
, imm_msb
, dinfo
);
1140 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1145 if ((op
< 2) && (sc
!= 3)) /* Not dbl_shf. */
1146 dinfo
->fprintf_func (dinfo
->stream
, "--"); /* B or ~B operator. */
1148 err
= err
|| !nfp_me_print_opnd8 (srcA
, (swap
) ? 'B' : 'A',
1149 num_ctx
, src_lmext
, imm_msb
,
1152 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1154 /* Operator (not for dbl_shf). */
1157 dinfo
->fprintf_func (dinfo
->stream
, "%s, ",
1158 nfp_mealu_shf_op
[op
]);
1163 err
= err
|| !nfp_me_print_opnd8 (srcB
, (swap
) ? 'A' : 'B',
1164 num_ctx
, src_lmext
, imm_msb
, dinfo
);
1166 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1170 dinfo
->fprintf_func (dinfo
->stream
, ">>rot%d", shift
);
1174 dinfo
->fprintf_func (dinfo
->stream
, "<<%d", (32 - shift
));
1176 dinfo
->fprintf_func (dinfo
->stream
, "<<indirect");
1181 dinfo
->fprintf_func (dinfo
->stream
, ">>%d", shift
);
1183 dinfo
->fprintf_func (dinfo
->stream
, ">>indirect");
1189 dinfo
->fprintf_func (dinfo
->stream
, "byte_align_%s[",
1190 ((sc
== 2) ? "le" : "be"));
1193 if (nfp_me_is_imm_opnd8 (dst
))
1194 dinfo
->fprintf_func (dinfo
->stream
, "--");
1196 err
= err
|| !nfp_me_print_opnd8 (dst
, dst_bank
, num_ctx
,
1197 dst_lmext
, imm_msb
, dinfo
);
1199 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1202 err
= err
|| !nfp_me_print_opnd8 (srcA
, (swap
) ? 'B' : 'A', num_ctx
,
1205 err
= err
|| !nfp_me_print_opnd8 (srcB
, (swap
) ? 'A' : 'B', num_ctx
,
1209 dinfo
->fprintf_func (dinfo
->stream
, "]");
1211 dinfo
->fprintf_func (dinfo
->stream
, ", no_cc");
1213 dinfo
->fprintf_func (dinfo
->stream
, ", gpr_wrboth");
1215 dinfo
->fprintf_func (dinfo
->stream
, ", predicate_cc");
1218 return _NFP_ERR_CONT
;
1223 nfp_me27_28_print_alu (uint64_t instr
, unsigned int pred_cc
,
1224 unsigned int dst_lmext
, unsigned int src_lmext
,
1225 unsigned int gpr_wrboth
,
1226 int num_ctx
, struct disassemble_info
*dinfo
)
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
;
1240 unsigned int tmp
= srcA
;
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
]);
1255 /* No dest for pop_count1/2. */
1256 if ((op
!= 6) && (op
!= 7))
1259 if (nfp_me_is_imm_opnd10 (dst
))
1260 dinfo
->fprintf_func (dinfo
->stream
, "--");
1262 err
= err
|| !nfp_me_print_opnd10 (dst
, dst_bank
, num_ctx
,
1265 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1269 err
= err
|| !nfp_me_print_opnd10 (srcB
, (swap
) ? 'A' : 'B',
1270 num_ctx
, src_lmext
, dinfo
);
1275 do_close_bracket
= 0;
1276 dinfo
->fprintf_func (dinfo
->stream
, "cam_clear");
1281 do_close_bracket
= 0;
1282 dinfo
->fprintf_func (dinfo
->stream
, "%s[", nfp_me27_28_alu_op
[op
]);
1285 if (nfp_me_is_imm_opnd10 (dst
))
1286 dinfo
->fprintf_func (dinfo
->stream
, "--");
1288 err
= err
|| !nfp_me_print_opnd10 (dst
, dst_bank
, num_ctx
,
1291 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1294 err
= err
|| !nfp_me_print_opnd10 (srcA
, (swap
) ? 'B' : 'A',
1295 num_ctx
, src_lmext
, dinfo
);
1297 dinfo
->fprintf_func (dinfo
->stream
, "]");
1299 if (_BF (srcB
, 1, 0))
1301 unsigned int n
= _BTST (srcB
, 1);
1302 if (_BTST (srcB
, 4)) /* Only for MEv28. */
1304 dinfo
->fprintf_func (dinfo
->stream
, ", lm_addr%d[%d]", n
,
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
, ", ");
1318 err
= err
|| !nfp_me_print_opnd10 (srcA
, (swap
) ? 'B' : 'A',
1319 num_ctx
, src_lmext
, dinfo
);
1320 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1322 dinfo
->fprintf_func (dinfo
->stream
, "%d", (dst
& 0xf));
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)])
1332 dinfo
->fprintf_func (dinfo
->stream
, _(", <invalid CRC operator>, "));
1337 dinfo
->fprintf_func (dinfo
->stream
, "%s, ",
1338 nfp_me27_28_crc_op
[_BF (instr
, 7, 5)]);
1342 if (nfp_me_is_imm_opnd10 (dst
))
1343 dinfo
->fprintf_func (dinfo
->stream
, "--");
1345 err
= err
|| !nfp_me_print_opnd10 (dst
, dst_bank
, num_ctx
,
1348 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1351 err
= err
|| !nfp_me_print_opnd10 (srcB
, (swap
) ? 'A' : 'B',
1352 num_ctx
, src_lmext
, dinfo
);
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");
1363 /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs). */
1364 dinfo
->fprintf_func (dinfo
->stream
, "alu[");
1367 if (nfp_me_is_imm_opnd10 (dst
))
1368 dinfo
->fprintf_func (dinfo
->stream
, "--");
1370 err
= err
|| !nfp_me_print_opnd10 (dst
, dst_bank
, num_ctx
,
1372 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1375 if ((op
== 0) || (op
== 4)) /* B only operators. */
1376 dinfo
->fprintf_func (dinfo
->stream
, "--");
1378 err
= err
|| !nfp_me_print_opnd10 (srcA
, (swap
) ? 'B' : 'A',
1379 num_ctx
, src_lmext
, dinfo
);
1381 if (!nfp_me27_28_alu_op
[op
])
1383 dinfo
->fprintf_func (dinfo
->stream
, ", <operator:0x%x>, ", op
);
1388 dinfo
->fprintf_func (dinfo
->stream
, ", %s, ",
1389 nfp_me27_28_alu_op
[op
]);
1393 err
= err
|| !nfp_me_print_opnd10 (srcB
, (swap
) ? 'A' : 'B',
1394 num_ctx
, src_lmext
, dinfo
);
1398 if (do_close_bracket
)
1399 dinfo
->fprintf_func (dinfo
->stream
, "]");
1402 dinfo
->fprintf_func (dinfo
->stream
, ", no_cc");
1404 dinfo
->fprintf_func (dinfo
->stream
, ", gpr_wrboth");
1406 dinfo
->fprintf_func (dinfo
->stream
, ", predicate_cc");
1409 return _NFP_ERR_CONT
;
1414 nfp_me27_28_print_immed (uint64_t instr
, unsigned int pred_cc
,
1415 unsigned int dst_lmext
,
1416 unsigned int gpr_wrboth
,
1417 int num_ctx
, struct disassemble_info
*dinfo
)
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
;
1428 if (nfp_me_is_imm_opnd10 (srcB
))
1430 imm
= (imm
<< 8) | nfp_me_imm_opnd10 (srcB
);
1431 if (nfp_me_is_imm_opnd10 (srcA
) && (imm
== 0))
1433 dinfo
->fprintf_func (dinfo
->stream
, "nop");
1439 imm
= (imm
<< 8) | nfp_me_imm_opnd10 (srcA
);
1443 imm
= (imm
^ 0xffff) | 0xffff0000U
;
1447 dinfo
->fprintf_func (dinfo
->stream
, "immed_b%d[", byte_shift
);
1452 dinfo
->fprintf_func (dinfo
->stream
, "immed_w%d[", (byte_shift
/ 2));
1456 dinfo
->fprintf_func (dinfo
->stream
, "immed[");
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
);
1464 err
= err
|| !nfp_me_print_opnd10 (srcA
, 'A', num_ctx
, dst_lmext
, dinfo
);
1466 dinfo
->fprintf_func (dinfo
->stream
, ", 0x%x", imm
);
1468 if ((!by
) && (!wd
) && (byte_shift
))
1469 dinfo
->fprintf_func (dinfo
->stream
, ", <<%d", (byte_shift
* 8));
1471 dinfo
->fprintf_func (dinfo
->stream
, "]");
1474 dinfo
->fprintf_func (dinfo
->stream
, ", gpr_wrboth");
1476 dinfo
->fprintf_func (dinfo
->stream
, ", predicate_cc");
1479 return _NFP_ERR_CONT
;
1484 nfp_me27_28_print_ld_field (uint64_t instr
, unsigned int pred_cc
,
1485 unsigned int dst_lmext
, unsigned int src_lmext
,
1486 unsigned int gpr_wrboth
,
1487 int num_ctx
, struct disassemble_info
*dinfo
)
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
;
1502 unsigned int tmp
= src
;
1508 dinfo
->fprintf_func (dinfo
->stream
, "ld_field_w_clr[");
1510 dinfo
->fprintf_func (dinfo
->stream
, "ld_field[");
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
);
1521 if ((sc
== 0) && (shift
!= 0))
1522 dinfo
->fprintf_func (dinfo
->stream
, ", >>rot%d", shift
);
1526 dinfo
->fprintf_func (dinfo
->stream
, ", >>%d", shift
);
1528 dinfo
->fprintf_func (dinfo
->stream
, ", >>indirect");
1533 dinfo
->fprintf_func (dinfo
->stream
, ", <<%d", (32 - shift
));
1535 dinfo
->fprintf_func (dinfo
->stream
, ", <<indirect");
1538 dinfo
->fprintf_func (dinfo
->stream
, ", >>dbl%d", shift
);
1540 dinfo
->fprintf_func (dinfo
->stream
, "]");
1543 dinfo
->fprintf_func (dinfo
->stream
, ", load_cc");
1545 dinfo
->fprintf_func (dinfo
->stream
, ", gpr_wrboth");
1547 dinfo
->fprintf_func (dinfo
->stream
, ", predicate_cc");
1550 return _NFP_ERR_CONT
;
1555 nfp_me27_28_print_ctx_arb (uint64_t instr
, struct disassemble_info
*dinfo
)
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);
1565 dinfo
->fprintf_func (dinfo
->stream
, "ctx_arb[");
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))
1572 dinfo
->fprintf_func (dinfo
->stream
, "kill");
1575 else if (ev_mask
== 0)
1576 dinfo
->fprintf_func (dinfo
->stream
, "--");
1579 int first_print
= 1;
1582 for (n
= 1; n
< 16; n
++)
1584 if (!_BTST (ev_mask
, n
))
1586 dinfo
->fprintf_func (dinfo
->stream
, "%ssig%d",
1587 (first_print
) ? "" : ", ", n
);
1592 dinfo
->fprintf_func (dinfo
->stream
, "]");
1595 dinfo
->fprintf_func (dinfo
->stream
, ", any");
1597 dinfo
->fprintf_func (dinfo
->stream
, ", br[.%d]", resume_addr
);
1599 dinfo
->fprintf_func (dinfo
->stream
, ", defer[%d]", defer
);
1605 nfp_me27_28_print_local_csr (uint64_t instr
,
1606 unsigned int src_lmext
,
1607 int num_ctx
, struct disassemble_info
*dinfo
)
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
;
1617 if (nfp_me_is_imm_opnd10 (srcA
) && !nfp_me_is_imm_opnd10 (srcB
))
1623 /* MEv28 does not have urd/uwr. */
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
,
1635 dinfo
->fprintf_func (dinfo
->stream
, "urd[");
1636 err
= err
|| !nfp_me_print_opnd10 (src
, src_bank
, num_ctx
,
1638 dinfo
->fprintf_func (dinfo
->stream
, ", *u$index%d++",
1639 (int) _BTST (instr
, 20));
1641 dinfo
->fprintf_func (dinfo
->stream
, "]");
1645 const char *nm
= NULL
;
1647 if (csr_num
< ARRAY_SIZE (nfp_me27_28_mecsrs
))
1648 nm
= nfp_me27_28_mecsrs
[csr_num
];
1650 dinfo
->fprintf_func (dinfo
->stream
, "local_csr_%s[",
1651 (wr
) ? "wr" : "rd");
1653 dinfo
->fprintf_func (dinfo
->stream
, "%s", nm
);
1655 dinfo
->fprintf_func (dinfo
->stream
, "0x%x", (csr_num
* 4));
1659 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1660 err
= err
|| !nfp_me_print_opnd10 (src
, src_bank
, num_ctx
,
1663 dinfo
->fprintf_func (dinfo
->stream
, "]");
1667 return _NFP_ERR_CONT
;
1672 nfp_me27_28_print_branch (uint64_t instr
,
1673 const char *br_inpstates
[16],
1674 struct disassemble_info
*dinfo
)
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);
1682 if (!nfp_me27_28_br_ops
[br_op
])
1684 dinfo
->fprintf_func (dinfo
->stream
, _("<invalid branch>["));
1685 ret
= _NFP_ERR_CONT
;
1688 dinfo
->fprintf_func (dinfo
->stream
, "%s[", nfp_me27_28_br_ops
[br_op
]);
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
);
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
]);
1703 case 22: /* "br_cls_state" */
1704 case 23: /* "br_!cls_state" */
1705 dinfo
->fprintf_func (dinfo
->stream
, "cls_ring%d_status, ",
1712 dinfo
->fprintf_func (dinfo
->stream
, ".%d]", br_addr
);
1715 dinfo
->fprintf_func (dinfo
->stream
, ", defer[%d]", defer
);
1721 nfp_me27_28_print_br_byte (uint64_t instr
,
1722 unsigned int src_lmext
, int num_ctx
,
1723 struct disassemble_info
*dinfo
)
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
;
1735 dinfo
->fprintf_func (dinfo
->stream
, "br=byte[");
1737 dinfo
->fprintf_func (dinfo
->stream
, "br!=byte[");
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
);
1743 err
= err
|| !nfp_me_print_opnd8 (srcA
, 'A', num_ctx
,
1744 src_lmext
, imm_msb
, dinfo
);
1746 dinfo
->fprintf_func (dinfo
->stream
, ", %d, ", by
);
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
);
1752 err
= err
|| !nfp_me_print_opnd8 (srcB
, 'B', num_ctx
,
1753 src_lmext
, imm_msb
, dinfo
);
1755 dinfo
->fprintf_func (dinfo
->stream
, ", .%d]", br_addr
);
1758 dinfo
->fprintf_func (dinfo
->stream
, ", defer[%d]", defer
);
1761 return _NFP_ERR_CONT
;
1766 nfp_me27_28_print_br_bit (uint64_t instr
, unsigned int src_lmext
,
1767 int num_ctx
, struct disassemble_info
*dinfo
)
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
;
1777 dinfo
->fprintf_func (dinfo
->stream
, "br_bset[");
1779 dinfo
->fprintf_func (dinfo
->stream
, "br_bclr[");
1781 if (nfp_me_is_imm_opnd8 (srcA
))
1784 || !nfp_me_print_opnd8 (srcB
, 'B', num_ctx
, src_lmext
, 0, dinfo
);
1785 b
= (nfp_me_imm_opnd8 (srcA
, 0) - 1) & 0x1f;
1790 || !nfp_me_print_opnd8 (srcA
, 'A', num_ctx
, src_lmext
, 0, dinfo
);
1791 b
= (nfp_me_imm_opnd8 (srcB
, 0) - 1) & 0x1f;
1794 dinfo
->fprintf_func (dinfo
->stream
, ", %d, .%d]", b
, br_addr
);
1797 dinfo
->fprintf_func (dinfo
->stream
, ", defer[%d]", defer
);
1800 return _NFP_ERR_CONT
;
1805 nfp_me27_28_print_br_alu (uint64_t instr
, unsigned int src_lmext
,
1806 int num_ctx
, struct disassemble_info
*dinfo
)
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
;
1814 if (nfp_me_is_imm_opnd10 (srcA
))
1815 imm
= (imm
<< 8) | nfp_me_imm_opnd10 (srcA
);
1817 imm
= (imm
<< 8) | nfp_me_imm_opnd10 (srcB
);
1820 dinfo
->fprintf_func (dinfo
->stream
, "rtn[");
1822 dinfo
->fprintf_func (dinfo
->stream
, "jump[");
1824 if (nfp_me_is_imm_opnd10 (srcA
))
1825 err
= err
|| !nfp_me_print_opnd10 (srcB
, 'B', num_ctx
, src_lmext
, dinfo
);
1827 err
= err
|| !nfp_me_print_opnd10 (srcA
, 'A', num_ctx
, src_lmext
, dinfo
);
1830 dinfo
->fprintf_func (dinfo
->stream
, ", .%d", imm
);
1832 dinfo
->fprintf_func (dinfo
->stream
, "]");
1835 dinfo
->fprintf_func (dinfo
->stream
, ", defer[%d]", defer
);
1838 return _NFP_ERR_CONT
;
1843 nfp_me27_28_print_mult (uint64_t instr
, unsigned int pred_cc
,
1844 unsigned int dst_lmext
, unsigned int src_lmext
,
1845 unsigned int gpr_wrboth
,
1846 int num_ctx
, struct disassemble_info
*dinfo
)
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
;
1859 unsigned int tmp
= srcA
;
1864 dinfo
->fprintf_func (dinfo
->stream
, "mul_step[");
1868 || !nfp_me_print_opnd10 (srcA
, dst_bank
, num_ctx
, dst_lmext
, dinfo
);
1870 err
= err
|| !nfp_me_print_opnd10 (srcA
, (swap
) ? 'B' : 'A', num_ctx
,
1873 dinfo
->fprintf_func (dinfo
->stream
, ", ");
1876 dinfo
->fprintf_func (dinfo
->stream
, "--");
1878 err
= err
|| !nfp_me_print_opnd10 (srcB
, (swap
) ? 'A' : 'B', num_ctx
,
1881 dinfo
->fprintf_func (dinfo
->stream
, "], %s", nfp_me27_28_mult_types
[mtype
]);
1884 const char *s
= nfp_me27_28_mult_steps
[mstep
];
1887 s
= "<invalid mul_step>";
1890 dinfo
->fprintf_func (dinfo
->stream
, "_%s", s
);
1894 dinfo
->fprintf_func (dinfo
->stream
, ", no_cc");
1896 dinfo
->fprintf_func (dinfo
->stream
, ", gpr_wrboth");
1898 dinfo
->fprintf_func (dinfo
->stream
, ", predicate_cc");
1901 return _NFP_ERR_CONT
;
1906 _nfp_cmp_mnmnc (const void *arg_a
, const void *arg_b
)
1908 const nfp_cmd_mnemonic
*a
= arg_a
;
1909 const nfp_cmd_mnemonic
*b
= arg_b
;
1911 if (a
->cpp_target
!= b
->cpp_target
)
1912 return (a
->cpp_target
> b
->cpp_target
) - (a
->cpp_target
< b
->cpp_target
);
1914 if (a
->cpp_action
!= b
->cpp_action
)
1915 return (a
->cpp_action
> b
->cpp_action
) - (a
->cpp_action
< b
->cpp_action
);
1917 return (a
->cpp_token
> b
->cpp_token
) - (a
->cpp_token
< b
->cpp_token
);
1921 nfp_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
)
1926 nfp_cmd_mnemonic search_key
= { cpp_tgt
, cpp_act
, cpp_tok
, 0, 0, NULL
};
1927 const nfp_cmd_mnemonic
*cmd
= NULL
;
1929 cmd
= bsearch (&search_key
, mnemonics
, mnemonics_cnt
,
1930 sizeof (nfp_cmd_mnemonic
), _nfp_cmp_mnmnc
);
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))
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
)
1944 if ((cpp_len
& cmd
->len_mask
) == cmd
->len_fixed
)
1945 return cmd
->mnemonic
;
1951 /* NFP-32xx (ME Version 2.7). */
1954 nfp_me27_print_cmd (uint64_t instr
, int third_party_32bit
,
1955 int num_ctx
, struct disassemble_info
*dinfo
)
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);
1968 bfd_boolean err
= FALSE
;
1969 int cpp_target
= -1;
1970 int cpp_action
= -1;
1971 const char *mnemonic
= NULL
;
1974 int visswap
= ((mode
== 1) || (mode
== 3));
1976 imm
= (sig
<< 10) | (cpp_len
<< 7) | ((xfer
& 0x1f) << 2) | token
;
1977 valBA
= (srcB
<< 8) | srcA
;
1986 /* Convert tgtcmd to action/token tuple. */
1987 if (_BF (tgtcmd
, 6, 5) == 0x0)
1989 switch (_BF (tgtcmd
, 4, 2))
1992 cpp_target
= NFP_3200_CPPTGT_CAP
;
1993 dinfo
->fprintf_func (dinfo
->stream
, "cap[");
1996 cpp_target
= NFP_3200_CPPTGT_MSF0
;
1997 dinfo
->fprintf_func (dinfo
->stream
, "msf0[");
2000 cpp_target
= NFP_3200_CPPTGT_MSF1
;
2001 dinfo
->fprintf_func (dinfo
->stream
, "msf1[");
2004 cpp_target
= NFP_3200_CPPTGT_PCIE
;
2005 dinfo
->fprintf_func (dinfo
->stream
, "pcie[");
2008 cpp_target
= NFP_3200_CPPTGT_HASH
;
2011 cpp_target
= NFP_3200_CPPTGT_CRYPTO
;
2012 dinfo
->fprintf_func (dinfo
->stream
, "crypto[");
2015 cpp_target
= NFP_3200_CPPTGT_ARM
;
2016 dinfo
->fprintf_func (dinfo
->stream
, "arm[");
2019 cpp_target
= NFP_3200_CPPTGT_CT
;
2020 dinfo
->fprintf_func (dinfo
->stream
, "ct[");
2023 cpp_action
= _BF (tgtcmd
, 1, 0);
2027 switch (_BF (tgtcmd
, 6, 4))
2030 cpp_target
= NFP_3200_CPPTGT_GS
;
2031 dinfo
->fprintf_func (dinfo
->stream
, "scratch[");
2034 cpp_target
= NFP_3200_CPPTGT_QDR
; /* A.k.a. SRAM. */
2035 dinfo
->fprintf_func (dinfo
->stream
, "sram[");
2039 cpp_target
= NFP_3200_CPPTGT_MU
;
2040 dinfo
->fprintf_func (dinfo
->stream
, "mem[");
2044 cpp_target
= NFP_3200_CPPTGT_CLS
;
2045 dinfo
->fprintf_func (dinfo
->stream
, "cls[");
2048 cpp_action
= _BF (tgtcmd
, 3, 0);
2053 dinfo
->fprintf_func (dinfo
->stream
, _("<invalid cmd target %d:%d:%d>[]"),
2054 cpp_target
, cpp_action
, token
);
2055 return _NFP_ERR_CONT
;
2058 mnemonic
= nfp_me_find_mnemonic (cpp_target
, cpp_action
, token
, cpp_len
,
2060 ARRAY_SIZE (nfp_me27_mnemonics
));
2064 dinfo
->fprintf_func (dinfo
->stream
, _("<invalid cmd action %d:%d:%d>[]"),
2065 cpp_target
, cpp_action
, token
);
2066 return _NFP_ERR_CONT
;
2069 if (cpp_target
== NFP_3200_CPPTGT_HASH
)
2071 dinfo
->fprintf_func (dinfo
->stream
, "%s[$xfer_%d, %d",
2072 mnemonic
, xfer
, cpp_len
);
2073 goto print_opt_toks
;
2076 dinfo
->fprintf_func (dinfo
->stream
, "%s, ", mnemonic
);
2080 unsigned int tmp
= srcA
;
2087 case 0: /* (A << 8) + B. */
2088 case 1: /* (B << 8) + A. */
2089 dinfo
->fprintf_func (dinfo
->stream
, "$xfer_%d, ", xfer
);
2091 || !nfp_me_print_opnd8 (srcA
, 'A' + visswap
, num_ctx
, 0, 0, dinfo
);
2092 dinfo
->fprintf_func (dinfo
->stream
, ", <<8, ");
2094 || !nfp_me_print_opnd8 (srcB
, 'B' - visswap
, num_ctx
, 0, 0, dinfo
);
2095 dinfo
->fprintf_func (dinfo
->stream
, ", %d", (cpp_len
+ 1));
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
);
2101 || !nfp_me_print_opnd8 (srcA
, 'A' + visswap
, num_ctx
, 0, 0, dinfo
);
2102 if (third_party_32bit
)
2103 dinfo
->fprintf_func (dinfo
->stream
, ", ");
2105 dinfo
->fprintf_func (dinfo
->stream
, ", <<8, ");
2107 || !nfp_me_print_opnd8 (srcB
, 'B' - visswap
, num_ctx
, 0, 0, dinfo
);
2108 dinfo
->fprintf_func (dinfo
->stream
, ", %d", (cpp_len
+ 1));
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));
2117 case 5: /* Immediate address. */
2118 dinfo
->fprintf_func (dinfo
->stream
, "$xfer_%d, 0x%x, %d", xfer
, valBA
,
2121 case 6: /* Immediate address and data. */
2122 dinfo
->fprintf_func (dinfo
->stream
, "0x%x, 0x%x", valBA
, imm
);
2124 case 7: /* Immediate data. */
2125 dinfo
->fprintf_func (dinfo
->stream
, "0x%x, --, %d",
2126 ((xfer
<< 16) | valBA
), (cpp_len
+ 1));
2131 dinfo
->fprintf_func (dinfo
->stream
, "]");
2133 if (indref
&& (mode
!= 2) && (mode
!= 3))
2134 dinfo
->fprintf_func (dinfo
->stream
, ", indirect_ref");
2136 if (ctxswap_defer
!= 3)
2138 dinfo
->fprintf_func (dinfo
->stream
, ", ctx_swap[");
2140 dinfo
->fprintf_func (dinfo
->stream
, "sig%d]", sig
);
2142 dinfo
->fprintf_func (dinfo
->stream
, "--]");
2144 if (ctxswap_defer
!= 0)
2145 dinfo
->fprintf_func (dinfo
->stream
, ", defer[%d]", ctxswap_defer
);
2148 dinfo
->fprintf_func (dinfo
->stream
, ", sig_done[sig%d]", sig
);
2151 return _NFP_ERR_CONT
;
2156 nfp_me27_print_alu_shf (uint64_t instr
, int num_ctx
,
2157 struct disassemble_info
*dinfo
)
2159 return nfp_me27_28_print_alu_shf (instr
, 0, 0, 0, 0, num_ctx
, dinfo
);
2163 nfp_me27_print_alu (uint64_t instr
, int num_ctx
,
2164 struct disassemble_info
*dinfo
)
2166 return nfp_me27_28_print_alu_shf (instr
, 0, 0, 0, 0, num_ctx
, dinfo
);
2170 nfp_me27_print_immed (uint64_t instr
, int num_ctx
,
2171 struct disassemble_info
*dinfo
)
2173 return nfp_me27_28_print_immed (instr
, 0, 0, 0, num_ctx
, dinfo
);
2177 nfp_me27_print_ld_field (uint64_t instr
, int num_ctx
,
2178 struct disassemble_info
*dinfo
)
2180 return nfp_me27_28_print_ld_field (instr
, 0, 0, 0, 0, num_ctx
, dinfo
);
2184 nfp_me27_print_ctx_arb (uint64_t instr
, struct disassemble_info
*dinfo
)
2186 return nfp_me27_28_print_ctx_arb (instr
, dinfo
);
2190 nfp_me27_print_local_csr (uint64_t instr
, int num_ctx
,
2191 struct disassemble_info
*dinfo
)
2193 return nfp_me27_28_print_local_csr (instr
, 0, num_ctx
, dinfo
);
2197 nfp_me27_print_branch (uint64_t instr
, struct disassemble_info
*dinfo
)
2199 return nfp_me27_28_print_branch (instr
, nfp_me27_br_inpstates
, dinfo
);
2203 nfp_me27_print_br_byte (uint64_t instr
, int num_ctx
,
2204 struct disassemble_info
*dinfo
)
2206 return nfp_me27_28_print_br_byte (instr
, 0, num_ctx
, dinfo
);
2210 nfp_me27_print_br_bit (uint64_t instr
, int num_ctx
,
2211 struct disassemble_info
*dinfo
)
2213 return nfp_me27_28_print_br_bit (instr
, 0, num_ctx
, dinfo
);
2217 nfp_me27_print_br_alu (uint64_t instr
, int num_ctx
,
2218 struct disassemble_info
*dinfo
)
2220 return nfp_me27_28_print_br_alu (instr
, 0, num_ctx
, dinfo
);
2224 nfp_me27_print_mult (uint64_t instr
, int num_ctx
,
2225 struct disassemble_info
*dinfo
)
2227 return nfp_me27_28_print_mult (instr
, 0, 0, 0, 0, num_ctx
, dinfo
);
2230 /*NFP-6xxx/4xxx (ME Version 2.8). */
2233 nfp_me28_print_cmd (uint64_t instr
, int third_party_32bit
,
2234 int num_ctx
, struct disassemble_info
*dinfo
)
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);
2247 bfd_boolean err
= FALSE
;
2248 int cpp_target
= -1;
2249 int cpp_action
= -1;
2250 const char *mnemonic
= NULL
;
2253 int visswap
= ((mode
== 1) || (mode
== 3));
2255 imm
= (sig
<< 10) | (cpp_len
<< 7) | ((xfer
& 0x1f) << 2) | token
;
2256 valBA
= (srcB
<< 8) | srcA
;
2265 /* Convert tgtcmd to action/token tuple. */
2266 if (_BF (tgtcmd
, 6, 5) == 0x0)
2268 switch (_BF (tgtcmd
, 4, 2))
2271 cpp_target
= NFP_6000_CPPTGT_ILA
;
2272 dinfo
->fprintf_func (dinfo
->stream
, "ila[");
2275 cpp_target
= NFP_6000_CPPTGT_NBI
;
2276 dinfo
->fprintf_func (dinfo
->stream
, "nbi[");
2279 cpp_target
= NFP_6000_CPPTGT_PCIE
;
2280 dinfo
->fprintf_func (dinfo
->stream
, "pcie[");
2283 cpp_target
= NFP_6000_CPPTGT_CRYPTO
;
2284 dinfo
->fprintf_func (dinfo
->stream
, "crypto[");
2287 cpp_target
= NFP_6000_CPPTGT_ARM
;
2288 dinfo
->fprintf_func (dinfo
->stream
, "arm[");
2291 cpp_target
= NFP_6000_CPPTGT_CTXPB
;
2292 dinfo
->fprintf_func (dinfo
->stream
, "ct[");
2295 cpp_action
= _BF (tgtcmd
, 1, 0);
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))
2305 cpp_target
= NFP_6000_CPPTGT_VQDR
;
2306 cpp_action
= _BF (tgtcmd
, 3, 0);
2307 dinfo
->fprintf_func (dinfo
->stream
, "sram[");
2311 cpp_target
= NFP_6000_CPPTGT_MU
;
2312 dinfo
->fprintf_func (dinfo
->stream
, "mem[");
2316 cpp_target
= NFP_6000_CPPTGT_CLS
;
2317 dinfo
->fprintf_func (dinfo
->stream
, "cls[");
2324 dinfo
->fprintf_func (dinfo
->stream
, _("<invalid cmd target %d:%d:%d>[]"),
2325 cpp_target
, cpp_action
, token
);
2326 return _NFP_ERR_CONT
;
2329 mnemonic
= nfp_me_find_mnemonic (cpp_target
, cpp_action
, token
, cpp_len
,
2331 ARRAY_SIZE (nfp_me28_mnemonics
));
2335 dinfo
->fprintf_func (dinfo
->stream
, _("<invalid cmd action %d:%d:%d>[]"),
2336 cpp_target
, cpp_action
, token
);
2337 return _NFP_ERR_CONT
;
2340 dinfo
->fprintf_func (dinfo
->stream
, "%s, ", mnemonic
);
2344 unsigned int tmp
= srcA
;
2351 case 0: /* (A << 8) + B. */
2352 case 1: /* (B << 8) + A. */
2353 dinfo
->fprintf_func (dinfo
->stream
, "$xfer_%d, ", xfer
);
2355 || !nfp_me_print_opnd8 (srcA
, 'A' + visswap
, num_ctx
, 0, 0, dinfo
);
2356 dinfo
->fprintf_func (dinfo
->stream
, ", <<8, ");
2358 || !nfp_me_print_opnd8 (srcB
, 'B' - visswap
, num_ctx
, 0, 0, dinfo
);
2359 dinfo
->fprintf_func (dinfo
->stream
, ", %d", (cpp_len
+ 1));
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
);
2365 || !nfp_me_print_opnd8 (srcA
, 'A' + visswap
, num_ctx
, 0, 0, dinfo
);
2366 if (third_party_32bit
)
2367 dinfo
->fprintf_func (dinfo
->stream
, ", ");
2369 dinfo
->fprintf_func (dinfo
->stream
, ", <<8, ");
2371 || !nfp_me_print_opnd8 (srcB
, 'B' - visswap
, num_ctx
, 0, 0, dinfo
);
2372 dinfo
->fprintf_func (dinfo
->stream
, ", %d", (cpp_len
+ 1));
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));
2381 case 5: /* Immediate address. */
2382 dinfo
->fprintf_func (dinfo
->stream
, "$xfer_%d, 0x%x, %d", xfer
, valBA
,
2385 case 6: /* Immediate address and data. */
2386 dinfo
->fprintf_func (dinfo
->stream
, "0x%x, 0x%x", valBA
, imm
);
2388 case 7: /* Immediate data. */
2389 dinfo
->fprintf_func (dinfo
->stream
, "0x%x, --, %d",
2390 ((xfer
<< 16) | valBA
), (cpp_len
+ 1));
2394 dinfo
->fprintf_func (dinfo
->stream
, "]");
2396 if (indref
&& (mode
!= 2) && (mode
!= 3))
2397 dinfo
->fprintf_func (dinfo
->stream
, ", indirect_ref");
2399 if (ctxswap_defer
!= 3)
2401 dinfo
->fprintf_func (dinfo
->stream
, ", ctx_swap[");
2403 dinfo
->fprintf_func (dinfo
->stream
, "sig%d]", sig
);
2405 dinfo
->fprintf_func (dinfo
->stream
, "--]");
2407 if (ctxswap_defer
!= 0)
2408 dinfo
->fprintf_func (dinfo
->stream
, ", defer[%d]", ctxswap_defer
);
2411 dinfo
->fprintf_func (dinfo
->stream
, ", sig_done[sig%d]", sig
);
2414 return _NFP_ERR_CONT
;
2419 nfp_me28_print_alu_shf (uint64_t instr
, int num_ctx
,
2420 struct disassemble_info
*dinfo
)
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);
2427 return nfp_me27_28_print_alu_shf (instr
, pred_cc
, dst_lmext
,
2428 src_lmext
, gpr_wrboth
, num_ctx
, dinfo
);
2432 nfp_me28_print_alu (uint64_t instr
, int num_ctx
,
2433 struct disassemble_info
*dinfo
)
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);
2440 return nfp_me27_28_print_alu (instr
, pred_cc
, dst_lmext
, src_lmext
,
2441 gpr_wrboth
, num_ctx
, dinfo
);
2445 nfp_me28_print_immed (uint64_t instr
, int num_ctx
,
2446 struct disassemble_info
*dinfo
)
2448 unsigned int gpr_wrboth
= _BTST (instr
, 41);
2449 unsigned int dst_lmext
= _BTST (instr
, 43);
2450 unsigned int pred_cc
= _BTST (instr
, 44);
2452 return nfp_me27_28_print_immed (instr
, pred_cc
, dst_lmext
, gpr_wrboth
,
2457 nfp_me28_print_ld_field (uint64_t instr
, int num_ctx
,
2458 struct disassemble_info
*dinfo
)
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);
2465 return nfp_me27_28_print_ld_field (instr
, pred_cc
, dst_lmext
,
2466 src_lmext
, gpr_wrboth
, num_ctx
, dinfo
);
2470 nfp_me28_print_ctx_arb (uint64_t instr
, struct disassemble_info
*dinfo
)
2472 return nfp_me27_28_print_ctx_arb (instr
, dinfo
);
2476 nfp_me28_print_local_csr (uint64_t instr
, int num_ctx
,
2477 struct disassemble_info
*dinfo
)
2479 unsigned int src_lmext
= _BTST (instr
, 42);
2481 return nfp_me27_28_print_local_csr (instr
, src_lmext
, num_ctx
, dinfo
);
2485 nfp_me28_print_branch (uint64_t instr
, struct disassemble_info
*dinfo
)
2487 return nfp_me27_28_print_branch (instr
, nfp_me28_br_inpstates
, dinfo
);
2491 nfp_me28_print_br_byte (uint64_t instr
, int num_ctx
,
2492 struct disassemble_info
*dinfo
)
2494 unsigned int src_lmext
= _BTST (instr
, 42);
2495 return nfp_me27_28_print_br_byte (instr
, src_lmext
, num_ctx
, dinfo
);
2499 nfp_me28_print_br_bit (uint64_t instr
, int num_ctx
,
2500 struct disassemble_info
*dinfo
)
2502 unsigned int src_lmext
= _BTST (instr
, 42);
2503 return nfp_me27_28_print_br_bit (instr
, src_lmext
, num_ctx
, dinfo
);
2507 nfp_me28_print_br_alu (uint64_t instr
, int num_ctx
,
2508 struct disassemble_info
*dinfo
)
2510 unsigned int src_lmext
= _BTST (instr
, 42);
2511 return nfp_me27_28_print_br_alu (instr
, src_lmext
, num_ctx
, dinfo
);
2515 nfp_me28_print_mult (uint64_t instr
, int num_ctx
,
2516 struct disassemble_info
*dinfo
)
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);
2523 return nfp_me27_28_print_mult (instr
, pred_cc
, dst_lmext
, src_lmext
,
2524 gpr_wrboth
, num_ctx
, dinfo
);
2528 init_nfp3200_priv (nfp_priv_data
* priv
, struct disassemble_info
*dinfo
)
2530 Elf_Internal_Shdr
*sec
= NULL
;
2531 Elf_Nfp_MeConfig mecfg_ent
;
2532 unsigned char buffer
[sizeof (Elf_Nfp_MeConfig
)];
2534 unsigned int sec_cnt
= 0;
2535 unsigned int sec_idx
;
2536 size_t menum_linear
= 0;
2538 if (!dinfo
->section
)
2539 /* No section info, will use default values. */
2542 sec_cnt
= elf_numsections (dinfo
->section
->owner
);
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
++)
2548 sec
= elf_elfsections (dinfo
->section
->owner
)[sec_idx
];
2550 if (sec
->sh_type
== SHT_NFP_MECONFIG
)
2554 if (sec_idx
== sec_cnt
)
2556 dinfo
->fprintf_func (dinfo
->stream
, _("File has no ME-Config section."));
2560 for (roff
= 0; (bfd_size_type
) roff
< sec
->sh_size
;
2561 roff
+= sec
->sh_entsize
, menum_linear
++)
2563 nfp_priv_mecfg
*mecfg
;
2564 int isl
= menum_linear
>> 3;
2565 int menum
= menum_linear
& 7;
2567 if (menum_linear
>= 40)
2569 dinfo
->fprintf_func (dinfo
->stream
,
2570 _("File has invalid ME-Config section."));
2574 mecfg
= &priv
->mecfgs
[isl
][menum
][1];
2576 if (!_bfd_generic_get_section_contents (dinfo
->section
->owner
,
2577 sec
->bfd_section
, buffer
,
2578 roff
, sizeof (buffer
)))
2581 mecfg_ent
.ctx_enables
= bfd_getl32 (buffer
+ offsetof (Elf_Nfp_MeConfig
,
2583 mecfg_ent
.misc_control
= bfd_getl32 (buffer
2584 + offsetof (Elf_Nfp_MeConfig
, misc_control
));
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);
2595 init_nfp6000_mecsr_sec (nfp_priv_data
* priv
, Elf_Internal_Shdr
* sec
,
2596 int is_for_text
, struct disassemble_info
*dinfo
)
2598 Elf_Nfp_InitRegEntry ireg
;
2599 unsigned char buffer
[sizeof (Elf_Nfp_InitRegEntry
)];
2600 file_ptr ireg_off
= 0;
2603 if (sec
->sh_entsize
!= sizeof (ireg
))
2606 isl
= SHI_NFP_IREG_ISLAND (sec
->sh_info
);
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:
2612 <29:24> island (already got this from sh_info)
2614 <16:16> XferCsrRegSel (1 for these sections)
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
)
2623 nfp_priv_mecfg
*mecfg
;
2625 if (!_bfd_generic_get_section_contents (dinfo
->section
->owner
,
2626 sec
->bfd_section
, buffer
,
2627 ireg_off
, sizeof (buffer
)))
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
));
2636 if (NFP_IREG_ENTRY_WO_NLW (ireg
.w0
))
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
))
2644 menum
= _BF (ireg
.cpp_offset_lo
, 13, 10) - 4;
2645 csr_off
= _BF (ireg
.cpp_offset_lo
, 9, 0);
2647 mecfg
= &priv
->mecfgs
[isl
][menum
][is_for_text
];
2650 case _NFP_ME27_28_CSR_CTX_ENABLES
:
2651 mecfg
->ctx4_mode
= _BTST (ireg
.val
, 31);
2653 case _NFP_ME27_28_CSR_MISC_CONTROL
:
2654 mecfg
->addr_3rdparty32
= _BTST (ireg
.val
, 4);
2655 mecfg
->scs_cnt
= _BTST (ireg
.val
, 2);
2666 init_nfp6000_priv (nfp_priv_data
* priv
, struct disassemble_info
*dinfo
)
2668 int mecfg_orders
[64][2];
2670 unsigned int sec_cnt
= 0;
2671 unsigned int sec_idx
;
2674 memset (mecfg_orders
, -1, sizeof (mecfg_orders
));
2676 if (!dinfo
->section
)
2677 /* No section info, will use default values. */
2680 sec_cnt
= elf_numsections (dinfo
->section
->owner
);
2682 /* Go through all MECSR init sections to find ME configs. */
2683 for (sec_idx
= 0; sec_idx
< sec_cnt
; sec_idx
++)
2685 Elf_Internal_Shdr
*sec
;
2688 sec
= elf_elfsections (dinfo
->section
->owner
)[sec_idx
];
2689 sec_order
= (int) SHI_NFP_IREG_ORDER (sec
->sh_info
);
2691 is_for_text
= (sec
->sh_flags
& (SHF_NFP_INIT
| SHF_NFP_INIT2
)) == 0;
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;
2699 if (sec
->sh_type
!= SHT_NFP_INITREG
)
2701 if (!SHI_NFP_6000_IS_IREG_MECSR (sec
->sh_info
))
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. */
2709 mecfg_orders
[isl
][is_for_text
] = sec_order
;
2711 if (!init_nfp6000_mecsr_sec (priv
, sec
, is_for_text
, dinfo
))
2713 dinfo
->fprintf_func (dinfo
->stream
,
2714 _("Error processing section %u "), sec_idx
);
2723 parse_disassembler_options (nfp_opts
* opts
, struct disassemble_info
*dinfo
)
2727 if (dinfo
->disassembler_options
== NULL
)
2730 FOR_EACH_DISASSEMBLER_OPTION (option
, dinfo
->disassembler_options
)
2732 if (disassembler_options_cmp (option
, "no-pc") == 0)
2734 else if (disassembler_options_cmp (option
, "ctx4") == 0)
2736 if (!opts
->ctx_mode
)
2739 else if (disassembler_options_cmp (option
, "ctx8") == 0)
2743 dinfo
->fprintf_func (dinfo
->stream
, _("Invalid NFP option: %s"), option
);
2744 return _NFP_ERR_STOP
;
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. */
2754 static nfp_priv_data
*
2755 init_nfp_priv (struct disassemble_info
*dinfo
)
2757 nfp_priv_data
*priv
;
2760 if (dinfo
->private_data
)
2761 return (nfp_priv_data
*) dinfo
->private_data
;
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
)
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
));
2775 switch (dinfo
->mach
)
2777 case E_NFP_MACH_3200
:
2778 ret
= init_nfp3200_priv (priv
, dinfo
);
2780 case E_NFP_MACH_6000
:
2781 ret
= init_nfp6000_priv (priv
, dinfo
);
2791 dinfo
->private_data
= priv
;
2796 _print_instrs (bfd_vma addr
, struct disassemble_info
*dinfo
, nfp_opts
* opts
)
2798 nfp_priv_data
*priv
= init_nfp_priv (dinfo
);
2802 size_t island
, menum
;
2803 int num_ctx
, scs_cnt
, addr_3rdparty32
, pc
, tmpi
, tmpj
;
2806 err
= dinfo
->read_memory_func (addr
, buffer
, 8, dinfo
);
2808 return _NFP_ERR_STOP
;
2810 if (!dinfo
->section
)
2814 addr_3rdparty32
= 0;
2818 unsigned int sh_info
= 0;
2819 nfp_priv_mecfg
*mecfg
;
2821 /* We have a section, presumably all ELF sections. Try to find
2822 proper ME configs to produce better disassembly. */
2824 return _NFP_ERR_STOP
; /* Sanity check */
2826 is_text
= (elf_section_flags (dinfo
->section
)
2827 & (SHF_NFP_INIT
| SHF_NFP_INIT2
)) == 0;
2829 sh_info
= elf_section_info (dinfo
->section
);
2831 switch (dinfo
->mach
)
2833 case E_NFP_MACH_3200
:
2834 island
= SHI_NFP_3200_ISLAND (sh_info
);
2835 menum
= SHI_NFP_3200_MENUM (sh_info
);
2838 island
= SHI_NFP_ISLAND (sh_info
);
2839 menum
= SHI_NFP_MENUM (sh_info
);
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
;
2850 num_ctx
= opts
->ctx_mode
;
2852 dinfo
->bytes_per_line
= 8;
2853 dinfo
->bytes_per_chunk
= 8;
2855 instr
= bfd_getl64 (buffer
);
2859 pc
= (int) (addr
>> 3);
2861 /* Guess max PC for formatting */
2862 tmpj
= (int) (dinfo
->buffer_length
>> 3);
2874 for (tmpi
= 1; tmpj
> 9; tmpj
/= 10)
2878 for (; tmpj
> 9; tmpj
/= 10)
2881 dinfo
->fprintf_func (dinfo
->stream
, "%*c%d ", tmpi
, '.', pc
);
2884 switch (dinfo
->mach
)
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
);
2912 err
= nfp_me_print_invalid (instr
, dinfo
);
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
);
2941 err
= nfp_me_print_invalid (instr
, dinfo
);
2951 print_insn_nfp (bfd_vma addr
, struct disassemble_info
*dinfo
)
2958 err
= parse_disassembler_options (&opts
, dinfo
);
2962 err
= _print_instrs (addr
, dinfo
, &opts
);
2966 dinfo
->fprintf_func (dinfo
->stream
, "\t # ERROR");
2967 if (err
== _NFP_ERR_CONT
)
2973 print_nfp_disassembler_options (FILE * stream
)
2975 fprintf (stream
, _("\n\
2976 The following NFP specific disassembler options are supported for use\n\
2977 with the -M switch (multiple options should be separated by commas):\n"));
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.\""));
2984 fprintf (stream
, _("\n"));