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