Add new binutils target: moxie

This commit is contained in:
Nick Clifton 2009-04-16 15:39:48 +00:00
parent 335d71d67e
commit 20135e4cea
40 changed files with 1811 additions and 3 deletions

View file

@ -1,3 +1,8 @@
2009-04-15 Anthony Green <green@moxielogic.com>
* configure.ac: Ditto.
* configure: Rebuilt.
2009-04-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* configure.ac: Bump minimum GMP/MPFR versions to 4.2 and 2.3.1.

View file

@ -1,3 +1,15 @@
2009-04-15 Anthony Green <green@moxielogic.com>
* targets.c: Add moxie support.
* Makefile.am: Ditto.
* Makefile.in: Rebuilt.
* cpu-moxie.c, elf32-moxie.c: New files.
* archures.c: Add moxie support.
* configure.in: Add moxie support.
* configure: Rebuilt.
* config.bfd, archures.c: Add moxie support.
* bfd-in2.h: Rebuilt.
2009-04-15 Christophe Lyon <christophe.lyon@st.com>
* elf32-arm.c (elf32_arm_final_link_relocate): Don't convert ARM

View file

@ -74,6 +74,7 @@ ALL_MACHINES = \
cpu-dlx.lo \
cpu-fr30.lo \
cpu-frv.lo \
cpu-moxie.lo \
cpu-h8300.lo \
cpu-h8500.lo \
cpu-hppa.lo \
@ -141,6 +142,7 @@ ALL_MACHINES_CFILES = \
cpu-dlx.c \
cpu-fr30.c \
cpu-frv.c \
cpu-moxie.c \
cpu-h8300.c \
cpu-h8500.c \
cpu-hppa.c \
@ -258,6 +260,7 @@ BFD32_BACKENDS = \
elf32-dlx.lo \
elf32-fr30.lo \
elf32-frv.lo \
elf32-moxie.lo \
elf32-gen.lo \
elf32-h8300.lo \
elf32-hppa.lo \
@ -440,6 +443,7 @@ BFD32_BACKENDS_CFILES = \
elf32-dlx.c \
elf32-fr30.c \
elf32-frv.c \
elf32-moxie.c \
elf32-gen.c \
elf32-h8300.c \
elf32-hppa.c \
@ -1119,6 +1123,7 @@ cpu-d30v.lo: cpu-d30v.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-dlx.lo: cpu-dlx.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-fr30.lo: cpu-fr30.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-frv.lo: cpu-frv.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-moxie.lo: cpu-moxie.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-h8300.lo: cpu-h8300.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-h8500.lo: cpu-h8500.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-hppa.lo: cpu-hppa.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
@ -1421,6 +1426,11 @@ elf32-frv.lo: elf32-frv.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/frv.h \
$(INCDIR)/elf/reloc-macros.h $(INCDIR)/elf/dwarf2.h \
elf32-target.h
elf32-moxie.lo: elf32-moxie.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h \
$(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/moxie.h \
$(INCDIR)/elf/reloc-macros.h $(INCDIR)/elf/dwarf2.h \
elf32-target.h
elf32-gen.lo: elf32-gen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h \
$(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h elf32-target.h

View file

@ -340,6 +340,7 @@ ALL_MACHINES = \
cpu-dlx.lo \
cpu-fr30.lo \
cpu-frv.lo \
cpu-moxie.lo \
cpu-h8300.lo \
cpu-h8500.lo \
cpu-hppa.lo \
@ -407,6 +408,7 @@ ALL_MACHINES_CFILES = \
cpu-dlx.c \
cpu-fr30.c \
cpu-frv.c \
cpu-moxie.c \
cpu-h8300.c \
cpu-h8500.c \
cpu-hppa.c \
@ -525,6 +527,7 @@ BFD32_BACKENDS = \
elf32-dlx.lo \
elf32-fr30.lo \
elf32-frv.lo \
elf32-moxie.lo \
elf32-gen.lo \
elf32-h8300.lo \
elf32-hppa.lo \
@ -707,6 +710,7 @@ BFD32_BACKENDS_CFILES = \
elf32-dlx.c \
elf32-fr30.c \
elf32-frv.c \
elf32-moxie.c \
elf32-gen.c \
elf32-h8300.c \
elf32-hppa.c \
@ -1716,6 +1720,7 @@ cpu-d30v.lo: cpu-d30v.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-dlx.lo: cpu-dlx.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-fr30.lo: cpu-fr30.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-frv.lo: cpu-frv.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-moxie.lo: cpu-moxie.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-h8300.lo: cpu-h8300.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-h8500.lo: cpu-h8500.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
cpu-hppa.lo: cpu-hppa.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h
@ -2018,6 +2023,11 @@ elf32-frv.lo: elf32-frv.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
$(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/frv.h \
$(INCDIR)/elf/reloc-macros.h $(INCDIR)/elf/dwarf2.h \
elf32-target.h
elf32-moxie.lo: elf32-moxie.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h \
$(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h $(INCDIR)/elf/moxie.h \
$(INCDIR)/elf/reloc-macros.h $(INCDIR)/elf/dwarf2.h \
elf32-target.h
elf32-gen.lo: elf32-gen.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \
elf-bfd.h $(INCDIR)/elf/common.h $(INCDIR)/elf/external.h \
$(INCDIR)/elf/internal.h $(INCDIR)/bfdlink.h elf32-target.h

View file

@ -331,6 +331,8 @@ DESCRIPTION
.#define bfd_mach_frvtomcat 499 {* fr500 prototype *}
.#define bfd_mach_fr500 500
.#define bfd_mach_fr550 550
. bfd_arch_moxie, {* The moxie processor *}
.#define bfd_mach_moxie 1
. bfd_arch_mcore,
. bfd_arch_mep,
.#define bfd_mach_mep 1
@ -467,6 +469,7 @@ extern const bfd_arch_info_type bfd_d30v_arch;
extern const bfd_arch_info_type bfd_dlx_arch;
extern const bfd_arch_info_type bfd_fr30_arch;
extern const bfd_arch_info_type bfd_frv_arch;
extern const bfd_arch_info_type bfd_moxie_arch;
extern const bfd_arch_info_type bfd_h8300_arch;
extern const bfd_arch_info_type bfd_h8500_arch;
extern const bfd_arch_info_type bfd_hppa_arch;
@ -539,6 +542,7 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
&bfd_dlx_arch,
&bfd_fr30_arch,
&bfd_frv_arch,
&bfd_moxie_arch,
&bfd_h8300_arch,
&bfd_h8500_arch,
&bfd_hppa_arch,

View file

@ -1968,6 +1968,8 @@ enum bfd_architecture
#define bfd_mach_frvtomcat 499 /* fr500 prototype */
#define bfd_mach_fr500 500
#define bfd_mach_fr550 550
bfd_arch_moxie, /* The moxie. */
#define bfd_mach_moxie 1
bfd_arch_mcore,
bfd_arch_mep,
#define bfd_mach_mep 1

View file

@ -944,7 +944,8 @@ handle_COMDAT (bfd * abfd,
but there's some checking we can do to be
sure. */
if (! (isym.n_sclass == C_STAT
if (! ((isym.n_sclass == C_STAT
|| isym.n_sclass == C_EXT)
&& isym.n_type == T_NULL
&& isym.n_value == 0))
abort ();
@ -954,7 +955,7 @@ handle_COMDAT (bfd * abfd,
names like .text$foo__Fv (in the case of a
function). See comment above for more. */
if (strcmp (name, symname) != 0)
if (isym.n_sclass == C_STAT && strcmp (name, symname) != 0)
_bfd_error_handler (_("%B: warning: COMDAT symbol '%s' does not match section name '%s'"),
abfd, symname, name);

View file

@ -413,6 +413,10 @@ case "${targ}" in
targ_selvecs=bfd_elf32_frv_vec
;;
moxie-*-elf)
targ_defvec=bfd_elf32_moxie_vec
;;
h8300*-*-rtemscoff*)
targ_defvec=h8300coff_vec
targ_underscore=yes

1
bfd/configure vendored
View file

@ -20969,6 +20969,7 @@ do
bfd_elf32_fr30_vec) tb="$tb elf32-fr30.lo elf32.lo $elf" ;;
bfd_elf32_frv_vec) tb="$tb elf32-frv.lo elf32.lo $elf" ;;
bfd_elf32_frvfdpic_vec) tb="$tb elf32-frv.lo elf32.lo $elf" ;;
bfd_elf32_moxie_vec) tb="$tb elf32-moxie.lo elf32.lo $elf" ;;
bfd_elf32_h8300_vec) tb="$tb elf32-h8300.lo elf32.lo $elf" ;;
bfd_elf32_hppa_linux_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
bfd_elf32_hppa_nbsd_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;;

View file

@ -690,6 +690,7 @@ do
bfd_elf32_fr30_vec) tb="$tb elf32-fr30.lo elf32.lo $elf" ;;
bfd_elf32_frv_vec) tb="$tb elf32-frv.lo elf32.lo $elf" ;;
bfd_elf32_frvfdpic_vec) tb="$tb elf32-frv.lo elf32.lo $elf" ;;
bfd_elf32_moxie_vec) tb="$tb elf32-moxie.lo elf32.lo $elf" ;;
bfd_elf32_h8300_vec) tb="$tb elf32-h8300.lo elf32.lo $elf" ;;
bfd_elf32_hppa_linux_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;;
bfd_elf32_hppa_nbsd_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;;

