FT32 initial support
authorAlan Modra <amodra@gmail.com>
Wed, 28 Jan 2015 05:06:43 +0000 (15:36 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 28 Jan 2015 05:55:18 +0000 (16:25 +1030)
FT32 is a new 32-bit RISC core developed by FTDI for embedded applications.

* configure.ac: Add FT32 support.
* configure: Regenerate.
bfd/
* Makefile.am: Add FT32 files.
* archures.c (enum bfd_architecture): Add bfd_arch_ft32.
(bfd_mach_ft32): Define.
(bfd_ft32_arch): Declare.
(bfd_archures_list): Add bfd_ft32_arch.
* config.bfd: Handle FT32.
* configure.ac: Likewise.
* cpu-ft32.c: New file.
* elf32-ft32.c: New file.
* reloc.c (BFD_RELOC_FT32_10, BFD_RELOC_FT32_20, BFD_RELOC_FT32_17,
BFD_RELOC_FT32_18): Define.
* targets.c (_bfd_target_vector): Add ft32_elf32_vec.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.
* Makefile.in: Regenerate.
* configure: Regenerate.
* po/SRC-POTFILES.in: Regenerate.
binutils/
* readelf.c: Add FT32 support.
gas/
* Makefile.am: Add FT32 files.
* config/tc-ft32.c: New file.
* config/tc-ft32.h: New file.
* configure.tgt: Add FT32 support.
* Makefile.in: Regenerate.
* po/POTFILES.in: Regenerate.
gas/testsuite/
* gas/ft32/ft32.exp: New file.
* gas/ft32/insn.d: New file.
* gas/ft32/insn.s: New file.
include/
* dis-asm.h (print_insn_ft32): Declare.
include/elf/
* common.h (EM_FT32): Define.
* ft32.h: New file.
include/opcode/
* ft32.h: New file.
ld/
* Makefile.am: Add FT32 files.
* configure.tgt: Handle FT32 target.
* emulparams/elf32ft32.sh: New file.
* scripttempl/ft32.sc: New file.
* Makefile.in: Regenerate.
opcodes/
* Makefile.am: Add FT32 files.
* configure.ac: Handle FT32.
* disassemble.c (disassembler): Call print_insn_ft32.
* ft32-dis.c: New file.
* ft32-opc.c: New file.
* Makefile.in: Regenerate.
* configure: Regenerate.
* po/POTFILES.in: Regenerate.

52 files changed:
ChangeLog
bfd/ChangeLog
bfd/Makefile.am
bfd/Makefile.in
bfd/archures.c
bfd/bfd-in2.h
bfd/config.bfd
bfd/configure
bfd/configure.ac
bfd/cpu-ft32.c [new file with mode: 0644]
bfd/elf32-ft32.c [new file with mode: 0644]
bfd/libbfd.h
bfd/po/SRC-POTFILES.in
bfd/reloc.c
bfd/targets.c
binutils/ChangeLog
binutils/readelf.c
configure
configure.ac
gas/ChangeLog
gas/Makefile.am
gas/Makefile.in
gas/config/tc-ft32.c [new file with mode: 0644]
gas/config/tc-ft32.h [new file with mode: 0644]
gas/configure.tgt
gas/po/POTFILES.in
gas/testsuite/ChangeLog
gas/testsuite/gas/ft32/ft32.exp [new file with mode: 0644]
gas/testsuite/gas/ft32/insn.d [new file with mode: 0644]
gas/testsuite/gas/ft32/insn.s [new file with mode: 0644]
include/ChangeLog
include/dis-asm.h
include/elf/ChangeLog
include/elf/common.h
include/elf/ft32.h [new file with mode: 0644]
include/opcode/ChangeLog
include/opcode/ft32.h [new file with mode: 0644]
ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/configure.tgt
ld/emulparams/elf32ft32.sh [new file with mode: 0644]
ld/scripttempl/ft32.sc [new file with mode: 0644]
opcodes/ChangeLog
opcodes/Makefile.am
opcodes/Makefile.in
opcodes/configure
opcodes/configure.ac
opcodes/disassemble.c
opcodes/ft32-dis.c [new file with mode: 0644]
opcodes/ft32-opc.c [new file with mode: 0644]
opcodes/po/POTFILES.in

index f64b6ccd43748cc53d407bd793a6cfd0b8439a3b..da2e2ce39dea6d487420ba319666da88ca0e44bb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * configure.ac: Add FT32 support.
+       * configure: Regenerate.
+
 2015-01-12  Anthony Green  <green@moxielogic.com>
 
        * configure.ac: Don't disable gprof for moxie.
index 9abbccd031e7c197f7be1be16b1b295db0ed68b8..581b312b3155c193f325cf9eeb265983a0fc7528 100644 (file)
@@ -1,3 +1,23 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * Makefile.am: Add FT32 files.
+       * archures.c (enum bfd_architecture): Add bfd_arch_ft32.
+       (bfd_mach_ft32): Define.
+       (bfd_ft32_arch): Declare.
+       (bfd_archures_list): Add bfd_ft32_arch.
+       * config.bfd: Handle FT32.
+       * configure.ac: Likewise.
+       * cpu-ft32.c: New file.
+       * elf32-ft32.c: New file.
+       * reloc.c (BFD_RELOC_FT32_10, BFD_RELOC_FT32_20, BFD_RELOC_FT32_17,
+       BFD_RELOC_FT32_18): Define.
+       * targets.c (_bfd_target_vector): Add ft32_elf32_vec.
+       * bfd-in2.h: Regenerate.
+       * libbfd.h: Regenerate.
+       * Makefile.in: Regenerate.
+       * configure: Regenerate.
+       * po/SRC-POTFILES.in: Regenerate.
+
 2015-01-27  Nick Clifton  <nickc@redhat.com>
 
        PR binutils/17512
index 8ffdbb12e08159e643ed7265466bd0033b779aa1..5d7f89945bf5e194bd5b9afccb7266644a4cf3b2 100644 (file)
@@ -99,6 +99,7 @@ ALL_MACHINES = \
        cpu-epiphany.lo \
        cpu-fr30.lo \
        cpu-frv.lo \
+       cpu-ft32.lo \
        cpu-h8300.lo \
        cpu-h8500.lo \
        cpu-hppa.lo \
@@ -184,6 +185,7 @@ ALL_MACHINES_CFILES = \
        cpu-epiphany.c \
        cpu-fr30.c \
        cpu-frv.c \
+       cpu-ft32.c \
        cpu-h8300.c \
        cpu-h8500.c \
        cpu-hppa.c \
@@ -323,6 +325,7 @@ BFD32_BACKENDS = \
        elf32-epiphany.lo \
        elf32-fr30.lo \
        elf32-frv.lo \
+       elf32-ft32.lo \
        elf32-gen.lo \
        elf32-h8300.lo \
        elf32-hppa.lo \
@@ -513,6 +516,7 @@ BFD32_BACKENDS_CFILES = \
        elf32-epiphany.c \
        elf32-fr30.c \
        elf32-frv.c \
+       elf32-ft32.c \
        elf32-gen.c \
        elf32-h8300.c \
        elf32-hppa.c \
index 2c9435ce19d408cb8bedf65b4efdf2a346c1762a..60d994f21fc913323d945e000103f0021c112c59 100644 (file)
@@ -399,6 +399,7 @@ ALL_MACHINES = \
        cpu-epiphany.lo \
        cpu-fr30.lo \
        cpu-frv.lo \
+       cpu-ft32.lo \
        cpu-h8300.lo \
        cpu-h8500.lo \
        cpu-hppa.lo \
@@ -484,6 +485,7 @@ ALL_MACHINES_CFILES = \
        cpu-epiphany.c \
        cpu-fr30.c \
        cpu-frv.c \
+       cpu-ft32.c \
        cpu-h8300.c \
        cpu-h8500.c \
        cpu-hppa.c \
@@ -624,6 +626,7 @@ BFD32_BACKENDS = \
        elf32-epiphany.lo \
        elf32-fr30.lo \
        elf32-frv.lo \
+       elf32-ft32.lo \
        elf32-gen.lo \
        elf32-h8300.lo \
        elf32-hppa.lo \
@@ -814,6 +817,7 @@ BFD32_BACKENDS_CFILES = \
        elf32-epiphany.c \
        elf32-fr30.c \
        elf32-frv.c \
+       elf32-ft32.c \
        elf32-gen.c \
        elf32-h8300.c \
        elf32-hppa.c \
@@ -1319,6 +1323,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-epiphany.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-fr30.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-frv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-ft32.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-h8300.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-h8500.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-hppa.Plo@am__quote@
@@ -1416,6 +1421,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-epiphany.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-fr30.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-frv.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-ft32.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-gen.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-h8300.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-hppa.Plo@am__quote@
index ca20fb2c0817dbe49d842938e199b080ed28b3af..7a12985cf519e2fd973435eac3172fd66380ea80 100644 (file)
@@ -378,6 +378,8 @@ DESCRIPTION
 .#define bfd_mach_fr550                550
 .  bfd_arch_moxie,       {* The moxie processor *}
 .#define bfd_mach_moxie                1
+.  bfd_arch_ft32,       {* The ft32 processor *}
+.#define bfd_mach_ft32         1
 .  bfd_arch_mcore,
 .  bfd_arch_mep,
 .#define bfd_mach_mep          1
@@ -589,6 +591,7 @@ extern const bfd_arch_info_type bfd_mmix_arch;
 extern const bfd_arch_info_type bfd_mn10200_arch;
 extern const bfd_arch_info_type bfd_mn10300_arch;
 extern const bfd_arch_info_type bfd_moxie_arch;
+extern const bfd_arch_info_type bfd_ft32_arch;
 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;
@@ -679,6 +682,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
     &bfd_mn10200_arch,
     &bfd_mn10300_arch,
     &bfd_moxie_arch,
+    &bfd_ft32_arch,
     &bfd_msp430_arch,
     &bfd_mt_arch,
     &bfd_nds32_arch,
index 5de57e6f5c2c405c740249a42159fb4e241611f6..91dbf8077d9f62a3e23c4b309e702286a5e89e84 100644 (file)
@@ -2142,6 +2142,8 @@ enum bfd_architecture
 #define bfd_mach_fr550         550
   bfd_arch_moxie,       /* The moxie processor */
 #define bfd_mach_moxie         1
+  bfd_arch_ft32,       /* The ft32 processor */
+#define bfd_mach_ft32          1
   bfd_arch_mcore,
   bfd_arch_mep,
 #define bfd_mach_mep           1
@@ -3005,6 +3007,13 @@ to compensate for the borrow when the low bits are added.  */
   BFD_RELOC_MOXIE_10_PCREL,
 
 
+/* FT32 ELF relocations.  */
+  BFD_RELOC_FT32_10,
+  BFD_RELOC_FT32_20,
+  BFD_RELOC_FT32_17,
+  BFD_RELOC_FT32_18,
+
+
 /* Fujitsu Frv Relocations.  */
   BFD_RELOC_FRV_LABEL16,
   BFD_RELOC_FRV_LABEL24,
index 75f21e38d15856eafc81f951abbee18478ac5726..62f8ee41ef77cebefe3b7428e5f15dcda4a1b493 100644 (file)
@@ -1628,6 +1628,10 @@ case "${targ}" in
     targ_defvec=tilepro_elf32_vec
     ;;
 
+  ft32*-*-*)
+    targ_defvec=ft32_elf32_vec
+    ;;
+
   v850*-*-*)
     targ_defvec=v850_elf32_vec
     targ_selvecs="v800_elf32_vec"
index f7a9e81a7e41c01592e8d461fef7e4a866039168..1fc7991c436cbc5b657a8b17f762a31ca8fb8a1a 100755 (executable)
@@ -15598,6 +15598,7 @@ do
     vax_aout_bsd_vec)           tb="$tb vaxbsd.lo aout32.lo" ;;
     vax_aout_nbsd_vec)          tb="$tb vaxnetbsd.lo aout32.lo" ;;
     vax_elf32_vec)              tb="$tb elf32-vax.lo elf32.lo $elf" ;;
+    ft32_elf32_vec)             tb="$tb elf32-ft32.lo elf32.lo $elf" ;;
     visium_elf32_vec)           tb="$tb elf32-visium.lo elf32.lo $elf" ;;
     w65_coff_vec)               tb="$tb coff-w65.lo reloc16.lo $coffgen" ;;
     we32k_coff_vec)             tb="$tb coff-we32k.lo $coffgen" ;;
index a2743a03360f0883adaf045493ec05d244f91b49..337a23f186c49db30c4d465bf6bcc2ec7d00a243 100644 (file)
@@ -999,6 +999,7 @@ do
     vax_aout_bsd_vec)           tb="$tb vaxbsd.lo aout32.lo" ;;
     vax_aout_nbsd_vec)          tb="$tb vaxnetbsd.lo aout32.lo" ;;
     vax_elf32_vec)              tb="$tb elf32-vax.lo elf32.lo $elf" ;;
+    ft32_elf32_vec)             tb="$tb elf32-ft32.lo elf32.lo $elf" ;;
     visium_elf32_vec)           tb="$tb elf32-visium.lo elf32.lo $elf" ;;
     w65_coff_vec)               tb="$tb coff-w65.lo reloc16.lo $coffgen" ;;
     we32k_coff_vec)             tb="$tb coff-we32k.lo $coffgen" ;;
