Fix formatting.

This commit is contained in:
Nick Clifton 2000-07-17 21:06:14 +00:00
parent 8098403c53
commit 87271fa61d
3 changed files with 322 additions and 264 deletions

View File

@ -1,6 +1,8 @@
2000-07-17 Kazu Hirata <kazu@hxi.com> 2000-07-17 Kazu Hirata <kazu@hxi.com>
* config/tc-w65.c: Fix formatting. * config/tc-w65.c: Fix formatting.
* config/tc-mn10200.c: Fix formatting.
* config/tc-mn10300.c: Likewise.
2000-07-17 Frank Ch. Eigler <fche@redhat.com> 2000-07-17 Frank Ch. Eigler <fche@redhat.com>

View File

@ -21,7 +21,7 @@
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include "as.h" #include "as.h"
#include "subsegs.h" #include "subsegs.h"
#include "opcode/mn10200.h" #include "opcode/mn10200.h"
/* Structure to hold information about predefined registers. */ /* Structure to hold information about predefined registers. */
@ -31,46 +31,47 @@ struct reg_name
int value; int value;
}; };
/* Generic assembler global variables which must be defined by all targets. */ /* Generic assembler global variables which must be defined by all
targets. */
/* Characters which always start a comment. */ /* Characters which always start a comment. */
const char comment_chars[] = "#"; const char comment_chars[] = "#";
/* Characters which start a comment at the beginning of a line. */ /* Characters which start a comment at the beginning of a line. */
const char line_comment_chars[] = ";#"; const char line_comment_chars[] = ";#";
/* Characters which may be used to separate multiple commands on a /* Characters which may be used to separate multiple commands on a
single line. */ single line. */
const char line_separator_chars[] = ";"; const char line_separator_chars[] = ";";
/* Characters which are used to indicate an exponent in a floating /* Characters which are used to indicate an exponent in a floating
point number. */ point number. */
const char EXP_CHARS[] = "eE"; const char EXP_CHARS[] = "eE";
/* Characters which mean that a number is a floating point constant, /* Characters which mean that a number is a floating point constant,
as in 0d1.0. */ as in 0d1.0. */
const char FLT_CHARS[] = "dD"; const char FLT_CHARS[] = "dD";
const relax_typeS md_relax_table[] = { const relax_typeS md_relax_table[] = {
/* bCC relaxing */ /* bCC relaxing */
{0x81, -0x7e, 2, 1}, {0x81, -0x7e, 2, 1},
{0x8004, -0x7ffb, 5, 2}, {0x8004, -0x7ffb, 5, 2},
{0x800006, -0x7ffff9, 7, 0}, {0x800006, -0x7ffff9, 7, 0},
/* bCCx relaxing */ /* bCCx relaxing */
{0x81, -0x7e, 3, 4}, {0x81, -0x7e, 3, 4},
{0x8004, -0x7ffb, 6, 5}, {0x8004, -0x7ffb, 6, 5},
{0x800006, -0x7ffff9, 8, 0}, {0x800006, -0x7ffff9, 8, 0},
/* jsr relaxing */ /* jsr relaxing */
{0x8004, -0x7ffb, 3, 7}, {0x8004, -0x7ffb, 3, 7},
{0x800006, -0x7ffff9, 5, 0}, {0x800006, -0x7ffff9, 5, 0},
/* jmp relaxing */ /* jmp relaxing */
{0x81, -0x7e, 2, 9}, {0x81, -0x7e, 2, 9},
{0x8004, -0x7ffb, 3, 10}, {0x8004, -0x7ffb, 3, 10},
{0x800006, -0x7ffff9, 5, 0}, {0x800006, -0x7ffff9, 5, 0},
}; };
/* local functions */
/* Local functions. */
static void mn10200_insert_operand PARAMS ((unsigned long *, unsigned long *, static void mn10200_insert_operand PARAMS ((unsigned long *, unsigned long *,
const struct mn10200_operand *, const struct mn10200_operand *,
offsetT, char *, unsigned, offsetT, char *, unsigned,
@ -83,8 +84,7 @@ static boolean data_register_name PARAMS ((expressionS *expressionP));
static boolean address_register_name PARAMS ((expressionS *expressionP)); static boolean address_register_name PARAMS ((expressionS *expressionP));
static boolean other_register_name PARAMS ((expressionS *expressionP)); static boolean other_register_name PARAMS ((expressionS *expressionP));
/* Fixups. */
/* fixups */
#define MAX_INSN_FIXUPS (5) #define MAX_INSN_FIXUPS (5)
struct mn10200_fixup struct mn10200_fixup
{ {
@ -99,7 +99,7 @@ const char *md_shortopts = "";
struct option md_longopts[] = { struct option md_longopts[] = {
{NULL, no_argument, NULL, 0} {NULL, no_argument, NULL, 0}
}; };
size_t md_longopts_size = sizeof(md_longopts); size_t md_longopts_size = sizeof (md_longopts);
/* The target specific pseudo-ops which we support. */ /* The target specific pseudo-ops which we support. */
const pseudo_typeS md_pseudo_table[] = const pseudo_typeS md_pseudo_table[] =
@ -110,7 +110,7 @@ const pseudo_typeS md_pseudo_table[] =
/* Opcode hash table. */ /* Opcode hash table. */
static struct hash_control *mn10200_hash; static struct hash_control *mn10200_hash;
/* This table is sorted. Suitable for searching by a binary search. */ /* This table is sorted. Suitable for searching by a binary search. */
static const struct reg_name data_registers[] = static const struct reg_name data_registers[] =
{ {
{ "d0", 0 }, { "d0", 0 },
@ -118,7 +118,8 @@ static const struct reg_name data_registers[] =
{ "d2", 2 }, { "d2", 2 },
{ "d3", 3 }, { "d3", 3 },
}; };
#define DATA_REG_NAME_CNT (sizeof(data_registers) / sizeof(struct reg_name)) #define DATA_REG_NAME_CNT \
(sizeof (data_registers) / sizeof (struct reg_name))
static const struct reg_name address_registers[] = static const struct reg_name address_registers[] =
{ {
@ -127,18 +128,20 @@ static const struct reg_name address_registers[] =
{ "a2", 2 }, { "a2", 2 },
{ "a3", 3 }, { "a3", 3 },
}; };
#define ADDRESS_REG_NAME_CNT (sizeof(address_registers) / sizeof(struct reg_name)) #define ADDRESS_REG_NAME_CNT \
(sizeof (address_registers) / sizeof (struct reg_name))
static const struct reg_name other_registers[] = static const struct reg_name other_registers[] =
{ {
{ "mdr", 0 }, { "mdr", 0 },
{ "psw", 0 }, { "psw", 0 },
}; };
#define OTHER_REG_NAME_CNT (sizeof(other_registers) / sizeof(struct reg_name)) #define OTHER_REG_NAME_CNT \
(sizeof (other_registers) / sizeof (struct reg_name))
/* reg_name_search does a binary search of the given register table /* reg_name_search does a binary search of the given register table
to see if "name" is a valid regiter name. Returns the register to see if "name" is a valid regiter name. Returns the register
number from the array on success, or -1 on failure. */ number from the array on success, or -1 on failure. */
static int static int
reg_name_search (regs, regcount, name) reg_name_search (regs, regcount, name)
@ -160,14 +163,13 @@ reg_name_search (regs, regcount, name)
high = middle - 1; high = middle - 1;
else if (cmp > 0) else if (cmp > 0)
low = middle + 1; low = middle + 1;
else else
return regs[middle].value; return regs[middle].value;
} }
while (low <= high); while (low <= high);
return -1; return -1;
} }
/* Summary of register_name(). /* Summary of register_name().
* *
* in: Input_line_pointer points to 1st char of operand. * in: Input_line_pointer points to 1st char of operand.
@ -178,6 +180,7 @@ reg_name_search (regs, regcount, name)
* Input_line_pointer->(next non-blank) char after operand, or is in * Input_line_pointer->(next non-blank) char after operand, or is in
* its original state. * its original state.
*/ */
static boolean static boolean
data_register_name (expressionP) data_register_name (expressionP)
expressionS *expressionP; expressionS *expressionP;
@ -187,29 +190,34 @@ data_register_name (expressionP)
char *start; char *start;
char c; char c;
/* Find the spelling of the operand */ /* Find the spelling of the operand. */
start = name = input_line_pointer; start = name = input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name); reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name);
/* look to see if it's in the register table */ /* Look to see if it's in the register table. */
if (reg_number >= 0) if (reg_number >= 0)
{ {
expressionP->X_op = O_register; expressionP->X_op = O_register;
expressionP->X_add_number = reg_number; expressionP->X_add_number = reg_number;
/* make the rest nice */ /* Make the rest nice. */
expressionP->X_add_symbol = NULL; expressionP->X_add_symbol = NULL;
expressionP->X_op_symbol = NULL; expressionP->X_op_symbol = NULL;
*input_line_pointer = c; /* put back the delimiting char */
/* Put back the delimiting char. */
*input_line_pointer = c;
return true; return true;
} }
else else
{ {
/* reset the line as if we had not done anything */ /* Reset the line as if we had not done anything. */
*input_line_pointer = c; /* put back the delimiting char */ /* Put back the delimiting char. */
input_line_pointer = start; /* reset input_line pointer */ *input_line_pointer = c;
/* Reset input_line pointer. */
input_line_pointer = start;
return false; return false;
} }
} }
@ -224,6 +232,7 @@ data_register_name (expressionP)
* Input_line_pointer->(next non-blank) char after operand, or is in * Input_line_pointer->(next non-blank) char after operand, or is in
* its original state. * its original state.
*/ */
static boolean static boolean
address_register_name (expressionP) address_register_name (expressionP)
expressionS *expressionP; expressionS *expressionP;
@ -233,29 +242,34 @@ address_register_name (expressionP)
char *start; char *start;
char c; char c;
/* Find the spelling of the operand */ /* Find the spelling of the operand. */
start = name = input_line_pointer; start = name = input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name); reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name);
/* look to see if it's in the register table */ /* Look to see if it's in the register table. */
if (reg_number >= 0) if (reg_number >= 0)
{ {
expressionP->X_op = O_register; expressionP->X_op = O_register;
expressionP->X_add_number = reg_number; expressionP->X_add_number = reg_number;
/* make the rest nice */ /* Make the rest nice. */
expressionP->X_add_symbol = NULL; expressionP->X_add_symbol = NULL;
expressionP->X_op_symbol = NULL; expressionP->X_op_symbol = NULL;
*input_line_pointer = c; /* put back the delimiting char */
/* Put back the delimiting char. */
*input_line_pointer = c;
return true; return true;
} }
else else
{ {
/* reset the line as if we had not done anything */ /* Reset the line as if we had not done anything. */
*input_line_pointer = c; /* put back the delimiting char */ /* Put back the delimiting char. */
input_line_pointer = start; /* reset input_line pointer */ *input_line_pointer = c;
/* Reset input_line pointer. */
input_line_pointer = start;
return false; return false;
} }
} }
@ -270,6 +284,7 @@ address_register_name (expressionP)
* Input_line_pointer->(next non-blank) char after operand, or is in * Input_line_pointer->(next non-blank) char after operand, or is in
* its original state. * its original state.
*/ */
static boolean static boolean
other_register_name (expressionP) other_register_name (expressionP)
expressionS *expressionP; expressionS *expressionP;
@ -279,40 +294,45 @@ other_register_name (expressionP)
char *start; char *start;
char c; char c;
/* Find the spelling of the operand */ /* Find the spelling of the operand. */
start = name = input_line_pointer; start = name = input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name); reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name);
/* look to see if it's in the register table */ /* Look to see if it's in the register table. */
if (reg_number >= 0) if (reg_number >= 0)
{ {
expressionP->X_op = O_register; expressionP->X_op = O_register;
expressionP->X_add_number = reg_number; expressionP->X_add_number = reg_number;
/* make the rest nice */ /* Make the rest nice. */
expressionP->X_add_symbol = NULL; expressionP->X_add_symbol = NULL;
expressionP->X_op_symbol = NULL; expressionP->X_op_symbol = NULL;
*input_line_pointer = c; /* put back the delimiting char */
/* Put back the delimiting char. */
*input_line_pointer = c;
return true; return true;
} }
else else
{ {
/* reset the line as if we had not done anything */ /* Reset the line as if we had not done anything. */
*input_line_pointer = c; /* put back the delimiting char */ /* Put back the delimiting char. */
input_line_pointer = start; /* reset input_line pointer */ *input_line_pointer = c;
/* Reset input_line pointer. */
input_line_pointer = start;
return false; return false;
} }
} }
void void
md_show_usage (stream) md_show_usage (stream)
FILE *stream; FILE *stream;
{ {
fprintf(stream, _("MN10200 options:\n\ fprintf (stream, _("MN10200 options:\n\
none yet\n")); none yet\n"));
} }
int int
md_parse_option (c, arg) md_parse_option (c, arg)
@ -324,16 +344,16 @@ md_parse_option (c, arg)
symbolS * symbolS *
md_undefined_symbol (name) md_undefined_symbol (name)
char *name; char *name;
{ {
return 0; return 0;
} }
char * char *
md_atof (type, litp, sizep) md_atof (type, litp, sizep)
int type; int type;
char *litp; char *litp;
int *sizep; int *sizep;
{ {
int prec; int prec;
LITTLENUM_TYPE words[4]; LITTLENUM_TYPE words[4];
@ -354,7 +374,7 @@ md_atof (type, litp, sizep)
*sizep = 0; *sizep = 0;
return _("bad call to md_atof"); return _("bad call to md_atof");
} }
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;
@ -370,12 +390,11 @@ md_atof (type, litp, sizep)
return NULL; return NULL;
} }
void void
md_convert_frag (abfd, sec, fragP) md_convert_frag (abfd, sec, fragP)
bfd *abfd; bfd *abfd;
asection *sec; asection *sec;
fragS *fragP; fragS *fragP;
{ {
static unsigned long label_count = 0; static unsigned long label_count = 0;
char buf[40]; char buf[40];
@ -737,7 +756,7 @@ md_begin ()
char *prev_name = ""; char *prev_name = "";
register const struct mn10200_opcode *op; register const struct mn10200_opcode *op;
mn10200_hash = hash_new(); mn10200_hash = hash_new ();
/* Insert unique names into hash table. The MN10200 instruction set /* Insert unique names into hash table. The MN10200 instruction set
has many identical opcode names that have different opcodes based has many identical opcode names that have different opcodes based
@ -747,7 +766,7 @@ md_begin ()
op = mn10200_opcodes; op = mn10200_opcodes;
while (op->name) while (op->name)
{ {
if (strcmp (prev_name, op->name)) if (strcmp (prev_name, op->name))
{ {
prev_name = (char *) op->name; prev_name = (char *) op->name;
hash_insert (mn10200_hash, op->name, (char *) op); hash_insert (mn10200_hash, op->name, (char *) op);
@ -762,7 +781,7 @@ md_begin ()
} }
void void
md_assemble (str) md_assemble (str)
char *str; char *str;
{ {
char *s; char *s;
@ -776,13 +795,13 @@ md_assemble (str)
int match; int match;
/* Get the opcode. */ /* Get the opcode. */
for (s = str; *s != '\0' && ! isspace (*s); s++) for (s = str; *s != '\0' && !isspace (*s); s++)
; ;
if (*s != '\0') if (*s != '\0')
*s++ = '\0'; *s++ = '\0';
/* find the first opcode with the proper name */ /* Find the first opcode with the proper name. */
opcode = (struct mn10200_opcode *)hash_find (mn10200_hash, str); opcode = (struct mn10200_opcode *) hash_find (mn10200_hash, str);
if (opcode == NULL) if (opcode == NULL)
{ {
as_bad (_("Unrecognized opcode: `%s'"), str); as_bad (_("Unrecognized opcode: `%s'"), str);
@ -795,7 +814,7 @@ md_assemble (str)
input_line_pointer = str; input_line_pointer = str;
for(;;) for (;;)
{ {
const char *errmsg = NULL; const char *errmsg = NULL;
int op_idx; int op_idx;
@ -833,7 +852,7 @@ md_assemble (str)
if (operand->flags & MN10200_OPERAND_RELAX) if (operand->flags & MN10200_OPERAND_RELAX)
relaxable = 1; relaxable = 1;
/* Gather the operand. */ /* Gather the operand. */
hold = input_line_pointer; hold = input_line_pointer;
input_line_pointer = str; input_line_pointer = str;
@ -926,7 +945,7 @@ md_assemble (str)
expression (&ex); expression (&ex);
} }
switch (ex.X_op) switch (ex.X_op)
{ {
case O_illegal: case O_illegal:
errmsg = _("illegal operand"); errmsg = _("illegal operand");
@ -936,13 +955,13 @@ md_assemble (str)
goto error; goto error;
case O_register: case O_register:
if ((operand->flags if ((operand->flags
& (MN10200_OPERAND_DREG | MN10200_OPERAND_AREG)) == 0) & (MN10200_OPERAND_DREG | MN10200_OPERAND_AREG)) == 0)
{ {
input_line_pointer = hold; input_line_pointer = hold;
str = hold; str = hold;
goto error; goto error;
} }
if (opcode->format == FMT_2 || opcode->format == FMT_5) if (opcode->format == FMT_2 || opcode->format == FMT_5)
extra_shift = 8; extra_shift = 8;
else if (opcode->format == FMT_3 || opcode->format == FMT_6 else if (opcode->format == FMT_3 || opcode->format == FMT_6
@ -950,7 +969,7 @@ md_assemble (str)
extra_shift = 16; extra_shift = 16;
else else
extra_shift = 0; extra_shift = 0;
mn10200_insert_operand (&insn, &extension, operand, mn10200_insert_operand (&insn, &extension, operand,
ex.X_add_number, (char *) NULL, ex.X_add_number, (char *) NULL,
0, extra_shift); 0, extra_shift);
@ -963,7 +982,7 @@ md_assemble (str)
then promote it (ie this opcode does not match). */ then promote it (ie this opcode does not match). */
if (operand->flags if (operand->flags
& (MN10200_OPERAND_PROMOTE | MN10200_OPERAND_RELAX) & (MN10200_OPERAND_PROMOTE | MN10200_OPERAND_RELAX)
&& ! check_operand (insn, operand, ex.X_add_number)) && !check_operand (insn, operand, ex.X_add_number))
{ {
input_line_pointer = hold; input_line_pointer = hold;
str = hold; str = hold;
@ -1010,20 +1029,20 @@ keep_going:
error: error:
if (match == 0) if (match == 0)
{ {
next_opcode = opcode + 1; next_opcode = opcode + 1;
if (!strcmp(next_opcode->name, opcode->name)) if (!strcmp (next_opcode->name, opcode->name))
{ {
opcode = next_opcode; opcode = next_opcode;
continue; continue;
} }
as_bad ("%s", errmsg); as_bad ("%s", errmsg);
return; return;
} }
break; break;
} }
while (isspace (*str)) while (isspace (*str))
++str; ++str;
@ -1044,14 +1063,14 @@ keep_going:
size = 5; size = 5;
else else
abort (); abort ();
/* Write out the instruction. */ /* Write out the instruction. */
if (relaxable && fc > 0) if (relaxable && fc > 0)
{ {
int type; int type;
/* bCC */ /* bCC */
if (size == 2 && opcode->opcode != 0xfc0000) if (size == 2 && opcode->opcode != 0xfc0000)
{ {
/* Handle bra specially. Basically treat it like jmp so /* Handle bra specially. Basically treat it like jmp so
@ -1061,18 +1080,18 @@ keep_going:
It is also important to not treat it like other bCC It is also important to not treat it like other bCC
instructions since the long forms of bra is different instructions since the long forms of bra is different
from other bCC instructions. */ from other bCC instructions. */
if (opcode->opcode == 0xea00) if (opcode->opcode == 0xea00)
type = 8; type = 8;
else else
type = 0; type = 0;
} }
/* jsr */ /* jsr */
else if (size == 3 && opcode->opcode == 0xfd0000) else if (size == 3 && opcode->opcode == 0xfd0000)
type = 6; type = 6;
/* jmp */ /* jmp */
else if (size == 3 && opcode->opcode == 0xfc0000) else if (size == 3 && opcode->opcode == 0xfc0000)
type = 8; type = 8;
/* bCCx */ /* bCCx */
else else
type = 3; type = 3;
@ -1130,25 +1149,27 @@ keep_going:
int offset; int offset;
fixS *fixP; fixS *fixP;
reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc); reloc_howto = bfd_reloc_type_lookup (stdoutput,
fixups[i].reloc);
if (!reloc_howto) if (!reloc_howto)
abort(); abort ();
size = bfd_get_reloc_size (reloc_howto); size = bfd_get_reloc_size (reloc_howto);
if (size < 1 || size > 4) if (size < 1 || size > 4)
abort(); abort ();
offset = 4 - size; offset = 4 - size;
fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset, fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
size, size,
&fixups[i].exp, &fixups[i].exp,
reloc_howto->pc_relative, reloc_howto->pc_relative,
fixups[i].reloc); fixups[i].reloc);
/* PC-relative offsets are from the first byte of the next /* PC-relative offsets are from the first byte of the
instruction, not from the start of the current instruction. */ next instruction, not from the start of the current
instruction. */
if (reloc_howto->pc_relative) if (reloc_howto->pc_relative)
fixP->fx_offset += size; fixP->fx_offset += size;
} }
@ -1167,7 +1188,6 @@ keep_going:
/* Is the reloc pc-relative? */ /* Is the reloc pc-relative? */
pcrel = (operand->flags & MN10200_OPERAND_PCREL) != 0; pcrel = (operand->flags & MN10200_OPERAND_PCREL) != 0;
/* Choose a proper BFD relocation type. */ /* Choose a proper BFD relocation type. */
if (pcrel) if (pcrel)
{ {
@ -1192,7 +1212,8 @@ keep_going:
abort (); abort ();
} }
/* Convert the size of the reloc into what fix_new_exp wants. */ /* Convert the size of the reloc into what fix_new_exp
wants. */
reloc_size = reloc_size / 8; reloc_size = reloc_size / 8;
if (reloc_size == 8) if (reloc_size == 8)
reloc_size = 0; reloc_size = 0;
@ -1205,8 +1226,9 @@ keep_going:
reloc_size, &fixups[i].exp, pcrel, reloc_size, &fixups[i].exp, pcrel,
((bfd_reloc_code_real_type) reloc)); ((bfd_reloc_code_real_type) reloc));
/* PC-relative offsets are from the first byte of the next /* PC-relative offsets are from the first byte of the
instruction, not from the start of the current instruction. */ next instruction, not from the start of the current
instruction. */
if (pcrel) if (pcrel)
fixP->fx_offset += size; fixP->fx_offset += size;
} }
@ -1214,10 +1236,9 @@ keep_going:
} }
} }
/* If while processing a fixup, a reloc really needs to be created
Then it is done here. */
/* if while processing a fixup, a reloc really needs to be created */
/* then it is done here */
arelent * arelent *
tc_gen_reloc (seg, fixp) tc_gen_reloc (seg, fixp)
asection *seg; asection *seg;
@ -1230,8 +1251,8 @@ tc_gen_reloc (seg, fixp)
if (reloc->howto == (reloc_howto_type *) NULL) if (reloc->howto == (reloc_howto_type *) NULL)
{ {
as_bad_where (fixp->fx_file, fixp->fx_line, as_bad_where (fixp->fx_file, fixp->fx_line,
_("reloc %d not supported by object file format"), _("reloc %d not supported by object file format"),
(int)fixp->fx_r_type); (int) fixp->fx_r_type);
return NULL; return NULL;
} }
reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
@ -1249,7 +1270,7 @@ tc_gen_reloc (seg, fixp)
reloc->addend = (S_GET_VALUE (fixp->fx_addsy) reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
- S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset); - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
} }
else else
{ {
reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *)); reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
@ -1286,7 +1307,7 @@ md_estimate_size_before_relax (fragp, seg)
} }
return 2; return 2;
} }
} }
long long
md_pcrel_from (fixp) md_pcrel_from (fixp)
@ -1294,7 +1315,7 @@ md_pcrel_from (fixp)
{ {
return fixp->fx_frag->fr_address; return fixp->fx_frag->fr_address;
#if 0 #if 0
if (fixp->fx_addsy != (symbolS *) NULL && ! S_IS_DEFINED (fixp->fx_addsy)) if (fixp->fx_addsy != (symbolS *) NULL && !S_IS_DEFINED (fixp->fx_addsy))
{ {
/* The symbol is undefined. Let the linker figure it out. */ /* The symbol is undefined. Let the linker figure it out. */
return 0; return 0;
@ -1340,14 +1361,13 @@ mn10200_insert_operand (insnp, extensionp, operand, val, file, line, shift)
min = - (1 << (operand->bits - 1)); min = - (1 << (operand->bits - 1));
} }
else else
{ {
max = (1 << operand->bits) - 1; max = (1 << operand->bits) - 1;
min = 0; min = 0;
} }
test = val; test = val;
if (test < (offsetT) min || test > (offsetT) max) if (test < (offsetT) min || test > (offsetT) max)
{ {
const char *err = const char *err =
@ -1397,14 +1417,13 @@ check_operand (insn, operand, val)
min = - (1 << (operand->bits - 1)); min = - (1 << (operand->bits - 1));
} }
else else
{ {
max = (1 << operand->bits) - 1; max = (1 << operand->bits) - 1;
min = 0; min = 0;
} }
test = val; test = val;
if (test < (offsetT) min || test > (offsetT) max) if (test < (offsetT) min || test > (offsetT) max)
return 0; return 0;
else else

View File

@ -21,7 +21,7 @@
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include "as.h" #include "as.h"
#include "subsegs.h" #include "subsegs.h"
#include "opcode/mn10300.h" #include "opcode/mn10300.h"
#include "dwarf2dbg.h" #include "dwarf2dbg.h"
@ -34,54 +34,54 @@ struct reg_name
struct dwarf2_line_info debug_line; struct dwarf2_line_info debug_line;
/* Generic assembler global variables which must be defined by all targets. */ /* Generic assembler global variables which must be defined by all
targets. */
/* Characters which always start a comment. */ /* Characters which always start a comment. */
const char comment_chars[] = "#"; const char comment_chars[] = "#";
/* Characters which start a comment at the beginning of a line. */ /* Characters which start a comment at the beginning of a line. */
const char line_comment_chars[] = ";#"; const char line_comment_chars[] = ";#";
/* Characters which may be used to separate multiple commands on a /* Characters which may be used to separate multiple commands on a
single line. */ single line. */
const char line_separator_chars[] = ";"; const char line_separator_chars[] = ";";
/* Characters which are used to indicate an exponent in a floating /* Characters which are used to indicate an exponent in a floating
point number. */ point number. */
const char EXP_CHARS[] = "eE"; const char EXP_CHARS[] = "eE";
/* Characters which mean that a number is a floating point constant, /* Characters which mean that a number is a floating point constant,
as in 0d1.0. */ as in 0d1.0. */
const char FLT_CHARS[] = "dD"; const char FLT_CHARS[] = "dD";
const relax_typeS md_relax_table[] = { const relax_typeS md_relax_table[] = {
/* bCC relaxing */ /* bCC relaxing */
{0x7f, -0x80, 2, 1}, {0x7f, -0x80, 2, 1},
{0x7fff, -0x8000, 5, 2}, {0x7fff, -0x8000, 5, 2},
{0x7fffffff, -0x80000000, 7, 0}, {0x7fffffff, -0x80000000, 7, 0},
/* bCC relaxing (uncommon cases) */ /* bCC relaxing (uncommon cases) */
{0x7f, -0x80, 3, 4}, {0x7f, -0x80, 3, 4},
{0x7fff, -0x8000, 6, 5}, {0x7fff, -0x8000, 6, 5},
{0x7fffffff, -0x80000000, 8, 0}, {0x7fffffff, -0x80000000, 8, 0},
/* call relaxing */ /* call relaxing */
{0x7fff, -0x8000, 5, 7}, {0x7fff, -0x8000, 5, 7},
{0x7fffffff, -0x80000000, 7, 0}, {0x7fffffff, -0x80000000, 7, 0},
/* calls relaxing */ /* calls relaxing */
{0x7fff, -0x8000, 4, 9}, {0x7fff, -0x8000, 4, 9},
{0x7fffffff, -0x80000000, 6, 0}, {0x7fffffff, -0x80000000, 6, 0},
/* jmp relaxing */ /* jmp relaxing */
{0x7f, -0x80, 2, 11}, {0x7f, -0x80, 2, 11},
{0x7fff, -0x8000, 3, 12}, {0x7fff, -0x8000, 3, 12},
{0x7fffffff, -0x80000000, 5, 0}, {0x7fffffff, -0x80000000, 5, 0},
}; };
/* local functions */ /* Local functions. */
static void mn10300_insert_operand PARAMS ((unsigned long *, unsigned long *, static void mn10300_insert_operand PARAMS ((unsigned long *, unsigned long *,
const struct mn10300_operand *, const struct mn10300_operand *,
offsetT, char *, unsigned, offsetT, char *, unsigned,
@ -97,7 +97,7 @@ static void set_arch_mach PARAMS ((int));
static int current_machine; static int current_machine;
/* fixups */ /* Fixups. */
#define MAX_INSN_FIXUPS (5) #define MAX_INSN_FIXUPS (5)
struct mn10300_fixup struct mn10300_fixup
{ {
@ -116,7 +116,7 @@ const char *md_shortopts = "";
struct option md_longopts[] = { struct option md_longopts[] = {
{NULL, no_argument, NULL, 0} {NULL, no_argument, NULL, 0}
}; };
size_t md_longopts_size = sizeof(md_longopts); size_t md_longopts_size = sizeof (md_longopts);
/* The target specific pseudo-ops which we support. */ /* The target specific pseudo-ops which we support. */
const pseudo_typeS md_pseudo_table[] = const pseudo_typeS md_pseudo_table[] =
@ -135,7 +135,7 @@ const pseudo_typeS md_pseudo_table[] =
/* Opcode hash table. */ /* Opcode hash table. */
static struct hash_control *mn10300_hash; static struct hash_control *mn10300_hash;
/* This table is sorted. Suitable for searching by a binary search. */ /* This table is sorted. Suitable for searching by a binary search. */
static const struct reg_name data_registers[] = static const struct reg_name data_registers[] =
{ {
{ "d0", 0 }, { "d0", 0 },
@ -143,7 +143,8 @@ static const struct reg_name data_registers[] =
{ "d2", 2 }, { "d2", 2 },
{ "d3", 3 }, { "d3", 3 },
}; };
#define DATA_REG_NAME_CNT (sizeof(data_registers) / sizeof(struct reg_name)) #define DATA_REG_NAME_CNT \
(sizeof (data_registers) / sizeof (struct reg_name))
static const struct reg_name address_registers[] = static const struct reg_name address_registers[] =
{ {
@ -152,7 +153,9 @@ static const struct reg_name address_registers[] =
{ "a2", 2 }, { "a2", 2 },
{ "a3", 3 }, { "a3", 3 },
}; };
#define ADDRESS_REG_NAME_CNT (sizeof(address_registers) / sizeof(struct reg_name))
#define ADDRESS_REG_NAME_CNT \
(sizeof (address_registers) / sizeof (struct reg_name))
static const struct reg_name r_registers[] = static const struct reg_name r_registers[] =
{ {
@ -197,7 +200,9 @@ static const struct reg_name r_registers[] =
{ "r8", 8 }, { "r8", 8 },
{ "r9", 9 }, { "r9", 9 },
}; };
#define R_REG_NAME_CNT (sizeof(r_registers) / sizeof(struct reg_name))
#define R_REG_NAME_CNT \
(sizeof (r_registers) / sizeof (struct reg_name))
static const struct reg_name xr_registers[] = static const struct reg_name xr_registers[] =
{ {
@ -223,8 +228,9 @@ static const struct reg_name xr_registers[] =
{ "xr8", 8 }, { "xr8", 8 },
{ "xr9", 9 }, { "xr9", 9 },
}; };
#define XR_REG_NAME_CNT (sizeof(xr_registers) / sizeof(struct reg_name))
#define XR_REG_NAME_CNT \
(sizeof (xr_registers) / sizeof (struct reg_name))
static const struct reg_name other_registers[] = static const struct reg_name other_registers[] =
{ {
@ -232,11 +238,13 @@ static const struct reg_name other_registers[] =
{ "psw", 0 }, { "psw", 0 },
{ "sp", 0 }, { "sp", 0 },
}; };
#define OTHER_REG_NAME_CNT (sizeof(other_registers) / sizeof(struct reg_name))
#define OTHER_REG_NAME_CNT \
(sizeof (other_registers) / sizeof (struct reg_name))
/* reg_name_search does a binary search of the given register table /* reg_name_search does a binary search of the given register table
to see if "name" is a valid regiter name. Returns the register to see if "name" is a valid regiter name. Returns the register
number from the array on success, or -1 on failure. */ number from the array on success, or -1 on failure. */
static int static int
reg_name_search (regs, regcount, name) reg_name_search (regs, regcount, name)
@ -258,14 +266,13 @@ reg_name_search (regs, regcount, name)
high = middle - 1; high = middle - 1;
else if (cmp > 0) else if (cmp > 0)
low = middle + 1; low = middle + 1;
else else
return regs[middle].value; return regs[middle].value;
} }
while (low <= high); while (low <= high);
return -1; return -1;
} }
/* Summary of register_name(). /* Summary of register_name().
* *
* in: Input_line_pointer points to 1st char of operand. * in: Input_line_pointer points to 1st char of operand.
@ -276,6 +283,7 @@ reg_name_search (regs, regcount, name)
* Input_line_pointer->(next non-blank) char after operand, or is in * Input_line_pointer->(next non-blank) char after operand, or is in
* its original state. * its original state.
*/ */
static boolean static boolean
r_register_name (expressionP) r_register_name (expressionP)
expressionS *expressionP; expressionS *expressionP;
@ -285,29 +293,34 @@ r_register_name (expressionP)
char *start; char *start;
char c; char c;
/* Find the spelling of the operand */ /* Find the spelling of the operand. */
start = name = input_line_pointer; start = name = input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
reg_number = reg_name_search (r_registers, R_REG_NAME_CNT, name); reg_number = reg_name_search (r_registers, R_REG_NAME_CNT, name);
/* look to see if it's in the register table */ /* Look to see if it's in the register table. */
if (reg_number >= 0) if (reg_number >= 0)
{ {
expressionP->X_op = O_register; expressionP->X_op = O_register;
expressionP->X_add_number = reg_number; expressionP->X_add_number = reg_number;
/* make the rest nice */ /* Make the rest nice. */
expressionP->X_add_symbol = NULL; expressionP->X_add_symbol = NULL;
expressionP->X_op_symbol = NULL; expressionP->X_op_symbol = NULL;
*input_line_pointer = c; /* put back the delimiting char */
/* Put back the delimiting char. */
*input_line_pointer = c;
return true; return true;
} }
else else
{ {
/* reset the line as if we had not done anything */ /* Reset the line as if we had not done anything. */
*input_line_pointer = c; /* put back the delimiting char */ /* Put back the delimiting char. */
input_line_pointer = start; /* reset input_line pointer */ *input_line_pointer = c;
/* Reset input_line pointer. */
input_line_pointer = start;
return false; return false;
} }
} }
@ -322,6 +335,7 @@ r_register_name (expressionP)
* Input_line_pointer->(next non-blank) char after operand, or is in * Input_line_pointer->(next non-blank) char after operand, or is in
* its original state. * its original state.
*/ */
static boolean static boolean
xr_register_name (expressionP) xr_register_name (expressionP)
expressionS *expressionP; expressionS *expressionP;
@ -331,29 +345,34 @@ xr_register_name (expressionP)
char *start; char *start;
char c; char c;
/* Find the spelling of the operand */ /* Find the spelling of the operand. */
start = name = input_line_pointer; start = name = input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
reg_number = reg_name_search (xr_registers, XR_REG_NAME_CNT, name); reg_number = reg_name_search (xr_registers, XR_REG_NAME_CNT, name);
/* look to see if it's in the register table */ /* Look to see if it's in the register table. */
if (reg_number >= 0) if (reg_number >= 0)
{ {
expressionP->X_op = O_register; expressionP->X_op = O_register;
expressionP->X_add_number = reg_number; expressionP->X_add_number = reg_number;
/* make the rest nice */ /* Make the rest nice. */
expressionP->X_add_symbol = NULL; expressionP->X_add_symbol = NULL;
expressionP->X_op_symbol = NULL; expressionP->X_op_symbol = NULL;
*input_line_pointer = c; /* put back the delimiting char */
/* Put back the delimiting char. */
*input_line_pointer = c;
return true; return true;
} }
else else
{ {
/* reset the line as if we had not done anything */ /* Reset the line as if we had not done anything. */
*input_line_pointer = c; /* put back the delimiting char */ /* Put back the delimiting char. */
input_line_pointer = start; /* reset input_line pointer */ *input_line_pointer = c;
/* Reset input_line pointer. */
input_line_pointer = start;
return false; return false;
} }
} }
@ -368,6 +387,7 @@ xr_register_name (expressionP)
* Input_line_pointer->(next non-blank) char after operand, or is in * Input_line_pointer->(next non-blank) char after operand, or is in
* its original state. * its original state.
*/ */
static boolean static boolean
data_register_name (expressionP) data_register_name (expressionP)
expressionS *expressionP; expressionS *expressionP;
@ -377,29 +397,34 @@ data_register_name (expressionP)
char *start; char *start;
char c; char c;
/* Find the spelling of the operand */ /* Find the spelling of the operand. */
start = name = input_line_pointer; start = name = input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name); reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name);
/* look to see if it's in the register table */ /* Look to see if it's in the register table. */
if (reg_number >= 0) if (reg_number >= 0)
{ {
expressionP->X_op = O_register; expressionP->X_op = O_register;
expressionP->X_add_number = reg_number; expressionP->X_add_number = reg_number;
/* make the rest nice */ /* Make the rest nice. */
expressionP->X_add_symbol = NULL; expressionP->X_add_symbol = NULL;
expressionP->X_op_symbol = NULL; expressionP->X_op_symbol = NULL;
*input_line_pointer = c; /* put back the delimiting char */
/* Put back the delimiting char. */
*input_line_pointer = c;
return true; return true;
} }
else else
{ {
/* reset the line as if we had not done anything */ /* Reset the line as if we had not done anything. */
*input_line_pointer = c; /* put back the delimiting char */ /* Put back the delimiting char. */
input_line_pointer = start; /* reset input_line pointer */ *input_line_pointer = c;
/* Reset input_line pointer. */
input_line_pointer = start;
return false; return false;
} }
} }
@ -414,6 +439,7 @@ data_register_name (expressionP)
* Input_line_pointer->(next non-blank) char after operand, or is in * Input_line_pointer->(next non-blank) char after operand, or is in
* its original state. * its original state.
*/ */
static boolean static boolean
address_register_name (expressionP) address_register_name (expressionP)
expressionS *expressionP; expressionS *expressionP;
@ -423,29 +449,35 @@ address_register_name (expressionP)
char *start; char *start;
char c; char c;
/* Find the spelling of the operand */ /* Find the spelling of the operand. */
start = name = input_line_pointer; start = name = input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name); reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name);
/* look to see if it's in the register table */ /* Look to see if it's in the register table. */
if (reg_number >= 0) if (reg_number >= 0)
{ {
expressionP->X_op = O_register; expressionP->X_op = O_register;
expressionP->X_add_number = reg_number; expressionP->X_add_number = reg_number;
/* make the rest nice */ /* Make the rest nice. */
expressionP->X_add_symbol = NULL; expressionP->X_add_symbol = NULL;
expressionP->X_op_symbol = NULL; expressionP->X_op_symbol = NULL;
*input_line_pointer = c; /* put back the delimiting char */
/* Put back the delimiting char. */
*input_line_pointer = c;
return true; return true;
} }
else else
{ {
/* reset the line as if we had not done anything */ /* Reset the line as if we had not done anything. */
*input_line_pointer = c; /* put back the delimiting char */ /* Put back the delimiting char. */
input_line_pointer = start; /* reset input_line pointer */ *input_line_pointer = c;
/* Reset input_line pointer. */
input_line_pointer = start;
return false; return false;
} }
} }
@ -460,6 +492,7 @@ address_register_name (expressionP)
* Input_line_pointer->(next non-blank) char after operand, or is in * Input_line_pointer->(next non-blank) char after operand, or is in
* its original state. * its original state.
*/ */
static boolean static boolean
other_register_name (expressionP) other_register_name (expressionP)
expressionS *expressionP; expressionS *expressionP;
@ -469,40 +502,45 @@ other_register_name (expressionP)
char *start; char *start;
char c; char c;
/* Find the spelling of the operand */ /* Find the spelling of the operand. */
start = name = input_line_pointer; start = name = input_line_pointer;
c = get_symbol_end (); c = get_symbol_end ();
reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name); reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name);
/* look to see if it's in the register table */ /* Look to see if it's in the register table. */
if (reg_number >= 0) if (reg_number >= 0)
{ {
expressionP->X_op = O_register; expressionP->X_op = O_register;
expressionP->X_add_number = reg_number; expressionP->X_add_number = reg_number;
/* make the rest nice */ /* Make the rest nice. */
expressionP->X_add_symbol = NULL; expressionP->X_add_symbol = NULL;
expressionP->X_op_symbol = NULL; expressionP->X_op_symbol = NULL;
*input_line_pointer = c; /* put back the delimiting char */
/* Put back the delimiting char. */
*input_line_pointer = c;
return true; return true;
} }
else else
{ {
/* reset the line as if we had not done anything */ /* Reset the line as if we had not done anything. */
*input_line_pointer = c; /* put back the delimiting char */ /* Put back the delimiting char. */
input_line_pointer = start; /* reset input_line pointer */ *input_line_pointer = c;
/* Reset input_line pointer. */
input_line_pointer = start;
return false; return false;
} }
} }
void void
md_show_usage (stream) md_show_usage (stream)
FILE *stream; FILE *stream;
{ {
fprintf(stream, _("MN10300 options:\n\ fprintf (stream, _("MN10300 options:\n\
none yet\n")); none yet\n"));
} }
int int
md_parse_option (c, arg) md_parse_option (c, arg)
@ -514,16 +552,16 @@ md_parse_option (c, arg)
symbolS * symbolS *
md_undefined_symbol (name) md_undefined_symbol (name)
char *name; char *name;
{ {
return 0; return 0;
} }
char * char *
md_atof (type, litp, sizep) md_atof (type, litp, sizep)
int type; int type;
char *litp; char *litp;
int *sizep; int *sizep;
{ {
int prec; int prec;
LITTLENUM_TYPE words[4]; LITTLENUM_TYPE words[4];
@ -544,7 +582,7 @@ md_atof (type, litp, sizep)
*sizep = 0; *sizep = 0;
return "bad call to md_atof"; return "bad call to md_atof";
} }
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;
@ -560,12 +598,11 @@ md_atof (type, litp, sizep)
return NULL; return NULL;
} }
void void
md_convert_frag (abfd, sec, fragP) md_convert_frag (abfd, sec, fragP)
bfd *abfd; bfd *abfd;
asection *sec; asection *sec;
fragS *fragP; fragS *fragP;
{ {
static unsigned long label_count = 0; static unsigned long label_count = 0;
char buf[40]; char buf[40];
@ -863,7 +900,7 @@ md_begin ()
char *prev_name = ""; char *prev_name = "";
register const struct mn10300_opcode *op; register const struct mn10300_opcode *op;
mn10300_hash = hash_new(); mn10300_hash = hash_new ();
/* Insert unique names into hash table. The MN10300 instruction set /* Insert unique names into hash table. The MN10300 instruction set
has many identical opcode names that have different opcodes based has many identical opcode names that have different opcodes based
@ -873,7 +910,7 @@ md_begin ()
op = mn10300_opcodes; op = mn10300_opcodes;
while (op->name) while (op->name)
{ {
if (strcmp (prev_name, op->name)) if (strcmp (prev_name, op->name))
{ {
prev_name = (char *) op->name; prev_name = (char *) op->name;
hash_insert (mn10300_hash, op->name, (char *) op); hash_insert (mn10300_hash, op->name, (char *) op);
@ -894,7 +931,7 @@ md_begin ()
} }
void void
md_assemble (str) md_assemble (str)
char *str; char *str;
{ {
char *s; char *s;
@ -908,13 +945,13 @@ md_assemble (str)
int match; int match;
/* Get the opcode. */ /* Get the opcode. */
for (s = str; *s != '\0' && ! isspace (*s); s++) for (s = str; *s != '\0' && !isspace (*s); s++)
; ;
if (*s != '\0') if (*s != '\0')
*s++ = '\0'; *s++ = '\0';
/* find the first opcode with the proper name */ /* Find the first opcode with the proper name. */
opcode = (struct mn10300_opcode *)hash_find (mn10300_hash, str); opcode = (struct mn10300_opcode *) hash_find (mn10300_hash, str);
if (opcode == NULL) if (opcode == NULL)
{ {
as_bad (_("Unrecognized opcode: `%s'"), str); as_bad (_("Unrecognized opcode: `%s'"), str);
@ -927,14 +964,13 @@ md_assemble (str)
input_line_pointer = str; input_line_pointer = str;
for(;;) for (;;)
{ {
const char *errmsg; const char *errmsg;
int op_idx; int op_idx;
char *hold; char *hold;
int extra_shift = 0; int extra_shift = 0;
errmsg = _("Invalid opcode/operands"); errmsg = _("Invalid opcode/operands");
/* Reset the array of register operands. */ /* Reset the array of register operands. */
@ -977,7 +1013,7 @@ md_assemble (str)
if (operand->flags & MN10300_OPERAND_RELAX) if (operand->flags & MN10300_OPERAND_RELAX)
relaxable = 1; relaxable = 1;
/* Gather the operand. */ /* Gather the operand. */
hold = input_line_pointer; hold = input_line_pointer;
input_line_pointer = str; input_line_pointer = str;
@ -1172,10 +1208,10 @@ md_assemble (str)
/* Eat the '['. */ /* Eat the '['. */
input_line_pointer++; input_line_pointer++;
/* We used to reject a null register list here; however, /* We used to reject a null register list here; however,
we accept it now so the compiler can emit "call" instructions we accept it now so the compiler can emit "call"
for all calls to named functions. instructions for all calls to named functions.
The linker can then fill in the appropriate bits for the The linker can then fill in the appropriate bits for the
register list and stack size or change the instruction register list and stack size or change the instruction
@ -1294,7 +1330,7 @@ md_assemble (str)
expression (&ex); expression (&ex);
} }
switch (ex.X_op) switch (ex.X_op)
{ {
case O_illegal: case O_illegal:
errmsg = _("illegal operand"); errmsg = _("illegal operand");
@ -1315,7 +1351,7 @@ md_assemble (str)
str = hold; str = hold;
goto error; goto error;
} }
if (opcode->format == FMT_D1 || opcode->format == FMT_S1) if (opcode->format == FMT_D1 || opcode->format == FMT_S1)
extra_shift = 8; extra_shift = 8;
else if (opcode->format == FMT_D2 else if (opcode->format == FMT_D2
@ -1331,12 +1367,11 @@ md_assemble (str)
extra_shift = 8; extra_shift = 8;
else else
extra_shift = 0; extra_shift = 0;
mn10300_insert_operand (&insn, &extension, operand, mn10300_insert_operand (&insn, &extension, operand,
ex.X_add_number, (char *) NULL, ex.X_add_number, (char *) NULL,
0, extra_shift); 0, extra_shift);
/* And note the register number in the register array. */ /* And note the register number in the register array. */
mn10300_reg_operands[op_idx - 1] = ex.X_add_number; mn10300_reg_operands[op_idx - 1] = ex.X_add_number;
break; break;
@ -1348,7 +1383,7 @@ md_assemble (str)
then promote it (ie this opcode does not match). */ then promote it (ie this opcode does not match). */
if (operand->flags if (operand->flags
& (MN10300_OPERAND_PROMOTE | MN10300_OPERAND_RELAX) & (MN10300_OPERAND_PROMOTE | MN10300_OPERAND_RELAX)
&& ! check_operand (insn, operand, ex.X_add_number)) && !check_operand (insn, operand, ex.X_add_number))
{ {
input_line_pointer = hold; input_line_pointer = hold;
str = hold; str = hold;
@ -1424,20 +1459,20 @@ keep_going:
error: error:
if (match == 0) if (match == 0)
{ {
next_opcode = opcode + 1; next_opcode = opcode + 1;
if (!strcmp(next_opcode->name, opcode->name)) if (!strcmp (next_opcode->name, opcode->name))
{ {
opcode = next_opcode; opcode = next_opcode;
continue; continue;
} }
as_bad ("%s", errmsg); as_bad ("%s", errmsg);
return; return;
} }
break; break;
} }
while (isspace (*str)) while (isspace (*str))
++str; ++str;
@ -1486,7 +1521,7 @@ keep_going:
{ {
int type; int type;
/* bCC */ /* bCC */
if (size == 2) if (size == 2)
{ {
/* Handle bra specially. Basically treat it like jmp so /* Handle bra specially. Basically treat it like jmp so
@ -1501,16 +1536,16 @@ keep_going:
else else
type = 0; type = 0;
} }
/* call */ /* call */
else if (size == 5) else if (size == 5)
type = 6; type = 6;
/* calls */ /* calls */
else if (size == 4) else if (size == 4)
type = 8; type = 8;
/* jmp */ /* jmp */
else if (size == 3 && opcode->opcode == 0xcc0000) else if (size == 3 && opcode->opcode == 0xcc0000)
type = 10; type = 10;
/* bCC (uncommon cases) */ /* bCC (uncommon cases) */
else else
type = 3; type = 3;
@ -1518,7 +1553,7 @@ keep_going:
fixups[0].exp.X_add_symbol, fixups[0].exp.X_add_symbol,
fixups[0].exp.X_add_number, fixups[0].exp.X_add_number,
(char *)fixups[0].opindex); (char *)fixups[0].opindex);
/* This is pretty hokey. We basically just care about the /* This is pretty hokey. We basically just care about the
opcode, so we have to write out the first word big endian. opcode, so we have to write out the first word big endian.
@ -1619,29 +1654,33 @@ keep_going:
else if (opcode->format == FMT_D4) else if (opcode->format == FMT_D4)
{ {
unsigned long temp = ((insn & 0xffff) << 16) | (extension & 0xffff); unsigned long temp = ((insn & 0xffff) << 16) | (extension & 0xffff);
number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2); number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
number_to_chars_littleendian (f + 2, temp, 4); number_to_chars_littleendian (f + 2, temp, 4);
} }
else if (opcode->format == FMT_D5) else if (opcode->format == FMT_D5)
{ {
unsigned long temp = ((insn & 0xffff) << 16) unsigned long temp = (((insn & 0xffff) << 16)
| ((extension >> 8) & 0xffff); | ((extension >> 8) & 0xffff));
number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2); number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
number_to_chars_littleendian (f + 2, temp, 4); number_to_chars_littleendian (f + 2, temp, 4);
number_to_chars_bigendian (f + 6, extension & 0xff, 1); number_to_chars_bigendian (f + 6, extension & 0xff, 1);
} }
else if (opcode->format == FMT_D8) else if (opcode->format == FMT_D8)
{ {
unsigned long temp = ((insn & 0xff) << 16) | (extension & 0xffff); unsigned long temp = ((insn & 0xff) << 16) | (extension & 0xffff);
number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
number_to_chars_bigendian (f + 3, (temp & 0xff), 1); number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
number_to_chars_littleendian (f + 4, temp >> 8, 2); number_to_chars_bigendian (f + 3, (temp & 0xff), 1);
number_to_chars_littleendian (f + 4, temp >> 8, 2);
} }
else if (opcode->format == FMT_D9) else if (opcode->format == FMT_D9)
{ {
unsigned long temp = ((insn & 0xff) << 24) | (extension & 0xffffff); unsigned long temp = ((insn & 0xff) << 24) | (extension & 0xffffff);
number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
number_to_chars_littleendian (f + 3, temp, 4); number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
number_to_chars_littleendian (f + 3, temp, 4);
} }
/* Create any fixups. */ /* Create any fixups. */
@ -1657,15 +1696,16 @@ keep_going:
int offset; int offset;
fixS *fixP; fixS *fixP;
reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc); reloc_howto = bfd_reloc_type_lookup (stdoutput,
fixups[i].reloc);
if (!reloc_howto) if (!reloc_howto)
abort(); abort ();
size = bfd_get_reloc_size (reloc_howto); size = bfd_get_reloc_size (reloc_howto);
if (size < 1 || size > 4) if (size < 1 || size > 4)
abort(); abort ();
offset = 4 - size; offset = 4 - size;
fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset, fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
@ -1692,7 +1732,7 @@ keep_going:
pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0; pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0;
/* Gross. This disgusting hack is to make sure we /* Gross. This disgusting hack is to make sure we
get the right offset for the 16/32 bit reloc in get the right offset for the 16/32 bit reloc in
"call" instructions. Basically they're a pain "call" instructions. Basically they're a pain
because the reloc isn't at the end of the instruction. */ because the reloc isn't at the end of the instruction. */
if ((size == 5 || size == 7) if ((size == 5 || size == 7)
@ -1707,7 +1747,7 @@ keep_going:
|| ((insn >> 16) & 0xffff) == 0xfe01 || ((insn >> 16) & 0xffff) == 0xfe01
|| ((insn >> 16) & 0xffff) == 0xfe02)) || ((insn >> 16) & 0xffff) == 0xfe02))
size -= 1; size -= 1;
offset = size - reloc_size / 8; offset = size - reloc_size / 8;
/* Choose a proper BFD relocation type. */ /* Choose a proper BFD relocation type. */
@ -1769,10 +1809,9 @@ keep_going:
} }
} }
/* If while processing a fixup, a reloc really needs to be created
then it is done here. */
/* if while processing a fixup, a reloc really needs to be created */
/* then it is done here */
arelent * arelent *
tc_gen_reloc (seg, fixp) tc_gen_reloc (seg, fixp)
asection *seg; asection *seg;
@ -1785,15 +1824,15 @@ tc_gen_reloc (seg, fixp)
if (reloc->howto == (reloc_howto_type *) NULL) if (reloc->howto == (reloc_howto_type *) NULL)
{ {
as_bad_where (fixp->fx_file, fixp->fx_line, as_bad_where (fixp->fx_file, fixp->fx_line,
_("reloc %d not supported by object file format"), _("reloc %d not supported by object file format"),
(int)fixp->fx_r_type); (int) fixp->fx_r_type);
return NULL; return NULL;
} }
reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
if (fixp->fx_addsy && fixp->fx_subsy) if (fixp->fx_addsy && fixp->fx_subsy)
{ {
if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy)) if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
|| S_GET_SEGMENT (fixp->fx_addsy) == undefined_section) || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
{ {
@ -1806,9 +1845,9 @@ tc_gen_reloc (seg, fixp)
reloc->addend = (S_GET_VALUE (fixp->fx_addsy) reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
- S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset); - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
} }
else else
{ {
reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof( asymbol *)); reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
reloc->addend = fixp->fx_offset; reloc->addend = fixp->fx_offset;
} }
@ -1857,7 +1896,7 @@ md_estimate_size_before_relax (fragp, seg)
else else
return 2; return 2;
} }
} }
long long
md_pcrel_from (fixp) md_pcrel_from (fixp)
@ -1865,7 +1904,7 @@ md_pcrel_from (fixp)
{ {
return fixp->fx_frag->fr_address; return fixp->fx_frag->fr_address;
#if 0 #if 0
if (fixp->fx_addsy != (symbolS *) NULL && ! S_IS_DEFINED (fixp->fx_addsy)) if (fixp->fx_addsy != (symbolS *) NULL && !S_IS_DEFINED (fixp->fx_addsy))
{ {
/* The symbol is undefined. Let the linker figure it out. */ /* The symbol is undefined. Let the linker figure it out. */
return 0; return 0;
@ -1917,26 +1956,25 @@ mn10300_insert_operand (insnp, extensionp, operand, val, file, line, shift)
min = - (1 << (bits - 1)); min = - (1 << (bits - 1));
} }
else else
{ {
max = (1 << bits) - 1; max = (1 << bits) - 1;
min = 0; min = 0;
} }
test = val; test = val;
if (test < (offsetT) min || test > (offsetT) max) if (test < (offsetT) min || test > (offsetT) max)
{ {
const char *err = const char *err =
_("operand out of range (%s not between %ld and %ld)"); _("operand out of range (%s not between %ld and %ld)");
char buf[100]; char buf[100];
sprint_value (buf, test); sprint_value (buf, test);
if (file == (char *) NULL) if (file == (char *) NULL)
as_warn (err, buf, min, max); as_warn (err, buf, min, max);
else else
as_warn_where (file, line, err, buf, min, max); as_warn_where (file, line, err, buf, min, max);
} }
} }
if ((operand->flags & MN10300_OPERAND_SPLIT) != 0) if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
@ -1996,14 +2034,13 @@ check_operand (insn, operand, val)
min = - (1 << (bits - 1)); min = - (1 << (bits - 1));
} }
else else
{ {
max = (1 << bits) - 1; max = (1 << bits) - 1;
min = 0; min = 0;
} }
test = val; test = val;
if (test < (offsetT) min || test > (offsetT) max) if (test < (offsetT) min || test > (offsetT) max)
return 0; return 0;
else else