40
bfd/cpu-moxie.c Normal file
View file

@ -0,0 +1,40 @@
/* BFD support for the moxie processor.
Copyright 2009 Free Software Foundation, Inc.
Written by Anthony Green
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_moxie_arch =
{
32, /* 32 bits in a word. */
32, /* 32 bits in an address. */
8, /* 8 bits in a byte. */
bfd_arch_moxie, /* enum bfd_architecture arch. */
bfd_mach_moxie,
"moxie", /* Arch name. */
"moxie", /* Printable name. */
2, /* Unsigned int section alignment power. */
TRUE, /* The one and only. */
bfd_default_compatible,
bfd_default_scan ,
0,
};

378
bfd/elf32-moxie.c Normal file
View file

@ -0,0 +1,378 @@
/* moxie-specific support for 32-bit ELF.
Copyright 2008 Anthony Green.
Copyright 2009 Free Software Foundation, Inc.
Copied from elf32-fr30.c which is..
Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
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/moxie.h"
/* Forward declarations. */
static reloc_howto_type moxie_elf_howto_table [] =
{
/* This reloc does nothing. */
HOWTO (R_MOXIE_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_MOXIE_NONE", /* name */
FALSE, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
FALSE), /* pcrel_offset */
/* A 32 bit absolute relocation. */
HOWTO (R_MOXIE_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_MOXIE_32", /* name */
FALSE, /* partial_inplace */
0x00000000, /* src_mask */
0xffffffff, /* dst_mask */
FALSE), /* pcrel_offset */
};
/* Map BFD reloc types to MOXIE ELF reloc types. */
struct moxie_reloc_map
{
bfd_reloc_code_real_type bfd_reloc_val;
unsigned int moxie_reloc_val;
};
static const struct moxie_reloc_map moxie_reloc_map [] =
{
{ BFD_RELOC_NONE, R_MOXIE_NONE },
{ BFD_RELOC_32, R_MOXIE_32 },
};
static reloc_howto_type *
moxie_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
bfd_reloc_code_real_type code)
{
unsigned int i;
for (i = sizeof (moxie_reloc_map) / sizeof (moxie_reloc_map[0]);
--i;)
if (moxie_reloc_map [i].bfd_reloc_val == code)
return & moxie_elf_howto_table [moxie_reloc_map[i].moxie_reloc_val];
return NULL;
}
static reloc_howto_type *
moxie_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
{
unsigned int i;
for (i = 0;
i < sizeof (moxie_elf_howto_table) / sizeof (moxie_elf_howto_table[0]);
i++)
if (moxie_elf_howto_table[i].name != NULL
&& strcasecmp (moxie_elf_howto_table[i].name, r_name) == 0)
return &moxie_elf_howto_table[i];
return NULL;
}
/* Set the howto pointer for an MOXIE ELF reloc. */
static void
moxie_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_MOXIE_max);
cache_ptr->howto = & moxie_elf_howto_table [r_type];
}
/* Perform a single relocation. By default we use the standard BFD
routines, but a few relocs, we have to do them ourselves. */
static bfd_reloc_status_type
moxie_final_link_relocate (reloc_howto_type *howto,
bfd *input_bfd,
asection *input_section,
bfd_byte *contents,
Elf_Internal_Rela *rel,
bfd_vma relocation)
{
bfd_reloc_status_type r = bfd_reloc_ok;
switch (howto->type)
{
default:
r = _bfd_final_link_relocate (howto, input_bfd, input_section,
contents, rel->r_offset,
relocation, rel->r_addend);
}
return r;
}
/* Relocate an MOXIE 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
moxie_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 = moxie_elf_howto_table + ELF32_R_TYPE (rel->r_info);
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;
RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
r_symndx, symtab_hdr, sym_hashes,
h, sec, relocation,
unresolved_reloc, warned);
name = h->root.root.string;
}
if (sec != NULL && elf_discarded_section (sec))
{
/* For relocs against symbols from removed linkonce sections,
or sections discarded by a linker script, we just want the
section contents zeroed. Avoid any special processing. */
_bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
rel->r_info = 0;
rel->r_addend = 0;
continue;
}
if (info->relocatable)
continue;
r = moxie_final_link_relocate (howto, input_bfd, input_section,
contents, rel, relocation);
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;
}
/* Return the section that should be marked against GC for a given
relocation. */
static asection *
moxie_elf_gc_mark_hook (asection *sec,
struct bfd_link_info *info,
Elf_Internal_Rela *rel,
struct elf_link_hash_entry *h,
Elf_Internal_Sym *sym)
{
return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
}
/* Look through the relocs for a section during the first phase.
Since we don't do .gots or .plts, we just need to consider the
virtual table relocs for gc. */
static bfd_boolean
moxie_elf_check_relocs (bfd *abfd,
struct bfd_link_info *info,
asection *sec,
const Elf_Internal_Rela *relocs)
{
Elf_Internal_Shdr *symtab_hdr;
struct elf_link_hash_entry **sym_hashes;
const Elf_Internal_Rela *rel;
const Elf_Internal_Rela *rel_end;
if (info->relocatable)
return TRUE;
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
sym_hashes = elf_sym_hashes (abfd);
rel_end = relocs + sec->reloc_count;
for (rel = relocs; rel < rel_end; rel++)
{
struct elf_link_hash_entry *h;
unsigned long r_symndx;
r_symndx = ELF32_R_SYM (rel->r_info);
if (r_symndx < symtab_hdr->sh_info)
h = NULL;
else
{
h = sym_hashes[r_symndx - symtab_hdr->sh_info];
while (h->root.type == bfd_link_hash_indirect
|| h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
}
}
return TRUE;
}
#define ELF_ARCH bfd_arch_moxie
#define ELF_MACHINE_CODE EM_MOXIE
#define ELF_MAXPAGESIZE 0x1
#define TARGET_BIG_SYM bfd_elf32_moxie_vec
#define TARGET_BIG_NAME "elf32-moxie"
#define elf_info_to_howto_rel NULL
#define elf_info_to_howto moxie_info_to_howto_rela
#define elf_backend_relocate_section moxie_elf_relocate_section
#define elf_backend_gc_mark_hook moxie_elf_gc_mark_hook
#define elf_backend_check_relocs moxie_elf_check_relocs
#define elf_backend_can_gc_sections 1
#define elf_backend_rela_normal 1
#define bfd_elf32_bfd_reloc_type_lookup moxie_reloc_type_lookup
#define bfd_elf32_bfd_reloc_name_lookup moxie_reloc_name_lookup
#include "elf32-target.h"

View file

@ -589,6 +589,7 @@ extern const bfd_target bfd_elf32_dlx_big_vec;
extern const bfd_target bfd_elf32_fr30_vec;
extern const bfd_target bfd_elf32_frv_vec;
extern const bfd_target bfd_elf32_frvfdpic_vec;
extern const bfd_target bfd_elf32_moxie_vec;
extern const bfd_target bfd_elf32_h8300_vec;
extern const bfd_target bfd_elf32_hppa_linux_vec;
extern const bfd_target bfd_elf32_hppa_nbsd_vec;
@ -923,6 +924,7 @@ static const bfd_target * const _bfd_target_vector[] =
&bfd_elf32_fr30_vec,
&bfd_elf32_frv_vec,
&bfd_elf32_frvfdpic_vec,
&bfd_elf32_moxie_vec,
&bfd_elf32_h8300_vec,
&bfd_elf32_hppa_linux_vec,
&bfd_elf32_hppa_nbsd_vec,

View file

@ -1,3 +1,7 @@
2009-04-15 Anthony Green <green@moxielogic.com>
* MAINTAINERS: Add myself and Moxie port maintainer.
2009-04-14 Dave Korn <dave.korn.cygwin@gmail.com>
* objcopy.c (enum long_section_name_handling): New enum type.

View file

@ -92,6 +92,7 @@ responsibility among the other maintainers.
MAXQ Inderpreet Singh <inderpreetb@noida.hcltech.com>
MEP Dave Brolley <brolley@redhat.com>
MIPS Eric Christopher <echristo@apple.com>
Moxie Anthony Green <moxielogic.com>
MMIX Hans-Peter Nilsson <hp@bitrange.com>
MN10300 Eric Christopher <echristo@apple.com>
MN10300 Alexandre Oliva <aoliva@redhat.com>

6
configure vendored
View file

@ -2,7 +2,7 @@
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.59.
#
# Copyright (C) 2003 Free Software Foundation, Inc.
# Copyright (C) 2003, 2008 Free Software Foundation, Inc.
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## --------------------- ##
@ -2409,6 +2409,10 @@ case "${target}" in
frv-*-*)
noconfigdirs="$noconfigdirs ${libgcj}"
;;
moxie-*-*)
noconfigdirs="$noconfigdirs ${libgcj}"
noconfigdirs="$noconfigdirs gprof"
;;
h8300*-*-*)
noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
;;