diff --git a/bfd/cpu-ft32.c b/bfd/cpu-ft32.c
new file mode 100644 (file)
index 0000000..950a989
--- /dev/null
@@ -0,0 +1,41 @@
+/* BFD support for the ft32 processor.
+   Copyright (C) 2013-2015 Free Software Foundation, Inc.
+   Written by FTDI (support@ftdichip.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"
+
+
+const bfd_arch_info_type bfd_ft32_arch =
+  {
+    32,               /* 32 bits in a word.  */
+    32,               /* 32 bits in an address.  */
+    8,                /*  8 bits in a byte.  */
+    bfd_arch_ft32,   /* enum bfd_architecture arch.  */
+    bfd_mach_ft32,
+    "ft32",          /* Arch name.  */
+    "ft32",          /* Printable name.  */
+    2,                /* Unsigned int section alignment power.  */
+    TRUE,             /* The one and only.  */
+    bfd_default_compatible,
+    bfd_default_scan,
+    bfd_arch_default_fill,
+    0,
+  };
diff --git a/bfd/elf32-ft32.c b/bfd/elf32-ft32.c
new file mode 100644 (file)
index 0000000..ea73d97
--- /dev/null
@@ -0,0 +1,380 @@
+/* ft32-specific support for 32-bit ELF.
+   Copyright (C) 2013-2015 Free Software Foundation, Inc.
+
+   Copied from elf32-moxie.c which is..
+   Copyright (C) 2009-2015 Free Software Foundation, Inc.
+   Free Software Foundation, Inc.
+
+   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/ft32.h"
+
+/* Forward declarations.  */
+
+static reloc_howto_type ft32_elf_howto_table [] =
+{
+  /* This reloc does nothing.  */
+  HOWTO (R_FT32_NONE,          /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FT32_NONE",         /* name */
+        FALSE,                 /* partial_inplace */
+        0,                     /* src_mask */
+        0,                     /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  /* A 32 bit absolute relocation.  */
+
+  HOWTO (R_FT32_32,            /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        32,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FT32_32",           /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0xffffffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  HOWTO (R_FT32_16,            /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        16,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_bitfield, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FT32_16",           /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x0000ffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  HOWTO (R_FT32_8,             /* type */
+        0,                     /* rightshift */
+        0,                     /* size (0 = byte, 1 = short, 2 = long) */
+        8,                     /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_signed, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FT32_8",            /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x000000ff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  HOWTO (R_FT32_10,            /* type */
+        0,                     /* rightshift */
+        1,                     /* size (0 = byte, 1 = short, 2 = long) */
+        10,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        4,                     /* bitpos */
+        complain_overflow_signed, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FT32_10",           /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x00003ff0,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  HOWTO (R_FT32_20,            /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        20,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FT32_20",           /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x000fffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  HOWTO (R_FT32_17,            /* type */
+        0,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        17,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_dont, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FT32_17",           /* name */
+        FALSE,                 /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x0001ffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+  HOWTO (R_FT32_18,            /* type */
+        2,                     /* rightshift */
+        2,                     /* size (0 = byte, 1 = short, 2 = long) */
+        18,                    /* bitsize */
+        FALSE,                 /* pc_relative */
+        0,                     /* bitpos */
+        complain_overflow_signed, /* complain_on_overflow */
+        bfd_elf_generic_reloc, /* special_function */
+        "R_FT32_18",           /* name */
+        FALSE,         /* partial_inplace */
+        0x00000000,            /* src_mask */
+        0x0003ffff,            /* dst_mask */
+        FALSE),                /* pcrel_offset */
+
+};
+\f
+/* Map BFD reloc types to FT32 ELF reloc types.  */
+
+struct ft32_reloc_map
+{
+  bfd_reloc_code_real_type bfd_reloc_val;
+  unsigned int ft32_reloc_val;
+};
+
+static const struct ft32_reloc_map ft32_reloc_map [] =
+{
+  { BFD_RELOC_NONE,            R_FT32_NONE },
+  { BFD_RELOC_32,              R_FT32_20 },
+  { BFD_RELOC_16,              R_FT32_16 },
+  { BFD_RELOC_8,               R_FT32_8 },
+  { BFD_RELOC_FT32_10,           R_FT32_10 },
+  { BFD_RELOC_FT32_20,           R_FT32_20 },
+  { BFD_RELOC_FT32_17,           R_FT32_17 },
+  { BFD_RELOC_FT32_18,           R_FT32_18 },
+};
+
+static reloc_howto_type *
+ft32_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
+                        bfd_reloc_code_real_type code)
+{
+  unsigned int i;
+
+  for (i = sizeof (ft32_reloc_map) / sizeof (ft32_reloc_map[0]);
+       --i;)
+    if (ft32_reloc_map [i].bfd_reloc_val == code)
+      return & ft32_elf_howto_table [ft32_reloc_map[i].ft32_reloc_val];
+
+  return NULL;
+}
+
+static reloc_howto_type *
+ft32_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
+{
+  unsigned int i;
+
+  for (i = 0;
+       i < sizeof (ft32_elf_howto_table) / sizeof (ft32_elf_howto_table[0]);
+       i++)
+    if (ft32_elf_howto_table[i].name != NULL
+       && strcasecmp (ft32_elf_howto_table[i].name, r_name) == 0)
+      return &ft32_elf_howto_table[i];
+
+  return NULL;
+}
+
+/* Set the howto pointer for an FT32 ELF reloc.  */
+
+static void
+ft32_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
+                         arelent *cache_ptr,
+                         Elf_Internal_Rela *dst)
+{
+  unsigned int r_type;
+
+  r_type = ELF32_R_TYPE (dst->r_info);
+  BFD_ASSERT (r_type < (unsigned int) R_FT32_max);
+  cache_ptr->howto = & ft32_elf_howto_table [r_type];
+}
+\f
+/* Relocate an FT32 ELF section.
+
+   The RELOCATE_SECTION function is called by the new ELF backend linker
+   to handle the relocations for a section.
+
+   The relocs are always passed as Rela structures; if the section
+   actually uses Rel structures, the r_addend field will always be
+   zero.
+
+   This function is responsible for adjusting the section contents as
+   necessary, and (if using Rela relocs and generating a relocatable
+   output file) adjusting the reloc addend as necessary.
+
+   This function does not have to worry about setting the reloc
+   address or the reloc symbol index.
+
+   LOCAL_SYMS is a pointer to the swapped in local symbols.
+
+   LOCAL_SECTIONS is an array giving the section in the input file
+   corresponding to the st_shndx field of each local symbol.
+
+   The global hash table entry for the global symbols can be found
+   via elf_sym_hashes (input_bfd).
+
+   When generating relocatable output, this function must handle
+   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
+   going to be the section symbol corresponding to the output
+   section, which means that the addend must be adjusted
+   accordingly.  */
+
+static bfd_boolean
+ft32_elf_relocate_section (bfd *output_bfd,
+                           struct bfd_link_info *info,
+                           bfd *input_bfd,
+                           asection *input_section,
+                           bfd_byte *contents,
+                           Elf_Internal_Rela *relocs,
+                           Elf_Internal_Sym *local_syms,
+                           asection **local_sections)
+{
+  Elf_Internal_Shdr *symtab_hdr;
+  struct elf_link_hash_entry **sym_hashes;
+  Elf_Internal_Rela *rel;
+  Elf_Internal_Rela *relend;
+
+  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
+  sym_hashes = elf_sym_hashes (input_bfd);
+  relend     = relocs + input_section->reloc_count;
+
+  for (rel = relocs; rel < relend; rel ++)
+    {
+      reloc_howto_type *howto;
+      unsigned long r_symndx;
+      Elf_Internal_Sym *sym;
+      asection *sec;
+      struct elf_link_hash_entry *h;
+      bfd_vma relocation;
+      bfd_reloc_status_type r;
+      const char *name;
+      int r_type;
+
+      r_type = ELF32_R_TYPE (rel->r_info);
+      r_symndx = ELF32_R_SYM (rel->r_info);
+      howto  = ft32_elf_howto_table + r_type;
+      h      = NULL;
+      sym    = NULL;
+      sec    = NULL;
+
+      if (r_symndx < symtab_hdr->sh_info)
+       {
+         sym = local_syms + r_symndx;
+         sec = local_sections [r_symndx];
+         relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
+
+         name = bfd_elf_string_from_elf_section
+           (input_bfd, symtab_hdr->sh_link, sym->st_name);
+         name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
+       }
+      else
+       {
+         bfd_boolean unresolved_reloc, warned, ignored;
+
+         RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
+                                  r_symndx, symtab_hdr, sym_hashes,
+                                  h, sec, relocation,
+                                  unresolved_reloc, warned, ignored);
+
+         name = h->root.root.string;
+       }
+
+      if (sec != NULL && discarded_section (sec))
+       RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
+                                        rel, 1, relend, howto, 0, contents);
+
+      if (info->relocatable)
+       continue;
+
+      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
+                                   contents, rel->r_offset,
+                                   relocation, rel->r_addend);
+
+      if (r != bfd_reloc_ok)
+       {
+         const char * msg = NULL;
+
+         switch (r)
+           {
+           case bfd_reloc_overflow:
+             r = info->callbacks->reloc_overflow
+               (info, (h ? &h->root : NULL), name, howto->name,
+                (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
+             break;
+
+           case bfd_reloc_undefined:
+             r = info->callbacks->undefined_symbol
+               (info, name, input_bfd, input_section, rel->r_offset,
+                TRUE);
+             break;
+
+           case bfd_reloc_outofrange:
+             msg = _("internal error: out of range error");
+             break;
+
+           case bfd_reloc_notsupported:
+             msg = _("internal error: unsupported relocation error");
+             break;
+
+           case bfd_reloc_dangerous:
+             msg = _("internal error: dangerous relocation");
+             break;
+
+           default:
+             msg = _("internal error: unknown error");
+             break;
+           }
+
+         if (msg)
+           r = info->callbacks->warning
+             (info, msg, name, input_bfd, input_section, rel->r_offset);
+
+         if (! r)
+           return FALSE;
+       }
+    }
+
+  return TRUE;
+}
+\f
+#define ELF_ARCH               bfd_arch_ft32
+#define ELF_MACHINE_CODE       EM_FT32
+#define ELF_MAXPAGESIZE                0x1
+
+#define TARGET_LITTLE_SYM       ft32_elf32_vec
+#define TARGET_LITTLE_NAME     "elf32-ft32"
+
+#define elf_info_to_howto_rel                  NULL
+#define elf_info_to_howto                      ft32_info_to_howto_rela
+#define elf_backend_relocate_section           ft32_elf_relocate_section
+
+#define elf_backend_can_gc_sections            1
+#define elf_backend_rela_normal                        1
+
+#define bfd_elf32_bfd_reloc_type_lookup                ft32_reloc_type_lookup
+#define bfd_elf32_bfd_reloc_name_lookup                ft32_reloc_name_lookup
+
+#include "elf32-target.h"
index bf1ebb642e80c0b9e3b38b3e712761279758e790..a1c0a01cc710d1a9d4727f3ff1a8e95652c190b1 100644 (file)
@@ -1193,6 +1193,11 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
 
   "BFD_RELOC_MOXIE_10_PCREL",
 
+  "BFD_RELOC_FT32_10",
+  "BFD_RELOC_FT32_20",
+  "BFD_RELOC_FT32_17",
+  "BFD_RELOC_FT32_18",
+
   "BFD_RELOC_FRV_LABEL16",
   "BFD_RELOC_FRV_LABEL24",
   "BFD_RELOC_FRV_LO16",
index 83e393d46a8cd942fbfb4294fd664ecb5ec1db50..2e5776aa246b3950d73f3bdb2aeb4bb5f803123d 100644 (file)
@@ -77,6 +77,7 @@ cpu-dlx.c
 cpu-epiphany.c
 cpu-fr30.c
 cpu-frv.c
+cpu-ft32.c
 cpu-h8300.c
 cpu-h8500.c
 cpu-hppa.c
@@ -177,6 +178,7 @@ elf32-dlx.c
 elf32-epiphany.c
 elf32-fr30.c
 elf32-frv.c
+elf32-ft32.c
 elf32-gen.c
 elf32-h8300.c
 elf32-hppa.c
index 5734fc8f76ca71e10b7ff8c6505ab4b7ac7971ff..547c1a16b7fc06492532f9efb9ff6a42fd82ccdd 100644 (file)
@@ -2455,6 +2455,18 @@ ENUMDOC
   Moxie ELF relocations.
 COMMENT
 
+ENUM
+  BFD_RELOC_FT32_10
+ENUMX
+  BFD_RELOC_FT32_20
+ENUMX
+  BFD_RELOC_FT32_17
+ENUMX
+  BFD_RELOC_FT32_18
+ENUMDOC
+  FT32 ELF relocations.
+COMMENT
+
 ENUM
   BFD_RELOC_FRV_LABEL16
 ENUMX
index dc1e3ca7035bcec602cb5fc4a1ae2bc1a7da239d..0c7fed5fe8edaba4f8255323eb198ab8cafa765b 100644 (file)
@@ -872,6 +872,7 @@ extern const bfd_target tilegx_elf64_le_vec;
 extern const bfd_target tilepro_elf32_vec;
 extern const bfd_target v800_elf32_vec;
 extern const bfd_target v850_elf32_vec;
+extern const bfd_target ft32_elf32_vec;
 extern const bfd_target vax_aout_1knbsd_vec;
 extern const bfd_target vax_aout_bsd_vec;
 extern const bfd_target vax_aout_nbsd_vec;
@@ -1378,6 +1379,8 @@ static const bfd_target * const _bfd_target_vector[] =
 #endif
        &tilepro_elf32_vec,
 
+       &ft32_elf32_vec,
+
        &v800_elf32_vec,
        &v850_elf32_vec,
 
index 924f35c84c7cdbc84de8535eed1185fead95dd8d..37754e75a4e1a8dcd95f1f17ad9f56f66e379ae9 100644 (file)
@@ -1,3 +1,7 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * readelf.c: Add FT32 support.
+
 2015-01-27  Nick Clifton  <nickc@redhat.com>
 
        PR binutils/17512
index 6dd3a4c48f87f72c3d9bb244d3a9e362c8aecc72..e08d74e5ca2fd5d69124af56e63a1f6ccc8d7153 100644 (file)
 #include "elf/epiphany.h"
 #include "elf/fr30.h"
 #include "elf/frv.h"
+#include "elf/ft32.h"
 #include "elf/h8.h"
 #include "elf/hppa.h"
 #include "elf/i386.h"
@@ -709,6 +710,7 @@ guess_is_rela (unsigned int e_machine)
     case EM_D30V:
     case EM_CYGNUS_D30V:
     case EM_FR30:
+    case EM_FT32:
     case EM_CYGNUS_FR30:
     case EM_CYGNUS_FRV:
     case EM_H8S:
@@ -1234,6 +1236,10 @@ dump_relocations (FILE * file,
          rtype = elf_frv_reloc_type (type);
          break;
 
+       case EM_FT32:
+         rtype = elf_ft32_reloc_type (type);
+         break;
+
        case EM_MCORE:
          rtype = elf_mcore_reloc_type (type);
          break;
@@ -2072,6 +2078,7 @@ get_machine_name (unsigned e_machine)
     case EM_PPC:               return "PowerPC";
     case EM_PPC64:             return "PowerPC64";
     case EM_FR20:              return "Fujitsu FR20";
+    case EM_FT32:              return "FTDI FT32";
     case EM_RH32:              return "TRW RH32";
     case EM_MCORE:             return "MCORE";
     case EM_ARM:               return "ARM";
@@ -11033,6 +11040,8 @@ is_32bit_abs_reloc (unsigned int reloc_type)
     case EM_CYGNUS_FR30:
     case EM_FR30:
       return reloc_type == 3; /* R_FR30_32.  */
+    case EM_FT32:
+      return reloc_type == 1; /* R_FT32_32.  */
     case EM_H8S:
     case EM_H8_300:
     case EM_H8_300H:
@@ -11400,6 +11409,7 @@ is_none_reloc (unsigned int reloc_type)
     case EM_L1OM:    /* R_X86_64_NONE.  */
     case EM_K1OM:    /* R_X86_64_NONE.  */
     case EM_MN10300: /* R_MN10300_NONE.  */
+    case EM_FT32:    /* R_FT32_NONE.  */
     case EM_MOXIE:   /* R_MOXIE_NONE.  */
     case EM_M32R:    /* R_M32R_NONE.  */
     case EM_TI_C6000:/* R_C6000_NONE.  */
index 2f6378962ca04c6a86ffab192abf8c8514babc3a..d075cf36b9c161970def726b4c31b30ec7132d57 100755 (executable)
--- a/configure
+++ b/configure
@@ -3443,6 +3443,9 @@ case "${target}" in
   rs6000-*-aix*)
     noconfigdirs="$noconfigdirs ${libgcj}"
     ;;
+  ft32-*-*)
+    noconfigdirs="$noconfigdirs ${libgcj}"
+    ;;
   *-*-lynxos*)
     noconfigdirs="$noconfigdirs ${libgcj}"
     ;;
@@ -3668,6 +3671,9 @@ case "${target}" in
   fr30-*-elf*)
     noconfigdirs="$noconfigdirs gdb"
     ;;
+  ft32-*-*)
+    noconfigdirs="$noconfigdirs target-rda gprof"
+    ;;
   moxie-*-*)
     noconfigdirs="$noconfigdirs"
     ;;
index 315209fcdb00f55a0071cee065f291da363448d6..5ff56bfaa50751143f0ee206b9f0e1f9d7685650 100644 (file)
@@ -767,6 +767,9 @@ case "${target}" in
   rs6000-*-aix*)
     noconfigdirs="$noconfigdirs ${libgcj}"
     ;;
+  ft32-*-*)
+    noconfigdirs="$noconfigdirs ${libgcj}"
+    ;;
   *-*-lynxos*)
     noconfigdirs="$noconfigdirs ${libgcj}"
     ;; 
@@ -992,6 +995,9 @@ case "${target}" in
   fr30-*-elf*)
     noconfigdirs="$noconfigdirs gdb"
     ;;
+  ft32-*-*)
+    noconfigdirs="$noconfigdirs target-rda gprof"
+    ;;
   moxie-*-*)
     noconfigdirs="$noconfigdirs"
     ;;
index 2e7205b3e609bfff3ce2a78a014dd5c00205c6ea..8f16b3135bd6551a664b4960024889814e52255b 100644 (file)
@@ -1,3 +1,12 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * Makefile.am: Add FT32 files.
+       * config/tc-ft32.c: New file.
+       * config/tc-ft32.h: New file.
+       * configure.tgt: Add FT32 support.
+       * Makefile.in: Regenerate.
+       * po/POTFILES.in: Regenerate.
+
 2015-01-27  Kuan-Lin Chen  <kuanlinchentw@gmail.com>
 
        * config/tc-nds32.c (do_pseudo_la_internal): Limit the second argument
index f875c93ef2c86f492b711b1f29a2c79c6636c0c7..a822be76aa4f41c24a2a42d7272f1a2696c86465 100644 (file)
@@ -139,6 +139,7 @@ TARGET_CPU_CFILES = \
        config/tc-epiphany.c \
        config/tc-fr30.c \
        config/tc-frv.c \
+       config/tc-ft32.c \
        config/tc-h8300.c \
        config/tc-hppa.c \
        config/tc-ia64.c \
@@ -212,6 +213,7 @@ TARGET_CPU_HFILES = \
        config/tc-epiphany.h \
        config/tc-fr30.h \
        config/tc-frv.h \
+       config/tc-ft32.h \
        config/tc-h8300.h \
        config/tc-hppa.h \
        config/tc-ia64.h \
index f190714659f8c0018db5e13f209af12ec0f013e9..edd3638bbcb2201be9707d3c595f387ffe94a152 100644 (file)
@@ -408,6 +408,7 @@ TARGET_CPU_CFILES = \
        config/tc-epiphany.c \
        config/tc-fr30.c \
        config/tc-frv.c \
+       config/tc-ft32.c \
        config/tc-h8300.c \
        config/tc-hppa.c \
        config/tc-ia64.c \
@@ -481,6 +482,7 @@ TARGET_CPU_HFILES = \
        config/tc-epiphany.h \
        config/tc-fr30.h \
        config/tc-frv.h \
+       config/tc-ft32.h \
        config/tc-h8300.h \
        config/tc-hppa.h \
        config/tc-ia64.h \
@@ -836,6 +838,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-epiphany.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-fr30.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-frv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-ft32.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-h8300.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-hppa.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc-i370.Po@am__quote@
@@ -1126,6 +1129,20 @@ tc-frv.obj: config/tc-frv.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tc-frv.obj `if test -f 'config/tc-frv.c'; then $(CYGPATH_W) 'config/tc-frv.c'; else $(CYGPATH_W) '$(srcdir)/config/tc-frv.c'; fi`
 
+tc-ft32.o: config/tc-ft32.c
+@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tc-ft32.o -MD -MP -MF $(DEPDIR)/tc-ft32.Tpo -c -o tc-ft32.o `test -f 'config/tc-ft32.c' || echo '$(srcdir)/'`config/tc-ft32.c
+@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/tc-ft32.Tpo $(DEPDIR)/tc-ft32.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='config/tc-ft32.c' object='tc-ft32.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tc-ft32.o `test -f 'config/tc-ft32.c' || echo '$(srcdir)/'`config/tc-ft32.c
+
+tc-ft32.obj: config/tc-ft32.c
+@am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tc-ft32.obj -MD -MP -MF $(DEPDIR)/tc-ft32.Tpo -c -o tc-ft32.obj `if test -f 'config/tc-ft32.c'; then $(CYGPATH_W) 'config/tc-ft32.c'; else $(CYGPATH_W) '$(srcdir)/config/tc-ft32.c'; fi`
+@am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/tc-ft32.Tpo $(DEPDIR)/tc-ft32.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='config/tc-ft32.c' object='tc-ft32.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tc-ft32.obj `if test -f 'config/tc-ft32.c'; then $(CYGPATH_W) 'config/tc-ft32.c'; else $(CYGPATH_W) '$(srcdir)/config/tc-ft32.c'; fi`
+
 tc-h8300.o: config/tc-h8300.c
 @am__fastdepCC_TRUE@   $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tc-h8300.o -MD -MP -MF $(DEPDIR)/tc-h8300.Tpo -c -o tc-h8300.o `test -f 'config/tc-h8300.c' || echo '$(srcdir)/'`config/tc-h8300.c
 @am__fastdepCC_TRUE@   $(am__mv) $(DEPDIR)/tc-h8300.Tpo $(DEPDIR)/tc-h8300.Po
