2000-09-11 Kazu Hirata <kazu@hxi.com>
* config/tc-i370.c: Fix formatting. * config/tc-i960.c: Likewise. * config/tc-m68k.c: Likewise.
This commit is contained in:
parent
2bba1017ee
commit
92774660ac
|
@ -1,3 +1,9 @@
|
||||||
|
2000-09-11 Kazu Hirata <kazu@hxi.com>
|
||||||
|
|
||||||
|
* config/tc-i370.c: Fix formatting.
|
||||||
|
* config/tc-i960.c: Likewise.
|
||||||
|
* config/tc-m68k.c: Likewise.
|
||||||
|
|
||||||
2000-09-09 Philip Blundell <philb@gnu.org>
|
2000-09-09 Philip Blundell <philb@gnu.org>
|
||||||
|
|
||||||
* configure.in (arm*-*-uclinux*): New target.
|
* configure.in (arm*-*-uclinux*): New target.
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
You should have received a copy of the GNU General Public License
|
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
|
along with GAS; see the file COPYING. If not, write to the Free
|
||||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
/* This assembler implements a very hacked version of an elf-like thing
|
/* This assembler implements a very hacked version of an elf-like thing
|
||||||
* that gcc emits (when gcc is suitably hacked). To make it behave more
|
* that gcc emits (when gcc is suitably hacked). To make it behave more
|
||||||
|
@ -75,7 +75,6 @@ const char EXP_CHARS[] = "eE";
|
||||||
as in 0d1.0. */
|
as in 0d1.0. */
|
||||||
const char FLT_CHARS[] = "dD";
|
const char FLT_CHARS[] = "dD";
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
md_show_usage (stream)
|
md_show_usage (stream)
|
||||||
FILE *stream;
|
FILE *stream;
|
||||||
|
@ -116,7 +115,6 @@ static void i370_elf_lcomm PARAMS ((int));
|
||||||
static void i370_elf_validate_fix PARAMS ((fixS *, segT));
|
static void i370_elf_validate_fix PARAMS ((fixS *, segT));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* The target specific pseudo-ops which we support. */
|
/* The target specific pseudo-ops which we support. */
|
||||||
|
|
||||||
|
@ -186,7 +184,6 @@ struct pd_reg
|
||||||
1. r<reg_num> which has the value <reg_num>.
|
1. r<reg_num> which has the value <reg_num>.
|
||||||
2. r.<reg_num> which has the value <reg_num>.
|
2. r.<reg_num> which has the value <reg_num>.
|
||||||
|
|
||||||
|
|
||||||
Each floating point register has predefined names of the form:
|
Each floating point register has predefined names of the form:
|
||||||
1. f<reg_num> which has the value <reg_num>.
|
1. f<reg_num> which has the value <reg_num>.
|
||||||
2. f.<reg_num> which has the value <reg_num>.
|
2. f.<reg_num> which has the value <reg_num>.
|
||||||
|
@ -194,7 +191,6 @@ struct pd_reg
|
||||||
There are only four floating point registers, and these are
|
There are only four floating point registers, and these are
|
||||||
commonly labelled 0,2,4 and 6. Thus, there is no f1, f3, etc.
|
commonly labelled 0,2,4 and 6. Thus, there is no f1, f3, etc.
|
||||||
|
|
||||||
|
|
||||||
There are individual registers as well:
|
There are individual registers as well:
|
||||||
rbase or r.base has the value 3 (base register)
|
rbase or r.base has the value 3 (base register)
|
||||||
rpgt or r.pgt has the value 4 (page origin table pointer)
|
rpgt or r.pgt has the value 4 (page origin table pointer)
|
||||||
|
@ -205,7 +201,7 @@ struct pd_reg
|
||||||
dsa or r.dsa has the value 13 (stack pointer)
|
dsa or r.dsa has the value 13 (stack pointer)
|
||||||
lr has the value 14 (link reg)
|
lr has the value 14 (link reg)
|
||||||
|
|
||||||
The table is sorted. Suitable for searching by a binary search. */
|
The table is sorted. Suitable for searching by a binary search. */
|
||||||
|
|
||||||
static const struct pd_reg pre_defined_registers[] =
|
static const struct pd_reg pre_defined_registers[] =
|
||||||
{
|
{
|
||||||
|
@ -222,7 +218,6 @@ static const struct pd_reg pre_defined_registers[] =
|
||||||
{ "f4", 4 },
|
{ "f4", 4 },
|
||||||
{ "f6", 6 },
|
{ "f6", 6 },
|
||||||
|
|
||||||
|
|
||||||
{ "dsa",13 }, /* stack pointer */
|
{ "dsa",13 }, /* stack pointer */
|
||||||
{ "lr", 14 }, /* Link Register */
|
{ "lr", 14 }, /* Link Register */
|
||||||
{ "pgt", 4 }, /* Page Origin Table Pointer */
|
{ "pgt", 4 }, /* Page Origin Table Pointer */
|
||||||
|
@ -533,7 +528,7 @@ md_parse_option (c, arg)
|
||||||
|
|
||||||
/* Set i370_cpu if it is not already set.
|
/* Set i370_cpu if it is not already set.
|
||||||
Currently defaults to the reasonable superset;
|
Currently defaults to the reasonable superset;
|
||||||
but can be made more fine grained if desred. */
|
but can be made more fine grained if desred. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
i370_set_cpu ()
|
i370_set_cpu ()
|
||||||
|
@ -541,7 +536,7 @@ i370_set_cpu ()
|
||||||
const char *default_os = TARGET_OS;
|
const char *default_os = TARGET_OS;
|
||||||
const char *default_cpu = TARGET_CPU;
|
const char *default_cpu = TARGET_CPU;
|
||||||
|
|
||||||
/* override with the superset for the moment. */
|
/* override with the superset for the moment. */
|
||||||
i370_cpu = I370_OPCODE_ESA390_SUPERSET;
|
i370_cpu = I370_OPCODE_ESA390_SUPERSET;
|
||||||
if (i370_cpu == 0)
|
if (i370_cpu == 0)
|
||||||
{
|
{
|
||||||
|
@ -581,7 +576,7 @@ md_begin ()
|
||||||
i370_set_cpu ();
|
i370_set_cpu ();
|
||||||
|
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
/* Set the ELF flags if desired. */
|
/* Set the ELF flags if desired. */
|
||||||
if (i370_flags)
|
if (i370_flags)
|
||||||
bfd_set_private_flags (stdoutput, i370_flags);
|
bfd_set_private_flags (stdoutput, i370_flags);
|
||||||
#endif
|
#endif
|
||||||
|
@ -751,8 +746,8 @@ i370_elf_suffix (str_p, exp_p)
|
||||||
return BFD_RELOC_UNUSED;
|
return BFD_RELOC_UNUSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Like normal .long/.short/.word, except support @got, etc. */
|
/* Like normal .long/.short/.word, except support @got, etc. */
|
||||||
/* clobbers input_line_pointer, checks end-of-line. */
|
/* clobbers input_line_pointer, checks end-of-line. */
|
||||||
static void
|
static void
|
||||||
i370_elf_cons (nbytes)
|
i370_elf_cons (nbytes)
|
||||||
register int nbytes; /* 1=.byte, 2=.word, 4=.long */
|
register int nbytes; /* 1=.byte, 2=.word, 4=.long */
|
||||||
|
@ -792,7 +787,7 @@ i370_elf_cons (nbytes)
|
||||||
}
|
}
|
||||||
while (*input_line_pointer++ == ',');
|
while (*input_line_pointer++ == ',');
|
||||||
|
|
||||||
input_line_pointer--; /* Put terminator back into stream. */
|
input_line_pointer--; /* Put terminator back into stream. */
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1273,11 +1268,10 @@ i370_elf_validate_fix (fixp, seg)
|
||||||
}
|
}
|
||||||
#endif /* OBJ_ELF */
|
#endif /* OBJ_ELF */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define LITERAL_POOL_SUPPORT
|
#define LITERAL_POOL_SUPPORT
|
||||||
#ifdef LITERAL_POOL_SUPPORT
|
#ifdef LITERAL_POOL_SUPPORT
|
||||||
/* Provide support for literal pools within the text section. */
|
/* Provide support for literal pools within the text section. */
|
||||||
/* Loosely based on similar code from tc-arm.c */
|
/* Loosely based on similar code from tc-arm.c */
|
||||||
/*
|
/*
|
||||||
* We will use four symbols to locate four parts of the literal pool.
|
* We will use four symbols to locate four parts of the literal pool.
|
||||||
|
@ -1528,7 +1522,7 @@ i370_addr_offset (expressionS *exx)
|
||||||
expression (exx);
|
expression (exx);
|
||||||
|
|
||||||
/* OK, now we have to subtract the "using" location */
|
/* OK, now we have to subtract the "using" location */
|
||||||
/* normally branches appear in the text section only... */
|
/* normally branches appear in the text section only... */
|
||||||
if (0 == strncmp (now_seg->name, ".text", 5) || 0 > i370_using_other_regno)
|
if (0 == strncmp (now_seg->name, ".text", 5) || 0 > i370_using_other_regno)
|
||||||
{
|
{
|
||||||
i370_make_relative (exx, &i370_using_text_baseaddr);
|
i370_make_relative (exx, &i370_using_text_baseaddr);
|
||||||
|
@ -1755,7 +1749,6 @@ i370_ltorg (ignore)
|
||||||
else as_bad ("bad alignment of %d bytes in literal pool", biggest_literal_size);
|
else as_bad ("bad alignment of %d bytes in literal pool", biggest_literal_size);
|
||||||
if (0 == biggest_align) biggest_align = 1;
|
if (0 == biggest_align) biggest_align = 1;
|
||||||
|
|
||||||
|
|
||||||
/* Align pool for short, word, double word accesses */
|
/* Align pool for short, word, double word accesses */
|
||||||
frag_align (biggest_align, 0, 0);
|
frag_align (biggest_align, 0, 0);
|
||||||
record_alignment (now_seg, biggest_align);
|
record_alignment (now_seg, biggest_align);
|
||||||
|
@ -1763,7 +1756,7 @@ i370_ltorg (ignore)
|
||||||
/* Note that the gas listing will print only the first five
|
/* Note that the gas listing will print only the first five
|
||||||
* entries in the pool .... wonder how to make it print more ...
|
* entries in the pool .... wonder how to make it print more ...
|
||||||
*/
|
*/
|
||||||
/* output largest literals first, then the smaller ones. */
|
/* output largest literals first, then the smaller ones. */
|
||||||
for (litsize=8; litsize; litsize /=2)
|
for (litsize=8; litsize; litsize /=2)
|
||||||
{
|
{
|
||||||
symbolS *current_poolP = NULL;
|
symbolS *current_poolP = NULL;
|
||||||
|
@ -1841,13 +1834,13 @@ i370_using (ignore)
|
||||||
char *star;
|
char *star;
|
||||||
|
|
||||||
/* if "*" appears in a using, it means "." */
|
/* if "*" appears in a using, it means "." */
|
||||||
/* replace it with "." so that expr doesn't get confused. */
|
/* replace it with "." so that expr doesn't get confused. */
|
||||||
star = strchr (input_line_pointer, '*');
|
star = strchr (input_line_pointer, '*');
|
||||||
if (star)
|
if (star)
|
||||||
*star = '.';
|
*star = '.';
|
||||||
|
|
||||||
/* the first arg to using will usually be ".", but it can
|
/* the first arg to using will usually be ".", but it can
|
||||||
* be a more complex exprsssion too ... */
|
* be a more complex exprsssion too ... */
|
||||||
expression (&baseaddr);
|
expression (&baseaddr);
|
||||||
if (star)
|
if (star)
|
||||||
*star = '*';
|
*star = '*';
|
||||||
|
@ -2171,7 +2164,7 @@ md_assemble (str)
|
||||||
hold = input_line_pointer;
|
hold = input_line_pointer;
|
||||||
input_line_pointer = str;
|
input_line_pointer = str;
|
||||||
|
|
||||||
/* register names are only allowed where there are registers ... */
|
/* register names are only allowed where there are registers ... */
|
||||||
if ((operand->flags & I370_OPERAND_GPR) != 0)
|
if ((operand->flags & I370_OPERAND_GPR) != 0)
|
||||||
{
|
{
|
||||||
/* quickie hack to get past things like (,r13) */
|
/* quickie hack to get past things like (,r13) */
|
||||||
|
@ -2189,7 +2182,7 @@ md_assemble (str)
|
||||||
|
|
||||||
/* check for a address constant expression */
|
/* check for a address constant expression */
|
||||||
/* We will put PSW-relative addresses in the text section,
|
/* We will put PSW-relative addresses in the text section,
|
||||||
* and adress literals in the .data (or other) section. */
|
* and adress literals in the .data (or other) section. */
|
||||||
else if (i370_addr_cons (&ex))
|
else if (i370_addr_cons (&ex))
|
||||||
use_other=1;
|
use_other=1;
|
||||||
else if (i370_addr_offset (&ex))
|
else if (i370_addr_offset (&ex))
|
||||||
|
@ -2224,7 +2217,7 @@ md_assemble (str)
|
||||||
/* Allow @HA, @L, @H on constants.
|
/* Allow @HA, @L, @H on constants.
|
||||||
* Well actually, no we don't; there really don't make sense
|
* Well actually, no we don't; there really don't make sense
|
||||||
* (at least not to me) for the i370. However, this code is
|
* (at least not to me) for the i370. However, this code is
|
||||||
* left here for any dubious future expansion reasons ... */
|
* left here for any dubious future expansion reasons ... */
|
||||||
char *orig_str = str;
|
char *orig_str = str;
|
||||||
|
|
||||||
if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
|
if ((reloc = i370_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
|
||||||
|
@ -2620,7 +2613,7 @@ md_atof (type, litp, sizep)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 360/370/390 have two float formats: an old, funky 360 single-precision
|
/* 360/370/390 have two float formats: an old, funky 360 single-precision
|
||||||
* format, and the ieee format. Support only the ieee format. */
|
* format, and the ieee format. Support only the ieee format. */
|
||||||
t = atof_ieee (input_line_pointer, type, words);
|
t = atof_ieee (input_line_pointer, type, words);
|
||||||
if (t)
|
if (t)
|
||||||
input_line_pointer = t;
|
input_line_pointer = t;
|
||||||
|
@ -2705,7 +2698,6 @@ md_pcrel_from_section (fixp, sec)
|
||||||
return fixp->fx_frag->fr_address + fixp->fx_where;
|
return fixp->fx_frag->fr_address + fixp->fx_where;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Apply a fixup to the object code. This is called for all the
|
/* Apply a fixup to the object code. This is called for all the
|
||||||
fixups we generated by the call to fix_new_exp, above. In the call
|
fixups we generated by the call to fix_new_exp, above. In the call
|
||||||
above we used a reloc code which was the largest legal reloc code
|
above we used a reloc code which was the largest legal reloc code
|
||||||
|
@ -2797,7 +2789,7 @@ md_apply_fix3 (fixp, valuep, seg)
|
||||||
#endif
|
#endif
|
||||||
/* Fetch the instruction, insert the fully resolved operand
|
/* Fetch the instruction, insert the fully resolved operand
|
||||||
value, and stuff the instruction back again.
|
value, and stuff the instruction back again.
|
||||||
fisxp->fx_size is the length of the instruction. */
|
fisxp->fx_size is the length of the instruction. */
|
||||||
where = fixp->fx_frag->fr_literal + fixp->fx_where;
|
where = fixp->fx_frag->fr_literal + fixp->fx_where;
|
||||||
insn.i[0] = bfd_getb32 ((unsigned char *) where);
|
insn.i[0] = bfd_getb32 ((unsigned char *) where);
|
||||||
if (6 <= fixp->fx_size)
|
if (6 <= fixp->fx_size)
|
||||||
|
@ -2824,7 +2816,7 @@ md_apply_fix3 (fixp, valuep, seg)
|
||||||
relocs. In fact, we support *zero* operand relocations ...
|
relocs. In fact, we support *zero* operand relocations ...
|
||||||
Why? Because we are not expecting the compiler to generate
|
Why? Because we are not expecting the compiler to generate
|
||||||
any operands that need relocation. Due to the 12-bit naturew of
|
any operands that need relocation. Due to the 12-bit naturew of
|
||||||
i370 addressing, this would be unusual. */
|
i370 addressing, this would be unusual. */
|
||||||
#if 0
|
#if 0
|
||||||
if ((operand->flags & I370_OPERAND_RELATIVE) != 0
|
if ((operand->flags & I370_OPERAND_RELATIVE) != 0
|
||||||
&& operand->bits == 12
|
&& operand->bits == 12
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* tc-i960.c - All the i80960-specific stuff
|
/* tc-i960.c - All the i80960-specific stuff
|
||||||
Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999
|
Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GAS.
|
This file is part of GAS.
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
/* See comment on md_parse_option for 80960-specific invocation options. */
|
/* See comment on md_parse_option for 80960-specific invocation options. */
|
||||||
|
|
||||||
/* There are 4 different lengths of (potentially) symbol-based displacements
|
/* There are 4 different lengths of (potentially) symbol-based displacements
|
||||||
in the 80960 instruction set, each of which could require address fix-ups
|
in the 80960 instruction set, each of which could require address fix-ups
|
||||||
|
@ -178,7 +178,7 @@ const char comment_chars[] = "#";
|
||||||
#NO_APP at the beginning of its output.
|
#NO_APP at the beginning of its output.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Also note that comments started like this one will always work. */
|
/* Also note that comments started like this one will always work. */
|
||||||
|
|
||||||
const char line_comment_chars[] = "";
|
const char line_comment_chars[] = "";
|
||||||
|
|
||||||
|
@ -192,7 +192,6 @@ const char EXP_CHARS[] = "eE";
|
||||||
*/
|
*/
|
||||||
const char FLT_CHARS[] = "fFdDtT";
|
const char FLT_CHARS[] = "fFdDtT";
|
||||||
|
|
||||||
|
|
||||||
/* Table used by base assembler to relax addresses based on varying length
|
/* Table used by base assembler to relax addresses based on varying length
|
||||||
instructions. The fields are:
|
instructions. The fields are:
|
||||||
1) most positive reach of this state,
|
1) most positive reach of this state,
|
||||||
|
@ -242,13 +241,11 @@ const pseudo_typeS md_pseudo_table[] =
|
||||||
#define adds(e) e.X_add_symbol
|
#define adds(e) e.X_add_symbol
|
||||||
#define offs(e) e.X_add_number
|
#define offs(e) e.X_add_number
|
||||||
|
|
||||||
|
|
||||||
/* Branch-prediction bits for CTRL/COBR format opcodes */
|
/* Branch-prediction bits for CTRL/COBR format opcodes */
|
||||||
#define BP_MASK 0x00000002 /* Mask for branch-prediction bit */
|
#define BP_MASK 0x00000002 /* Mask for branch-prediction bit */
|
||||||
#define BP_TAKEN 0x00000000 /* Value to OR in to predict branch */
|
#define BP_TAKEN 0x00000000 /* Value to OR in to predict branch */
|
||||||
#define BP_NOT_TAKEN 0x00000002 /* Value to OR in to predict no branch */
|
#define BP_NOT_TAKEN 0x00000002 /* Value to OR in to predict no branch */
|
||||||
|
|
||||||
|
|
||||||
/* Some instruction opcodes that we need explicitly */
|
/* Some instruction opcodes that we need explicitly */
|
||||||
#define BE 0x12000000
|
#define BE 0x12000000
|
||||||
#define BG 0x11000000
|
#define BG 0x11000000
|
||||||
|
@ -268,14 +265,12 @@ const pseudo_typeS md_pseudo_table[] =
|
||||||
#define CALLS 0x66003800
|
#define CALLS 0x66003800
|
||||||
#define RET 0x0a000000
|
#define RET 0x0a000000
|
||||||
|
|
||||||
|
/* These masks are used to build up a set of MEMB mode bits. */
|
||||||
/* These masks are used to build up a set of MEMB mode bits. */
|
|
||||||
#define A_BIT 0x0400
|
#define A_BIT 0x0400
|
||||||
#define I_BIT 0x0800
|
#define I_BIT 0x0800
|
||||||
#define MEMB_BIT 0x1000
|
#define MEMB_BIT 0x1000
|
||||||
#define D_BIT 0x2000
|
#define D_BIT 0x2000
|
||||||
|
|
||||||
|
|
||||||
/* Mask for the only mode bit in a MEMA instruction (if set, abase reg is
|
/* Mask for the only mode bit in a MEMA instruction (if set, abase reg is
|
||||||
used). */
|
used). */
|
||||||
#define MEMA_ABASE 0x2000
|
#define MEMA_ABASE 0x2000
|
||||||
|
@ -294,7 +289,6 @@ typedef struct
|
||||||
|
|
||||||
memS;
|
memS;
|
||||||
|
|
||||||
|
|
||||||
/* The two pieces of info we need to generate a register operand */
|
/* The two pieces of info we need to generate a register operand */
|
||||||
struct regop
|
struct regop
|
||||||
{
|
{
|
||||||
|
@ -303,7 +297,6 @@ struct regop
|
||||||
int n; /* Register number or literal value */
|
int n; /* Register number or literal value */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Number and assembler mnemonic for all registers that can appear in
|
/* Number and assembler mnemonic for all registers that can appear in
|
||||||
operands. */
|
operands. */
|
||||||
static const struct
|
static const struct
|
||||||
|
@ -449,13 +442,11 @@ aregs[] =
|
||||||
{ NULL, 0 }, /* END OF LIST */
|
{ NULL, 0 }, /* END OF LIST */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Hash tables */
|
/* Hash tables */
|
||||||
static struct hash_control *op_hash; /* Opcode mnemonics */
|
static struct hash_control *op_hash; /* Opcode mnemonics */
|
||||||
static struct hash_control *reg_hash; /* Register name hash table */
|
static struct hash_control *reg_hash; /* Register name hash table */
|
||||||
static struct hash_control *areg_hash; /* Abase register hash table */
|
static struct hash_control *areg_hash; /* Abase register hash table */
|
||||||
|
|
||||||
|
|
||||||
/* Architecture for which we are assembling */
|
/* Architecture for which we are assembling */
|
||||||
#define ARCH_ANY 0 /* Default: no architecture checking done */
|
#define ARCH_ANY 0 /* Default: no architecture checking done */
|
||||||
#define ARCH_KA 1
|
#define ARCH_KA 1
|
||||||
|
@ -470,7 +461,6 @@ int iclasses_seen; /* OR of instruction classes (I_* constants)
|
||||||
* instructions.
|
* instructions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* BRANCH-PREDICTION INSTRUMENTATION
|
/* BRANCH-PREDICTION INSTRUMENTATION
|
||||||
|
|
||||||
The following supports generation of branch-prediction instrumentation
|
The following supports generation of branch-prediction instrumentation
|
||||||
|
@ -592,7 +582,6 @@ md_assemble (textP)
|
||||||
|
|
||||||
const char *bp_error_msg = _("branch prediction invalid on this opcode");
|
const char *bp_error_msg = _("branch prediction invalid on this opcode");
|
||||||
|
|
||||||
|
|
||||||
/* Parse instruction into opcode and operands */
|
/* Parse instruction into opcode and operands */
|
||||||
memset (args, '\0', sizeof (args));
|
memset (args, '\0', sizeof (args));
|
||||||
n_ops = i_scan (textP, args);
|
n_ops = i_scan (textP, args);
|
||||||
|
@ -611,8 +600,6 @@ md_assemble (textP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Check for branch-prediction suffix on opcode mnemonic, strip it off */
|
/* Check for branch-prediction suffix on opcode mnemonic, strip it off */
|
||||||
n = strlen (args[0]) - 1;
|
n = strlen (args[0]) - 1;
|
||||||
branch_predict = 0;
|
branch_predict = 0;
|
||||||
|
@ -735,7 +722,6 @@ md_chars_to_number (val, n)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define MAX_LITTLENUMS 6
|
#define MAX_LITTLENUMS 6
|
||||||
#define LNUM_SIZE sizeof(LITTLENUM_TYPE)
|
#define LNUM_SIZE sizeof(LITTLENUM_TYPE)
|
||||||
|
|
||||||
|
@ -808,7 +794,6 @@ md_atof (type, litP, sizeP)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
md_number_to_imm
|
md_number_to_imm
|
||||||
|
|
||||||
|
@ -822,7 +807,6 @@ md_number_to_imm (buf, val, n)
|
||||||
md_number_to_chars (buf, val, n);
|
md_number_to_chars (buf, val, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
md_number_to_disp
|
md_number_to_disp
|
||||||
|
|
||||||
|
@ -918,7 +902,6 @@ md_number_to_field (instrP, val, bfixP)
|
||||||
|
|
||||||
A table of all such "Labels" is also generated.
|
A table of all such "Labels" is also generated.
|
||||||
|
|
||||||
|
|
||||||
-AKA, -AKB, -AKC, -ASA, -ASB, -AMC, -ACA:
|
-AKA, -AKB, -AKC, -ASA, -ASB, -AMC, -ACA:
|
||||||
Select the 80960 architecture. Instructions or features not
|
Select the 80960 architecture. Instructions or features not
|
||||||
supported by the selected architecture cause fatal errors.
|
supported by the selected architecture cause fatal errors.
|
||||||
|
@ -1264,7 +1247,6 @@ cobr_fmt (arg, opcode, oP)
|
||||||
instr |= (regop.n << 14) | regop.special;
|
instr |= (regop.n << 14) | regop.special;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (n < 3)
|
if (n < 3)
|
||||||
{
|
{
|
||||||
emit (instr);
|
emit (instr);
|
||||||
|
@ -1293,7 +1275,6 @@ cobr_fmt (arg, opcode, oP)
|
||||||
}
|
}
|
||||||
} /* cobr_fmt() */
|
} /* cobr_fmt() */
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
ctrl_fmt: generate a CTRL-format instruction
|
ctrl_fmt: generate a CTRL-format instruction
|
||||||
|
|
||||||
|
@ -1309,7 +1290,6 @@ ctrl_fmt (targP, opcode, num_ops)
|
||||||
* how often the branch is taken
|
* how often the branch is taken
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
if (num_ops == 0)
|
if (num_ops == 0)
|
||||||
{
|
{
|
||||||
emit (opcode); /* Output opcode */
|
emit (opcode); /* Output opcode */
|
||||||
|
@ -1339,7 +1319,6 @@ ctrl_fmt (targP, opcode, num_ops)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
emit: output instruction binary
|
emit: output instruction binary
|
||||||
|
|
||||||
|
@ -1359,7 +1338,6 @@ emit (instr)
|
||||||
return toP;
|
return toP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
get_args: break individual arguments out of comma-separated list
|
get_args: break individual arguments out of comma-separated list
|
||||||
|
|
||||||
|
@ -1439,7 +1417,6 @@ get_args (p, args)
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
get_cdisp: handle displacement for a COBR or CTRL instruction.
|
get_cdisp: handle displacement for a COBR or CTRL instruction.
|
||||||
|
|
||||||
|
@ -1529,7 +1506,6 @@ get_cdisp (dispP, ifmtP, instr, numbits, var_frag, callj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
get_ispec: parse a memory operand for an index specification
|
get_ispec: parse a memory operand for an index specification
|
||||||
|
|
||||||
|
@ -1600,7 +1576,6 @@ get_regnum (regname)
|
||||||
return (rP == NULL) ? -1 : *rP;
|
return (rP == NULL) ? -1 : *rP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
i_scan: perform lexical scan of ascii assembler instruction.
|
i_scan: perform lexical scan of ascii assembler instruction.
|
||||||
|
|
||||||
|
@ -1621,7 +1596,7 @@ get_regnum (regname)
|
||||||
*************************************************************************** */
|
*************************************************************************** */
|
||||||
static int
|
static int
|
||||||
i_scan (iP, args)
|
i_scan (iP, args)
|
||||||
/* Pointer to ascii instruction; MUCKED BY US. */
|
/* Pointer to ascii instruction; MUCKED BY US. */
|
||||||
register char *iP;
|
register char *iP;
|
||||||
/* Output arg: pointers to opcode and operands placed here. MUST
|
/* Output arg: pointers to opcode and operands placed here. MUST
|
||||||
ACCOMMODATE 4 ENTRIES. */
|
ACCOMMODATE 4 ENTRIES. */
|
||||||
|
@ -1652,7 +1627,6 @@ i_scan (iP, args)
|
||||||
return (get_args (iP, args));
|
return (get_args (iP, args));
|
||||||
} /* i_scan() */
|
} /* i_scan() */
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
mem_fmt: generate a MEMA- or MEMB-format instruction
|
mem_fmt: generate a MEMA- or MEMB-format instruction
|
||||||
|
|
||||||
|
@ -1680,7 +1654,7 @@ mem_fmt (args, oP, callx)
|
||||||
memset (&instr, '\0', sizeof (memS));
|
memset (&instr, '\0', sizeof (memS));
|
||||||
instr.opcode = oP->opcode;
|
instr.opcode = oP->opcode;
|
||||||
|
|
||||||
/* Process operands. */
|
/* Process operands. */
|
||||||
for (i = 1; i <= oP->num_ops; i++)
|
for (i = 1; i <= oP->num_ops; i++)
|
||||||
{
|
{
|
||||||
opdesc = oP->operand[i - 1];
|
opdesc = oP->operand[i - 1];
|
||||||
|
@ -1771,7 +1745,6 @@ mem_fmt (args, oP, callx)
|
||||||
}
|
}
|
||||||
} /* memfmt() */
|
} /* memfmt() */
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
mema_to_memb: convert a MEMA-format opcode to a MEMB-format opcode.
|
mema_to_memb: convert a MEMA-format opcode to a MEMB-format opcode.
|
||||||
|
|
||||||
|
@ -1804,7 +1777,6 @@ mema_to_memb (opcodeP)
|
||||||
md_number_to_chars (opcodeP, opcode, 4);
|
md_number_to_chars (opcodeP, opcode, 4);
|
||||||
} /* mema_to_memb() */
|
} /* mema_to_memb() */
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
parse_expr: parse an expression
|
parse_expr: parse an expression
|
||||||
|
|
||||||
|
@ -1858,7 +1830,6 @@ parse_expr (textP, expP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
parse_ldcont:
|
parse_ldcont:
|
||||||
Parse and replace a 'ldconst' pseudo-instruction with an appropriate
|
Parse and replace a 'ldconst' pseudo-instruction with an appropriate
|
||||||
|
@ -1885,7 +1856,6 @@ parse_ldconst (arg)
|
||||||
static char buf2[5]; /* Literal for second operand */
|
static char buf2[5]; /* Literal for second operand */
|
||||||
expressionS e; /* Parsed expression */
|
expressionS e; /* Parsed expression */
|
||||||
|
|
||||||
|
|
||||||
arg[3] = NULL; /* So we can tell at the end if it got used or not */
|
arg[3] = NULL; /* So we can tell at the end if it got used or not */
|
||||||
|
|
||||||
parse_expr (arg[1], &e);
|
parse_expr (arg[1], &e);
|
||||||
|
@ -2020,7 +1990,6 @@ parse_memop (memP, argP, optype)
|
||||||
16 /* MEM16 */
|
16 /* MEM16 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
iprel_flag = mode = 0;
|
iprel_flag = mode = 0;
|
||||||
|
|
||||||
/* Any index present? */
|
/* Any index present? */
|
||||||
|
@ -2208,7 +2177,7 @@ parse_po (po_num)
|
||||||
|
|
||||||
extern char is_end_of_line[];
|
extern char is_end_of_line[];
|
||||||
|
|
||||||
/* Advance input pointer to end of line. */
|
/* Advance input pointer to end of line. */
|
||||||
p = input_line_pointer;
|
p = input_line_pointer;
|
||||||
while (!is_end_of_line[(unsigned char) *input_line_pointer])
|
while (!is_end_of_line[(unsigned char) *input_line_pointer])
|
||||||
{
|
{
|
||||||
|
@ -2358,7 +2327,6 @@ reg_fmt (args, oP)
|
||||||
struct regop regop; /* Description of register operand */
|
struct regop regop; /* Description of register operand */
|
||||||
int n_ops; /* Number of operands */
|
int n_ops; /* Number of operands */
|
||||||
|
|
||||||
|
|
||||||
instr = oP->opcode;
|
instr = oP->opcode;
|
||||||
n_ops = oP->num_ops;
|
n_ops = oP->num_ops;
|
||||||
|
|
||||||
|
@ -2425,7 +2393,6 @@ reg_fmt (args, oP)
|
||||||
emit (instr);
|
emit (instr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
relax_cobr:
|
relax_cobr:
|
||||||
Replace cobr instruction in a code fragment with equivalent branch and
|
Replace cobr instruction in a code fragment with equivalent branch and
|
||||||
|
@ -2512,7 +2479,6 @@ relax_cobr (fragP)
|
||||||
frag_wane (fragP);
|
frag_wane (fragP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
reloc_callj: Relocate a 'callj' instruction
|
reloc_callj: Relocate a 'callj' instruction
|
||||||
|
|
||||||
|
@ -2580,7 +2546,6 @@ reloc_callj (fixP)
|
||||||
/* else Symbol is neither a sysproc nor a leafproc */
|
/* else Symbol is neither a sysproc nor a leafproc */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
s_leafproc: process .leafproc pseudo-op
|
s_leafproc: process .leafproc pseudo-op
|
||||||
|
|
||||||
|
@ -2610,7 +2575,7 @@ s_leafproc (n_ops, args)
|
||||||
return;
|
return;
|
||||||
} /* Check number of arguments */
|
} /* Check number of arguments */
|
||||||
|
|
||||||
/* Find or create symbol for 'call' entry point. */
|
/* Find or create symbol for 'call' entry point. */
|
||||||
callP = symbol_find_or_make (args[1]);
|
callP = symbol_find_or_make (args[1]);
|
||||||
|
|
||||||
if (TC_S_IS_CALLNAME (callP))
|
if (TC_S_IS_CALLNAME (callP))
|
||||||
|
@ -2644,7 +2609,6 @@ s_leafproc (n_ops, args)
|
||||||
} /* if only one arg, or the args are the same */
|
} /* if only one arg, or the args are the same */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
s_sysproc: process .sysproc pseudo-op
|
s_sysproc: process .sysproc pseudo-op
|
||||||
|
|
||||||
|
@ -2670,7 +2634,7 @@ s_sysproc (n_ops, args)
|
||||||
return;
|
return;
|
||||||
} /* bad arg count */
|
} /* bad arg count */
|
||||||
|
|
||||||
/* Parse "entry_num" argument and check it for validity. */
|
/* Parse "entry_num" argument and check it for validity. */
|
||||||
parse_expr (args[2], &exp);
|
parse_expr (args[2], &exp);
|
||||||
if (exp.X_op != O_constant
|
if (exp.X_op != O_constant
|
||||||
|| (offs (exp) < 0)
|
|| (offs (exp) < 0)
|
||||||
|
@ -2692,7 +2656,6 @@ s_sysproc (n_ops, args)
|
||||||
TC_S_FORCE_TO_SYSPROC (symP);
|
TC_S_FORCE_TO_SYSPROC (symP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
shift_ok:
|
shift_ok:
|
||||||
Determine if a "shlo" instruction can be used to implement a "ldconst".
|
Determine if a "shlo" instruction can be used to implement a "ldconst".
|
||||||
|
@ -2729,7 +2692,6 @@ shift_ok (n)
|
||||||
return shift;
|
return shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* syntax: issue syntax error */
|
/* syntax: issue syntax error */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2738,7 +2700,6 @@ syntax ()
|
||||||
as_bad (_("syntax error"));
|
as_bad (_("syntax error"));
|
||||||
} /* syntax() */
|
} /* syntax() */
|
||||||
|
|
||||||
|
|
||||||
/* targ_has_sfr:
|
/* targ_has_sfr:
|
||||||
|
|
||||||
Return TRUE iff the target architecture supports the specified
|
Return TRUE iff the target architecture supports the specified
|
||||||
|
@ -2764,7 +2725,6 @@ targ_has_sfr (n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* targ_has_iclass:
|
/* targ_has_iclass:
|
||||||
|
|
||||||
Return TRUE iff the target architecture supports the indicated
|
Return TRUE iff the target architecture supports the indicated
|
||||||
|
@ -2826,7 +2786,7 @@ s_endian (ignore)
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We have no need to default values of symbols. */
|
/* We have no need to default values of symbols. */
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
symbolS *
|
symbolS *
|
||||||
|
@ -2838,7 +2798,7 @@ md_undefined_symbol (name)
|
||||||
|
|
||||||
/* Exactly what point is a PC-relative offset relative TO?
|
/* Exactly what point is a PC-relative offset relative TO?
|
||||||
On the i960, they're relative to the address of the instruction,
|
On the i960, they're relative to the address of the instruction,
|
||||||
which we have set up as the address of the fixup too. */
|
which we have set up as the address of the fixup too. */
|
||||||
long
|
long
|
||||||
md_pcrel_from (fixP)
|
md_pcrel_from (fixP)
|
||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
|
@ -2940,7 +2900,7 @@ tc_bout_fix_to_chars (where, fixP, segment_address_in_file)
|
||||||
ri.r_index = S_GET_TYPE (symbolP);
|
ri.r_index = S_GET_TYPE (symbolP);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output the relocation information in machine-dependent form. */
|
/* Output the relocation information in machine-dependent form. */
|
||||||
md_ri_to_chars (where, &ri);
|
md_ri_to_chars (where, &ri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3248,7 +3208,7 @@ i960_validate_fix (fixP, this_segment_type, add_symbolPP)
|
||||||
if (fixP->fx_tcbit && TC_S_IS_CALLNAME (add_symbolP))
|
if (fixP->fx_tcbit && TC_S_IS_CALLNAME (add_symbolP))
|
||||||
{
|
{
|
||||||
/* Relocation should be done via the associated 'bal'
|
/* Relocation should be done via the associated 'bal'
|
||||||
entry point symbol. */
|
entry point symbol. */
|
||||||
|
|
||||||
if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
|
if (!TC_S_IS_BALNAME (tc_get_bal_of_call (add_symbolP)))
|
||||||
{
|
{
|
||||||
|
@ -3273,7 +3233,7 @@ i960_validate_fix (fixP, this_segment_type, add_symbolPP)
|
||||||
displacement and are only to be used for local branches:
|
displacement and are only to be used for local branches:
|
||||||
flag as error, don't generate relocation. */
|
flag as error, don't generate relocation. */
|
||||||
as_bad (_("can't use COBR format with external label"));
|
as_bad (_("can't use COBR format with external label"));
|
||||||
fixP->fx_addsy = NULL; /* No relocations please. */
|
fixP->fx_addsy = NULL; /* No relocations please. */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,8 +46,8 @@ const char *m68k_comment_chars = "|";
|
||||||
.line and .file directives will appear in the pre-processed output */
|
.line and .file directives will appear in the pre-processed output */
|
||||||
/* Note that input_file.c hand checks for '#' at the beginning of the
|
/* Note that input_file.c hand checks for '#' at the beginning of the
|
||||||
first line of the input file. This is because the compiler outputs
|
first line of the input file. This is because the compiler outputs
|
||||||
#NO_APP at the beginning of its output. */
|
#NO_APP at the beginning of its output. */
|
||||||
/* Also note that comments like this one will always work. */
|
/* Also note that comments like this one will always work. */
|
||||||
const char line_comment_chars[] = "#*";
|
const char line_comment_chars[] = "#*";
|
||||||
|
|
||||||
const char line_separator_chars[] = ";";
|
const char line_separator_chars[] = ";";
|
||||||
|
@ -68,7 +68,7 @@ const int md_reloc_size = 8; /* Size of relocation record */
|
||||||
|
|
||||||
/* Are we trying to generate PIC code? If so, absolute references
|
/* Are we trying to generate PIC code? If so, absolute references
|
||||||
ought to be made into linkage table references or pc-relative
|
ought to be made into linkage table references or pc-relative
|
||||||
references. Not implemented. For ELF there are other means
|
references. Not implemented. For ELF there are other means
|
||||||
to denote pic relocations. */
|
to denote pic relocations. */
|
||||||
int flag_want_pic;
|
int flag_want_pic;
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ static const enum m68k_register m68060_control_regs[] = {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
static const enum m68k_register mcf_control_regs[] = {
|
static const enum m68k_register mcf_control_regs[] = {
|
||||||
CACR, TC, ITT0, ITT1, DTT0, DTT1, VBR, ROMBAR,
|
CACR, TC, ITT0, ITT1, DTT0, DTT1, VBR, ROMBAR,
|
||||||
RAMBAR0, RAMBAR1, MBAR,
|
RAMBAR0, RAMBAR1, MBAR,
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
@ -437,7 +437,7 @@ static const int n_archs = sizeof (archs) / sizeof (archs[0]);
|
||||||
on the 68000. The 68000 doesn't support long branches with branchs */
|
on the 68000. The 68000 doesn't support long branches with branchs */
|
||||||
|
|
||||||
/* This table desribes how you change sizes for the various types of variable
|
/* This table desribes how you change sizes for the various types of variable
|
||||||
size expressions. This version only supports two kinds. */
|
size expressions. This version only supports two kinds. */
|
||||||
|
|
||||||
/* Note that calls to frag_var need to specify the maximum expansion
|
/* Note that calls to frag_var need to specify the maximum expansion
|
||||||
needed; this is currently 10 bytes for DBCC. */
|
needed; this is currently 10 bytes for DBCC. */
|
||||||
|
@ -563,7 +563,6 @@ const pseudo_typeS md_pseudo_table[] =
|
||||||
{0, 0, 0}
|
{0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* The mote pseudo ops are put into the opcode table, since they
|
/* The mote pseudo ops are put into the opcode table, since they
|
||||||
don't start with a . they look like opcodes to gas.
|
don't start with a . they look like opcodes to gas.
|
||||||
*/
|
*/
|
||||||
|
@ -794,7 +793,7 @@ int
|
||||||
tc_m68k_fix_adjustable (fixP)
|
tc_m68k_fix_adjustable (fixP)
|
||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
{
|
{
|
||||||
/* Prevent all adjustments to global symbols. */
|
/* Prevent all adjustments to global symbols. */
|
||||||
if (S_IS_EXTERNAL (fixP->fx_addsy)
|
if (S_IS_EXTERNAL (fixP->fx_addsy)
|
||||||
|| S_IS_WEAK (fixP->fx_addsy))
|
|| S_IS_WEAK (fixP->fx_addsy))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -955,7 +954,7 @@ tc_gen_reloc (section, fixp)
|
||||||
#define relaxable_symbol(symbol) 1
|
#define relaxable_symbol(symbol) 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Handle of the OPCODE hash table. NULL means any use before
|
/* Handle of the OPCODE hash table. NULL means any use before
|
||||||
m68k_ip_begin() will crash. */
|
m68k_ip_begin() will crash. */
|
||||||
static struct hash_control *op_hash;
|
static struct hash_control *op_hash;
|
||||||
|
@ -984,7 +983,7 @@ m68k_ip (instring)
|
||||||
instring++; /* skip leading whitespace */
|
instring++; /* skip leading whitespace */
|
||||||
|
|
||||||
/* Scan up to end of operation-code, which MUST end in end-of-string
|
/* Scan up to end of operation-code, which MUST end in end-of-string
|
||||||
or exactly 1 space. */
|
or exactly 1 space. */
|
||||||
pdot = 0;
|
pdot = 0;
|
||||||
for (p = instring; *p != '\0'; p++)
|
for (p = instring; *p != '\0'; p++)
|
||||||
{
|
{
|
||||||
|
@ -1093,7 +1092,7 @@ m68k_ip (instring)
|
||||||
for (losing = 0;;)
|
for (losing = 0;;)
|
||||||
{
|
{
|
||||||
/* If we didn't get the right number of ops, or we have no
|
/* If we didn't get the right number of ops, or we have no
|
||||||
common model with this pattern then reject this pattern. */
|
common model with this pattern then reject this pattern. */
|
||||||
|
|
||||||
ok_arch |= opcode->m_arch;
|
ok_arch |= opcode->m_arch;
|
||||||
if (opsfound != opcode->m_opnum
|
if (opsfound != opcode->m_opnum
|
||||||
|
@ -1756,7 +1755,7 @@ m68k_ip (instring)
|
||||||
&& opP->reg != BC))
|
&& opP->reg != BC))
|
||||||
{
|
{
|
||||||
losing++;
|
losing++;
|
||||||
} /* not a cache specifier. */
|
} /* not a cache specifier. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '_':
|
case '_':
|
||||||
|
@ -1769,7 +1768,7 @@ m68k_ip (instring)
|
||||||
losing++;
|
losing++;
|
||||||
/* FIXME: kludge instead of fixing parser:
|
/* FIXME: kludge instead of fixing parser:
|
||||||
upper/lower registers are *not* CONTROL
|
upper/lower registers are *not* CONTROL
|
||||||
registers, but ordinary ones. */
|
registers, but ordinary ones. */
|
||||||
if ((opP->reg >= DATA0L && opP->reg <= DATA7L)
|
if ((opP->reg >= DATA0L && opP->reg <= DATA7L)
|
||||||
|| (opP->reg >= DATA0U && opP->reg <= DATA7U))
|
|| (opP->reg >= DATA0U && opP->reg <= DATA7U))
|
||||||
opP->mode = DREG;
|
opP->mode = DREG;
|
||||||
|
@ -1789,7 +1788,7 @@ m68k_ip (instring)
|
||||||
if (!losing)
|
if (!losing)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
} /* got it. */
|
} /* got it. */
|
||||||
|
|
||||||
opcode = opcode->m_next;
|
opcode = opcode->m_next;
|
||||||
|
|
||||||
|
@ -2145,9 +2144,9 @@ m68k_ip (instring)
|
||||||
&& m68k_index_width_default == SIZE_LONG))
|
&& m68k_index_width_default == SIZE_LONG))
|
||||||
nextword |= 0x800;
|
nextword |= 0x800;
|
||||||
|
|
||||||
if ((opP->index.scale != 1
|
if ((opP->index.scale != 1
|
||||||
&& cpu_of_arch (current_architecture) < m68020)
|
&& cpu_of_arch (current_architecture) < m68020)
|
||||||
|| (opP->index.scale == 8
|
|| (opP->index.scale == 8
|
||||||
&& arch_coldfire_p (current_architecture)))
|
&& arch_coldfire_p (current_architecture)))
|
||||||
{
|
{
|
||||||
opP->error =
|
opP->error =
|
||||||
|
@ -2823,7 +2822,7 @@ m68k_ip (instring)
|
||||||
install_operand (s[1], tmpreg);
|
install_operand (s[1], tmpreg);
|
||||||
break;
|
break;
|
||||||
#ifndef NO_68851
|
#ifndef NO_68851
|
||||||
/* JF: These are out of order, I fear. */
|
/* JF: These are out of order, I fear. */
|
||||||
case 'f':
|
case 'f':
|
||||||
switch (opP->reg)
|
switch (opP->reg)
|
||||||
{
|
{
|
||||||
|
@ -2961,7 +2960,7 @@ m68k_ip (instring)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* By the time whe get here (FINALLY) the_ins contains the complete
|
/* By the time whe get here (FINALLY) the_ins contains the complete
|
||||||
instruction, ready to be emitted. . . */
|
instruction, ready to be emitted. . . */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -3427,7 +3426,7 @@ static const struct init_entry init_table[] =
|
||||||
{ "za6", ZADDR6 },
|
{ "za6", ZADDR6 },
|
||||||
{ "za7", ZADDR7 },
|
{ "za7", ZADDR7 },
|
||||||
|
|
||||||
/* Upper and lower data and address registers, used by macw and msacw. */
|
/* Upper and lower data and address registers, used by macw and msacw. */
|
||||||
{ "d0l", DATA0L },
|
{ "d0l", DATA0L },
|
||||||
{ "d1l", DATA1L },
|
{ "d1l", DATA1L },
|
||||||
{ "d2l", DATA2L },
|
{ "d2l", DATA2L },
|
||||||
|
@ -3725,7 +3724,7 @@ md_begin ()
|
||||||
{
|
{
|
||||||
ins = &m68k_opcodes[i];
|
ins = &m68k_opcodes[i];
|
||||||
/* We *could* ignore insns that don't match our arch here
|
/* We *could* ignore insns that don't match our arch here
|
||||||
but just leaving them out of the hash. */
|
but just leaving them out of the hash. */
|
||||||
slak->m_operands = ins->args;
|
slak->m_operands = ins->args;
|
||||||
slak->m_opnum = strlen (slak->m_operands) / 2;
|
slak->m_opnum = strlen (slak->m_operands) / 2;
|
||||||
slak->m_arch = ins->arch;
|
slak->m_arch = ins->arch;
|
||||||
|
@ -4284,7 +4283,7 @@ md_convert_frag_1 (fragP)
|
||||||
|
|
||||||
/* Address in gas core of the place to store the displacement. */
|
/* Address in gas core of the place to store the displacement. */
|
||||||
/* This convinces the native rs6000 compiler to generate the code we
|
/* This convinces the native rs6000 compiler to generate the code we
|
||||||
want. */
|
want. */
|
||||||
register char *buffer_address = fragP->fr_literal;
|
register char *buffer_address = fragP->fr_literal;
|
||||||
buffer_address += fragP->fr_fix;
|
buffer_address += fragP->fr_fix;
|
||||||
/* end ibm compiler workaround */
|
/* end ibm compiler workaround */
|
||||||
|
@ -4322,7 +4321,7 @@ md_convert_frag_1 (fragP)
|
||||||
{
|
{
|
||||||
if (flag_keep_pcrel)
|
if (flag_keep_pcrel)
|
||||||
as_bad (_("long branch not supported"));
|
as_bad (_("long branch not supported"));
|
||||||
|
|
||||||
if (fragP->fr_opcode[0] == 0x61)
|
if (fragP->fr_opcode[0] == 0x61)
|
||||||
/* BSR */
|
/* BSR */
|
||||||
{
|
{
|
||||||
|
@ -4354,7 +4353,7 @@ md_convert_frag_1 (fragP)
|
||||||
{
|
{
|
||||||
/* This should never happen, because if it's a conditional
|
/* This should never happen, because if it's a conditional
|
||||||
branch and we are on a 68000, BCC68000 should have been
|
branch and we are on a 68000, BCC68000 should have been
|
||||||
picked instead of ABRANCH. */
|
picked instead of ABRANCH. */
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4369,13 +4368,13 @@ md_convert_frag_1 (fragP)
|
||||||
/* change bcc into b!cc/jmp absl long */
|
/* change bcc into b!cc/jmp absl long */
|
||||||
if (flag_keep_pcrel)
|
if (flag_keep_pcrel)
|
||||||
as_bad (_("long branch not supported"));
|
as_bad (_("long branch not supported"));
|
||||||
|
|
||||||
fragP->fr_opcode[0] ^= 0x01; /* invert bcc */
|
fragP->fr_opcode[0] ^= 0x01; /* invert bcc */
|
||||||
fragP->fr_opcode[1] = 0x6;/* branch offset = 6 */
|
fragP->fr_opcode[1] = 0x6;/* branch offset = 6 */
|
||||||
|
|
||||||
/* JF: these used to be fr_opcode[2,3], but they may be in a
|
/* JF: these used to be fr_opcode[2,3], but they may be in a
|
||||||
different frag, in which case refering to them is a no-no.
|
different frag, in which case refering to them is a no-no.
|
||||||
Only fr_opcode[0,1] are guaranteed to work. */
|
Only fr_opcode[0,1] are guaranteed to work. */
|
||||||
*buffer_address++ = 0x4e; /* put in jmp long (0x4ef9) */
|
*buffer_address++ = 0x4e; /* put in jmp long (0x4ef9) */
|
||||||
*buffer_address++ = (char) 0xf9;
|
*buffer_address++ = (char) 0xf9;
|
||||||
fragP->fr_fix += 2; /* account for jmp instruction */
|
fragP->fr_fix += 2; /* account for jmp instruction */
|
||||||
|
@ -4586,7 +4585,7 @@ md_estimate_size_before_relax (fragP, segment)
|
||||||
{
|
{
|
||||||
/* This should never happen, because if it's a conditional
|
/* This should never happen, because if it's a conditional
|
||||||
branch and we are on a 68000, BCC68000 should have been
|
branch and we are on a 68000, BCC68000 should have been
|
||||||
picked instead of ABRANCH. */
|
picked instead of ABRANCH. */
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4699,10 +4698,10 @@ md_estimate_size_before_relax (fragP, segment)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Change dbcc into dbcc/bral. */
|
/* Change dbcc into dbcc/bral. */
|
||||||
/* JF: these used to be fr_opcode[2-4], which is wrong. */
|
/* JF: these used to be fr_opcode[2-4], which is wrong. */
|
||||||
buffer_address[0] = 0x00; /* branch offset = 4 */
|
buffer_address[0] = 0x00; /* branch offset = 4 */
|
||||||
buffer_address[1] = 0x04;
|
buffer_address[1] = 0x04;
|
||||||
buffer_address[2] = 0x60; /* put in bra pc + ... */
|
buffer_address[2] = 0x60; /* put in bra pc + ... */
|
||||||
/* JF: these were fr_opcode[5-7] */
|
/* JF: these were fr_opcode[5-7] */
|
||||||
buffer_address[3] = 0x06; /* Plus 6 */
|
buffer_address[3] = 0x06; /* Plus 6 */
|
||||||
if (HAVE_LONG_BRANCH (current_architecture))
|
if (HAVE_LONG_BRANCH (current_architecture))
|
||||||
|
@ -4808,7 +4807,7 @@ md_estimate_size_before_relax (fragP, segment)
|
||||||
bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
|
bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
|
||||||
nibble as nuthin. (on Sun 3 at least) */
|
nibble as nuthin. (on Sun 3 at least) */
|
||||||
/* Translate the internal relocation information into target-specific
|
/* Translate the internal relocation information into target-specific
|
||||||
format. */
|
format. */
|
||||||
#ifdef comment
|
#ifdef comment
|
||||||
void
|
void
|
||||||
md_ri_to_chars (the_bytes, ri)
|
md_ri_to_chars (the_bytes, ri)
|
||||||
|
@ -5090,7 +5089,7 @@ s_even (ignore)
|
||||||
|
|
||||||
temp = 1; /* JF should be 2? */
|
temp = 1; /* JF should be 2? */
|
||||||
temp_fill = get_absolute_expression ();
|
temp_fill = get_absolute_expression ();
|
||||||
if (!need_pass_2) /* Never make frag if expect extra pass. */
|
if (!need_pass_2) /* Never make frag if expect extra pass. */
|
||||||
frag_align (temp, (int) temp_fill, 0);
|
frag_align (temp, (int) temp_fill, 0);
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
record_alignment (now_seg, temp);
|
record_alignment (now_seg, temp);
|
||||||
|
@ -5953,7 +5952,7 @@ build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
|
||||||
cc = reverse_mri_condition (cc);
|
cc = reverse_mri_condition (cc);
|
||||||
truelab = falselab;
|
truelab = falselab;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (leftstart != NULL)
|
if (leftstart != NULL)
|
||||||
{
|
{
|
||||||
buf = (char *) xmalloc (20
|
buf = (char *) xmalloc (20
|
||||||
|
@ -5975,7 +5974,7 @@ build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
|
||||||
mri_assemble (buf);
|
mri_assemble (buf);
|
||||||
free (buf);
|
free (buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = (char *) xmalloc (20 + strlen (truelab));
|
buf = (char *) xmalloc (20 + strlen (truelab));
|
||||||
s = buf;
|
s = buf;
|
||||||
*s++ = 'b';
|
*s++ = 'b';
|
||||||
|
@ -7127,7 +7126,7 @@ md_section_align (segment, size)
|
||||||
/* Exactly what point is a PC-relative offset relative TO?
|
/* Exactly what point is a PC-relative offset relative TO?
|
||||||
On the 68k, it is relative to the address of the first extension
|
On the 68k, it is relative to the address of the first extension
|
||||||
word. The difference between the addresses of the offset and the
|
word. The difference between the addresses of the offset and the
|
||||||
first extension word is stored in fx_pcrel_adjust. */
|
first extension word is stored in fx_pcrel_adjust. */
|
||||||
long
|
long
|
||||||
md_pcrel_from (fixP)
|
md_pcrel_from (fixP)
|
||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
|
|
Loading…
Reference in New Issue