View file

@ -644,6 +644,10 @@ case "${target}" in
frv-*-*)
noconfigdirs="$noconfigdirs ${libgcj}"
;;
moxie-*-*)
noconfigdirs="$noconfigdirs ${libgcj}"
noconfigdirs="$noconfigdirs gprof"
;;
h8300*-*-*)
noconfigdirs="$noconfigdirs target-libgloss ${libgcj}"
;;

View file

@ -1,3 +1,10 @@
2008-04-15 Anthony Green <green@moxielogic.com>
* config/tc-moxie.h: New file.
* config/tc-moxie.c: New file.
* configure: Add support for moxie.
* configure.tgt: Add support for moxie.
2009-04-16 Jan Beulich <jbeulich@novell.com>
* expr.c: Include limits.h if available, and #define CHAR_BITS

731
gas/config/tc-moxie.c Normal file
View file

@ -0,0 +1,731 @@
/* tc-moxie.c -- Assemble code for moxie
Copyright 2009
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@moxielogic.com>. */
#include "as.h"
#include "safe-ctype.h"
#include "opcode/moxie.h"
#include "elf/moxie.h"
extern const moxie_opc_info_t moxie_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;
const pseudo_typeS md_pseudo_table[] =
{
{0, 0, 0}
};
const char FLT_CHARS[] = "rRsSfFdDxXpP";
const char EXP_CHARS[] = "eE";
void
md_operand (expressionS *op __attribute__((unused)))
{
/* Empty for now. */
}
/* 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)
{
int count;
const moxie_opc_info_t *opcode;
opcode_hash_control = hash_new ();
/* Insert names into hash table. */
for (count = 0, opcode = moxie_form1_opc_info; count++ < 64; opcode++)
hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
for (count = 0, opcode = moxie_form2_opc_info; count++ < 4; opcode++)
hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
for (count = 0, opcode = moxie_form3_opc_info; count++ < 4; 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_register_operand (char **ptr)
{
int reg;
char *s = *ptr;
if (*s != '$')
{
as_bad ("expecting register");
ignore_rest_of_line ();
return -1;
}
if (s[1] == 'f' && s[2] == 'p')
{
*ptr += 3;
return 0;
}
if (s[1] == 's' && s[2] == 'p')
{
*ptr += 3;
return 1;
}
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)
{
int r2 = s[3] - '0';
if ((r2 >= 0) && (r2 <= 3))
{
reg = 10 + r2;
*ptr += 1;
}
}
}
else
{
as_bad ("illegal register number");
ignore_rest_of_line ();
return -1;
}
*ptr += 3;
return reg + 2;
}
/* 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;
moxie_opc_info_t *opcode;
char *p;
char pend;
unsigned short iword = 0;
int nlen = 0;
/* 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++)
nlen++;
pend = *op_end;
*op_end = 0;
if (nlen == 0)
as_bad (_("can't find opcode "));
opcode = (moxie_opc_info_t *) hash_find (opcode_hash_control, op_start);
*op_end = pend;
if (opcode == NULL)
{
as_bad (_("unknown opcode %s"), op_start);
return;
}
p = frag_more (2);
switch (opcode->itype)
{
case MOXIE_F2_A8V:
iword = (1<<15) | (opcode->opcode << 12);
while (ISSPACE (*op_end))
op_end++;
{
expressionS arg;
int reg;
reg = parse_register_operand (&op_end);
iword += (reg << 8);
if (*op_end != ',')
as_warn ("expecting comma delimeted register operands");
op_end++;
op_end = parse_exp_save_ilp (op_end, &arg);
fix_new_exp (frag_now,
((p+1) - frag_now->fr_literal),
1,
&arg,
0,
BFD_RELOC_8);
}
break;
case MOXIE_F1_AB:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
{
int dest, src;
dest = parse_register_operand (&op_end);
if (*op_end != ',')
as_warn ("expecting comma delimeted register operands");
op_end++;
src = parse_register_operand (&op_end);
iword += (dest << 4) + src;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
as_warn ("extra stuff on line ignored");
}
break;
case MOXIE_F1_A4:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
{
expressionS arg;
char *where;
int regnum;
regnum = parse_register_operand (&op_end);
while (ISSPACE (*op_end))
op_end++;
iword += (regnum << 4);
if (*op_end != ',')
{
as_bad ("expecting comma delimited operands");
ignore_rest_of_line ();
return;
}
op_end++;
op_end = parse_exp_save_ilp (op_end, &arg);
where = frag_more (4);
fix_new_exp (frag_now,
(where - frag_now->fr_literal),
4,
&arg,
0,
BFD_RELOC_32);
}
break;
case MOXIE_F1_4:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
{
expressionS arg;
char *where;
op_end = parse_exp_save_ilp (op_end, &arg);
where = frag_more (4);
fix_new_exp (frag_now,
(where - frag_now->fr_literal),
4,
&arg,
0,
BFD_RELOC_32);
}
break;
case MOXIE_F1_NARG:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
as_warn ("extra stuff on line ignored");
break;
case MOXIE_F1_A:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
{
int reg;
reg = parse_register_operand (&op_end);
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
as_warn ("extra stuff on line ignored");
iword += (reg << 4);
}
break;
case MOXIE_F1_ABi:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
{
int a, b;
a = parse_register_operand (&op_end);
if (*op_end != ',')
as_warn ("expecting comma delimeted register operands");
op_end++;
if (*op_end != '(')
{
as_bad ("expecting indirect register `($rA)'");
ignore_rest_of_line ();
return;
}
op_end++;
b = parse_register_operand (&op_end);
if (*op_end != ')')
{
as_bad ("missing closing parenthesis");
ignore_rest_of_line ();
return;
}
op_end++;
iword += (a << 4) + b;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
as_warn ("extra stuff on line ignored");
}
break;
case MOXIE_F1_AiB:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
{
int a, b;
if (*op_end != '(')
{
as_bad ("expecting indirect register `($rA)'");
ignore_rest_of_line ();
return;
}
op_end++;
a = parse_register_operand (&op_end);
if (*op_end != ')')
{
as_bad ("missing closing parenthesis");
ignore_rest_of_line ();
return;
}
op_end++;
if (*op_end != ',')
as_warn ("expecting comma delimeted register operands");
op_end++;
b = parse_register_operand (&op_end);
iword += (a << 4) + b;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
as_warn ("extra stuff on line ignored");
}
break;
case MOXIE_F1_4A:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
{
expressionS arg;
char *where;
int a;
op_end = parse_exp_save_ilp (op_end, &arg);
where = frag_more (4);
fix_new_exp (frag_now,
(where - frag_now->fr_literal),
4,
&arg,
0,
BFD_RELOC_32);
if (*op_end != ',')
{
as_bad ("expecting comma delimited operands");
ignore_rest_of_line ();
return;
}
op_end++;
a = parse_register_operand (&op_end);
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
as_warn ("extra stuff on line ignored");
iword += (a << 4);
}
break;
case MOXIE_F1_ABi4:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
{
expressionS arg;
char *offset;
int a, b;
a = parse_register_operand (&op_end);
while (ISSPACE (*op_end))
op_end++;
if (*op_end != ',')
{
as_bad ("expecting comma delimited operands");
ignore_rest_of_line ();
return;
}
op_end++;
op_end = parse_exp_save_ilp (op_end, &arg);
offset = frag_more (4);
fix_new_exp (frag_now,
(offset - frag_now->fr_literal),
4,
&arg,
0,
BFD_RELOC_32);
if (*op_end != '(')
{
as_bad ("expecting indirect register `($rX)'");
ignore_rest_of_line ();
return;
}
op_end++;
b = parse_register_operand (&op_end);
if (*op_end != ')')
{
as_bad ("missing closing parenthesis");
ignore_rest_of_line ();
return;
}
op_end++;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
as_warn ("extra stuff on line ignored");
iword += (a << 4) + b;
}
break;
case MOXIE_F1_AiB4:
iword = opcode->opcode << 8;
while (ISSPACE (*op_end))
op_end++;
{
expressionS arg;
char *offset;
int a, b;
op_end = parse_exp_save_ilp (op_end, &arg);
offset = frag_more (4);
fix_new_exp (frag_now,
(offset - frag_now->fr_literal),
4,
&arg,
0,
BFD_RELOC_32);
if (*op_end != '(')
{
as_bad ("expecting indirect register `($rX)'");
ignore_rest_of_line ();
return;
}
op_end++;
a = parse_register_operand (&op_end);
if (*op_end != ')')
{
as_bad ("missing closing parenthesis");
ignore_rest_of_line ();
return;
}
op_end++;
if (*op_end != ',')
{
as_bad ("expecting comma delimited operands");
ignore_rest_of_line ();
return;
}
op_end++;
b = parse_register_operand (&op_end);
while (ISSPACE (*op_end))
op_end++;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
as_warn ("extra stuff on line ignored");
iword += (a << 4) + b;
}
break;
case MOXIE_F2_NARG:
iword = opcode->opcode << 12;
while (ISSPACE (*op_end))
op_end++;
if (*op_end != 0)
as_warn ("extra stuff on line ignored");
break;
default:
abort();
}
md_number_to_chars (p, iword, 2);
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;
}
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)
{
}
/* 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 max, min;
int shift;
max = min = 0;
shift = 0;
switch (fixP->fx_r_type)
{
case BFD_RELOC_32:
*buf++ = val >> 24;
*buf++ = val >> 16;
*buf++ = val >> 8;
*buf++ = val >> 0;
break;
case BFD_RELOC_16:
*buf++ = val >> 8;
*buf++ = val >> 0;
break;
case BFD_RELOC_8:
*buf++ = val;
break;
default:
abort ();
}
if (max != 0 && (val < min || val > max))
as_bad_where (fixP->fx_file, fixP->fx_line, _("offset out of range"));
if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
fixP->fx_done = 1;
}
/* Put number into target byte order (big endian). */
void
md_number_to_chars (char *ptr, valueT use, int nbytes)
{
number_to_chars_bigendian (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:
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));
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;
/* This is the standard place for KLUDGEs to work around bugs in
bfd_install_relocation (first such note in the documentation
appears with binutils-2.8).
That function bfd_install_relocation does the wrong thing with
putting stuff into the addend of a reloc (it should stay out) for a
weak symbol. The really bad thing is that it adds the
"segment-relative offset" of the symbol into the reloc. In this
case, the reloc should instead be relative to the symbol with no
other offset than the assembly code shows; and since the symbol is
weak, any local definition should be ignored until link time (or
thereafter).
To wit: weaksym+42 should be weaksym+42 in the reloc,
not weaksym+(offset_from_segment_of_local_weaksym_definition)
To "work around" this, we subtract the segment-relative offset of
"known" weak symbols. This evens out the extra offset.
That happens for a.out but not for ELF, since for ELF,
bfd_install_relocation uses the "special function" field of the
howto, and does not execute the code that needs to be undone. */
if (OUTPUT_FLAVOR == bfd_target_aout_flavour
&& fixP->fx_addsy && S_IS_WEAK (fixP->fx_addsy)
&& ! bfd_is_und_section (S_GET_SEGMENT (fixP->fx_addsy)))
{
relP->addend -= S_GET_VALUE (fixP->fx_addsy);
}
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;
}
/* Decide from what point a pc-relative relocation is relative to,
relative to the pc-relative fixup. Er, relatively speaking. */
long
md_pcrel_from (fixS *fixP)
{
valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
fprintf (stderr, "md_pcrel_from 0x%d\n", fixP->fx_r_type);
switch (fixP->fx_r_type)
{
case BFD_RELOC_32:
return addr + 4;
default:
abort ();
return addr;
}
}