diff --git a/gas/config/tc-ft32.c b/gas/config/tc-ft32.c
new file mode 100644 (file)
index 0000000..09efc37
--- /dev/null
@@ -0,0 +1,606 @@
+/* tc-ft32.c -- Assemble code for ft32
+   Copyright (C) 2008-2015 Free Software Foundation, Inc.
+
+   This file is part of GAS, the GNU Assembler.
+
+   GAS 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.
+
+   GAS 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 GAS; see the file COPYING.  If not, write to
+   the Free Software Foundation, 51 Franklin Street - Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* Contributed by Anthony Green <green@spindazzle.org>.  */
+
+#include "as.h"
+#include "safe-ctype.h"
+#include "opcode/ft32.h"
+
+extern const ft32_opc_info_t ft32_opc_info[128];
+
+const char comment_chars[]        = "#";
+const char line_separator_chars[] = ";";
+const char line_comment_chars[]   = "#";
+
+static int pending_reloc;
+static struct hash_control *opcode_hash_control;
+
+static valueT md_chars_to_number (char * buf, int n);
+
+const pseudo_typeS md_pseudo_table[] =
+{
+  {0, 0, 0}
+};
+
+const char FLT_CHARS[] = "rRsSfFdDxXpP";
+const char EXP_CHARS[] = "eE";
+
+/* This function is called once, at assembler startup time.  It sets
+   up the hash table with all the opcodes in it, and also initializes
+   some aliases for compatibility with other assemblers.  */
+
+void
+md_begin (void)
+{
+  const ft32_opc_info_t *opcode;
+  opcode_hash_control = hash_new ();
+
+  /* Insert names into hash table.  */
+  for (opcode = ft32_opc_info; opcode->name; opcode++)
+    hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
+
+  bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
+}
+
+/* Parse an expression and then restore the input line pointer.  */
+
+static char *
+parse_exp_save_ilp (char *s, expressionS *op)
+{
+  char *save = input_line_pointer;
+
+  input_line_pointer = s;
+  expression (op);
+  s = input_line_pointer;
+  input_line_pointer = save;
+  return s;
+}
+
+static int
+parse_condition (char **ptr)
+{
+  char *s = *ptr;
+  static const struct {
+    char *name;
+    int bits;
+  } ccs[] = {
+    { "gt,"   , (2 << FT32_FLD_CR_BIT) | (5 << FT32_FLD_CB_BIT) | (1 << FT32_FLD_CV_BIT)},
+    { "gte,"  , (2 << FT32_FLD_CR_BIT) | (4 << FT32_FLD_CB_BIT) | (1 << FT32_FLD_CV_BIT)},
+    { "lt,"   , (2 << FT32_FLD_CR_BIT) | (4 << FT32_FLD_CB_BIT) | (0 << FT32_FLD_CV_BIT)},
+    { "lte,"  , (2 << FT32_FLD_CR_BIT) | (5 << FT32_FLD_CB_BIT) | (0 << FT32_FLD_CV_BIT)},
+    { "a,"    , (2 << FT32_FLD_CR_BIT) | (6 << FT32_FLD_CB_BIT) | (1 << FT32_FLD_CV_BIT)},
+    { "ae,"   , (2 << FT32_FLD_CR_BIT) | (1 << FT32_FLD_CB_BIT) | (0 << FT32_FLD_CV_BIT)},
+    { "be,"   , (2 << FT32_FLD_CR_BIT) | (6 << FT32_FLD_CB_BIT) | (0 << FT32_FLD_CV_BIT)},
+    { "b,"    , (2 << FT32_FLD_CR_BIT) | (1 << FT32_FLD_CB_BIT) | (1 << FT32_FLD_CV_BIT)},
+    { "nz,"   , (2 << FT32_FLD_CR_BIT) | (0 << FT32_FLD_CB_BIT) | (0 << FT32_FLD_CV_BIT)},
+    { "z,"    , (2 << FT32_FLD_CR_BIT) | (0 << FT32_FLD_CB_BIT) | (1 << FT32_FLD_CV_BIT)},
+    { "nc,"   , (2 << FT32_FLD_CR_BIT) | (1 << FT32_FLD_CB_BIT) | (0 << FT32_FLD_CV_BIT)},
+    { "c,"    , (2 << FT32_FLD_CR_BIT) | (1 << FT32_FLD_CB_BIT) | (1 << FT32_FLD_CV_BIT)},
+    { "no,"   , (2 << FT32_FLD_CR_BIT) | (2 << FT32_FLD_CB_BIT) | (0 << FT32_FLD_CV_BIT)},
+    { "o,"    , (2 << FT32_FLD_CR_BIT) | (2 << FT32_FLD_CB_BIT) | (1 << FT32_FLD_CV_BIT)},
+    { "ns,"   , (2 << FT32_FLD_CR_BIT) | (3 << FT32_FLD_CB_BIT) | (0 << FT32_FLD_CV_BIT)},
+    { "s,"    , (2 << FT32_FLD_CR_BIT) | (3 << FT32_FLD_CB_BIT) | (1 << FT32_FLD_CV_BIT)},
+    { NULL, 0}
+  }, *pc;
+
+  for (pc = ccs; pc->name; pc++)
+    {
+      if (memcmp(pc->name, s, strlen(pc->name)) == 0)
+        {
+          *ptr += strlen(pc->name) - 1;
+          return pc->bits;
+        }
+    }
+  return -1;
+}
+
+static int
+parse_decimal (char **ptr)
+{
+  int r = 0;
+  char *s = *ptr;
+
+  while (('0' <= *s) && (*s <= '9'))
+    {
+      r *= 10;
+      r += (*s++ - '0');
+    }
+  *ptr = s;
+  return r;
+}
+
+static int
+parse_register_operand (char **ptr)
+{
+  int reg;
+  char *s = *ptr;
+
+  if (*s != '$')
+    {
+      as_bad (_("expecting register"));
+      ignore_rest_of_line ();
+      return -1;
+    }
+  if ((s[1] == 's') && (s[2] == 'p'))
+    {
+      reg = 31;
+    }
+  else if ((s[1] == 'c') && (s[2] == 'c'))
+    {
+      reg = 30;
+    }
+  else if ((s[1] == 'f') && (s[2] == 'p'))
+    {
+      reg = 29;
+    }
+  else if (s[1] == 'r')
+    {
+      reg = s[2] - '0';
+      if ((reg < 0) || (reg > 9))
+       {
+         as_bad (_("illegal register number"));
+         ignore_rest_of_line ();
+         return -1;
+       }
+      if ((reg == 1) || (reg == 2) || (reg == 3))
+       {
+         int r2 = s[3] - '0';
+         if ((r2 >= 0) && (r2 <= 9))
+           {
+             reg = (reg * 10) + r2;
+             *ptr += 1;
+           }
+       }
+    }
+  else
+    {
+      as_bad (_("illegal register number"));
+      ignore_rest_of_line ();
+      return -1;
+    }
+
+  *ptr += 3;
+
+  return reg;
+}
+
+/* This is the guts of the machine-dependent assembler.  STR points to
+   a machine dependent instruction.  This function is supposed to emit
+   the frags/bytes it assembles to.  */
+
+void
+md_assemble (char *str)
+{
+  char *op_start;
+  char *op_end;
+
+  ft32_opc_info_t *opcode;
+  char *output;
+  int idx = 0;
+  char pend;
+
+  int nlen = 0;
+
+  unsigned int b;
+  int f;
+
+  expressionS arg;
+
+  /* Drop leading whitespace.  */
+  while (*str == ' ')
+    str++;
+
+  /* Find the op code end.  */
+  op_start = str;
+  for (op_end = str;
+       *op_end && !is_end_of_line[*op_end & 0xff] && *op_end != ' ' && *op_end != '.';
+       op_end++)
+    nlen++;
+
+  pend = *op_end;
+  *op_end = 0;
+
+  if (nlen == 0)
+    as_bad (_("can't find opcode "));
+
+  opcode = (ft32_opc_info_t *) hash_find (opcode_hash_control, op_start);
+  *op_end = pend;
+
+  if (opcode == NULL)
+    {
+      as_bad (_("unknown opcode %s"), op_start);
+      return;
+    }
+
+  b = opcode->bits;
+  f = opcode->fields;
+
+  if (opcode->dw)
+    {
+      int dw;
+      if (*op_end == '.')
+        {
+          switch (op_end[1])
+            {
+              case 'b':
+                dw = 0;
+                break;
+              case 's':
+                dw = 1;
+                break;
+              case 'l':
+                dw = 2;
+                break;
+              default:
+                as_bad (_("unknown width specifier '.%c'"), op_end[1]);
+                return;
+            }
+          op_end += 2;
+        }
+      else
+        {
+          dw = 2; /* default is ".l" */
+        }
+      b |= dw << FT32_FLD_DW_BIT;
+    }
+
+  while (ISSPACE (*op_end))
+    op_end++;
+
+  output = frag_more (4);
+
+  while (f)
+    {
+      int lobit = f & -f;
+      if (f & lobit)
+        {
+          switch (lobit)
+          {
+          case  FT32_FLD_CBCRCV:
+            b |= parse_condition( &op_end);
+            break;
+          case  FT32_FLD_CB:
+            b |= parse_decimal (&op_end) << FT32_FLD_CB_BIT;
+            break;
+          case  FT32_FLD_R_D:
+            b |= parse_register_operand (&op_end) << FT32_FLD_R_D_BIT;
+            break;
+          case  FT32_FLD_CR:
+            b |= (parse_register_operand (&op_end) - 28) << FT32_FLD_CR_BIT;
+            break;
+          case  FT32_FLD_CV:
+            b |= parse_decimal (&op_end) << FT32_FLD_CV_BIT;
+            break;
+          case  FT32_FLD_R_1:
+            b |= parse_register_operand (&op_end) << FT32_FLD_R_1_BIT;
+            break;
+          case  FT32_FLD_RIMM:
+            if (*op_end == '$')
+              {
+                b |= parse_register_operand (&op_end) << FT32_FLD_RIMM_BIT;
+              }
+            else
+              {
+                b |= 0x400 << FT32_FLD_RIMM_BIT;
+                op_end = parse_exp_save_ilp (op_end, &arg);
+                fix_new_exp (frag_now,
+                             (output - frag_now->fr_literal),
+                             2,
+                             &arg,
+                             0,
+                             BFD_RELOC_FT32_10);
+              }
+            break;
+          case  FT32_FLD_R_2:
+            b |= parse_register_operand (&op_end) << FT32_FLD_R_2_BIT;
+            break;
+          case  FT32_FLD_K20:
+            op_end = parse_exp_save_ilp (op_end, &arg);
+            fix_new_exp (frag_now,
+                         (output - frag_now->fr_literal),
+                         3,
+                         &arg,
+                         0,
+                         BFD_RELOC_FT32_20);
+            break;
+          case  FT32_FLD_PA:
+            op_end = parse_exp_save_ilp (op_end, &arg);
+            fix_new_exp (frag_now,
+                         (output - frag_now->fr_literal),
+                         3,
+                         &arg,
+                         0,
+                         BFD_RELOC_FT32_18);
+            break;
+          case  FT32_FLD_AA:
+            op_end = parse_exp_save_ilp (op_end, &arg);
+            fix_new_exp (frag_now,
+                         (output - frag_now->fr_literal),
+                         3,
+                         &arg,
+                         0,
+                         BFD_RELOC_FT32_17);
+            break;
+          case  FT32_FLD_K16:
+            op_end = parse_exp_save_ilp (op_end, &arg);
+            fix_new_exp (frag_now,
+                         (output - frag_now->fr_literal),
+                         2,
+                         &arg,
+                         0,
+                         BFD_RELOC_16);
+            break;
+          case  FT32_FLD_K8:
+            op_end = parse_exp_save_ilp (op_end, &arg);
+            fix_new_exp (frag_now,
+                         (output - frag_now->fr_literal),
+                         1,
+                         &arg,
+                         0,
+                         BFD_RELOC_8);
+            break;
+          case  FT32_FLD_R_D_POST:
+            b |= parse_register_operand (&op_end) << FT32_FLD_R_D_BIT;
+            break;
+          case  FT32_FLD_R_1_POST:
+            b |= parse_register_operand (&op_end) << FT32_FLD_R_1_BIT;
+            break;
+          default:
+            as_bad (_("internal error in argument parsing"));
+            break;
+          }
+          f &= ~lobit;
+          if (f)
+            {
+              while (ISSPACE (*op_end))
+                op_end++;
+
+              if (*op_end != ',')
+                {
+                  as_bad (_("expected comma separator"));
+                  ignore_rest_of_line ();
+                }
+
+              op_end++;
+              while (ISSPACE (*op_end))
+                op_end++;
+            }
+        }
+    }
+  if (*op_end != 0)
+    as_warn (_("extra stuff on line ignored"));
+
+  output[idx++] = 0xff & (b >> 0);
+  output[idx++] = 0xff & (b >> 8);
+  output[idx++] = 0xff & (b >> 16);
+  output[idx++] = 0xff & (b >> 24);
+
+  while (ISSPACE (*op_end))
+    op_end++;
+
+  if (*op_end != 0)
+    as_warn ("extra stuff on line ignored");
+
+  if (pending_reloc)
+    as_bad ("Something forgot to clean up\n");
+}
+
+/* Turn a string in input_line_pointer into a floating point constant
+   of type type, and store the appropriate bytes in *LITP.  The number
+   of LITTLENUMS emitted is stored in *SIZEP .  An error message is
+   returned, or NULL on OK.  */
+
+char *
+md_atof (int type, char *litP, int *sizeP)
+{
+  int prec;
+  LITTLENUM_TYPE words[4];
+  char *t;
+  int i;
+
+  switch (type)
+    {
+    case 'f':
+      prec = 2;
+      break;
+
+    case 'd':
+      prec = 4;
+      break;
+
+    default:
+      *sizeP = 0;
+      return _("bad call to md_atof");
+    }
+
+  t = atof_ieee (input_line_pointer, type, words);
+  if (t)
+    input_line_pointer = t;
+
+  *sizeP = prec * 2;
+
+  for (i = prec - 1; i >= 0; i--)
+    {
+      md_number_to_chars (litP, (valueT) words[i], 2);
+      litP += 2;
+    }
+
+  return NULL;
+}
+\f
+const char *md_shortopts = "";
+
+struct option md_longopts[] =
+{
+  {NULL, no_argument, NULL, 0}
+};
+size_t md_longopts_size = sizeof (md_longopts);
+
+/* We have no target specific options yet, so these next
+   two functions are empty.  */
+int
+md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED)
+{
+  return 0;
+}
+
+void
+md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
+{
+}
+
+/* Convert from target byte order to host byte order.  */
+
+static valueT
+md_chars_to_number (char * buf, int n)
+{
+  valueT result = 0;
+  unsigned char * where = (unsigned char *) buf;
+
+  while (n--)
+    {
+      result <<= 8;
+      result |= (where[n] & 255);
+    }
+
+  return result;
+}
+/* Apply a fixup to the object file.  */
+
+void
+md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED,
+             valueT * valP ATTRIBUTE_UNUSED, segT seg ATTRIBUTE_UNUSED)
+{
+  char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
+  long val = *valP;
+  long newval;
+
+  switch (fixP->fx_r_type)
+    {
+    case BFD_RELOC_32:
+      buf[3] = val >> 24;
+      buf[2] = val >> 16;
+      buf[1] = val >> 8;
+      buf[0] = val >> 0;
+      break;
+
+    case BFD_RELOC_16:
+      buf[1] = val >> 8;
+      buf[0] = val >> 0;
+      break;
+
+    case BFD_RELOC_8:
+      *buf = val;
+      break;
+
+    case BFD_RELOC_FT32_10:
+      if (!val)
+       break;
+      newval = md_chars_to_number (buf, 2);
+      newval |= (val & ((1 << 10) - 1)) << FT32_FLD_RIMM_BIT;
+      md_number_to_chars (buf, newval, 2);
+      break;
+
+    case BFD_RELOC_FT32_20:
+      if (!val)
+       break;
+      newval = md_chars_to_number (buf, 3);
+      newval |= val & ((1 << 20) - 1);
+      md_number_to_chars (buf, newval, 3);
+      break;
+
+    case BFD_RELOC_FT32_17:
+      if (!val)
+       break;
+      newval = md_chars_to_number (buf, 3);
+      newval |= val & ((1 << 17) - 1);
+      md_number_to_chars (buf, newval, 3);
+      break;
+
+    case BFD_RELOC_FT32_18:
+      if (!val)
+       break;
+      newval = md_chars_to_number (buf, 4);
+      newval |= (val >> 2) & ((1 << 18) - 1);
+      md_number_to_chars (buf, newval, 4);
+      break;
+
+    default:
+      abort ();
+    }
+
+  if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
+    fixP->fx_done = 1;
+  // printf("fx_addsy=%p fixP->fx_pcrel=%d fx_done=%d\n", fixP->fx_addsy, fixP->fx_pcrel, fixP->fx_done);
+}
+
+void
+md_number_to_chars (char *ptr, valueT use, int nbytes)
+{
+  number_to_chars_littleendian (ptr, use, nbytes);
+}
+
+/* Generate a machine-dependent relocation.  */
+arelent *
+tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
+{
+  arelent *relP;
+  bfd_reloc_code_real_type code;
+
+  switch (fixP->fx_r_type)
+    {
+    case BFD_RELOC_32:
+    case BFD_RELOC_16:
+    case BFD_RELOC_8:
+    case BFD_RELOC_FT32_10:
+    case BFD_RELOC_FT32_20:
+    case BFD_RELOC_FT32_17:
+    case BFD_RELOC_FT32_18:
+      code = fixP->fx_r_type;
+      break;
+    default:
+      as_bad_where (fixP->fx_file, fixP->fx_line,
+                   _("Semantics error.  This type of operand can not be relocated, it must be an assembly-time constant"));
+      return 0;
+    }
+
+  relP = xmalloc (sizeof (arelent));
+  gas_assert (relP != 0);
+  relP->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
+  *relP->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
+  relP->address = fixP->fx_frag->fr_address + fixP->fx_where;
+
+  relP->addend = fixP->fx_offset;
+
+  relP->howto = bfd_reloc_type_lookup (stdoutput, code);
+  if (! relP->howto)
+    {
+      const char *name;
+
+      name = S_GET_NAME (fixP->fx_addsy);
+      if (name == NULL)
+       name = _("<unknown>");
+      as_fatal (_("Cannot generate relocation type for symbol %s, code %s"),
+               name, bfd_get_reloc_code_name (code));
+    }
+
+  return relP;
+}
diff --git a/gas/config/tc-ft32.h b/gas/config/tc-ft32.h
new file mode 100644 (file)
index 0000000..1590865
--- /dev/null
@@ -0,0 +1,55 @@
+/* tc-ft32.h -- Header file for tc-ft32.c.
+
+   Copyright (C) 2013-2015 Free Software Foundation, Inc.
+   Contributed by FTDI (support@ftdichip.com)
+
+   This file is part of GAS, the GNU Assembler.
+
+   GAS 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.
+
+   GAS 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 GAS; see the file COPYING.  If not, write to the Free Software
+   Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#define TC_FT32 1
+#define TARGET_BYTES_BIG_ENDIAN 0
+#define WORKING_DOT_WORD
+
+/* This macro is the BFD architecture to pass to `bfd_set_arch_mach'.  */
+const char *ft32_target_format;
+#define DEFAULT_TARGET_FORMAT  "elf32-ft32"
+#define TARGET_FORMAT          ft32_target_format
+
+#define TARGET_ARCH bfd_arch_ft32
+
+#define md_undefined_symbol(NAME)           0
+
+/* These macros must be defined, but is will be a fatal assembler
+   error if we ever hit them.  */
+#define md_estimate_size_before_relax(A, B) (as_fatal (_("estimate size\n")), 0)
+#define md_convert_frag(B, S, F)            (as_fatal (_("convert_frag\n")))
+
+/* If you define this macro, it should return the offset between the
+   address of a PC relative fixup and the position from which the PC
+   relative adjustment should be made.  On many processors, the base
+   of a PC relative instruction is the next instruction, so this
+   macro would return the length of an instruction.  */
+// #define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from (FIX)
+// extern long md_pcrel_from (struct fix *);
+
+/* PC relative operands are relative to the start of the opcode, and
+   the operand is always one byte into the opcode.  */
+#define md_pcrel_from(FIX)                                             \
+       ((FIX)->fx_where + (FIX)->fx_frag->fr_address - 1)
+
+#define md_section_align(SEGMENT, SIZE)     (SIZE)
+
+#define md_operand(x)
index af9019830ca1bc3d3edbba96922ba8b722e8e3ee..ee072660bf714415982f97143ae8840a6fb63536 100644 (file)
@@ -183,6 +183,8 @@ case ${generic_target} in
   frv-*-*linux*)                       fmt=elf em=linux;;
   frv-*-*)                             fmt=elf ;;
 
