binutils/SOURCES/binutils-nfp.patch

5428 lines
220 KiB
Diff
Raw Normal View History

2020-02-04 08:38:29 +00:00
# Add support for disassembling NFP binaries. (#1644391)
diff -rup binutils.orig/bfd/archures.c binutils-2.30/bfd/archures.c
--- binutils.orig/bfd/archures.c 2019-03-07 13:21:14.246464815 +0000
+++ binutils-2.30/bfd/archures.c 2019-03-07 14:44:05.704268413 +0000
@@ -537,6 +537,9 @@ DESCRIPTION
.#define bfd_mach_wasm32 1
. bfd_arch_pru, {* PRU. *}
.#define bfd_mach_pru 0
+. bfd_arch_nfp, {* Netronome Flow Processor *}
+.#define bfd_mach_nfp3200 0x3200
+.#define bfd_mach_nfp6000 0x6000
. bfd_arch_last
. };
*/
@@ -632,6 +635,7 @@ extern const bfd_arch_info_type bfd_ft32
extern const bfd_arch_info_type bfd_msp430_arch;
extern const bfd_arch_info_type bfd_mt_arch;
extern const bfd_arch_info_type bfd_nds32_arch;
+extern const bfd_arch_info_type bfd_nfp_arch;
extern const bfd_arch_info_type bfd_nios2_arch;
extern const bfd_arch_info_type bfd_ns32k_arch;
extern const bfd_arch_info_type bfd_or1k_arch;
@@ -727,6 +731,7 @@ static const bfd_arch_info_type * const
&bfd_msp430_arch,
&bfd_mt_arch,
&bfd_nds32_arch,
+ &bfd_nfp_arch,
&bfd_nios2_arch,
&bfd_ns32k_arch,
&bfd_or1k_arch,
diff -rup binutils.orig/bfd/bfd-in2.h binutils-2.30/bfd/bfd-in2.h
--- binutils.orig/bfd/bfd-in2.h 2019-03-07 13:21:14.244464831 +0000
+++ binutils-2.30/bfd/bfd-in2.h 2019-03-07 14:44:05.704268413 +0000
@@ -2399,6 +2399,9 @@ enum bfd_architecture
#define bfd_mach_wasm32 1
bfd_arch_pru, /* PRU. */
#define bfd_mach_pru 0
+ bfd_arch_nfp, /* Netronome Flow Processor */
+#define bfd_mach_nfp3200 0x3200
+#define bfd_mach_nfp6000 0x6000
bfd_arch_last
};
diff -rup binutils.orig/bfd/config.bfd binutils-2.30/bfd/config.bfd
--- binutils.orig/bfd/config.bfd 2019-03-07 13:21:14.245464823 +0000
+++ binutils-2.30/bfd/config.bfd 2019-03-07 14:44:05.705268406 +0000
@@ -181,6 +181,7 @@ m88*) targ_archs=bfd_m88k_arch ;;
microblaze*) targ_archs=bfd_microblaze_arch ;;
mips*) targ_archs=bfd_mips_arch ;;
nds32*) targ_archs=bfd_nds32_arch ;;
+nfp) targ_archs=bfd_nfp_arch ;;
nios2*) targ_archs=bfd_nios2_arch ;;
or1k*|or1knd*) targ_archs=bfd_or1k_arch ;;
pdp11*) targ_archs=bfd_pdp11_arch ;;
@@ -1277,6 +1278,12 @@ case "${targ}" in
targ_selvecs=nds32_elf32_le_vec
;;
+#ifdef BFD64
+ nfp-*-*)
+ targ_defvec=nfp_elf64_vec
+ ;;
+#endif
+
ns32k-pc532-mach* | ns32k-pc532-ux*)
targ_defvec=ns32k_aout_pc532mach_vec
targ_underscore=yes
diff -rup binutils.orig/bfd/configure binutils-2.30/bfd/configure
--- binutils.orig/bfd/configure 2019-03-07 13:21:14.244464831 +0000
+++ binutils-2.30/bfd/configure 2019-03-07 14:44:05.706268397 +0000
@@ -14526,6 +14526,7 @@ do
nds32_elf32_le_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
nds32_elf32_linux_be_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
nds32_elf32_linux_le_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
+ nfp_elf64_vec) tb="$tb elf64-nfp.lo elf64.lo $elf" ;;
nios2_elf32_be_vec) tb="$tb elf32-nios2.lo elf32.lo $elf" ;;
nios2_elf32_le_vec) tb="$tb elf32-nios2.lo elf32.lo $elf" ;;
ns32k_aout_pc532mach_vec) tb="$tb pc532-mach.lo aout-ns32k.lo" ;;
diff -rup binutils.orig/bfd/configure.ac binutils-2.30/bfd/configure.ac
--- binutils.orig/bfd/configure.ac 2019-03-07 13:21:14.264464675 +0000
+++ binutils-2.30/bfd/configure.ac 2019-03-07 14:44:05.706268397 +0000
@@ -584,6 +584,7 @@ do
nds32_elf32_le_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
nds32_elf32_linux_be_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
nds32_elf32_linux_le_vec) tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
+ nfp_elf64_vec) tb="$tb elf64-nfp.lo elf64.lo $elf" ;;
nios2_elf32_be_vec) tb="$tb elf32-nios2.lo elf32.lo $elf" ;;
nios2_elf32_le_vec) tb="$tb elf32-nios2.lo elf32.lo $elf" ;;
ns32k_aout_pc532mach_vec) tb="$tb pc532-mach.lo aout-ns32k.lo" ;;
diff -rup binutils.orig/bfd/elf-bfd.h binutils-2.30/bfd/elf-bfd.h
--- binutils.orig/bfd/elf-bfd.h 2019-03-07 13:21:14.254464753 +0000
+++ binutils-2.30/bfd/elf-bfd.h 2019-03-07 14:44:05.706268397 +0000
@@ -1668,6 +1668,7 @@ struct bfd_elf_section_data
#define elf_linked_to_section(sec) (elf_section_data(sec)->linked_to)
#define elf_section_type(sec) (elf_section_data(sec)->this_hdr.sh_type)
#define elf_section_flags(sec) (elf_section_data(sec)->this_hdr.sh_flags)
+#define elf_section_info(sec) (elf_section_data(sec)->this_hdr.sh_info)
#define elf_group_name(sec) (elf_section_data(sec)->group.name)
#define elf_group_id(sec) (elf_section_data(sec)->group.id)
#define elf_next_in_group(sec) (elf_section_data(sec)->next_in_group)
diff -rup binutils.orig/bfd/Makefile.am binutils-2.30/bfd/Makefile.am
--- binutils.orig/bfd/Makefile.am 2019-03-07 13:21:14.244464831 +0000
+++ binutils-2.30/bfd/Makefile.am 2019-03-07 14:44:05.703268422 +0000
@@ -140,6 +140,7 @@ ALL_MACHINES = \
cpu-msp430.lo \
cpu-mt.lo \
cpu-nds32.lo \
+ cpu-nfp.lo \
cpu-nios2.lo \
cpu-ns32k.lo \
cpu-or1k.lo \
@@ -230,6 +231,7 @@ ALL_MACHINES_CFILES = \
cpu-msp430.c \
cpu-mt.c \
cpu-nds32.c \
+ cpu-nfp.c \
cpu-ns32k.c \
cpu-nios2.c \
cpu-or1k.c \
@@ -692,6 +694,7 @@ BFD64_BACKENDS = \
elf64-mips.lo \
elfxx-mips.lo \
elf64-mmix.lo \
+ elf64-nfp.lo \
elf64-ppc.lo \
elf32-riscv.lo \
elf64-riscv.lo \
@@ -731,6 +734,7 @@ BFD64_BACKENDS_CFILES = \
elf64-ia64-vms.c \
elf64-mips.c \
elf64-mmix.c \
+ elf64-nfp.c \
elf64-ppc.c \
elf64-s390.c \
elf64-sh64.c \
diff -rup binutils.orig/bfd/Makefile.in binutils-2.30/bfd/Makefile.in
--- binutils.orig/bfd/Makefile.in 2019-03-07 13:21:14.245464823 +0000
+++ binutils-2.30/bfd/Makefile.in 2019-03-07 14:44:05.704268413 +0000
@@ -474,6 +474,7 @@ ALL_MACHINES = \
cpu-msp430.lo \
cpu-mt.lo \
cpu-nds32.lo \
+ cpu-nfp.lo \
cpu-nios2.lo \
cpu-ns32k.lo \
cpu-or1k.lo \
@@ -564,6 +565,7 @@ ALL_MACHINES_CFILES = \
cpu-msp430.c \
cpu-mt.c \
cpu-nds32.c \
+ cpu-nfp.c \
cpu-ns32k.c \
cpu-nios2.c \
cpu-or1k.c \
@@ -1028,6 +1030,7 @@ BFD64_BACKENDS = \
elf64-mips.lo \
elfxx-mips.lo \
elf64-mmix.lo \
+ elf64-nfp.lo \
elf64-ppc.lo \
elf32-riscv.lo \
elf64-riscv.lo \
@@ -1067,6 +1070,7 @@ BFD64_BACKENDS_CFILES = \
elf64-ia64-vms.c \
elf64-mips.c \
elf64-mmix.c \
+ elf64-nfp.c \
elf64-ppc.c \
elf64-s390.c \
elf64-sh64.c \
@@ -1430,6 +1434,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-msp430.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-mt.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-nds32.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-nfp.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-nios2.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-ns32k.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-or1k.Plo@am__quote@
@@ -1563,6 +1568,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ia64.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-mips.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-mmix.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-nfp.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ppc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-riscv.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-s390.Plo@am__quote@
diff -rup binutils.orig/bfd/targets.c binutils-2.30/bfd/targets.c
--- binutils.orig/bfd/targets.c 2019-03-07 13:21:14.261464698 +0000
+++ binutils-2.30/bfd/targets.c 2019-03-07 14:49:56.512460817 +0000
@@ -788,6 +788,7 @@ extern const bfd_target nds32_elf32_be_v
extern const bfd_target nds32_elf32_le_vec;
extern const bfd_target nds32_elf32_linux_be_vec;
extern const bfd_target nds32_elf32_linux_le_vec;
+extern const bfd_target nfp_elf64_vec;
extern const bfd_target nios2_elf32_be_vec;
extern const bfd_target nios2_elf32_le_vec;
extern const bfd_target ns32k_aout_pc532mach_vec;
@@ -1274,6 +1275,10 @@ static const bfd_target * const _bfd_tar
&nds32_elf32_linux_be_vec,
&nds32_elf32_linux_le_vec,
+#ifdef BFD64
+ &nfp_elf64_vec,
+#endif
+
&nios2_elf32_be_vec,
&nios2_elf32_le_vec,
diff -rup binutils.orig/binutils/NEWS binutils-2.30/binutils/NEWS
--- binutils.orig/binutils/NEWS 2019-03-07 13:21:13.399471393 +0000
+++ binutils-2.30/binutils/NEWS 2019-03-07 14:44:05.712268349 +0000
@@ -1,5 +1,7 @@
-*- text -*-
+* Add support for disassembling netronome Flow Processor (NFP) firmware files.
+
Changes in 2.30:
* Add --debug-dump=links option to readelf and --dwarf=links option to objdump
diff -rup binutils.orig/binutils/readelf.c binutils-2.30/binutils/readelf.c
--- binutils.orig/binutils/readelf.c 2019-03-07 13:21:13.417471253 +0000
+++ binutils-2.30/binutils/readelf.c 2019-03-07 14:44:05.715268325 +0000
@@ -131,6 +131,7 @@
#include "elf/mt.h"
#include "elf/msp430.h"
#include "elf/nds32.h"
+#include "elf/nfp.h"
#include "elf/nios2.h"
#include "elf/or1k.h"
#include "elf/pj.h"
@@ -765,6 +766,7 @@ guess_is_rela (unsigned int e_machine)
case EM_CYGNUS_M32R:
case EM_SCORE:
case EM_XGATE:
+ case EM_NFP:
return FALSE;
/* Targets that use RELA relocations. */
@@ -1549,6 +1551,13 @@ dump_relocations (Filedata * fi
case EM_TI_PRU:
rtype = elf_pru_reloc_type (type);
break;
+
+ case EM_NFP:
+ if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
+ rtype = elf_nfp3200_reloc_type (type);
+ else
+ rtype = elf_nfp_reloc_type (type);
+ break;
}
if (rtype == NULL)
@@ -2461,6 +2470,7 @@ get_machine_name (unsigned e_machine)
case EM_RISCV: return "RISC-V";
case EM_LANAI: return "Lanai 32-bit processor";
case EM_BPF: return "Linux BPF";
+ case EM_NFP: return "Netronome Flow Processor";
/* Large numbers... */
case EM_MT: return "Morpho Techologies MT processor";
@@ -3423,6 +3433,18 @@ get_machine_flags (Filedata * filedata,
decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
break;
+ case EM_NFP:
+ switch (EF_NFP_MACH (e_flags))
+ {
+ case E_NFP_MACH_3200:
+ strcat (buf, ", NFP-32xx");
+ break;
+ case E_NFP_MACH_6000:
+ strcat (buf, ", NFP-6xxx");
+ break;
+ }
+ break;
+
case EM_RISCV:
if (e_flags & EF_RISCV_RVC)
strcat (buf, ", RVC");
@@ -4118,6 +4140,18 @@ get_msp430x_section_type_name (unsigned
}
static const char *
+get_nfp_section_type_name (unsigned int sh_type)
+{
+ switch (sh_type)
+ {
+ case SHT_NFP_MECONFIG: return "NFP_MECONFIG";
+ case SHT_NFP_INITREG: return "NFP_INITREG";
+ case SHT_NFP_UDEBUG: return "NFP_UDEBUG";
+ default: return NULL;
+ }
+}
+
+static const char *
get_v850_section_type_name (unsigned int sh_type)
{
switch (sh_type)
@@ -4204,6 +4238,9 @@ get_section_type_name (Filedata * fileda
case EM_MSP430:
result = get_msp430x_section_type_name (sh_type);
break;
+ case EM_NFP:
+ result = get_nfp_section_type_name (sh_type);
+ break;
case EM_V800:
case EM_V850:
case EM_CYGNUS_V850:
diff -rup binutils.orig/config.sub binutils-2.30/config.sub
--- binutils.orig/config.sub 2019-03-07 13:21:14.229464947 +0000
+++ binutils-2.30/config.sub 2019-03-07 14:53:14.241881286 +0000
@@ -293,6 +293,7 @@ case $basic_machine in
| mt \
| msp430 \
| nds32 | nds32le | nds32be \
+ | nfp \
| nios | nios2 | nios2eb | nios2el \
| ns16k | ns32k \
| open8 | or1k | or1knd | or32 \
diff -rup binutils.orig/include/dis-asm.h binutils-2.30/include/dis-asm.h
--- binutils.orig/include/dis-asm.h 2019-03-07 13:21:14.298464411 +0000
+++ binutils-2.30/include/dis-asm.h 2019-03-07 14:44:05.716268317 +0000
@@ -255,6 +255,7 @@ extern disassembler_ftype cris_get_disas
extern void print_aarch64_disassembler_options (FILE *);
extern void print_i386_disassembler_options (FILE *);
extern void print_mips_disassembler_options (FILE *);
+extern void print_nfp_disassembler_options (FILE *);
extern void print_ppc_disassembler_options (FILE *);
extern void print_riscv_disassembler_options (FILE *);
extern void print_arm_disassembler_options (FILE *);
diff -rup binutils.orig/include/elf/common.h binutils-2.30/include/elf/common.h
--- binutils.orig/include/elf/common.h 2019-03-07 13:21:14.295464435 +0000
+++ binutils-2.30/include/elf/common.h 2019-03-07 14:44:05.716268317 +0000
@@ -338,6 +338,7 @@
#define EM_RISCV 243 /* RISC-V */
#define EM_LANAI 244 /* Lanai 32-bit processor. */
#define EM_BPF 247 /* Linux BPF in-kernel virtual machine. */
+#define EM_NFP 250 /* Netronome Flow Processor. */
/* If it is necessary to assign new unofficial EM_* values, please pick large
random numbers (0x8523, 0xa7f2, etc.) to minimize the chances of collision
diff -rup binutils.orig/opcodes/configure binutils-2.30/opcodes/configure
--- binutils.orig/opcodes/configure 2019-03-07 13:21:13.445471036 +0000
+++ binutils-2.30/opcodes/configure 2019-03-07 14:44:05.718268301 +0000
@@ -12700,6 +12700,7 @@ if test x${all_targets} = xfalse ; then
bfd_mt_arch) ta="$ta mt-asm.lo mt-desc.lo mt-dis.lo mt-ibld.lo mt-opc.lo" using_cgen=yes ;;
bfd_msp430_arch) ta="$ta msp430-dis.lo msp430-decode.lo" ;;
bfd_nds32_arch) ta="$ta nds32-asm.lo nds32-dis.lo" ;;
+ bfd_nfp_arch) ta="$ta nfp-dis.lo" ;;
bfd_nios2_arch) ta="$ta nios2-dis.lo nios2-opc.lo" ;;
bfd_ns32k_arch) ta="$ta ns32k-dis.lo" ;;
bfd_or1k_arch) ta="$ta or1k-asm.lo or1k-desc.lo or1k-dis.lo or1k-ibld.lo or1k-opc.lo" using_cgen=yes ;;
diff -rup binutils.orig/opcodes/configure.ac binutils-2.30/opcodes/configure.ac
--- binutils.orig/opcodes/configure.ac 2019-03-07 13:21:13.445471036 +0000
+++ binutils-2.30/opcodes/configure.ac 2019-03-07 14:44:05.718268301 +0000
@@ -300,6 +300,7 @@ if test x${all_targets} = xfalse ; then
bfd_mt_arch) ta="$ta mt-asm.lo mt-desc.lo mt-dis.lo mt-ibld.lo mt-opc.lo" using_cgen=yes ;;
bfd_msp430_arch) ta="$ta msp430-dis.lo msp430-decode.lo" ;;
bfd_nds32_arch) ta="$ta nds32-asm.lo nds32-dis.lo" ;;
+ bfd_nfp_arch) ta="$ta nfp-dis.lo" ;;
bfd_nios2_arch) ta="$ta nios2-dis.lo nios2-opc.lo" ;;
bfd_ns32k_arch) ta="$ta ns32k-dis.lo" ;;
bfd_or1k_arch) ta="$ta or1k-asm.lo or1k-desc.lo or1k-dis.lo or1k-ibld.lo or1k-opc.lo" using_cgen=yes ;;
diff -rup binutils.orig/opcodes/disassemble.c binutils-2.30/opcodes/disassemble.c
--- binutils.orig/opcodes/disassemble.c 2019-03-07 13:21:13.438471090 +0000
+++ binutils-2.30/opcodes/disassemble.c 2019-03-07 14:44:05.718268301 +0000
@@ -69,6 +69,7 @@
#define ARCH_mt
#define ARCH_msp430
#define ARCH_nds32
+#define ARCH_nfp
#define ARCH_nios2
#define ARCH_ns32k
#define ARCH_or1k
@@ -306,6 +307,11 @@ disassembler (enum bfd_architecture a,
disassemble = print_insn_nds32;
break;
#endif
+#ifdef ARCH_nfp
+ case bfd_arch_nfp:
+ disassemble = print_insn_nfp;
+ break;
+#endif
#ifdef ARCH_ns32k
case bfd_arch_ns32k:
disassemble = print_insn_ns32k;
@@ -576,6 +582,9 @@ disassembler_usage (FILE *stream ATTRIBU
#ifdef ARCH_mips
print_mips_disassembler_options (stream);
#endif
+#ifdef ARCH_nfp
+ print_nfp_disassembler_options (stream);
+#endif
#ifdef ARCH_powerpc
print_ppc_disassembler_options (stream);
#endif
diff -rup binutils.orig/opcodes/disassemble.h binutils-2.30/opcodes/disassemble.h
--- binutils.orig/opcodes/disassemble.h 2019-03-07 13:21:13.444471043 +0000
+++ binutils-2.30/opcodes/disassemble.h 2019-03-07 14:44:05.718268301 +0000
@@ -77,6 +77,7 @@ extern int print_insn_moxie (bfd_vma, d
extern int print_insn_msp430 (bfd_vma, disassemble_info *);
extern int print_insn_mt (bfd_vma, disassemble_info *);
extern int print_insn_nds32 (bfd_vma, disassemble_info *);
+extern int print_insn_nfp (bfd_vma, disassemble_info *);
extern int print_insn_ns32k (bfd_vma, disassemble_info *);
extern int print_insn_or1k (bfd_vma, disassemble_info *);
extern int print_insn_pdp11 (bfd_vma, disassemble_info *);
diff -rup binutils.orig/opcodes/Makefile.am binutils-2.30/opcodes/Makefile.am
--- binutils.orig/opcodes/Makefile.am 2019-03-07 13:21:13.445471036 +0000
+++ binutils-2.30/opcodes/Makefile.am 2019-03-07 14:44:05.717268309 +0000
@@ -209,6 +209,7 @@ TARGET_LIBOPCODES_CFILES = \
mt-opc.c \
nds32-asm.c \
nds32-dis.c \
+ nfp-dis.c \
nios2-dis.c \
nios2-opc.c \
ns32k-dis.c \
diff -rup binutils.orig/opcodes/Makefile.in binutils-2.30/opcodes/Makefile.in
--- binutils.orig/opcodes/Makefile.in 2019-03-07 13:21:13.426471183 +0000
+++ binutils-2.30/opcodes/Makefile.in 2019-03-07 14:44:05.717268309 +0000
@@ -511,6 +511,7 @@ TARGET_LIBOPCODES_CFILES = \
mt-opc.c \
nds32-asm.c \
nds32-dis.c \
+ nfp-dis.c \
nios2-dis.c \
nios2-opc.c \
ns32k-dis.c \
@@ -920,6 +921,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mt-opc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nds32-asm.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nds32-dis.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nfp-dis.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nios2-dis.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nios2-opc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ns32k-dis.Plo@am__quote@
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ binutils-2.30/bfd/cpu-nfp.c 2019-03-07 14:44:05.706268397 +0000
@@ -0,0 +1,62 @@
+/* BFD library support routines for the NFP.
+ Copyright (C) 2017 Free Software Foundation, Inc.
+ Contributed by Francois H. Theron <francois.theron@netronome.com>
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program 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 of the License, or
+ (at your option) any later version.
+
+ This program 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. */
+
+#include "sysdep.h"
+#include "bfd.h"
+#include "libbfd.h"
+
+static const bfd_arch_info_type *
+bfd_nfp_compatible (const bfd_arch_info_type * a,
+ const bfd_arch_info_type * b)
+{
+ if (a->arch != b->arch)
+ return NULL;
+
+ if (a->mach != b->mach)
+ return NULL;
+
+ return a;
+}
+
+#define N(machine, print, default, next) \
+{ \
+ 32, \
+ 64, \
+ 8, \
+ bfd_arch_nfp, \
+ machine, \
+ "nfp", \
+ print, \
+ 3, \
+ default, \
+ bfd_nfp_compatible, \
+ bfd_default_scan, \
+ bfd_arch_default_fill, \
+ next \
+}
+
+static const bfd_arch_info_type arch_info_struct[] =
+{
+ N (bfd_mach_nfp3200, "NFP-32xx", FALSE, NULL)
+};
+
+const bfd_arch_info_type bfd_nfp_arch =
+ N (bfd_mach_nfp6000, "NFP-6xxx", TRUE, &arch_info_struct[0]);
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ binutils-2.30/bfd/elf64-nfp.c 2019-03-07 14:44:05.706268397 +0000
@@ -0,0 +1,276 @@
+/* NFP-specific support for 64-bit ELF
+ Copyright (C) 2017-2018 Free Software Foundation, Inc.
+ Contributed by Francois H. Theron <francois.theron@netronome.com>
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program 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 of the License, or
+ (at your option) any later version.
+
+ This program 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. */
+
+#include "sysdep.h"
+#include "bfd.h"
+#include "libbfd.h"
+#include "elf-bfd.h"
+#include "elf/nfp.h"
+#include "bfd_stdint.h"
+
+
+static bfd_reloc_status_type
+elf64_nfp_reloc (bfd * abfd ATTRIBUTE_UNUSED,
+ arelent * reloc_entry,
+ asymbol * symbol,
+ void *data ATTRIBUTE_UNUSED,
+ asection * input_section,
+ bfd * output_bfd,
+ char **error_message ATTRIBUTE_UNUSED);
+
+/* We don't actually apply any relocations in this toolset
+ so we make them all do nothing, but at least display useful
+ names.
+ Most of these are mainly used by the NFP toolchain to resolve things
+ before the final ELF file is created. */
+static reloc_howto_type elf_nfp_howto_table[] =
+{
+ HOWTO (R_NFP_NOTYPE, /* Type. */
+ 0, /* Rightshift. */
+ 3, /* Size. */
+ 0, /* Bitsize. */
+ FALSE, /* PC_relative. */
+ 0, /* Bitpos. */
+ complain_overflow_dont,/* Complain_on_overflow. */
+ elf64_nfp_reloc, /* Special_function. */
+ "R_NFP_NOTYPE", /* Name. */
+ FALSE, /* Partial_inplace. */
+ 0, /* Src_mask. */
+ 0, /* Dst_mask. */
+ FALSE), /* PCrel_offset. */
+ HOWTO (R_NFP_W32LE, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W32LE",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_SRC8_A, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_SRC8_A",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_SRC8_B, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_SRC8_B",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_IMMED8_I, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_IMMED8_I",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_SC, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_SC",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_IMMED_LO16_I_A, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_IMMED_LO16_I_A",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_IMMED_LO16_I_B, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_IMMED_LO16_I_B",
+ TRUE, 0, 0, FALSE),
+ HOWTO (R_NFP_SRC7_B, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_SRC7_B",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_SRC7_A, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_SRC7_A",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_SRC8_I_B, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_SRC8_I_B",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_SRC8_I_A, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_SRC8_I_A",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_IMMED_HI16_I_A, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_IMMED_HI16_I_A",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_IMMED_HI16_I_B, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_IMMED_HI16_I_B",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W64LE, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W64LE",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_SH_INFO, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_SH_INFO",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W32BE, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W32BE",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W64BE, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W64BE",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W32_29_24, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W32_29_24",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W32LE_AND, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W32LE_AND",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W32BE_AND, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W32BE_AND",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W32LE_OR, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W32LE_OR",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W32BE_OR, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W32BE_OR",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W64LE_AND, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W64LE_AND",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W64BE_AND, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W64BE_AND",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W64LE_OR, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W64LE_OR",
+ FALSE, 0, 0, FALSE),
+ HOWTO (R_NFP_W64BE_OR, 0, 3, 0, FALSE, 0,
+ complain_overflow_dont, elf64_nfp_reloc,
+ "R_NFP_W64BE_OR",
+ FALSE, 0, 0, FALSE)
+};
+
+static bfd_boolean
+elf64_nfp_object_p (bfd * abfd)
+{
+ /* If the e_machine value is one of the unofficial ones, we convert
+ it first and set e_flags accordingly for later consistency. */
+ if (elf_elfheader (abfd)->e_machine == E_NFP_MACH_3200)
+ {
+ elf_elfheader (abfd)->e_machine = EM_NFP;
+ elf_elfheader (abfd)->e_flags &= ~EF_NFP_SET_MACH (~0);
+ elf_elfheader (abfd)->e_flags |= EF_NFP_SET_MACH (E_NFP_MACH_3200);
+ }
+ else if (elf_elfheader (abfd)->e_machine == E_NFP_MACH_6000)
+ {
+ elf_elfheader (abfd)->e_machine = EM_NFP;
+ elf_elfheader (abfd)->e_flags &= ~EF_NFP_SET_MACH (~0);
+ elf_elfheader (abfd)->e_flags |= EF_NFP_SET_MACH (E_NFP_MACH_6000);
+ }
+
+ if (elf_elfheader (abfd)->e_machine == EM_NFP)
+ {
+ int e_mach = EF_NFP_MACH (elf_elfheader (abfd)->e_flags);
+
+ switch (e_mach)
+ {
+ case E_NFP_MACH_3200:
+ case E_NFP_MACH_6000:
+ if (!bfd_default_set_arch_mach (abfd, bfd_arch_nfp, e_mach))
+ return FALSE;
+ default:
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+static bfd_boolean
+elf64_nfp_section_from_shdr (bfd * abfd,
+ Elf_Internal_Shdr * hdr,
+ const char *name, int shindex)
+{
+ switch (hdr->sh_type)
+ {
+ case SHT_NFP_INITREG:
+ case SHT_NFP_MECONFIG:
+ case SHT_NFP_UDEBUG:
+ return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex);
+ default:
+ return FALSE;
+ }
+}
+
+bfd_reloc_status_type
+elf64_nfp_reloc (bfd * abfd ATTRIBUTE_UNUSED,
+ arelent * reloc_entry ATTRIBUTE_UNUSED,
+ asymbol * symbol ATTRIBUTE_UNUSED,
+ void *data ATTRIBUTE_UNUSED,
+ asection * input_section ATTRIBUTE_UNUSED,
+ bfd * output_bfd ATTRIBUTE_UNUSED,
+ char **error_message ATTRIBUTE_UNUSED)
+{
+ return bfd_reloc_ok;
+}
+
+static bfd_boolean
+elf64_nfp_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED,
+ arelent * cache_ptr, Elf_Internal_Rela * dst)
+{
+ unsigned int r_type;
+
+ r_type = ELF64_R_TYPE (dst->r_info);
+ if (r_type >= R_NFP_MAX)
+ {
+ /* xgettext:c-format */
+ _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
+ abfd, r_type);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+ cache_ptr->howto = &elf_nfp_howto_table[r_type];
+ return TRUE;
+}
+
+static reloc_howto_type *
+elf64_nfp_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
+ bfd_reloc_code_real_type code ATTRIBUTE_UNUSED)
+{
+ return NULL;
+}
+
+static reloc_howto_type *
+elf64_nfp_reloc_name_lookup (bfd * abfd ATTRIBUTE_UNUSED,
+ const char *r_name ATTRIBUTE_UNUSED)
+{
+ return NULL;
+}
+
+#define ELF_ARCH bfd_arch_nfp
+#define ELF_MACHINE_CODE EM_NFP
+#define ELF_MACHINE_ALT1 E_NFP_MACH_6000
+#define ELF_MACHINE_ALT2 E_NFP_MACH_3200
+#define ELF_MAXPAGESIZE 1
+#define TARGET_LITTLE_NAME "elf64-nfp"
+#define TARGET_LITTLE_SYM nfp_elf64_vec
+
+#define elf_backend_object_p elf64_nfp_object_p
+#define elf_backend_section_from_shdr elf64_nfp_section_from_shdr
+#define elf_info_to_howto elf64_nfp_info_to_howto
+#define bfd_elf64_bfd_reloc_type_lookup elf64_nfp_reloc_type_lookup
+#define bfd_elf64_bfd_reloc_name_lookup elf64_nfp_reloc_name_lookup
+
+#include "elf64-target.h"
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ binutils-2.30/binutils/testsuite/binutils-all/nfp/objdump.exp 2019-03-07 14:44:05.715268325 +0000
@@ -0,0 +1,52 @@
+# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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.
+
+if {![istarget nfp*-*-*]} {
+ return
+}
+
+if {![is_remote host] && [which $OBJDUMP] == 0} then {
+ perror "$OBJDUMP does not exist"
+ return
+}
+
+send_user "Version [binutil_version $OBJDUMP]"
+
+set outfile "tmpdir/dump.out"
+
+set testname "NFP dissasembler NFP-6xxx instructions"
+set dumpfile "$srcdir/$subdir/test1.d"
+remote_exec host "${OBJDUMP} -d $srcdir/$subdir/test1_nfp6000.nffw" "" "/dev/null" "$outfile"
+if { [regexp_diff "${outfile}" "${dumpfile}"] } then {
+ fail $testname
+ return
+}
+
+set testname "NFP dissasembler options: no-pc,ctx4"
+set dumpfile "$srcdir/$subdir/test2_no-pc_ctx4.d"
+remote_exec host "${OBJDUMP} -M no-pc,ctx4 -d $srcdir/$subdir/test2_nfp6000.nffw" "" "/dev/null" "$outfile"
+if { [regexp_diff "${outfile}" "${dumpfile}"] } then {
+ fail $testname
+ return
+}
+
+set testname "NFP dissasembler options: ctx8"
+set dumpfile "$srcdir/$subdir/test2_ctx8.d"
+remote_exec host "${OBJDUMP} -M ctx8 -d $srcdir/$subdir/test2_nfp6000.nffw" "" "/dev/null" "$outfile"
+if { [regexp_diff "${outfile}" "${dumpfile}"] } then {
+ fail $testname
+ return
+}
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ binutils-2.30/binutils/testsuite/binutils-all/nfp/test1.d 2019-03-07 14:47:35.561586781 +0000
@@ -0,0 +1,997 @@
+
+.*: file format elf64-nfp
+
+
+Disassembly of section \.text\.i32\.me0:
+
+0000000000000000 <\.text\.i32\.me0>:
+ 0: 000540f0012cd000 \.0 immed\[gprA_0, 0x1234\]
+ 8: 0002c0f0012cd280 \.1 immed\[n\$reg_0, 0x1234\]
+ 10: 000220f0012cd281 \.2 immed\[n\$reg_1, 0x1234\]
+ 18: 000660f0012cd200 \.3 immed\[\*l\$index0, 0x1234\]
+ 20: 0007c0f0012cd220 \.4 immed\[\*l\$index1, 0x1234\]
+ 28: 000fa0f0012cd230 \.5 immed\[\*l\$index1\+\+, 0x1234\]
+ 30: 000f40f0012cd231 \.6 immed\[\*l\$index1--, 0x1234\]
+ 38: 0008c8f0012cd200 \.7 immed\[\*l\$index2, 0x1234\]
+ 40: 0000a8f0012cd210 \.8 immed\[\*l\$index2\+\+, 0x1234\]
+ 48: 000048f0012cd211 \.9 immed\[\*l\$index2--, 0x1234\]
+ 50: 000968f0012cd220 \.10 immed\[\*l\$index3, 0x1234\]
+ 58: 0007e0f0012cd203 \.11 immed\[\*l\$index0\[3\], 0x1234\]
+ 60: 000540f0012cd225 \.12 immed\[\*l\$index1\[5\], 0x1234\]
+ 68: 000b28f0012cd207 \.13 immed\[\*l\$index2\[7\], 0x1234\]
+ 70: 000de8f0012cd229 \.14 immed\[\*l\$index3\[9\], 0x1234\]
+ 78: 000000f00ff003ff \.15 immed\[gprB_0, 0xffff\]
+ 80: 000d60f220000bff \.16 immed_b1\[gprB_2, 0xff\]
+ 88: 000f60f6200007ff \.17 immed_b3\[gprB_1, 0xff\]
+ 90: 000080f080000f00 \.18 immed\[gprB_3, 0xffffffff\]
+ 98: 000100f086600f77 \.19 immed\[gprB_3, 0xffff9988\]
+ a0: 000940f0012cd180 \.20 immed\[\$xfer_0, 0x1234\]
+ a8: 000a00f0043c8581 \.21 immed\[\$xfer_1, 0x4321\]
+ b0: 000180f0056de1ce \.22 immed\[\$xfer_30, 0x5678\]
+ b8: 0007c0f0400e8401 \.23 immed_w0\[gprA_1, 0xa1\]
+ c0: 000440f4400e8802 \.24 immed_w1\[gprA_2, 0xa2\]
+ c8: 000d00f4000e8c03 \.25 immed\[gprA_3, 0xa3, <<16\]
+ d0: 000520f001200334 \.26 immed\[gprB_0, 0x1234\]
+ d8: 000fa0f0400007b1 \.27 immed_w0\[gprB_1, 0xb1\]
+ e0: 000c20f440000bb2 \.28 immed_w1\[gprB_2, 0xb2\]
+ e8: 000560f400000fb3 \.29 immed\[gprB_3, 0xb3, <<16\]
+ f0: 000660f200000fb3 \.30 immed\[gprB_3, 0xb3, <<8\]
+ f8: 0001b0f200000fb3 \.31 immed\[gprB_3, 0xb3, <<8\], predicate_cc
+ 100: 0001c2f200000fb3 \.32 immed\[gprB_3, 0xb3, <<8\], gpr_wrboth
+ 108: 000ba0a0300c2f00 \.33 alu\[--, --, B, 0xb\]
+ 110: 0005a081f200da00 \.34 alu_shf\[--, --, B, 0x16, <<1\]
+ 118: 000be081d2018600 \.35 alu_shf\[--, --, B, 0x21, <<3\]
+ 120: 000240801201b200 \.36 alu_shf\[--, --, B, 0x2c, <<31\]
+ 128: 000fa081f800da00 \.37 alu_shf\[\$xfer_0, --, B, 0x16, <<1\]
+ 130: 0009e081f840da00 \.38 alu_shf\[\$xfer_4, --, B, 0x16, <<1\]
+ 138: 00006081fc80da00 \.39 alu_shf\[\$xfer_24, --, B, 0x16, <<1\]
+ 140: 000a2081fcf0da00 \.40 alu_shf\[\$xfer_31, --, B, 0x16, <<1\]
+ 148: 0004a0a0280c2f00 \.41 alu\[n\$reg_0, --, B, 0xb\]
+ 150: 0001e0a0281c2f00 \.42 alu\[n\$reg_1, --, B, 0xb\]
+ 158: 000880a0a00c2400 \.43 alu\[\*l\$index0, gprA_0, \+, 0x9\]
+ 160: 000100a0a43c2400 \.44 alu\[\*n\$index\+\+, gprA_0, \+, 0x9\]
+ 168: 000b208bc500a600 \.45 alu_shf\[\*l\$index0, gprA_0, OR, 0x9, <<4\]
+ 170: 000b00a0a20c2400 \.46 alu\[\*l\$index1, gprA_0, \+, 0x9\]
+ 178: 000740a0a30c2400 \.47 alu\[\*l\$index1\+\+, gprA_0, \+, 0x9\]
+ 180: 000200a0a31c2400 \.48 alu\[\*l\$index1--, gprA_0, \+, 0x9\]
+ 188: 000628a0a00c2400 \.49 alu\[\*l\$index2, gprA_0, \+, 0x9\]
+ 190: 000988aa210c2400 \.50 alu\[\*l\$index2\+\+, gprA_0, OR, 0x9\]
+ 198: 000f28a0a11c2400 \.51 alu\[\*l\$index2--, gprA_0, \+, 0x9\]
+ 1a0: 0005a8a0a20c2400 \.52 alu\[\*l\$index3, gprA_0, \+, 0x9\]
+ 1a8: 000480a0a03c2400 \.53 alu\[\*l\$index0\[3\], gprA_0, \+, 0x9\]
+ 1b0: 000800a0a25c2400 \.54 alu\[\*l\$index1\[5\], gprA_0, \+, 0x9\]
+ 1b8: 000c68a0a07c2400 \.55 alu\[\*l\$index2\[7\], gprA_0, \+, 0x9\]
+ 1c0: 000aa8a0a29c2400 \.56 alu\[\*l\$index3\[9\], gprA_0, \+, 0x9\]
+ 1c8: 000cc4b0c008a400 \.57 alu\[gprB_0, \*l\$index3\[9\], \+, gprA_0\]
+ 1d0: 000fe4b0c008c000 \.58 alu\[gprB_0, \*l\$index3\+\+, \+, gprA_0\]
+ 1d8: 000ac4b0c008c400 \.59 alu\[gprB_0, \*l\$index3--, \+, gprA_0\]
+ 1e0: 000bc4b080000229 \.60 alu\[gprB_0, \*l\$index3\[9\], \+, gprB_0\]
+ 1e8: 000724b080000230 \.61 alu\[gprB_0, \*l\$index3\+\+, \+, gprB_0\]
+ 1f0: 0007c4b080000231 \.62 alu\[gprB_0, \*l\$index3--, \+, gprB_0\]
+ 1f8: 000664b080000211 \.63 alu\[gprB_0, \*l\$index2--, \+, gprB_0\]
+ 200: 000a60b080000231 \.64 alu\[gprB_0, \*l\$index1--, \+, gprB_0\]
+ 208: 000bc0b080000211 \.65 alu\[gprB_0, \*l\$index0--, \+, gprB_0\]
+ 210: 000340b080000200 \.66 alu\[gprB_0, \*l\$index0, \+, gprB_0\]
+ 218: 000ee4b080000200 \.67 alu\[gprB_0, \*l\$index2, \+, gprB_0\]
+ 220: 000100b080000241 \.68 alu\[gprB_0, \*n\$index, \+, gprB_0\]
+ 228: 0004809bf0000241 \.69 alu_shf\[gprB_0, \*n\$index, OR, gprB_0, <<1\]
+ 230: 000f20a0001fff00 \.70 alu\[gprA_1, --, B, 0xff\]
+ 238: 0005c0b0002fff00 \.71 alu\[gprB_2, --, B, 0xff\]
+ 240: 000940a0000d6f00 \.72 alu\[gprA_0, --, B, 0x5b\]
+ 248: 000440a2000d6f00 \.73 alu\[gprA_0, --, ~B, 0x5b\]
+ 250: 000de081f032f200 \.74 alu_shf\[gprA_3, --, B, 0x5c, <<1\]
+ 258: 000de091d012f600 \.75 alu_shf\[gprB_1, --, B, 0x5d, <<3\]
+ 260: 000d60901022fa00 \.76 alu_shf\[gprB_2, --, B, 0x5e, <<31\]
+ 268: 000e40a0c0000402 \.77 alu\[gprA_0, gprB_1, \+, gprA_2\]
+ 270: 000340a2c0000402 \.78 alu\[gprA_0, gprB_1, \+16, gprA_2\]
+ 278: 000040a4c0000402 \.79 alu\[gprA_0, gprB_1, \+8, gprA_2\]
+ 280: 0007a0a8c0000402 \.80 alu\[gprA_0, gprB_1, \+carry, gprA_2\]
+ 288: 000d40a6c0000402 \.81 alu\[gprA_0, gprB_1, -carry, gprA_2\]
+ 290: 000aa0aac0000402 \.82 alu\[gprA_0, gprB_1, -, gprA_2\]
+ 298: 0009a0acc0000402 \.83 alu\[gprA_0, gprB_1, B-A, gprA_2\]
+ 2a0: 000da0aa40000402 \.84 alu\[gprA_0, gprB_1, OR, gprA_2\]
+ 2a8: 000740a440000402 \.85 alu\[gprA_0, gprB_1, AND, gprA_2\]
+ 2b0: 000a40a640000402 \.86 alu\[gprA_0, gprB_1, ~AND, gprA_2\]
+ 2b8: 0000a0a840000402 \.87 alu\[gprA_0, gprB_1, AND~, gprA_2\]
+ 2c0: 000ea0ac40000402 \.88 alu\[gprA_0, gprB_1, XOR, gprA_2\]
+ 2c8: 000321a0c0000402 \.89 alu\[gprA_0, gprB_1, \+, gprA_2\], no_cc
+ 2d0: 000990a0c0000402 \.90 alu\[gprA_0, gprB_1, \+, gprA_2\], predicate_cc
+ 2d8: 0009e2a0c0000402 \.91 alu\[gprA_0, gprB_1, \+, gprA_2\], gpr_wrboth
+ 2e0: 000353a0c0000402 \.92 alu\[gprA_0, gprB_1, \+, gprA_2\], no_cc, gpr_wrboth, predicate_cc
+ 2e8: 000d418b70080602 \.93 alu_shf\[gprA_0, gprB_1, OR, gprA_2, <<9\], no_cc
+ 2f0: 0006708a90080502 \.94 alu_shf\[gprA_0, gprB_1, OR, gprA_2, >>9\], predicate_cc
+ 2f8: 000ea28a90080402 \.95 alu_shf\[gprA_0, gprB_1, OR, gprA_2, >>rot9\], gpr_wrboth
+ 300: 000e138b70080402 \.96 alu_shf\[gprA_0, gprB_1, OR, gprA_2, >>rot23\], no_cc, gpr_wrboth, predicate_cc
+ 308: 000ba08a00080602 \.97 alu_shf\[gprA_0, gprB_1, OR, gprA_2, <<indirect\]
+ 310: 0000208a00080502 \.98 alu_shf\[gprA_0, gprB_1, OR, gprA_2, >>indirect\]
+ 318: 000ba0a0300c2f00 \.99 alu\[--, --, B, 0xb\]
+ 320: 000ae09d40380101 \.100 asr\[gprB_3, gprA_1, >>20\]
+ 328: 000ba0a0300c2f00 \.101 alu\[--, --, B, 0xb\]
+ 330: 000ea09d40310500 \.102 asr\[gprB_3, \*n\$index, >>20\]
+ 338: 000ba0a0300c2f00 \.103 alu\[--, --, B, 0xb\]
+ 340: 0007a09d40314100 \.104 asr\[gprB_3, \*l\$index0, >>20\]
+ 348: 000ba0a0300c2f00 \.105 alu\[--, --, B, 0xb\]
+ 350: 0000249d40316100 \.106 asr\[gprB_3, \*l\$index3, >>20\]
+ 358: 000ba0a0300c2f00 \.107 alu\[--, --, B, 0xb\]
+ 360: 000a049d40314100 \.108 asr\[gprB_3, \*l\$index2, >>20\]
+ 368: 000ba0a0300c2f00 \.109 alu\[--, --, B, 0xb\]
+ 370: 0004a08d45010d00 \.110 asr\[\*l\$index0, \*n\$index\+\+, >>20\]
+ 378: 000ba0a0300c2f00 \.111 alu\[--, --, B, 0xb\]
+ 380: 000ee08d45810d00 \.112 asr\[\*l\$index1, \*n\$index\+\+, >>20\]
+ 388: 000ba0a0300c2f00 \.113 alu\[--, --, B, 0xb\]
+ 390: 000a088d45010d00 \.114 asr\[\*l\$index2, \*n\$index\+\+, >>20\]
+ 398: 000ba0a0300c2f00 \.115 alu\[--, --, B, 0xb\]
+ 3a0: 0007819d40380101 \.116 asr\[gprB_3, gprA_1, >>20\], no_cc
+ 3a8: 000ba0a0300c2f00 \.117 alu\[--, --, B, 0xb\]
+ 3b0: 000d309d40380101 \.118 asr\[gprB_3, gprA_1, >>20\], predicate_cc
+ 3b8: 000ba0a0300c2f00 \.119 alu\[--, --, B, 0xb\]
+ 3c0: 000ba28d40380101 \.120 asr\[gprA_3, gprA_1, >>20\], gpr_wrboth
+ 3c8: 0008c0d818c08120 \.121 beq\[\.99\]
+ 3d0: 000d00d877c08120 \.122 beq\[\.479\]
+ 3d8: 000440d877e08120 \.123 beq\[\.479\], defer\[2\]
+ 3e0: 000000f0000c0300 \.124 nop
+ 3e8: 000000f0000c0300 \.125 nop
+ 3f0: 000540d877c08021 \.126 bne\[\.479\]
+ 3f8: 0004c0d877c08022 \.127 bmi\[\.479\]
+ 400: 000420d877c08023 \.128 bpl\[\.479\]
+ 408: 0007c0d877c08024 \.129 bcs\[\.479\]
+ 410: 0007c0d877c08024 \.130 bcs\[\.479\]
+ 418: 000720d877c08025 \.131 bcc\[\.479\]
+ 420: 000720d877c08025 \.132 bcc\[\.479\]
+ 428: 0006a0d877c08026 \.133 bvs\[\.479\]
+ 430: 000640d877c08027 \.134 bvc\[\.479\]
+ 438: 0001c0d877c08028 \.135 bge\[\.479\]
+ 440: 000120d877c08029 \.136 blt\[\.479\]
+ 448: 000040d877c0802b \.137 bgt\[\.479\]
+ 450: 0000a0d877c0802a \.138 ble\[\.479\]
+ 458: 000c60d818c08038 \.139 br\[\.99\]
+ 460: 000920d818d08038 \.140 br\[\.99\], defer\[1\]
+ 468: 000000f0000c0300 \.141 nop
+ 470: 000bc0d077c09000 \.142 br_bclr\[gprA_0, 3, \.479\]
+ 478: 000980d077c0e004 \.143 br_bclr\[gprA_4, 23, \.479\]
+ 480: 0002a0d077c0082c \.144 br_bclr\[gprB_2, 11, \.479\]
+ 488: 000300d077c02423 \.145 br_bclr\[gprB_9, 2, \.479\]
+ 490: 000260d077c02421 \.146 br_bclr\[gprB_9, 0, \.479\]
+ 498: 000280d077c02420 \.147 br_bclr\[gprB_9, 31, \.479\]
+ 4a0: 000f00d077f02423 \.148 br_bclr\[gprB_9, 2, \.479\], defer\[3\]
+ 4a8: 000000f0000c0300 \.149 nop
+ 4b0: 000000f0000c0300 \.150 nop
+ 4b8: 000000f0000c0300 \.151 nop
+ 4c0: 000680d077c42c2b \.152 br_bset\[gprB_11, 10, \.479\]
+ 4c8: 0006e0d077c4ac0b \.153 br_bset\[gprA_11, 10, \.479\]
+ 4d0: 0002a0c877d81020 \.154 br=byte\[gprB_4, 0, 0x0, \.479\], defer\[1\]
+ 4d8: 000000f0000c0300 \.155 nop
+ 4e0: 000a60c877c81520 \.156 br=byte\[gprB_5, 1, 0x0, \.479\]
+ 4e8: 0001e0c877c81620 \.157 br=byte\[gprB_5, 2, 0x0, \.479\]
+ 4f0: 0001a4c877c94220 \.158 br=byte\[\*l\$index2, 2, 0x0, \.479\]
+ 4f8: 000620c877c96220 \.159 br=byte\[\*l\$index1, 2, 0x0, \.479\]
+ 500: 000540c877c81b20 \.160 br=byte\[gprB_6, 3, 0x0, \.479\]
+ 508: 0000c0c877cc16ff \.161 br=byte\[gprB_5, 2, 0xff, \.479\]
+ 510: 000420c877c816a2 \.162 br=byte\[gprB_5, 2, 0x42, \.479\]
+ 518: 000380c877c416ff \.163 br!=byte\[gprB_5, 2, 0xff, \.479\]
+ 520: 0002a0c877c01620 \.164 br!=byte\[gprB_5, 2, 0x0, \.479\]
+ 528: 000c20d877c00236 \.165 br_cls_state\[cls_ring0_status, \.479\]
+ 530: 0001a0d877e20236 \.166 br_cls_state\[cls_ring8_status, \.479\], defer\[2\]
+ 538: 000000f0000c0300 \.167 nop
+ 540: 000000f0000c0300 \.168 nop
+ 548: 000be0d877c38236 \.169 br_cls_state\[cls_ring14_status, \.479\]
+ 550: 0007c0d877c3c236 \.170 br_cls_state\[cls_ring15_status, \.479\]
+ 558: 000720d877c3c237 \.171 br_!cls_state\[cls_ring15_status, \.479\]
+ 560: 000cc0d877c00237 \.172 br_!cls_state\[cls_ring0_status, \.479\]
+ 568: 000c00d877c00030 \.173 br=ctx\[0, \.479\]
+ 570: 000dc0d877c08030 \.174 br=ctx\[2, \.479\]
+ 578: 000f00d877c18030 \.175 br=ctx\[6, \.479\]
+ 580: 000a40d877d18030 \.176 br=ctx\[6, \.479\], defer\[1\]
+ 588: 000000f0000c0300 \.177 nop
+ 590: 000d40d877c00234 \.178 br_inp_state\[nn_empty, \.479\]
+ 598: 000160d877c04234 \.179 br_inp_state\[nn_full, \.479\]
+ 5a0: 000c80d877c08234 \.180 br_inp_state\[ctm_ring0_status, \.479\]
+ 5a8: 000100d877e28234 \.181 br_inp_state\[ctm_ring8_status, \.479\], defer\[2\]
+ 5b0: 000000f0000c0300 \.182 nop
+ 5b8: 000000f0000c0300 \.183 nop
+ 5c0: 000a80d877c38234 \.184 br_inp_state\[ctm_ring12_status, \.479\]
+ 5c8: 0006a0d877c3c234 \.185 br_inp_state\[ctm_ring13_status, \.479\]
+ 5d0: 000640d877c3c235 \.186 br_!inp_state\[ctm_ring13_status, \.479\]
+ 5d8: 000c60d877c08235 \.187 br_!inp_state\[ctm_ring0_status, \.479\]
+ 5e0: 000260d877c04232 \.188 br_signal\[1, \.479\]
+ 5e8: 000f80d877c08232 \.189 br_signal\[2, \.479\]
+ 5f0: 0005a0d877c3c232 \.190 br_signal\[15, \.479\]
+ 5f8: 000540d877c3c233 \.191 br_!signal\[15, \.479\]
+ 600: 000b60d877f2c232 \.192 br_signal\[11, \.479\], defer\[3\]
+ 608: 000000f0000c0300 \.193 nop
+ 610: 000000f0000c0300 \.194 nop
+ 618: 000000f0000c0300 \.195 nop
+ 620: 000e40a0c0000402 \.196 alu\[gprA_0, gprB_1, \+, gprA_2\]
+ 628: 0004408e02081200 \.197 byte_align_le\[--, gprB_4\]
+ 630: 0008c08e00981200 \.198 byte_align_le\[gprA_9, gprB_4\]
+ 638: 0004c08e00a81200 \.199 byte_align_le\[gprA_10, gprB_4\]
+ 640: 0001808e00b81200 \.200 byte_align_le\[gprA_11, gprB_4\]
+ 648: 000e40a0c0000402 \.201 alu\[gprA_0, gprB_1, \+, gprA_2\]
+ 650: 000c808e02001100 \.202 byte_align_be\[--, gprB_4\]
+ 658: 0000008e00901100 \.203 byte_align_be\[gprA_9, gprB_4\]
+ 660: 000c008e00a01100 \.204 byte_align_be\[gprA_10, gprB_4\]
+ 668: 0009408e00b01100 \.205 byte_align_be\[gprA_11, gprB_4\]
+ 670: 000d80a0300c0300 \.206 alu\[--, --, B, 0x0\]
+ 678: 000400a5b00c0000 \.207 cam_clear
+ 680: 000360bb80900007 \.208 cam_lookup\[gprB_9, gprA_7\]
+ 688: 0003a0bb80900200 \.209 cam_lookup\[gprB_9, \*l\$index0\]
+ 690: 000e04bb80900200 \.210 cam_lookup\[gprB_9, \*l\$index2\]
+ 698: 000f84bb80900203 \.211 cam_lookup\[gprB_9, \*l\$index2\[3\]\]
+ 6a0: 000bc0bb80900210 \.212 cam_lookup\[gprB_9, \*l\$index0\+\+\]
+ 6a8: 000280aba0000241 \.213 cam_lookup\[\*l\$index0, \*n\$index\]
+ 6b0: 000ec0aba1000241 \.214 cam_lookup\[\*l\$index0\+\+, \*n\$index\]
+ 6b8: 000288aba3000243 \.215 cam_lookup\[\*l\$index3\+\+, \*n\$index\+\+\]
+ 6c0: 000aa0aba0200243 \.216 cam_lookup\[\*l\$index0\[2\], \*n\$index\+\+\]
+ 6c8: 000060bb80901407 \.217 cam_lookup\[gprB_9, gprA_7\], lm_addr0\[1\]
+ 6d0: 000060bb80902807 \.218 cam_lookup\[gprB_9, gprA_7\], lm_addr1\[2\]
+ 6d8: 000660bb80907407 \.219 cam_lookup\[gprB_9, gprA_7\], lm_addr2\[3\]
+ 6e0: 000660bb80904807 \.220 cam_lookup\[gprB_9, gprA_7\], lm_addr3\[0\]
+ 6e8: 000222ab80900007 \.221 cam_lookup\[gprA_9, gprA_7\], gpr_wrboth
+ 6f0: 0004b0bb80900007 \.222 cam_lookup\[gprB_9, gprA_7\], predicate_cc
+ 6f8: 000a00a7809c0000 \.223 cam_read_tag\[gprA_9, 0x0\]
+ 700: 000da2a7809c0000 \.224 cam_read_tag\[gprA_9, 0x0\], gpr_wrboth
+ 708: 000dd0a7809c0000 \.225 cam_read_tag\[gprA_9, 0x0\], predicate_cc
+ 710: 000900a7809c2800 \.226 cam_read_tag\[gprA_9, 0xa\]
+ 718: 000a00a7809c3c00 \.227 cam_read_tag\[gprA_9, 0xf\]
+ 720: 0003e0af809c0000 \.228 cam_read_state\[gprA_9, 0x0\]
+ 728: 000442af809c0000 \.229 cam_read_state\[gprA_9, 0x0\], gpr_wrboth
+ 730: 000392af809c0000 \.230 cam_read_state\[gprA_9, 0x0\], gpr_wrboth, predicate_cc
+ 738: 0000e0af809c2800 \.231 cam_read_state\[gprA_9, 0xa\]
+ 740: 0003e0af809c3c00 \.232 cam_read_state\[gprA_9, 0xf\]
+ 748: 000920a9f0101700 \.233 cam_write\[0x0, gprB_5, 1\]
+ 750: 000da0a9f01a0300 \.234 cam_write\[0x0, n\$reg_0, 1\]
+ 758: 000e80a9f0190700 \.235 cam_write\[0x0, \*n\$index, 1\]
+ 760: 0004c4a9f0180300 \.236 cam_write\[0x0, \*l\$index2, 1\]
+ 768: 0008e4a9f0184300 \.237 cam_write\[0x0, \*l\$index2\+\+, 1\]
+ 770: 000dc4a9f0184700 \.238 cam_write\[0x0, \*l\$index2--, 1\]
+ 778: 000840a9f0b01704 \.239 cam_write\[0x4, gprB_5, 11\]
+ 780: 000be0a9f0f0170f \.240 cam_write\[0xf, gprB_5, 15\]
+ 788: 0008a0adb01c0000 \.241 cam_write_state\[0x0, 1\]
+ 790: 000d80adb0bc1000 \.242 cam_write_state\[0x4, 11\]
+ 798: 000de0adb0fc3c00 \.243 cam_write_state\[0xf, 15\]
+ 7a0: 0000c0fc142c000d \.244 local_csr_wr\[CRCRemainder, gprA_13\]
+ 7a8: 000d20a918060348 \.245 crc_le\[crc_ccitt, \$xfer_0, \$xfer_0\]
+ 7b0: 000000f0000c0300 \.246 nop
+ 7b8: 000d40a918160748 \.247 crc_le\[crc_ccitt, \$xfer_1, \$xfer_1\]
+ 7c0: 000000f0000c0300 \.248 nop
+ 7c8: 000d40a918260b48 \.249 crc_le\[crc_ccitt, \$xfer_2, \$xfer_2\]
+ 7d0: 000000f0000c0300 \.250 nop
+ 7d8: 000d20a918360f48 \.251 crc_le\[crc_ccitt, \$xfer_3, \$xfer_3\]
+ 7e0: 000000f0000c0300 \.252 nop
+ 7e8: 000000f0000c0300 \.253 nop
+ 7f0: 000000f0000c0300 \.254 nop
+ 7f8: 000000f0000c0300 \.255 nop
+ 800: 000000f0000c0300 \.256 nop
+ 808: 000f60fc140c0000 \.257 local_csr_rd\[CRCRemainder\]
+ 810: 000ce0f0000c000e \.258 immed\[gprA_14, 0x0\]
+ 818: 000940a918060340 \.259 crc_be\[crc_ccitt, \$xfer_0, \$xfer_0\]
+ 820: 000000f0000c0300 \.260 nop
+ 828: 000920a918461340 \.261 crc_be\[crc_ccitt, \$xfer_4, \$xfer_4\]
+ 830: 000000f0000c0300 \.262 nop
+ 838: 000060a900061340 \.263 crc_be\[crc_ccitt, gprA_0, \$xfer_4\]
+ 840: 000000f0000c0300 \.264 nop
+ 848: 000c60a900001340 \.265 crc_be\[crc_ccitt, gprA_0, gprB_4\]
+ 850: 000000f0000c0300 \.266 nop
+ 858: 000000f0000c0300 \.267 nop
+ 860: 000000f0000c0300 \.268 nop
+ 868: 000000f0000c0300 \.269 nop
+ 870: 000000f0000c0300 \.270 nop
+ 878: 000600a918260380 \.271 crc_be\[crc_32, \$xfer_2, \$xfer_0\]
+ 880: 000000f0000c0300 \.272 nop
+ 888: 0004c0a9183613a0 \.273 crc_be\[crc_iscsi, \$xfer_3, \$xfer_4\]
+ 890: 000000f0000c0300 \.274 nop
+ 898: 0004c0a9000613c0 \.275 crc_be\[crc_10, gprA_0, \$xfer_4\]
+ 8a0: 000000f0000c0300 \.276 nop
+ 8a8: 000960a9000013e0 \.277 crc_be\[crc_5, gprA_0, gprB_4\]
+ 8b0: 000000f0000c0300 \.278 nop
+ 8b8: 000ea0a918862700 \.279 crc_be\[--, \$xfer_8, \$xfer_9\]
+ 8c0: 000000f0000c0300 \.280 nop
+ 8c8: 000240a918760784 \.281 crc_be\[crc_32, \$xfer_7, \$xfer_1\], bytes_0_2
+ 8d0: 000000f0000c0300 \.282 nop
+ 8d8: 0002a0a918760785 \.283 crc_be\[crc_32, \$xfer_7, \$xfer_1\], bytes_0_1
+ 8e0: 000000f0000c0300 \.284 nop
+ 8e8: 000320a918760786 \.285 crc_be\[crc_32, \$xfer_7, \$xfer_1\], byte_0
+ 8f0: 000000f0000c0300 \.286 nop
+ 8f8: 0000c0a918760781 \.287 crc_be\[crc_32, \$xfer_7, \$xfer_1\], bytes_1_3
+ 900: 000000f0000c0300 \.288 nop
+ 908: 000140a918760782 \.289 crc_be\[crc_32, \$xfer_7, \$xfer_1\], bytes_2_3
+ 910: 000000f0000c0300 \.290 nop
+ 918: 0001a0a918760783 \.291 crc_be\[crc_32, \$xfer_7, \$xfer_1\], byte_3
+ 920: 000000f0000c0300 \.292 nop
+ 928: 000782a900160780 \.293 crc_be\[crc_32, gprA_1, \$xfer_1\], gpr_wrboth
+ 930: 000000f0000c0300 \.294 nop
+ 938: 000ae3a900160780 \.295 crc_be\[crc_32, gprA_1, \$xfer_1\], no_cc, gpr_wrboth
+ 940: 000000f0000c0300 \.296 nop
+ 948: 000b73a900560780 \.297 crc_be\[crc_32, gprA_5, \$xfer_1\], no_cc, gpr_wrboth, predicate_cc
+ 950: 000000f0000c0300 \.298 nop
+ 958: 000122a900560781 \.299 crc_be\[crc_32, gprA_5, \$xfer_1\], bytes_1_3, gpr_wrboth
+ 960: 000000f0000c0300 \.300 nop
+ 968: 000000f0000c0300 \.301 nop
+ 970: 000000f0000c0300 \.302 nop
+ 978: 000000f0000c0300 \.303 nop
+ 980: 000000f0000c0300 \.304 nop
+ 988: 000000f0000c0300 \.305 nop
+ 990: 0005a0e000080000 \.306 ctx_arb\[--\]
+ 998: 000600e000000001 \.307 ctx_arb\[voluntary\]
+ 9a0: 000220e000020000 \.308 ctx_arb\[bpt\]
+ 9a8: 000460e000000220 \.309 ctx_arb\[sig5, sig9\]
+ 9b0: 000d20e000200220 \.310 ctx_arb\[sig5, sig9\], defer\[2\]
+ 9b8: 000180a0300c0f00 \.311 alu\[--, --, B, 0x3\]
+ 9c0: 0007a0a0300c1f00 \.312 alu\[--, --, B, 0x7\]
+ 9c8: 0006a0e000010220 \.313 ctx_arb\[sig5, sig9\], any
+ 9d0: 000a60e077c40220 \.314 ctx_arb\[sig5, sig9\], br\[\.479\]
+ 9d8: 0006409010500701 \.315 dbl_shf\[gprB_5, gprA_1, gprB_1, >>1\]
+ 9e0: 000d4090a0500701 \.316 dbl_shf\[gprB_5, gprA_1, gprB_1, >>10\]
+ 9e8: 000c4091f0500701 \.317 dbl_shf\[gprB_5, gprA_1, gprB_1, >>31\]
+ 9f0: 000740a440000402 \.318 alu\[gprA_0, gprB_1, AND, gprA_2\]
+ 9f8: 0000c09000500701 \.319 dbl_shf\[gprB_5, gprA_1, gprB_1, >>indirect\]
+ a00: 000b219010500701 \.320 dbl_shf\[gprB_5, gprA_1, gprB_1, >>1\], no_cc
+ a08: 000cf19010500701 \.321 dbl_shf\[gprB_5, gprA_1, gprB_1, >>1\], no_cc, predicate_cc
+ a10: 0000d28010500701 \.322 dbl_shf\[gprA_5, gprA_1, gprB_1, >>1\], gpr_wrboth, predicate_cc
+ a18: 000200a700f03f00 \.323 ffs\[gprA_15, gprB_15\]
+ a20: 000fe0b740fc000f \.324 ffs\[gprB_15, gprA_15\]
+ a28: 000ec0b700f61300 \.325 ffs\[gprB_15, \$xfer_4\]
+ a30: 000660b700f88300 \.326 ffs\[gprB_15, \*l\$index1\]
+ a38: 0007e4b700f8c300 \.327 ffs\[gprB_15, \*l\$index3\+\+\]
+ a40: 0002c4b700f8c700 \.328 ffs\[gprB_15, \*l\$index3--\]
+ a48: 0004c4b700f8a700 \.329 ffs\[gprB_15, \*l\$index3\[9\]\]
+ a50: 000880a720000300 \.330 ffs\[\*l\$index0, gprB_0\]
+ a58: 000108a722090700 \.331 ffs\[\*l\$index3, \*n\$index\]
+ a60: 000128a723190f00 \.332 ffs\[\*l\$index3--, \*n\$index\+\+\]
+ a68: 0003c3a740fc000f \.333 ffs\[gprA_15, gprA_15\], no_cc, gpr_wrboth
+ a70: 000972a740fc000f \.334 ffs\[gprA_15, gprA_15\], gpr_wrboth, predicate_cc
+ a78: 000320f0000c0803 \.335 immed\[gprA_3, 0x2\]
+ a80: 000480e8004d4803 \.336 jump\[gprA_3, \.338\]
+ a88: 0006a0d854408038 \.337 br\[\.337\]
+ a90: 000460f000002701 \.338 immed\[gprB_9, 0x1\]
+ a98: 0006a0d854408038 \.339 br\[\.337\]
+ aa0: 0005e0f000002702 \.340 immed\[gprB_9, 0x2\]
+ aa8: 0006a0d854408038 \.341 br\[\.337\]
+ ab0: 000500f000002703 \.342 immed\[gprB_9, 0x3\]
+ ab8: 0006a0d854408038 \.343 br\[\.337\]
+ ac0: 000040c001000000 \.344 ld_field\[gprA_0, 0001, gprB_0\]
+ ac8: 0007e2c001000000 \.345 ld_field\[gprA_0, 0001, gprB_0\], gpr_wrboth
+ ad0: 000e40c401000000 \.346 ld_field\[gprA_0, 0001, gprB_0\], load_cc
+ ad8: 000790c001000000 \.347 ld_field\[gprA_0, 0001, gprB_0\], predicate_cc
+ ae0: 0005c0c005000000 \.348 ld_field\[gprA_0, 0101, gprB_0\]
+ ae8: 000080c005100000 \.349 ld_field_w_clr\[gprA_0, 0101, gprB_0\]
+ af0: 0002a2c001100000 \.350 ld_field_w_clr\[gprA_0, 0001, gprB_0\], gpr_wrboth
+ af8: 000b00c401100000 \.351 ld_field_w_clr\[gprA_0, 0001, gprB_0\], load_cc
+ b00: 0002d0c001100000 \.352 ld_field_w_clr\[gprA_0, 0001, gprB_0\], predicate_cc
+ b08: 000fc0c00f000000 \.353 ld_field\[gprA_0, 1111, gprB_0\]
+ b10: 0005e0c1fb000200 \.354 ld_field\[gprA_0, 1011, gprB_0, <<1\]
+ b18: 000460c01b000100 \.355 ld_field\[gprA_0, 1011, gprB_0, >>1\]
+ b20: 000e60c1fb000100 \.356 ld_field\[gprA_0, 1011, gprB_0, >>31\]
+ b28: 000bc0c09b000000 \.357 ld_field\[gprA_0, 1011, gprB_0, >>rot9\]
+ b30: 000e80c09b100000 \.358 ld_field_w_clr\[gprA_0, 1011, gprB_0, >>rot9\]
+ b38: 0001c0c17b000000 \.359 ld_field\[gprA_0, 1011, gprB_0, >>rot23\]
+ b40: 0002c0c41b000000 \.360 ld_field\[gprA_0, 1011, gprB_0, >>rot1\], load_cc
+ b48: 000780c41b100000 \.361 ld_field_w_clr\[gprA_0, 1011, gprB_0, >>rot1\], load_cc
+ b50: 000400f0001f7c01 \.362 immed\[gprA_1, 0x1df\]
+ b58: 000200f0001007df \.363 immed\[gprB_1, 0x1df\]
+ b60: 0005a2f0001007df \.364 immed\[gprB_1, 0x1df\], gpr_wrboth
+ b68: 0005d0f0001007df \.365 immed\[gprB_1, 0x1df\], predicate_cc
+ b70: 000020fc010c0000 \.366 local_csr_rd\[ALUOut\]
+ b78: 000e60f0000c000b \.367 immed\[gprA_11, 0x0\]
+ b80: 000ce0fc160c0000 \.368 local_csr_rd\[MiscControl\]
+ b88: 000e60f0000c000b \.369 immed\[gprA_11, 0x0\]
+ b90: 000ae0fc076c0b02 \.370 local_csr_wr\[XferIndex, 0x2\]
+ b98: 0008a0fc076c0003 \.371 local_csr_wr\[XferIndex, gprA_3\]
+ ba0: 000520fc07600f00 \.372 local_csr_wr\[XferIndex, gprB_3\]
+ ba8: 000f20fc01a00f00 \.373 local_csr_wr\[CtxEnables, gprB_3\]
+ bb0: 000480f800000c02 \.374 mul_step\[gprA_2, gprB_3\], start
+ bb8: 000880f980000c02 \.375 mul_step\[gprA_2, gprB_3\], 32x32_step1
+ bc0: 000dc0f980100c02 \.376 mul_step\[gprA_2, gprB_3\], 32x32_step2
+ bc8: 0001c0f980200c02 \.377 mul_step\[gprA_2, gprB_3\], 32x32_step3
+ bd0: 000480f980300c02 \.378 mul_step\[gprA_2, gprB_3\], 32x32_step4
+ bd8: 000940f9804c0002 \.379 mul_step\[gprA_2, --\], 32x32_last
+ be0: 000ce0f9805c0003 \.380 mul_step\[gprA_3, --\], 32x32_last2
+ be8: 0001a0f800000802 \.381 mul_step\[gprA_2, gprB_2\], start
+ bf0: 000aa0f900000802 \.382 mul_step\[gprA_2, gprB_2\], 16x16_step1
+ bf8: 000fe0f900100802 \.383 mul_step\[gprA_2, gprB_2\], 16x16_step2
+ c00: 000f20f9004c0000 \.384 mul_step\[gprA_0, --\], 16x16_last
+ c08: 0001a0f800000802 \.385 mul_step\[gprA_2, gprB_2\], start
+ c10: 0006a0f880000802 \.386 mul_step\[gprA_2, gprB_2\], 24x8_step1
+ c18: 000320f8804c0000 \.387 mul_step\[gprA_0, --\], 24x8_last
+ c20: 0001a0f800000802 \.388 mul_step\[gprA_2, gprB_2\], start
+ c28: 0006a0f880000802 \.389 mul_step\[gprA_2, gprB_2\], 24x8_step1
+ c30: 0004f0f8804c0000 \.390 mul_step\[gprA_0, --\], 24x8_last, predicate_cc
+ c38: 0001a0f800000802 \.391 mul_step\[gprA_2, gprB_2\], start
+ c40: 0006a0f880000802 \.392 mul_step\[gprA_2, gprB_2\], 24x8_step1
+ c48: 0009e3f8804c0000 \.393 mul_step\[gprA_0, --\], 24x8_last, no_cc, gpr_wrboth
+ c50: 000b80a330000000 \.394 pop_count1\[gprB_0\]
+ c58: 000c80a3b0000000 \.395 pop_count2\[gprB_0\]
+ c60: 000d80a180000000 \.396 pop_count3\[gprA_0, gprB_0\]
+ c68: 000b80a330000000 \.397 pop_count1\[gprB_0\]
+ c70: 000c80a3b0000000 \.398 pop_count2\[gprB_0\]
+ c78: 000743a180000000 \.399 pop_count3\[gprA_0, gprB_0\], no_cc, gpr_wrboth
+ c80: 0004a4a330088000 \.400 pop_count1\[\*l\$index3\]
+ c88: 0003a4a3b0088000 \.401 pop_count2\[\*l\$index3\]
+ c90: 0000e5a1a438c000 \.402 pop_count3\[\*n\$index\+\+, \*l\$index3\+\+\], no_cc
+ c98: 000b80a330000000 \.403 pop_count1\[gprB_0\]
+ ca0: 000c80a3b0000000 \.404 pop_count2\[gprB_0\]
+ ca8: 000731a180000000 \.405 pop_count3\[gprA_0, gprB_0\], no_cc, predicate_cc
+ cb0: 000480e8000c0000 \.406 rtn\[gprA_0\]
+ cb8: 000620e8000a0700 \.407 rtn\[n\$reg_1\]
+ cc0: 000600e800088300 \.408 rtn\[\*l\$index1\]
+ cc8: 000a64e800080300 \.409 rtn\[\*l\$index2\]
+ cd0: 000dc0e800200300 \.410 rtn\[gprB_0\], defer\[2\]
+ cd8: 0008a0a0300c0700 \.411 alu\[--, --, B, 0x1\]
+ ce0: 0004a0a0300c0b00 \.412 alu\[--, --, B, 0x2\]
+ ce8: 000000f0000c0300 \.413 nop
+ cf0: 000000f0000c0300 \.414 nop
+ cf8: 000000f0000c0300 \.415 nop
+ d00: 000000f0000c0300 \.416 nop
+ d08: 0003501842300c09 \.417 arm\[read, \$xfer_3, gprA_9, gprB_3, 2\], ctx_swap\[sig4\]
+ d10: 0005501842302403 \.418 arm\[read, \$xfer_3, gprA_3, gprB_9, 2\], ctx_swap\[sig4\]
+ d18: 0004801842300c09 \.419 arm\[read, \$xfer_3, gprA_9, <<8, gprB_3, 2\], ctx_swap\[sig4\]
+ d20: 000f241842302403 \.420 arm\[read, \$xfer_3, gprB_9, <<8, gprA_3, 2\], ctx_swap\[sig4\]
+ d28: 0004a0a0300c0b00 \.421 alu\[--, --, B, 0x2\]
+ d30: 0008861842302403 \.422 arm\[read, \$xfer_3, gprB_9, <<8, gprA_3, 2\], indirect_ref, ctx_swap\[sig4\]
+ d38: 0004a0a0300c0b00 \.423 alu\[--, --, B, 0x2\]
+ d40: 000e8618e2302703 \.424 arm\[read, \$xfer_3, gprB_9, <<8, gprA_3, 2\], indirect_ref, sig_done\[sig14\]
+ d48: 0007841842302503 \.425 arm\[read, \$xfer_3, gprB_9, <<8, gprA_3, 2\], ctx_swap\[sig4\], defer\[1\]
+ d50: 0008a0a0300c0700 \.426 alu\[--, --, B, 0x1\]
+ d58: 000f101843c00c09 \.427 arm\[read, \$xfer_28, gprA_9, gprB_3, 2\], ctx_swap\[sig4\]
+ d60: 000910184e800c09 \.428 arm\[read, \$xfer_8, gprA_9, gprB_3, 8\], ctx_swap\[sig4\]
+ d68: 000a106440800c09 \.429 cls\[add, \$xfer_8, gprA_9, gprB_3, 1\], ctx_swap\[sig4\]
+ d70: 0000f0664080a009 \.430 cls\[sub, \$xfer_8, gprA_9, 0x8, 1\], ctx_swap\[sig4\]
+ d78: 000160644284a009 \.431 cls\[add64, \$xfer_8, gprA_9, <<8, 0x8, 2\], ctx_swap\[sig4\]
+ d80: 000404664284a408 \.432 cls\[sub64, \$xfer_8, 0x9, <<8, gprA_8, 2\], ctx_swap\[sig4\]
+ d88: 0008a0a0300c0700 \.433 alu\[--, --, B, 0x1\]
+ d90: 00032c650340a708 \.434 cls\[add_imm, 0x14, 0x9, <<8, gprA_8, 2\]
+ d98: 0007506040880c09 \.435 cls\[swap/test_compare_write, \$xfer_8, gprA_9, gprB_3, 1\], ctx_swap\[sig4\]
+ da0: 00023c6500007f9a \.436 cls\[add_imm, 0x1f9a, --, 1\]
+ da8: 000038653c583f14 \.437 cls\[add_imm, 0xf14, 0xf16\]
+ db0: 000b54640013c30f \.438 cls\[add, \$xfer_1, 0xf00f, 1\]
+ db8: 0002901c10a08000 \.439 ct\[xpb_read, \$xfer_10, gprA_0, 0x0, 1\], ctx_swap\[sig1\]
+ dc0: 0007501e10a48000 \.440 ct\[reflect_read_sig_init, \$xfer_10, gprA_0, 0x0, 1\], ctx_swap\[sig1\]
+ dc8: 000a501c10a48000 \.441 ct\[ring_get, \$xfer_10, gprA_0, 0x0, 1\], ctx_swap\[sig1\]
+ dd0: 000000f0000c0300 \.442 nop
+ dd8: 000cc0474a80a009 \.443 mem\[add64, \$xfer_8, gprA_9, <<8, 0x8, 6\], ctx_swap\[sig4\]
+ de0: 000d40404280a009 \.444 mem\[read, \$xfer_8, gprA_9, <<8, 0x8, 2\], ctx_swap\[sig4\]
+ de8: 000c405c4280a009 \.445 mem\[read32, \$xfer_8, gprA_9, <<8, 0x8, 2\], ctx_swap\[sig4\]
+ df0: 000ea0554280a009 \.446 mem\[ctm\.pe_dma_to_memory_indirect/emem\.get/imem\.lb_bucket_read_local, \$xfer_8, gprA_9, <<8, 0x8, 2\], ctx_swap\[sig4\]
+ df8: 0009204c408ca309 \.447 mem\[lock128/lock384, \$xfer_8, gprA_9, <<8, 0x8, 1\], sig_done\[sig4\]
+ e00: 000f20e000000030 \.448 ctx_arb\[sig4, sig5\]
+ e08: 0000a04c488ca309 \.449 mem\[lock256/lock512, \$xfer_8, gprA_9, <<8, 0x8, 5\], sig_done\[sig4\]
+ e10: 000f20e000000030 \.450 ctx_arb\[sig4, sig5\]
+ e18: 000ae04d4084a009 \.451 mem\[microq128_pop, \$xfer_8, gprA_9, <<8, 0x8, 1\], ctx_swap\[sig4\]
+ e20: 0002204d4080a009 \.452 mem\[microq128_get, \$xfer_8, gprA_9, <<8, 0x8, 1\], ctx_swap\[sig4\]
+ e28: 000ba04d4880a009 \.453 mem\[microq256_get, \$xfer_8, gprA_9, <<8, 0x8, 5\], ctx_swap\[sig4\]
+ e30: 0003805700028309 \.454 mem\[ctm\.pe_dma_from_memory_buffer/emem\.fast_journal/imem\.lb_push_stats_local, \$xfer_0, gprA_9, <<8, 0x40, 1\]
+ e38: 0005e04e4000a309 \.455 mem\[queue128_lock, \$xfer_0, gprA_9, <<8, 0x8, 1\], sig_done\[sig4\]
+ e40: 000f20e000000030 \.456 ctx_arb\[sig4, sig5\]
+ e48: 0001a04e0004a309 \.457 mem\[queue128_unlock, \$xfer_0, gprA_9, <<8, 0x8, 1\]
+ e50: 000c604e4800a309 \.458 mem\[queue256_lock, \$xfer_0, gprA_9, <<8, 0x8, 5\], sig_done\[sig4\]
+ e58: 000f20e000000030 \.459 ctx_arb\[sig4, sig5\]
+ e60: 0008204e0804a309 \.460 mem\[queue256_unlock, \$xfer_0, gprA_9, <<8, 0x8, 5\]
+ e68: 0008a05000001309 \.461 mem\[ctm\.packet_wait_packet_status/emem\.rd_qdesc/imem\.stats_log, \$xfer_0, gprA_9, <<8, gprB_4, 1\]
+ e70: 000b840092200c02 \.462 ila\[read, \$xfer_2, gprB_3, <<8, gprA_2, 2\], ctx_swap\[sig9\]
+ e78: 0005440182240f02 \.463 ila\[write_check_error, \$xfer_2, gprB_3, <<8, gprA_2, 2\], sig_done\[sig8\]
+ e80: 000d60e000000300 \.464 ctx_arb\[sig8, sig9\]
+ e88: 0007800410600000 \.465 nbi\[read, \$xfer_6, gprA_0, <<8, gprB_0, 1\], ctx_swap\[sig1\]
+ e90: 0002600c62000000 \.466 pcie\[read, \$xfer_0, gprA_0, <<8, gprB_0, 2\], ctx_swap\[sig6\]
+ e98: 0004c40d62000000 \.467 pcie\[write, \$xfer_0, gprB_0, <<8, gprA_0, 2\], ctx_swap\[sig6\]
+ ea0: 000d601462000000 \.468 crypto\[read, \$xfer_0, gprA_0, <<8, gprB_0, 2\], ctx_swap\[sig6\]
+ ea8: 0006601562000000 \.469 crypto\[write, \$xfer_0, gprA_0, <<8, gprB_0, 2\], ctx_swap\[sig6\]
+ eb0: 0000601662000000 \.470 crypto\[write_fifo, \$xfer_0, gprA_0, <<8, gprB_0, 2\], ctx_swap\[sig6\]
+ eb8: 000d840d60000050 \.471 pcie\[write, \$xfer_0, gprB_0, <<8, \*l\$index0, 1\], ctx_swap\[sig6\]
+ ec0: 0009e40d60000058 \.472 pcie\[write, \$xfer_0, gprB_0, <<8, \*l\$index1, 1\], ctx_swap\[sig6\]
+ ec8: 0009040d60000059 \.473 pcie\[write, \$xfer_0, gprB_0, <<8, \*l\$index1\[1\], 1\], ctx_swap\[sig6\]
+ ed0: 000000f0000c0300 \.474 nop
+ ed8: 000000f0000c0300 \.475 nop
+ ee0: 000000f0000c0300 \.476 nop
+ ee8: 000000f0000c0300 \.477 nop
+ ef0: 000000f0000c0300 \.478 nop
+ ef8: 000060a900301340 \.479 crc_be\[crc_ccitt, gprA_3, gprB_4\]
+ f00: 000000f0000c0300 \.480 nop
+ f08: 000e20b9403d0004 \.481 crc_be\[crc_ccitt, gprB_3, gprA_4\]
+ f10: 000000f0000c0300 \.482 nop
+ f18: 000400a900301348 \.483 crc_le\[crc_ccitt, gprA_3, gprB_4\]
+ f20: 000000f0000c0300 \.484 nop
+ f28: 000400b9403d2004 \.485 crc_le\[crc_ccitt, gprB_3, gprA_4\]
+ f30: 000000f0000c0300 \.486 nop
+ f38: 0002e0b900301348 \.487 crc_le\[crc_ccitt, gprB_3, gprB_4\]
+ f40: 000000f0000c0300 \.488 nop
+ f48: 0002e0a9403d2004 \.489 crc_le\[crc_ccitt, gprA_3, gprA_4\]
+ f50: 000000f0000c0300 \.490 nop
+ f58: 000220e000020000 \.491 ctx_arb\[bpt\]
+ f60: 000420e000010000 \.492 ctx_arb\[kill\]
+
+Disassembly of section \.text\.i33\.me9:
+
+0000000000000000 <\.text\.i33\.me9>:
+ 0: 000540f0012cd000 \.0 immed\[gprA_0, 0x1234\]
+ 8: 0002c0f0012cd280 \.1 immed\[n\$reg_0, 0x1234\]
+ 10: 000220f0012cd281 \.2 immed\[n\$reg_1, 0x1234\]
+ 18: 000660f0012cd200 \.3 immed\[\*l\$index0, 0x1234\]
+ 20: 0007c0f0012cd220 \.4 immed\[\*l\$index1, 0x1234\]
+ 28: 000fa0f0012cd230 \.5 immed\[\*l\$index1\+\+, 0x1234\]
+ 30: 000f40f0012cd231 \.6 immed\[\*l\$index1--, 0x1234\]
+ 38: 0008c8f0012cd200 \.7 immed\[\*l\$index2, 0x1234\]
+ 40: 0000a8f0012cd210 \.8 immed\[\*l\$index2\+\+, 0x1234\]
+ 48: 000048f0012cd211 \.9 immed\[\*l\$index2--, 0x1234\]
+ 50: 000968f0012cd220 \.10 immed\[\*l\$index3, 0x1234\]
+ 58: 0007e0f0012cd203 \.11 immed\[\*l\$index0\[3\], 0x1234\]
+ 60: 000540f0012cd225 \.12 immed\[\*l\$index1\[5\], 0x1234\]
+ 68: 000b28f0012cd207 \.13 immed\[\*l\$index2\[7\], 0x1234\]
+ 70: 000de8f0012cd229 \.14 immed\[\*l\$index3\[9\], 0x1234\]
+ 78: 000000f00ff003ff \.15 immed\[gprB_0, 0xffff\]
+ 80: 000d60f220000bff \.16 immed_b1\[gprB_2, 0xff\]
+ 88: 000f60f6200007ff \.17 immed_b3\[gprB_1, 0xff\]
+ 90: 000080f080000f00 \.18 immed\[gprB_3, 0xffffffff\]
+ 98: 000100f086600f77 \.19 immed\[gprB_3, 0xffff9988\]
+ a0: 000940f0012cd180 \.20 immed\[\$xfer_0, 0x1234\]
+ a8: 000a00f0043c8581 \.21 immed\[\$xfer_1, 0x4321\]
+ b0: 000b40f0056de19e \.22 immed\[\$xfer_30, 0x5678\]
+ b8: 0007c0f0400e8401 \.23 immed_w0\[gprA_1, 0xa1\]
+ c0: 000440f4400e8802 \.24 immed_w1\[gprA_2, 0xa2\]
+ c8: 000d00f4000e8c03 \.25 immed\[gprA_3, 0xa3, <<16\]
+ d0: 000520f001200334 \.26 immed\[gprB_0, 0x1234\]
+ d8: 000fa0f0400007b1 \.27 immed_w0\[gprB_1, 0xb1\]
+ e0: 000c20f440000bb2 \.28 immed_w1\[gprB_2, 0xb2\]
+ e8: 000560f400000fb3 \.29 immed\[gprB_3, 0xb3, <<16\]
+ f0: 000660f200000fb3 \.30 immed\[gprB_3, 0xb3, <<8\]
+ f8: 0001b0f200000fb3 \.31 immed\[gprB_3, 0xb3, <<8\], predicate_cc
+ 100: 0001c2f200000fb3 \.32 immed\[gprB_3, 0xb3, <<8\], gpr_wrboth
+ 108: 000ba0a0300c2f00 \.33 alu\[--, --, B, 0xb\]
+ 110: 0005a081f200da00 \.34 alu_shf\[--, --, B, 0x16, <<1\]
+ 118: 000be081d2018600 \.35 alu_shf\[--, --, B, 0x21, <<3\]
+ 120: 000240801201b200 \.36 alu_shf\[--, --, B, 0x2c, <<31\]
+ 128: 000fa081f800da00 \.37 alu_shf\[\$xfer_0, --, B, 0x16, <<1\]
+ 130: 0009e081f840da00 \.38 alu_shf\[\$xfer_4, --, B, 0x16, <<1\]
+ 138: 0009a081f980da00 \.39 alu_shf\[\$xfer_24, --, B, 0x16, <<1\]
+ 140: 0003e081f9f0da00 \.40 alu_shf\[\$xfer_31, --, B, 0x16, <<1\]
+ 148: 0004a0a0280c2f00 \.41 alu\[n\$reg_0, --, B, 0xb\]
+ 150: 0001e0a0281c2f00 \.42 alu\[n\$reg_1, --, B, 0xb\]
+ 158: 000880a0a00c2400 \.43 alu\[\*l\$index0, gprA_0, \+, 0x9\]
+ 160: 000100a0a43c2400 \.44 alu\[\*n\$index\+\+, gprA_0, \+, 0x9\]
+ 168: 000b208bc500a600 \.45 alu_shf\[\*l\$index0, gprA_0, OR, 0x9, <<4\]
+ 170: 000b00a0a20c2400 \.46 alu\[\*l\$index1, gprA_0, \+, 0x9\]
+ 178: 000740a0a30c2400 \.47 alu\[\*l\$index1\+\+, gprA_0, \+, 0x9\]
+ 180: 000200a0a31c2400 \.48 alu\[\*l\$index1--, gprA_0, \+, 0x9\]
+ 188: 000628a0a00c2400 \.49 alu\[\*l\$index2, gprA_0, \+, 0x9\]
+ 190: 000988aa210c2400 \.50 alu\[\*l\$index2\+\+, gprA_0, OR, 0x9\]
+ 198: 000f28a0a11c2400 \.51 alu\[\*l\$index2--, gprA_0, \+, 0x9\]
+ 1a0: 0005a8a0a20c2400 \.52 alu\[\*l\$index3, gprA_0, \+, 0x9\]
+ 1a8: 000480a0a03c2400 \.53 alu\[\*l\$index0\[3\], gprA_0, \+, 0x9\]
+ 1b0: 000800a0a25c2400 \.54 alu\[\*l\$index1\[5\], gprA_0, \+, 0x9\]
+ 1b8: 000c68a0a07c2400 \.55 alu\[\*l\$index2\[7\], gprA_0, \+, 0x9\]
+ 1c0: 000aa8a0a29c2400 \.56 alu\[\*l\$index3\[9\], gprA_0, \+, 0x9\]
+ 1c8: 000cc4b0c008a400 \.57 alu\[gprB_0, \*l\$index3\[9\], \+, gprA_0\]
+ 1d0: 000fe4b0c008c000 \.58 alu\[gprB_0, \*l\$index3\+\+, \+, gprA_0\]
+ 1d8: 000ac4b0c008c400 \.59 alu\[gprB_0, \*l\$index3--, \+, gprA_0\]
+ 1e0: 000bc4b080000229 \.60 alu\[gprB_0, \*l\$index3\[9\], \+, gprB_0\]
+ 1e8: 000724b080000230 \.61 alu\[gprB_0, \*l\$index3\+\+, \+, gprB_0\]
+ 1f0: 0007c4b080000231 \.62 alu\[gprB_0, \*l\$index3--, \+, gprB_0\]
+ 1f8: 000664b080000211 \.63 alu\[gprB_0, \*l\$index2--, \+, gprB_0\]
+ 200: 000a60b080000231 \.64 alu\[gprB_0, \*l\$index1--, \+, gprB_0\]
+ 208: 000bc0b080000211 \.65 alu\[gprB_0, \*l\$index0--, \+, gprB_0\]
+ 210: 000340b080000200 \.66 alu\[gprB_0, \*l\$index0, \+, gprB_0\]
+ 218: 000ee4b080000200 \.67 alu\[gprB_0, \*l\$index2, \+, gprB_0\]
+ 220: 000100b080000241 \.68 alu\[gprB_0, \*n\$index, \+, gprB_0\]
+ 228: 0004809bf0000241 \.69 alu_shf\[gprB_0, \*n\$index, OR, gprB_0, <<1\]
+ 230: 000f20a0001fff00 \.70 alu\[gprA_1, --, B, 0xff\]
+ 238: 0005c0b0002fff00 \.71 alu\[gprB_2, --, B, 0xff\]
+ 240: 000940a0000d6f00 \.72 alu\[gprA_0, --, B, 0x5b\]
+ 248: 000440a2000d6f00 \.73 alu\[gprA_0, --, ~B, 0x5b\]
+ 250: 000de081f032f200 \.74 alu_shf\[gprA_3, --, B, 0x5c, <<1\]
+ 258: 000de091d012f600 \.75 alu_shf\[gprB_1, --, B, 0x5d, <<3\]
+ 260: 000d60901022fa00 \.76 alu_shf\[gprB_2, --, B, 0x5e, <<31\]
+ 268: 000e40a0c0000402 \.77 alu\[gprA_0, gprB_1, \+, gprA_2\]
+ 270: 000340a2c0000402 \.78 alu\[gprA_0, gprB_1, \+16, gprA_2\]
+ 278: 000040a4c0000402 \.79 alu\[gprA_0, gprB_1, \+8, gprA_2\]
+ 280: 0007a0a8c0000402 \.80 alu\[gprA_0, gprB_1, \+carry, gprA_2\]
+ 288: 000d40a6c0000402 \.81 alu\[gprA_0, gprB_1, -carry, gprA_2\]
+ 290: 000aa0aac0000402 \.82 alu\[gprA_0, gprB_1, -, gprA_2\]
+ 298: 0009a0acc0000402 \.83 alu\[gprA_0, gprB_1, B-A, gprA_2\]
+ 2a0: 000da0aa40000402 \.84 alu\[gprA_0, gprB_1, OR, gprA_2\]
+ 2a8: 000740a440000402 \.85 alu\[gprA_0, gprB_1, AND, gprA_2\]
+ 2b0: 000a40a640000402 \.86 alu\[gprA_0, gprB_1, ~AND, gprA_2\]
+ 2b8: 0000a0a840000402 \.87 alu\[gprA_0, gprB_1, AND~, gprA_2\]
+ 2c0: 000ea0ac40000402 \.88 alu\[gprA_0, gprB_1, XOR, gprA_2\]
+ 2c8: 000321a0c0000402 \.89 alu\[gprA_0, gprB_1, \+, gprA_2\], no_cc
+ 2d0: 000990a0c0000402 \.90 alu\[gprA_0, gprB_1, \+, gprA_2\], predicate_cc
+ 2d8: 0009e2a0c0000402 \.91 alu\[gprA_0, gprB_1, \+, gprA_2\], gpr_wrboth
+ 2e0: 000353a0c0000402 \.92 alu\[gprA_0, gprB_1, \+, gprA_2\], no_cc, gpr_wrboth, predicate_cc
+ 2e8: 000d418b70080602 \.93 alu_shf\[gprA_0, gprB_1, OR, gprA_2, <<9\], no_cc
+ 2f0: 0006708a90080502 \.94 alu_shf\[gprA_0, gprB_1, OR, gprA_2, >>9\], predicate_cc
+ 2f8: 000ea28a90080402 \.95 alu_shf\[gprA_0, gprB_1, OR, gprA_2, >>rot9\], gpr_wrboth
+ 300: 000e138b70080402 \.96 alu_shf\[gprA_0, gprB_1, OR, gprA_2, >>rot23\], no_cc, gpr_wrboth, predicate_cc
+ 308: 000ba08a00080602 \.97 alu_shf\[gprA_0, gprB_1, OR, gprA_2, <<indirect\]
+ 310: 0000208a00080502 \.98 alu_shf\[gprA_0, gprB_1, OR, gprA_2, >>indirect\]
+ 318: 000ba0a0300c2f00 \.99 alu\[--, --, B, 0xb\]
+ 320: 000ae09d40380101 \.100 asr\[gprB_3, gprA_1, >>20\]
+ 328: 000ba0a0300c2f00 \.101 alu\[--, --, B, 0xb\]
+ 330: 000ea09d40310500 \.102 asr\[gprB_3, \*n\$index, >>20\]
+ 338: 000ba0a0300c2f00 \.103 alu\[--, --, B, 0xb\]
+ 340: 0007a09d40314100 \.104 asr\[gprB_3, \*l\$index0, >>20\]
+ 348: 000ba0a0300c2f00 \.105 alu\[--, --, B, 0xb\]
+ 350: 0000249d40316100 \.106 asr\[gprB_3, \*l\$index3, >>20\]
+ 358: 000ba0a0300c2f00 \.107 alu\[--, --, B, 0xb\]
+ 360: 000a049d40314100 \.108 asr\[gprB_3, \*l\$index2, >>20\]
+ 368: 000ba0a0300c2f00 \.109 alu\[--, --, B, 0xb\]
+ 370: 0004a08d45010d00 \.110 asr\[\*l\$index0, \*n\$index\+\+, >>20\]
+ 378: 000ba0a0300c2f00 \.111 alu\[--, --, B, 0xb\]
+ 380: 000ee08d45810d00 \.112 asr\[\*l\$index1, \*n\$index\+\+, >>20\]
+ 388: 000ba0a0300c2f00 \.113 alu\[--, --, B, 0xb\]
+ 390: 000a088d45010d00 \.114 asr\[\*l\$index2, \*n\$index\+\+, >>20\]
+ 398: 000ba0a0300c2f00 \.115 alu\[--, --, B, 0xb\]
+ 3a0: 0007819d40380101 \.116 asr\[gprB_3, gprA_1, >>20\], no_cc
+ 3a8: 000ba0a0300c2f00 \.117 alu\[--, --, B, 0xb\]
+ 3b0: 000d309d40380101 \.118 asr\[gprB_3, gprA_1, >>20\], predicate_cc
+ 3b8: 000ba0a0300c2f00 \.119 alu\[--, --, B, 0xb\]
+ 3c0: 000ba28d40380101 \.120 asr\[gprA_3, gprA_1, >>20\], gpr_wrboth
+ 3c8: 0008c0d818c08120 \.121 beq\[\.99\]
+ 3d0: 000d00d877c08120 \.122 beq\[\.479\]
+ 3d8: 000440d877e08120 \.123 beq\[\.479\], defer\[2\]
+ 3e0: 000000f0000c0300 \.124 nop
+ 3e8: 000000f0000c0300 \.125 nop
+ 3f0: 000540d877c08021 \.126 bne\[\.479\]
+ 3f8: 0004c0d877c08022 \.127 bmi\[\.479\]
+ 400: 000420d877c08023 \.128 bpl\[\.479\]
+ 408: 0007c0d877c08024 \.129 bcs\[\.479\]
+ 410: 0007c0d877c08024 \.130 bcs\[\.479\]
+ 418: 000720d877c08025 \.131 bcc\[\.479\]
+ 420: 000720d877c08025 \.132 bcc\[\.479\]
+ 428: 0006a0d877c08026 \.133 bvs\[\.479\]
+ 430: 000640d877c08027 \.134 bvc\[\.479\]
+ 438: 0001c0d877c08028 \.135 bge\[\.479\]
+ 440: 000120d877c08029 \.136 blt\[\.479\]
+ 448: 000040d877c0802b \.137 bgt\[\.479\]
+ 450: 0000a0d877c0802a \.138 ble\[\.479\]
+ 458: 000c60d818c08038 \.139 br\[\.99\]
+ 460: 000920d818d08038 \.140 br\[\.99\], defer\[1\]
+ 468: 000000f0000c0300 \.141 nop
+ 470: 000bc0d077c09000 \.142 br_bclr\[gprA_0, 3, \.479\]
+ 478: 000980d077c0e004 \.143 br_bclr\[gprA_4, 23, \.479\]
+ 480: 0002a0d077c0082c \.144 br_bclr\[gprB_2, 11, \.479\]
+ 488: 000300d077c02423 \.145 br_bclr\[gprB_9, 2, \.479\]
+ 490: 000260d077c02421 \.146 br_bclr\[gprB_9, 0, \.479\]
+ 498: 000280d077c02420 \.147 br_bclr\[gprB_9, 31, \.479\]
+ 4a0: 000f00d077f02423 \.148 br_bclr\[gprB_9, 2, \.479\], defer\[3\]
+ 4a8: 000000f0000c0300 \.149 nop
+ 4b0: 000000f0000c0300 \.150 nop
+ 4b8: 000000f0000c0300 \.151 nop
+ 4c0: 000680d077c42c2b \.152 br_bset\[gprB_11, 10, \.479\]
+ 4c8: 0006e0d077c4ac0b \.153 br_bset\[gprA_11, 10, \.479\]
+ 4d0: 0002a0c877d81020 \.154 br=byte\[gprB_4, 0, 0x0, \.479\], defer\[1\]
+ 4d8: 000000f0000c0300 \.155 nop
+ 4e0: 000a60c877c81520 \.156 br=byte\[gprB_5, 1, 0x0, \.479\]
+ 4e8: 0001e0c877c81620 \.157 br=byte\[gprB_5, 2, 0x0, \.479\]
+ 4f0: 0001a4c877c94220 \.158 br=byte\[\*l\$index2, 2, 0x0, \.479\]
+ 4f8: 000620c877c96220 \.159 br=byte\[\*l\$index1, 2, 0x0, \.479\]
+ 500: 000540c877c81b20 \.160 br=byte\[gprB_6, 3, 0x0, \.479\]
+ 508: 0000c0c877cc16ff \.161 br=byte\[gprB_5, 2, 0xff, \.479\]
+ 510: 000420c877c816a2 \.162 br=byte\[gprB_5, 2, 0x42, \.479\]
+ 518: 000380c877c416ff \.163 br!=byte\[gprB_5, 2, 0xff, \.479\]
+ 520: 0002a0c877c01620 \.164 br!=byte\[gprB_5, 2, 0x0, \.479\]
+ 528: 000c20d877c00236 \.165 br_cls_state\[cls_ring0_status, \.479\]
+ 530: 0001a0d877e20236 \.166 br_cls_state\[cls_ring8_status, \.479\], defer\[2\]
+ 538: 000000f0000c0300 \.167 nop
+ 540: 000000f0000c0300 \.168 nop
+ 548: 000be0d877c38236 \.169 br_cls_state\[cls_ring14_status, \.479\]
+ 550: 0007c0d877c3c236 \.170 br_cls_state\[cls_ring15_status, \.479\]
+ 558: 000720d877c3c237 \.171 br_!cls_state\[cls_ring15_status, \.479\]
+ 560: 000cc0d877c00237 \.172 br_!cls_state\[cls_ring0_status, \.479\]
+ 568: 000c00d877c00030 \.173 br=ctx\[0, \.479\]
+ 570: 000dc0d877c08030 \.174 br=ctx\[2, \.479\]
+ 578: 000f00d877c18030 \.175 br=ctx\[6, \.479\]
+ 580: 000a40d877d18030 \.176 br=ctx\[6, \.479\], defer\[1\]
+ 588: 000000f0000c0300 \.177 nop
+ 590: 000d40d877c00234 \.178 br_inp_state\[nn_empty, \.479\]
+ 598: 000160d877c04234 \.179 br_inp_state\[nn_full, \.479\]
+ 5a0: 000c80d877c08234 \.180 br_inp_state\[ctm_ring0_status, \.479\]
+ 5a8: 000100d877e28234 \.181 br_inp_state\[ctm_ring8_status, \.479\], defer\[2\]
+ 5b0: 000000f0000c0300 \.182 nop
+ 5b8: 000000f0000c0300 \.183 nop
+ 5c0: 000a80d877c38234 \.184 br_inp_state\[ctm_ring12_status, \.479\]
+ 5c8: 0006a0d877c3c234 \.185 br_inp_state\[ctm_ring13_status, \.479\]
+ 5d0: 000640d877c3c235 \.186 br_!inp_state\[ctm_ring13_status, \.479\]
+ 5d8: 000c60d877c08235 \.187 br_!inp_state\[ctm_ring0_status, \.479\]
+ 5e0: 000260d877c04232 \.188 br_signal\[1, \.479\]
+ 5e8: 000f80d877c08232 \.189 br_signal\[2, \.479\]
+ 5f0: 0005a0d877c3c232 \.190 br_signal\[15, \.479\]
+ 5f8: 000540d877c3c233 \.191 br_!signal\[15, \.479\]
+ 600: 000b60d877f2c232 \.192 br_signal\[11, \.479\], defer\[3\]
+ 608: 000000f0000c0300 \.193 nop
+ 610: 000000f0000c0300 \.194 nop
+ 618: 000000f0000c0300 \.195 nop
+ 620: 000e40a0c0000402 \.196 alu\[gprA_0, gprB_1, \+, gprA_2\]
+ 628: 0004408e02081200 \.197 byte_align_le\[--, gprB_4\]
+ 630: 0008c08e00981200 \.198 byte_align_le\[gprA_9, gprB_4\]
+ 638: 0004c08e00a81200 \.199 byte_align_le\[gprA_10, gprB_4\]
+ 640: 0001808e00b81200 \.200 byte_align_le\[gprA_11, gprB_4\]
+ 648: 000e40a0c0000402 \.201 alu\[gprA_0, gprB_1, \+, gprA_2\]
+ 650: 000c808e02001100 \.202 byte_align_be\[--, gprB_4\]
+ 658: 0000008e00901100 \.203 byte_align_be\[gprA_9, gprB_4\]
+ 660: 000c008e00a01100 \.204 byte_align_be\[gprA_10, gprB_4\]
+ 668: 0009408e00b01100 \.205 byte_align_be\[gprA_11, gprB_4\]
+ 670: 000d80a0300c0300 \.206 alu\[--, --, B, 0x0\]
+ 678: 000400a5b00c0000 \.207 cam_clear
+ 680: 000360bb80900007 \.208 cam_lookup\[gprB_9, gprA_7\]
+ 688: 0003a0bb80900200 \.209 cam_lookup\[gprB_9, \*l\$index0\]
+ 690: 000e04bb80900200 \.210 cam_lookup\[gprB_9, \*l\$index2\]
+ 698: 000f84bb80900203 \.211 cam_lookup\[gprB_9, \*l\$index2\[3\]\]
+ 6a0: 000bc0bb80900210 \.212 cam_lookup\[gprB_9, \*l\$index0\+\+\]
+ 6a8: 000280aba0000241 \.213 cam_lookup\[\*l\$index0, \*n\$index\]
+ 6b0: 000ec0aba1000241 \.214 cam_lookup\[\*l\$index0\+\+, \*n\$index\]
+ 6b8: 000288aba3000243 \.215 cam_lookup\[\*l\$index3\+\+, \*n\$index\+\+\]
+ 6c0: 000aa0aba0200243 \.216 cam_lookup\[\*l\$index0\[2\], \*n\$index\+\+\]
+ 6c8: 000060bb80901407 \.217 cam_lookup\[gprB_9, gprA_7\], lm_addr0\[1\]
+ 6d0: 000060bb80902807 \.218 cam_lookup\[gprB_9, gprA_7\], lm_addr1\[2\]
+ 6d8: 000660bb80907407 \.219 cam_lookup\[gprB_9, gprA_7\], lm_addr2\[3\]
+ 6e0: 000660bb80904807 \.220 cam_lookup\[gprB_9, gprA_7\], lm_addr3\[0\]
+ 6e8: 000222ab80900007 \.221 cam_lookup\[gprA_9, gprA_7\], gpr_wrboth
+ 6f0: 0004b0bb80900007 \.222 cam_lookup\[gprB_9, gprA_7\], predicate_cc
+ 6f8: 000a00a7809c0000 \.223 cam_read_tag\[gprA_9, 0x0\]
+ 700: 000da2a7809c0000 \.224 cam_read_tag\[gprA_9, 0x0\], gpr_wrboth
+ 708: 000dd0a7809c0000 \.225 cam_read_tag\[gprA_9, 0x0\], predicate_cc
+ 710: 000900a7809c2800 \.226 cam_read_tag\[gprA_9, 0xa\]
+ 718: 000a00a7809c3c00 \.227 cam_read_tag\[gprA_9, 0xf\]
+ 720: 0003e0af809c0000 \.228 cam_read_state\[gprA_9, 0x0\]
+ 728: 000442af809c0000 \.229 cam_read_state\[gprA_9, 0x0\], gpr_wrboth
+ 730: 000392af809c0000 \.230 cam_read_state\[gprA_9, 0x0\], gpr_wrboth, predicate_cc
+ 738: 0000e0af809c2800 \.231 cam_read_state\[gprA_9, 0xa\]
+ 740: 0003e0af809c3c00 \.232 cam_read_state\[gprA_9, 0xf\]
+ 748: 000920a9f0101700 \.233 cam_write\[0x0, gprB_5, 1\]
+ 750: 000da0a9f01a0300 \.234 cam_write\[0x0, n\$reg_0, 1\]
+ 758: 000e80a9f0190700 \.235 cam_write\[0x0, \*n\$index, 1\]
+ 760: 0004c4a9f0180300 \.236 cam_write\[0x0, \*l\$index2, 1\]
+ 768: 0008e4a9f0184300 \.237 cam_write\[0x0, \*l\$index2\+\+, 1\]
+ 770: 000dc4a9f0184700 \.238 cam_write\[0x0, \*l\$index2--, 1\]
+ 778: 000840a9f0b01704 \.239 cam_write\[0x4, gprB_5, 11\]
+ 780: 000be0a9f0f0170f \.240 cam_write\[0xf, gprB_5, 15\]
+ 788: 0008a0adb01c0000 \.241 cam_write_state\[0x0, 1\]
+ 790: 000d80adb0bc1000 \.242 cam_write_state\[0x4, 11\]
+ 798: 000de0adb0fc3c00 \.243 cam_write_state\[0xf, 15\]
+ 7a0: 0000c0fc142c000d \.244 local_csr_wr\[CRCRemainder, gprA_13\]
+ 7a8: 000d20a918060348 \.245 crc_le\[crc_ccitt, \$xfer_0, \$xfer_0\]
+ 7b0: 000000f0000c0300 \.246 nop
+ 7b8: 000d40a918160748 \.247 crc_le\[crc_ccitt, \$xfer_1, \$xfer_1\]
+ 7c0: 000000f0000c0300 \.248 nop
+ 7c8: 000d40a918260b48 \.249 crc_le\[crc_ccitt, \$xfer_2, \$xfer_2\]
+ 7d0: 000000f0000c0300 \.250 nop
+ 7d8: 000d20a918360f48 \.251 crc_le\[crc_ccitt, \$xfer_3, \$xfer_3\]
+ 7e0: 000000f0000c0300 \.252 nop
+ 7e8: 000000f0000c0300 \.253 nop
+ 7f0: 000000f0000c0300 \.254 nop
+ 7f8: 000000f0000c0300 \.255 nop
+ 800: 000000f0000c0300 \.256 nop
+ 808: 000f60fc140c0000 \.257 local_csr_rd\[CRCRemainder\]
+ 810: 000ce0f0000c000e \.258 immed\[gprA_14, 0x0\]
+ 818: 000940a918060340 \.259 crc_be\[crc_ccitt, \$xfer_0, \$xfer_0\]
+ 820: 000000f0000c0300 \.260 nop
+ 828: 000920a918461340 \.261 crc_be\[crc_ccitt, \$xfer_4, \$xfer_4\]
+ 830: 000000f0000c0300 \.262 nop
+ 838: 000060a900061340 \.263 crc_be\[crc_ccitt, gprA_0, \$xfer_4\]
+ 840: 000000f0000c0300 \.264 nop
+ 848: 000c60a900001340 \.265 crc_be\[crc_ccitt, gprA_0, gprB_4\]
+ 850: 000000f0000c0300 \.266 nop
+ 858: 000000f0000c0300 \.267 nop
+ 860: 000000f0000c0300 \.268 nop
+ 868: 000000f0000c0300 \.269 nop
+ 870: 000000f0000c0300 \.270 nop
+ 878: 000600a918260380 \.271 crc_be\[crc_32, \$xfer_2, \$xfer_0\]
+ 880: 000000f0000c0300 \.272 nop
+ 888: 0004c0a9183613a0 \.273 crc_be\[crc_iscsi, \$xfer_3, \$xfer_4\]
+ 890: 000000f0000c0300 \.274 nop
+ 898: 0004c0a9000613c0 \.275 crc_be\[crc_10, gprA_0, \$xfer_4\]
+ 8a0: 000000f0000c0300 \.276 nop
+ 8a8: 000960a9000013e0 \.277 crc_be\[crc_5, gprA_0, gprB_4\]
+ 8b0: 000000f0000c0300 \.278 nop
+ 8b8: 000ea0a918862700 \.279 crc_be\[--, \$xfer_8, \$xfer_9\]
+ 8c0: 000000f0000c0300 \.280 nop
+ 8c8: 000240a918760784 \.281 crc_be\[crc_32, \$xfer_7, \$xfer_1\], bytes_0_2
+ 8d0: 000000f0000c0300 \.282 nop
+ 8d8: 0002a0a918760785 \.283 crc_be\[crc_32, \$xfer_7, \$xfer_1\], bytes_0_1
+ 8e0: 000000f0000c0300 \.284 nop
+ 8e8: 000320a918760786 \.285 crc_be\[crc_32, \$xfer_7, \$xfer_1\], byte_0
+ 8f0: 000000f0000c0300 \.286 nop
+ 8f8: 0000c0a918760781 \.287 crc_be\[crc_32, \$xfer_7, \$xfer_1\], bytes_1_3
+ 900: 000000f0000c0300 \.288 nop
+ 908: 000140a918760782 \.289 crc_be\[crc_32, \$xfer_7, \$xfer_1\], bytes_2_3
+ 910: 000000f0000c0300 \.290 nop
+ 918: 0001a0a918760783 \.291 crc_be\[crc_32, \$xfer_7, \$xfer_1\], byte_3
+ 920: 000000f0000c0300 \.292 nop
+ 928: 000782a900160780 \.293 crc_be\[crc_32, gprA_1, \$xfer_1\], gpr_wrboth
+ 930: 000000f0000c0300 \.294 nop
+ 938: 000ae3a900160780 \.295 crc_be\[crc_32, gprA_1, \$xfer_1\], no_cc, gpr_wrboth
+ 940: 000000f0000c0300 \.296 nop
+ 948: 000b73a900560780 \.297 crc_be\[crc_32, gprA_5, \$xfer_1\], no_cc, gpr_wrboth, predicate_cc
+ 950: 000000f0000c0300 \.298 nop
+ 958: 000122a900560781 \.299 crc_be\[crc_32, gprA_5, \$xfer_1\], bytes_1_3, gpr_wrboth
+ 960: 000000f0000c0300 \.300 nop
+ 968: 000000f0000c0300 \.301 nop
+ 970: 000000f0000c0300 \.302 nop
+ 978: 000000f0000c0300 \.303 nop
+ 980: 000000f0000c0300 \.304 nop
+ 988: 000000f0000c0300 \.305 nop
+ 990: 0005a0e000080000 \.306 ctx_arb\[--\]
+ 998: 000600e000000001 \.307 ctx_arb\[voluntary\]
+ 9a0: 000220e000020000 \.308 ctx_arb\[bpt\]
+ 9a8: 000460e000000220 \.309 ctx_arb\[sig5, sig9\]
+ 9b0: 000d20e000200220 \.310 ctx_arb\[sig5, sig9\], defer\[2\]
+ 9b8: 000180a0300c0f00 \.311 alu\[--, --, B, 0x3\]
+ 9c0: 0007a0a0300c1f00 \.312 alu\[--, --, B, 0x7\]
+ 9c8: 0006a0e000010220 \.313 ctx_arb\[sig5, sig9\], any
+ 9d0: 000a60e077c40220 \.314 ctx_arb\[sig5, sig9\], br\[\.479\]
+ 9d8: 0006409010500701 \.315 dbl_shf\[gprB_5, gprA_1, gprB_1, >>1\]
+ 9e0: 000d4090a0500701 \.316 dbl_shf\[gprB_5, gprA_1, gprB_1, >>10\]
+ 9e8: 000c4091f0500701 \.317 dbl_shf\[gprB_5, gprA_1, gprB_1, >>31\]
+ 9f0: 000740a440000402 \.318 alu\[gprA_0, gprB_1, AND, gprA_2\]
+ 9f8: 0000c09000500701 \.319 dbl_shf\[gprB_5, gprA_1, gprB_1, >>indirect\]
+ a00: 000b219010500701 \.320 dbl_shf\[gprB_5, gprA_1, gprB_1, >>1\], no_cc
+ a08: 000cf19010500701 \.321 dbl_shf\[gprB_5, gprA_1, gprB_1, >>1\], no_cc, predicate_cc
+ a10: 0000d28010500701 \.322 dbl_shf\[gprA_5, gprA_1, gprB_1, >>1\], gpr_wrboth, predicate_cc
+ a18: 000200a700f03f00 \.323 ffs\[gprA_15, gprB_15\]
+ a20: 000fe0b740fc000f \.324 ffs\[gprB_15, gprA_15\]
+ a28: 000ec0b700f61300 \.325 ffs\[gprB_15, \$xfer_4\]
+ a30: 000660b700f88300 \.326 ffs\[gprB_15, \*l\$index1\]
+ a38: 0007e4b700f8c300 \.327 ffs\[gprB_15, \*l\$index3\+\+\]
+ a40: 0002c4b700f8c700 \.328 ffs\[gprB_15, \*l\$index3--\]
+ a48: 0004c4b700f8a700 \.329 ffs\[gprB_15, \*l\$index3\[9\]\]
+ a50: 000880a720000300 \.330 ffs\[\*l\$index0, gprB_0\]
+ a58: 000108a722090700 \.331 ffs\[\*l\$index3, \*n\$index\]
+ a60: 000128a723190f00 \.332 ffs\[\*l\$index3--, \*n\$index\+\+\]
+ a68: 0003c3a740fc000f \.333 ffs\[gprA_15, gprA_15\], no_cc, gpr_wrboth
+ a70: 000972a740fc000f \.334 ffs\[gprA_15, gprA_15\], gpr_wrboth, predicate_cc
+ a78: 000320f0000c0803 \.335 immed\[gprA_3, 0x2\]
+ a80: 000480e8004d4803 \.336 jump\[gprA_3, \.338\]
+ a88: 0006a0d854408038 \.337 br\[\.337\]
+ a90: 000460f000002701 \.338 immed\[gprB_9, 0x1\]
+ a98: 0006a0d854408038 \.339 br\[\.337\]
+ aa0: 0005e0f000002702 \.340 immed\[gprB_9, 0x2\]
+ aa8: 0006a0d854408038 \.341 br\[\.337\]
+ ab0: 000500f000002703 \.342 immed\[gprB_9, 0x3\]
+ ab8: 0006a0d854408038 \.343 br\[\.337\]
+ ac0: 000040c001000000 \.344 ld_field\[gprA_0, 0001, gprB_0\]
+ ac8: 0007e2c001000000 \.345 ld_field\[gprA_0, 0001, gprB_0\], gpr_wrboth
+ ad0: 000e40c401000000 \.346 ld_field\[gprA_0, 0001, gprB_0\], load_cc
+ ad8: 000790c001000000 \.347 ld_field\[gprA_0, 0001, gprB_0\], predicate_cc
+ ae0: 0005c0c005000000 \.348 ld_field\[gprA_0, 0101, gprB_0\]
+ ae8: 000080c005100000 \.349 ld_field_w_clr\[gprA_0, 0101, gprB_0\]
+ af0: 0002a2c001100000 \.350 ld_field_w_clr\[gprA_0, 0001, gprB_0\], gpr_wrboth
+ af8: 000b00c401100000 \.351 ld_field_w_clr\[gprA_0, 0001, gprB_0\], load_cc
+ b00: 0002d0c001100000 \.352 ld_field_w_clr\[gprA_0, 0001, gprB_0\], predicate_cc
+ b08: 000fc0c00f000000 \.353 ld_field\[gprA_0, 1111, gprB_0\]
+ b10: 0005e0c1fb000200 \.354 ld_field\[gprA_0, 1011, gprB_0, <<1\]
+ b18: 000460c01b000100 \.355 ld_field\[gprA_0, 1011, gprB_0, >>1\]
+ b20: 000e60c1fb000100 \.356 ld_field\[gprA_0, 1011, gprB_0, >>31\]
+ b28: 000bc0c09b000000 \.357 ld_field\[gprA_0, 1011, gprB_0, >>rot9\]
+ b30: 000e80c09b100000 \.358 ld_field_w_clr\[gprA_0, 1011, gprB_0, >>rot9\]
+ b38: 0001c0c17b000000 \.359 ld_field\[gprA_0, 1011, gprB_0, >>rot23\]
+ b40: 0002c0c41b000000 \.360 ld_field\[gprA_0, 1011, gprB_0, >>rot1\], load_cc
+ b48: 000780c41b100000 \.361 ld_field_w_clr\[gprA_0, 1011, gprB_0, >>rot1\], load_cc
+ b50: 000400f0001f7c01 \.362 immed\[gprA_1, 0x1df\]
+ b58: 000200f0001007df \.363 immed\[gprB_1, 0x1df\]
+ b60: 0005a2f0001007df \.364 immed\[gprB_1, 0x1df\], gpr_wrboth
+ b68: 0005d0f0001007df \.365 immed\[gprB_1, 0x1df\], predicate_cc
+ b70: 000020fc010c0000 \.366 local_csr_rd\[ALUOut\]
+ b78: 000e60f0000c000b \.367 immed\[gprA_11, 0x0\]
+ b80: 000ce0fc160c0000 \.368 local_csr_rd\[MiscControl\]
+ b88: 000e60f0000c000b \.369 immed\[gprA_11, 0x0\]
+ b90: 000ae0fc076c0b02 \.370 local_csr_wr\[XferIndex, 0x2\]
+ b98: 0008a0fc076c0003 \.371 local_csr_wr\[XferIndex, gprA_3\]
+ ba0: 000520fc07600f00 \.372 local_csr_wr\[XferIndex, gprB_3\]
+ ba8: 000f20fc01a00f00 \.373 local_csr_wr\[CtxEnables, gprB_3\]
+ bb0: 000480f800000c02 \.374 mul_step\[gprA_2, gprB_3\], start
+ bb8: 000880f980000c02 \.375 mul_step\[gprA_2, gprB_3\], 32x32_step1
+ bc0: 000dc0f980100c02 \.376 mul_step\[gprA_2, gprB_3\], 32x32_step2
+ bc8: 0001c0f980200c02 \.377 mul_step\[gprA_2, gprB_3\], 32x32_step3
+ bd0: 000480f980300c02 \.378 mul_step\[gprA_2, gprB_3\], 32x32_step4
+ bd8: 000940f9804c0002 \.379 mul_step\[gprA_2, --\], 32x32_last
+ be0: 000ce0f9805c0003 \.380 mul_step\[gprA_3, --\], 32x32_last2
+ be8: 0001a0f800000802 \.381 mul_step\[gprA_2, gprB_2\], start
+ bf0: 000aa0f900000802 \.382 mul_step\[gprA_2, gprB_2\], 16x16_step1
+ bf8: 000fe0f900100802 \.383 mul_step\[gprA_2, gprB_2\], 16x16_step2
+ c00: 000f20f9004c0000 \.384 mul_step\[gprA_0, --\], 16x16_last
+ c08: 0001a0f800000802 \.385 mul_step\[gprA_2, gprB_2\], start
+ c10: 0006a0f880000802 \.386 mul_step\[gprA_2, gprB_2\], 24x8_step1
+ c18: 000320f8804c0000 \.387 mul_step\[gprA_0, --\], 24x8_last
+ c20: 0001a0f800000802 \.388 mul_step\[gprA_2, gprB_2\], start
+ c28: 0006a0f880000802 \.389 mul_step\[gprA_2, gprB_2\], 24x8_step1
+ c30: 0004f0f8804c0000 \.390 mul_step\[gprA_0, --\], 24x8_last, predicate_cc
+ c38: 0001a0f800000802 \.391 mul_step\[gprA_2, gprB_2\], start
+ c40: 0006a0f880000802 \.392 mul_step\[gprA_2, gprB_2\], 24x8_step1
+ c48: 0009e3f8804c0000 \.393 mul_step\[gprA_0, --\], 24x8_last, no_cc, gpr_wrboth
+ c50: 000b80a330000000 \.394 pop_count1\[gprB_0\]
+ c58: 000c80a3b0000000 \.395 pop_count2\[gprB_0\]
+ c60: 000d80a180000000 \.396 pop_count3\[gprA_0, gprB_0\]
+ c68: 000b80a330000000 \.397 pop_count1\[gprB_0\]
+ c70: 000c80a3b0000000 \.398 pop_count2\[gprB_0\]
+ c78: 000743a180000000 \.399 pop_count3\[gprA_0, gprB_0\], no_cc, gpr_wrboth
+ c80: 0004a4a330088000 \.400 pop_count1\[\*l\$index3\]
+ c88: 0003a4a3b0088000 \.401 pop_count2\[\*l\$index3\]
+ c90: 0000e5a1a438c000 \.402 pop_count3\[\*n\$index\+\+, \*l\$index3\+\+\], no_cc
+ c98: 000b80a330000000 \.403 pop_count1\[gprB_0\]
+ ca0: 000c80a3b0000000 \.404 pop_count2\[gprB_0\]
+ ca8: 000731a180000000 \.405 pop_count3\[gprA_0, gprB_0\], no_cc, predicate_cc
+ cb0: 000480e8000c0000 \.406 rtn\[gprA_0\]
+ cb8: 000620e8000a0700 \.407 rtn\[n\$reg_1\]
+ cc0: 000600e800088300 \.408 rtn\[\*l\$index1\]
+ cc8: 000a64e800080300 \.409 rtn\[\*l\$index2\]
+ cd0: 000dc0e800200300 \.410 rtn\[gprB_0\], defer\[2\]
+ cd8: 0008a0a0300c0700 \.411 alu\[--, --, B, 0x1\]
+ ce0: 0004a0a0300c0b00 \.412 alu\[--, --, B, 0x2\]
+ ce8: 000000f0000c0300 \.413 nop
+ cf0: 000000f0000c0300 \.414 nop
+ cf8: 000000f0000c0300 \.415 nop
+ d00: 000000f0000c0300 \.416 nop
+ d08: 0003501842300c09 \.417 arm\[read, \$xfer_3, gprA_9, gprB_3, 2\], ctx_swap\[sig4\]
+ d10: 0005501842302403 \.418 arm\[read, \$xfer_3, gprA_3, gprB_9, 2\], ctx_swap\[sig4\]
+ d18: 0004801842300c09 \.419 arm\[read, \$xfer_3, gprA_9, <<8, gprB_3, 2\], ctx_swap\[sig4\]
+ d20: 000f241842302403 \.420 arm\[read, \$xfer_3, gprB_9, <<8, gprA_3, 2\], ctx_swap\[sig4\]
+ d28: 0004a0a0300c0b00 \.421 alu\[--, --, B, 0x2\]
+ d30: 0008861842302403 \.422 arm\[read, \$xfer_3, gprB_9, <<8, gprA_3, 2\], indirect_ref, ctx_swap\[sig4\]
+ d38: 0004a0a0300c0b00 \.423 alu\[--, --, B, 0x2\]
+ d40: 000e8618e2302703 \.424 arm\[read, \$xfer_3, gprB_9, <<8, gprA_3, 2\], indirect_ref, sig_done\[sig14\]
+ d48: 0007841842302503 \.425 arm\[read, \$xfer_3, gprB_9, <<8, gprA_3, 2\], ctx_swap\[sig4\], defer\[1\]
+ d50: 0008a0a0300c0700 \.426 alu\[--, --, B, 0x1\]
+ d58: 000f101843c00c09 \.427 arm\[read, \$xfer_28, gprA_9, gprB_3, 2\], ctx_swap\[sig4\]
+ d60: 000910184e800c09 \.428 arm\[read, \$xfer_8, gprA_9, gprB_3, 8\], ctx_swap\[sig4\]
+ d68: 000a106440800c09 \.429 cls\[add, \$xfer_8, gprA_9, gprB_3, 1\], ctx_swap\[sig4\]
+ d70: 0000f0664080a009 \.430 cls\[sub, \$xfer_8, gprA_9, 0x8, 1\], ctx_swap\[sig4\]
+ d78: 000160644284a009 \.431 cls\[add64, \$xfer_8, gprA_9, <<8, 0x8, 2\], ctx_swap\[sig4\]
+ d80: 000404664284a408 \.432 cls\[sub64, \$xfer_8, 0x9, <<8, gprA_8, 2\], ctx_swap\[sig4\]
+ d88: 0008a0a0300c0700 \.433 alu\[--, --, B, 0x1\]
+ d90: 00032c650340a708 \.434 cls\[add_imm, 0x14, 0x9, <<8, gprA_8, 2\]
+ d98: 0007506040880c09 \.435 cls\[swap/test_compare_write, \$xfer_8, gprA_9, gprB_3, 1\], ctx_swap\[sig4\]
+ da0: 00023c6500007f9a \.436 cls\[add_imm, 0x1f9a, --, 1\]
+ da8: 000038653c583f14 \.437 cls\[add_imm, 0xf14, 0xf16\]
+ db0: 000b54640013c30f \.438 cls\[add, \$xfer_1, 0xf00f, 1\]
+ db8: 0002901c10a08000 \.439 ct\[xpb_read, \$xfer_10, gprA_0, 0x0, 1\], ctx_swap\[sig1\]
+ dc0: 0007501e10a48000 \.440 ct\[reflect_read_sig_init, \$xfer_10, gprA_0, 0x0, 1\], ctx_swap\[sig1\]
+ dc8: 000a501c10a48000 \.441 ct\[ring_get, \$xfer_10, gprA_0, 0x0, 1\], ctx_swap\[sig1\]
+ dd0: 000000f0000c0300 \.442 nop
+ dd8: 000cc0474a80a009 \.443 mem\[add64, \$xfer_8, gprA_9, <<8, 0x8, 6\], ctx_swap\[sig4\]
+ de0: 000d40404280a009 \.444 mem\[read, \$xfer_8, gprA_9, <<8, 0x8, 2\], ctx_swap\[sig4\]
+ de8: 000c405c4280a009 \.445 mem\[read32, \$xfer_8, gprA_9, <<8, 0x8, 2\], ctx_swap\[sig4\]
+ df0: 000ea0554280a009 \.446 mem\[ctm\.pe_dma_to_memory_indirect/emem\.get/imem\.lb_bucket_read_local, \$xfer_8, gprA_9, <<8, 0x8, 2\], ctx_swap\[sig4\]
+ df8: 0009204c408ca309 \.447 mem\[lock128/lock384, \$xfer_8, gprA_9, <<8, 0x8, 1\], sig_done\[sig4\]
+ e00: 000f20e000000030 \.448 ctx_arb\[sig4, sig5\]
+ e08: 0000a04c488ca309 \.449 mem\[lock256/lock512, \$xfer_8, gprA_9, <<8, 0x8, 5\], sig_done\[sig4\]
+ e10: 000f20e000000030 \.450 ctx_arb\[sig4, sig5\]
+ e18: 000ae04d4084a009 \.451 mem\[microq128_pop, \$xfer_8, gprA_9, <<8, 0x8, 1\], ctx_swap\[sig4\]
+ e20: 0002204d4080a009 \.452 mem\[microq128_get, \$xfer_8, gprA_9, <<8, 0x8, 1\], ctx_swap\[sig4\]
+ e28: 000ba04d4880a009 \.453 mem\[microq256_get, \$xfer_8, gprA_9, <<8, 0x8, 5\], ctx_swap\[sig4\]
+ e30: 0003805700028309 \.454 mem\[ctm\.pe_dma_from_memory_buffer/emem\.fast_journal/imem\.lb_push_stats_local, \$xfer_0, gprA_9, <<8, 0x40, 1\]
+ e38: 0005e04e4000a309 \.455 mem\[queue128_lock, \$xfer_0, gprA_9, <<8, 0x8, 1\], sig_done\[sig4\]
+ e40: 000f20e000000030 \.456 ctx_arb\[sig4, sig5\]
+ e48: 0001a04e0004a309 \.457 mem\[queue128_unlock, \$xfer_0, gprA_9, <<8, 0x8, 1\]
+ e50: 000c604e4800a309 \.458 mem\[queue256_lock, \$xfer_0, gprA_9, <<8, 0x8, 5\], sig_done\[sig4\]
+ e58: 000f20e000000030 \.459 ctx_arb\[sig4, sig5\]
+ e60: 0008204e0804a309 \.460 mem\[queue256_unlock, \$xfer_0, gprA_9, <<8, 0x8, 5\]
+ e68: 0008a05000001309 \.461 mem\[ctm\.packet_wait_packet_status/emem\.rd_qdesc/imem\.stats_log, \$xfer_0, gprA_9, <<8, gprB_4, 1\]
+ e70: 000b840092200c02 \.462 ila\[read, \$xfer_2, gprB_3, <<8, gprA_2, 2\], ctx_swap\[sig9\]
+ e78: 0005440182240f02 \.463 ila\[write_check_error, \$xfer_2, gprB_3, <<8, gprA_2, 2\], sig_done\[sig8\]
+ e80: 000d60e000000300 \.464 ctx_arb\[sig8, sig9\]
+ e88: 0007800410600000 \.465 nbi\[read, \$xfer_6, gprA_0, <<8, gprB_0, 1\], ctx_swap\[sig1\]
+ e90: 0002600c62000000 \.466 pcie\[read, \$xfer_0, gprA_0, <<8, gprB_0, 2\], ctx_swap\[sig6\]
+ e98: 0004c40d62000000 \.467 pcie\[write, \$xfer_0, gprB_0, <<8, gprA_0, 2\], ctx_swap\[sig6\]
+ ea0: 000d601462000000 \.468 crypto\[read, \$xfer_0, gprA_0, <<8, gprB_0, 2\], ctx_swap\[sig6\]
+ ea8: 0006601562000000 \.469 crypto\[write, \$xfer_0, gprA_0, <<8, gprB_0, 2\], ctx_swap\[sig6\]
+ eb0: 0000601662000000 \.470 crypto\[write_fifo, \$xfer_0, gprA_0, <<8, gprB_0, 2\], ctx_swap\[sig6\]
+ eb8: 000d840d60000050 \.471 pcie\[write, \$xfer_0, gprB_0, <<8, \*l\$index0, 1\], ctx_swap\[sig6\]
+ ec0: 0009e40d60000058 \.472 pcie\[write, \$xfer_0, gprB_0, <<8, \*l\$index1, 1\], ctx_swap\[sig6\]
+ ec8: 0009040d60000059 \.473 pcie\[write, \$xfer_0, gprB_0, <<8, \*l\$index1\[1\], 1\], ctx_swap\[sig6\]
+ ed0: 000000f0000c0300 \.474 nop
+ ed8: 000000f0000c0300 \.475 nop
+ ee0: 000000f0000c0300 \.476 nop
+ ee8: 000000f0000c0300 \.477 nop
+ ef0: 000000f0000c0300 \.478 nop
+ ef8: 000060a900301340 \.479 crc_be\[crc_ccitt, gprA_3, gprB_4\]
+ f00: 000000f0000c0300 \.480 nop
+ f08: 000e20b9403d0004 \.481 crc_be\[crc_ccitt, gprB_3, gprA_4\]
+ f10: 000000f0000c0300 \.482 nop
+ f18: 000400a900301348 \.483 crc_le\[crc_ccitt, gprA_3, gprB_4\]
+ f20: 000000f0000c0300 \.484 nop
+ f28: 000400b9403d2004 \.485 crc_le\[crc_ccitt, gprB_3, gprA_4\]
+ f30: 000000f0000c0300 \.486 nop
+ f38: 0002e0b900301348 \.487 crc_le\[crc_ccitt, gprB_3, gprB_4\]
+ f40: 000000f0000c0300 \.488 nop
+ f48: 0002e0a9403d2004 \.489 crc_le\[crc_ccitt, gprA_3, gprA_4\]
+ f50: 000000f0000c0300 \.490 nop
+ f58: 000220e000020000 \.491 ctx_arb\[bpt\]
+ f60: 000420e000010000 \.492 ctx_arb\[kill\]
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ binutils-2.30/binutils/testsuite/binutils-all/nfp/test2_ctx8.d 2019-03-07 14:44:05.716268317 +0000
@@ -0,0 +1,16 @@
+
+.*: file format elf64-nfp
+
+
+Disassembly of section \.text\.i32\.me0:
+
+0000000000000000 <\.text\.i32\.me0>:
+ 0: 000d80a0300c0300 \.0 alu\[--, --, B, 0x0\]
+ 8: 0008a0a0300c0700 \.1 alu\[--, --, B, 0x1\]
+ 10: 0004a0a0300c0b00 \.2 alu\[--, --, B, 0x2\]
+ 18: 000180a0300c0f00 \.3 alu\[--, --, B, 0x3\]
+ 20: 0004a0a018cc1300 \.4 alu\[\$xfer_12, --, B, 0x4\]
+ 28: 0001c0a019fc1700 \.5 alu\[\$xfer_15, --, B, 0x5\]
+ 30: 000400a0b00c198c \.6 alu\[--, \$xfer_12, \+, 0x6\]
+ 38: 0008c0a0b00c1d9f \.7 alu\[--, \$xfer_15, \+, 0x7\]
+ 40: 000220e000020000 \.8 ctx_arb\[bpt\]
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ binutils-2.30/binutils/testsuite/binutils-all/nfp/test2_no-pc_ctx4.d 2019-03-07 14:44:05.716268317 +0000
@@ -0,0 +1,16 @@
+
+.*: file format elf64-nfp
+
+
+Disassembly of section \.text\.i32\.me0:
+
+0000000000000000 <\.text\.i32\.me0>:
+ 0: 000d80a0300c0300 alu\[--, --, B, 0x0\]
+ 8: 0008a0a0300c0700 alu\[--, --, B, 0x1\]
+ 10: 0004a0a0300c0b00 alu\[--, --, B, 0x2\]
+ 18: 000180a0300c0f00 alu\[--, --, B, 0x3\]
+ 20: 0004a0a018cc1300 alu\[\$xfer_12, --, B, 0x4\]
+ 28: 0001c0a019fc1700 alu\[\$xfer_31, --, B, 0x5\]
+ 30: 000400a0b00c198c alu\[--, \$xfer_12, \+, 0x6\]
+ 38: 0008c0a0b00c1d9f alu\[--, \$xfer_31, \+, 0x7\]
+ 40: 000220e000020000 ctx_arb\[bpt\]
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ binutils-2.30/include/elf/nfp.h 2019-03-07 14:44:05.716268317 +0000
@@ -0,0 +1,292 @@
+/* NFP ELF support for BFD.
+ Copyright (C) 2017-2018 Free Software Foundation, Inc.
+ Contributed by Francois H. Theron <francois.theron@netronome.com>
+
+ This file is part of BFD, the Binary File Descriptor library.
+
+ This program 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 of the License, or
+ (at your option) any later version.
+
+ This program 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. */
+
+#ifndef _ELF_NFP_H
+#define _ELF_NFP_H
+
+#include "bfd.h"
+#include "elf/common.h"
+#include "elf/reloc-macros.h"
+#include "bfd_stdint.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define ET_NFP_PARTIAL_REL (ET_LOPROC + ET_REL)
+#define ET_NFP_PARTIAL_EXEC (ET_LOPROC + ET_EXEC)
+
+/* NFP e_flags - chip family
+ Valid values for FAMILY are:
+ 0x3200 - NFP-32xx
+ 0x6000 - NFP-6xxx/NFP-4xxx. */
+#define EF_NFP_MACH(ef_nfp) (((ef_nfp) >> 8) & 0xFFFF)
+#define EF_NFP_SET_MACH(nfp_fam) (((nfp_fam) & 0xFFFF) << 8)
+
+#define E_NFP_MACH_3200 0x3200
+#define E_NFP_MACH_6000 0x6000
+
+#define NFP_3200_CPPTGT_MSF0 1
+#define NFP_3200_CPPTGT_QDR 2
+#define NFP_3200_CPPTGT_MSF1 3
+#define NFP_3200_CPPTGT_HASH 4
+#define NFP_3200_CPPTGT_MU 7
+#define NFP_3200_CPPTGT_GS 8
+#define NFP_3200_CPPTGT_PCIE 9
+#define NFP_3200_CPPTGT_ARM 10
+#define NFP_3200_CPPTGT_CRYPTO 12
+#define NFP_3200_CPPTGT_CAP 13
+#define NFP_3200_CPPTGT_CT 14
+#define NFP_3200_CPPTGT_CLS 15
+
+#define NFP_6000_CPPTGT_NBI 1
+#define NFP_6000_CPPTGT_VQDR 2
+#define NFP_6000_CPPTGT_ILA 6
+#define NFP_6000_CPPTGT_MU 7
+#define NFP_6000_CPPTGT_PCIE 9
+#define NFP_6000_CPPTGT_ARM 10
+#define NFP_6000_CPPTGT_CRYPTO 12
+#define NFP_6000_CPPTGT_CTXPB 14
+#define NFP_6000_CPPTGT_CLS 15
+
+/* NFP Section types
+ MECONFIG - NFP-32xx only, ME CSR configurations
+ INITREG - A generic register initialisation section (chip or ME CSRs/GPRs)
+ UDEBUG - Legacy-style debug data section. */
+#define SHT_NFP_MECONFIG (SHT_LOPROC + 1)
+#define SHT_NFP_INITREG (SHT_LOPROC + 2)
+#define SHT_NFP_UDEBUG SHT_LOUSER
+
+/* NFP SECTION flags
+ ELF-64 sh_flags is 64-bit, but there is no info on what the upper 32 bits
+ are expected to be used for, it is not marked reserved either.
+ We'll use them for NFP-specific flags since we don't use ELF-32.
+
+ INIT - Sections that are loaded and executed before the final text
+ microcode. Non-code INIT sections are loaded first, then other
+ memory secions, then INIT2 sections, then INIT-code sections.
+ INIT2 - Sections that are loaded before INIT-code sections, used for
+ transient configuration before executing INIT-code section
+ microcode.
+ SCS - The number of additional ME codestores being shared with the group's
+ base ME of the section, e.g. 0 for no SCS, 1 for dual and 3 for
+ quad. If this is 0 it is possible that stagger-style SCS codestore
+ sections are being used. For stagger-style each section is simply
+ loaded directly to the ME it is assigned to. If these flags are
+ used, virtual address space loading will be used - one large section
+ loaded to the group's base ME will be packed across shared MEs by
+ hardware. This is not available on all ME versions.
+
+ NFP_ELF_SHF_GET_SCS (val) returns the number of additional codestores
+ being shared with the group's base ME, e.g. 0 for no SCS,
+ 1 for dual SCS, 3 for quad SCS. */
+
+#define SHF_NFP_INIT 0x80000000
+#define SHF_NFP_INIT2 0x40000000
+#define SHF_NFP_SCS(shf) (((shf) >> 32) & 0xFF)
+#define SHF_NFP_SET_SCS(v) (((BFD_HOST_U_64_BIT)((v) & 0xFF)) << 32)
+
+/* NFP Section Info
+ For PROGBITS and NOBITS sections:
+ MEMTYPE - the memory type
+ DOMAIN - The island ID and ME number where the data will be loaded.
+ For NFP-32xx, this is an island number or linear ME number.
+ For NFP-6xxx, DOMAIN<15:8> == island ID, DOMAIN<7:0> is 0 based
+ ME number (if applicable).
+ For INITREG sections:
+ ISLAND - island ID (if it's a ME target, ME numbers are in the
+ section data)
+ CPPTGT - CPP Target ID
+ CPPACTRD - CPP Read Action
+ CPPTOKRD - CPP Read Token
+ CPPACTWR - CPP Write Action
+ CPPTOKWR - CPP Write Token
+ ORDER - Controls the order in which the loader processes sections with
+ the same info fields. */
+
+#define SHI_NFP_DOMAIN(shi) (((shi) >> 16) & 0xFFFF)
+#define SHI_NFP_MEMTYPE(shi) ( (shi) & 0xFFFF)
+#define SHI_NFP_SET_DOMAIN(v) (((v) & 0xFFFF) << 16)
+#define SHI_NFP_SET_MEMTYPE(v) ( (v) & 0xFFFF)
+
+#define SHI_NFP_IREG_ISLAND(shi) (((shi) >> 26) & 0x3F)
+#define SHI_NFP_IREG_CPPTGT(shi) (((shi) >> 22) & 0xF)
+#define SHI_NFP_IREG_CPPACTRD(shi) (((shi) >> 17) & 0x1F)
+#define SHI_NFP_IREG_CPPTOKRD(shi) (((shi) >> 15) & 0x3)
+#define SHI_NFP_IREG_CPPACTWR(shi) (((shi) >> 10) & 0x1F)
+#define SHI_NFP_IREG_CPPTOKWR(shi) (((shi) >> 8) & 0x3)
+#define SHI_NFP_IREG_ORDER(shi) ( (shi) & 0xFF)
+#define SHI_NFP_SET_IREG_ISLAND(v) (((v) & 0x3F) << 26)
+#define SHI_NFP_SET_IREG_CPPTGT(v) (((v) & 0xF) << 22)
+#define SHI_NFP_SET_IREG_CPPACTRD(v) (((v) & 0x1F) << 17)
+#define SHI_NFP_SET_IREG_CPPTOKRD(v) (((v) & 0x3) << 15)
+#define SHI_NFP_SET_IREG_CPPACTWR(v) (((v) & 0x1F) << 10)
+#define SHI_NFP_SET_IREG_CPPTOKWR(v) (((v) & 0x3) << 8)
+#define SHI_NFP_SET_IREG_ORDER(v) ( (v) & 0xFF)
+
+/* CtXpb/reflect_read_sig_init/reflect_write_sig_init
+ identifies Init-CSR sections for ME CSRs. */
+#define SHI_NFP_6000_IS_IREG_MECSR(shi) ( \
+ SHI_NFP_IREG_CPPTGT (shi) == NFP_6000_CPPTGT_CTXPB \
+ && SHI_NFP_IREG_CPPACTRD (shi) == 2 \
+ && SHI_NFP_IREG_CPPTOKRD (shi) == 1 \
+ && SHI_NFP_IREG_CPPACTWR (shi) == 3 \
+ && SHI_NFP_IREG_CPPTOKWR (shi) == 1 \
+)
+
+/* Transient INITREG sections will be validated against the target
+ but will not be kept - validate, write or read and discard.
+ They will still be handled last (in order). */
+#define SHI_NFP_IREG_ORDER_TRANSIENT 0xFF
+
+/* Below are some extra macros to translate SHI fields in more specific
+ contexts.
+
+ For NFP-32xx, DOMAIN is set to a global linear ME number (0 to 39).
+ An NFP-32xx has 8 MEs per island and up to 5 islands. */
+
+#define SHI_NFP_3200_ISLAND(shi) ((SHI_NFP_DOMAIN (shi) >> 3) & 0x7)
+#define SHI_NFP_3200_MENUM(shi) ( SHI_NFP_DOMAIN (shi) & 0x7)
+#define SHI_NFP_SET_3200_ISLAND(v) SHI_NFP_SET_DOMAIN (((v) & 0x7) << 3)
+#define SHI_NFP_SET_3200_MENUM(v) SHI_NFP_SET_DOMAIN ( (v) & 0x7)
+
+#define SHI_NFP_ISLAND(shi) ((SHI_NFP_DOMAIN (shi) >> 8) & 0xFF)
+#define SHI_NFP_MENUM(shi) ( SHI_NFP_DOMAIN (shi) & 0xFF)
+#define SHI_NFP_SET_ISLAND(shi) SHI_NFP_SET_DOMAIN (((shi) & 0xFF) << 8)
+#define SHI_NFP_SET_MENUM(shi) SHI_NFP_SET_DOMAIN ( (shi) & 0xFF)
+
+#define SHI_NFP_MEMTYPE_NONE 0
+#define SHI_NFP_MEMTYPE_USTORE 1
+#define SHI_NFP_MEMTYPE_LMEM 2
+#define SHI_NFP_MEMTYPE_CLS 3
+#define SHI_NFP_MEMTYPE_DRAM 4
+#define SHI_NFP_MEMTYPE_MU 4
+#define SHI_NFP_MEMTYPE_SRAM 5
+#define SHI_NFP_MEMTYPE_GS 6
+#define SHI_NFP_MEMTYPE_PPC_LMEM 7
+#define SHI_NFP_MEMTYPE_PPC_SMEM 8
+#define SHI_NFP_MEMTYPE_EMU_CACHE 9
+
+/* VTP_FORCE is for use by the NFP Linker+Loader only. */
+#define NFP_IREG_VTP_FORCE 0
+#define NFP_IREG_VTP_CONST 1
+#define NFP_IREG_VTP_REQUIRED 2
+#define NFP_IREG_VTP_VOLATILE_INIT 3
+#define NFP_IREG_VTP_VOLATILE_NOINIT 4
+#define NFP_IREG_VTP_INVALID 5
+
+/* Init-CSR entry w0 fields:
+ NLW - Not Last Word
+ CTX - ME context number (if applicable)
+ VTP - Value type
+ COH - CPP Offset High 8 bits. */
+#define NFP_IREG_ENTRY_WO_NLW(w0) (((w0) >> 31) & 0x1)
+#define NFP_IREG_ENTRY_WO_CTX(w0) (((w0) >> 28) & 0x7)
+#define NFP_IREG_ENTRY_WO_VTP(w0) (((w0) >> 25) & 0x7)
+#define NFP_IREG_ENTRY_WO_COH(w0) (((w0) >> 0) & 0xFF)
+
+typedef struct
+{
+ uint32_t w0;
+ uint32_t cpp_offset_lo;
+ uint32_t val;
+ uint32_t mask;
+} Elf_Nfp_InitRegEntry;
+
+typedef struct
+{
+ uint32_t ctx_enables;
+ uint32_t entry;
+ uint32_t misc_control;
+ uint32_t reserved;
+} Elf_Nfp_MeConfig;
+
+/* Relocations. */
+START_RELOC_NUMBERS (elf_nfp3200_reloc_type)
+ RELOC_NUMBER (R_NFP3200_NOTYPE, 0)
+ RELOC_NUMBER (R_NFP3200_W32LE, 1)
+ RELOC_NUMBER (R_NFP3200_SRC8_A, 2)
+ RELOC_NUMBER (R_NFP3200_SRC8_B, 3)
+ RELOC_NUMBER (R_NFP3200_IMMED8_I, 4)
+ RELOC_NUMBER (R_NFP3200_SC, 5)
+ RELOC_NUMBER (R_NFP3200_IMMED_LO16_I_A, 6)
+ RELOC_NUMBER (R_NFP3200_IMMED_LO16_I_B, 7)
+ RELOC_NUMBER (R_NFP3200_SRC7_B, 8)
+ RELOC_NUMBER (R_NFP3200_SRC7_A, 9)
+ RELOC_NUMBER (R_NFP3200_SRC8_I_B, 10)
+ RELOC_NUMBER (R_NFP3200_SRC8_I_A, 11)
+ RELOC_NUMBER (R_NFP3200_IMMED_HI16_I_A, 12)
+ RELOC_NUMBER (R_NFP3200_IMMED_HI16_I_B, 13)
+ RELOC_NUMBER (R_NFP3200_RSVD_0, 14)
+ RELOC_NUMBER (R_NFP3200_RSVD_1, 15)
+ RELOC_NUMBER (R_NFP3200_RSVD_2, 16)
+ RELOC_NUMBER (R_NFP3200_RSVD_3, 17)
+ RELOC_NUMBER (R_NFP3200_RSVD_4, 18)
+ RELOC_NUMBER (R_NFP3200_RSVD_5, 19)
+ RELOC_NUMBER (R_NFP3200_RSVD_6, 20)
+ RELOC_NUMBER (R_NFP3200_W64LE, 21)
+ RELOC_NUMBER (R_NFP3200_W32BE, 22)
+ RELOC_NUMBER (R_NFP3200_W64BE, 23)
+ RELOC_NUMBER (R_NFP3200_W32LE_AND, 24)
+ RELOC_NUMBER (R_NFP3200_W32BE_AND, 25)
+ RELOC_NUMBER (R_NFP3200_W32LE_OR, 26)
+ RELOC_NUMBER (R_NFP3200_W32BE_OR, 27)
+ RELOC_NUMBER (R_NFP3200_W64LE_AND, 28)
+ RELOC_NUMBER (R_NFP3200_W64BE_AND, 29)
+ RELOC_NUMBER (R_NFP3200_W64LE_OR, 30)
+ RELOC_NUMBER (R_NFP3200_W64BE_OR, 31)
+END_RELOC_NUMBERS (R_NFP3200_MAX)
+
+START_RELOC_NUMBERS (elf_nfp_reloc_type)
+ RELOC_NUMBER (R_NFP_NOTYPE, 0)
+ RELOC_NUMBER (R_NFP_W32LE, 1)
+ RELOC_NUMBER (R_NFP_SRC8_A, 2)
+ RELOC_NUMBER (R_NFP_SRC8_B, 3)
+ RELOC_NUMBER (R_NFP_IMMED8_I, 4)
+ RELOC_NUMBER (R_NFP_SC, 5)
+ RELOC_NUMBER (R_NFP_IMMED_LO16_I_A, 6)
+ RELOC_NUMBER (R_NFP_IMMED_LO16_I_B, 7)
+ RELOC_NUMBER (R_NFP_SRC7_B, 8)
+ RELOC_NUMBER (R_NFP_SRC7_A, 9)
+ RELOC_NUMBER (R_NFP_SRC8_I_B, 10)
+ RELOC_NUMBER (R_NFP_SRC8_I_A, 11)
+ RELOC_NUMBER (R_NFP_IMMED_HI16_I_A, 12)
+ RELOC_NUMBER (R_NFP_IMMED_HI16_I_B, 13)
+ RELOC_NUMBER (R_NFP_W64LE, 14)
+ RELOC_NUMBER (R_NFP_SH_INFO, 15)
+ RELOC_NUMBER (R_NFP_W32BE, 16)
+ RELOC_NUMBER (R_NFP_W64BE, 17)
+ RELOC_NUMBER (R_NFP_W32_29_24, 18)
+ RELOC_NUMBER (R_NFP_W32LE_AND, 19)
+ RELOC_NUMBER (R_NFP_W32BE_AND, 20)
+ RELOC_NUMBER (R_NFP_W32LE_OR, 21)
+ RELOC_NUMBER (R_NFP_W32BE_OR, 22)
+ RELOC_NUMBER (R_NFP_W64LE_AND, 23)
+ RELOC_NUMBER (R_NFP_W64BE_AND, 24)
+ RELOC_NUMBER (R_NFP_W64LE_OR, 25)
+ RELOC_NUMBER (R_NFP_W64BE_OR, 26)
+END_RELOC_NUMBERS (R_NFP_MAX)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ELF_NFP_H */
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ binutils-2.30/include/opcode/nfp.h 2019-03-07 14:50:55.251991587 +0000
@@ -0,0 +1,175 @@
+/* nfp.h. NFP opcode list.
+ Copyright (C) 2017-2019 Free Software Foundation, Inc.
+ Contributed by Francois H. Theron <francois.theron@netronome.com>
+
+ This file is part of the GNU opcodes library.
+
+ GDB, GAS, and the GNU binutils are free software; you can redistribute
+ them and/or modify them 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.
+
+ GDB, GAS, and the GNU binutils are distributed in the hope that they
+ 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 file; see the file COPYING3. If not, write to the Free
+ Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
+#ifndef _NFP_H_
+#define _NFP_H_
+
+#include "bfd.h"
+#include "bfd_stdint.h"
+#include "elf/nfp.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* We use ME versions for most of this rather than NFP family and revision
+ numbers. The version numbers are currently 2.7 and 2.8 and to avoid long
+ names with many underscores we'll just use 27 and 28 until some feature
+ number makes it necessary to do something different. */
+
+#define NFP_ME27_INSTR_MASK_CMD ((uint64_t) 0x008000000000)
+#define NFP_ME27_INSTR_CMD ((uint64_t) 0x000000000000)
+#define NFP_ME27_INSTR_IS_CMD(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_CMD) == NFP_ME27_INSTR_CMD)
+
+#define NFP_ME27_INSTR_MASK_ALU_SHF ((uint64_t) 0x1ee000000000)
+#define NFP_ME27_INSTR_ALU_SHF ((uint64_t) 0x008000000000)
+#define NFP_ME27_INSTR_IS_ALU_SHF(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_ALU_SHF) == NFP_ME27_INSTR_ALU_SHF)
+
+#define NFP_ME27_INSTR_MASK_ALU ((uint64_t) 0x1ee000000000)
+#define NFP_ME27_INSTR_ALU ((uint64_t) 0x00a000000000)
+#define NFP_ME27_INSTR_IS_ALU(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_ALU) == NFP_ME27_INSTR_ALU)
+
+#define NFP_ME27_INSTR_MASK_IMMED ((uint64_t) 0x1ff900000000)
+#define NFP_ME27_INSTR_IMMED ((uint64_t) 0x00f000000000)
+#define NFP_ME27_INSTR_IS_IMMED(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_IMMED) == NFP_ME27_INSTR_IMMED)
+
+#define NFP_ME27_INSTR_MASK_LD_FIELD ((uint64_t) 0x1ffa00e00000)
+#define NFP_ME27_INSTR_LD_FIELD ((uint64_t) 0x00c000000000)
+#define NFP_ME27_INSTR_IS_LD_FIELD(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_LD_FIELD) == NFP_ME27_INSTR_LD_FIELD)
+
+#define NFP_ME27_INSTR_MASK_CTX_ARB ((uint64_t) 0x00f800000000)
+#define NFP_ME27_INSTR_CTX_ARB ((uint64_t) 0x00e000000000)
+#define NFP_ME27_INSTR_IS_CTX_ARB(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_CTX_ARB) == NFP_ME27_INSTR_CTX_ARB)
+
+#define NFP_ME27_INSTR_MASK_LOCAL_CSR ((uint64_t) 0x1ffe00100000)
+#define NFP_ME27_INSTR_LOCAL_CSR ((uint64_t) 0x00fc00000000)
+#define NFP_ME27_INSTR_IS_LOCAL_CSR(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_LOCAL_CSR) == NFP_ME27_INSTR_LOCAL_CSR)
+
+#define NFP_ME27_INSTR_MASK_BRANCH ((uint64_t) 0x00f8000c3ce0)
+#define NFP_ME27_INSTR_BRANCH ((uint64_t) 0x00d800000020)
+#define NFP_ME27_INSTR_IS_BRANCH(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_BRANCH) == NFP_ME27_INSTR_BRANCH)
+
+#define NFP_ME27_INSTR_MASK_BR_BYTE ((uint64_t) 0x00f800000000)
+#define NFP_ME27_INSTR_BR_BYTE ((uint64_t) 0x00c800000000)
+#define NFP_ME27_INSTR_IS_BR_BYTE(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_BR_BYTE) == NFP_ME27_INSTR_BR_BYTE)
+
+#define NFP_ME27_INSTR_MASK_BR_BIT ((uint64_t) 0x00f800080300)
+#define NFP_ME27_INSTR_BR_BIT ((uint64_t) 0x00d000000000)
+#define NFP_ME27_INSTR_IS_BR_BIT(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_BR_BIT) == NFP_ME27_INSTR_BR_BIT)
+
+#define NFP_ME27_INSTR_MASK_BR_ALU ((uint64_t) 0x1fff80000000)
+#define NFP_ME27_INSTR_BR_ALU ((uint64_t) 0x00e800000000)
+#define NFP_ME27_INSTR_IS_BR_ALU(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_BR_ALU) == NFP_ME27_INSTR_BR_ALU)
+
+#define NFP_ME27_INSTR_MASK_MULT ((uint64_t) 0x1efe3f000000)
+#define NFP_ME27_INSTR_MULT ((uint64_t) 0x00f800000000)
+#define NFP_ME27_INSTR_IS_MULT(instr) \
+ ((instr & NFP_ME27_INSTR_MASK_MULT) == NFP_ME27_INSTR_MULT)
+
+
+#define NFP_ME28_INSTR_MASK_CMD ((uint64_t) 0x008000000000)
+#define NFP_ME28_INSTR_CMD ((uint64_t) 0x000000000000)
+#define NFP_ME28_INSTR_IS_CMD(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_CMD) == NFP_ME28_INSTR_CMD)
+
+#define NFP_ME28_INSTR_MASK_ALU_SHF ((uint64_t) 0x00e000000000)
+#define NFP_ME28_INSTR_ALU_SHF ((uint64_t) 0x008000000000)
+#define NFP_ME28_INSTR_IS_ALU_SHF(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_ALU_SHF) == NFP_ME28_INSTR_ALU_SHF)
+
+#define NFP_ME28_INSTR_MASK_ALU ((uint64_t) 0x00e000000000)
+#define NFP_ME28_INSTR_ALU ((uint64_t) 0x00a000000000)
+#define NFP_ME28_INSTR_IS_ALU(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_ALU) == NFP_ME28_INSTR_ALU)
+
+#define NFP_ME28_INSTR_MASK_IMMED ((uint64_t) 0x01f900000000)
+#define NFP_ME28_INSTR_IMMED ((uint64_t) 0x00f000000000)
+#define NFP_ME28_INSTR_IS_IMMED(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_IMMED) == NFP_ME28_INSTR_IMMED)
+
+#define NFP_ME28_INSTR_MASK_LD_FIELD ((uint64_t) 0x01fa00e00000)
+#define NFP_ME28_INSTR_LD_FIELD ((uint64_t) 0x00c000000000)
+#define NFP_ME28_INSTR_IS_LD_FIELD(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_LD_FIELD) == NFP_ME28_INSTR_LD_FIELD)
+
+#define NFP_ME28_INSTR_MASK_CTX_ARB ((uint64_t) 0x00f800000000)
+#define NFP_ME28_INSTR_CTX_ARB ((uint64_t) 0x00e000000000)
+#define NFP_ME28_INSTR_IS_CTX_ARB(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_CTX_ARB) == NFP_ME28_INSTR_CTX_ARB)
+
+#define NFP_ME28_INSTR_MASK_LOCAL_CSR ((uint64_t) 0x01fe00100000)
+#define NFP_ME28_INSTR_LOCAL_CSR ((uint64_t) 0x00fc00000000)
+#define NFP_ME28_INSTR_IS_LOCAL_CSR(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_LOCAL_CSR) == NFP_ME28_INSTR_LOCAL_CSR)
+
+#define NFP_ME28_INSTR_MASK_BRANCH ((uint64_t) 0x00f8000c3ce0)
+#define NFP_ME28_INSTR_BRANCH ((uint64_t) 0x00d800000020)
+#define NFP_ME28_INSTR_IS_BRANCH(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_BRANCH) == NFP_ME28_INSTR_BRANCH)
+
+#define NFP_ME28_INSTR_MASK_BR_BYTE ((uint64_t) 0x00f800000000)
+#define NFP_ME28_INSTR_BR_BYTE ((uint64_t) 0x00c800000000)
+#define NFP_ME28_INSTR_IS_BR_BYTE(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_BR_BYTE) == NFP_ME28_INSTR_BR_BYTE)
+
+#define NFP_ME28_INSTR_MASK_BR_BIT ((uint64_t) 0x00f800080300)
+#define NFP_ME28_INSTR_BR_BIT ((uint64_t) 0x00d000000000)
+#define NFP_ME28_INSTR_IS_BR_BIT(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_BR_BIT) == NFP_ME28_INSTR_BR_BIT)
+
+#define NFP_ME28_INSTR_MASK_BR_ALU ((uint64_t) 0x00ff80000000)
+#define NFP_ME28_INSTR_BR_ALU ((uint64_t) 0x00e800000000)
+#define NFP_ME28_INSTR_IS_BR_ALU(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_BR_ALU) == NFP_ME28_INSTR_BR_ALU)
+
+#define NFP_ME28_INSTR_MASK_MULT ((uint64_t) 0x00fe3f000000)
+#define NFP_ME28_INSTR_MULT ((uint64_t) 0x00f800000000)
+#define NFP_ME28_INSTR_IS_MULT(instr) \
+ ((instr & NFP_ME28_INSTR_MASK_MULT) == NFP_ME28_INSTR_MULT)
+
+typedef struct
+{
+ int cpp_target;
+ int cpp_action;
+ int cpp_token;
+ unsigned int len_fixed;
+ unsigned int len_mask;
+ const char *mnemonic;
+}
+nfp_cmd_mnemonic;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NFP_H_ */
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ binutils-2.30/opcodes/nfp-dis.c 2019-03-07 15:04:02.282705484 +0000
@@ -0,0 +1,2982 @@
+/* Print NFP instructions for objdump.
+ Copyright (C) 2017-2019 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 "bfd_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%llx", err_msg, (long long) instr);
+ return _NFP_ERR_CONT;
+}
+
+static bfd_boolean
+nfp_me_is_imm_opnd10 (unsigned int opnd)
+{
+ return _BF (opnd, 9, 8) == 0x3;
+}
+
+static bfd_boolean
+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 bfd_boolean
+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 bfd_boolean
+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);
+ bfd_boolean 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;
+ bfd_boolean 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);
+ bfd_boolean 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);
+ bfd_boolean 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';
+ bfd_boolean 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);
+ bfd_boolean 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);
+ bfd_boolean 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);
+ bfd_boolean 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);
+ bfd_boolean 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);
+
+ bfd_boolean 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);
+ dinfo->fprintf_func (dinfo->stream, ", <<8, ");
+ err = err
+ || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
+ dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
+ break;
+ case 2: /* Accelerated 3rd party (A[ << 8]) + B. */
+ case 3: /* Accelerated 3rd party (B[ << 8]) + A. */
+ dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
+ err = err
+ || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
+ if (third_party_32bit)
+ dinfo->fprintf_func (dinfo->stream, ", ");
+ else
+ dinfo->fprintf_func (dinfo->stream, ", <<8, ");
+ err = err
+ || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
+ dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
+ break;
+ case 4: /* A + B. */
+ dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
+ err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
+ dinfo->fprintf_func (dinfo->stream, ", ");
+ err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
+ dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
+ break;
+ case 5: /* Immediate address. */
+ dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
+ (cpp_len + 1));
+ break;
+ case 6: /* Immediate address and data. */
+ dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
+ break;
+ case 7: /* Immediate data. */
+ dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
+ ((xfer << 16) | valBA), (cpp_len + 1));
+ break;
+ }
+
+ print_opt_toks:
+ dinfo->fprintf_func (dinfo->stream, "]");
+
+ if (indref && (mode != 2) && (mode != 3))
+ dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
+
+ if (ctxswap_defer != 3)
+ {
+ dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
+ if (sig)
+ dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
+ else
+ dinfo->fprintf_func (dinfo->stream, "--]");
+
+ if (ctxswap_defer != 0)
+ dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
+ }
+ else if (sig)
+ dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
+
+ if (err)
+ return _NFP_ERR_CONT;
+ return 0;
+}
+
+static int
+nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
+}
+
+static int
+nfp_me27_print_alu (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
+}
+
+static int
+nfp_me27_print_immed (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
+}
+
+static int
+nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
+}
+
+static int
+nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_ctx_arb (instr, dinfo);
+}
+
+static int
+nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
+}
+
+static int
+nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
+}
+
+static int
+nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
+}
+
+static int
+nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
+}
+
+static int
+nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
+}
+
+static int
+nfp_me27_print_mult (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
+}
+
+/*NFP-6xxx/4xxx (ME Version 2.8). */
+
+static int
+nfp_me28_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);
+
+ bfd_boolean 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_6000_CPPTGT_ILA;
+ dinfo->fprintf_func (dinfo->stream, "ila[");
+ break;
+ case 1:
+ cpp_target = NFP_6000_CPPTGT_NBI;
+ dinfo->fprintf_func (dinfo->stream, "nbi[");
+ break;
+ case 3:
+ cpp_target = NFP_6000_CPPTGT_PCIE;
+ dinfo->fprintf_func (dinfo->stream, "pcie[");
+ break;
+ case 5:
+ cpp_target = NFP_6000_CPPTGT_CRYPTO;
+ dinfo->fprintf_func (dinfo->stream, "crypto[");
+ break;
+ case 6:
+ cpp_target = NFP_6000_CPPTGT_ARM;
+ dinfo->fprintf_func (dinfo->stream, "arm[");
+ break;
+ case 7:
+ cpp_target = NFP_6000_CPPTGT_CTXPB;
+ dinfo->fprintf_func (dinfo->stream, "ct[");
+ break;
+ }
+ cpp_action = _BF (tgtcmd, 1, 0);
+ }
+ else
+ {
+ /* One bit overlap between "t" and "a" fields, for sram it's "t" and
+ for mem/cls it's "a". */
+ cpp_action = _BF (tgtcmd, 4, 0);
+ switch (_BF (tgtcmd, 6, 4))
+ {
+ case 3:
+ cpp_target = NFP_6000_CPPTGT_VQDR;
+ cpp_action = _BF (tgtcmd, 3, 0);
+ dinfo->fprintf_func (dinfo->stream, "sram[");
+ break;
+ case 4:
+ case 5:
+ cpp_target = NFP_6000_CPPTGT_MU;
+ dinfo->fprintf_func (dinfo->stream, "mem[");
+ break;
+ case 6:
+ case 7:
+ cpp_target = NFP_6000_CPPTGT_CLS;
+ dinfo->fprintf_func (dinfo->stream, "cls[");
+ break;
+ }
+ }
+
+ 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_me28_mnemonics,
+ ARRAY_SIZE (nfp_me28_mnemonics));
+
+ if (!mnemonic)
+ {
+ dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
+ cpp_target, cpp_action, token);
+ return _NFP_ERR_CONT;
+ }
+
+ 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);
+ dinfo->fprintf_func (dinfo->stream, ", <<8, ");
+ err = err
+ || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
+ dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
+ break;
+ case 2: /* Accelerated 3rd party (A[ << 8]) + B. */
+ case 3: /* Accelerated 3rd party (B[ << 8]) + A. */
+ dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
+ err = err
+ || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
+ if (third_party_32bit)
+ dinfo->fprintf_func (dinfo->stream, ", ");
+ else
+ dinfo->fprintf_func (dinfo->stream, ", <<8, ");
+ err = err
+ || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
+ dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
+ break;
+ case 4: /* A + B. */
+ dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
+ err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
+ dinfo->fprintf_func (dinfo->stream, ", ");
+ err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
+ dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
+ break;
+ case 5: /* Immediate address. */
+ dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
+ (cpp_len + 1));
+ break;
+ case 6: /* Immediate address and data. */
+ dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
+ break;
+ case 7: /* Immediate data. */
+ dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
+ ((xfer << 16) | valBA), (cpp_len + 1));
+ break;
+ }
+
+ dinfo->fprintf_func (dinfo->stream, "]");
+
+ if (indref && (mode != 2) && (mode != 3))
+ dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
+
+ if (ctxswap_defer != 3)
+ {
+ dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
+ if (sig)
+ dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
+ else
+ dinfo->fprintf_func (dinfo->stream, "--]");
+
+ if (ctxswap_defer != 0)
+ dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
+ }
+ else if (sig)
+ dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
+
+ if (err)
+ return _NFP_ERR_CONT;
+ return 0;
+}
+
+static int
+nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ unsigned int gpr_wrboth = _BTST (instr, 41);
+ unsigned int src_lmext = _BTST (instr, 42);
+ unsigned int dst_lmext = _BTST (instr, 43);
+ unsigned int pred_cc = _BTST (instr, 44);
+
+ return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
+ src_lmext, gpr_wrboth, num_ctx, dinfo);
+}
+
+static int
+nfp_me28_print_alu (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ unsigned int gpr_wrboth = _BTST (instr, 41);
+ unsigned int src_lmext = _BTST (instr, 42);
+ unsigned int dst_lmext = _BTST (instr, 43);
+ unsigned int pred_cc = _BTST (instr, 44);
+
+ return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
+ gpr_wrboth, num_ctx, dinfo);
+}
+
+static int
+nfp_me28_print_immed (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ unsigned int gpr_wrboth = _BTST (instr, 41);
+ unsigned int dst_lmext = _BTST (instr, 43);
+ unsigned int pred_cc = _BTST (instr, 44);
+
+ return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
+ num_ctx, dinfo);
+}
+
+static int
+nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ unsigned int gpr_wrboth = _BTST (instr, 41);
+ unsigned int src_lmext = _BTST (instr, 42);
+ unsigned int dst_lmext = _BTST (instr, 43);
+ unsigned int pred_cc = _BTST (instr, 44);
+
+ return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
+ src_lmext, gpr_wrboth, num_ctx, dinfo);
+}
+
+static int
+nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_ctx_arb (instr, dinfo);
+}
+
+static int
+nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ unsigned int src_lmext = _BTST (instr, 42);
+
+ return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
+}
+
+static int
+nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
+{
+ return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
+}
+
+static int
+nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ unsigned int src_lmext = _BTST (instr, 42);
+ return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
+}
+
+static int
+nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ unsigned int src_lmext = _BTST (instr, 42);
+ return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
+}
+
+static int
+nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ unsigned int src_lmext = _BTST (instr, 42);
+ return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
+}
+
+static int
+nfp_me28_print_mult (uint64_t instr, int num_ctx,
+ struct disassemble_info *dinfo)
+{
+ unsigned int gpr_wrboth = _BTST (instr, 41);
+ unsigned int src_lmext = _BTST (instr, 42);
+ unsigned int dst_lmext = _BTST (instr, 43);
+ unsigned int pred_cc = _BTST (instr, 44);
+
+ return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
+ gpr_wrboth, num_ctx, dinfo);
+}
+
+static bfd_boolean
+init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
+{
+ Elf_Internal_Shdr *sec = NULL;
+ Elf_Nfp_MeConfig mecfg_ent;
+ unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
+ file_ptr roff = 0;
+ unsigned int sec_cnt = 0;
+ unsigned int sec_idx;
+ size_t menum_linear = 0;
+
+ if (!dinfo->section)
+ /* No section info, will use default values. */
+ return TRUE;
+
+ sec_cnt = elf_numsections (dinfo->section->owner);
+
+ /* Find the MECONFIG section. It's index is also in e_flags, but it has
+ a unique SHT and we'll use that. */
+ for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
+ {
+ sec = elf_elfsections (dinfo->section->owner)[sec_idx];
+
+ if (sec->sh_type == SHT_NFP_MECONFIG)
+ break;
+ }
+
+ if (sec_idx == sec_cnt)
+ {
+ dinfo->fprintf_func (dinfo->stream, _("File has no ME-Config section."));
+ return FALSE;
+ }
+
+ for (roff = 0; (bfd_size_type) roff < sec->sh_size;
+ roff += sec->sh_entsize, menum_linear++)
+ {
+ nfp_priv_mecfg *mecfg;
+ int isl = menum_linear >> 3;
+ int menum = menum_linear & 7;
+
+ if (menum_linear >= 40)
+ {
+ dinfo->fprintf_func (dinfo->stream,
+ _("File has invalid ME-Config section."));
+ return FALSE;
+ }
+
+ mecfg = &priv->mecfgs[isl][menum][1];
+
+ if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
+ buffer, roff, sizeof (buffer)))
+ return FALSE;
+
+ mecfg_ent.ctx_enables = bfd_getl32 (buffer + offsetof (Elf_Nfp_MeConfig,
+ ctx_enables));
+ mecfg_ent.misc_control = bfd_getl32 (buffer
+ + offsetof (Elf_Nfp_MeConfig, misc_control));
+
+ mecfg->ctx4_mode = _BTST (mecfg_ent.ctx_enables, 31);
+ mecfg->addr_3rdparty32 = _BTST (mecfg_ent.misc_control, 4);
+ mecfg->scs_cnt = _BTST (mecfg_ent.misc_control, 2);
+ }
+
+ return TRUE;
+}
+
+static bfd_boolean
+init_nfp6000_mecsr_sec (nfp_priv_data * priv, Elf_Internal_Shdr * sec,
+ int is_for_text, struct disassemble_info *dinfo)
+{
+ Elf_Nfp_InitRegEntry ireg;
+ unsigned char buffer[sizeof (Elf_Nfp_InitRegEntry)];
+ file_ptr ireg_off = 0;
+ size_t isl, menum;
+
+ if (sec->sh_entsize != sizeof (ireg))
+ return FALSE;
+
+ isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
+
+ /* For these sections we know that the address will only be 32 bits
+ so we only need cpp_offset_lo.
+ Address is encoded as follows:
+ <31:30> 0
+ <29:24> island (already got this from sh_info)
+ <23:17> 0
+ <16:16> XferCsrRegSel (1 for these sections)
+ <15:14> 0
+ <13:10> DataMasterID (MEnum = this - 4)
+ <9:2> register (index)
+ <1:0> 0b0 (register byte address if appened to the previous field). */
+ for (ireg_off = 0; (bfd_size_type) ireg_off < sec->sh_size;
+ ireg_off += sec->sh_entsize)
+ {
+ uint32_t csr_off;
+ nfp_priv_mecfg *mecfg;
+
+ if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
+ buffer, ireg_off, sizeof (buffer)))
+ return FALSE;
+
+ ireg.cpp_offset_lo = bfd_getl32 (buffer
+ + offsetof (Elf_Nfp_InitRegEntry, cpp_offset_lo));
+ ireg.mask = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, mask));
+ ireg.val = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, val));
+ ireg.w0 = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, w0));
+
+ if (NFP_IREG_ENTRY_WO_NLW (ireg.w0))
+ continue;
+
+ /* Only consider entries that are permanent for runtime. */
+ if ((NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_CONST)
+ && (NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_FORCE))
+ continue;
+
+ menum = _BF (ireg.cpp_offset_lo, 13, 10) - 4;
+ csr_off = _BF (ireg.cpp_offset_lo, 9, 0);
+
+ mecfg = &priv->mecfgs[isl][menum][is_for_text];
+ switch (csr_off)
+ {
+ case _NFP_ME27_28_CSR_CTX_ENABLES:
+ mecfg->ctx4_mode = _BTST (ireg.val, 31);
+ break;
+ case _NFP_ME27_28_CSR_MISC_CONTROL:
+ mecfg->addr_3rdparty32 = _BTST (ireg.val, 4);
+ mecfg->scs_cnt = _BTST (ireg.val, 2);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return TRUE;
+}
+
+static bfd_boolean
+init_nfp6000_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
+{
+ int mecfg_orders[64][2];
+ size_t isl;
+ unsigned int sec_cnt = 0;
+ unsigned int sec_idx;
+ int is_for_text;
+
+ memset (mecfg_orders, -1, sizeof (mecfg_orders));
+
+ if (!dinfo->section)
+ /* No section info, will use default values. */
+ return TRUE;
+
+ sec_cnt = elf_numsections (dinfo->section->owner);
+
+ /* Go through all MECSR init sections to find ME configs. */
+ for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
+ {
+ Elf_Internal_Shdr *sec;
+ int sec_order;
+
+ sec = elf_elfsections (dinfo->section->owner)[sec_idx];
+ sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
+
+ is_for_text = (sec->sh_flags & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
+
+ /* If we have an init2 section, that is the one that applies to the
+ ME when executing init code. So we make it's order higher than
+ any plain init section. */
+ if (sec->sh_flags & SHF_NFP_INIT2)
+ sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
+
+ if (sec->sh_type != SHT_NFP_INITREG)
+ continue;
+ if (!SHI_NFP_6000_IS_IREG_MECSR (sec->sh_info))
+ continue;
+
+ isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
+ if ((sec_order < mecfg_orders[isl][is_for_text]))
+ /* Lower order or transient, skip it. */
+ continue;
+
+ mecfg_orders[isl][is_for_text] = sec_order;
+
+ if (!init_nfp6000_mecsr_sec (priv, sec, is_for_text, dinfo))
+ {
+ dinfo->fprintf_func (dinfo->stream,
+ _("Error processing section %u "), sec_idx);
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static int
+parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
+{
+ const char *option;
+
+ if (dinfo->disassembler_options == NULL)
+ return 0;
+
+ FOR_EACH_DISASSEMBLER_OPTION (option, dinfo->disassembler_options)
+ {
+ if (disassembler_options_cmp (option, "no-pc") == 0)
+ opts->show_pc = 0;
+ else if (disassembler_options_cmp (option, "ctx4") == 0)
+ {
+ if (!opts->ctx_mode)
+ opts->ctx_mode = 4;
+ }
+ else if (disassembler_options_cmp (option, "ctx8") == 0)
+ opts->ctx_mode = 8;
+ else
+ {
+ dinfo->fprintf_func (dinfo->stream, _("Invalid NFP option: %s"), option);
+ return _NFP_ERR_STOP;
+ }
+ }
+
+ return 0;
+}
+
+/* Called on first disassembly attempt so that dinfo->section is valid
+ so that we can get the bfd owner to find ME configs. */
+
+static nfp_priv_data *
+init_nfp_priv (struct disassemble_info *dinfo)
+{
+ nfp_priv_data *priv;
+ int ret = FALSE;
+
+ if (dinfo->private_data)
+ return (nfp_priv_data *) dinfo->private_data;
+
+#if 0 /* Right now only section-related info is kept in priv.
+ So don't even calloc it if we don't need it. */
+ if (!dinfo->section)
+ return NULL;
+#endif
+
+ /* Alloc with no free, seems to be either this or a static global variable
+ and this at least keeps a large struct unallocated until really needed. */
+ priv = calloc (1, sizeof (*priv));
+ if (!priv)
+ return NULL;
+
+ switch (dinfo->mach)
+ {
+ case E_NFP_MACH_3200:
+ ret = init_nfp3200_priv (priv, dinfo);
+ break;
+ case E_NFP_MACH_6000:
+ ret = init_nfp6000_priv (priv, dinfo);
+ break;
+ }
+
+ if (!ret)
+ {
+ free (priv);
+ return NULL;
+ }
+
+ dinfo->private_data = priv;
+ return priv;
+}
+
+static int
+_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
+{
+ nfp_priv_data *priv = init_nfp_priv (dinfo);
+ bfd_byte buffer[8];
+ int err;
+ uint64_t instr = 0;
+ size_t island, menum;
+ int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
+ int is_text = 1;
+
+ err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
+ if (err)
+ return _NFP_ERR_STOP;
+
+ if (!dinfo->section)
+ {
+ num_ctx = 8;
+ scs_cnt = 0;
+ addr_3rdparty32 = 0;
+ }
+ else
+ {
+ unsigned int sh_info = 0;
+ nfp_priv_mecfg *mecfg;
+
+ /* We have a section, presumably all ELF sections. Try to find
+ proper ME configs to produce better disassembly. */
+ if (!priv)
+ return _NFP_ERR_STOP; /* Sanity check */
+
+ is_text = (elf_section_flags (dinfo->section)
+ & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
+
+ sh_info = elf_section_info (dinfo->section);
+
+ switch (dinfo->mach)
+ {
+ case E_NFP_MACH_3200:
+ island = SHI_NFP_3200_ISLAND (sh_info);
+ menum = SHI_NFP_3200_MENUM (sh_info);
+ break;
+ default:
+ island = SHI_NFP_ISLAND (sh_info);
+ menum = SHI_NFP_MENUM (sh_info);
+ break;
+ }
+
+ mecfg = &priv->mecfgs[island][menum][is_text];
+ num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
+ addr_3rdparty32 = mecfg->addr_3rdparty32;
+ scs_cnt = mecfg->scs_cnt;
+ }
+
+ if (opts->ctx_mode)
+ num_ctx = opts->ctx_mode;
+
+ dinfo->bytes_per_line = 8;
+ dinfo->bytes_per_chunk = 8;
+
+ instr = bfd_getl64 (buffer);
+
+ if (opts->show_pc)
+ {
+ pc = (int) (addr >> 3);
+
+ /* Guess max PC for formatting */
+ tmpj = (int) (dinfo->buffer_length >> 3);
+ if (scs_cnt == 1)
+ {
+ pc *= 2;
+ tmpj *= 2;
+ if (! !(menum & 1))
+ {
+ pc++;
+ tmpj++;
+ }
+ }
+
+ for (tmpi = 1; tmpj > 9; tmpj /= 10)
+ tmpi++;
+
+ tmpj = pc;
+ for (; tmpj > 9; tmpj /= 10)
+ tmpi--;
+
+ dinfo->fprintf_func (dinfo->stream, "%*c%d ", tmpi, '.', pc);
+ }
+
+ switch (dinfo->mach)
+ {
+ case E_NFP_MACH_3200:
+ if (NFP_ME27_INSTR_IS_CMD (instr))
+ err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
+ else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
+ err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
+ else if (NFP_ME27_INSTR_IS_ALU (instr))
+ err = nfp_me27_print_alu (instr, num_ctx, dinfo);
+ else if (NFP_ME27_INSTR_IS_IMMED (instr))
+ err = nfp_me27_print_immed (instr, num_ctx, dinfo);
+ else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
+ err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
+ else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
+ err = nfp_me27_print_ctx_arb (instr, dinfo);
+ else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
+ err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
+ else if (NFP_ME27_INSTR_IS_BRANCH (instr))
+ err = nfp_me27_print_branch (instr, dinfo);
+ else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
+ err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
+ else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
+ err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
+ else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
+ err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
+ else if (NFP_ME27_INSTR_IS_MULT (instr))
+ err = nfp_me27_print_mult (instr, num_ctx, dinfo);
+ else
+ err = nfp_me_print_invalid (instr, dinfo);
+ break;
+
+ case E_NFP_MACH_6000:
+ if (NFP_ME28_INSTR_IS_CMD (instr))
+ err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
+ else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
+ err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
+ else if (NFP_ME28_INSTR_IS_ALU (instr))
+ err = nfp_me28_print_alu (instr, num_ctx, dinfo);
+ else if (NFP_ME28_INSTR_IS_IMMED (instr))
+ err = nfp_me28_print_immed (instr, num_ctx, dinfo);
+ else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
+ err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
+ else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
+ err = nfp_me28_print_ctx_arb (instr, dinfo);
+ else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
+ err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
+ else if (NFP_ME28_INSTR_IS_BRANCH (instr))
+ err = nfp_me28_print_branch (instr, dinfo);
+ else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
+ err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
+ else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
+ err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
+ else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
+ err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
+ else if (NFP_ME28_INSTR_IS_MULT (instr))
+ err = nfp_me28_print_mult (instr, num_ctx, dinfo);
+ else
+ err = nfp_me_print_invalid (instr, dinfo);
+ break;
+ }
+
+ if (err < 0)
+ return err;
+ return 8;
+}
+
+int
+print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
+{
+ nfp_opts opts;
+ int err;
+
+ opts.show_pc = 1;
+ opts.ctx_mode = 0;
+ err = parse_disassembler_options (&opts, dinfo);
+ if (err < 0)
+ goto end;
+
+ err = _print_instrs (addr, dinfo, &opts);
+
+end:
+ if (err != 8)
+ dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
+ if (err == _NFP_ERR_CONT)
+ return 8;
+ return err;
+}
+
+void
+print_nfp_disassembler_options (FILE * stream)
+{
+ fprintf (stream, _("\n\
+The following NFP specific disassembler options are supported for use\n\
+with the -M switch (multiple options should be separated by commas):\n"));
+
+ fprintf (stream, _("\n\
+ no-pc Don't print program counter prefix.\n\
+ ctx4 Force disassembly using 4-context mode.\n\
+ ctx8 Force 8-context mode, takes precedence."));
+
+ fprintf (stream, _("\n"));
+}
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ /binutils/testsuite/binutils-all/nfp/test2_nfp6000.nffw 2018-04-30 11:21:22.978953995 +0100
@@ -0,0 +1,11 @@
+ELF`@@@@[ <00>4<00>0&H 4p<00>P<00><04>?p<00><00><04>Kp<00><00><01><><EFBFBD>.shstrtab.note.nfp.note.build_info.text.i32.me0.regi.xpbm.regi1.xpbm.regt.mecsr.i32NFP NFP NFP<00>LgZnfld 6.x-devel (build 3484) 0<><30>  0<><30> 0<><30> 0<><30><13><18><><17><19><><00> <0C><><00> <0C><><EFBFBD><00> 
+`<60>R<00><>
+`&<00><>
+`<60>\<00><>
+`v<00><>$
+`<60>Q<00><>(
+`A <00><>0
+`C<00><>8
+`@ <00><><
+`<00><>@
+`<00>  U<00><07>s<EFBFBD> @ <00>?@ <00>?"@ <00>?2@ <00>?B@ <00>?R@ <00>?b@ <00>?r@ <00>?D H <00><>H <00><>"H <00><>2H <00><>BH <00><>RH <00><>bH <00><>rH <00><>P <00><>P <00><>"P <00><>2P <00><>BP <00><>RP <00><>bP <00><>rP <00><>` 
\ No newline at end of file
--- /dev/null 2019-03-07 09:27:55.425999321 +0000
+++ /binutils/testsuite/binutils-all/nfp/test1_nfp6000.nffw 2018-11-15 10:36:45.969182755 +0000
@@ -0,0 +1,75 @@
+ELF`@@@
+<00>y @4xd&<00>h 4Hh !Bp<00><00>" <04>Mp<00><00># <04>Yp<00>#<00><01><><EFBFBD>ip<00>%<00><01><><EFBFBD>.shstrtab.note.nfp.note.build_info.text.i32.me0.text.i33.me9.regi.xpbm.regi1.xpbm.regt.mecsr.i32.regt.mecsr.i33NFP NFPTNFP<00><12>[Toolchain: nfld 6.x-devel (build 3781)
+Name:
+Version: 0.0.0
+Build Number: 0
+<00>,<01>@<00><>,<01><><00><>,<01> <00>,<01>` <20>,<01><>0<>,<01><>1<>,<01>@<00>,<01><><10>,<01><><11>,<01>H <20>,<01>h <03>,<01><>%<25>,<01>@<07>,<01>( )<29>,<01><> <00><03><0F><00> <20>` <00> <20>`<00><><EFBFBD>w`<60><><00><>,<01>@ <00><><<04>
+<00><>m<05><><01>@<40><><02>@<40>@<03><00> 4 <01> <00>@<40><><00> @<40> <00><00>`<00><00>`<00><00><><00><00><>/ 0<><30> <00><00><><EFBFBD><00>ҁ<> <00><12>@<00><00><><EFBFBD><00>@<40><><EFBFBD> ڀ<><DA80>`<00><><EFBFBD><EFBFBD>
+/ (<28><>/(<28><>$ <0C><><EFBFBD>$<<3C><><00>ŋ $ <0C><> $ <0C><>@$<1C><>$ <0C><>($ !<21><> $<1C><>($ <0C><><EFBFBD>$<<3C><><EFBFBD>$\<5C><>$|<7C><>h $<24><><EFBFBD><EFBFBD>
+<00><08><><EFBFBD> <00><08><><EFBFBD><00><08><><EFBFBD>
+)<00><><EFBFBD> 0<00><>$1<00><><EFBFBD><00><>d1<00><>`
+<00><><EFBFBD> <00><>@<00><><EFBFBD>A<00><>A<00><><EFBFBD><00><00> <00>/<00><>o <00>@ o <00>@<00>2<EFBFBD><32><EFBFBD> <00>Б<> <00>"<10>` <00><>@<00><>@<00><>@<00><><EFBFBD><00><>@ <00><><EFBFBD>
+<00><><EFBFBD> @<40><> @<40>@@<40>@
+@<40><>@<40><><00><>!<00><><EFBFBD> <00><><EFBFBD> <00><>Sp<>A <08><>p<08><><EFBFBD>p<><00><> <00> / 0<><30> 8@<40><>
+/ 0<><30> 1@<40><>/ 0<><30> A1@<40><>/ 0<><30> a1@<40>$/ 0<><30> A1@<40>
+/ 0<><30> E<><45>/ 0<><30> <0A>E<EFBFBD><45>/ 0<><30> E<>
+/ 0<><30> 8@<40><>/ 0<><30> 8@<40>0 / 0<><30> 8@<40><> <20><><18><> <20><>w<EFBFBD> <20><>w<EFBFBD>@ <00> <00>!<21><>w<EFBFBD>@"<22><>w<EFBFBD><77>#<23><>w<EFBFBD> $<24><>w<EFBFBD><77>$<24><>w<EFBFBD><77>%<25><>w<EFBFBD> %<25><>w<EFBFBD> &<26><>'<27><>w<EFBFBD>@(<28><>w<EFBFBD><77>)<29><>w<EFBFBD> +<2B><>w<EFBFBD>@*<2A><>8<><38><18>` 8<><38><18>  <00><00><>w<EFBFBD><77> <04><>,<08>wР#$<24>w<EFBFBD>!$<24>w<EFBFBD>` $<24>#$<24>w<EFBFBD> <00> <00> <00>+,<2C> <0B><>w<EFBFBD><77> <10> <00> <15>w<EFBFBD>`
+ <16>w<EFBFBD><77> B<> b<>w<EFBFBD>  <1B>w<EFBFBD>@<00><16>w<EFBFBD><77><00><16>w<EFBFBD> <00><16> <16>6<02>w<EFBFBD> 6<02> <00> <00>6<><36>w<EFBFBD><77> 6<><36>w<EFBFBD><77>7<><37>w<EFBFBD> 7<02>w<EFBFBD><77> 0<00>w<EFBFBD> 0<><30>w<EFBFBD><77> 0<><30>w<EFBFBD>0<><30>w<EFBFBD>@
+ <00>4<02>w<EFBFBD>@ 4B<34>w<EFBFBD>`4<><34> 4<><34>w<EFBFBD> <00> <00>4<><34>
+4<><34>5<><35>w<EFBFBD>@5<><35>w<EFBFBD>` 2B<32>w<EFBFBD>`2<><32>2<><32>3<><33>w<EFBFBD>@2<><32>w<EFBFBD>`  <00> <00> <00><00><>@<02>@<12><00><><12><00><><12><00><><00><>@<02><> <11><00><11><00> <11><00>@  0<><30> <0C><><00><><EFBFBD>`<02><><EFBFBD><EFBFBD><02><><EFBFBD><02><><EFBFBD><EFBFBD><02><><EFBFBD><EFBFBD> A<00><><EFBFBD>A<00><><EFBFBD>C<00><><EFBFBD>C <20><><EFBFBD>
+<14><><EFBFBD>`(<28><><EFBFBD>`t<><74><EFBFBD>`H<><48><EFBFBD>`<00><><EFBFBD>"<00><><EFBFBD><EFBFBD><00><><EFBFBD>
+<00><><EFBFBD><EFBFBD> <00><><EFBFBD><EFBFBD> (<28><><EFBFBD> <<3C><><EFBFBD>
+<00><><EFBFBD><EFBFBD><00><><EFBFBD>B<00><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><<3C><><EFBFBD><EFBFBD><10><> <1A><><EFBFBD> <19><><EFBFBD><18><><EFBFBD>C<18><><EFBFBD>G<18><><EFBFBD> <17><><EFBFBD>@<17><><EFBFBD><EFBFBD> <1C><><EFBFBD><10><><EFBFBD><EFBFBD> <<3C><><EFBFBD><EFBFBD> ,<14><>H<18>  <00>H<18>@  <00>H &<18>@  <00>H6<18>  <00> <00> <00> <00> <00> <14>` <00><> @<18>@  <00>@F<18>  <00>@<00>` <00>@<00>`  <00> <00> <00> <00> <00><00>&<18> <00><00>6<18><> <00><00><00><> <00><00><00>`  <00>'<27><18><> <00><00>v<18>@ <00><00>v<18><> <00><00>v<18>  <00><00>v<18><> <00><00>v<18>@ <00><00>v<18><> <00><00><00><> <00><00><00><>
+ <00><00>V<00>s  <00><00>V<00>" <00> <00> <00> <00> <00> <00><00><><00><00>  <00>`  <00>  0<><30> 0<><30> <00><> <02>w<EFBFBD>`
+P<10>@P<><50>@ P<><50>@ @<40>@P<00><>P<10>! P<10><> P<10><>?<3F><00><00>@<40><><13><00><><00><><00>`<00><><00><><00><><00><><00><><00><> <20><> "<22>#<23>(<00>@<40><><00>@<40>r  <00> HM<00><>8<>@Tؠ'<00>`8<>@Tؠ'<00><>8<>@Tؠ'<00>8<>@Tؠ<01>@<01><><01>@<01><><05><><05><><01><><01> <01><><0F><><00><><EFBFBD><1B>`<00><>`<00><><EFBFBD> <10><><EFBFBD>{<7B><><1B><>Ā|<00><00><00><00><00><><00><00><> <01> <00>` <16><> <00>` l<07><>
+l<07><>`<07> <0F><01>  <00><> <00><><EFBFBD> <10><><EFBFBD>  <20><><EFBFBD> 0<><30><EFBFBD>L<><4C>@ \<5C><><EFBFBD> <00><><00><>
+<00><>L<00> <00><><00><><EFBFBD>L<><4C> <00><><00><><EFBFBD>L<><4C><EFBFBD><00><><00><><EFBFBD>L<><4C><EFBFBD> 0<><30> <00><><EFBFBD> <00><><EFBFBD> 0<><30> <00><><EFBFBD> <00><>C<00>0<><30><00><08><><EFBFBD><00>8<EFBFBD><38><EFBFBD>0<><30> <00><><EFBFBD> <00><>1 <00><>
+<00> <00><00><00>d
+ <00><>  0<><30> 0<><30> <00> <00> <00> <00> 0BP$0BP 0B<18>$0B$ 0<><30>$0B<18> 0<><30>'0<><18>%0B<18> 0<><30> <0C>C <0C>N <0C>@d
+ <09><>@f<> <09><>Bd`<08><>Bf 0<><30><08>@e, <0C>@`P<00>e<?X<e8<0F>dT <00><><1C><00><>P<00><>P
+ <00> <09><>JG<4A> <09><>B@@ <09><>B\@ <09><>BU<42> <09><>@L 0<00>  <09><>HL<48>0<00>  <09><>@M<>
+ <09><>@M  <09><>HM<48> <09>W<> <09>@N<>0<00>  <09>N<> <09>HN` 0<00>  <09>N  P<> <20><00> $<24>D<00>` `<04>b `b <0A>b` b`b`P` <0A> X` <0A> Y`   <00> <00> <00> <00> <00>@0<00>` <00>=@<40>  <00>H0<00> <00> =@<40> <00>H0<00><> <00> =@<40><> <00><00> <00> <00>,<01>@<00><>,<01><><00><>,<01> <00>,<01>` <20>,<01><>0<>,<01><>1<>,<01>@<00>,<01><><10>,<01><><11>,<01>H <20>,<01>h <03>,<01><>%<25>,<01>@<07>,<01>( )<29>,<01><> <00><03><0F><00> <20>` <00> <20>`<00><><EFBFBD>w`<60><><00><>,<01>@ <00><><<04>
+<00><>m<05>@ <01>@<40><><02>@<40>@<03><00> 4 <01> <00>@<40><><00> @<40> <00><00>`<00><00>`<00><00><><00><00><>/ 0<><30> <00><00><><EFBFBD><00>ҁ<> <00><12>@<00><00><><EFBFBD><00>@<40><><EFBFBD> ڀ<><DA80><EFBFBD> <00><><EFBFBD><EFBFBD><EFBFBD>/ (<28><>/(<28><>$ <0C><><EFBFBD>$<<3C><><00>ŋ $ <0C><> $ <0C><>@$<1C><>$ <0C><>($ !<21><> $<1C><>($ <0C><><EFBFBD>$<<3C><><EFBFBD>$\<5C><>$|<7C><>h $<24><><EFBFBD><EFBFBD>
+<00><08><><EFBFBD> <00><08><><EFBFBD><00><08><><EFBFBD>
+)<00><><EFBFBD> 0<00><>$1<00><><EFBFBD><00><>d1<00><>`
+<00><><EFBFBD> <00><>@<00><><EFBFBD>A<00><>A<00><><EFBFBD><00><00> <00>/<00><>o <00>@ o <00>@<00>2<EFBFBD><32><EFBFBD> <00>Б<> <00>"<10>` <00><>@<00><>@<00><>@<00><><EFBFBD><00><>@ <00><><EFBFBD>
+<00><><EFBFBD> @<40><> @<40>@@<40>@
+@<40><>@<40><><00><>!<00><><EFBFBD> <00><><EFBFBD> <00><>Sp<>A <08><>p<08><><EFBFBD>p<><00><> <00> / 0<><30> 8@<40><>
+/ 0<><30> 1@<40><>/ 0<><30> A1@<40><>/ 0<><30> a1@<40>$/ 0<><30> A1@<40>
+/ 0<><30> E<><45>/ 0<><30> <0A>E<EFBFBD><45>/ 0<><30> E<>
+/ 0<><30> 8@<40><>/ 0<><30> 8@<40>0 / 0<><30> 8@<40><> <20><><18><> <20><>w<EFBFBD> <20><>w<EFBFBD>@ <00> <00>!<21><>w<EFBFBD>@"<22><>w<EFBFBD><77>#<23><>w<EFBFBD> $<24><>w<EFBFBD><77>$<24><>w<EFBFBD><77>%<25><>w<EFBFBD> %<25><>w<EFBFBD> &<26><>'<27><>w<EFBFBD>@(<28><>w<EFBFBD><77>)<29><>w<EFBFBD> +<2B><>w<EFBFBD>@*<2A><>8<><38><18>` 8<><38><18>  <00><00><>w<EFBFBD><77> <04><>,<08>wР#$<24>w<EFBFBD>!$<24>w<EFBFBD>` $<24>#$<24>w<EFBFBD> <00> <00> <00>+,<2C> <0B><>w<EFBFBD><77> <10> <00> <15>w<EFBFBD>`
+ <16>w<EFBFBD><77> B<> b<>w<EFBFBD>  <1B>w<EFBFBD>@<00><16>w<EFBFBD><77><00><16>w<EFBFBD> <00><16> <16>6<02>w<EFBFBD> 6<02> <00> <00>6<><36>w<EFBFBD><77> 6<><36>w<EFBFBD><77>7<><37>w<EFBFBD> 7<02>w<EFBFBD><77> 0<00>w<EFBFBD> 0<><30>w<EFBFBD><77> 0<><30>w<EFBFBD>0<><30>w<EFBFBD>@
+ <00>4<02>w<EFBFBD>@ 4B<34>w<EFBFBD>`4<><34> 4<><34>w<EFBFBD> <00> <00>4<><34>
+4<><34>5<><35>w<EFBFBD>@5<><35>w<EFBFBD>` 2B<32>w<EFBFBD>`2<><32>2<><32>3<><33>w<EFBFBD>@2<><32>w<EFBFBD>`  <00> <00> <00><00><>@<02>@<12><00><><12><00><><12><00><><00><>@<02><> <11><00><11><00> <11><00>@  0<><30> <0C><><00><><EFBFBD>`<02><><EFBFBD><EFBFBD><02><><EFBFBD><02><><EFBFBD><EFBFBD><02><><EFBFBD><EFBFBD> A<00><><EFBFBD>A<00><><EFBFBD>C<00><><EFBFBD>C <20><><EFBFBD>
+<14><><EFBFBD>`(<28><><EFBFBD>`t<><74><EFBFBD>`H<><48><EFBFBD>`<00><><EFBFBD>"<00><><EFBFBD><EFBFBD><00><><EFBFBD>
+<00><><EFBFBD><EFBFBD> <00><><EFBFBD><EFBFBD> (<28><><EFBFBD> <<3C><><EFBFBD>
+<00><><EFBFBD><EFBFBD><00><><EFBFBD>B<00><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><<3C><><EFBFBD><EFBFBD><10><> <1A><><EFBFBD> <19><><EFBFBD><18><><EFBFBD>C<18><><EFBFBD>G<18><><EFBFBD> <17><><EFBFBD>@<17><><EFBFBD><EFBFBD> <1C><><EFBFBD><10><><EFBFBD><EFBFBD> <<3C><><EFBFBD><EFBFBD> ,<14><>H<18>  <00>H<18>@  <00>H &<18>@  <00>H6<18>  <00> <00> <00> <00> <00> <14>` <00><> @<18>@  <00>@F<18>  <00>@<00>` <00>@<00>`  <00> <00> <00> <00> <00><00>&<18> <00><00>6<18><> <00><00><00><> <00><00><00>`  <00>'<27><18><> <00><00>v<18>@ <00><00>v<18><> <00><00>v<18>  <00><00>v<18><> <00><00>v<18>@ <00><00>v<18><> <00><00><00><> <00><00><00><>
+ <00><00>V<00>s  <00><00>V<00>" <00> <00> <00> <00> <00> <00><00><><00><00>  <00>`  <00>  0<><30> 0<><30> <00><> <02>w<EFBFBD>`
+P<10>@P<><50>@ P<><50>@ @<40>@P<00><>P<10>! P<10><> P<10><>?<3F><00><00>@<40><><13><00><><00><><00>`<00><><00><><00><><00><><00><><00><> <20><> "<22>#<23>(<00>@<40><><00>@<40>r  <00> HM<00><>8<>@Tؠ'<00>`8<>@Tؠ'<00><>8<>@Tؠ'<00>8<>@Tؠ<01>@<01><><01>@<01><><05><><05><><01><><01> <01><><0F><><00><><EFBFBD><1B>`<00><>`<00><><EFBFBD> <10><><EFBFBD>{<7B><><1B><>Ā|<00><00><00><00><00><><00><00><> <01> <00>` <16><> <00>` l<07><>
+l<07><>`<07> <0F><01>  <00><> <00><><EFBFBD> <10><><EFBFBD>  <20><><EFBFBD> 0<><30><EFBFBD>L<><4C>@ \<5C><><EFBFBD> <00><><00><>
+<00><>L<00> <00><><00><><EFBFBD>L<><4C> <00><><00><><EFBFBD>L<><4C><EFBFBD><00><><00><><EFBFBD>L<><4C><EFBFBD> 0<><30> <00><><EFBFBD> <00><><EFBFBD> 0<><30> <00><><EFBFBD> <00><>C<00>0<><30><00><08><><EFBFBD><00>8<EFBFBD><38><EFBFBD>0<><30> <00><><EFBFBD> <00><>1 <00><>
+<00> <00><00><00>d
+ <00><>  0<><30> 0<><30> <00> <00> <00> <00> 0BP$0BP 0B<18>$0B$ 0<><30>$0B<18> 0<><30>'0<><18>%0B<18> 0<><30> <0C>C <0C>N <0C>@d
+ <09><>@f<> <09><>Bd`<08><>Bf 0<><30><08>@e, <0C>@`P<00>e<?X<e8<0F>dT <00><><1C><00><>P<00><>P
+ <00> <09><>JG<4A> <09><>B@@ <09><>B\@ <09><>BU<42> <09><>@L 0<00>  <09><>HL<48>0<00>  <09><>@M<>
+ <09><>@M  <09><>HM<48> <09>W<> <09>@N<>0<00>  <09>N<> <09>HN` 0<00>  <09>N  P<> <20><00> $<24>D<00>` `<04>b `b <0A>b` b`b`P` <0A> X` <0A> Y`   <00> <00> <00> <00> <00>@0<00>` <00>=@<40>  <00>H0<00> <00> =@<40> <00>H0<00><> <00> =@<40><> <00><00> <00> 
+`<60>R<00><>
+`&<00><>
+`<60>\<00><>
+`v<00><>$
+`<60>Q<00><>(
+`A <00><>0
+`C<00><>8
+`@ <00><><
+`<00><>
+a<>R<00><>
+a&<00><>
+a<>\<00><>
+av<00><>$
+a<>Q<00><>(
+aA <00><>0
+aC<00><>8
+a@ <00><><
+a<00><>@
+`<00>@
+a<00>  <00><07>s<EFBFBD> @ <00>?@ <00>?"@ <00>?2@ <00>?B@ <00>?R@ <00>?b@ <00>?r@ <00>?D H <00><>H <00><>"H <00><>2H <00><>BH <00><>RH <00><>bH <00><>rH <00><>P <00><>P <00><>"P <00><>2P <00><>BP <00><>RP <00><>bP <00><>rP <00><>` 4!4!U<00><07>s<EFBFBD>4! @4!<00>?@4!<00>?"@4!<00>?2@4!<00>?B@4!<00>?R@4!<00>?b@4!<00>?r@4!<00>?D4!H4!<00><>H4!<00><>"H4!<00><>2H4!<00><>BH4!<00><>RH4!<00><>bH4!<00><>rH4!<00><>P4!<00><>P4!<00><>"P4!<00><>2P4!<00><>BP4!<00><>RP4!<00><>bP4!<00><>rP4!<00><>`5!
\ No newline at end of file