47
gas/config/tc-moxie.h Normal file
View file

@ -0,0 +1,47 @@
/* tc-moxie.h -- Header file for tc-moxie.c.
Copyright 2009 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. */
#define TC_MOXIE 1
#define TARGET_BYTES_BIG_ENDIAN 1
#define WORKING_DOT_WORD
/* This macro is the BFD target name to use when creating the output
file. This will normally depend upon the `OBJ_FMT' macro. */
#define TARGET_FORMAT "elf32-moxie"
/* This macro is the BFD architecture to pass to `bfd_set_arch_mach'. */
#define TARGET_ARCH bfd_arch_moxie
#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")), 0)
/* 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 *);
#define md_section_align(SEGMENT, SIZE) (SIZE)

View file

@ -148,6 +148,8 @@ case ${generic_target} in
frv-*-*linux*) fmt=elf em=linux;;
frv-*-*) fmt=elf ;;
moxie-*-*) fmt=elf ;;
hppa-*-linux*)
case ${cpu} in
hppa*64*) fmt=elf em=hppalinux64 ;;

View file

@ -259,6 +259,7 @@ extern int print_insn_mep (bfd_vma, disassemble_info *);
extern int print_insn_mmix (bfd_vma, disassemble_info *);
extern int print_insn_mn10200 (bfd_vma, disassemble_info *);
extern int print_insn_mn10300 (bfd_vma, disassemble_info *);
extern int print_insn_moxie (bfd_vma, disassemble_info *);
extern int print_insn_msp430 (bfd_vma, disassemble_info *);
extern int print_insn_mt (bfd_vma, disassemble_info *);
extern int print_insn_ns32k (bfd_vma, disassemble_info *);

View file

@ -1,3 +1,8 @@
2009-04-15 Anthony Green <green@moxielogic.com>
* common.h (EM_MOXIE): Define.
* moxie.h: New file.
2009-04-07 DJ Delorie <dj@redhat.com>
* mep.h (EF_MEP_CPU_C5): New.

View file

@ -339,6 +339,8 @@
#define EM_CYGNUS_MEP 0xF00D /* Toshiba MeP */
#define EM_MOXIE 0xFEED /* Moxie */
/* Old Sunplus S+core7 backend magic number. Written in the absence of an ABI. */
#define EM_SCORE_OLD 95