+  ft32-*-*)                            fmt=elf ;;
+
   hppa-*-linux*)
     case ${cpu} in
       hppa*64*)                                fmt=elf em=hppalinux64 ;;
index 35140753754b5575533fa09bfc0cf54f13e4eea3..509b72211c116818911c69d2149f61812e8ff588 100644 (file)
@@ -66,6 +66,8 @@ config/tc-fr30.c
 config/tc-fr30.h
 config/tc-frv.c
 config/tc-frv.h
+config/tc-ft32.c
+config/tc-ft32.h
 config/tc-h8300.c
 config/tc-h8300.h
 config/tc-hppa.c
index 1feb27fdaeb01a43a23e900b9cb76d8578e554a3..215cf094523b1d382385bcb0003d067934cce2f1 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * gas/ft32/ft32.exp: New file.
+       * gas/ft32/insn.d: New file.
+       * gas/ft32/insn.s: New file.
+
 2015-01-19  Alan Modra  <amodra@gmail.com>
 
        * gas/all/none.s,
diff --git a/gas/testsuite/gas/ft32/ft32.exp b/gas/testsuite/gas/ft32/ft32.exp
new file mode 100644 (file)
index 0000000..0ab66f3
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright (C) 2012-2015 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.
+
+# FT32 testcases
+
+if [istarget ft32-*-*] {
+    run_dump_test "insn"
+}
diff --git a/gas/testsuite/gas/ft32/insn.d b/gas/testsuite/gas/ft32/insn.d
new file mode 100644 (file)
index 0000000..cdaa140
--- /dev/null
@@ -0,0 +1,490 @@
+#as:
+#objdump: -d
+#name: insn
+
+dump.o:     file format elf32-ft32
+
+
+Disassembly of section .text:
+
+00000000 <pmlabel>:
+   0:  00 00 f0 45     45f00000 add.l \$r31,\$r0,\$r0
+   4:  00 80 0f 44     440f8000 add.l \$r0,\$r31,\$r0
+   8:  f0 01 00 44     440001f0 add.l \$r0,\$r0,\$r31
+   c:  40 00 11 44     44110040 add.l \$r1,\$r2,\$r4
+  10:  00 00 88 44     44880000 add.l \$r8,\$r16,\$r0
+  14:  00 60 f0 45     45f06000 add.l \$r31,\$r0,0 <pmlabel>
+  18:  00 c0 0f 44     440fc000 move.l \$r0,\$r31
+  1c:  10 c0 0f 44     440fc010 add.l \$r0,\$r31,1 <pmlabel\+0x1>
+  20:  f0 df 0f 44     440fdff0 add.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+  24:  10 80 0f 42     420f8010 add.s \$r0,\$r31,\$r1
+  28:  d0 c4 0f 42     420fc4d0 add.s \$r0,\$r31,4d <pmlabel\+0x4d>
+  2c:  10 80 0f 40     400f8010 add.b \$r0,\$r31,\$r1
+  30:  d0 c4 0f 40     400fc4d0 add.b \$r0,\$r31,4d <pmlabel\+0x4d>
+  34:  02 00 f0 45     45f00002 sub.l \$r31,\$r0,\$r0
+  38:  02 80 0f 44     440f8002 sub.l \$r0,\$r31,\$r0
+  3c:  f2 01 00 44     440001f2 sub.l \$r0,\$r0,\$r31
+  40:  42 00 11 44     44110042 sub.l \$r1,\$r2,\$r4
+  44:  02 00 88 44     44880002 sub.l \$r8,\$r16,\$r0
+  48:  02 60 f0 45     45f06002 sub.l \$r31,\$r0,0 <pmlabel>
+  4c:  02 c0 0f 44     440fc002 sub.l \$r0,\$r31,0 <pmlabel>
+  50:  12 c0 0f 44     440fc012 sub.l \$r0,\$r31,1 <pmlabel\+0x1>
+  54:  f2 df 0f 44     440fdff2 sub.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+  58:  12 80 0f 42     420f8012 sub.s \$r0,\$r31,\$r1
+  5c:  d2 c4 0f 42     420fc4d2 sub.s \$r0,\$r31,4d <pmlabel\+0x4d>
+  60:  12 80 0f 40     400f8012 sub.b \$r0,\$r31,\$r1
+  64:  d2 c4 0f 40     400fc4d2 sub.b \$r0,\$r31,4d <pmlabel\+0x4d>
+  68:  04 00 f0 45     45f00004 and.l \$r31,\$r0,\$r0
+  6c:  04 80 0f 44     440f8004 and.l \$r0,\$r31,\$r0
+  70:  f4 01 00 44     440001f4 and.l \$r0,\$r0,\$r31
+  74:  44 00 11 44     44110044 and.l \$r1,\$r2,\$r4
+  78:  04 00 88 44     44880004 and.l \$r8,\$r16,\$r0
+  7c:  04 60 f0 45     45f06004 and.l \$r31,\$r0,0 <pmlabel>
+  80:  04 c0 0f 44     440fc004 and.l \$r0,\$r31,0 <pmlabel>
+  84:  14 c0 0f 44     440fc014 and.l \$r0,\$r31,1 <pmlabel\+0x1>
+  88:  f4 df 0f 44     440fdff4 and.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+  8c:  14 80 0f 42     420f8014 and.s \$r0,\$r31,\$r1
+  90:  d4 c4 0f 42     420fc4d4 and.s \$r0,\$r31,4d <pmlabel\+0x4d>
+  94:  14 80 0f 40     400f8014 and.b \$r0,\$r31,\$r1
+  98:  d4 c4 0f 40     400fc4d4 and.b \$r0,\$r31,4d <pmlabel\+0x4d>
+  9c:  05 00 f0 45     45f00005 or.l \$r31,\$r0,\$r0
+  a0:  05 80 0f 44     440f8005 or.l \$r0,\$r31,\$r0
+  a4:  f5 01 00 44     440001f5 or.l \$r0,\$r0,\$r31
+  a8:  45 00 11 44     44110045 or.l \$r1,\$r2,\$r4
+  ac:  05 00 88 44     44880005 or.l \$r8,\$r16,\$r0
+  b0:  05 60 f0 45     45f06005 or.l \$r31,\$r0,0 <pmlabel>
+  b4:  05 c0 0f 44     440fc005 or.l \$r0,\$r31,0 <pmlabel>
+  b8:  15 c0 0f 44     440fc015 or.l \$r0,\$r31,1 <pmlabel\+0x1>
+  bc:  f5 df 0f 44     440fdff5 or.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+  c0:  15 80 0f 42     420f8015 or.s \$r0,\$r31,\$r1
+  c4:  d5 c4 0f 42     420fc4d5 or.s \$r0,\$r31,4d <pmlabel\+0x4d>
+  c8:  15 80 0f 40     400f8015 or.b \$r0,\$r31,\$r1
+  cc:  d5 c4 0f 40     400fc4d5 or.b \$r0,\$r31,4d <pmlabel\+0x4d>
+  d0:  06 00 f0 45     45f00006 xor.l \$r31,\$r0,\$r0
+  d4:  06 80 0f 44     440f8006 xor.l \$r0,\$r31,\$r0
+  d8:  f6 01 00 44     440001f6 xor.l \$r0,\$r0,\$r31
+  dc:  46 00 11 44     44110046 xor.l \$r1,\$r2,\$r4
+  e0:  06 00 88 44     44880006 xor.l \$r8,\$r16,\$r0
+  e4:  06 60 f0 45     45f06006 xor.l \$r31,\$r0,0 <pmlabel>
+  e8:  06 c0 0f 44     440fc006 xor.l \$r0,\$r31,0 <pmlabel>
+  ec:  16 c0 0f 44     440fc016 xor.l \$r0,\$r31,1 <pmlabel\+0x1>
+  f0:  f6 df 0f 44     440fdff6 xor.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+  f4:  16 80 0f 42     420f8016 xor.s \$r0,\$r31,\$r1
+  f8:  d6 c4 0f 42     420fc4d6 xor.s \$r0,\$r31,4d <pmlabel\+0x4d>
+  fc:  16 80 0f 40     400f8016 xor.b \$r0,\$r31,\$r1
+ 100:  d6 c4 0f 40     400fc4d6 xor.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 104:  07 00 f0 45     45f00007 xnor.l \$r31,\$r0,\$r0
+ 108:  07 80 0f 44     440f8007 xnor.l \$r0,\$r31,\$r0
+ 10c:  f7 01 00 44     440001f7 xnor.l \$r0,\$r0,\$r31
+ 110:  47 00 11 44     44110047 xnor.l \$r1,\$r2,\$r4
+ 114:  07 00 88 44     44880007 xnor.l \$r8,\$r16,\$r0
+ 118:  07 60 f0 45     45f06007 xnor.l \$r31,\$r0,0 <pmlabel>
+ 11c:  07 c0 0f 44     440fc007 xnor.l \$r0,\$r31,0 <pmlabel>
+ 120:  17 c0 0f 44     440fc017 xnor.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 124:  f7 df 0f 44     440fdff7 xnor.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 128:  17 80 0f 42     420f8017 xnor.s \$r0,\$r31,\$r1
+ 12c:  d7 c4 0f 42     420fc4d7 xnor.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 130:  17 80 0f 40     400f8017 xnor.b \$r0,\$r31,\$r1
+ 134:  d7 c4 0f 40     400fc4d7 xnor.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 138:  08 00 f0 45     45f00008 ashl.l \$r31,\$r0,\$r0
+ 13c:  08 80 0f 44     440f8008 ashl.l \$r0,\$r31,\$r0
+ 140:  f8 01 00 44     440001f8 ashl.l \$r0,\$r0,\$r31
+ 144:  48 00 11 44     44110048 ashl.l \$r1,\$r2,\$r4
+ 148:  08 00 88 44     44880008 ashl.l \$r8,\$r16,\$r0
+ 14c:  08 60 f0 45     45f06008 ashl.l \$r31,\$r0,0 <pmlabel>
+ 150:  08 c0 0f 44     440fc008 ashl.l \$r0,\$r31,0 <pmlabel>
+ 154:  18 c0 0f 44     440fc018 ashl.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 158:  f8 df 0f 44     440fdff8 ashl.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 15c:  18 80 0f 42     420f8018 ashl.s \$r0,\$r31,\$r1
+ 160:  d8 c4 0f 42     420fc4d8 ashl.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 164:  18 80 0f 40     400f8018 ashl.b \$r0,\$r31,\$r1
+ 168:  d8 c4 0f 40     400fc4d8 ashl.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 16c:  09 00 f0 45     45f00009 lshr.l \$r31,\$r0,\$r0
+ 170:  09 80 0f 44     440f8009 lshr.l \$r0,\$r31,\$r0
+ 174:  f9 01 00 44     440001f9 lshr.l \$r0,\$r0,\$r31
+ 178:  49 00 11 44     44110049 lshr.l \$r1,\$r2,\$r4
+ 17c:  09 00 88 44     44880009 lshr.l \$r8,\$r16,\$r0
+ 180:  09 60 f0 45     45f06009 lshr.l \$r31,\$r0,0 <pmlabel>
+ 184:  09 c0 0f 44     440fc009 lshr.l \$r0,\$r31,0 <pmlabel>
+ 188:  19 c0 0f 44     440fc019 lshr.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 18c:  f9 df 0f 44     440fdff9 lshr.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 190:  19 80 0f 42     420f8019 lshr.s \$r0,\$r31,\$r1
+ 194:  d9 c4 0f 42     420fc4d9 lshr.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 198:  19 80 0f 40     400f8019 lshr.b \$r0,\$r31,\$r1
+ 19c:  d9 c4 0f 40     400fc4d9 lshr.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 1a0:  0a 00 f0 45     45f0000a ashr.l \$r31,\$r0,\$r0
+ 1a4:  0a 80 0f 44     440f800a ashr.l \$r0,\$r31,\$r0
+ 1a8:  fa 01 00 44     440001fa ashr.l \$r0,\$r0,\$r31
+ 1ac:  4a 00 11 44     4411004a ashr.l \$r1,\$r2,\$r4
+ 1b0:  0a 00 88 44     4488000a ashr.l \$r8,\$r16,\$r0
+ 1b4:  0a 60 f0 45     45f0600a ashr.l \$r31,\$r0,0 <pmlabel>
+ 1b8:  0a c0 0f 44     440fc00a ashr.l \$r0,\$r31,0 <pmlabel>
+ 1bc:  1a c0 0f 44     440fc01a ashr.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 1c0:  fa df 0f 44     440fdffa ashr.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 1c4:  1a 80 0f 42     420f801a ashr.s \$r0,\$r31,\$r1
+ 1c8:  da c4 0f 42     420fc4da ashr.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 1cc:  1a 80 0f 40     400f801a ashr.b \$r0,\$r31,\$r1
+ 1d0:  da c4 0f 40     400fc4da ashr.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 1d4:  01 00 f0 45     45f00001 ror.l \$r31,\$r0,\$r0
+ 1d8:  01 80 0f 44     440f8001 ror.l \$r0,\$r31,\$r0
+ 1dc:  f1 01 00 44     440001f1 ror.l \$r0,\$r0,\$r31
+ 1e0:  41 00 11 44     44110041 ror.l \$r1,\$r2,\$r4
+ 1e4:  01 00 88 44     44880001 ror.l \$r8,\$r16,\$r0
+ 1e8:  01 60 f0 45     45f06001 ror.l \$r31,\$r0,0 <pmlabel>
+ 1ec:  01 c0 0f 44     440fc001 ror.l \$r0,\$r31,0 <pmlabel>
+ 1f0:  11 c0 0f 44     440fc011 ror.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 1f4:  f1 df 0f 44     440fdff1 ror.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 1f8:  11 80 0f 42     420f8011 ror.s \$r0,\$r31,\$r1
+ 1fc:  d1 c4 0f 42     420fc4d1 ror.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 200:  11 80 0f 40     400f8011 ror.b \$r0,\$r31,\$r1
+ 204:  d1 c4 0f 40     400fc4d1 ror.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 208:  03 00 f0 45     45f00003 ldl.l \$r31,\$r0,\$r0
+ 20c:  03 80 0f 44     440f8003 ldl.l \$r0,\$r31,\$r0
+ 210:  f3 01 00 44     440001f3 ldl.l \$r0,\$r0,\$r31
+ 214:  43 00 11 44     44110043 ldl.l \$r1,\$r2,\$r4
+ 218:  03 00 88 44     44880003 ldl.l \$r8,\$r16,\$r0
+ 21c:  03 60 f0 45     45f06003 ldl.l \$r31,\$r0,0 <pmlabel>
+ 220:  03 c0 0f 44     440fc003 ldl.l \$r0,\$r31,0 <pmlabel>
+ 224:  13 c0 0f 44     440fc013 ldl.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 228:  f3 df 0f 44     440fdff3 ldl.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 22c:  13 80 0f 42     420f8013 ldl.s \$r0,\$r31,\$r1
+ 230:  d3 c4 0f 42     420fc4d3 ldl.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 234:  13 80 0f 40     400f8013 ldl.b \$r0,\$r31,\$r1
+ 238:  d3 c4 0f 40     400fc4d3 ldl.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 23c:  0b 00 f0 45     45f0000b bins.l \$r31,\$r0,\$r0
+ 240:  0b 80 0f 44     440f800b bins.l \$r0,\$r31,\$r0
+ 244:  fb 01 00 44     440001fb bins.l \$r0,\$r0,\$r31
+ 248:  4b 00 11 44     4411004b bins.l \$r1,\$r2,\$r4
+ 24c:  0b 00 88 44     4488000b bins.l \$r8,\$r16,\$r0
+ 250:  0b 60 f0 45     45f0600b bins.l \$r31,\$r0,0 <pmlabel>
+ 254:  0b c0 0f 44     440fc00b bins.l \$r0,\$r31,0 <pmlabel>
+ 258:  1b c0 0f 44     440fc01b bins.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 25c:  fb df 0f 44     440fdffb bins.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 260:  1b 80 0f 42     420f801b bins.s \$r0,\$r31,\$r1
+ 264:  db c4 0f 42     420fc4db bins.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 268:  1b 80 0f 40     400f801b bins.b \$r0,\$r31,\$r1
+ 26c:  db c4 0f 40     400fc4db bins.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 270:  0c 00 f0 45     45f0000c bexts.l \$r31,\$r0,\$r0
+ 274:  0c 80 0f 44     440f800c bexts.l \$r0,\$r31,\$r0
+ 278:  fc 01 00 44     440001fc bexts.l \$r0,\$r0,\$r31
+ 27c:  4c 00 11 44     4411004c bexts.l \$r1,\$r2,\$r4
+ 280:  0c 00 88 44     4488000c bexts.l \$r8,\$r16,\$r0
+ 284:  0c 60 f0 45     45f0600c bexts.l \$r31,\$r0,0 <pmlabel>
+ 288:  0c c0 0f 44     440fc00c bexts.l \$r0,\$r31,0 <pmlabel>
+ 28c:  1c c0 0f 44     440fc01c bexts.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 290:  fc df 0f 44     440fdffc bexts.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 294:  1c 80 0f 42     420f801c bexts.s \$r0,\$r31,\$r1
+ 298:  dc c4 0f 42     420fc4dc bexts.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 29c:  1c 80 0f 40     400f801c bexts.b \$r0,\$r31,\$r1
+ 2a0:  dc c4 0f 40     400fc4dc bexts.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 2a4:  0d 00 f0 45     45f0000d bextu.l \$r31,\$r0,\$r0
+ 2a8:  0d 80 0f 44     440f800d bextu.l \$r0,\$r31,\$r0
+ 2ac:  fd 01 00 44     440001fd bextu.l \$r0,\$r0,\$r31
+ 2b0:  4d 00 11 44     4411004d bextu.l \$r1,\$r2,\$r4
+ 2b4:  0d 00 88 44     4488000d bextu.l \$r8,\$r16,\$r0
+ 2b8:  0d 60 f0 45     45f0600d bextu.l \$r31,\$r0,0 <pmlabel>
+ 2bc:  0d c0 0f 44     440fc00d bextu.l \$r0,\$r31,0 <pmlabel>
+ 2c0:  1d c0 0f 44     440fc01d bextu.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 2c4:  fd df 0f 44     440fdffd bextu.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 2c8:  1d 80 0f 42     420f801d bextu.s \$r0,\$r31,\$r1
+ 2cc:  dd c4 0f 42     420fc4dd bextu.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 2d0:  1d 80 0f 40     400f801d bextu.b \$r0,\$r31,\$r1
+ 2d4:  dd c4 0f 40     400fc4dd bextu.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 2d8:  0e 00 f0 45     45f0000e flip.l \$r31,\$r0,\$r0
+ 2dc:  0e 80 0f 44     440f800e flip.l \$r0,\$r31,\$r0
+ 2e0:  fe 01 00 44     440001fe flip.l \$r0,\$r0,\$r31
+ 2e4:  4e 00 11 44     4411004e flip.l \$r1,\$r2,\$r4
+ 2e8:  0e 00 88 44     4488000e flip.l \$r8,\$r16,\$r0
+ 2ec:  0e 60 f0 45     45f0600e flip.l \$r31,\$r0,0 <pmlabel>
+ 2f0:  0e c0 0f 44     440fc00e flip.l \$r0,\$r31,0 <pmlabel>
+ 2f4:  1e c0 0f 44     440fc01e flip.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 2f8:  fe df 0f 44     440fdffe flip.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 2fc:  1e 80 0f 42     420f801e flip.s \$r0,\$r31,\$r1
+ 300:  de c4 0f 42     420fc4de flip.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 304:  1e 80 0f 40     400f801e flip.b \$r0,\$r31,\$r1
+ 308:  de c4 0f 40     400fc4de flip.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 30c:  00 00 e0 5d     5de00000 addcc.l \$r0,\$r0
+ 310:  00 80 ef 5d     5def8000 addcc.l \$r31,\$r0
+ 314:  f0 01 e0 5d     5de001f0 addcc.l \$r0,\$r31
+ 318:  00 60 e0 5d     5de06000 addcc.l \$r0,0 <pmlabel>
+ 31c:  00 c0 ef 5d     5defc000 addcc.l \$r31,0 <pmlabel>
+ 320:  10 c0 ef 5d     5defc010 addcc.l \$r31,1 <pmlabel\+0x1>
+ 324:  f0 df ef 5d     5defdff0 addcc.l \$r31,1ff <pmlabel\+0x1ff>
+ 328:  10 80 ef 5b     5bef8010 addcc.s \$r31,\$r1
+ 32c:  d0 c4 ef 5b     5befc4d0 addcc.s \$r31,4d <pmlabel\+0x4d>
+ 330:  10 80 ef 59     59ef8010 addcc.b \$r31,\$r1
+ 334:  d0 c4 ef 59     59efc4d0 addcc.b \$r31,4d <pmlabel\+0x4d>
+ 338:  02 00 e0 5d     5de00002 cmp.l \$r0,\$r0
+ 33c:  02 80 ef 5d     5def8002 cmp.l \$r31,\$r0
+ 340:  f2 01 e0 5d     5de001f2 cmp.l \$r0,\$r31
+ 344:  02 60 e0 5d     5de06002 cmp.l \$r0,0 <pmlabel>
+ 348:  02 c0 ef 5d     5defc002 cmp.l \$r31,0 <pmlabel>
+ 34c:  12 c0 ef 5d     5defc012 cmp.l \$r31,1 <pmlabel\+0x1>
+ 350:  f2 df ef 5d     5defdff2 cmp.l \$r31,1ff <pmlabel\+0x1ff>
+ 354:  12 80 ef 5b     5bef8012 cmp.s \$r31,\$r1
+ 358:  d2 c4 ef 5b     5befc4d2 cmp.s \$r31,4d <pmlabel\+0x4d>
+ 35c:  12 80 ef 59     59ef8012 cmp.b \$r31,\$r1
+ 360:  d2 c4 ef 59     59efc4d2 cmp.b \$r31,4d <pmlabel\+0x4d>
+ 364:  04 00 e0 5d     5de00004 tst.l \$r0,\$r0
+ 368:  04 80 ef 5d     5def8004 tst.l \$r31,\$r0
+ 36c:  f4 01 e0 5d     5de001f4 tst.l \$r0,\$r31
+ 370:  04 60 e0 5d     5de06004 tst.l \$r0,0 <pmlabel>
+ 374:  04 c0 ef 5d     5defc004 tst.l \$r31,0 <pmlabel>
+ 378:  14 c0 ef 5d     5defc014 tst.l \$r31,1 <pmlabel\+0x1>
+ 37c:  f4 df ef 5d     5defdff4 tst.l \$r31,1ff <pmlabel\+0x1ff>
+ 380:  14 80 ef 5b     5bef8014 tst.s \$r31,\$r1
+ 384:  d4 c4 ef 5b     5befc4d4 tst.s \$r31,4d <pmlabel\+0x4d>
+ 388:  14 80 ef 59     59ef8014 tst.b \$r31,\$r1
+ 38c:  d4 c4 ef 59     59efc4d4 tst.b \$r31,4d <pmlabel\+0x4d>
+ 390:  0c 00 e0 5d     5de0000c btst.l \$r0,\$r0
+ 394:  0c 80 ef 5d     5def800c btst.l \$r31,\$r0
+ 398:  fc 01 e0 5d     5de001fc btst.l \$r0,\$r31
+ 39c:  0c 60 e0 5d     5de0600c btst.l \$r0,0 <pmlabel>
+ 3a0:  0c c0 ef 5d     5defc00c btst.l \$r31,0 <pmlabel>
+ 3a4:  1c c0 ef 5d     5defc01c btst.l \$r31,1 <pmlabel\+0x1>
+ 3a8:  fc df ef 5d     5defdffc btst.l \$r31,1ff <pmlabel\+0x1ff>
+ 3ac:  1c 80 ef 5b     5bef801c btst.s \$r31,\$r1
+ 3b0:  dc c4 ef 5b     5befc4dc btst.s \$r31,4d <pmlabel\+0x4d>
+ 3b4:  1c 80 ef 59     59ef801c btst.b \$r31,\$r1
+ 3b8:  dc c4 ef 59     59efc4dc btst.b \$r31,4d <pmlabel\+0x4d>
+ 3bc:  80 80 0f ac     ac0f8080 ldi.l \$r0,\$r31,80 <pmlabel\+0x80>
+ 3c0:  7f 00 f0 ad     adf0007f ldi.l \$r31,\$r0,7f <pmlabel\+0x7f>
+ 3c4:  80 80 0f aa     aa0f8080 ldi.s \$r0,\$r31,80 <pmlabel\+0x80>
+ 3c8:  7f 80 0f aa     aa0f807f ldi.s \$r0,\$r31,7f <pmlabel\+0x7f>
+ 3cc:  80 00 f0 a9     a9f00080 ldi.b \$r31,\$r0,80 <pmlabel\+0x80>
+ 3d0:  7f 00 f0 a9     a9f0007f ldi.b \$r31,\$r0,7f <pmlabel\+0x7f>
+ 3d4:  80 00 f0 b5     b5f00080 sti.l \$r31,80 <pmlabel\+0x80>,\$r0
+ 3d8:  7f 80 0f b4     b40f807f sti.l \$r0,7f <pmlabel\+0x7f>,\$r31
+ 3dc:  80 00 f0 b3     b3f00080 sti.s \$r31,80 <pmlabel\+0x80>,\$r0
+ 3e0:  7f 00 f0 b3     b3f0007f sti.s \$r31,7f <pmlabel\+0x7f>,\$r0
+ 3e4:  80 80 0f b0     b00f8080 sti.b \$r0,80 <pmlabel\+0x80>,\$r31
+ 3e8:  7f 80 0f b0     b00f807f sti.b \$r0,7f <pmlabel\+0x7f>,\$r31
+ 3ec:  80 80 0f ec     ec0f8080 exi.l \$r0,\$r31,80 <pmlabel\+0x80>
+ 3f0:  7f 00 f0 ed     edf0007f exi.l \$r31,\$r0,7f <pmlabel\+0x7f>
+ 3f4:  80 80 0f ea     ea0f8080 exi.s \$r0,\$r31,80 <pmlabel\+0x80>
+ 3f8:  7f 80 0f ea     ea0f807f exi.s \$r0,\$r31,7f <pmlabel\+0x7f>
+ 3fc:  80 00 f0 e9     e9f00080 exi.b \$r31,\$r0,80 <pmlabel\+0x80>
+ 400:  7f 00 f0 e9     e9f0007f exi.b \$r31,\$r0,7f <pmlabel\+0x7f>
+ 404:  00 00 00 6c     6c000000 lpm.l \$r0,0 <pmlabel>
+ 408:  00 00 00 6b     6b000000 lpm.s \$r16,0 <pmlabel>
+ 40c:  00 00 f0 69     69f00000 lpm.b \$r31,0 <pmlabel>
+ 410:  80 80 00 cc     cc008080 lpmi.l \$r0,\$r1,80 <pmlabel\+0x80>
+ 414:  7f 80 00 cb     cb00807f lpmi.s \$r16,\$r1,7f <pmlabel\+0x7f>
+ 418:  80 80 f0 c9     c9f08080 lpmi.b \$r31,\$r1,80 <pmlabel\+0x80>
+ 41c:  00 00 30 00     00300000 jmp 0 <pmlabel>
+ 420:  00 01 30 08     08300100 jmpi \$r16
+ 424:  00 00 c8 07     07c80000 jmpx 31,\$r28,1,0 <pmlabel>
+ 428:  00 00 20 00     00200000 jmpc nz,0 <pmlabel>
+ 42c:  00 00 34 00     00340000 call 0 <pmlabel>
+ 430:  00 01 34 08     08340100 calli \$r16
+ 434:  00 00 cc 07     07cc0000 callx 31,\$r28,1,0 <pmlabel>
+ 438:  00 00 24 00     00240000 callc nz,0 <pmlabel>
+ 43c:  00 00 00 84     84000000 push.l \$r0
+ 440:  00 00 08 84     84080000 push.l \$r16
+ 444:  00 80 0f 84     840f8000 push.l \$r31
+ 448:  00 00 00 8c     8c000000 pop.l \$r0
+ 44c:  00 00 00 8d     8d000000 pop.l \$r16
+ 450:  00 00 f0 8d     8df00000 pop.l \$r31
+ 454:  00 00 00 94     94000000 link \$r0,0 <pmlabel>
+ 458:  ff ff 00 95     9500ffff link \$r16,ffff <pmlabel\+0xffff>
+ 45c:  f9 03 f0 95     95f003f9 link \$r31,3f9 <pmlabel\+0x3f9>
+ 460:  00 00 00 98     98000000 unlink \$r0
+ 464:  00 00 00 99     99000000 unlink \$r16
+ 468:  00 00 f0 99     99f00000 unlink \$r31
+ 46c:  00 00 00 a0     a0000000 return 
+ 470:  00 00 00 a4     a4000000 reti 
+ 474:  00 00 00 c4     c4000000 lda.l \$r0,0 <pmlabel>
+ 478:  00 00 00 c3     c3000000 lda.s \$r16,0 <pmlabel>
+ 47c:  00 00 f0 c1     c1f00000 lda.b \$r31,0 <pmlabel>
+ 480:  00 00 00 bc     bc000000 sta.l 0 <pmlabel>,\$r0
+ 484:  00 00 00 bb     bb000000 sta.s 0 <pmlabel>,\$r16
+ 488:  00 00 f0 b9     b9f00000 sta.b 0 <pmlabel>,\$r31
+ 48c:  00 00 00 3c     3c000000 exa.l \$r0,0 <pmlabel>
+ 490:  00 00 00 3b     3b000000 exa.s \$r16,0 <pmlabel>
+ 494:  00 00 f0 39     39f00000 exa.b \$r31,0 <pmlabel>
+ 498:  00 00 08 64     64080000 ldk.l \$r0,80000 <pmlabel\+0x80000>
+ 49c:  ff ff 07 64     6407ffff ldk.l \$r0,7ffff <pmlabel\+0x7ffff>
+ 4a0:  00 00 00 64     64000000 ldk.l \$r0,0 <pmlabel>
+ 4a4:  00 c0 0f 44     440fc000 move.l \$r0,\$r31
+ 4a8:  00 40 f0 45     45f04000 move.l \$r31,\$r0
+ 4ac:  00 00 f0 f5     f5f00000 udiv.l \$r31,\$r0,\$r0
+ 4b0:  00 80 0f f4     f40f8000 udiv.l \$r0,\$r31,\$r0
+ 4b4:  f0 01 00 f4     f40001f0 udiv.l \$r0,\$r0,\$r31
+ 4b8:  40 00 11 f4     f4110040 udiv.l \$r1,\$r2,\$r4
+ 4bc:  00 00 88 f4     f4880000 udiv.l \$r8,\$r16,\$r0
+ 4c0:  00 60 f0 f5     f5f06000 udiv.l \$r31,\$r0,0 <pmlabel>
+ 4c4:  00 c0 0f f4     f40fc000 udiv.l \$r0,\$r31,0 <pmlabel>
+ 4c8:  10 c0 0f f4     f40fc010 udiv.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 4cc:  f0 df 0f f4     f40fdff0 udiv.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 4d0:  10 80 0f f2     f20f8010 udiv.s \$r0,\$r31,\$r1
+ 4d4:  d0 c4 0f f2     f20fc4d0 udiv.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 4d8:  10 80 0f f0     f00f8010 udiv.b \$r0,\$r31,\$r1
+ 4dc:  d0 c4 0f f0     f00fc4d0 udiv.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 4e0:  01 00 f0 f5     f5f00001 umod.l \$r31,\$r0,\$r0
+ 4e4:  01 80 0f f4     f40f8001 umod.l \$r0,\$r31,\$r0
+ 4e8:  f1 01 00 f4     f40001f1 umod.l \$r0,\$r0,\$r31
+ 4ec:  41 00 11 f4     f4110041 umod.l \$r1,\$r2,\$r4
+ 4f0:  01 00 88 f4     f4880001 umod.l \$r8,\$r16,\$r0
+ 4f4:  01 60 f0 f5     f5f06001 umod.l \$r31,\$r0,0 <pmlabel>
+ 4f8:  01 c0 0f f4     f40fc001 umod.l \$r0,\$r31,0 <pmlabel>
+ 4fc:  11 c0 0f f4     f40fc011 umod.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 500:  f1 df 0f f4     f40fdff1 umod.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 504:  11 80 0f f2     f20f8011 umod.s \$r0,\$r31,\$r1
+ 508:  d1 c4 0f f2     f20fc4d1 umod.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 50c:  11 80 0f f0     f00f8011 umod.b \$r0,\$r31,\$r1
+ 510:  d1 c4 0f f0     f00fc4d1 umod.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 514:  02 00 f0 f5     f5f00002 div.l \$r31,\$r0,\$r0
+ 518:  02 80 0f f4     f40f8002 div.l \$r0,\$r31,\$r0
+ 51c:  f2 01 00 f4     f40001f2 div.l \$r0,\$r0,\$r31
+ 520:  42 00 11 f4     f4110042 div.l \$r1,\$r2,\$r4
+ 524:  02 00 88 f4     f4880002 div.l \$r8,\$r16,\$r0
+ 528:  02 60 f0 f5     f5f06002 div.l \$r31,\$r0,0 <pmlabel>
+ 52c:  02 c0 0f f4     f40fc002 div.l \$r0,\$r31,0 <pmlabel>
+ 530:  12 c0 0f f4     f40fc012 div.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 534:  f2 df 0f f4     f40fdff2 div.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 538:  12 80 0f f2     f20f8012 div.s \$r0,\$r31,\$r1
+ 53c:  d2 c4 0f f2     f20fc4d2 div.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 540:  12 80 0f f0     f00f8012 div.b \$r0,\$r31,\$r1
+ 544:  d2 c4 0f f0     f00fc4d2 div.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 548:  03 00 f0 f5     f5f00003 mod.l \$r31,\$r0,\$r0
+ 54c:  03 80 0f f4     f40f8003 mod.l \$r0,\$r31,\$r0
+ 550:  f3 01 00 f4     f40001f3 mod.l \$r0,\$r0,\$r31
+ 554:  43 00 11 f4     f4110043 mod.l \$r1,\$r2,\$r4
+ 558:  03 00 88 f4     f4880003 mod.l \$r8,\$r16,\$r0
+ 55c:  03 60 f0 f5     f5f06003 mod.l \$r31,\$r0,0 <pmlabel>
+ 560:  03 c0 0f f4     f40fc003 mod.l \$r0,\$r31,0 <pmlabel>
+ 564:  13 c0 0f f4     f40fc013 mod.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 568:  f3 df 0f f4     f40fdff3 mod.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 56c:  13 80 0f f2     f20f8013 mod.s \$r0,\$r31,\$r1
+ 570:  d3 c4 0f f2     f20fc4d3 mod.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 574:  13 80 0f f0     f00f8013 mod.b \$r0,\$r31,\$r1
+ 578:  d3 c4 0f f0     f00fc4d3 mod.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 57c:  04 00 f0 f5     f5f00004 strcmp.l \$r31,\$r0,\$r0
+ 580:  04 80 0f f4     f40f8004 strcmp.l \$r0,\$r31,\$r0
+ 584:  f4 01 00 f4     f40001f4 strcmp.l \$r0,\$r0,\$r31
+ 588:  44 00 11 f4     f4110044 strcmp.l \$r1,\$r2,\$r4
+ 58c:  04 00 88 f4     f4880004 strcmp.l \$r8,\$r16,\$r0
+ 590:  04 60 f0 f5     f5f06004 strcmp.l \$r31,\$r0,0 <pmlabel>
+ 594:  04 c0 0f f4     f40fc004 strcmp.l \$r0,\$r31,0 <pmlabel>
+ 598:  14 c0 0f f4     f40fc014 strcmp.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 59c:  f4 df 0f f4     f40fdff4 strcmp.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 5a0:  14 80 0f f2     f20f8014 strcmp.s \$r0,\$r31,\$r1
+ 5a4:  d4 c4 0f f2     f20fc4d4 strcmp.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 5a8:  14 80 0f f0     f00f8014 strcmp.b \$r0,\$r31,\$r1
+ 5ac:  d4 c4 0f f0     f00fc4d4 strcmp.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 5b0:  05 00 f0 f5     f5f00005 memcpy.l \$r31,\$r0,\$r0
+ 5b4:  05 80 0f f4     f40f8005 memcpy.l \$r0,\$r31,\$r0
+ 5b8:  f5 01 00 f4     f40001f5 memcpy.l \$r0,\$r0,\$r31
+ 5bc:  45 00 11 f4     f4110045 memcpy.l \$r1,\$r2,\$r4
+ 5c0:  05 00 88 f4     f4880005 memcpy.l \$r8,\$r16,\$r0
+ 5c4:  05 60 f0 f5     f5f06005 memcpy.l \$r31,\$r0,0 <pmlabel>
+ 5c8:  05 c0 0f f4     f40fc005 memcpy.l \$r0,\$r31,0 <pmlabel>
+ 5cc:  15 c0 0f f4     f40fc015 memcpy.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 5d0:  f5 df 0f f4     f40fdff5 memcpy.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 5d4:  15 80 0f f2     f20f8015 memcpy.s \$r0,\$r31,\$r1
+ 5d8:  d5 c4 0f f2     f20fc4d5 memcpy.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 5dc:  15 80 0f f0     f00f8015 memcpy.b \$r0,\$r31,\$r1
+ 5e0:  d5 c4 0f f0     f00fc4d5 memcpy.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 5e4:  07 00 f0 f5     f5f00007 memset.l \$r31,\$r0,\$r0
+ 5e8:  07 80 0f f4     f40f8007 memset.l \$r0,\$r31,\$r0
+ 5ec:  f7 01 00 f4     f40001f7 memset.l \$r0,\$r0,\$r31
+ 5f0:  47 00 11 f4     f4110047 memset.l \$r1,\$r2,\$r4
+ 5f4:  07 00 88 f4     f4880007 memset.l \$r8,\$r16,\$r0
+ 5f8:  07 60 f0 f5     f5f06007 memset.l \$r31,\$r0,0 <pmlabel>
+ 5fc:  07 c0 0f f4     f40fc007 memset.l \$r0,\$r31,0 <pmlabel>
+ 600:  17 c0 0f f4     f40fc017 memset.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 604:  f7 df 0f f4     f40fdff7 memset.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 608:  17 80 0f f2     f20f8017 memset.s \$r0,\$r31,\$r1
+ 60c:  d7 c4 0f f2     f20fc4d7 memset.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 610:  17 80 0f f0     f00f8017 memset.b \$r0,\$r31,\$r1
+ 614:  d7 c4 0f f0     f00fc4d7 memset.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 618:  08 00 f0 f5     f5f00008 mul.l \$r31,\$r0,\$r0
+ 61c:  08 80 0f f4     f40f8008 mul.l \$r0,\$r31,\$r0
+ 620:  f8 01 00 f4     f40001f8 mul.l \$r0,\$r0,\$r31
+ 624:  48 00 11 f4     f4110048 mul.l \$r1,\$r2,\$r4
+ 628:  08 00 88 f4     f4880008 mul.l \$r8,\$r16,\$r0
+ 62c:  08 60 f0 f5     f5f06008 mul.l \$r31,\$r0,0 <pmlabel>
+ 630:  08 c0 0f f4     f40fc008 mul.l \$r0,\$r31,0 <pmlabel>
+ 634:  18 c0 0f f4     f40fc018 mul.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 638:  f8 df 0f f4     f40fdff8 mul.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 63c:  18 80 0f f2     f20f8018 mul.s \$r0,\$r31,\$r1
+ 640:  d8 c4 0f f2     f20fc4d8 mul.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 644:  18 80 0f f0     f00f8018 mul.b \$r0,\$r31,\$r1
+ 648:  d8 c4 0f f0     f00fc4d8 mul.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 64c:  09 00 f0 f5     f5f00009 muluh.l \$r31,\$r0,\$r0
+ 650:  09 80 0f f4     f40f8009 muluh.l \$r0,\$r31,\$r0
+ 654:  f9 01 00 f4     f40001f9 muluh.l \$r0,\$r0,\$r31
+ 658:  49 00 11 f4     f4110049 muluh.l \$r1,\$r2,\$r4
+ 65c:  09 00 88 f4     f4880009 muluh.l \$r8,\$r16,\$r0
+ 660:  09 60 f0 f5     f5f06009 muluh.l \$r31,\$r0,0 <pmlabel>
+ 664:  09 c0 0f f4     f40fc009 muluh.l \$r0,\$r31,0 <pmlabel>
+ 668:  19 c0 0f f4     f40fc019 muluh.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 66c:  f9 df 0f f4     f40fdff9 muluh.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 670:  19 80 0f f2     f20f8019 muluh.s \$r0,\$r31,\$r1
+ 674:  d9 c4 0f f2     f20fc4d9 muluh.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 678:  19 80 0f f0     f00f8019 muluh.b \$r0,\$r31,\$r1
+ 67c:  d9 c4 0f f0     f00fc4d9 muluh.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 680:  0c 00 f0 f5     f5f0000c streamin.l \$r31,\$r0,\$r0
+ 684:  0c 80 0f f4     f40f800c streamin.l \$r0,\$r31,\$r0
+ 688:  fc 01 00 f4     f40001fc streamin.l \$r0,\$r0,\$r31
+ 68c:  4c 00 11 f4     f411004c streamin.l \$r1,\$r2,\$r4
+ 690:  0c 00 88 f4     f488000c streamin.l \$r8,\$r16,\$r0
+ 694:  0c 60 f0 f5     f5f0600c streamin.l \$r31,\$r0,0 <pmlabel>
+ 698:  0c c0 0f f4     f40fc00c streamin.l \$r0,\$r31,0 <pmlabel>
+ 69c:  1c c0 0f f4     f40fc01c streamin.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 6a0:  fc df 0f f4     f40fdffc streamin.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 6a4:  1c 80 0f f2     f20f801c streamin.s \$r0,\$r31,\$r1
+ 6a8:  dc c4 0f f2     f20fc4dc streamin.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 6ac:  1c 80 0f f0     f00f801c streamin.b \$r0,\$r31,\$r1
+ 6b0:  dc c4 0f f0     f00fc4dc streamin.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 6b4:  0d 00 f0 f5     f5f0000d streamini.l \$r31,\$r0,\$r0
+ 6b8:  0d 80 0f f4     f40f800d streamini.l \$r0,\$r31,\$r0
+ 6bc:  fd 01 00 f4     f40001fd streamini.l \$r0,\$r0,\$r31
+ 6c0:  4d 00 11 f4     f411004d streamini.l \$r1,\$r2,\$r4
+ 6c4:  0d 00 88 f4     f488000d streamini.l \$r8,\$r16,\$r0
+ 6c8:  0d 60 f0 f5     f5f0600d streamini.l \$r31,\$r0,0 <pmlabel>
+ 6cc:  0d c0 0f f4     f40fc00d streamini.l \$r0,\$r31,0 <pmlabel>
+ 6d0:  1d c0 0f f4     f40fc01d streamini.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 6d4:  fd df 0f f4     f40fdffd streamini.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 6d8:  1d 80 0f f2     f20f801d streamini.s \$r0,\$r31,\$r1
+ 6dc:  dd c4 0f f2     f20fc4dd streamini.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 6e0:  1d 80 0f f0     f00f801d streamini.b \$r0,\$r31,\$r1
+ 6e4:  dd c4 0f f0     f00fc4dd streamini.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 6e8:  0e 00 f0 f5     f5f0000e streamout.l \$r31,\$r0,\$r0
+ 6ec:  0e 80 0f f4     f40f800e streamout.l \$r0,\$r31,\$r0
+ 6f0:  fe 01 00 f4     f40001fe streamout.l \$r0,\$r0,\$r31
+ 6f4:  4e 00 11 f4     f411004e streamout.l \$r1,\$r2,\$r4
+ 6f8:  0e 00 88 f4     f488000e streamout.l \$r8,\$r16,\$r0
+ 6fc:  0e 60 f0 f5     f5f0600e streamout.l \$r31,\$r0,0 <pmlabel>
+ 700:  0e c0 0f f4     f40fc00e streamout.l \$r0,\$r31,0 <pmlabel>
+ 704:  1e c0 0f f4     f40fc01e streamout.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 708:  fe df 0f f4     f40fdffe streamout.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 70c:  1e 80 0f f2     f20f801e streamout.s \$r0,\$r31,\$r1
+ 710:  de c4 0f f2     f20fc4de streamout.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 714:  1e 80 0f f0     f00f801e streamout.b \$r0,\$r31,\$r1
+ 718:  de c4 0f f0     f00fc4de streamout.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 71c:  0f 00 f0 f5     f5f0000f streamouti.l \$r31,\$r0,\$r0
+ 720:  0f 80 0f f4     f40f800f streamouti.l \$r0,\$r31,\$r0
+ 724:  ff 01 00 f4     f40001ff streamouti.l \$r0,\$r0,\$r31
+ 728:  4f 00 11 f4     f411004f streamouti.l \$r1,\$r2,\$r4
+ 72c:  0f 00 88 f4     f488000f streamouti.l \$r8,\$r16,\$r0
+ 730:  0f 60 f0 f5     f5f0600f streamouti.l \$r31,\$r0,0 <pmlabel>
+ 734:  0f c0 0f f4     f40fc00f streamouti.l \$r0,\$r31,0 <pmlabel>
+ 738:  1f c0 0f f4     f40fc01f streamouti.l \$r0,\$r31,1 <pmlabel\+0x1>
+ 73c:  ff df 0f f4     f40fdfff streamouti.l \$r0,\$r31,1ff <pmlabel\+0x1ff>
+ 740:  1f 80 0f f2     f20f801f streamouti.s \$r0,\$r31,\$r1
+ 744:  df c4 0f f2     f20fc4df streamouti.s \$r0,\$r31,4d <pmlabel\+0x4d>
+ 748:  1f 80 0f f0     f00f801f streamouti.b \$r0,\$r31,\$r1
+ 74c:  df c4 0f f0     f00fc4df streamouti.b \$r0,\$r31,4d <pmlabel\+0x4d>
+ 750:  06 c0 0f f4     f40fc006 strlen.l \$r0,\$r31
+ 754:  06 40 f0 f5     f5f04006 strlen.l \$r31,\$r0
+ 758:  06 c0 0f f2     f20fc006 strlen.s \$r0,\$r31
+ 75c:  06 40 f0 f3     f3f04006 strlen.s \$r31,\$r0
+ 760:  06 c0 0f f0     f00fc006 strlen.b \$r0,\$r31
+ 764:  06 40 f0 f1     f1f04006 strlen.b \$r31,\$r0
+ 768:  0a c0 0f f4     f40fc00a stpcpy.l \$r0,\$r31
+ 76c:  0a 40 f0 f5     f5f0400a stpcpy.l \$r31,\$r0
+ 770:  0a c0 0f f2     f20fc00a stpcpy.s \$r0,\$r31
+ 774:  0a 40 f0 f3     f3f0400a stpcpy.s \$r31,\$r0
+ 778:  0a c0 0f f0     f00fc00a stpcpy.b \$r0,\$r31
+ 77c:  0a 40 f0 f1     f1f0400a stpcpy.b \$r31,\$r0
diff --git a/gas/testsuite/gas/ft32/insn.s b/gas/testsuite/gas/ft32/insn.s
new file mode 100644 (file)
index 0000000..344749f
--- /dev/null
@@ -0,0 +1,185 @@
+        # Used for all instructions that have a 3-address form
+       .macro TERNARY insn
+        # reg-reg
+        \insn   $r31, $r0, $r0
+        \insn   $r0, $r31, $r0
+        \insn   $r0, $r0, $r31
+        \insn   $r1, $r2, $r4
+        \insn   $r8, $r16, $r0
+
+        # immediate
+        \insn   $r31, $r0, -512
+        \insn   $r0, $r31, 0
+        \insn   $r0, $r31, 1
+        \insn   $r0, $r31, 511
+
+        # short and byte
+        \insn\().s $r0, $r31, $r1
+        \insn\().s $r0, $r31, 77
+        \insn\().b $r0, $r31, $r1
+        \insn\().b $r0, $r31, 77
+
+        .endm
+
+        .macro RegUImm insn
+        \insn   r0, r0, 0
+        \insn   r0, r0, 65535
+        \insn   r0, r31, 0
+        \insn   r0, r31, 65535
+        \insn   r31, r0, 0
+        \insn   r31, r0, 65535
+        .endm
+
+       .macro CMPOP insn
+        # reg-reg
+        \insn   $r0, $r0
+        \insn   $r31, $r0
+        \insn   $r0, $r31
+
+        # immediate
+        \insn   $r0, -512
+        \insn   $r31, 0
+        \insn   $r31, 1
+        \insn   $r31, 511
+
+        # short and byte
+        \insn\().s $r31, $r1
+        \insn\().s $r31, 77
+        \insn\().b $r31, $r1
+        \insn\().b $r31, 77
+
+        .endm
+
+        .section .data
+dalabel:
+        .long   0
+
+        .section .text
+pmlabel:
+
+        TERNARY add
+        TERNARY sub
+        TERNARY and
+        TERNARY or
+        TERNARY xor
+        TERNARY xnor
+        TERNARY ashl
+        TERNARY lshr
+        TERNARY ashr
+        TERNARY ror
+        TERNARY ldl
+        TERNARY bins
+        TERNARY bexts
+        TERNARY bextu
+        TERNARY flip
+
+        CMPOP   addcc
+        CMPOP   cmp
+        CMPOP   tst
+        CMPOP   btst
+
+        # LDI, STI, EXI
+        ldi.l   $r0,$r31,-128
+        ldi.l   $r31,$r0,127
+        ldi.s   $r0,$r31,-128
+        ldi.s   $r0,$r31,127
+        ldi.b   $r31,$r0,-128
+        ldi.b   $r31,$r0,127
+        sti.l   $r31,-128,$r0
+        sti.l   $r0,127,$r31
+        sti.s   $r31,-128,$r0
+        sti.s   $r31,127,$r0
+        sti.b   $r0,-128,$r31
+        sti.b   $r0,127,$r31
+        exi.l   $r0,$r31,-128
+        exi.l   $r31,$r0,127
+        exi.s   $r0,$r31,-128
+        exi.s   $r0,$r31,127
+        exi.b   $r31,$r0,-128
+        exi.b   $r31,$r0,127
+
+        # LPM, LPMI
+        lpm.l   $r0,pmlabel
+        lpm.s   $r16,pmlabel
+        lpm.b   $r31,pmlabel
+        lpmi.l  $r0,$r1,-128
+        lpmi.s  $r16,$r1,127
+        lpmi.b  $r31,$r1,-128
+
+        # JMP
+        jmp     pmlabel
+        jmpi    $r16
+        jmpx    31,$r28,1,pmlabel
+        jmpc    nz,pmlabel
+
+        # CALL
+        call    pmlabel
+        calli   $r16
+        callx   31,$r28,1,pmlabel
+        callc   nz,pmlabel
+
+        # PUSH, POP
+        push    $r0
+        push    $r16
+        push    $r31
+        pop     $r0
+        pop     $r16
+        pop     $r31
+
+        # LINK,UNLINK
+        link    $r0,0
+        link    $r16,65535
+        link    $r31,1017
+        unlink  $r0
+        unlink  $r16
+        unlink  $r31
+
+        # RETURN,RETI
+        return
+        reti
+
+        # LDA,STA,EXA
+        lda.l   $r0,dalabel
+        lda.s   $r16,dalabel
+        lda.b   $r31,dalabel
+        sta.l   dalabel,$r0
+        sta.s   dalabel,$r16
+        sta.b   dalabel,$r31
+        exa.l   $r0,dalabel
+        exa.s   $r16,dalabel
+        exa.b   $r31,dalabel
+
+        # LDK
+        ldk     $r0,-524288
+        ldk     $r0,524287
+        ldk     $r0,0
+
+        move    $r0,$r31
+        move    $r31,$r0
+
+        TERNARY udiv
+        TERNARY umod
+        TERNARY div
+        TERNARY mod
+        TERNARY strcmp
+        TERNARY memcpy
+        TERNARY memset
+        TERNARY mul
+        TERNARY muluh
+        TERNARY streamin
+        TERNARY streamini
+        TERNARY streamout
+        TERNARY streamouti
+
+        strlen.l $r0,$r31
+        strlen.l $r31,$r0
+        strlen.s $r0,$r31
+        strlen.s $r31,$r0
+        strlen.b $r0,$r31
+        strlen.b $r31,$r0
+        stpcpy.l $r0,$r31
+        stpcpy.l $r31,$r0
+        stpcpy.s $r0,$r31
+        stpcpy.s $r31,$r0
+        stpcpy.b $r0,$r31
+        stpcpy.b $r31,$r0
index 21b6ae6a0febc8c9528b4f4da9698532e6949552..16dc84aa7056972fcde934b02630028682e7352c 100644 (file)
@@ -1,3 +1,7 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * dis-asm.h (print_insn_ft32): Declare.
+
 2015-01-15  Mark Wielaard  <mjw@redhat.com>
 
        * dwarf2.def (DW_AT_noreturn): New DWARF5 attribute.
