blob: b74ccb3fce59f60a374ee692bca50df85c22371f [file] [log] [blame]
/* Print NFP instructions for objdump.
Copyright (C) 2017-2021 Free Software Foundation, Inc.
Contributed by Francois H. Theron <francois.theron@netronome.com>
This file is part of the GNU opcodes library.
This library is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
It is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
/* There will be many magic numbers here that are based on hardware.
Making #define macros for each encoded bit field will probably reduce
readability far more than the simple numbers will, so we make sure that
the context of the magic numbers make it clear what they are used for. */
#include "sysdep.h"
#include <stdio.h>
#include "disassemble.h"
#include "libiberty.h"
#include "elf/nfp.h"
#include "opcode/nfp.h"
#include "opintl.h"
#include "elf-bfd.h"
#include "bfd.h"
#include <stdint.h>
#define _NFP_ERR_STOP -1
#define _NFP_ERR_CONT -8
#define _BTST(v, b) (((v) >> b) & 1)
#define _BF(v, msb, lsb) (((v) >> (lsb)) & \
((1U << ((msb) - (lsb) + 1)) - 1))
#define _BFS(v, msb, lsb, lshift) (_BF(v, msb, lsb) << (lshift))
#define _NFP_ME27_28_CSR_CTX_ENABLES 0x18
#define _NFP_ME27_28_CSR_MISC_CONTROL 0x160
typedef struct
{
unsigned char ctx4_mode:1;
unsigned char addr_3rdparty32:1;
unsigned char scs_cnt:2;
unsigned char _future:4;
}
nfp_priv_mecfg;
typedef struct
{
unsigned char show_pc;
unsigned char ctx_mode;
}
nfp_opts;
/* mecfgs[island][menum][is-text] */
typedef struct
{
nfp_priv_mecfg mecfgs[64][12][2];
}
nfp_priv_data;
static const char *nfp_mealu_shf_op[8] =
{
/* 0b000 (0) */ "B",
/* 0b001 (1) */ "~B",
/* 0b010 (2) */ "AND",
/* 0b011 (3) */ "~AND",
/* 0b100 (4) */ "AND~",
/* 0b101 (5) */ "OR",
/* 0b110 (6) */ "asr",
/* 0b111 (7) */ "byte_align"
};
static const char *nfp_me27_28_alu_op[32] =
{
/* 0b00000 (0) */ "B",
/* 0b00001 (1) */ "+",
NULL,
/* 0b00011 (3) */ "pop_count3",
/* 0b00100 (4) */ "~B",
/* 0b00101 (5) */ "+16",
/* 0b00110 (6) */ "pop_count1",
/* 0b00111 (7) */ "pop_count2",
/* 0b01000 (8) */ "AND",
/* 0b01001 (9) */ "+8",
NULL,
/* 0b01011 (11) */ "cam_clear",
/* 0b01100 (12) */ "~AND",
/* 0b01101 (13) */ "-carry",
/* 0b01110 (14) */ "ffs",
/* 0b01111 (15) */ "cam_read_tag",
/* 0b10000 (16) */ "AND~",
/* 0b10001 (17) */ "+carry",
/* 0b10010 (18) */ "CRC",
/* 0b10011 (19) */ "cam_write",
/* 0b10100 (20) */ "OR",
/* 0b10101 (21) */ "-",
NULL,
/* 0b10111 (23) */ "cam_lookup",
/* 0b11000 (24) */ "XOR",
/* 0b11001 (25) */ "B-A",
NULL,
/* 0b11011 (27) */ "cam_write_state",
NULL,
NULL,
NULL,
/* 0b11111 (31) */ "cam_read_state"
};
static const char *nfp_me27_28_crc_op[8] =
{
/* 0b000 (0) */ "--",
NULL,
/* 0b010 (2) */ "crc_ccitt",
NULL,
/* 0b100 (4) */ "crc_32",
/* 0b101 (5) */ "crc_iscsi",
/* 0b110 (6) */ "crc_10",
/* 0b111 (7) */ "crc_5"
};
static const char *nfp_me27_28_crc_bytes[8] =
{
/* 0b000 (0) */ "bytes_0_3",
/* 0b001 (1) */ "bytes_1_3",
/* 0b010 (2) */ "bytes_2_3",
/* 0b011 (3) */ "byte_3",
/* 0b100 (4) */ "bytes_0_2",
/* 0b101 (5) */ "bytes_0_1",
/* 0b110 (6) */ "byte_0"
};
static const char *nfp_me27_28_mecsrs[] =
{
/* 0x000 (0) */ "UstorAddr",
/* 0x004 (1) */ "UstorDataLwr",
/* 0x008 (2) */ "UstorDataUpr",
/* 0x00c (3) */ "UstorErrStat",
/* 0x010 (4) */ "ALUOut",
/* 0x014 (5) */ "CtxArbCtrl",
/* 0x018 (6) */ "CtxEnables",
/* 0x01c (7) */ "CondCodeEn",
/* 0x020 (8) */ "CSRCtxPtr",
/* 0x024 (9) */ "PcBreakpoint0",
/* 0x028 (10) */ "PcBreakpoint1",
/* 0x02c (11) */ "PcBreakpointStatus",
/* 0x030 (12) */ "RegErrStatus",
/* 0x034 (13) */ "LMErrStatus",
/* 0x038 (14) */ "LMeccErrorMask",
NULL,
/* 0x040 (16) */ "IndCtxStatus",
/* 0x044 (17) */ "ActCtxStatus",
/* 0x048 (18) */ "IndCtxSglEvt",
/* 0x04c (19) */ "ActCtxSglEvt",
/* 0x050 (20) */ "IndCtxWkpEvt",
/* 0x054 (21) */ "ActCtxWkpEvt",
/* 0x058 (22) */ "IndCtxFtrCnt",
/* 0x05c (23) */ "ActCtxFtrCnt",
/* 0x060 (24) */ "IndLMAddr0",
/* 0x064 (25) */ "ActLMAddr0",
/* 0x068 (26) */ "IndLMAddr1",
/* 0x06c (27) */ "ActLMAddr1",
/* 0x070 (28) */ "ByteIndex",
/* 0x074 (29) */ "XferIndex",
/* 0x078 (30) */ "IndFtrCntSgl",
/* 0x07c (31) */ "ActFtrCntSgl",
/* 0x080 (32) */ "NNPut",
/* 0x084 (33) */ "NNGet",
NULL,
NULL,
/* 0x090 (36) */ "IndLMAddr2",
/* 0x094 (37) */ "ActLMAddr2",
/* 0x098 (38) */ "IndLMAddr3",
/* 0x09c (39) */ "ActLMAddr3",
/* 0x0a0 (40) */ "IndLMAddr2BytIdx",
/* 0x0a4 (41) */ "ActLMAddr2BytIdx",
/* 0x0a8 (42) */ "IndLMAddr3BytIdx",
/* 0x0ac (43) */ "ActLMAddr3BytIdx",
/* 0x0b0 (44) */ "IndPredCC",
NULL,
NULL,
NULL,
/* 0x0c0 (48) */ "TimestampLow",
/* 0x0c4 (49) */ "TimestampHgh",
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
/* 0x0e0 (56) */ "IndLMAddr0BytIdx",
/* 0x0e4 (57) */ "ActLMAddr0BytIdx",
/* 0x0e8 (58) */ "IndLMAddr1BytIdx",
/* 0x0ec (59) */ "ActLMAddr1BytIdx",
NULL,
/* 0x0f4 (61) */ "XfrAndBytIdx",
NULL,
NULL,
/* 0x100 (64) */ "NxtNghbrSgl",
/* 0x104 (65) */ "PrvNghbrSgl",
/* 0x108 (66) */ "SameMESignal",
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
/* 0x140 (80) */ "CRCRemainder",
/* 0x144 (81) */ "ProfileCnt",
/* 0x148 (82) */ "PseudoRndNum",
NULL,
NULL,
NULL,
NULL,
NULL,
/* 0x160 (88) */ "MiscControl",
/* 0x164 (89) */ "PcBreakpoint0Mask",
/* 0x168 (90) */ "PcBreakpoint1Mask",
NULL,
/* 0x170 (92) */ "Mailbox0",
/* 0x174 (93) */ "Mailbox1",
/* 0x178 (94) */ "Mailbox2",
/* 0x17c (95) */ "Mailbox3",
NULL,
NULL,
NULL,
NULL,
/* 0x190 (100) */ "CmdIndirectRef0"
};
const char *nfp_me27_28_br_ops[32] =
{
/* 0b00000 (0) */ "beq",
/* 0b00001 (1) */ "bne",
/* 0b00010 (2) */ "bmi",
/* 0b00011 (3) */ "bpl",
/* 0b00100 (4) */ "bcs",
/* 0b00101 (5) */ "bcc",
/* 0b00110 (6) */ "bvs",
/* 0b00111 (7) */ "bvc",
/* 0b01000 (8) */ "bge",
/* 0b01001 (9) */ "blt",
/* 0b01010 (10) */ "ble",
/* 0b01011 (11) */ "bgt",
/* (12) */ NULL,
/* (13) */ NULL,
/* (14) */ NULL,
/* (15) */ NULL,
/* 0b10000 (16) */ "br=ctx",
/* 0b10001 (17) */ "br!=ctx",
/* 0b10010 (18) */ "br_signal",
/* 0b10011 (19) */ "br_!signal",
/* 0b10100 (20) */ "br_inp_state",
/* 0b10101 (21) */ "br_!inp_state",
/* 0b10110 (22) */ "br_cls_state",
/* 0b10111 (23) */ "br_!cls_state",
/* 0b11000 (24) */ "br",
/* (25) */ NULL,
/* (26) */ NULL,
/* (27) */ NULL,
/* (28) */ NULL,
/* (29) */ NULL,
/* (30) */ NULL,
/* (31) */ NULL
};
static const char *nfp_me27_br_inpstates[16] =
{
/* 0 */ "nn_empty",
/* 1 */ "nn_full",
/* 2 */ "scr_ring0_status",
/* 3 */ "scr_ring1_status",
/* 4 */ "scr_ring2_status",
/* 5 */ "scr_ring3_status",
/* 6 */ "scr_ring4_status",
/* 7 */ "scr_ring5_status",
/* 8 */ "scr_ring6_status",
/* 9 */ "scr_ring7_status",
/* 10 */ "scr_ring8_status",
/* 11 */ "scr_ring9_status",
/* 12 */ "scr_ring10_status",
/* 13 */ "scr_ring11_status",
/* 14 */ "fci_not_empty",
/* 15 */ "fci_full"
};
static const char *nfp_me28_br_inpstates[16] =
{
/* 0 */ "nn_empty",
/* 1 */ "nn_full",
/* 2 */ "ctm_ring0_status",
/* 3 */ "ctm_ring1_status",
/* 4 */ "ctm_ring2_status",
/* 5 */ "ctm_ring3_status",
/* 6 */ "ctm_ring4_status",
/* 7 */ "ctm_ring5_status",
/* 8 */ "ctm_ring6_status",
/* 9 */ "ctm_ring7_status",
/* 10 */ "ctm_ring8_status",
/* 11 */ "ctm_ring9_status",
/* 12 */ "ctm_ring10_status",
/* 13 */ "ctm_ring11_status",
/* 14 */ "ctm_ring12_status",
/* 15 */ "ctm_ring13_status"
};
static const char *nfp_me27_28_mult_steps[8] =
{
/* 0 */ "step1",
/* 1 */ "step2",
/* 2 */ "step3",
/* 3 */ "step4",
/* 4 */ "last",
/* 5 */ "last2",
NULL,
NULL
};
static const char *nfp_me27_28_mult_types[4] =
{
"start",
"24x8",
"16x16",
"32x32"
};
/* The cmd_mnemonics arrays are sorted here in its definition so that we can
use bsearch () on the first three fields. There can be multiple matches
and we assume that bsearch can return any of them, so we manually step
back to the first one. */
static const nfp_cmd_mnemonic nfp_me27_mnemonics[] =
{
{NFP_3200_CPPTGT_MSF0, 0, 0, 0, 0, "read"},
{NFP_3200_CPPTGT_MSF0, 0, 2, 0, 0, "read64"},
{NFP_3200_CPPTGT_MSF0, 1, 0, 0, 0, "write"},
{NFP_3200_CPPTGT_MSF0, 1, 1, 0, 0, "fast_wr"},
{NFP_3200_CPPTGT_MSF0, 1, 2, 0, 0, "write64"},
{NFP_3200_CPPTGT_QDR, 0, 0, 0, 0, "read"},
{NFP_3200_CPPTGT_QDR, 1, 0, 0, 0, "write"},
{NFP_3200_CPPTGT_QDR, 2, 0, 0, 0, "write_atomic"},
{NFP_3200_CPPTGT_QDR, 2, 1, 0, 0, "swap"},
{NFP_3200_CPPTGT_QDR, 3, 0, 0, 0, "set"},
{NFP_3200_CPPTGT_QDR, 3, 1, 0, 0, "test_and_set"},
{NFP_3200_CPPTGT_QDR, 4, 0, 0, 0, "clr"},
{NFP_3200_CPPTGT_QDR, 4, 1, 0, 0, "test_and_clr"},
{NFP_3200_CPPTGT_QDR, 5, 0, 0, 0, "add"},
{NFP_3200_CPPTGT_QDR, 5, 1, 0, 0, "test_and_add"},
{NFP_3200_CPPTGT_QDR, 6, 0, 0, 0, "read_queue"},
{NFP_3200_CPPTGT_QDR, 6, 1, 0, 0, "read_queue_ring"},
{NFP_3200_CPPTGT_QDR, 6, 2, 0, 0, "write_queue"},
{NFP_3200_CPPTGT_QDR, 6, 3, 0, 0, "write_queue_ring"},
{NFP_3200_CPPTGT_QDR, 7, 0, 0, 0, "incr"},
{NFP_3200_CPPTGT_QDR, 7, 1, 0, 0, "test_and_incr"},
{NFP_3200_CPPTGT_QDR, 8, 0, 0, 0, "decr"},
{NFP_3200_CPPTGT_QDR, 8, 1, 0, 0, "test_and_decr"},
{NFP_3200_CPPTGT_QDR, 9, 0, 0, 0, "put"},
{NFP_3200_CPPTGT_QDR, 9, 1, 0, 0, "get"},
{NFP_3200_CPPTGT_QDR, 9, 2, 0, 0, "put_imm"},
{NFP_3200_CPPTGT_QDR, 9, 3, 0, 0, "pop"},
{NFP_3200_CPPTGT_QDR, 10, 0, 0, 0, "journal"},
{NFP_3200_CPPTGT_QDR, 10, 1, 0, 0, "fast_journal"},
{NFP_3200_CPPTGT_QDR, 11, 0, 0, 0, "dequeue"},
{NFP_3200_CPPTGT_QDR, 12, 0, 0, 0, "enqueue"},
{NFP_3200_CPPTGT_QDR, 12, 1, 0, 0, "enueue_tail"},
{NFP_3200_CPPTGT_QDR, 12, 2, 0, 0, "nfp_enqueue"},
{NFP_3200_CPPTGT_QDR, 12, 3, 0, 0, "nfp_enueue_tail"},
{NFP_3200_CPPTGT_QDR, 13, 0, 0, 0, "csr_wr"},
{NFP_3200_CPPTGT_QDR, 13, 1, 0, 0, "csr_rd"},
{NFP_3200_CPPTGT_QDR, 14, 0, 0, 0, "wr_qdesc"},
{NFP_3200_CPPTGT_QDR, 14, 1, 0, 0, "nfp_wr_qdesc"},
{NFP_3200_CPPTGT_QDR, 14, 2, 0, 0, "wr_qdesc_count"},
{NFP_3200_CPPTGT_QDR, 14, 3, 0, 0, "push_qdesc"},
{NFP_3200_CPPTGT_QDR, 15, 0, 0, 0, "rd_qdesc_other"},
{NFP_3200_CPPTGT_QDR, 15, 1, 0, 0, "rd_qdesc_tail"},
{NFP_3200_CPPTGT_QDR, 15, 2, 0, 0, "rd_qdesc_head"},
{NFP_3200_CPPTGT_QDR, 15, 3, 0, 0, "nfp_rd_qdesc"},
{NFP_3200_CPPTGT_MSF1, 0, 0, 0, 0, "read"},
{NFP_3200_CPPTGT_MSF1, 0, 2, 0, 0, "read64"},
{NFP_3200_CPPTGT_MSF1, 1, 0, 0, 0, "write"},
{NFP_3200_CPPTGT_MSF1, 1, 1, 0, 0, "fast_wr"},
{NFP_3200_CPPTGT_MSF1, 1, 2, 0, 0, "write64"},
{NFP_3200_CPPTGT_HASH, 0, 0, 0, 0, "hash_48"},
{NFP_3200_CPPTGT_HASH, 0, 1, 0, 0, "hash_64"},
{NFP_3200_CPPTGT_HASH, 0, 2, 0, 0, "hash_128"},
{NFP_3200_CPPTGT_MU, 0, 0, 0, 0, "read"},
{NFP_3200_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
{NFP_3200_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
{NFP_3200_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
{NFP_3200_CPPTGT_MU, 1, 0, 0, 0, "write"},
{NFP_3200_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
{NFP_3200_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
{NFP_3200_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
{NFP_3200_CPPTGT_MU, 2, 0, 0, 0, "write8"},
{NFP_3200_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
{NFP_3200_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
{NFP_3200_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
{NFP_3200_CPPTGT_MU, 3, 0, 0, 0, "read_atomic"},
{NFP_3200_CPPTGT_MU, 3, 1, 0, 0, "read8"},
{NFP_3200_CPPTGT_MU, 3, 2, 0, 0, "compare_write"},
{NFP_3200_CPPTGT_MU, 3, 3, 0, 0, "test_and_compare_write"},
{NFP_3200_CPPTGT_MU, 4, 0, 0, 0, "write_atomic"},
{NFP_3200_CPPTGT_MU, 4, 1, 0, 0, "swap"},
{NFP_3200_CPPTGT_MU, 4, 2, 0, 0, "write_atomic_imm"},
{NFP_3200_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
{NFP_3200_CPPTGT_MU, 5, 0, 0, 0, "set"},
{NFP_3200_CPPTGT_MU, 5, 1, 0, 0, "test_and_set"},
{NFP_3200_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
{NFP_3200_CPPTGT_MU, 5, 3, 0, 0, "test_and_set_imm"},
{NFP_3200_CPPTGT_MU, 6, 0, 0, 0, "clr"},
{NFP_3200_CPPTGT_MU, 6, 1, 0, 0, "test_and_clr"},
{NFP_3200_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
{NFP_3200_CPPTGT_MU, 6, 3, 0, 0, "test_and_clr_imm"},
{NFP_3200_CPPTGT_MU, 7, 0, 0, 4, "add"},
{NFP_3200_CPPTGT_MU, 7, 0, 4, 4, "add64"},
{NFP_3200_CPPTGT_MU, 7, 1, 0, 4, "test_and_add"},
{NFP_3200_CPPTGT_MU, 7, 1, 4, 4, "test_and_add64"},
{NFP_3200_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
{NFP_3200_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
{NFP_3200_CPPTGT_MU, 7, 3, 0, 4, "test_and_add_imm"},
{NFP_3200_CPPTGT_MU, 7, 3, 4, 4, "test_and_add64_imm"},
{NFP_3200_CPPTGT_MU, 8, 0, 0, 4, "add_sat"},
{NFP_3200_CPPTGT_MU, 8, 0, 4, 4, "add64_sat"},
{NFP_3200_CPPTGT_MU, 8, 1, 0, 4, "test_and_add_sat"},
{NFP_3200_CPPTGT_MU, 8, 1, 4, 4, "test_and_add64_sat"},
{NFP_3200_CPPTGT_MU, 8, 2, 0, 4, "add_imm_sat"},
{NFP_3200_CPPTGT_MU, 8, 2, 4, 4, "add_imm_sat"},
{NFP_3200_CPPTGT_MU, 8, 3, 0, 0, "test_and_add_sat_imm"},
{NFP_3200_CPPTGT_MU, 9, 0, 0, 4, "sub"},
{NFP_3200_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
{NFP_3200_CPPTGT_MU, 9, 1, 0, 4, "test_and_sub"},
{NFP_3200_CPPTGT_MU, 9, 1, 4, 4, "test_and_sub64"},
{NFP_3200_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
{NFP_3200_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
{NFP_3200_CPPTGT_MU, 9, 3, 0, 0, "tes_and_sub_imm"},
{NFP_3200_CPPTGT_MU, 10, 0, 0, 4, "sub_sat"},
{NFP_3200_CPPTGT_MU, 10, 0, 4, 4, "sub64_sat"},
{NFP_3200_CPPTGT_MU, 10, 1, 0, 4, "test_and_sub_sat"},
{NFP_3200_CPPTGT_MU, 10, 1, 4, 4, "test_and_sub64_sat"},
{NFP_3200_CPPTGT_MU, 10, 2, 0, 4, "sub_imm_sat"},
{NFP_3200_CPPTGT_MU, 10, 2, 4, 4, "sub64_imm_sat"},
{NFP_3200_CPPTGT_MU, 10, 3, 0, 0, "test_and_sub_sat_imm"},
{NFP_3200_CPPTGT_MU, 11, 0, 0, 0, "release_ticket"},
{NFP_3200_CPPTGT_MU, 11, 1, 0, 0, "release_ticket_ind"},
{NFP_3200_CPPTGT_MU, 12, 0, 0, 0, "cam_lookup"},
{NFP_3200_CPPTGT_MU, 12, 1, 0, 0, "cam_lookup_add"},
{NFP_3200_CPPTGT_MU, 12, 2, 0, 0, "tcam_lookup"},
{NFP_3200_CPPTGT_MU, 12, 3, 0, 3, "lock"},
{NFP_3200_CPPTGT_MU, 12, 3, 2, 3, "cam_lookup_add_inc"},
{NFP_3200_CPPTGT_MU, 13, 0, 0, 4, "microq128_get"},
{NFP_3200_CPPTGT_MU, 13, 0, 4, 4, "microq256_get"},
{NFP_3200_CPPTGT_MU, 13, 1, 0, 4, "microq128_pop"},
{NFP_3200_CPPTGT_MU, 13, 1, 4, 4, "microq256_pop"},
{NFP_3200_CPPTGT_MU, 13, 2, 0, 4, "microq128_put"},
{NFP_3200_CPPTGT_MU, 13, 2, 4, 4, "microq256_put"},
{NFP_3200_CPPTGT_MU, 14, 0, 0, 4, "queue128_lock"},
{NFP_3200_CPPTGT_MU, 14, 0, 4, 4, "queue256_lock"},
{NFP_3200_CPPTGT_MU, 14, 1, 0, 4, "queue128_unlock"},
{NFP_3200_CPPTGT_MU, 14, 1, 4, 4, "queue256_unlock"},
{NFP_3200_CPPTGT_MU, 15, 0, 0, 0, "xor"},
{NFP_3200_CPPTGT_MU, 15, 1, 0, 0, "test_and_xor"},
{NFP_3200_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
{NFP_3200_CPPTGT_MU, 15, 3, 0, 0, "test_and_xor_imm"},
{NFP_3200_CPPTGT_MU, 16, 0, 0, 0, "rd_qdesc"},
{NFP_3200_CPPTGT_MU, 16, 1, 0, 0, "wr_qdesc"},
{NFP_3200_CPPTGT_MU, 16, 2, 0, 0, "push_qdesc"},
{NFP_3200_CPPTGT_MU, 16, 3, 0, 0, "tag_writeback"},
{NFP_3200_CPPTGT_MU, 17, 0, 0, 0, "enqueue"},
{NFP_3200_CPPTGT_MU, 17, 1, 0, 0, "enqueue_tail"},
{NFP_3200_CPPTGT_MU, 17, 2, 0, 0, "dequeue"},
{NFP_3200_CPPTGT_MU, 18, 0, 0, 0, "read_queue"},
{NFP_3200_CPPTGT_MU, 18, 1, 0, 0, "read_queue_ring"},
{NFP_3200_CPPTGT_MU, 18, 2, 0, 0, "write_queue"},
{NFP_3200_CPPTGT_MU, 18, 3, 0, 0, "write_queue_ring"},
{NFP_3200_CPPTGT_MU, 19, 0, 0, 0, "add_tail"},
{NFP_3200_CPPTGT_MU, 19, 1, 0, 0, "qadd_thread"},
{NFP_3200_CPPTGT_MU, 19, 2, 0, 0, "qadd_work"},
{NFP_3200_CPPTGT_MU, 19, 3, 0, 0, "qadd_work_imm"},
{NFP_3200_CPPTGT_MU, 20, 0, 0, 0, "put"},
{NFP_3200_CPPTGT_MU, 20, 1, 0, 0, "put_tag"},
{NFP_3200_CPPTGT_MU, 20, 2, 0, 0, "journal"},
{NFP_3200_CPPTGT_MU, 20, 3, 0, 0, "journal_tag"},
{NFP_3200_CPPTGT_MU, 21, 0, 0, 0, "get"},
{NFP_3200_CPPTGT_MU, 21, 1, 0, 0, "get_eop"},
{NFP_3200_CPPTGT_MU, 21, 2, 0, 0, "get_safe"},
{NFP_3200_CPPTGT_MU, 21, 3, 0, 0, "get_tag_safe"},
{NFP_3200_CPPTGT_MU, 22, 0, 0, 0, "pop"},
{NFP_3200_CPPTGT_MU, 22, 1, 0, 0, "pop_eop"},
{NFP_3200_CPPTGT_MU, 22, 2, 0, 0, "pop_safe"},
{NFP_3200_CPPTGT_MU, 22, 3, 0, 0, "pop_tag_safe"},
{NFP_3200_CPPTGT_MU, 23, 0, 0, 0, "fast_journal"},
{NFP_3200_CPPTGT_MU, 23, 1, 0, 0, "fast_journal_sig"},
{NFP_3200_CPPTGT_GS, 0, 0, 0, 0, "read"},
{NFP_3200_CPPTGT_GS, 1, 0, 0, 0, "write"},
{NFP_3200_CPPTGT_GS, 2, 0, 0, 0, "write_atomic"},
{NFP_3200_CPPTGT_GS, 2, 1, 0, 0, "swap"},
{NFP_3200_CPPTGT_GS, 3, 0, 0, 0, "set"},
{NFP_3200_CPPTGT_GS, 3, 1, 0, 0, "test_and_set"},
{NFP_3200_CPPTGT_GS, 4, 0, 0, 0, "clr"},
{NFP_3200_CPPTGT_GS, 4, 1, 0, 0, "test_and_clr"},
{NFP_3200_CPPTGT_GS, 5, 0, 0, 0, "add"},
{NFP_3200_CPPTGT_GS, 5, 1, 0, 0, "test_and_add"},
{NFP_3200_CPPTGT_GS, 6, 0, 0, 0, "sub"},
{NFP_3200_CPPTGT_GS, 6, 1, 0, 0, "test_and_sub"},
{NFP_3200_CPPTGT_GS, 7, 0, 0, 0, "inc"},
{NFP_3200_CPPTGT_GS, 7, 1, 0, 0, "test_and_inc"},
{NFP_3200_CPPTGT_GS, 8, 0, 0, 0, "dec"},
{NFP_3200_CPPTGT_GS, 8, 1, 0, 0, "test_and_dec"},
{NFP_3200_CPPTGT_GS, 9, 0, 0, 0, "get"},
{NFP_3200_CPPTGT_GS, 10, 0, 0, 0, "put"},
{NFP_3200_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
{NFP_3200_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
{NFP_3200_CPPTGT_PCIE, 2, 0, 0, 0, "read_internal"},
{NFP_3200_CPPTGT_PCIE, 3, 0, 0, 0, "write_internal"},
{NFP_3200_CPPTGT_ARM, 0, 0, 0, 0, "read"},
{NFP_3200_CPPTGT_ARM, 1, 0, 0, 0, "write"},
{NFP_3200_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
{NFP_3200_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
{NFP_3200_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
{NFP_3200_CPPTGT_CAP, 0, 0, 0, 0, "read_enum"},
{NFP_3200_CPPTGT_CAP, 0, 1, 0, 0, "read"},
{NFP_3200_CPPTGT_CAP, 0, 2, 0, 0, "read_reflect"},
{NFP_3200_CPPTGT_CAP, 1, 0, 0, 0, "write_enum"},
{NFP_3200_CPPTGT_CAP, 1, 1, 0, 0, "write"},
{NFP_3200_CPPTGT_CAP, 1, 2, 0, 0, "write_reflect"},
{NFP_3200_CPPTGT_CAP, 2, 0, 0, 0, "fast_wr_alu"},
{NFP_3200_CPPTGT_CAP, 3, 0, 0, 0, "fast_wr"},
{NFP_3200_CPPTGT_CT, 1, 0, 0, 0, "write"},
{NFP_3200_CPPTGT_CLS, 0, 0, 0, 0, "read_be"},
{NFP_3200_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
{NFP_3200_CPPTGT_CLS, 0, 2, 0, 0, "test_and_compare_write"},
{NFP_3200_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
{NFP_3200_CPPTGT_CLS, 1, 0, 0, 0, "write_be"},
{NFP_3200_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
{NFP_3200_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
{NFP_3200_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
{NFP_3200_CPPTGT_CLS, 2, 0, 0, 0, "set"},
{NFP_3200_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
{NFP_3200_CPPTGT_CLS, 2, 2, 0, 0, "test_and_set"},
{NFP_3200_CPPTGT_CLS, 2, 3, 0, 0, "test_and_clr"},
{NFP_3200_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
{NFP_3200_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
{NFP_3200_CPPTGT_CLS, 3, 2, 0, 0, "test_and_set_imm"},
{NFP_3200_CPPTGT_CLS, 3, 3, 0, 0, "test_and_clr_imm"},
{NFP_3200_CPPTGT_CLS, 4, 0, 0, 0, "add"},
{NFP_3200_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
{NFP_3200_CPPTGT_CLS, 4, 2, 0, 0, "add_sat"},
{NFP_3200_CPPTGT_CLS, 4, 3, 0, 0, "test_and_add_sat"},
{NFP_3200_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
{NFP_3200_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
{NFP_3200_CPPTGT_CLS, 5, 2, 0, 0, "add_imm_sat"},
{NFP_3200_CPPTGT_CLS, 5, 3, 0, 0, "test_and_add_imm_sat"},
{NFP_3200_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
{NFP_3200_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
{NFP_3200_CPPTGT_CLS, 6, 2, 0, 0, "sub_sat"},
{NFP_3200_CPPTGT_CLS, 6, 3, 0, 0, "test_and_sub_sat"},
{NFP_3200_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
{NFP_3200_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
{NFP_3200_CPPTGT_CLS, 7, 2, 0, 0, "sub_imm_sat"},
{NFP_3200_CPPTGT_CLS, 7, 3, 0, 0, "test_and_sub_imm_sat"},
{NFP_3200_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
{NFP_3200_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
{NFP_3200_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
{NFP_3200_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
{NFP_3200_CPPTGT_CLS, 9, 0, 0, 0, "get"},
{NFP_3200_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
{NFP_3200_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
{NFP_3200_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
{NFP_3200_CPPTGT_CLS, 10, 0, 0, 0, "put"},
{NFP_3200_CPPTGT_CLS, 10, 1, 0, 0, "put_offset"},
{NFP_3200_CPPTGT_CLS, 10, 2, 0, 0, "journal"},
{NFP_3200_CPPTGT_CLS, 10, 3, 0, 0, "add_tail"},
{NFP_3200_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
{NFP_3200_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
{NFP_3200_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
{NFP_3200_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
{NFP_3200_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
{NFP_3200_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
{NFP_3200_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
{NFP_3200_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
{NFP_3200_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
{NFP_3200_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
{NFP_3200_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
{NFP_3200_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
{NFP_3200_CPPTGT_CLS, 14, 0, 0, 0, "reflect_from_sig_src"},
{NFP_3200_CPPTGT_CLS, 14, 1, 0, 0, "reflect_from_sig_dst"},
{NFP_3200_CPPTGT_CLS, 14, 2, 0, 0, "reflect_from_sig_both"},
{NFP_3200_CPPTGT_CLS, 15, 0, 0, 0, "reflect_to_sig_src"},
{NFP_3200_CPPTGT_CLS, 15, 1, 0, 0, "reflect_to_sig_dst"},
{NFP_3200_CPPTGT_CLS, 15, 2, 0, 0, "reflect_to_sig_both"}
};
static const nfp_cmd_mnemonic nfp_me28_mnemonics[] =
{
{NFP_6000_CPPTGT_NBI, 0, 0, 0, 0, "read"},
{NFP_6000_CPPTGT_NBI, 1, 0, 0, 0, "write"},
{NFP_6000_CPPTGT_NBI, 3, 0, 0, 0, "packet_ready_drop"},
{NFP_6000_CPPTGT_NBI, 3, 1, 0, 0, "packet_ready_unicast"},
{NFP_6000_CPPTGT_NBI, 3, 2, 0, 0, "packet_ready_multicast_dont_free"},
{NFP_6000_CPPTGT_NBI, 3, 3, 0, 0, "packet_ready_multicast_free_on_last"},
{NFP_6000_CPPTGT_ILA, 0, 0, 0, 0, "read"},
{NFP_6000_CPPTGT_ILA, 0, 1, 0, 0, "read_check_error"},
{NFP_6000_CPPTGT_ILA, 1, 0, 0, 0, "write"},
{NFP_6000_CPPTGT_ILA, 1, 1, 0, 0, "write_check_error"},
{NFP_6000_CPPTGT_ILA, 2, 0, 0, 0, "read_int"},
{NFP_6000_CPPTGT_ILA, 3, 0, 0, 7, "write_int"},
{NFP_6000_CPPTGT_ILA, 3, 0, 3, 7, "write_dma"},
{NFP_6000_CPPTGT_MU, 0, 0, 0, 0, "read"},
{NFP_6000_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
{NFP_6000_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
{NFP_6000_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
{NFP_6000_CPPTGT_MU, 1, 0, 0, 0, "write"},
{NFP_6000_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
{NFP_6000_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
{NFP_6000_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
{NFP_6000_CPPTGT_MU, 2, 0, 0, 0, "write8"},
{NFP_6000_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
{NFP_6000_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
{NFP_6000_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
{NFP_6000_CPPTGT_MU, 3, 0, 0, 0, "atomic_read"},
{NFP_6000_CPPTGT_MU, 3, 1, 0, 0, "read8"},
{NFP_6000_CPPTGT_MU, 3, 2, 0, 0,
"compare_write_or_incr/mask_compare_write"},
{NFP_6000_CPPTGT_MU, 3, 3, 0, 0,
"test_compare_write_or_incr/test_mask_compare_write"},
{NFP_6000_CPPTGT_MU, 4, 0, 0, 0, "atomic_write"},
{NFP_6000_CPPTGT_MU, 4, 1, 0, 0, "swap"},
{NFP_6000_CPPTGT_MU, 4, 2, 0, 0, "atomic_write_imm"},
{NFP_6000_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
{NFP_6000_CPPTGT_MU, 5, 0, 0, 0, "set"},
{NFP_6000_CPPTGT_MU, 5, 1, 0, 0, "test_set"},
{NFP_6000_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
{NFP_6000_CPPTGT_MU, 5, 3, 0, 0, "test_set_imm"},
{NFP_6000_CPPTGT_MU, 6, 0, 0, 0, "clr"},
{NFP_6000_CPPTGT_MU, 6, 1, 0, 0, "test_clr"},
{NFP_6000_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
{NFP_6000_CPPTGT_MU, 6, 3, 0, 0, "test_clr_imm"},
{NFP_6000_CPPTGT_MU, 7, 0, 0, 4, "add"},
{NFP_6000_CPPTGT_MU, 7, 0, 4, 4, "add64"},
{NFP_6000_CPPTGT_MU, 7, 1, 0, 4, "test_add"},
{NFP_6000_CPPTGT_MU, 7, 1, 4, 4, "test_add64"},
{NFP_6000_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
{NFP_6000_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
{NFP_6000_CPPTGT_MU, 7, 3, 0, 4, "test_add_imm"},
{NFP_6000_CPPTGT_MU, 7, 3, 4, 4, "test_add64_imm"},
{NFP_6000_CPPTGT_MU, 8, 0, 0, 4, "addsat"},
{NFP_6000_CPPTGT_MU, 8, 0, 4, 4, "addsat64"},
{NFP_6000_CPPTGT_MU, 8, 1, 0, 4, "test_addsat"},
{NFP_6000_CPPTGT_MU, 8, 1, 4, 4, "test_addsat64"},
{NFP_6000_CPPTGT_MU, 8, 2, 0, 4, "addsat_imm"},
{NFP_6000_CPPTGT_MU, 8, 2, 4, 4, "addsat64_imm"},
{NFP_6000_CPPTGT_MU, 8, 3, 0, 4, "test_addsat_imm"},
{NFP_6000_CPPTGT_MU, 8, 3, 4, 4, "test_addsat64_imm"},
{NFP_6000_CPPTGT_MU, 9, 0, 0, 4, "sub"},
{NFP_6000_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
{NFP_6000_CPPTGT_MU, 9, 1, 0, 4, "test_sub"},
{NFP_6000_CPPTGT_MU, 9, 1, 4, 4, "test_sub64"},
{NFP_6000_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
{NFP_6000_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
{NFP_6000_CPPTGT_MU, 9, 3, 0, 4, "test_sub_imm"},
{NFP_6000_CPPTGT_MU, 9, 3, 4, 4, "test_sub64_imm"},
{NFP_6000_CPPTGT_MU, 10, 0, 0, 4, "subsat"},
{NFP_6000_CPPTGT_MU, 10, 0, 4, 4, "subsat64"},
{NFP_6000_CPPTGT_MU, 10, 1, 0, 4, "test_subsat"},
{NFP_6000_CPPTGT_MU, 10, 1, 4, 4, "test_subsat64"},
{NFP_6000_CPPTGT_MU, 10, 2, 0, 4, "subsat_imm"},
{NFP_6000_CPPTGT_MU, 10, 2, 4, 4, "subsat64_imm"},
{NFP_6000_CPPTGT_MU, 10, 3, 0, 4, "test_subsat_imm"},
{NFP_6000_CPPTGT_MU, 10, 3, 4, 4, "test_subsat64_imm"},
{NFP_6000_CPPTGT_MU, 11, 0, 0, 0, "ticket_release"},
{NFP_6000_CPPTGT_MU, 11, 1, 0, 0, "ticket_release_ind"},
{NFP_6000_CPPTGT_MU, 12, 0, 0, 7, "cam128_lookup8/cam384_lookup8"},
{NFP_6000_CPPTGT_MU, 12, 0, 1, 7, "cam128_lookup16/cam384_lookup16"},
{NFP_6000_CPPTGT_MU, 12, 0, 2, 7, "cam128_lookup24/cam384_lookup24"},
{NFP_6000_CPPTGT_MU, 12, 0, 3, 7, "cam128_lookup32/cam384_lookup32"},
{NFP_6000_CPPTGT_MU, 12, 0, 4, 7, "cam256_lookup8/cam512_lookup8"},
{NFP_6000_CPPTGT_MU, 12, 0, 5, 7, "cam256_lookup16/cam512_lookup16"},
{NFP_6000_CPPTGT_MU, 12, 0, 6, 7, "cam256_lookup24/cam512_lookup24"},
{NFP_6000_CPPTGT_MU, 12, 0, 7, 7, "cam256_lookup32/cam512_lookup32"},
{NFP_6000_CPPTGT_MU, 12, 1, 0, 7,
"cam128_lookup8_add/cam384_lookup8_add"},
{NFP_6000_CPPTGT_MU, 12, 1, 1, 7,
"cam128_lookup16_add/cam384_lookup16_add"},
{NFP_6000_CPPTGT_MU, 12, 1, 2, 7,
"cam128_lookup24_add/cam384_lookup24_add"},
{NFP_6000_CPPTGT_MU, 12, 1, 3, 7,
"cam128_lookup32_add/cam384_lookup32_add"},
{NFP_6000_CPPTGT_MU, 12, 1, 4, 7,
"cam256_lookup8_add/cam512_lookup8_add"},
{NFP_6000_CPPTGT_MU, 12, 1, 5, 7,
"cam256_lookup16_add/cam512_lookup16_add"},
{NFP_6000_CPPTGT_MU, 12, 1, 6, 7,
"cam256_lookup24_add/cam512_lookup24_add"},
{NFP_6000_CPPTGT_MU, 12, 1, 7, 7,
"cam256_lookup32_add/cam512_lookup32_add"},
{NFP_6000_CPPTGT_MU, 12, 2, 0, 7, "tcam128_lookup8/tcam384_lookup8"},
{NFP_6000_CPPTGT_MU, 12, 2, 1, 7, "tcam128_lookup16/tcam384_lookup16"},
{NFP_6000_CPPTGT_MU, 12, 2, 2, 7, "tcam128_lookup24/tcam384_lookup24"},
{NFP_6000_CPPTGT_MU, 12, 2, 3, 7, "tcam128_lookup32/tcam384_lookup32"},
{NFP_6000_CPPTGT_MU, 12, 2, 4, 7, "tcam256_lookup8/tcam512_lookup8"},
{NFP_6000_CPPTGT_MU, 12, 2, 5, 7, "tcam256_lookup16/tcam512_lookup16"},
{NFP_6000_CPPTGT_MU, 12, 2, 6, 7, "tcam256_lookup24/tcam512_lookup24"},
{NFP_6000_CPPTGT_MU, 12, 2, 7, 7, "tcam256_lookup32/tcam512_lookup32"},
{NFP_6000_CPPTGT_MU, 12, 3, 0, 7, "lock128/lock384"},
{NFP_6000_CPPTGT_MU, 12, 3, 2, 7,
"cam128_lookup24_add_inc/cam384_lookup24_add_inc"},
{NFP_6000_CPPTGT_MU, 12, 3, 4, 7, "lock256/lock512"},
{NFP_6000_CPPTGT_MU, 12, 3, 6, 7,
"cam256_lookup24_add_inc/cam512_lookup24_add_inc"},
{NFP_6000_CPPTGT_MU, 13, 0, 0, 7, "microq128_get"},
{NFP_6000_CPPTGT_MU, 13, 0, 4, 7, "microq256_get"},
{NFP_6000_CPPTGT_MU, 13, 1, 0, 7, "microq128_pop"},
{NFP_6000_CPPTGT_MU, 13, 1, 4, 7, "microq256_pop"},
{NFP_6000_CPPTGT_MU, 13, 2, 0, 7, "microq128_put"},
{NFP_6000_CPPTGT_MU, 13, 2, 4, 7, "microq256_put"},
{NFP_6000_CPPTGT_MU, 14, 0, 0, 7, "queue128_lock"},
{NFP_6000_CPPTGT_MU, 14, 0, 4, 7, "queue256_lock"},
{NFP_6000_CPPTGT_MU, 14, 1, 0, 7, "queue128_unlock"},
{NFP_6000_CPPTGT_MU, 14, 1, 4, 7, "queue256_unlock"},
{NFP_6000_CPPTGT_MU, 15, 0, 0, 0, "xor"},
{NFP_6000_CPPTGT_MU, 15, 1, 0, 0, "test_xor"},
{NFP_6000_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
{NFP_6000_CPPTGT_MU, 15, 3, 0, 0, "test_xor_imm"},
{NFP_6000_CPPTGT_MU, 16, 0, 0, 0,
"ctm.packet_wait_packet_status/emem.rd_qdesc/imem.stats_log"},
{NFP_6000_CPPTGT_MU, 16, 1, 0, 0,
"ctm.packet_read_packet_status/emem.wr_qdesc/imem.stats_log_sat"},
{NFP_6000_CPPTGT_MU, 16, 2, 0, 0,
"emem.push_qdesc/imem.stats_log_event"},
{NFP_6000_CPPTGT_MU, 16, 3, 0, 0, "imem.stats_log_sat_event"},
{NFP_6000_CPPTGT_MU, 17, 0, 0, 0,
"ctm.packet_alloc/emem.enqueue/imem.stats_push"},
{NFP_6000_CPPTGT_MU, 17, 1, 0, 0,
"ctm.packet_credit_get/emem.enqueue_tail/imem.stats_push_clear"},
{NFP_6000_CPPTGT_MU, 17, 2, 0, 0, "ctm.packet_alloc_poll/emem.dequeue"},
{NFP_6000_CPPTGT_MU, 17, 3, 0, 0, "ctm.packet_add_thread"},
{NFP_6000_CPPTGT_MU, 18, 0, 0, 0,
"ctm.packet_free/emem.read_queue/imem.lb_write_desc"},
{NFP_6000_CPPTGT_MU, 18, 1, 0, 0,
"ctm.packet_free_and_signal/emem.read_queue_ring/imem.lb_read_desc"},
{NFP_6000_CPPTGT_MU, 18, 2, 0, 0,
"ctm.packet_free_and_return_pointer/emem.write_queue"},
{NFP_6000_CPPTGT_MU, 18, 3, 0, 0,
"ctm.packet_return_pointer/emem.write_queue_ring"},
{NFP_6000_CPPTGT_MU, 19, 0, 0, 0,
"ctm.packet_complete_drop/emem.add_tail/imem.lb_write_idtable"},
{NFP_6000_CPPTGT_MU, 19, 1, 0, 0,
"ctm.packet_complete_unicast/emem.qadd_thread/imem.lb_read_idtable"},
{NFP_6000_CPPTGT_MU, 19, 2, 0, 0,
"ctm.packet_complete_multicast/emem.qadd_work"},
{NFP_6000_CPPTGT_MU, 19, 3, 0, 0,
"ctm.packet_complete_multicast_free/emem.qadd_work_imm"},
{NFP_6000_CPPTGT_MU, 20, 0, 0, 0,
"ctm.pe_dma_to_memory_packet/emem.put/imem.lb_bucket_write_local"},
{NFP_6000_CPPTGT_MU, 20, 1, 0, 0,
"ctm.pe_dma_to_memory_packet_swap/imem.lb_bucket_write_dcache"},
{NFP_6000_CPPTGT_MU, 20, 2, 0, 0,
"ctm.pe_dma_to_memory_packet_free/emem.journal"},
{NFP_6000_CPPTGT_MU, 20, 3, 0, 0,
"ctm.pe_dma_to_memory_packet_free_swap"},
{NFP_6000_CPPTGT_MU, 21, 0, 0, 0,
"ctm.pe_dma_to_memory_indirect/emem.get/imem.lb_bucket_read_local"},
{NFP_6000_CPPTGT_MU, 21, 1, 0, 0,
"ctm.pe_dma_to_memory_indirect_swap/emem.get_eop/"
"imem.lb_bucket_read_dcache"},
{NFP_6000_CPPTGT_MU, 21, 2, 0, 0,
"ctm.pe_dma_to_memory_indirect_free/emem.get_freely"},
{NFP_6000_CPPTGT_MU, 21, 3, 0, 0,
"ctm.pe_dma_to_memory_indirect_free_swap"},
{NFP_6000_CPPTGT_MU, 22, 0, 0, 0,
"ctm.pe_dma_to_memory_buffer/emem.pop/imem.lb_lookup_bundleid"},
{NFP_6000_CPPTGT_MU, 22, 1, 0, 0,
"ctm.pe_dma_to_memory_buffer_le/emem.pop_eop/imem.lb_lookup_dcache"},
{NFP_6000_CPPTGT_MU, 22, 2, 0, 0,
"ctm.pe_dma_to_memory_buffer_swap/emem.pop_freely/imem.lb_lookup_idtable"},
{NFP_6000_CPPTGT_MU, 22, 3, 0, 0, "ctm.pe_dma_to_memory_buffer_le_swap"},
{NFP_6000_CPPTGT_MU, 23, 0, 0, 0,
"ctm.pe_dma_from_memory_buffer/emem.fast_journal/imem.lb_push_stats_local"},
{NFP_6000_CPPTGT_MU, 23, 1, 0, 0,
"ctm.pe_dma_from_memory_buffer_le/emem.fast_journal_sig/"
"imem.lb_push_stats_dcache"},
{NFP_6000_CPPTGT_MU, 23, 2, 0, 0,
"ctm.pe_dma_from_memory_buffer_swap/imem.lb_push_stats_local_clr"},
{NFP_6000_CPPTGT_MU, 23, 3, 0, 0,
"ctm.pe_dma_from_memory_buffer_le_swap/imem.lb_push_stats_dcache_clr"},
{NFP_6000_CPPTGT_MU, 26, 0, 0, 0, "emem.lookup/imem.lookup"},
{NFP_6000_CPPTGT_MU, 28, 0, 0, 0, "read32"},
{NFP_6000_CPPTGT_MU, 28, 1, 0, 0, "read32_le"},
{NFP_6000_CPPTGT_MU, 28, 2, 0, 0, "read32_swap"},
{NFP_6000_CPPTGT_MU, 28, 3, 0, 0, "read32_swap_le"},
{NFP_6000_CPPTGT_MU, 29, 1, 0, 0, "cam_lookup_add_lock"},
{NFP_6000_CPPTGT_MU, 29, 2, 0, 0, "cam_lookup_add_extend"},
{NFP_6000_CPPTGT_MU, 29, 3, 0, 0, "cam_lookup_add_inc"},
{NFP_6000_CPPTGT_MU, 30, 2, 0, 0, "meter"},
{NFP_6000_CPPTGT_MU, 31, 0, 0, 0, "write32"},
{NFP_6000_CPPTGT_MU, 31, 1, 0, 0, "write32_le"},
{NFP_6000_CPPTGT_MU, 31, 2, 0, 0, "write32_swap"},
{NFP_6000_CPPTGT_MU, 31, 3, 0, 0, "write32_swap_le"},
{NFP_6000_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
{NFP_6000_CPPTGT_PCIE, 0, 1, 0, 0, "read_rid"},
{NFP_6000_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
{NFP_6000_CPPTGT_PCIE, 1, 1, 0, 0, "write_rid"},
{NFP_6000_CPPTGT_PCIE, 1, 2, 0, 0, "write_vdm"},
{NFP_6000_CPPTGT_PCIE, 2, 0, 0, 0, "read_int"},
{NFP_6000_CPPTGT_PCIE, 3, 0, 0, 0, "write_int"},
{NFP_6000_CPPTGT_ARM, 0, 0, 0, 0, "read"},
{NFP_6000_CPPTGT_ARM, 1, 0, 0, 0, "write"},
{NFP_6000_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
{NFP_6000_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
{NFP_6000_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
{NFP_6000_CPPTGT_CTXPB, 0, 0, 0, 0, "xpb_read"},
{NFP_6000_CPPTGT_CTXPB, 0, 1, 0, 0, "ring_get"},
{NFP_6000_CPPTGT_CTXPB, 0, 2, 0, 0, "interthread_signal"},
{NFP_6000_CPPTGT_CTXPB, 1, 0, 0, 0, "xpb_write"},
{NFP_6000_CPPTGT_CTXPB, 1, 1, 0, 0, "ring_put"},
{NFP_6000_CPPTGT_CTXPB, 1, 2, 0, 0, "ctnn_write"},
{NFP_6000_CPPTGT_CTXPB, 2, 0, 0, 0, "reflect_read_none"},
{NFP_6000_CPPTGT_CTXPB, 2, 1, 0, 0, "reflect_read_sig_init"},
{NFP_6000_CPPTGT_CTXPB, 2, 2, 0, 0, "reflect_read_sig_remote"},
{NFP_6000_CPPTGT_CTXPB, 2, 3, 0, 0, "reflect_read_sig_both"},
{NFP_6000_CPPTGT_CTXPB, 3, 0, 0, 0, "reflect_write_none"},
{NFP_6000_CPPTGT_CTXPB, 3, 1, 0, 0, "reflect_write_sig_init"},
{NFP_6000_CPPTGT_CTXPB, 3, 2, 0, 0, "reflect_write_sig_remote"},
{NFP_6000_CPPTGT_CTXPB, 3, 3, 0, 0, "reflect_write_sig_both"},
{NFP_6000_CPPTGT_CLS, 0, 0, 0, 0, "read"},
{NFP_6000_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
{NFP_6000_CPPTGT_CLS, 0, 2, 0, 0, "swap/test_compare_write"},
{NFP_6000_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
{NFP_6000_CPPTGT_CLS, 1, 0, 0, 0, "write"},
{NFP_6000_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
{NFP_6000_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
{NFP_6000_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
{NFP_6000_CPPTGT_CLS, 2, 0, 0, 0, "set"},
{NFP_6000_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
{NFP_6000_CPPTGT_CLS, 2, 2, 0, 0, "test_set"},
{NFP_6000_CPPTGT_CLS, 2, 3, 0, 0, "test_clr"},
{NFP_6000_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
{NFP_6000_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
{NFP_6000_CPPTGT_CLS, 3, 2, 0, 0, "test_set_imm"},
{NFP_6000_CPPTGT_CLS, 3, 3, 0, 0, "test_clr_imm"},
{NFP_6000_CPPTGT_CLS, 4, 0, 0, 0, "add"},
{NFP_6000_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
{NFP_6000_CPPTGT_CLS, 4, 2, 0, 0, "addsat"},
{NFP_6000_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
{NFP_6000_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
{NFP_6000_CPPTGT_CLS, 5, 2, 0, 0, "addsat_imm"},
{NFP_6000_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
{NFP_6000_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
{NFP_6000_CPPTGT_CLS, 6, 2, 0, 0, "subsat"},
{NFP_6000_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
{NFP_6000_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
{NFP_6000_CPPTGT_CLS, 7, 2, 0, 0, "subsat_imm"},
{NFP_6000_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
{NFP_6000_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
{NFP_6000_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
{NFP_6000_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
{NFP_6000_CPPTGT_CLS, 9, 0, 0, 0, "get"},
{NFP_6000_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
{NFP_6000_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
{NFP_6000_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
{NFP_6000_CPPTGT_CLS, 10, 0, 0, 0, "ring_put"},
{NFP_6000_CPPTGT_CLS, 10, 2, 0, 0, "ring_journal"},
{NFP_6000_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
{NFP_6000_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
{NFP_6000_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
{NFP_6000_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
{NFP_6000_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
{NFP_6000_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
{NFP_6000_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
{NFP_6000_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
{NFP_6000_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
{NFP_6000_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
{NFP_6000_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
{NFP_6000_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
{NFP_6000_CPPTGT_CLS, 14, 0, 0, 0, "reflect_write_sig_local"},
{NFP_6000_CPPTGT_CLS, 14, 1, 0, 0, "reflect_write_sig_remote"},
{NFP_6000_CPPTGT_CLS, 14, 2, 0, 0, "reflect_write_sig_both"},
{NFP_6000_CPPTGT_CLS, 15, 0, 0, 0, "reflect_read_sig_remote"},
{NFP_6000_CPPTGT_CLS, 15, 1, 0, 0, "reflect_read_sig_local"},
{NFP_6000_CPPTGT_CLS, 15, 2, 0, 0, "reflect_read_sig_both"},
{NFP_6000_CPPTGT_CLS, 16, 1, 0, 0, "cam_lookup32_add_lock"},
{NFP_6000_CPPTGT_CLS, 16, 2, 0, 0, "cam_lookup24_add_inc"},
{NFP_6000_CPPTGT_CLS, 16, 3, 0, 0, "cam_lookup32_add_extend"},
{NFP_6000_CPPTGT_CLS, 17, 0, 0, 0, "meter"},
{NFP_6000_CPPTGT_CLS, 17, 2, 0, 0, "statistic"},
{NFP_6000_CPPTGT_CLS, 17, 3, 0, 0, "statistic_imm"},
{NFP_6000_CPPTGT_CLS, 20, 0, 0, 0, "test_add"},
{NFP_6000_CPPTGT_CLS, 20, 1, 0, 0, "test_add64"},
{NFP_6000_CPPTGT_CLS, 20, 2, 0, 0, "test_addsat"},
{NFP_6000_CPPTGT_CLS, 21, 0, 0, 0, "test_add_imm"},
{NFP_6000_CPPTGT_CLS, 21, 1, 0, 0, "test_add64_imm"},
{NFP_6000_CPPTGT_CLS, 21, 2, 0, 0, "test_addsat_imm"},
{NFP_6000_CPPTGT_CLS, 22, 0, 0, 0, "test_sub"},
{NFP_6000_CPPTGT_CLS, 22, 1, 0, 0, "test_sub64"},
{NFP_6000_CPPTGT_CLS, 22, 2, 0, 0, "test_subsat"},
{NFP_6000_CPPTGT_CLS, 23, 0, 0, 0, "test_sub_imm"},
{NFP_6000_CPPTGT_CLS, 23, 1, 0, 0, "test_sub64_imm"},
{NFP_6000_CPPTGT_CLS, 23, 2, 0, 0, "test_subsat_imm"},
{NFP_6000_CPPTGT_CLS, 24, 0, 0, 0, "ring_read"},
{NFP_6000_CPPTGT_CLS, 24, 1, 0, 0, "ring_write"},
{NFP_6000_CPPTGT_CLS, 24, 2, 0, 0, "ring_ordered_lock"},
{NFP_6000_CPPTGT_CLS, 24, 3, 0, 0, "ring_ordered_unlock"},
{NFP_6000_CPPTGT_CLS, 25, 0, 0, 0, "ring_workq_add_thread"},
{NFP_6000_CPPTGT_CLS, 25, 1, 0, 0, "ring_workq_add_work"}
};
static int
nfp_me_print_invalid (uint64_t instr, struct disassemble_info *dinfo)
{
const char * err_msg = N_("<invalid_instruction>:");
dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
return _NFP_ERR_CONT;
}
static bool
nfp_me_is_imm_opnd10 (unsigned int opnd)
{
return _BF (opnd, 9, 8) == 0x3;
}
static bool
nfp_me_is_imm_opnd8 (unsigned int opnd)
{
return _BTST (opnd, 5);
}
static unsigned int
nfp_me_imm_opnd10 (unsigned int opnd)
{
return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
}
static unsigned int
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
{
unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
}
/* Print an unrestricted/10-bit operand.
This can mostly be generic across NFP families at the moment. */
static bool
nfp_me_print_opnd10 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
struct disassemble_info *dinfo)
{
unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
/* Absolute GPR. */
if (_BF (opnd, 9, 7) == 0x1)
dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
/* Relative GPR. */
else if (_BF (opnd, 9, 6) == 0x0)
dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
/* Indexed Xfer. */
else if (_BF (opnd, 9, 7) == 0x2)
{
dinfo->fprintf_func (dinfo->stream, "*$index");
if (_BF (opnd, 2, 1) == 0x1)
dinfo->fprintf_func (dinfo->stream, "++");
else if (_BF (opnd, 2, 1) == 0x2)
dinfo->fprintf_func (dinfo->stream, "--");
}
/* Relative Xfer. */
else if (_BF (opnd, 9, 7) == 0x3)
{
if (_BTST (opnd, 6))
n += (num_ctx == 8 ? 16 : 32);
dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
}
/* Indexed Next Neighbour. */
else if (_BF (opnd, 9, 6) == 0x9)
{
dinfo->fprintf_func (dinfo->stream, "*n$index");
if (_BTST (opnd, 1))
dinfo->fprintf_func (dinfo->stream, "++");
}
/* Relative Next Neighbour. */
else if (_BF (opnd, 9, 6) == 0xa)
{
dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
}
/* Indexed LMEM. */
else if (_BF (opnd, 9, 6) == 0x8)
{
n = _BF (opnd, 5, 5) + (lmem_ext * 2);
dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
if (_BTST (opnd, 4))
dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
else if (_BF (opnd, 3, 0))
dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
}
/* 8-bit Constant value. */
else if (_BF (opnd, 9, 8) == 0x3)
dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
else
{
dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
return false;
}
return true;
}
/* Print a restricted/8-bit operand.
This can mostly be generic across NFP families at the moment. */
static bool
nfp_me_print_opnd8 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
unsigned int imm8_msb, struct disassemble_info *dinfo)
{
unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
/* Relative GPR. */
if (_BF (opnd, 7, 5) == 0x0)
dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
/* Relative Xfer. */
else if (_BF (opnd, 7, 5) == 0x4)
dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
/* Relative Xfer. */
else if (_BF (opnd, 7, 5) == 0x6)
{
n += (num_ctx == 8 ? 16 : 32);
dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
}
/* Indexed Xfer. */
else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
{
dinfo->fprintf_func (dinfo->stream, "*$index");
if (_BF (opnd, 2, 1) == 0x1)
dinfo->fprintf_func (dinfo->stream, "++");
else if (_BF (opnd, 2, 1) == 0x2)
dinfo->fprintf_func (dinfo->stream, "--");
}
/* Indexed NN. */
else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
{
dinfo->fprintf_func (dinfo->stream, "*n$index");
if (_BTST (opnd, 1))
dinfo->fprintf_func (dinfo->stream, "++");
}
/* Indexed LMEM. */
else if (_BF (opnd, 7, 4) == 0x5)
{
n = _BF (opnd, 3, 3) + (lmem_ext * 2);
dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
if (_BF (opnd, 2, 0))
dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
}
/* 7+1-bit Constant value. */
else if (_BTST (opnd, 5))
{
n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
dinfo->fprintf_func (dinfo->stream, "0x%x", n);
}
else
{
dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
return false;
}
return true;
}
static int
nfp_me27_28_print_alu_shf (uint64_t instr, unsigned int pred_cc,
unsigned int dst_lmext, unsigned int src_lmext,
unsigned int gpr_wrboth,
int num_ctx, struct disassemble_info *dinfo)
{
unsigned int op = _BF (instr, 35, 33);
unsigned int srcA = _BF (instr, 7, 0);
unsigned int srcB = _BF (instr, 17, 10);
unsigned int dst = _BF (instr, 27, 20);
unsigned int sc = _BF (instr, 9, 8);
unsigned int imm_msb = _BTST (instr, 18);
unsigned int swap = _BTST (instr, 19);
unsigned int shift = _BF (instr, 32, 28);
char dst_bank = 'A' + _BTST (instr, 36);
unsigned int nocc = _BTST (instr, 40);
bool err = false;
if (swap)
{
unsigned int tmp = srcA;
srcA = srcB;
srcB = tmp;
}
/* alu_shf, dbl_shf, asr. */
if (op < 7)
{
if (sc == 3)
dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
else if (op == 6)
dinfo->fprintf_func (dinfo->stream, "asr[");
else
dinfo->fprintf_func (dinfo->stream, "alu_shf[");
/* dest operand */
if (nfp_me_is_imm_opnd8 (dst))
dinfo->fprintf_func (dinfo->stream, "--");
else
err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
dst_lmext, imm_msb, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
/* A operand. */
if (op != 6)
{
if ((op < 2) && (sc != 3)) /* Not dbl_shf. */
dinfo->fprintf_func (dinfo->stream, "--"); /* B or ~B operator. */
else
err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
num_ctx, src_lmext, imm_msb,
dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
/* Operator (not for dbl_shf). */
if (sc != 3)
{
dinfo->fprintf_func (dinfo->stream, "%s, ",
nfp_mealu_shf_op[op]);
}
}
/* B operand. */
err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
num_ctx, src_lmext, imm_msb, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
/* Shift */
if (sc == 0)
dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
else if (sc == 2)
{
if (shift)
dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
else
dinfo->fprintf_func (dinfo->stream, "<<indirect");
}
else
{
if (shift)
dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
else
dinfo->fprintf_func (dinfo->stream, ">>indirect");
}
}
/* Byte Align. */
else if (op == 7)
{
dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
((sc == 2) ? "le" : "be"));
/* Dest operand. */
if (nfp_me_is_imm_opnd8 (dst))
dinfo->fprintf_func (dinfo->stream, "--");
else
err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
dst_lmext, imm_msb, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
if (sc == 2)
err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
0, imm_msb, dinfo);
else
err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
0, imm_msb, dinfo);
}
dinfo->fprintf_func (dinfo->stream, "]");
if (nocc)
dinfo->fprintf_func (dinfo->stream, ", no_cc");
if (gpr_wrboth)
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
if (pred_cc)
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
if (err)
return _NFP_ERR_CONT;
return 0;
}
static int
nfp_me27_28_print_alu (uint64_t instr, unsigned int pred_cc,
unsigned int dst_lmext, unsigned int src_lmext,
unsigned int gpr_wrboth,
int num_ctx, struct disassemble_info *dinfo)
{
unsigned int op = _BF (instr, 35, 31);
unsigned int srcA = _BF (instr, 9, 0);
unsigned int srcB = _BF (instr, 19, 10);
unsigned int dst = _BF (instr, 29, 20);
unsigned int swap = _BTST (instr, 30);
char dst_bank = 'A' + _BTST (instr, 36);
unsigned int nocc = _BTST (instr, 40);
int do_close_bracket = 1;
bool err = false;
if (swap)
{
unsigned int tmp = srcA;
srcA = srcB;
srcB = tmp;
}
switch (op)
{
case 3: /* pop_count3[dst, srcB] */
case 6: /* pop_count1[srcB] */
case 7: /* pop_count2[srcB] */
case 14: /* ffs[dst, srcB] */
case 15: /* cam_read_tag[dst, srcB] */
case 31: /* cam_read_state[dst, srcB] */
dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
/* No dest for pop_count1/2. */
if ((op != 6) && (op != 7))
{
/* dest operand */
if (nfp_me_is_imm_opnd10 (dst))
dinfo->fprintf_func (dinfo->stream, "--");
else
err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
dst_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
}
/* B operand. */
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
num_ctx, src_lmext, dinfo);
break;
/* cam_clear. */
case 11:
do_close_bracket = 0;
dinfo->fprintf_func (dinfo->stream, "cam_clear");
break;
/* cam_lookup. */
case 23:
do_close_bracket = 0;
dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
/* Dest operand. */
if (nfp_me_is_imm_opnd10 (dst))
dinfo->fprintf_func (dinfo->stream, "--");
else
err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
dst_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
/* A operand. */
err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
num_ctx, src_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, "]");
if (_BF (srcB, 1, 0))
{
unsigned int n = _BTST (srcB, 1);
if (_BTST (srcB, 4)) /* Only for MEv28. */
n += 2;
dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
_BF (srcB, 3, 2));
}
break;
case 19: /* cam_write. */
case 27: /* cam_write_state. */
dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
num_ctx, src_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
if (op == 19)
{
err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
num_ctx, src_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
}
dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
break;
/* CRC. */
case 18:
do_close_bracket = 0;
dinfo->fprintf_func (dinfo->stream, "crc_%s[",
_BTST (srcA, 3) ? "le" : "be");
if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
{
dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
err = true;
}
else
{
dinfo->fprintf_func (dinfo->stream, "%s, ",
nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
}
/* Dest operand. */
if (nfp_me_is_imm_opnd10 (dst))
dinfo->fprintf_func (dinfo->stream, "--");
else
err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
dst_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
/* B operand. */
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
num_ctx, src_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, "]");
if (_BF (srcA, 2, 0))
dinfo->fprintf_func (dinfo->stream, ", %s",
nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
if (_BTST (srcA, 4))
dinfo->fprintf_func (dinfo->stream, ", bit_swap");
break;
default:
/* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs). */
dinfo->fprintf_func (dinfo->stream, "alu[");
/* Dest operand. */
if (nfp_me_is_imm_opnd10 (dst))
dinfo->fprintf_func (dinfo->stream, "--");
else
err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
dst_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
/* A operand. */
if ((op == 0) || (op == 4)) /* B only operators. */
dinfo->fprintf_func (dinfo->stream, "--");
else
err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
num_ctx, src_lmext, dinfo);
if (!nfp_me27_28_alu_op[op])
{
dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
err = true;
}
else
{
dinfo->fprintf_func (dinfo->stream, ", %s, ",
nfp_me27_28_alu_op[op]);
}
/* B operand. */
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
num_ctx, src_lmext, dinfo);
break;
}
if (do_close_bracket)
dinfo->fprintf_func (dinfo->stream, "]");
if (nocc)
dinfo->fprintf_func (dinfo->stream, ", no_cc");
if (gpr_wrboth)
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
if (pred_cc)
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
if (err)
return _NFP_ERR_CONT;
return 0;
}
static int
nfp_me27_28_print_immed (uint64_t instr, unsigned int pred_cc,
unsigned int dst_lmext,
unsigned int gpr_wrboth,
int num_ctx, struct disassemble_info *dinfo)
{
unsigned int srcA = _BF (instr, 9, 0);
unsigned int srcB = _BF (instr, 19, 10);
unsigned int imm = _BF (instr, 27, 20);
unsigned int by = _BTST (instr, 29);
unsigned int wd = _BTST (instr, 30);
unsigned int inv = _BTST (instr, 31);
unsigned int byte_shift = _BF (instr, 34, 33);
bool err = false;
if (nfp_me_is_imm_opnd10 (srcB))
{
imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
{
dinfo->fprintf_func (dinfo->stream, "nop");
return 0;
}
}
else
{
imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
}
if (inv)
imm = (imm ^ 0xffff) | 0xffff0000U;
if (by)
{
dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
imm &= 0xff;
}
else if (wd)
{
dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
imm &= 0xffff;
}
else
dinfo->fprintf_func (dinfo->stream, "immed[");
/* Dest. */
if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
dinfo->fprintf_func (dinfo->stream, "--"); /* No Dest. */
else if (nfp_me_is_imm_opnd10 (srcA))
err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
else
err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
if ((!by) && (!wd) && (byte_shift))
dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
dinfo->fprintf_func (dinfo->stream, "]");
if (gpr_wrboth)
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
if (pred_cc)
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
if (err)
return _NFP_ERR_CONT;
return 0;
}
static int
nfp_me27_28_print_ld_field (uint64_t instr, unsigned int pred_cc,
unsigned int dst_lmext, unsigned int src_lmext,
unsigned int gpr_wrboth,
int num_ctx, struct disassemble_info *dinfo)
{
unsigned int load_cc = _BTST (instr, 34);
unsigned int shift = _BF (instr, 32, 28);
unsigned int byte_mask = _BF (instr, 27, 24);
unsigned int zerof = _BTST (instr, 20);
unsigned int swap = _BTST (instr, 19);
unsigned int imm_msb = _BTST (instr, 18);
unsigned int src = _BF (instr, 17, 10);
unsigned int sc = _BF (instr, 9, 8);
unsigned int dst = _BF (instr, 7, 0);
bool err = false;
if (swap)
{
unsigned int tmp = src;
src = dst;
dst = tmp;
}
if (zerof)
dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
else
dinfo->fprintf_func (dinfo->stream, "ld_field[");
err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
dst_lmext, imm_msb, dinfo);
dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
_BTST (byte_mask, 3),
_BTST (byte_mask, 2),
_BTST (byte_mask, 1), _BTST (byte_mask, 0));
err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
src_lmext, imm_msb, dinfo);
if ((sc == 0) && (shift != 0))
dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
else if (sc == 1)
{
if (shift)
dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
else
dinfo->fprintf_func (dinfo->stream, ", >>indirect");
}
else if (sc == 2)
{
if (shift)
dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
else
dinfo->fprintf_func (dinfo->stream, ", <<indirect");
}
else if (sc == 3)
dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
dinfo->fprintf_func (dinfo->stream, "]");
if (load_cc)
dinfo->fprintf_func (dinfo->stream, ", load_cc");
if (gpr_wrboth)
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
if (pred_cc)
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
if (err)
return _NFP_ERR_CONT;
return 0;
}
static int
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
{
unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
unsigned int defer = _BF (instr, 21, 20);
unsigned int no_load = _BTST (instr, 19);
unsigned int resume = _BTST (instr, 18);
unsigned int bpt = _BTST (instr, 17);
unsigned int sig_or = _BTST (instr, 16);
unsigned int ev_mask = _BF (instr, 15, 0);
dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
if (bpt)
dinfo->fprintf_func (dinfo->stream, "bpt");
else if (ev_mask == 1)
dinfo->fprintf_func (dinfo->stream, "voluntary");
else if ((!no_load) && (ev_mask == 0))
{
dinfo->fprintf_func (dinfo->stream, "kill");
sig_or = 0;
}
else if (ev_mask == 0)
dinfo->fprintf_func (dinfo->stream, "--");
else
{
int first_print = 1;
unsigned int n;
for (n = 1; n < 16; n++)
{
if (!_BTST (ev_mask, n))
continue;
dinfo->fprintf_func (dinfo->stream, "%ssig%d",
(first_print) ? "" : ", ", n);
first_print = 0;
}
}
dinfo->fprintf_func (dinfo->stream, "]");
if (sig_or)
dinfo->fprintf_func (dinfo->stream, ", any");
if (resume)
dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
if (defer)
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
return 0;
}
static int
nfp_me27_28_print_local_csr (uint64_t instr,
unsigned int src_lmext,
int num_ctx, struct disassemble_info *dinfo)
{
unsigned int srcA = _BF (instr, 9, 0);
unsigned int srcB = _BF (instr, 19, 10);
unsigned int wr = _BTST (instr, 21);
unsigned int csr_num = _BF (instr, 32, 22);
unsigned int src = srcA;
char src_bank = 'A';
bool err = false;
if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
{
src_bank = 'B';
src = srcB;
}
/* MEv28 does not have urd/uwr. */
if (csr_num == 1)
{
if (wr)
{
dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
(int) _BTST (instr, 20));
err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
src_lmext, dinfo);
}
else
{
dinfo->fprintf_func (dinfo->stream, "urd[");
err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
src_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
(int) _BTST (instr, 20));
}
dinfo->fprintf_func (dinfo->stream, "]");
}
else
{
const char *nm = NULL;
if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
nm = nfp_me27_28_mecsrs[csr_num];
dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
(wr) ? "wr" : "rd");
if (nm)
dinfo->fprintf_func (dinfo->stream, "%s", nm);
else
dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
if (wr)
{
dinfo->fprintf_func (dinfo->stream, ", ");
err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
src_lmext, dinfo);
}
dinfo->fprintf_func (dinfo->stream, "]");
}
if (err)
return _NFP_ERR_CONT;
return 0;
}
static int
nfp_me27_28_print_branch (uint64_t instr,
const char *br_inpstates[16],
struct disassemble_info *dinfo)
{
unsigned int br_op = _BF (instr, 4, 0);
unsigned int ctx_sig_state = _BF (instr, 17, 14);
unsigned int defer = _BF (instr, 21, 20);
unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
int ret = 0;
if (!nfp_me27_28_br_ops[br_op])
{
dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
ret = _NFP_ERR_CONT;
}
else
dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
switch (br_op)
{
case 16: /* br=ctx */
case 17: /* br!=ctx */
case 18: /* br_signal */
case 19: /* br_!signal */
dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
break;
case 20: /* "br_inp_state" */
case 21: /* "br_!inp_state" */
dinfo->fprintf_func (dinfo->stream, "%s, ",
br_inpstates[ctx_sig_state]);
break;
case 22: /* "br_cls_state" */
case 23: /* "br_!cls_state" */
dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
ctx_sig_state);
break;
default:
break;
}
dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
if (defer)
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
return ret;
}
static int
nfp_me27_28_print_br_byte (uint64_t instr,
unsigned int src_lmext, int num_ctx,
struct disassemble_info *dinfo)
{
unsigned int srcA = _BF (instr, 7, 0);
unsigned int by = _BF (instr, 9, 8);
unsigned int srcB = _BF (instr, 17, 10);
unsigned int imm_msb = _BTST (instr, 18);
unsigned int eq = _BTST (instr, 19);
unsigned int defer = _BF (instr, 21, 20);
unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
bool err = false;
if (eq)
dinfo->fprintf_func (dinfo->stream, "br=byte[");
else
dinfo->fprintf_func (dinfo->stream, "br!=byte[");
if (nfp_me_is_imm_opnd8 (srcA))
err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
src_lmext, imm_msb, dinfo);
else
err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
src_lmext, imm_msb, dinfo);
dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
if (nfp_me_is_imm_opnd8 (srcA))
err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
src_lmext, imm_msb, dinfo);
else
err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
src_lmext, imm_msb, dinfo);
dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
if (defer)
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
if (err)
return _NFP_ERR_CONT;
return 0;
}
static int
nfp_me27_28_print_br_bit (uint64_t instr, unsigned int src_lmext,
int num_ctx, struct disassemble_info *dinfo)
{
unsigned int srcA = _BF (instr, 7, 0);
unsigned int srcB = _BF (instr, 17, 10);
unsigned int b = _BTST (instr, 18);
unsigned int defer = _BF (instr, 21, 20);
unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
bool err = false;
if (b)
dinfo->fprintf_func (dinfo->stream, "br_bset[");
else
dinfo->fprintf_func (dinfo->stream, "br_bclr[");
if (nfp_me_is_imm_opnd8 (srcA))
{
err = err
|| !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
}
else
{
err = err
|| !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
}
dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
if (defer)
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
if (err)
return _NFP_ERR_CONT;
return 0;
}
static int
nfp_me27_28_print_br_alu (uint64_t instr, unsigned int src_lmext,
int num_ctx, struct disassemble_info *dinfo)
{
unsigned int srcA = _BF (instr, 9, 0);
unsigned int srcB = _BF (instr, 19, 10);
unsigned int defer = _BF (instr, 21, 20);
unsigned int imm = _BF (instr, 30, 22);
bool err = false;
if (nfp_me_is_imm_opnd10 (srcA))
imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
else
imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
if (!imm)
dinfo->fprintf_func (dinfo->stream, "rtn[");
else
dinfo->fprintf_func (dinfo->stream, "jump[");
if (nfp_me_is_imm_opnd10 (srcA))
err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
else
err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
if (imm)
dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
dinfo->fprintf_func (dinfo->stream, "]");
if (defer)
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
if (err)
return _NFP_ERR_CONT;
return 0;
}
static int
nfp_me27_28_print_mult (uint64_t instr, unsigned int pred_cc,
unsigned int dst_lmext, unsigned int src_lmext,
unsigned int gpr_wrboth,
int num_ctx, struct disassemble_info *dinfo)
{
unsigned int srcA = _BF (instr, 9, 0);
unsigned int srcB = _BF (instr, 19, 10);
unsigned int mstep = _BF (instr, 22, 20);
char dst_bank = 'A' + _BTST (instr, 23);
unsigned int swap = _BTST (instr, 30);
unsigned int mtype = _BF (instr, 32, 31);
unsigned int nocc = _BTST (instr, 40);
bool err = false;
if (swap)
{
unsigned int tmp = srcA;
srcA = srcB;
srcB = tmp;
}
dinfo->fprintf_func (dinfo->stream, "mul_step[");
if (mstep >= 4)
err = err
|| !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
else
err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
src_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, ", ");
if (mstep >= 4)
dinfo->fprintf_func (dinfo->stream, "--");
else
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
src_lmext, dinfo);
dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
if (mtype > 0)
{
const char *s = nfp_me27_28_mult_steps[mstep];
if (!s)
{
s = "<invalid mul_step>";
err = true;
}
dinfo->fprintf_func (dinfo->stream, "_%s", s);
}
if (nocc)
dinfo->fprintf_func (dinfo->stream, ", no_cc");
if (gpr_wrboth)
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
if (pred_cc)
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
if (err)
return _NFP_ERR_CONT;
return 0;
}
static int
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
{
const nfp_cmd_mnemonic *a = arg_a;
const nfp_cmd_mnemonic *b = arg_b;
if (a->cpp_target != b->cpp_target)
return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
if (a->cpp_action != b->cpp_action)
return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
}
static const char *
nfp_me_find_mnemonic (unsigned int cpp_tgt, unsigned int cpp_act,
unsigned int cpp_tok, unsigned int cpp_len,
const nfp_cmd_mnemonic * mnemonics,
size_t mnemonics_cnt)
{
nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
const nfp_cmd_mnemonic *cmd = NULL;
cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
if (!cmd)
return NULL;
/* Make sure we backtrack to the first entry that still matches the three
bsearched fields - then we simply iterate and compare cpp_len. */
while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
--cmd;
/* Now compare by cpp_len and make sure we stay in range. */
for (; (cmd < (mnemonics + mnemonics_cnt))
&& (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
{
if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
return cmd->mnemonic;
}
return NULL;
}
/* NFP-32xx (ME Version 2.7). */
static int
nfp_me27_print_cmd (uint64_t instr, int third_party_32bit,
int num_ctx, struct disassemble_info *dinfo)
{
unsigned int srcA = _BF (instr, 7, 0);
unsigned int ctxswap_defer = _BF (instr, 9, 8);
unsigned int srcB = _BF (instr, 17, 10);
unsigned int token = _BF (instr, 19, 18);
unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
unsigned int cpp_len = _BF (instr, 27, 25);
unsigned int sig = _BF (instr, 31, 28);
unsigned int tgtcmd = _BF (instr, 38, 32);
unsigned int indref = _BTST (instr, 41);
unsigned int mode = _BF (instr, 44, 42);
bool err = false;
int cpp_target = -1;
int cpp_action = -1;
const char *mnemonic = NULL;
unsigned int imm;
unsigned int valBA;
int visswap = ((mode == 1) || (mode == 3));
imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
valBA = (srcB << 8) | srcA;
if (mode == 6)
{
token = 0;
sig = 0;
xfer = 0;
}
/* Convert tgtcmd to action/token tuple. */
if (_BF (tgtcmd, 6, 5) == 0x0)
{
switch (_BF (tgtcmd, 4, 2))
{
case 0:
cpp_target = NFP_3200_CPPTGT_CAP;
dinfo->fprintf_func (dinfo->stream, "cap[");
break;
case 1:
cpp_target = NFP_3200_CPPTGT_MSF0;
dinfo->fprintf_func (dinfo->stream, "msf0[");
break;
case 2:
cpp_target = NFP_3200_CPPTGT_MSF1;
dinfo->fprintf_func (dinfo->stream, "msf1[");
break;
case 3:
cpp_target = NFP_3200_CPPTGT_PCIE;
dinfo->fprintf_func (dinfo->stream, "pcie[");
break;
case 4:
cpp_target = NFP_3200_CPPTGT_HASH;
break;
case 5:
cpp_target = NFP_3200_CPPTGT_CRYPTO;
dinfo->fprintf_func (dinfo->stream, "crypto[");
break;
case 6:
cpp_target = NFP_3200_CPPTGT_ARM;
dinfo->fprintf_func (dinfo->stream, "arm[");
break;
case 7:
cpp_target = NFP_3200_CPPTGT_CT;
dinfo->fprintf_func (dinfo->stream, "ct[");
break;
}
cpp_action = _BF (tgtcmd, 1, 0);
}
else
{
switch (_BF (tgtcmd, 6, 4))
{
case 2:
cpp_target = NFP_3200_CPPTGT_GS;
dinfo->fprintf_func (dinfo->stream, "scratch[");
break;
case 3:
cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM. */
dinfo->fprintf_func (dinfo->stream, "sram[");
break;
case 4:
case 5:
cpp_target = NFP_3200_CPPTGT_MU;
dinfo->fprintf_func (dinfo->stream, "mem[");
break;
case 6:
case 7:
cpp_target = NFP_3200_CPPTGT_CLS;
dinfo->fprintf_func (dinfo->stream, "cls[");
break;
}
cpp_action = _BF (tgtcmd, 3, 0);
}
if (cpp_target < 0)
{
dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
cpp_target, cpp_action, token);
return _NFP_ERR_CONT;
}
mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
nfp_me27_mnemonics,
ARRAY_SIZE (nfp_me27_mnemonics));
if (!mnemonic)
{
dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
cpp_target, cpp_action, token);
return _NFP_ERR_CONT;
}
if (cpp_target == NFP_3200_CPPTGT_HASH)
{
dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
mnemonic, xfer, cpp_len);
goto print_opt_toks;
}
dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
if (visswap)
{
unsigned int tmp = srcA;
srcA = srcB;
srcB = tmp;
}
switch (mode)
{
case 0: /* (A << 8) + B. */
case 1: /* (B << 8) + A. */
dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
err = err
|| !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);