31
include/elf/moxie.h Normal file
View file

@ -0,0 +1,31 @@
/* moxie ELF support for BFD.
Copyright 2009 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 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. */
#ifndef _ELF_MOXIE_H
#define _ELF_MOXIE_H
#include "elf/reloc-macros.h"
/* Relocation types. */
START_RELOC_NUMBERS (elf_moxie_reloc_type)
RELOC_NUMBER (R_MOXIE_NONE, 0)
RELOC_NUMBER (R_MOXIE_32, 1)
END_RELOC_NUMBERS (R_MOXIE_max)
#endif /* _ELF_MOXIE_H */

View file

@ -1,3 +1,7 @@
2009-04-15 Anthony Green <green@moxielogic.com>
* moxie.h: Created.
2009-04-06 DJ Delorie <dj@redhat.com>
* h8300.h: Add relaxation attributes to MOVA opcodes.

68
include/opcode/moxie.h Normal file
View file

@ -0,0 +1,68 @@
/* Definitions for decoding the moxie opcode table.
Copyright 2009 Free Software Foundation, Inc.
Contributed by Anthony Green (green@moxielogic.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 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. */
/* Form 1 instructions come in different flavors:
Some have no arguments (MOXIE_F1_NARG)
Some only use the A operand (MOXIE_F1_A)
Some use A and B registers (MOXIE_F1_AB)
Some use A and consume a 4 byte immediate value (MOXIE_F1_A4)
Some use just a 4 byte immediate value (MOXIE_F1_4)
Some use B and an indirect A (MOXIE_F1_AiB)
Some use A and an indirect B (MOXIE_F1_ABi)
Some consume a 4 byte immediate value and use X (MOXIE_F1_4A)
Some use B and an indirect A plus 4 bytes (MOXIE_F1_AiB4)
Some use A and an indirect B plus 4 bytes (MOXIE_F1_ABi4)
Form 2 instructions also come in different flavors:
Some have no arguments (MOXIE_F2_NARG)
Some use the A register and an 8-bit value (MOXIE_F2_A8V)
Form 3 instructions also come in different flavors:
Some have no arguments (MOXIE_F3_NARG). */
#define MOXIE_F1_NARG 0x100
#define MOXIE_F1_A 0x101
#define MOXIE_F1_AB 0x102
/* #define MOXIE_F1_ABC 0x103 */
#define MOXIE_F1_A4 0x104
#define MOXIE_F1_4 0x105
#define MOXIE_F1_AiB 0x106
#define MOXIE_F1_ABi 0x107
#define MOXIE_F1_4A 0x108
#define MOXIE_F1_AiB4 0x109
#define MOXIE_F1_ABi4 0x10a
#define MOXIE_F2_NARG 0x200
#define MOXIE_F2_A8V 0x201
#define MOXIE_F3_NARG 0x300
typedef struct moxie_opc_info_t
{
short opcode;
unsigned itype;
const char * name;
} moxie_opc_info_t;
extern const moxie_opc_info_t moxie_form1_opc_info[64];
extern const moxie_opc_info_t moxie_form2_opc_info[4];
extern const moxie_opc_info_t moxie_form3_opc_info[4];