index f9e9ee53405311a11d678bbd5f75817109f0ff02..198a6f812d42d7b0c37f8ce7763d1ab6c4be3489 100644 (file)
@@ -236,6 +236,7 @@ extern int print_insn_dlx           (bfd_vma, disassemble_info *);
 extern int print_insn_epiphany         (bfd_vma, disassemble_info *);
 extern int print_insn_fr30             (bfd_vma, disassemble_info *);
 extern int print_insn_frv              (bfd_vma, disassemble_info *);
+extern int print_insn_ft32             (bfd_vma, disassemble_info *);
 extern int print_insn_h8300            (bfd_vma, disassemble_info *);
 extern int print_insn_h8300h           (bfd_vma, disassemble_info *);
 extern int print_insn_h8300s           (bfd_vma, disassemble_info *);
index 6eb7b8f23bf7ef14299c5a41af3aff1634ae15ff..99bc4ff5b9ebb2f772e2c56bde1ab10c183c54b1 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * common.h (EM_FT32): Define.
+       * ft32.h: New file.
+
 2015-01-09  Anthony Green  <green@moxielogic.com>
 
        * common.h (EM_MOXIE): Redefine to official number.
index f584e34f7a1c121ca0dd661817c0cc5648854627..ae7b5f813c039335884e931e57cbc557ed937b7a 100644 (file)
 #define EM_INTEL208    208     /* Reserved by Intel */
 #define EM_INTEL209    209     /* Reserved by Intel */
 #define EM_VISIUM      221     /* Controls and Data Services VISIUMcore processor */
