Fixes for iWMMXt contribution.
This commit is contained in:
parent
49634642a5
commit
5a6c681789
@ -1,3 +1,27 @@
|
|||||||
|
2003-04-01 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* archures.c (bfd_mach_arm_unknown): Define.
|
||||||
|
* bfd-in.h (bfd_arm_merge_machines, bfd_arm+update_notes,
|
||||||
|
bfd_arm_get_mach_from_notes): Prototype.
|
||||||
|
* bfd-in2.h: Regenerate.
|
||||||
|
* coff-arm.c (coff_arm_merge_private_bfd_data): Call
|
||||||
|
bfd_arm_merge_machines.
|
||||||
|
(coff_arm_final_link_postscript): Call bfd_arm_update_notes.
|
||||||
|
* coffcode.h (coff_set_arch_mach_hook): Call
|
||||||
|
bfd_arm_get_mach_from_notes.
|
||||||
|
* coffgen.c (coff_real_object_p): Revert previous delta.
|
||||||
|
* cpu_arm.c (arm_check_note): New function. Examine a note in a
|
||||||
|
.note section.
|
||||||
|
(bfd_arm_merge_machines): New function: Handle the merging of ARM
|
||||||
|
binaries compiled for different architectures..
|
||||||
|
(bfd_arm_update_notes): New function: Update an ARM note section.
|
||||||
|
(bfd_arm_get_mach_from_notes): New function: Extract a bfd machine
|
||||||
|
number from an ARM note section.
|
||||||
|
* elf32-arm.h (elf32_arm_object_p): Use
|
||||||
|
bfd_arm_get_mach_from_notes.
|
||||||
|
(elf32_arm_merge_private_bfd_data): Use bfd_arm_merge_machines.
|
||||||
|
(elf32_arm_final_write_processing): Use bfd_arm_update_notes.
|
||||||
|
|
||||||
2003-04-01 Ben Elliston <bje@wasabisystems.com>
|
2003-04-01 Ben Elliston <bje@wasabisystems.com>
|
||||||
|
|
||||||
* dwarf2.c (read_attribute_value): Correct typo in comment.
|
* dwarf2.c (read_attribute_value): Correct typo in comment.
|
||||||
|
@ -224,6 +224,7 @@ DESCRIPTION
|
|||||||
.#define bfd_mach_alpha_ev5 0x20
|
.#define bfd_mach_alpha_ev5 0x20
|
||||||
.#define bfd_mach_alpha_ev6 0x30
|
.#define bfd_mach_alpha_ev6 0x30
|
||||||
. bfd_arch_arm, {* Advanced Risc Machines ARM. *}
|
. bfd_arch_arm, {* Advanced Risc Machines ARM. *}
|
||||||
|
.#define bfd_mach_arm_unknown 0
|
||||||
.#define bfd_mach_arm_2 1
|
.#define bfd_mach_arm_2 1
|
||||||
.#define bfd_mach_arm_2a 2
|
.#define bfd_mach_arm_2a 2
|
||||||
.#define bfd_mach_arm_3 3
|
.#define bfd_mach_arm_3 3
|
||||||
|
10
bfd/bfd-in.h
10
bfd/bfd-in.h
@ -835,6 +835,16 @@ extern bfd_boolean bfd_elf32_arm_get_bfd_for_interworking
|
|||||||
extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd
|
extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd
|
||||||
PARAMS ((bfd *, struct bfd_link_info *));
|
PARAMS ((bfd *, struct bfd_link_info *));
|
||||||
|
|
||||||
|
/* ARM Note section processing. */
|
||||||
|
extern bfd_boolean bfd_arm_merge_machines
|
||||||
|
PARAMS ((bfd *, bfd *));
|
||||||
|
|
||||||
|
extern bfd_boolean bfd_arm_update_notes
|
||||||
|
PARAMS ((bfd *, const char *));
|
||||||
|
|
||||||
|
extern unsigned int bfd_arm_get_mach_from_notes
|
||||||
|
PARAMS ((bfd *, const char *));
|
||||||
|
|
||||||
/* TI COFF load page support. */
|
/* TI COFF load page support. */
|
||||||
extern void bfd_ticoff_set_section_load_page
|
extern void bfd_ticoff_set_section_load_page
|
||||||
PARAMS ((struct sec *, int));
|
PARAMS ((struct sec *, int));
|
||||||
|
@ -842,6 +842,16 @@ extern bfd_boolean bfd_elf32_arm_get_bfd_for_interworking
|
|||||||
extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd
|
extern bfd_boolean bfd_elf32_arm_add_glue_sections_to_bfd
|
||||||
PARAMS ((bfd *, struct bfd_link_info *));
|
PARAMS ((bfd *, struct bfd_link_info *));
|
||||||
|
|
||||||
|
/* ARM Note section processing. */
|
||||||
|
extern bfd_boolean bfd_arm_merge_machines
|
||||||
|
PARAMS ((bfd *, bfd *));
|
||||||
|
|
||||||
|
extern bfd_boolean bfd_arm_update_notes
|
||||||
|
PARAMS ((bfd *, const char *));
|
||||||
|
|
||||||
|
extern unsigned int bfd_arm_get_mach_from_notes
|
||||||
|
PARAMS ((bfd *, const char *));
|
||||||
|
|
||||||
/* TI COFF load page support. */
|
/* TI COFF load page support. */
|
||||||
extern void bfd_ticoff_set_section_load_page
|
extern void bfd_ticoff_set_section_load_page
|
||||||
PARAMS ((struct sec *, int));
|
PARAMS ((struct sec *, int));
|
||||||
@ -1680,6 +1690,7 @@ enum bfd_architecture
|
|||||||
#define bfd_mach_alpha_ev5 0x20
|
#define bfd_mach_alpha_ev5 0x20
|
||||||
#define bfd_mach_alpha_ev6 0x30
|
#define bfd_mach_alpha_ev6 0x30
|
||||||
bfd_arch_arm, /* Advanced Risc Machines ARM. */
|
bfd_arch_arm, /* Advanced Risc Machines ARM. */
|
||||||
|
#define bfd_mach_arm_unknown 0
|
||||||
#define bfd_mach_arm_2 1
|
#define bfd_mach_arm_2 1
|
||||||
#define bfd_mach_arm_2a 2
|
#define bfd_mach_arm_2a 2
|
||||||
#define bfd_mach_arm_3 3
|
#define bfd_mach_arm_3 3
|
||||||
|
@ -2240,25 +2240,6 @@ coff_arm_merge_private_bfd_data (ibfd, obfd)
|
|||||||
if (ibfd == obfd)
|
if (ibfd == obfd)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (bfd_get_mach (obfd) && bfd_get_mach (obfd) != bfd_get_mach (ibfd))
|
|
||||||
{
|
|
||||||
/* For now, allow an output file type of 'xscale' if the
|
|
||||||
input file type is 'iWMMXt'. This means that we will
|
|
||||||
not have to build an entire iWMMXt enabled set of libraries
|
|
||||||
just to test a iWMMXt enabled binary. Change the output
|
|
||||||
type to iWMMXt though. Similarly allow 'xscale' binaries
|
|
||||||
to be linked into a 'iWMMXt' output binary. */
|
|
||||||
if ( bfd_get_mach (obfd) == bfd_mach_arm_XScale
|
|
||||||
&& bfd_get_mach (ibfd) == bfd_mach_arm_iWMMXt)
|
|
||||||
bfd_set_arch_mach (obfd, bfd_get_arch (obfd), bfd_mach_arm_iWMMXt);
|
|
||||||
else if ( bfd_get_mach (ibfd) != bfd_mach_arm_XScale
|
|
||||||
|| bfd_get_mach (obfd) != bfd_mach_arm_iWMMXt)
|
|
||||||
{
|
|
||||||
bfd_set_error (bfd_error_wrong_format);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the two formats are different we cannot merge anything.
|
/* If the two formats are different we cannot merge anything.
|
||||||
This is not an error, since it is permissable to change the
|
This is not an error, since it is permissable to change the
|
||||||
input and output formats. */
|
input and output formats. */
|
||||||
@ -2266,7 +2247,12 @@ coff_arm_merge_private_bfd_data (ibfd, obfd)
|
|||||||
|| obfd->xvec->flavour != bfd_target_coff_flavour)
|
|| obfd->xvec->flavour != bfd_target_coff_flavour)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* Verify that the APCS is the same for the two BFDs */
|
/* Determine what should happen if the input ARM architecture
|
||||||
|
does not match the output ARM architecture. */
|
||||||
|
if (! bfd_arm_merge_machines (ibfd, obfd))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* Verify that the APCS is the same for the two BFDs. */
|
||||||
if (APCS_SET (ibfd))
|
if (APCS_SET (ibfd))
|
||||||
{
|
{
|
||||||
if (APCS_SET (obfd))
|
if (APCS_SET (obfd))
|
||||||
@ -2603,45 +2589,7 @@ coff_arm_final_link_postscript (abfd, pfinfo)
|
|||||||
globals->bfd_of_glue_owner->output_has_begun = TRUE;
|
globals->bfd_of_glue_owner->output_has_begun = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
return bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
|
||||||
asection * arm_arch_section;
|
|
||||||
|
|
||||||
/* Look for a .note section. If one is present check
|
|
||||||
the machine number encoded in it, and set it to the current
|
|
||||||
machine number if it is different. This allows XScale and
|
|
||||||
iWMMXt binaries to be merged and the resulting output to be set
|
|
||||||
to iWMMXt, even if the first input file had an XScale .note. */
|
|
||||||
|
|
||||||
arm_arch_section = bfd_get_section_by_name (abfd, ".note");
|
|
||||||
|
|
||||||
if (arm_arch_section != NULL)
|
|
||||||
{
|
|
||||||
char buffer [4];
|
|
||||||
|
|
||||||
if (bfd_get_section_contents (abfd, arm_arch_section, buffer,
|
|
||||||
(file_ptr) 0, sizeof buffer))
|
|
||||||
{
|
|
||||||
unsigned long arm_mach;
|
|
||||||
|
|
||||||
/* We have to extract the value this way to allow for a
|
|
||||||
host whose endian-ness is different from the target. */
|
|
||||||
arm_mach = bfd_get_32 (abfd, buffer);
|
|
||||||
|
|
||||||
if (arm_mach != bfd_get_mach (abfd))
|
|
||||||
{
|
|
||||||
bfd_put_32 (abfd, bfd_get_mach (abfd), buffer);
|
|
||||||
|
|
||||||
if (! bfd_set_section_contents (abfd, arm_arch_section, buffer,
|
|
||||||
(file_ptr) 0, sizeof buffer))
|
|
||||||
(*_bfd_error_handler)
|
|
||||||
(_("warning: unable to update contents of .note section in %s"),
|
|
||||||
bfd_get_filename (abfd));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "coffcode.h"
|
#include "coffcode.h"
|
||||||
|
@ -1883,43 +1883,26 @@ coff_set_arch_mach_hook (abfd, filehdr)
|
|||||||
case ARMPEMAGIC:
|
case ARMPEMAGIC:
|
||||||
case THUMBPEMAGIC:
|
case THUMBPEMAGIC:
|
||||||
arch = bfd_arch_arm;
|
arch = bfd_arch_arm;
|
||||||
switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
|
machine = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
|
||||||
|
if (machine == bfd_mach_arm_unknown)
|
||||||
{
|
{
|
||||||
case F_ARM_2: machine = bfd_mach_arm_2; break;
|
switch (internal_f->f_flags & F_ARM_ARCHITECTURE_MASK)
|
||||||
case F_ARM_2a: machine = bfd_mach_arm_2a; break;
|
{
|
||||||
case F_ARM_3: machine = bfd_mach_arm_3; break;
|
case F_ARM_2: machine = bfd_mach_arm_2; break;
|
||||||
default:
|
case F_ARM_2a: machine = bfd_mach_arm_2a; break;
|
||||||
case F_ARM_3M: machine = bfd_mach_arm_3M; break;
|
case F_ARM_3: machine = bfd_mach_arm_3; break;
|
||||||
case F_ARM_4: machine = bfd_mach_arm_4; break;
|
default:
|
||||||
case F_ARM_4T: machine = bfd_mach_arm_4T; break;
|
case F_ARM_3M: machine = bfd_mach_arm_3M; break;
|
||||||
/* The COFF header does not have enough bits available
|
case F_ARM_4: machine = bfd_mach_arm_4; break;
|
||||||
to cover all the different ARM architectures. So
|
case F_ARM_4T: machine = bfd_mach_arm_4T; break;
|
||||||
we interpret F_ARM_5, the highest flag value to mean
|
/* The COFF header does not have enough bits available
|
||||||
"the highest ARM architecture known to BFD" which is
|
to cover all the different ARM architectures. So
|
||||||
currently the XScale. */
|
we interpret F_ARM_5, the highest flag value to mean
|
||||||
case F_ARM_5: machine = bfd_mach_arm_XScale; break;
|
"the highest ARM architecture known to BFD" which is
|
||||||
|
currently the XScale. */
|
||||||
|
case F_ARM_5: machine = bfd_mach_arm_XScale; break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
asection * arm_arch_section;
|
|
||||||
|
|
||||||
arm_arch_section = bfd_get_section_by_name (abfd, ".note");
|
|
||||||
|
|
||||||
if (arm_arch_section)
|
|
||||||
{
|
|
||||||
bfd_byte buffer [4];
|
|
||||||
|
|
||||||
if (! bfd_get_section_contents (abfd, arm_arch_section, buffer,
|
|
||||||
(file_ptr) 0, sizeof buffer))
|
|
||||||
(*_bfd_error_handler)
|
|
||||||
(_("%s: warning: unable to retrieve .note section from %s"),
|
|
||||||
bfd_get_filename (abfd));
|
|
||||||
|
|
||||||
/* We have to extract the value this way to allow for a
|
|
||||||
host whose endian-ness is different from the target. */
|
|
||||||
machine = bfd_get_32 (abfd, buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef MC68MAGIC
|
#ifdef MC68MAGIC
|
||||||
|
@ -241,9 +241,6 @@ coff_real_object_p (abfd, nscns, internal_f, internal_a)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bfd_coff_set_arch_mach_hook (abfd, (PTR) internal_f);
|
|
||||||
/* make_abs_section (abfd); */
|
|
||||||
|
|
||||||
return abfd->xvec;
|
return abfd->xvec;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
278
bfd/cpu-arm.c
278
bfd/cpu-arm.c
@ -1,5 +1,5 @@
|
|||||||
/* BFD support for the ARM processor
|
/* BFD support for the ARM processor
|
||||||
Copyright 1994, 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
|
Copyright 1994, 1997, 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
|
||||||
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
|
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
|
||||||
|
|
||||||
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
||||||
@ -21,11 +21,14 @@
|
|||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
#include "libbfd.h"
|
#include "libbfd.h"
|
||||||
|
#include "libiberty.h"
|
||||||
|
|
||||||
static const bfd_arch_info_type * compatible
|
static const bfd_arch_info_type * compatible
|
||||||
PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *));
|
PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *));
|
||||||
static bfd_boolean scan
|
static bfd_boolean scan
|
||||||
PARAMS ((const struct bfd_arch_info *, const char *));
|
PARAMS ((const struct bfd_arch_info *, const char *));
|
||||||
|
static bfd_boolean arm_check_note
|
||||||
|
PARAMS ((bfd *, char *, bfd_size_type, const char *, char **));
|
||||||
|
|
||||||
/* This routine is provided two arch_infos and works out which ARM
|
/* This routine is provided two arch_infos and works out which ARM
|
||||||
machine which would be compatible with both and returns a pointer
|
machine which would be compatible with both and returns a pointer
|
||||||
@ -149,3 +152,276 @@ static const bfd_arch_info_type arch_info_struct[] =
|
|||||||
|
|
||||||
const bfd_arch_info_type bfd_arm_arch =
|
const bfd_arch_info_type bfd_arm_arch =
|
||||||
N (0, "arm", TRUE, & arch_info_struct[0]);
|
N (0, "arm", TRUE, & arch_info_struct[0]);
|
||||||
|
|
||||||
|
/* Support functions used by both the COFF and ELF versions of the ARM port. */
|
||||||
|
|
||||||
|
/* Handle the mergeing of the 'machine' settings of input file IBFD
|
||||||
|
and an output file OBFD. These values actually represent the
|
||||||
|
different possible ARM architecture variants.
|
||||||
|
Returns TRUE if they were merged successfully or FALSE otherwise. */
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
bfd_arm_merge_machines (ibfd, obfd)
|
||||||
|
bfd * ibfd;
|
||||||
|
bfd * obfd;
|
||||||
|
{
|
||||||
|
unsigned int in = bfd_get_mach (ibfd);
|
||||||
|
unsigned int out = bfd_get_mach (obfd);
|
||||||
|
|
||||||
|
/* If the output architecture is unknown, we now have a value to set. */
|
||||||
|
if (out == bfd_mach_arm_unknown)
|
||||||
|
bfd_set_arch_mach (obfd, bfd_arch_arm, in);
|
||||||
|
|
||||||
|
/* If the input architecure is unknown,
|
||||||
|
then so must be the output architecture. */
|
||||||
|
else if (in == bfd_mach_arm_unknown)
|
||||||
|
/* FIXME: We ought to have some way to
|
||||||
|
override this on the command line. */
|
||||||
|
bfd_set_arch_mach (obfd, bfd_arch_arm, bfd_mach_arm_unknown);
|
||||||
|
|
||||||
|
/* If they are the same then nothing needs to be done. */
|
||||||
|
else if (out == in)
|
||||||
|
;
|
||||||
|
|
||||||
|
/* Otherwise the general principle that a earlier architecture can be
|
||||||
|
linked with a later architecure to produce a binary that will execute
|
||||||
|
on the later architecture.
|
||||||
|
|
||||||
|
We fail however if we attempt to link a Cirrus EP9312 binary with an
|
||||||
|
Intel XScale binary, since these architecture have co-processors which
|
||||||
|
will not both be present on the same physical hardware. */
|
||||||
|
else if (in == bfd_mach_arm_ep9312
|
||||||
|
&& (out == bfd_mach_arm_XScale || out == bfd_mach_arm_iWMMXt))
|
||||||
|
{
|
||||||
|
_bfd_error_handler (_("\
|
||||||
|
ERROR: %s is compiled for the EP9312, whereas %s is compiled for XScale"),
|
||||||
|
bfd_archive_filename (ibfd),
|
||||||
|
bfd_get_filename (obfd));
|
||||||
|
bfd_set_error (bfd_error_wrong_format);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else if (out == bfd_mach_arm_ep9312
|
||||||
|
&& (in == bfd_mach_arm_XScale || in == bfd_mach_arm_iWMMXt))
|
||||||
|
{
|
||||||
|
_bfd_error_handler (_("\
|
||||||
|
ERROR: %s is compiled for the EP9312, whereas %s is compiled for XScale"),
|
||||||
|
bfd_archive_filename (obfd),
|
||||||
|
bfd_get_filename (ibfd));
|
||||||
|
bfd_set_error (bfd_error_wrong_format);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else if (in > out)
|
||||||
|
bfd_set_arch_mach (obfd, bfd_arch_arm, in);
|
||||||
|
/* else
|
||||||
|
Nothing to do. */
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char namesz[4]; /* Size of entry's owner string. */
|
||||||
|
unsigned char descsz[4]; /* Size of the note descriptor. */
|
||||||
|
unsigned char type[4]; /* Interpretation of the descriptor. */
|
||||||
|
char name[1]; /* Start of the name+desc data. */
|
||||||
|
} arm_Note;
|
||||||
|
|
||||||
|
static bfd_boolean
|
||||||
|
arm_check_note (abfd, buffer, buffer_size, expected_name, description_return)
|
||||||
|
bfd * abfd;
|
||||||
|
char * buffer;
|
||||||
|
bfd_size_type buffer_size;
|
||||||
|
const char * expected_name;
|
||||||
|
char ** description_return;
|
||||||
|
{
|
||||||
|
unsigned long namesz;
|
||||||
|
unsigned long descsz;
|
||||||
|
unsigned long type;
|
||||||
|
char * descr;
|
||||||
|
|
||||||
|
if (buffer_size < offsetof (arm_Note, name))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* We have to extract the values this way to allow for a
|
||||||
|
host whose endian-ness is different from the target. */
|
||||||
|
namesz = bfd_get_32 (abfd, buffer);
|
||||||
|
descsz = bfd_get_32 (abfd, buffer + offsetof (arm_Note, descsz));
|
||||||
|
type = bfd_get_32 (abfd, buffer + offsetof (arm_Note, type));
|
||||||
|
descr = buffer + offsetof (arm_Note, name);
|
||||||
|
|
||||||
|
/* Check for buffer overflow. */
|
||||||
|
if (namesz + descsz + offsetof (arm_Note, name) > buffer_size)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (expected_name == NULL)
|
||||||
|
{
|
||||||
|
if (namesz != 0)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (namesz != (strlen (expected_name) + 1 + 3) & ~3)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (strcmp (descr, expected_name) != 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
descr += (namesz + 3) & ~3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: We should probably check the type as well. */
|
||||||
|
|
||||||
|
if (description_return != NULL)
|
||||||
|
* description_return = descr;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NOTE_ARCH_STRING "arch: "
|
||||||
|
|
||||||
|
bfd_boolean
|
||||||
|
bfd_arm_update_notes (abfd, note_section)
|
||||||
|
bfd * abfd;
|
||||||
|
const char * note_section;
|
||||||
|
{
|
||||||
|
asection * arm_arch_section;
|
||||||
|
bfd_size_type buffer_size;
|
||||||
|
char * buffer;
|
||||||
|
char * arch_string;
|
||||||
|
char * expected;
|
||||||
|
|
||||||
|
/* Look for a note section. If one is present check the architecture
|
||||||
|
string encoded in it, and set it to the current architecture if it is
|
||||||
|
different. */
|
||||||
|
arm_arch_section = bfd_get_section_by_name (abfd, note_section);
|
||||||
|
|
||||||
|
if (arm_arch_section == NULL)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
buffer_size = arm_arch_section->_raw_size;
|
||||||
|
if (buffer_size == 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
buffer = bfd_malloc (buffer_size);
|
||||||
|
if (buffer == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (! bfd_get_section_contents (abfd, arm_arch_section, buffer,
|
||||||
|
(file_ptr) 0, buffer_size))
|
||||||
|
goto FAIL;
|
||||||
|
|
||||||
|
/* Parse the note. */
|
||||||
|
if (! arm_check_note (abfd, buffer, buffer_size, NOTE_ARCH_STRING, & arch_string))
|
||||||
|
goto FAIL;
|
||||||
|
|
||||||
|
/* Check the architecture in the note against the architecture of the bfd. */
|
||||||
|
switch (bfd_get_mach (abfd))
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
case bfd_mach_arm_unknown: expected = "unknown"; break;
|
||||||
|
case bfd_mach_arm_2: expected = "armv2"; break;
|
||||||
|
case bfd_mach_arm_2a: expected = "armv2a"; break;
|
||||||
|
case bfd_mach_arm_3: expected = "armv3"; break;
|
||||||
|
case bfd_mach_arm_3M: expected = "armv3M"; break;
|
||||||
|
case bfd_mach_arm_4: expected = "armv4"; break;
|
||||||
|
case bfd_mach_arm_4T: expected = "armv4t"; break;
|
||||||
|
case bfd_mach_arm_5: expected = "armv5"; break;
|
||||||
|
case bfd_mach_arm_5T: expected = "armv5t"; break;
|
||||||
|
case bfd_mach_arm_5TE: expected = "armv5te"; break;
|
||||||
|
case bfd_mach_arm_XScale: expected = "XScale"; break;
|
||||||
|
case bfd_mach_arm_ep9312: expected = "ep9312"; break;
|
||||||
|
case bfd_mach_arm_iWMMXt: expected = "iWMMXt"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp (arch_string, expected) != 0)
|
||||||
|
{
|
||||||
|
strcpy (buffer + offsetof (arm_Note, name) + ((strlen (NOTE_ARCH_STRING) + 3) & ~3), expected);
|
||||||
|
|
||||||
|
if (! bfd_set_section_contents (abfd, arm_arch_section, buffer,
|
||||||
|
(file_ptr) 0, buffer_size))
|
||||||
|
{
|
||||||
|
(*_bfd_error_handler)
|
||||||
|
(_("warning: unable to update contents of %s section in %s"),
|
||||||
|
note_section, bfd_get_filename (abfd));
|
||||||
|
goto FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free (buffer);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
FAIL:
|
||||||
|
free (buffer);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
const char * string;
|
||||||
|
unsigned int mach;
|
||||||
|
}
|
||||||
|
architectures[] =
|
||||||
|
{
|
||||||
|
{ "armv2", bfd_mach_arm_2 },
|
||||||
|
{ "armv2a", bfd_mach_arm_2a },
|
||||||
|
{ "armv3", bfd_mach_arm_3 },
|
||||||
|
{ "armv3M", bfd_mach_arm_3M },
|
||||||
|
{ "armv4", bfd_mach_arm_4 },
|
||||||
|
{ "armv4t", bfd_mach_arm_4T },
|
||||||
|
{ "armv5", bfd_mach_arm_5 },
|
||||||
|
{ "armv5t", bfd_mach_arm_5T },
|
||||||
|
{ "armv5te", bfd_mach_arm_5TE },
|
||||||
|
{ "XScale", bfd_mach_arm_XScale },
|
||||||
|
{ "ep9312", bfd_mach_arm_ep9312 },
|
||||||
|
{ "iWMMXt", bfd_mach_arm_iWMMXt }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Extract the machine number stored in a note section. */
|
||||||
|
unsigned int
|
||||||
|
bfd_arm_get_mach_from_notes (abfd, note_section)
|
||||||
|
bfd * abfd;
|
||||||
|
const char * note_section;
|
||||||
|
{
|
||||||
|
asection * arm_arch_section;
|
||||||
|
bfd_size_type buffer_size;
|
||||||
|
char * buffer;
|
||||||
|
char * arch_string;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Look for a note section. If one is present check the architecture
|
||||||
|
string encoded in it, and set it to the current architecture if it is
|
||||||
|
different. */
|
||||||
|
arm_arch_section = bfd_get_section_by_name (abfd, note_section);
|
||||||
|
|
||||||
|
if (arm_arch_section == NULL)
|
||||||
|
return bfd_mach_arm_unknown;
|
||||||
|
|
||||||
|
buffer_size = arm_arch_section->_raw_size;
|
||||||
|
if (buffer_size == 0)
|
||||||
|
return bfd_mach_arm_unknown;
|
||||||
|
|
||||||
|
buffer = bfd_malloc (buffer_size);
|
||||||
|
if (buffer == NULL)
|
||||||
|
return bfd_mach_arm_unknown;
|
||||||
|
|
||||||
|
if (! bfd_get_section_contents (abfd, arm_arch_section, buffer,
|
||||||
|
(file_ptr) 0, buffer_size))
|
||||||
|
goto FAIL;
|
||||||
|
|
||||||
|
/* Parse the note. */
|
||||||
|
if (! arm_check_note (abfd, buffer, buffer_size, NOTE_ARCH_STRING, & arch_string))
|
||||||
|
goto FAIL;
|
||||||
|
|
||||||
|
/* Interpret the architecture string. */
|
||||||
|
for (i = ARRAY_SIZE (architectures); i--;)
|
||||||
|
if (strcmp (arch_string, architectures[i].string) == 0)
|
||||||
|
{
|
||||||
|
free (buffer);
|
||||||
|
return architectures[i].mach;
|
||||||
|
}
|
||||||
|
|
||||||
|
FAIL:
|
||||||
|
free (buffer);
|
||||||
|
return bfd_mach_arm_unknown;
|
||||||
|
}
|
||||||
|
100
bfd/elf32-arm.h
100
bfd/elf32-arm.h
@ -2119,43 +2119,18 @@ static bfd_boolean
|
|||||||
elf32_arm_object_p (abfd)
|
elf32_arm_object_p (abfd)
|
||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
{
|
{
|
||||||
asection * arm_arch_section;
|
unsigned int mach;
|
||||||
|
|
||||||
|
mach = bfd_arm_get_mach_from_notes (abfd, ARM_NOTE_SECTION);
|
||||||
|
|
||||||
arm_arch_section = bfd_get_section_by_name (abfd, ARM_NOTE_SECTION);
|
if (mach != bfd_mach_arm_unknown)
|
||||||
|
bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
|
||||||
|
|
||||||
if (arm_arch_section)
|
else if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
|
||||||
{
|
bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
|
||||||
char buffer [4];
|
|
||||||
unsigned long arm_mach;
|
|
||||||
|
|
||||||
if (! bfd_get_section_contents (abfd, arm_arch_section, buffer,
|
|
||||||
(file_ptr) 0, sizeof buffer))
|
|
||||||
(*_bfd_error_handler)
|
|
||||||
(_("%s: warning: unable to retrieve %s section from %s"),
|
|
||||||
ARM_NOTE_SECTION, bfd_get_filename (abfd));
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We have to extract the value this way to allow for a
|
|
||||||
host whose endian-ness is different from the target. */
|
|
||||||
arm_mach = bfd_get_32 (abfd, buffer);
|
|
||||||
bfd_default_set_arch_mach (abfd, bfd_arch_arm, arm_mach);
|
|
||||||
|
|
||||||
if (bfd_get_arch (abfd) == bfd_arch_arm)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
/* If the set failed for some reason, do not leave the architecture
|
|
||||||
type as 0 (unknown), but issue a warning message and force it to
|
|
||||||
be set to bfd_arch_arm. */
|
|
||||||
(*_bfd_error_handler)
|
|
||||||
(_("%s: warning: unrecognized ARM machine number: %x"),
|
|
||||||
bfd_get_filename (abfd), arm_mach);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
bfd_default_set_arch_mach (abfd, bfd_arch_arm, mach);
|
||||||
if (elf_elfheader (abfd)->e_flags & EF_ARM_MAVERICK_FLOAT)
|
|
||||||
bfd_default_set_arch_mach (abfd, bfd_arch_arm, bfd_mach_arm_ep9312);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -2296,24 +2271,10 @@ elf32_arm_merge_private_bfd_data (ibfd, obfd)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bfd_get_mach (obfd) && bfd_get_mach (obfd) != bfd_get_mach (ibfd))
|
/* Determine what should happen if the input ARM architecture
|
||||||
{
|
does not match the output ARM architecture. */
|
||||||
/* For now, allow an output file type of 'xscale' if the
|
if (! bfd_arm_merge_machines (ibfd, obfd))
|
||||||
input file type is 'iWMMXt'. This means that we will
|
return FALSE;
|
||||||
not have to build an entire iWMMXt enabled set of libraries
|
|
||||||
just to test a iWMMXt enabled binary. Change the output
|
|
||||||
type to iWMMXt though. Similarly allow 'xscale' binaries
|
|
||||||
to be linked into a 'iWMMXt' output binary. */
|
|
||||||
if ( bfd_get_mach (obfd) == bfd_mach_arm_XScale
|
|
||||||
&& bfd_get_mach (ibfd) == bfd_mach_arm_iWMMXt)
|
|
||||||
bfd_set_arch_mach (obfd, bfd_get_arch (obfd), bfd_mach_arm_iWMMXt);
|
|
||||||
else if ( bfd_get_mach (ibfd) != bfd_mach_arm_XScale
|
|
||||||
|| bfd_get_mach (obfd) != bfd_mach_arm_iWMMXt)
|
|
||||||
{
|
|
||||||
bfd_set_error (bfd_error_wrong_format);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Identical flags must be compatible. */
|
/* Identical flags must be compatible. */
|
||||||
if (in_flags == out_flags)
|
if (in_flags == out_flags)
|
||||||
@ -3733,42 +3694,7 @@ elf32_arm_final_write_processing (abfd, linker)
|
|||||||
bfd *abfd;
|
bfd *abfd;
|
||||||
bfd_boolean linker ATTRIBUTE_UNUSED;
|
bfd_boolean linker ATTRIBUTE_UNUSED;
|
||||||
{
|
{
|
||||||
asection * arm_arch_section;
|
bfd_arm_update_notes (abfd, ARM_NOTE_SECTION);
|
||||||
char buffer [4];
|
|
||||||
unsigned long arm_mach;
|
|
||||||
|
|
||||||
/* Look for a .note.arm.ident section. If one is present check
|
|
||||||
the machine number encoded in it, and set it to the current
|
|
||||||
machine number if it is different. This allows XScale and
|
|
||||||
iWMMXt binaries to be merged and the resulting output to be set
|
|
||||||
to iWMMXt, even if the first input file had an XScale .note. */
|
|
||||||
|
|
||||||
arm_arch_section = bfd_get_section_by_name (abfd, ARM_NOTE_SECTION);
|
|
||||||
|
|
||||||
if (arm_arch_section == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (! bfd_get_section_contents (abfd, arm_arch_section, buffer,
|
|
||||||
(file_ptr) 0, sizeof buffer))
|
|
||||||
/* If the ident section does not exist then just skip this check. */
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* We have to extract the value this way to allow for a
|
|
||||||
host whose endian-ness is different from the target. */
|
|
||||||
arm_mach = bfd_get_32 (abfd, buffer);
|
|
||||||
|
|
||||||
if (arm_mach == bfd_get_mach (abfd))
|
|
||||||
return;
|
|
||||||
|
|
||||||
bfd_put_32 (abfd, bfd_get_mach (abfd), buffer);
|
|
||||||
|
|
||||||
if (! bfd_set_section_contents (abfd, arm_arch_section, buffer,
|
|
||||||
(file_ptr) 0, sizeof buffer))
|
|
||||||
(*_bfd_error_handler)
|
|
||||||
(_("warning: unable to update contents of %s section in %s"),
|
|
||||||
ARM_NOTE_SECTION, bfd_get_filename (abfd));
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ELF_ARCH bfd_arch_arm
|
#define ELF_ARCH bfd_arch_arm
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2003-04-01 Nick Clifton <nickc@redhat.com>
|
||||||
|
Richard Earnshaw <rearnsha@arm.com>
|
||||||
|
|
||||||
|
* config/tc-arm.c: Remove presence of (r) and (tm) symbols.
|
||||||
|
(ARM_ARCH_IWMMXT): Simplify.
|
||||||
|
(insns): Place iwmmx instructions in correct place in table.
|
||||||
|
(arm_add_note): New function: Add a note entry to a .note section.
|
||||||
|
(md_begin): Make the default architecture be unknown.
|
||||||
|
Suppress the creation of an arm note section.
|
||||||
|
|
||||||
2003-03-26 Eric Christopher <echristo@redhat.com>
|
2003-03-26 Eric Christopher <echristo@redhat.com>
|
||||||
|
|
||||||
* config/tc-mips.c (nopic_need_relax): Check for
|
* config/tc-mips.c (nopic_need_relax): Check for
|
||||||
|
@ -59,7 +59,7 @@
|
|||||||
/* Co-processor space extensions. */
|
/* Co-processor space extensions. */
|
||||||
#define ARM_CEXT_XSCALE 0x00800000 /* Allow MIA etc. */
|
#define ARM_CEXT_XSCALE 0x00800000 /* Allow MIA etc. */
|
||||||
#define ARM_CEXT_MAVERICK 0x00400000 /* Use Cirrus/DSP coprocessor. */
|
#define ARM_CEXT_MAVERICK 0x00400000 /* Use Cirrus/DSP coprocessor. */
|
||||||
#define ARM_CEXT_IWMMXT 0x00200000 /* Intel(r) Wireless MMX(tm) technology coprocessor. */
|
#define ARM_CEXT_IWMMXT 0x00200000 /* Intel Wireless MMX technology coprocessor. */
|
||||||
|
|
||||||
/* Architectures are the sum of the base and extensions. The ARM ARM (rev E)
|
/* Architectures are the sum of the base and extensions. The ARM ARM (rev E)
|
||||||
defines the following: ARMv3, ARMv3M, ARMv4xM, ARMv4, ARMv4TxM, ARMv4T,
|
defines the following: ARMv3, ARMv3M, ARMv4xM, ARMv4, ARMv4TxM, ARMv4T,
|
||||||
@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
/* Processors with specific extensions in the co-processor space. */
|
/* Processors with specific extensions in the co-processor space. */
|
||||||
#define ARM_ARCH_XSCALE (ARM_ARCH_V5TE | ARM_CEXT_XSCALE)
|
#define ARM_ARCH_XSCALE (ARM_ARCH_V5TE | ARM_CEXT_XSCALE)
|
||||||
#define ARM_ARCH_IWMMXT (ARM_ARCH_V5TE | ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT)
|
#define ARM_ARCH_IWMMXT (ARM_ARCH_XSCALE | ARM_CEXT_IWMMXT)
|
||||||
|
|
||||||
/* Some useful combinations: */
|
/* Some useful combinations: */
|
||||||
#define ARM_ANY 0x0000ffff /* Any basic core. */
|
#define ARM_ANY 0x0000ffff /* Any basic core. */
|
||||||
@ -602,7 +602,7 @@ static const struct reg_entry rn_table[] =
|
|||||||
|
|
||||||
static const struct reg_entry iwmmxt_table[] =
|
static const struct reg_entry iwmmxt_table[] =
|
||||||
{
|
{
|
||||||
/* Intel(r) Wireless MMX(tm) technology register names. */
|
/* Intel Wireless MMX technology register names. */
|
||||||
{ "wr0", 0x0 | WR_PREFIX}, {"wr1", 0x1 | WR_PREFIX},
|
{ "wr0", 0x0 | WR_PREFIX}, {"wr1", 0x1 | WR_PREFIX},
|
||||||
{ "wr2", 0x2 | WR_PREFIX}, {"wr3", 0x3 | WR_PREFIX},
|
{ "wr2", 0x2 | WR_PREFIX}, {"wr3", 0x3 | WR_PREFIX},
|
||||||
{ "wr4", 0x4 | WR_PREFIX}, {"wr5", 0x5 | WR_PREFIX},
|
{ "wr4", 0x4 | WR_PREFIX}, {"wr5", 0x5 | WR_PREFIX},
|
||||||
@ -759,7 +759,7 @@ struct reg_map all_reg_maps[] =
|
|||||||
{mav_mvdx_table, 15, NULL, N_("Maverick MVFX register expected")},
|
{mav_mvdx_table, 15, NULL, N_("Maverick MVFX register expected")},
|
||||||
{mav_mvax_table, 3, NULL, N_("Maverick MVAX register expected")},
|
{mav_mvax_table, 3, NULL, N_("Maverick MVAX register expected")},
|
||||||
{mav_dspsc_table, 0, NULL, N_("Maverick DSPSC register expected")},
|
{mav_dspsc_table, 0, NULL, N_("Maverick DSPSC register expected")},
|
||||||
{iwmmxt_table, 23, NULL, N_("Intel(r) Wireless MMX(tm) technology register expected")},
|
{iwmmxt_table, 23, NULL, N_("Intel Wireless MMX technology register expected")},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Enumeration matching entries in table above. */
|
/* Enumeration matching entries in table above. */
|
||||||
@ -1077,170 +1077,6 @@ struct asm_opcode
|
|||||||
|
|
||||||
static const struct asm_opcode insns[] =
|
static const struct asm_opcode insns[] =
|
||||||
{
|
{
|
||||||
/* Intel(r) Wireless MMX(tm) technology instructions. */
|
|
||||||
{"tandcb", 0xee130130, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tandc},
|
|
||||||
{"tandch", 0xee530130, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tandc},
|
|
||||||
{"tandcw", 0xee930130, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tandc},
|
|
||||||
{"tbcstb", 0xee400010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tbcst},
|
|
||||||
{"tbcsth", 0xee400050, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tbcst},
|
|
||||||
{"tbcstw", 0xee400090, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tbcst},
|
|
||||||
{"textrcb", 0xee130170, 7, ARM_CEXT_IWMMXT, do_iwmmxt_textrc},
|
|
||||||
{"textrch", 0xee530170, 7, ARM_CEXT_IWMMXT, do_iwmmxt_textrc},
|
|
||||||
{"textrcw", 0xee930170, 7, ARM_CEXT_IWMMXT, do_iwmmxt_textrc},
|
|
||||||
{"textrmub", 0xee100070, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
|
||||||
{"textrmuh", 0xee500070, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
|
||||||
{"textrmuw", 0xee900070, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
|
||||||
{"textrmsb", 0xee100078, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
|
||||||
{"textrmsh", 0xee500078, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
|
||||||
{"textrmsw", 0xee900078, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
|
||||||
{"tinsrb", 0xee600010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tinsr},
|
|
||||||
{"tinsrh", 0xee600050, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tinsr},
|
|
||||||
{"tinsrw", 0xee600090, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tinsr},
|
|
||||||
{"tmcr", 0xee000110, 4, ARM_CEXT_IWMMXT, do_iwmmxt_tmcr},
|
|
||||||
{"tmcrr", 0xec400000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_tmcrr},
|
|
||||||
{"tmia", 0xee200010, 4, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
|
||||||
{"tmiaph", 0xee280010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
|
||||||
{"tmiabb", 0xee2c0010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
|
||||||
{"tmiabt", 0xee2d0010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
|
||||||
{"tmiatb", 0xee2e0010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
|
||||||
{"tmiatt", 0xee2f0010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
|
||||||
{"tmovmskb", 0xee100030, 8, ARM_CEXT_IWMMXT, do_iwmmxt_tmovmsk},
|
|
||||||
{"tmovmskh", 0xee500030, 8, ARM_CEXT_IWMMXT, do_iwmmxt_tmovmsk},
|
|
||||||
{"tmovmskw", 0xee900030, 8, ARM_CEXT_IWMMXT, do_iwmmxt_tmovmsk},
|
|
||||||
{"tmrc", 0xee100110, 4, ARM_CEXT_IWMMXT, do_iwmmxt_tmrc},
|
|
||||||
{"tmrrc", 0xec500000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_tmrrc},
|
|
||||||
{"torcb", 0xee130150, 5, ARM_CEXT_IWMMXT, do_iwmmxt_torc},
|
|
||||||
{"torch", 0xee530150, 5, ARM_CEXT_IWMMXT, do_iwmmxt_torc},
|
|
||||||
{"torcw", 0xee930150, 5, ARM_CEXT_IWMMXT, do_iwmmxt_torc},
|
|
||||||
{"waccb", 0xee0001c0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wacch", 0xee4001c0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"waccw", 0xee8001c0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"waddbss", 0xee300180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"waddb", 0xee000180, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"waddbus", 0xee100180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"waddhss", 0xee700180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"waddh", 0xee400180, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"waddhus", 0xee500180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"waddwss", 0xeeb00180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"waddw", 0xee800180, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"waddwus", 0xee900180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"waligni", 0xee000020, 7, ARM_CEXT_IWMMXT, do_iwmmxt_waligni},
|
|
||||||
{"walignr0", 0xee800020, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"walignr1", 0xee900020, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"walignr2", 0xeea00020, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"walignr3", 0xeeb00020, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wand", 0xee200000, 4, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wandn", 0xee300000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wavg2b", 0xee800000, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wavg2br", 0xee900000, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wavg2h", 0xeec00000, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wavg2hr", 0xeed00000, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wcmpeqb", 0xee000060, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wcmpeqh", 0xee400060, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wcmpeqw", 0xee800060, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wcmpgtub", 0xee100060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wcmpgtuh", 0xee500060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wcmpgtuw", 0xee900060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wcmpgtsb", 0xee300060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wcmpgtsh", 0xee700060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wcmpgtsw", 0xeeb00060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wldrb", 0xec100000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_byte_addr},
|
|
||||||
{"wldrh", 0xec100100, 5, ARM_CEXT_IWMMXT, do_iwmmxt_byte_addr},
|
|
||||||
{"wldrw", 0xec100200, 5, ARM_CEXT_IWMMXT, do_iwmmxt_word_addr},
|
|
||||||
{"wldrd", 0xec100300, 5, ARM_CEXT_IWMMXT, do_iwmmxt_word_addr},
|
|
||||||
{"wmacs", 0xee600100, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmacsz", 0xee700100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmacu", 0xee400100, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmacuz", 0xee500100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmadds", 0xeea00100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmaddu", 0xee800100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmaxsb", 0xee200160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmaxsh", 0xee600160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmaxsw", 0xeea00160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmaxub", 0xee000160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmaxuh", 0xee400160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmaxuw", 0xee800160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wminsb", 0xee300160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wminsh", 0xee700160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wminsw", 0xeeb00160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wminub", 0xee100160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wminuh", 0xee500160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wminuw", 0xee900160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmov", 0xee000000, 4, ARM_CEXT_IWMMXT, do_iwmmxt_wmov},
|
|
||||||
{"wmulsm", 0xee300100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmulsl", 0xee200100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmulum", 0xee100100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wmulul", 0xee000100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wor", 0xee000000, 3, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wpackhss", 0xee700080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wpackhus", 0xee500080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wpackwss", 0xeeb00080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wpackwus", 0xee900080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wpackdss", 0xeef00080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wpackdus", 0xeed00080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wrorh", 0xee700040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wrorhg", 0xee700148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wrorw", 0xeeb00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wrorwg", 0xeeb00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wrord", 0xeef00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wrordg", 0xeef00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wsadb", 0xee000120, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsadbz", 0xee100120, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsadh", 0xee400120, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsadhz", 0xee500120, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wshufh", 0xee0001e0, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wshufh},
|
|
||||||
{"wsllh", 0xee500040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsllhg", 0xee500148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wsllw", 0xee900040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsllwg", 0xee900148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wslld", 0xeed00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wslldg", 0xeed00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wsrah", 0xee400040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsrahg", 0xee400148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wsraw", 0xee800040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsrawg", 0xee800148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wsrad", 0xeec00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsradg", 0xeec00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wsrlh", 0xee600040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsrlhg", 0xee600148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wsrlw", 0xeea00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsrlwg", 0xeea00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wsrld", 0xeee00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsrldg", 0xeee00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
|
||||||
{"wstrb", 0xec000000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_byte_addr},
|
|
||||||
{"wstrh", 0xec000100, 5, ARM_CEXT_IWMMXT, do_iwmmxt_byte_addr},
|
|
||||||
{"wstrw", 0xec000200, 5, ARM_CEXT_IWMMXT, do_iwmmxt_word_addr},
|
|
||||||
{"wstrd", 0xec000300, 5, ARM_CEXT_IWMMXT, do_iwmmxt_word_addr},
|
|
||||||
{"wsubbss", 0xee3001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsubb", 0xee0001a0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsubbus", 0xee1001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsubhss", 0xee7001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsubh", 0xee4001a0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsubhus", 0xee5001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsubwss", 0xeeb001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsubw", 0xee8001a0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wsubwus", 0xee9001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wunpckehub", 0xee0000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckehuh", 0xee4000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckehuw", 0xee8000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckehsb", 0xee2000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckehsh", 0xee6000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckehsw", 0xeea000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckihb", 0xee1000c0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wunpckihh", 0xee5000c0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wunpckihw", 0xee9000c0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wunpckelub", 0xee0000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckeluh", 0xee4000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckeluw", 0xee8000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckelsb", 0xee2000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckelsh", 0xee6000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckelsw", 0xeea000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
|
||||||
{"wunpckilb", 0xee1000e0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wunpckilh", 0xee5000e0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wunpckilw", 0xee9000e0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wxor", 0xee100000, 4, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
|
||||||
{"wzero", 0xee300000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wzero},
|
|
||||||
|
|
||||||
/* Core ARM Instructions. */
|
/* Core ARM Instructions. */
|
||||||
{"and", 0xe0000000, 3, ARM_EXT_V1, do_arit},
|
{"and", 0xe0000000, 3, ARM_EXT_V1, do_arit},
|
||||||
{"ands", 0xe0100000, 3, ARM_EXT_V1, do_arit},
|
{"ands", 0xe0100000, 3, ARM_EXT_V1, do_arit},
|
||||||
@ -1988,6 +1824,170 @@ static const struct asm_opcode insns[] =
|
|||||||
{"mar", 0xec400000, 3, ARM_CEXT_XSCALE, do_xsc_mar},
|
{"mar", 0xec400000, 3, ARM_CEXT_XSCALE, do_xsc_mar},
|
||||||
{"mra", 0xec500000, 3, ARM_CEXT_XSCALE, do_xsc_mra},
|
{"mra", 0xec500000, 3, ARM_CEXT_XSCALE, do_xsc_mra},
|
||||||
|
|
||||||
|
/* Intel Wireless MMX technology instructions. */
|
||||||
|
{"tandcb", 0xee130130, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tandc},
|
||||||
|
{"tandch", 0xee530130, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tandc},
|
||||||
|
{"tandcw", 0xee930130, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tandc},
|
||||||
|
{"tbcstb", 0xee400010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tbcst},
|
||||||
|
{"tbcsth", 0xee400050, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tbcst},
|
||||||
|
{"tbcstw", 0xee400090, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tbcst},
|
||||||
|
{"textrcb", 0xee130170, 7, ARM_CEXT_IWMMXT, do_iwmmxt_textrc},
|
||||||
|
{"textrch", 0xee530170, 7, ARM_CEXT_IWMMXT, do_iwmmxt_textrc},
|
||||||
|
{"textrcw", 0xee930170, 7, ARM_CEXT_IWMMXT, do_iwmmxt_textrc},
|
||||||
|
{"textrmub", 0xee100070, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
||||||
|
{"textrmuh", 0xee500070, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
||||||
|
{"textrmuw", 0xee900070, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
||||||
|
{"textrmsb", 0xee100078, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
||||||
|
{"textrmsh", 0xee500078, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
||||||
|
{"textrmsw", 0xee900078, 8, ARM_CEXT_IWMMXT, do_iwmmxt_textrm},
|
||||||
|
{"tinsrb", 0xee600010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tinsr},
|
||||||
|
{"tinsrh", 0xee600050, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tinsr},
|
||||||
|
{"tinsrw", 0xee600090, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tinsr},
|
||||||
|
{"tmcr", 0xee000110, 4, ARM_CEXT_IWMMXT, do_iwmmxt_tmcr},
|
||||||
|
{"tmcrr", 0xec400000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_tmcrr},
|
||||||
|
{"tmia", 0xee200010, 4, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
||||||
|
{"tmiaph", 0xee280010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
||||||
|
{"tmiabb", 0xee2c0010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
||||||
|
{"tmiabt", 0xee2d0010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
||||||
|
{"tmiatb", 0xee2e0010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
||||||
|
{"tmiatt", 0xee2f0010, 6, ARM_CEXT_IWMMXT, do_iwmmxt_tmia},
|
||||||
|
{"tmovmskb", 0xee100030, 8, ARM_CEXT_IWMMXT, do_iwmmxt_tmovmsk},
|
||||||
|
{"tmovmskh", 0xee500030, 8, ARM_CEXT_IWMMXT, do_iwmmxt_tmovmsk},
|
||||||
|
{"tmovmskw", 0xee900030, 8, ARM_CEXT_IWMMXT, do_iwmmxt_tmovmsk},
|
||||||
|
{"tmrc", 0xee100110, 4, ARM_CEXT_IWMMXT, do_iwmmxt_tmrc},
|
||||||
|
{"tmrrc", 0xec500000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_tmrrc},
|
||||||
|
{"torcb", 0xee130150, 5, ARM_CEXT_IWMMXT, do_iwmmxt_torc},
|
||||||
|
{"torch", 0xee530150, 5, ARM_CEXT_IWMMXT, do_iwmmxt_torc},
|
||||||
|
{"torcw", 0xee930150, 5, ARM_CEXT_IWMMXT, do_iwmmxt_torc},
|
||||||
|
{"waccb", 0xee0001c0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wacch", 0xee4001c0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"waccw", 0xee8001c0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"waddbss", 0xee300180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"waddb", 0xee000180, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"waddbus", 0xee100180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"waddhss", 0xee700180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"waddh", 0xee400180, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"waddhus", 0xee500180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"waddwss", 0xeeb00180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"waddw", 0xee800180, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"waddwus", 0xee900180, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"waligni", 0xee000020, 7, ARM_CEXT_IWMMXT, do_iwmmxt_waligni},
|
||||||
|
{"walignr0", 0xee800020, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"walignr1", 0xee900020, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"walignr2", 0xeea00020, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"walignr3", 0xeeb00020, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wand", 0xee200000, 4, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wandn", 0xee300000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wavg2b", 0xee800000, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wavg2br", 0xee900000, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wavg2h", 0xeec00000, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wavg2hr", 0xeed00000, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wcmpeqb", 0xee000060, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wcmpeqh", 0xee400060, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wcmpeqw", 0xee800060, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wcmpgtub", 0xee100060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wcmpgtuh", 0xee500060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wcmpgtuw", 0xee900060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wcmpgtsb", 0xee300060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wcmpgtsh", 0xee700060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wcmpgtsw", 0xeeb00060, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wldrb", 0xec100000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_byte_addr},
|
||||||
|
{"wldrh", 0xec100100, 5, ARM_CEXT_IWMMXT, do_iwmmxt_byte_addr},
|
||||||
|
{"wldrw", 0xec100200, 5, ARM_CEXT_IWMMXT, do_iwmmxt_word_addr},
|
||||||
|
{"wldrd", 0xec100300, 5, ARM_CEXT_IWMMXT, do_iwmmxt_word_addr},
|
||||||
|
{"wmacs", 0xee600100, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmacsz", 0xee700100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmacu", 0xee400100, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmacuz", 0xee500100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmadds", 0xeea00100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmaddu", 0xee800100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmaxsb", 0xee200160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmaxsh", 0xee600160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmaxsw", 0xeea00160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmaxub", 0xee000160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmaxuh", 0xee400160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmaxuw", 0xee800160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wminsb", 0xee300160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wminsh", 0xee700160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wminsw", 0xeeb00160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wminub", 0xee100160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wminuh", 0xee500160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wminuw", 0xee900160, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmov", 0xee000000, 4, ARM_CEXT_IWMMXT, do_iwmmxt_wmov},
|
||||||
|
{"wmulsm", 0xee300100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmulsl", 0xee200100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmulum", 0xee100100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wmulul", 0xee000100, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wor", 0xee000000, 3, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wpackhss", 0xee700080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wpackhus", 0xee500080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wpackwss", 0xeeb00080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wpackwus", 0xee900080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wpackdss", 0xeef00080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wpackdus", 0xeed00080, 8, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wrorh", 0xee700040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wrorhg", 0xee700148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wrorw", 0xeeb00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wrorwg", 0xeeb00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wrord", 0xeef00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wrordg", 0xeef00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wsadb", 0xee000120, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsadbz", 0xee100120, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsadh", 0xee400120, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsadhz", 0xee500120, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wshufh", 0xee0001e0, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wshufh},
|
||||||
|
{"wsllh", 0xee500040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsllhg", 0xee500148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wsllw", 0xee900040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsllwg", 0xee900148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wslld", 0xeed00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wslldg", 0xeed00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wsrah", 0xee400040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsrahg", 0xee400148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wsraw", 0xee800040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsrawg", 0xee800148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wsrad", 0xeec00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsradg", 0xeec00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wsrlh", 0xee600040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsrlhg", 0xee600148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wsrlw", 0xeea00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsrlwg", 0xeea00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wsrld", 0xeee00040, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsrldg", 0xeee00148, 6, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwcg},
|
||||||
|
{"wstrb", 0xec000000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_byte_addr},
|
||||||
|
{"wstrh", 0xec000100, 5, ARM_CEXT_IWMMXT, do_iwmmxt_byte_addr},
|
||||||
|
{"wstrw", 0xec000200, 5, ARM_CEXT_IWMMXT, do_iwmmxt_word_addr},
|
||||||
|
{"wstrd", 0xec000300, 5, ARM_CEXT_IWMMXT, do_iwmmxt_word_addr},
|
||||||
|
{"wsubbss", 0xee3001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsubb", 0xee0001a0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsubbus", 0xee1001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsubhss", 0xee7001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsubh", 0xee4001a0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsubhus", 0xee5001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsubwss", 0xeeb001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsubw", 0xee8001a0, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wsubwus", 0xee9001a0, 7, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wunpckehub", 0xee0000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckehuh", 0xee4000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckehuw", 0xee8000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckehsb", 0xee2000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckehsh", 0xee6000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckehsw", 0xeea000c0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckihb", 0xee1000c0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wunpckihh", 0xee5000c0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wunpckihw", 0xee9000c0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wunpckelub", 0xee0000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckeluh", 0xee4000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckeluw", 0xee8000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckelsb", 0xee2000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckelsh", 0xee6000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckelsw", 0xeea000e0, 10, ARM_CEXT_IWMMXT, do_iwmmxt_wrwr},
|
||||||
|
{"wunpckilb", 0xee1000e0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wunpckilh", 0xee5000e0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wunpckilw", 0xee9000e0, 9, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wxor", 0xee100000, 4, ARM_CEXT_IWMMXT, do_iwmmxt_wrwrwr},
|
||||||
|
{"wzero", 0xee300000, 5, ARM_CEXT_IWMMXT, do_iwmmxt_wzero},
|
||||||
|
|
||||||
/* Cirrus Maverick instructions. */
|
/* Cirrus Maverick instructions. */
|
||||||
{"cfldrs", 0xec100400, 6, ARM_CEXT_MAVERICK, do_mav_ldst_1},
|
{"cfldrs", 0xec100400, 6, ARM_CEXT_MAVERICK, do_mav_ldst_1},
|
||||||
{"cfldrd", 0xec500400, 6, ARM_CEXT_MAVERICK, do_mav_ldst_2},
|
{"cfldrd", 0xec500400, 6, ARM_CEXT_MAVERICK, do_mav_ldst_2},
|
||||||
@ -2361,6 +2361,9 @@ static int arm_parse_extension PARAMS ((char *, int *));
|
|||||||
static int arm_parse_cpu PARAMS ((char *));
|
static int arm_parse_cpu PARAMS ((char *));
|
||||||
static int arm_parse_arch PARAMS ((char *));
|
static int arm_parse_arch PARAMS ((char *));
|
||||||
static int arm_parse_fpu PARAMS ((char *));
|
static int arm_parse_fpu PARAMS ((char *));
|
||||||
|
#if defined OBJ_COFF || defined OBJ_ELF
|
||||||
|
static void arm_add_note PARAMS ((const char *, const char *, unsigned int));
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Stuff needed to resolve the label ambiguity
|
/* Stuff needed to resolve the label ambiguity
|
||||||
As:
|
As:
|
||||||
@ -2999,7 +3002,7 @@ reg_required_here (str, shift)
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A Intel(r) Wireless MMX(tm) technology register
|
/* A Intel Wireless MMX technology register
|
||||||
must be given at this point.
|
must be given at this point.
|
||||||
Shift is the place to put it in inst.instruction.
|
Shift is the place to put it in inst.instruction.
|
||||||
Restores input start point on err.
|
Restores input start point on err.
|
||||||
@ -3044,7 +3047,7 @@ wreg_required_here (str, shift, reg_type)
|
|||||||
|
|
||||||
/* In the few cases where we might be able to accept
|
/* In the few cases where we might be able to accept
|
||||||
something else this error can be overridden. */
|
something else this error can be overridden. */
|
||||||
sprintf (buff, _("Intel(r) Wireless MMX(tm) technology register expected, not '%.100s'"), start);
|
sprintf (buff, _("Intel Wireless MMX technology register expected, not '%.100s'"), start);
|
||||||
inst.error = buff;
|
inst.error = buff;
|
||||||
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -10083,6 +10086,54 @@ build_arm_ops_hsh ()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined OBJ_ELF || defined OBJ_COFF
|
||||||
|
|
||||||
|
#ifdef OBJ_ELF
|
||||||
|
#define arm_Note Elf_External_Note
|
||||||
|
#else
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char namesz[4]; /* Size of entry's owner string. */
|
||||||
|
unsigned char descsz[4]; /* Size of the note descriptor. */
|
||||||
|
unsigned char type[4]; /* Interpretation of the descriptor. */
|
||||||
|
char name[1]; /* Start of the name+desc data. */
|
||||||
|
} arm_Note;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The description is kept to a fix sized in order to make updating
|
||||||
|
it and merging it easier. */
|
||||||
|
#define ARM_NOTE_DESCRIPTION_LENGTH 8
|
||||||
|
|
||||||
|
static void
|
||||||
|
arm_add_note (name, description, type)
|
||||||
|
const char * name;
|
||||||
|
const char * description;
|
||||||
|
unsigned int type;
|
||||||
|
{
|
||||||
|
arm_Note note ATTRIBUTE_UNUSED;
|
||||||
|
char * p;
|
||||||
|
unsigned int name_len;
|
||||||
|
|
||||||
|
name_len = (strlen (name) + 1 + 3) & ~3;
|
||||||
|
|
||||||
|
p = frag_more (sizeof (note.namesz));
|
||||||
|
md_number_to_chars (p, (valueT) name_len, sizeof (note.namesz));
|
||||||
|
|
||||||
|
p = frag_more (sizeof (note.descsz));
|
||||||
|
md_number_to_chars (p, (valueT) ARM_NOTE_DESCRIPTION_LENGTH, sizeof (note.descsz));
|
||||||
|
|
||||||
|
p = frag_more (sizeof (note.type));
|
||||||
|
md_number_to_chars (p, (valueT) type, sizeof (note.type));
|
||||||
|
|
||||||
|
p = frag_more (name_len);
|
||||||
|
strcpy (p, name);
|
||||||
|
|
||||||
|
p = frag_more (ARM_NOTE_DESCRIPTION_LENGTH);
|
||||||
|
strncpy (p, description, ARM_NOTE_DESCRIPTION_LENGTH);
|
||||||
|
frag_align (2, 0, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
md_begin ()
|
md_begin ()
|
||||||
{
|
{
|
||||||
@ -10216,7 +10267,7 @@ md_begin ()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
mach = bfd_mach_arm_4;
|
mach = bfd_mach_arm_unknown;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10246,13 +10297,24 @@ md_begin ()
|
|||||||
else if (cpu_variant & ARM_EXT_V3M)
|
else if (cpu_variant & ARM_EXT_V3M)
|
||||||
mach = bfd_mach_arm_3M;
|
mach = bfd_mach_arm_3M;
|
||||||
|
|
||||||
|
#if 0 /* Suppressed - for now. */
|
||||||
#if defined (OBJ_ELF) || defined (OBJ_COFF)
|
#if defined (OBJ_ELF) || defined (OBJ_COFF)
|
||||||
|
|
||||||
|
/* Create a .note section to fully identify this arm binary. */
|
||||||
|
|
||||||
|
#define NOTE_ARCH_STRING "arch: "
|
||||||
|
|
||||||
|
#if defined OBJ_COFF && ! defined NT_VERSION
|
||||||
|
#define NT_VERSION 1
|
||||||
|
#define NT_ARCH 2
|
||||||
|
#endif
|
||||||
|
|
||||||
{
|
{
|
||||||
expressionS exp;
|
|
||||||
segT current_seg = now_seg;
|
segT current_seg = now_seg;
|
||||||
subsegT current_subseg = now_subseg;
|
subsegT current_subseg = now_subseg;
|
||||||
asection * arm_arch;
|
asection * arm_arch;
|
||||||
|
const char * arch_string;
|
||||||
|
|
||||||
arm_arch = bfd_make_section_old_way (stdoutput, ARM_NOTE_SECTION);
|
arm_arch = bfd_make_section_old_way (stdoutput, ARM_NOTE_SECTION);
|
||||||
|
|
||||||
#ifdef OBJ_COFF
|
#ifdef OBJ_COFF
|
||||||
@ -10262,17 +10324,32 @@ md_begin ()
|
|||||||
#endif
|
#endif
|
||||||
arm_arch->output_section = arm_arch;
|
arm_arch->output_section = arm_arch;
|
||||||
subseg_set (arm_arch, 0);
|
subseg_set (arm_arch, 0);
|
||||||
exp.X_op = O_constant;
|
|
||||||
exp.X_add_number = mach;
|
|
||||||
exp.X_add_symbol = NULL;
|
|
||||||
exp.X_op_symbol = NULL;
|
|
||||||
|
|
||||||
emit_expr (&exp, 4);
|
switch (mach)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
case bfd_mach_arm_unknown: arch_string = "unknown"; break;
|
||||||
|
case bfd_mach_arm_2: arch_string = "armv2"; break;
|
||||||
|
case bfd_mach_arm_2a: arch_string = "armv2a"; break;
|
||||||
|
case bfd_mach_arm_3: arch_string = "armv3"; break;
|
||||||
|
case bfd_mach_arm_3M: arch_string = "armv3M"; break;
|
||||||
|
case bfd_mach_arm_4: arch_string = "armv4"; break;
|
||||||
|
case bfd_mach_arm_4T: arch_string = "armv4t"; break;
|
||||||
|
case bfd_mach_arm_5: arch_string = "armv5"; break;
|
||||||
|
case bfd_mach_arm_5T: arch_string = "armv5t"; break;
|
||||||
|
case bfd_mach_arm_5TE: arch_string = "armv5te"; break;
|
||||||
|
case bfd_mach_arm_XScale: arch_string = "XScale"; break;
|
||||||
|
case bfd_mach_arm_ep9312: arch_string = "ep9312"; break;
|
||||||
|
case bfd_mach_arm_iWMMXt: arch_string = "iWMMXt"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
arm_add_note (NOTE_ARCH_STRING, arch_string, NT_ARCH);
|
||||||
|
|
||||||
subseg_set (current_seg, current_subseg);
|
subseg_set (current_seg, current_subseg);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif /* Suppressed code. */
|
||||||
|
|
||||||
bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
|
bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -11760,6 +11837,7 @@ static struct arm_cpu_option_table arm_cpus[] =
|
|||||||
{"arm1020e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2},
|
{"arm1020e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2},
|
||||||
/* ??? XSCALE is really an architecture. */
|
/* ??? XSCALE is really an architecture. */
|
||||||
{"xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2},
|
{"xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2},
|
||||||
|
/* ??? iwmmxt is not a processor. */
|
||||||
{"iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2},
|
{"iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2},
|
||||||
{"i80200", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2},
|
{"i80200", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2},
|
||||||
/* Maverick */
|
/* Maverick */
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
2003-04-01 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* arm.h (ARM_NOTE_SECTION): Include .gnu in the string.
|
||||||
|
|
||||||
2003-03-25 Stan Cox <scox@redhat.com>
|
2003-03-25 Stan Cox <scox@redhat.com>
|
||||||
Nick Clifton <nickc@redhat.com>
|
Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
@ -141,6 +141,6 @@ START_RELOC_NUMBERS (elf_arm_reloc_type)
|
|||||||
END_RELOC_NUMBERS (R_ARM_max)
|
END_RELOC_NUMBERS (R_ARM_max)
|
||||||
|
|
||||||
/* The name of the note section used to identify arm variants. */
|
/* The name of the note section used to identify arm variants. */
|
||||||
#define ARM_NOTE_SECTION ".note.arm.ident"
|
#define ARM_NOTE_SECTION ".note.gnu.arm.ident"
|
||||||
|
|
||||||
#endif /* _ELF_ARM_H */
|
#endif /* _ELF_ARM_H */
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
2003-04-01 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* emulparams/armelf.sh (OTHER_READONLY_SECTIONS): Chnage name of
|
||||||
|
note section.
|
||||||
|
* emulparams/armelf_linux.sh (OTHER_READONLY_SECTIONS): Chnage
|
||||||
|
name of note section.
|
||||||
|
|
||||||
2003-03-31 Alexandre Oliva <aoliva@redhat.com>
|
2003-03-31 Alexandre Oliva <aoliva@redhat.com>
|
||||||
|
|
||||||
* ld.texinfo (-Tbss, -Tdata, -Ttext): Document in terms of
|
* ld.texinfo (-Tbss, -Tdata, -Ttext): Document in terms of
|
||||||
|
@ -7,7 +7,7 @@ TEXT_START_ADDR=0x8000
|
|||||||
TEMPLATE_NAME=elf32
|
TEMPLATE_NAME=elf32
|
||||||
EXTRA_EM_FILE=armelf
|
EXTRA_EM_FILE=armelf
|
||||||
OTHER_TEXT_SECTIONS='*(.glue_7t) *(.glue_7)'
|
OTHER_TEXT_SECTIONS='*(.glue_7t) *(.glue_7)'
|
||||||
OTHER_READONLY_SECTIONS='.note.arm.ident : { KEEP (*(.note.arm.ident)) }'
|
OTHER_READONLY_SECTIONS='.note.gnu.arm.ident : { KEEP (*(.note.gnu.arm.ident)) }'
|
||||||
OTHER_BSS_SYMBOLS='__bss_start__ = .;'
|
OTHER_BSS_SYMBOLS='__bss_start__ = .;'
|
||||||
OTHER_BSS_END_SYMBOLS='_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;'
|
OTHER_BSS_END_SYMBOLS='_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;'
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ GENERATE_SHLIB_SCRIPT=yes
|
|||||||
|
|
||||||
DATA_START_SYMBOLS='__data_start = . ;';
|
DATA_START_SYMBOLS='__data_start = . ;';
|
||||||
OTHER_TEXT_SECTIONS='*(.glue_7t) *(.glue_7)'
|
OTHER_TEXT_SECTIONS='*(.glue_7t) *(.glue_7)'
|
||||||
OTHER_READONLY_SECTIONS='.note.arm.ident : { KEEP (*(.note.arm.ident)) }'
|
OTHER_READONLY_SECTIONS='.note.gnu.arm.ident : { KEEP (*(.note.gnu.arm.ident)) }'
|
||||||
OTHER_BSS_SYMBOLS='__bss_start__ = .;'
|
OTHER_BSS_SYMBOLS='__bss_start__ = .;'
|
||||||
OTHER_BSS_END_SYMBOLS='_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;'
|
OTHER_BSS_END_SYMBOLS='_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;'
|
||||||
|
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2003-04-01 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
* arm-dis.c: Remove presence of (r) and (tm) symbols.
|
||||||
|
* arm-opc.h: Remove presence of (r) and (tm) symbols.
|
||||||
|
|
||||||
2003-03-25 Stan Cox <scox@redhat.com>
|
2003-03-25 Stan Cox <scox@redhat.com>
|
||||||
Nick Clifton <nickc@redhat.com>
|
Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
@ -71,9 +71,9 @@ static arm_regname regnames[] =
|
|||||||
{ "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
|
{ "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
|
||||||
{ "special-atpcs", "Select special register names used in the ATPCS",
|
{ "special-atpcs", "Select special register names used in the ATPCS",
|
||||||
{ "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }},
|
{ "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }},
|
||||||
{ "iwmmxt_regnames", "Select register names used on the Intel(r) Wireless MMX(tm) technology coprocessor",
|
{ "iwmmxt_regnames", "Select register names used on the Intel Wireless MMX technology coprocessor",
|
||||||
{ "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"}},
|
{ "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"}},
|
||||||
{ "iwmmxt_Cregnames", "Select control register names used on the Intel(r) Wireless MMX(tm) technology coprocessor",
|
{ "iwmmxt_Cregnames", "Select control register names used on the Intel Wireless MMX technology coprocessor",
|
||||||
{"wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved", "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"}}
|
{"wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved", "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"}}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ static const struct arm_opcode arm_opcodes[] =
|
|||||||
{0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
|
{0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
|
||||||
{0xf450f000, 0xfc70f000, "pld\t%a"},
|
{0xf450f000, 0xfc70f000, "pld\t%a"},
|
||||||
|
|
||||||
/* Intel(r) Wireless MMX(tm) technology instructions. */
|
/* Intel Wireless MMX technology instructions. */
|
||||||
#define FIRST_IWMMXT_INSN 0x0e130130
|
#define FIRST_IWMMXT_INSN 0x0e130130
|
||||||
#define IWMMXT_INSN_COUNT 47
|
#define IWMMXT_INSN_COUNT 47
|
||||||
{0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
|
{0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user