View file

@ -1,3 +1,11 @@
2009-04-15 Anthony Green <green@moxielogic.com>
* configure.tgt: Add moxie support.
* Makefile.am: Add moxie files.
* Makefile.in: Rebuilt.
* emulparams/elf32moxie.sh: New file.
* scripttempl/moxie.sc: New file.
2009-04-15 Kazu Hirata <kazu@codesourcery.com>
* ldlang.c: Do not include limits.h.

View file

@ -176,6 +176,7 @@ ALL_EMULATIONS = \
eelf32elmipvxworks.o \
eelf32fr30.o \
eelf32frv.o \
eelf32moxie.o \
eelf32i370.o \
eelf32ip2k.o \
eelf32iq2000.o \
@ -727,6 +728,9 @@ eelf32frvfd.c: $(srcdir)/emulparams/elf32frvfd.sh \
$(srcdir)/emulparams/elf32frv.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf32frvfd "$(tdir_frv)"
eelf32moxie.c: $(srcdir)/emulparams/elf32moxie.sh \
$(ELF_GEN_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf32moxie "$(tdir_moxie)"
eelf32mcore.c: $(srcdir)/emulparams/elf32mcore.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf32mcore "$(tdir_mcore)"

View file

@ -441,6 +441,7 @@ ALL_EMULATIONS = \
eelf32elmipvxworks.o \
eelf32fr30.o \
eelf32frv.o \
eelf32moxie.o \
eelf32i370.o \
eelf32ip2k.o \
eelf32iq2000.o \
@ -1574,6 +1575,9 @@ eelf32frvfd.c: $(srcdir)/emulparams/elf32frvfd.sh \
$(srcdir)/emulparams/elf32frv.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf32frvfd "$(tdir_frv)"
eelf32moxie.c: $(srcdir)/emulparams/elf32moxie.sh \
$(ELF_GEN_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf32moxie "$(tdir_moxie)"
eelf32mcore.c: $(srcdir)/emulparams/elf32mcore.sh \
$(ELF_DEPS) $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
${GENSCRIPTS} elf32mcore "$(tdir_mcore)"

View file

@ -152,6 +152,8 @@ fr30-*-*) targ_emul=elf32fr30
frv-*-*linux*) targ_emul=elf32frvfd ;;
frv-*-*) targ_emul=elf32frv ; targ_extra_emuls="elf32frvfd"
;;
moxie-*-*) targ_emul=elf32moxie
;;
h8300-*-hms* | h8300-*-coff* | h8300-*-rtemscoff*)
targ_emul=h8300; targ_extra_emuls="h8300h h8300s h8300hn h8300sn h8300sx h8300sxn" ;;
h8300-*-elf* | h8300-*-rtems*)

View file

@ -0,0 +1,8 @@
SCRIPT_NAME=elf
TEMPLATE_NAME=generic
EXTRA_EM_FILE=genelf
OUTPUT_FORMAT="elf32-moxie"
TEXT_START_ADDR=0x1000
MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
ARCH=moxie
STACK_ADDR=0x200000

52
ld/scripttempl/moxie.sc Normal file
View file