+#define EM_FT32         222     /* FTDI Chip FT32 high performance 32-bit RISC architecture */
 #define EM_MOXIE        223     /* Moxie processor family */
 
 /* If it is necessary to assign new unofficial EM_* values, please pick large
diff --git a/include/elf/ft32.h b/include/elf/ft32.h
new file mode 100644 (file)
index 0000000..2d06a58
--- /dev/null
@@ -0,0 +1,37 @@
+/* ft32 ELF support for BFD.
+   Copyright (C) 2009-2015 Free Software Foundation, Inc.
+
+   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_FT32_H
+#define _ELF_FT32_H
+
+#include "elf/reloc-macros.h"
+
+/* Relocation types.  */
+START_RELOC_NUMBERS (elf_ft32_reloc_type)
+  RELOC_NUMBER (R_FT32_NONE, 0)
+  RELOC_NUMBER (R_FT32_32, 1)
+  RELOC_NUMBER (R_FT32_16, 2)
+  RELOC_NUMBER (R_FT32_8,  3)
+  RELOC_NUMBER (R_FT32_10, 4)
+  RELOC_NUMBER (R_FT32_20, 5)
+  RELOC_NUMBER (R_FT32_17, 6)
+  RELOC_NUMBER (R_FT32_18, 7)
+END_RELOC_NUMBERS (R_FT32_max)
+
+#endif /* _ELF_FT32_H */
index f97e56f9363df42d8711acc7bdaba82699e50399..52fd46210c2760f8a47607c1a0115bca10e56532 100644 (file)
@@ -1,3 +1,7 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * ft32.h: New file.
+
 2015-01-16  Andreas Krebbel  <krebbel@linux.vnet.ibm.com>
 
        * s390.h (s390_opcode_cpu_val): Add S390_OPCODE_Z13.