@ -0,0 +1,52 @@
TORS=".tors :
{
___ctors = . ;
*(.ctors)
___ctors_end = . ;
___dtors = . ;
*(.dtors)
___dtors_end = . ;
} > ram"
cat <<EOF
OUTPUT_FORMAT("${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
SECTIONS
{
.text :
{
*(.text)
.init : { KEEP (*(.init)) } =0
.fini : { KEEP (*(.fini)) } =0
*(.strings)
${RELOCATING+ _etext = . ; }
} ${RELOCATING+ > ram}
${CONSTRUCTING+${TORS}}
.data :
{
*(.data)
${RELOCATING+ _edata = . ; }
} ${RELOCATING+ > ram}
.bss :
{
${RELOCATING+ _bss_start = . ; }
*(.bss)
*(COMMON)
${RELOCATING+ _end = . ; }
} ${RELOCATING+ > ram}
.stack ${RELOCATING+ 0x30000 } :
{
${RELOCATING+ _stack = . ; }
*(.stack)
} ${RELOCATING+ > ram}
.stab 0 ${RELOCATING+(NOLOAD)} :
{
*(.stab)
}
.stabstr 0 ${RELOCATING+(NOLOAD)} :
{
*(.stabstr)
}
}
EOF

View file

@ -1,3 +1,12 @@
2009-04-15 Anthony Green <green@moxielogic.com>
* moxie-opc.c, moxie-dis.c: Created.
* Makefile.am: Build the moxie source files.
* configure.in: Add moxie support.
* Makefile.in, configure: Rebuilt.
* disassemble.c (disassembler): Add moxie support.
(ARCH_moxie): Define.
2009-04-15 Jan Beulich <jbeulich@novell.com>
* i386-opc.tbl (protb, protw, protd, protq): Set opcode

View file

@ -98,6 +98,8 @@ CFILES = \
frv-dis.c \
frv-ibld.c \
frv-opc.c \
moxie-dis.c \
moxie-opc.c \
h8300-dis.c \
h8500-dis.c \
hppa-dis.c \
@ -256,6 +258,8 @@ ALL_MACHINES = \
frv-dis.lo \
frv-ibld.lo \
frv-opc.lo \
moxie-dis.lo \
moxie-opc.lo \
h8300-dis.lo \
h8500-dis.lo \
hppa-dis.lo \
@ -790,6 +794,11 @@ frv-opc.lo: frv-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
$(BFD_H) $(INCDIR)/symcat.h frv-desc.h $(INCDIR)/opcode/cgen-bitset.h \
$(INCDIR)/opcode/cgen.h frv-opc.h $(INCDIR)/libiberty.h \
$(INCDIR)/elf/frv.h $(INCDIR)/elf/reloc-macros.h
moxie-dis.lo: moxie-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
$(INCDIR)/opcode/moxie.h $(INCDIR)/dis-asm.h $(BFD_H) \
$(INCDIR)/ansidecl.h $(INCDIR)/symcat.h
moxie-opc.lo: moxie-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
$(INCDIR)/opcode/moxie.h
h8300-dis.lo: h8300-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
$(INCDIR)/opcode/h8300.h $(INCDIR)/dis-asm.h $(BFD_H) \
$(INCDIR)/symcat.h opintl.h $(INCDIR)/libiberty.h

View file

@ -337,6 +337,8 @@ CFILES = \
frv-dis.c \
frv-ibld.c \
frv-opc.c \
moxie-dis.c \
moxie-opc.c \
h8300-dis.c \
h8500-dis.c \
hppa-dis.c \
@ -495,6 +497,8 @@ ALL_MACHINES = \
frv-dis.lo \
frv-ibld.lo \
frv-opc.lo \
moxie-dis.lo \
moxie-opc.lo \
h8300-dis.lo \
h8500-dis.lo \
hppa-dis.lo \
@ -1355,6 +1359,11 @@ frv-opc.lo: frv-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
$(BFD_H) $(INCDIR)/symcat.h frv-desc.h $(INCDIR)/opcode/cgen-bitset.h \
$(INCDIR)/opcode/cgen.h frv-opc.h $(INCDIR)/libiberty.h \
$(INCDIR)/elf/frv.h $(INCDIR)/elf/reloc-macros.h
moxie-dis.lo: moxie-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
$(INCDIR)/opcode/moxie.h $(INCDIR)/dis-asm.h $(BFD_H) \
$(INCDIR)/ansidecl.h $(INCDIR)/symcat.h
moxie-opc.lo: moxie-opc.c sysdep.h config.h $(INCDIR)/ansidecl.h \
$(INCDIR)/opcode/moxie.h
h8300-dis.lo: h8300-dis.c sysdep.h config.h $(INCDIR)/ansidecl.h \
$(INCDIR)/opcode/h8300.h $(INCDIR)/dis-asm.h $(BFD_H) \
$(INCDIR)/symcat.h opintl.h $(INCDIR)/libiberty.h

1
opcodes/configure vendored
View file

@ -12765,6 +12765,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_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" ;;
bfd_hppa_arch) ta="$ta hppa-dis.lo" ;;

View file

@ -216,6 +216,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_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" ;;
bfd_hppa_arch) ta="$ta hppa-dis.lo" ;;

184
opcodes/moxie-dis.c Normal file
View file

@ -0,0 +1,184 @@
/* Disassemble moxie instructions.
Copyright 2009
Free Software Foundation, Inc.
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 <stdio.h>
#include "sysdep.h"
#define STATIC_TABLE
#define DEFINE_TABLE
#include "opcode/moxie.h"
#include "dis-asm.h"
static fprintf_ftype fpr;
static void *stream;
/* Macros to extract operands from the instruction word. */
#define OP_A(i) ((i >> 4) & 0xf)
#define OP_B(i) (i & 0xf)
static const char * reg_names[16] =
{ "$fp", "$sp", "$r0", "$r1", "$r2", "$r3", "$r4", "$r5",
"$r6", "$r7", "$r8", "$r9", "$r10", "$r11", "$r12", "$r13" };
int
print_insn_moxie (bfd_vma addr, struct disassemble_info * info)
{
int length = 2;
int status;
stream = info->stream;
const moxie_opc_info_t * opcode;
bfd_byte buffer[4];
unsigned short iword;
fpr = info->fprintf_func;
if ((status = info->read_memory_func (addr, buffer, 2, info)))
goto fail;
iword = bfd_getb16 (buffer);
/* Form 1 instructions have the high bit set to 0. */
if ((iword & (1<<15)) == 0)
{
/* Extract the Form 1 opcode. */
opcode = &moxie_form1_opc_info[iword >> 8];
switch (opcode->itype)
{
case MOXIE_F1_NARG:
fpr (stream, "%s", opcode->name);
break;
case MOXIE_F1_A:
fpr (stream, "%s\t%s", opcode->name,
reg_names[OP_A(iword)]);
break;
case MOXIE_F1_AB:
fpr (stream, "%s\t%s, %s", opcode->name,
reg_names[OP_A(iword)],
reg_names[OP_B(iword)]);
break;
case MOXIE_F1_A4:
{
unsigned imm;
if ((status = info->read_memory_func (addr + 2, buffer, 4, info)))
goto fail;
imm = bfd_getb32 (buffer);
fpr (stream, "%s\t%s, 0x%x", opcode->name,
reg_names[OP_A(iword)], imm);
length = 6;
}
break;
case MOXIE_F1_4:
{
unsigned imm;
if ((status = info->read_memory_func (addr + 2, buffer, 4, info)))
goto fail;
imm = bfd_getb32 (buffer);
fpr (stream, "%s\t0x%x", opcode->name, imm);
length = 6;
}
break;
case MOXIE_F1_AiB:
fpr (stream, "%s\t(%s), %s", opcode->name,
reg_names[OP_A(iword)], reg_names[OP_B(iword)]);
break;
case MOXIE_F1_ABi:
fpr (stream, "%s\t%s, (%s)", opcode->name,
reg_names[OP_A(iword)], reg_names[OP_B(iword)]);
break;
case MOXIE_F1_4A:
{
unsigned imm;
if ((status = info->read_memory_func (addr + 2, buffer, 4, info)))
goto fail;
imm = bfd_getb32 (buffer);
fpr (stream, "%s\t0x%x, %s",
opcode->name, imm, reg_names[OP_A(iword)]);
length = 6;
}
break;
case MOXIE_F1_AiB4:
{
unsigned imm;
if ((status = info->read_memory_func (addr+2, buffer, 4, info)))
goto fail;
imm = bfd_getb32 (buffer);
fpr (stream, "%s\t0x%x(%s), %s", opcode->name,
imm,
reg_names[OP_A(iword)],
reg_names[OP_B(iword)]);
length = 6;
}
break;
case MOXIE_F1_ABi4:
{
unsigned imm;
if ((status = info->read_memory_func (addr+2, buffer, 4, info)))
goto fail;
imm = bfd_getb32 (buffer);
fpr (stream, "%s\t%s, 0x%x(%s)",
opcode->name,
reg_names[OP_A(iword)],
imm,
reg_names[OP_B(iword)]);
length = 6;
}
break;
default:
abort ();
}
}
else if ((iword & (1<<14)) == 0)
{
/* Extract the Form 2 opcode. */
opcode = &moxie_form2_opc_info[(iword >> 12) & 3];
switch (opcode->itype)
{
case MOXIE_F2_A8V:
fpr (stream, "%s\t%s, 0x%x",
opcode->name,
reg_names[(iword >> 8) & 0xf],
iword & ((1 << 8) - 1));
break;
case MOXIE_F2_NARG:
fpr (stream, "%s", opcode->name);
break;
default:
abort();
}
}
else
{
/* Extract the Form 3 opcode. */
opcode = &moxie_form2_opc_info[(iword >> 12) & 3];
switch (opcode->itype)
{
case MOXIE_F3_NARG:
fpr (stream, "%s", opcode->name);
break;
default:
abort();
}
}
return length;
fail:
info->memory_error_func (status, addr, info);
return -1;
}

136
opcodes/moxie-opc.c Normal file
View file

@ -0,0 +1,136 @@
/* moxie-opc.c -- Definitions for moxie opcodes.
Copyright 2009 Free Software Foundation, Inc.
Contributed by Anthony Green (green@moxielogic.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/moxie.h"
/* The moxie processor's 16-bit instructions come in two forms:
FORM 1 instructions start with a 0 bit...
0oooooooaaaabbbb
0 F
ooooooo - form 1 opcode number
aaaa - operand A
bbbb - operand B
FORM 2 instructions start with bits "10"...
10ooaaaavvvvvvvv
0 F
oo - form 2 opcode number
aaaa - operand A
vvvvvvvv - 8-bit immediate value
FORM 3 instructions start with a bits "11"...
11oovvvvvvvvvvvv
0 F
oo - form 3 opcode number
vvvvvvvvvvvv - 12-bit immediate value. */
const moxie_opc_info_t moxie_form1_opc_info[64] =
{
{ 0x00, MOXIE_F1_NARG, "nop" },
{ 0x01, MOXIE_F1_A4, "ldi.l" },
{ 0x02, MOXIE_F1_AB, "mov" },
{ 0x03, MOXIE_F1_4, "jsra" },
{ 0x04, MOXIE_F1_NARG, "ret" },
{ 0x05, MOXIE_F1_AB, "add.l" },
{ 0x06, MOXIE_F1_AB, "push" },
{ 0x07, MOXIE_F1_AB, "pop" },
{ 0x08, MOXIE_F1_A4, "lda.l" },
{ 0x09, MOXIE_F1_4A, "sta.l" },
{ 0x0a, MOXIE_F1_ABi, "ld.l" },
{ 0x0b, MOXIE_F1_AiB, "st.l" },
{ 0x0c, MOXIE_F1_ABi4, "ldo.l" },
{ 0x0d, MOXIE_F1_AiB4, "sto.l" },
{ 0x0e, MOXIE_F1_AB, "cmp" },
{ 0x0f, MOXIE_F1_4, "beq" },
{ 0x10, MOXIE_F1_4, "bne" },
{ 0x11, MOXIE_F1_4, "blt" },
{ 0x12, MOXIE_F1_4, "bgt" },
{ 0x13, MOXIE_F1_4, "bltu" },
{ 0x14, MOXIE_F1_4, "bgtu" },
{ 0x15, MOXIE_F1_4, "bge" },
{ 0x16, MOXIE_F1_4, "ble" },
{ 0x17, MOXIE_F1_4, "bgeu" },
{ 0x18, MOXIE_F1_4, "bleu" },
{ 0x19, MOXIE_F1_A, "jsr" },
{ 0x1a, MOXIE_F1_4, "jmpa" },
{ 0x1b, MOXIE_F1_A4, "ldi.b" },
{ 0x1c, MOXIE_F1_ABi, "ld.b" },
{ 0x1d, MOXIE_F1_A4, "lda.b" },
{ 0x1e, MOXIE_F1_AiB, "st.b" },
{ 0x1f, MOXIE_F1_4A, "sta.b" },
{ 0x20, MOXIE_F1_A4, "ldi.s" },
{ 0x21, MOXIE_F1_ABi, "ld.s" },
{ 0x22, MOXIE_F1_A4, "lda.s" },
{ 0x23, MOXIE_F1_AiB, "st.s" },
{ 0x24, MOXIE_F1_4A, "sta.s" },
{ 0x25, MOXIE_F1_A, "jmp" },
{ 0x26, MOXIE_F1_AB, "and" },
{ 0x27, MOXIE_F1_AB, "lshr" },
{ 0x28, MOXIE_F1_AB, "ashl" },
{ 0x29, MOXIE_F1_AB, "sub.l" },
{ 0x2a, MOXIE_F1_AB, "neg" },
{ 0x2b, MOXIE_F1_AB, "or" },
{ 0x2c, MOXIE_F1_AB, "not" },
{ 0x2d, MOXIE_F1_AB, "ashr" },
{ 0x2e, MOXIE_F1_AB, "xor" },
{ 0x2f, MOXIE_F1_AB, "mul.l" },
{ 0x30, MOXIE_F1_4, "swi" },
{ 0x31, MOXIE_F1_AB, "div.l" },
{ 0x32, MOXIE_F1_AB, "udiv.l" },
{ 0x33, MOXIE_F1_AB, "mod.l" },
{ 0x34, MOXIE_F1_AB, "umod.l" },
{ 0x35, MOXIE_F1_NARG, "brk" },
{ 0x36, MOXIE_F1_ABi4, "ldo.b" },
{ 0x37, MOXIE_F1_AiB4, "sto.b" },
{ 0x38, MOXIE_F1_ABi4, "ldo.s" },
{ 0x39, MOXIE_F1_AiB4, "sto.s" },
{ 0x3a, MOXIE_F1_NARG, "bad" },
{ 0x3b, MOXIE_F1_NARG, "bad" },
{ 0x3c, MOXIE_F1_NARG, "bad" },
{ 0x3d, MOXIE_F1_NARG, "bad" },
{ 0x3e, MOXIE_F1_NARG, "bad" },
{ 0x3f, MOXIE_F1_NARG, "bad" }
};
const moxie_opc_info_t moxie_form2_opc_info[4] =
{
{ 0x00, MOXIE_F2_A8V, "inc" },
{ 0x01, MOXIE_F2_A8V, "dec" },
{ 0x02, MOXIE_F2_A8V, "gsr" },
{ 0x03, MOXIE_F2_A8V, "ssr" }
};
const moxie_opc_info_t moxie_form3_opc_info[4] =
{
{ 0x00, MOXIE_F2_NARG, "bad" },
{ 0x01, MOXIE_F2_NARG, "bad" },
{ 0x02, MOXIE_F2_NARG, "bad" },
{ 0x03, MOXIE_F2_NARG, "bad" }
};