diff --git a/include/opcode/ft32.h b/include/opcode/ft32.h
new file mode 100644 (file)
index 0000000..9617890
--- /dev/null
@@ -0,0 +1,100 @@
+/* Definitions for decoding the ft32 opcode table.
+   Copyright (C) 2013-2015 Free Software Foundation, Inc.
+   Contributed by FTDI (support@ftdichip.com)
+
+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 2 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.  */
+
+typedef struct ft32_opc_info_t
+{
+  const char *name;
+  int dw;
+  unsigned int mask;
+  unsigned int bits;
+  int fields;
+} ft32_opc_info_t;
+
+#define FT32_PAT_ALUOP    0x08
+#define FT32_PAT_LDA      0x18
+#define FT32_PAT_TOCI     0x01
+#define FT32_PAT_CMPOP    0x0b
+#define FT32_PAT_STA      0x17
+#define FT32_PAT_EXA      0x07
+#define FT32_PAT_LDK      0x0c
+#define FT32_PAT_FFUOP    0x1e
+#define FT32_PAT_LDI      0x15
+#define FT32_PAT_STI      0x16
+#define FT32_PAT_EXI      0x1d
+#define FT32_PAT_POP      0x11
+#define FT32_PAT_LPM      0x0d
+#define FT32_PAT_LINK     0x12
+#define FT32_PAT_TOC      0x00
+#define FT32_PAT_PUSH     0x10
+#define FT32_PAT_RETURN   0x14
+#define FT32_PAT_UNLINK   0x13
+#define FT32_PAT_LPMI     0x19
+
+#define FT32_FLD_CBCRCV (1 << 0)
+#define FT32_FLD_INT (1 << 1)
+#define FT32_FLD_INT_BIT 26
+#define FT32_FLD_INT_SIZ 1
+#define FT32_FLD_DW (1 << 2)
+#define FT32_FLD_DW_BIT 25
+#define FT32_FLD_DW_SIZ 2
+#define FT32_FLD_CB (1 << 3)
+#define FT32_FLD_CB_BIT 22
+#define FT32_FLD_CB_SIZ 5
+#define FT32_FLD_R_D (1 << 4)
+#define FT32_FLD_R_D_BIT 20
+#define FT32_FLD_R_D_SIZ 5
+#define FT32_FLD_CR (1 << 5)
+#define FT32_FLD_CR_BIT 20
+#define FT32_FLD_CR_SIZ 2
+#define FT32_FLD_CV (1 << 6)
+#define FT32_FLD_CV_BIT 19
+#define FT32_FLD_CV_SIZ 1
+#define FT32_FLD_BT (1 << 7)
+#define FT32_FLD_BT_BIT 18
+#define FT32_FLD_BT_SIZ 1
+#define FT32_FLD_R_1 (1 << 8)
+#define FT32_FLD_R_1_BIT 15
+#define FT32_FLD_R_1_SIZ 5
+#define FT32_FLD_RIMM (1 << 9)
+#define FT32_FLD_RIMM_BIT 4
+#define FT32_FLD_RIMM_SIZ 11
+#define FT32_FLD_R_2 (1 << 10)
+#define FT32_FLD_R_2_BIT 4
+#define FT32_FLD_R_2_SIZ 5
+#define FT32_FLD_K20 (1 << 11)
+#define FT32_FLD_K20_BIT 0
+#define FT32_FLD_K20_SIZ 20
+#define FT32_FLD_PA (1 << 12)
+#define FT32_FLD_PA_BIT 0
+#define FT32_FLD_PA_SIZ 18
+#define FT32_FLD_AA (1 << 13)
+#define FT32_FLD_AA_BIT 0
+#define FT32_FLD_AA_SIZ 17
+#define FT32_FLD_K16 (1 << 14)
+#define FT32_FLD_K16_BIT 0
+#define FT32_FLD_K16_SIZ 16
+#define FT32_FLD_K8 (1 << 15)
+#define FT32_FLD_K8_BIT 0
+#define FT32_FLD_K8_SIZ 8
+#define FT32_FLD_AL (1 << 16)
+#define FT32_FLD_AL_BIT 0
+#define FT32_FLD_AL_SIZ 4
+
+#define FT32_FLD_R_D_POST (1 << 17)
+#define FT32_FLD_R_1_POST (1 << 18)
index c61baaef36515e6c65f05d831560607a129f2449..4a16b50db15d8648862c3a5a82a57a7ccf5764e0 100644 (file)
@@ -1,3 +1,11 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * Makefile.am: Add FT32 files.
+       * configure.tgt: Handle FT32 target.
+       * emulparams/elf32ft32.sh: New file.
+       * scripttempl/ft32.sc: New file.
+       * Makefile.in: Regenerate.
+
 2015-01-28  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        PR 4643
index 68ff02f3481d6fa1b2c7fc6d3e1eb26da177863a..18bcf8bd957d3331826122f20cc391b58b3e8377 100644 (file)
@@ -228,6 +228,7 @@ ALL_EMULATION_SOURCES = \
        eelf32fr30.c \
        eelf32frv.c \
        eelf32frvfd.c \
+       eelf32ft32.c \
        eelf32i370.c \
        eelf32ip2k.c \
        eelf32iq10.c \
@@ -1053,6 +1054,9 @@ eelf32frvfd.c: $(srcdir)/emulparams/elf32frvfd.sh \
   $(srcdir)/emulparams/elf32frv.sh \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 
+eelf32ft32.c: $(srcdir)/emulparams/elf32ft32.sh \
+  $(ELF_GEN_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+
 eelf32i370.c: $(srcdir)/emulparams/elf32i370.sh \
   $(ELF_DEPS) $(srcdir)/scripttempl/elfi370.sc ${GEN_DEPENDS}
 
index 311452d05320495b8a9494c5702710c64be04739..a3011c9eb1f1ab6c8c3f918f4648d508712bd528 100644 (file)
@@ -536,6 +536,7 @@ ALL_EMULATION_SOURCES = \
        eelf32fr30.c \
        eelf32frv.c \
        eelf32frvfd.c \
+       eelf32ft32.c \
        eelf32i370.c \
        eelf32ip2k.c \
        eelf32iq10.c \
@@ -1146,6 +1147,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32fr30.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32frv.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32frvfd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ft32.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32i370.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ip2k.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32iq10.Po@am__quote@
@@ -2495,6 +2497,9 @@ eelf32frvfd.c: $(srcdir)/emulparams/elf32frvfd.sh \
   $(srcdir)/emulparams/elf32frv.sh \
   $(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 
+eelf32ft32.c: $(srcdir)/emulparams/elf32ft32.sh \
+  $(ELF_GEN_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+
 eelf32i370.c: $(srcdir)/emulparams/elf32i370.sh \
   $(ELF_DEPS) $(srcdir)/scripttempl/elfi370.sc ${GEN_DEPENDS}
 
index ef876b26c7762b1412cd03d2087bc7353dd149d4..f16c845d169ab5568b6905c81c677923611a9e95 100644 (file)
@@ -744,6 +744,8 @@ tilegxbe-*-*)               targ_emul=elf64tilegx_be
                        targ_extra_emuls="elf64tilegx elf32tilegx elf32tilegx_be"
                        targ_extra_libpath=$targ_extra_emuls ;;
 tilepro-*-*)           targ_emul=elf32tilepro ;;
+ft32-*-*)              targ_emul=elf32ft32
+                       ;;
 v850*-*-*)             targ_emul=v850_rh850
                        targ_extra_emuls=v850
                        ;;
diff --git a/ld/emulparams/elf32ft32.sh b/ld/emulparams/elf32ft32.sh
new file mode 100644 (file)
index 0000000..4b74f9b
--- /dev/null
@@ -0,0 +1,8 @@
+SCRIPT_NAME=ft32
+TEMPLATE_NAME=generic
+EXTRA_EM_FILE=genelf
+OUTPUT_FORMAT="elf32-ft32"
+TEXT_START_ADDR=0x0000
+MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
+ARCH=ft32
+EMBEDDED=yes
diff --git a/ld/scripttempl/ft32.sc b/ld/scripttempl/ft32.sc
new file mode 100644 (file)
index 0000000..8ceee44
--- /dev/null
@@ -0,0 +1,62 @@
+TORS=".tors :
+  {
+    ___ctors = . ;
+    *(.ctors)
+    ___ctors_end = . ;
+    ___dtors = . ;
+    *(.dtors)
+    ___dtors_end = . ;
+    . = ALIGN(4);
+  } > ram"
+
+cat <<EOF
+OUTPUT_FORMAT("${OUTPUT_FORMAT}")
+OUTPUT_ARCH(${ARCH})
+${LIB_SEARCH_DIRS}
+
+MEMORY
+{
+  flash     (rx)   : ORIGIN = 0, LENGTH = 256K
+  ram       (rw!x) : ORIGIN = 0x800000, LENGTH = 64K
+}
+SECTIONS
+{
+  .text :
+  {
+    *(.text*)
+    *(.strings)
+    *(._pm*)
+    *(.init)
+    *(.fini)
+    ${RELOCATING+ _etext = . ; }
+    . = ALIGN(4);
+  } ${RELOCATING+ > flash}
+  ${CONSTRUCTING+${TORS}}
+  .data          : AT (ADDR (.text) + SIZEOF (.text))
+  {
+    *(.data)
+    *(.rodata)
+    *(.rodata*)
+    ${RELOCATING+ _edata = . ; }
+  } ${RELOCATING+ > ram}
+  .bss  SIZEOF(.data) + ADDR(.data) :
+  {
+    ${RELOCATING+ _bss_start = . ; }
+    *(.bss)
+    *(COMMON)
+    ${RELOCATING+ _end = . ;  }
+  } ${RELOCATING+ > ram}
+
+  ${RELOCATING+ __data_load_start = LOADADDR(.data); }
+  ${RELOCATING+ __data_load_end = __data_load_start + SIZEOF(.data); }
+
+  .stab 0 ${RELOCATING+(NOLOAD)} :
+  {
+    *(.stab)
+  }
+  .stabstr 0 ${RELOCATING+(NOLOAD)} :
+  {
+    *(.stabstr)
+  }
+}
+EOF
index 7a3d49d259afb5849666a66ca28b546ce170dcb7..89fe9ceddbfd401537c62563f4182309052d50ea 100644 (file)
@@ -1,3 +1,14 @@
+2015-01-28  James Bowman  <james.bowman@ftdichip.com>
+
+       * Makefile.am: Add FT32 files.
+       * configure.ac: Handle FT32.
+       * disassemble.c (disassembler): Call print_insn_ft32.
+       * ft32-dis.c: New file.
+       * ft32-opc.c: New file.
+       * Makefile.in: Regenerate.
+       * configure: Regenerate.
+       * po/POTFILES.in: Regenerate.
+
 2015-01-28 Kuan-Lin Chen <kuanlinchentw@gmail.com>
 
        * nds32-asm.c (keyword_sr): Add new system registers.
index 320f8bb8f688886837e3133a3bec34fdc480ee42..4adc6ff74f52b445d81060bad30688059de9896e 100644 (file)
@@ -135,6 +135,8 @@ TARGET_LIBOPCODES_CFILES = \
        frv-dis.c \
        frv-ibld.c \
        frv-opc.c \
+       ft32-dis.c \
+       ft32-opc.c \
        h8300-dis.c \
        h8500-dis.c \
        hppa-dis.c \
index 31876ca3c9ff098b821858a674142535517d8984..d9ddefad3ae61d64cb5b37694829d8c0ee7778a5 100644 (file)
@@ -408,6 +408,8 @@ TARGET_LIBOPCODES_CFILES = \
        frv-dis.c \
        frv-ibld.c \
        frv-opc.c \
+       ft32-dis.c \
+       ft32-opc.c \
        h8300-dis.c \
        h8500-dis.c \
        hppa-dis.c \
@@ -810,6 +812,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frv-dis.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frv-ibld.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frv-opc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ft32-dis.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ft32-opc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h8300-dis.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/h8500-dis.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hppa-dis.Plo@am__quote@
index c97bdf6403281e9c8e8581ccb406d68b77271dfb..cd3aa83d1393ecc6e5105270b45a39e179880ea5 100755 (executable)
@@ -12549,6 +12549,7 @@ if test x${all_targets} = xfalse ; then
        bfd_dlx_arch)           ta="$ta dlx-dis.lo" ;;
        bfd_fr30_arch)          ta="$ta fr30-asm.lo fr30-desc.lo fr30-dis.lo fr30-ibld.lo fr30-opc.lo" using_cgen=yes ;;
        bfd_frv_arch)           ta="$ta frv-asm.lo frv-desc.lo frv-dis.lo frv-ibld.lo frv-opc.lo" using_cgen=yes ;;
+       bfd_ft32_arch)          ta="$ta ft32-opc.lo ft32-dis.lo" ;;
        bfd_moxie_arch)         ta="$ta moxie-dis.lo moxie-opc.lo" ;;
        bfd_h8300_arch)         ta="$ta h8300-dis.lo" ;;
        bfd_h8500_arch)         ta="$ta h8500-dis.lo" ;;
index 74bccff7de51a62f88448579be66a706fe9aacce..eab16d659735a1137099413da891a8e728e96a0a 100644 (file)
@@ -266,6 +266,7 @@ if test x${all_targets} = xfalse ; then
        bfd_dlx_arch)           ta="$ta dlx-dis.lo" ;;
        bfd_fr30_arch)          ta="$ta fr30-asm.lo fr30-desc.lo fr30-dis.lo fr30-ibld.lo fr30-opc.lo" using_cgen=yes ;;
        bfd_frv_arch)           ta="$ta frv-asm.lo frv-desc.lo frv-dis.lo frv-ibld.lo frv-opc.lo" using_cgen=yes ;;
+       bfd_ft32_arch)          ta="$ta ft32-opc.lo ft32-dis.lo" ;;
        bfd_moxie_arch)         ta="$ta moxie-dis.lo moxie-opc.lo" ;;
        bfd_h8300_arch)         ta="$ta h8300-dis.lo" ;;
        bfd_h8500_arch)         ta="$ta h8500-dis.lo" ;;
index 0c1d7e01749c7e0e8b746cfe5b78ac281bc3a2db..f47a1907e05d55c060dbc8857e431ca6450b5653 100644 (file)
@@ -37,6 +37,7 @@
 #define ARCH_epiphany
 #define ARCH_fr30
 #define ARCH_frv
+#define ARCH_ft32
 #define ARCH_h8300
 #define ARCH_h8500
 #define ARCH_hppa
@@ -445,6 +446,11 @@ disassembler (abfd)
       disassemble = print_insn_tic80;
       break;
 #endif
+#ifdef ARCH_ft32
+    case bfd_arch_ft32:
+      disassemble = print_insn_ft32;
+      break;
+#endif
 #ifdef ARCH_v850
     case bfd_arch_v850:
     case bfd_arch_v850_rh850:
diff --git a/opcodes/ft32-dis.c b/opcodes/ft32-dis.c
new file mode 100644 (file)
index 0000000..877a7ee
--- /dev/null
@@ -0,0 +1,177 @@
+/* Disassemble ft32 instructions.
+   Copyright (C) 2013-2015 Free Software Foundation, Inc.
+   Contributed by FTDI (support@ftdichip.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.  */
+
+#include "sysdep.h"
+#include <stdio.h>
+#define STATIC_TABLE
+#define DEFINE_TABLE
+
+#include "opcode/ft32.h"
+#include "dis-asm.h"
+
+extern const ft32_opc_info_t ft32_opc_info[128];
+
+static fprintf_ftype fpr;
+static void *stream;
+
+int
+print_insn_ft32 (bfd_vma addr, struct disassemble_info *info)
+{
+  int status;
+  stream = info->stream;
+  bfd_byte buffer[4];
+  unsigned int iword;
+  const ft32_opc_info_t *oo;
+
+  fpr = info->fprintf_func;
+
+  if ((status = info->read_memory_func (addr, buffer, 4, info)))
+    goto fail;
+
+  iword = bfd_getl32 (buffer);
+
+  for (oo = ft32_opc_info; oo->name; oo++)
+    if ((iword & oo->mask) == oo->bits)
+      break;
+
+  if (oo->name)
+    {
+      int f = oo->fields;
+      int imm;
+
+      fpr (stream, "%08x %s", iword, oo->name);
+      if (oo->dw)
+        {
+          fpr (stream, ".%c ", "bsl"[(iword >> FT32_FLD_DW_BIT) & 3]);
+        }
+      else
+        {
+          fpr (stream, " ");
+        }
+
+      while (f)
+        {
+          int lobit = f & -f;
+          if (f & lobit)
+            {
+              switch (lobit)
+              {
+              case  FT32_FLD_CBCRCV:
+                // imm is {CB, CV}
+                imm = ((iword >> FT32_FLD_CB_BIT) & ((1 << FT32_FLD_CB_SIZ) - 1)) << 4;
+                imm |= ((iword >> FT32_FLD_CV_BIT) & ((1 << FT32_FLD_CV_SIZ) - 1));
+                switch (imm)
+                {
+                case 0x00: fpr(stream, "nz");  break;
+                case 0x01: fpr(stream, "z");   break;
+                case 0x10: fpr(stream, "ae");  break;
+                case 0x11: fpr(stream, "b");   break;
+                case 0x20: fpr(stream, "no");  break;
+                case 0x21: fpr(stream, "o");   break;
+                case 0x30: fpr(stream, "ns");  break;
+                case 0x31: fpr(stream, "s");   break;
+                case 0x40: fpr(stream, "lt");  break;
+                case 0x41: fpr(stream, "gte"); break;
+                case 0x50: fpr(stream, "lte"); break;
+                case 0x51: fpr(stream, "gt");  break;
+                case 0x60: fpr(stream, "be");  break;
+                case 0x61: fpr(stream, "a");   break;
+                default:   fpr(stream, "%d,$r30,%d", (imm >> 4), (imm & 1)); break;
+                }
+                break;
+              case  FT32_FLD_CB:
+                imm = (iword >> FT32_FLD_CB_BIT) & ((1 << FT32_FLD_CB_SIZ) - 1);
+                fpr(stream, "%d", imm);
+                break;
+              case  FT32_FLD_R_D:
+                fpr(stream, "$r%d", (iword >> FT32_FLD_R_D_BIT) & 0x1f);
+                break;
+              case  FT32_FLD_CR:
+                imm = (iword >> FT32_FLD_CR_BIT) & ((1 << FT32_FLD_CR_SIZ) - 1);
+                fpr(stream, "$r%d", 28 + imm);
+                break;
+              case  FT32_FLD_CV:
+                imm = (iword >> FT32_FLD_CV_BIT) & ((1 << FT32_FLD_CV_SIZ) - 1);
+                fpr(stream, "%d", imm);
+                break;
+              case  FT32_FLD_R_1:
+                fpr(stream, "$r%d", (iword >> FT32_FLD_R_1_BIT) & 0x1f);
+                break;
+              case  FT32_FLD_RIMM:
+                imm = (iword >> FT32_FLD_RIMM_BIT) & ((1 << FT32_FLD_RIMM_SIZ) - 1);
+                if (imm & 0x400)
+                  info->print_address_func ((bfd_vma) imm & 0x1ff, info);
+                else
+                  fpr(stream, "$r%d", imm & 0x1f);
+                break;
+              case  FT32_FLD_R_2:
+                fpr(stream, "$r%d", (iword >> FT32_FLD_R_2_BIT) & 0x1f);
+                break;
+              case  FT32_FLD_K20:
+                imm = iword & ((1 << FT32_FLD_K20_SIZ) - 1);
+                info->print_address_func ((bfd_vma) imm, info);
+                break;
+              case  FT32_FLD_PA:
+                imm = (iword & ((1 << FT32_FLD_PA_SIZ) - 1)) << 2;
+                info->print_address_func ((bfd_vma) imm, info);
+                break;
+              case  FT32_FLD_AA:
+                imm = iword & ((1 << FT32_FLD_AA_SIZ) - 1);
+                info->print_address_func ((bfd_vma) imm, info);
+                break;
+                break;
+              case  FT32_FLD_K16:
+                imm = iword & ((1 << FT32_FLD_K16_SIZ) - 1);
+                info->print_address_func ((bfd_vma) imm, info);
+                break;
+              case  FT32_FLD_K8:
+                imm = iword & ((1 << FT32_FLD_K8_SIZ) - 1);
+                info->print_address_func ((bfd_vma) imm, info);
+                break;
+                break;
+              case  FT32_FLD_R_D_POST:
+                fpr(stream, "$r%d", (iword >> FT32_FLD_R_D_BIT) & 0x1f);
+                break;
+              case  FT32_FLD_R_1_POST:
+                fpr(stream, "$r%d", (iword >> FT32_FLD_R_1_BIT) & 0x1f);
+                break;
+              default:
+                break;
+              }
+              f &= ~lobit;
+              if (f)
+                {
+                  fpr(stream, ",");
+                }
+            }
+        }
+    }
+    else
+    {
+      fpr (stream, "%08x!", iword);
+    }
+
+  return 4;
+
+ fail:
+  info->memory_error_func (status, addr, info);
+  return -1;
+}
diff --git a/opcodes/ft32-opc.c b/opcodes/ft32-opc.c
new file mode 100644 (file)
index 0000000..04cda41
--- /dev/null
@@ -0,0 +1,88 @@
+/* ft32-opc.c -- Definitions for ft32 opcodes.
+   Copyright (C) 2013-2015 Free Software Foundation, Inc.
+   Contributed by FTDI (support@ftdichip.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 file; see the file COPYING.  If not, write to the
+   Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include "sysdep.h"
+#include "opcode/ft32.h"
+
+const ft32_opc_info_t ft32_opc_info[] =
+{
+{       "nop", 0, 0xffffffffU, 0x40004000U, 0},
+{      "move", 1, 0xf8007fffU, 0x40004000U, FT32_FLD_R_D|FT32_FLD_R_1},
+{  "streamin", 1, 0xf800000fU, 0xf000000cU, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "ldi", 1, 0xf8000000U, 0xa8000000U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_K8},
+{       "exi", 1, 0xf8000000U, 0xe8000000U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_K8},
+{    "return", 0, 0xfc000000U, 0xa0000000U, 0},
+{        "or", 1, 0xf800000fU, 0x40000005U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "pop", 1, 0xf8000000U, 0x88000000U, FT32_FLD_R_D},
+{       "sta", 1, 0xf8000000U, 0xb8000000U, FT32_FLD_AA|FT32_FLD_R_D_POST},
+{       "xor", 1, 0xf800000fU, 0x40000006U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{    "memcpy", 1, 0xf800000fU, 0xf0000005U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{    "strlen", 1, 0xf8007fffU, 0xf0004006U, FT32_FLD_R_D|FT32_FLD_R_1},
+{       "cmp", 1, 0xf9f0000fU, 0x59e00002U, FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "btst", 1, 0xf9f0000fU, 0x59e0000cU, FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "link", 0, 0xfe000000U, 0x94000000U, FT32_FLD_R_D|FT32_FLD_K16},
+{      "call", 0, 0xfffc0000U, 0x00340000U, FT32_FLD_PA},
+{     "callc", 0, 0xf8340000U, 0x00240000U, FT32_FLD_CBCRCV|FT32_FLD_PA},
+{     "callx", 0, 0xf8040000U, 0x00040000U, FT32_FLD_CR|FT32_FLD_CB|FT32_FLD_CV|FT32_FLD_PA},
+{ "streamini", 1, 0xf800000fU, 0xf000000dU, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "lda", 1, 0xf8000000U, 0xc0000000U, FT32_FLD_R_D|FT32_FLD_AA},
+{       "exa", 1, 0xf8000000U, 0x38000000U, FT32_FLD_R_D|FT32_FLD_AA},
+{    "unlink", 0, 0xf8000000U, 0x98000000U, FT32_FLD_R_D},
+{     "calli", 0, 0xfffc0000U, 0x08340000U, FT32_FLD_R_2},
+{    "stpcpy", 1, 0xf8007fffU, 0xf000400aU, FT32_FLD_R_D|FT32_FLD_R_1},
+{       "jmp", 0, 0xfffc0000U, 0x00300000U, FT32_FLD_PA},
+{    "strcmp", 1, 0xf800000fU, 0xf0000004U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "mul", 1, 0xf800000fU, 0xf0000008U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "push", 1, 0xf8000000U, 0x80000000U, FT32_FLD_R_1},
+{       "sti", 1, 0xf8000000U, 0xb0000000U, FT32_FLD_R_D|FT32_FLD_K8|FT32_FLD_R_1_POST},
+{       "mod", 1, 0xf800000fU, 0xf0000003U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "umod", 1, 0xf800000fU, 0xf0000001U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{     "addcc", 1, 0xf9f0000fU, 0x59e00000U, FT32_FLD_R_1|FT32_FLD_RIMM},
+{ "streamout", 1, 0xf800000fU, 0xf000000eU, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "lpmi", 1, 0xf8000000U, 0xc8000000U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_K8},
+{      "udiv", 1, 0xf800000fU, 0xf0000000U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "sub", 1, 0xf800000fU, 0x40000002U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "lshr", 1, 0xf800000fU, 0x40000009U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "tst", 1, 0xf9f0000fU, 0x59e00004U, FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "xnor", 1, 0xf800000fU, 0x40000007U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{     "muluh", 1, 0xf800000fU, 0xf0000009U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "and", 1, 0xf800000fU, 0x40000004U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "add", 1, 0xf800000fU, 0x40000000U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "ror", 1, 0xf800000fU, 0x40000001U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "ldl", 1, 0xf800000fU, 0x40000003U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "bins", 1, 0xf800000fU, 0x4000000bU, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{     "bexts", 1, 0xf800000fU, 0x4000000cU, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{     "bextu", 1, 0xf800000fU, 0x4000000dU, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "flip", 1, 0xf800000fU, 0x4000000eU, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{    "memset", 1, 0xf800000fU, 0xf0000007U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "div", 1, 0xf800000fU, 0xf0000002U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{       "ldk", 1, 0xf8000000U, 0x60000000U, FT32_FLD_R_D|FT32_FLD_K20},
+{      "reti", 0, 0xfc000000U, 0xa4000000U, 0},
+{      "ashr", 1, 0xf800000fU, 0x4000000aU, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "jmpi", 0, 0xfffc0000U, 0x08300000U, FT32_FLD_R_2},
+{     "jmpic", 0, 0xf8040000U, 0x08000000U, FT32_FLD_CBCRCV|FT32_FLD_R_2},
+{      "ashl", 1, 0xf800000fU, 0x40000008U, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{      "jmpc", 0, 0xf8340000U, 0x00200000U, FT32_FLD_CBCRCV|FT32_FLD_PA},
+{      "jmpx", 0, 0xf8040000U, 0x00000000U, FT32_FLD_CR|FT32_FLD_CB|FT32_FLD_CV|FT32_FLD_PA},
+{       "lpm", 1, 0xf8000000U, 0x68000000U, FT32_FLD_R_D|FT32_FLD_PA},
+{"streamouti", 1, 0xf800000fU, 0xf000000fU, FT32_FLD_R_D|FT32_FLD_R_1|FT32_FLD_RIMM},
+{ NULL, 0, 0, 0, 0}
+};
index 8e8e122bd6792e8887e9f1b2b2d6ca9b53a11d14..0e8039d0ae407d0af026176995b779cc1d99a11b 100644 (file)
@@ -56,6 +56,8 @@ frv-dis.c
 frv-ibld.c
 frv-opc.c
 frv-opc.h
+ft32-dis.c
+ft32-opc.c
 h8300-dis.c
 h8500-dis.c
 h8500-opc.h