mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-12 17:47:18 +08:00
Kazu Hirata's formatting fixes.
This commit is contained in:
@ -1,3 +1,13 @@
|
|||||||
|
2000-07-27 Alan Modra <alan@linuxcare.com.au>
|
||||||
|
|
||||||
|
* config/tc-d10v.c (find_opcode): Remove extraneous `='.
|
||||||
|
|
||||||
|
2000-07-27 Kazu Hirata <kazu@hxi.com>
|
||||||
|
|
||||||
|
* config/tc-d10v.c: Fix formatting.
|
||||||
|
* config/tc-z8k.c: Likewise.
|
||||||
|
* config/tc-sparc.c: Likewise.
|
||||||
|
|
||||||
2000-07-26 Dave Brolley <brolley@redhat.com>
|
2000-07-26 Dave Brolley <brolley@redhat.com>
|
||||||
|
|
||||||
* cgen.c (queue_fixup): Declare opinfo.
|
* cgen.c (queue_fixup): Declare opinfo.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,6 @@
|
|||||||
/* tc-sparc.c -- Assemble for the SPARC
|
/* tc-sparc.c -- Assemble for the SPARC
|
||||||
Copyright (C) 1989, 90-96, 97, 98, 99, 2000 Free Software Foundation, Inc.
|
Copyright (C) 1989, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||||
|
Free Software Foundation, Inc.
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
|
|
||||||
GAS is free software; you can redistribute it and/or modify
|
GAS is free software; you can redistribute it and/or modify
|
||||||
@ -117,7 +118,7 @@ static symbolS *globals[8];
|
|||||||
|| SPARC_OPCODE_ARCH_V9_P (max_architecture))
|
|| SPARC_OPCODE_ARCH_V9_P (max_architecture))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* handle of the OPCODE hash table */
|
/* Handle of the OPCODE hash table. */
|
||||||
static struct hash_control *op_hash;
|
static struct hash_control *op_hash;
|
||||||
|
|
||||||
static int log2 PARAMS ((int));
|
static int log2 PARAMS ((int));
|
||||||
@ -133,7 +134,7 @@ static void s_register PARAMS ((int));
|
|||||||
|
|
||||||
const pseudo_typeS md_pseudo_table[] =
|
const pseudo_typeS md_pseudo_table[] =
|
||||||
{
|
{
|
||||||
{"align", s_align_bytes, 0}, /* Defaulting is invalid (0) */
|
{"align", s_align_bytes, 0}, /* Defaulting is invalid (0). */
|
||||||
{"common", s_common, 0},
|
{"common", s_common, 0},
|
||||||
{"empty", s_empty, 0},
|
{"empty", s_empty, 0},
|
||||||
{"global", s_globl, 0},
|
{"global", s_globl, 0},
|
||||||
@ -150,7 +151,7 @@ const pseudo_typeS md_pseudo_table[] =
|
|||||||
{"uaword", s_uacons, 4},
|
{"uaword", s_uacons, 4},
|
||||||
{"uaxword", s_uacons, 8},
|
{"uaxword", s_uacons, 8},
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
/* these are specific to sparc/svr4 */
|
/* These are specific to sparc/svr4. */
|
||||||
{"2byte", s_uacons, 2},
|
{"2byte", s_uacons, 2},
|
||||||
{"4byte", s_uacons, 4},
|
{"4byte", s_uacons, 4},
|
||||||
{"8byte", s_uacons, 8},
|
{"8byte", s_uacons, 8},
|
||||||
@ -159,15 +160,17 @@ const pseudo_typeS md_pseudo_table[] =
|
|||||||
{NULL, 0, 0},
|
{NULL, 0, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
const int md_reloc_size = 12; /* Size of relocation record */
|
/* Size of relocation record. */
|
||||||
|
const int md_reloc_size = 12;
|
||||||
|
|
||||||
/* This array holds the chars that always start a comment. If the
|
/* This array holds the chars that always start a comment. If the
|
||||||
pre-processor is disabled, these aren't very useful */
|
pre-processor is disabled, these aren't very useful. */
|
||||||
const char comment_chars[] = "!"; /* JF removed '|' from comment_chars */
|
const char comment_chars[] = "!"; /* JF removed '|' from
|
||||||
|
comment_chars. */
|
||||||
|
|
||||||
/* This array holds the chars that only start a comment at the beginning of
|
/* This array holds the chars that only start a comment at the beginning of
|
||||||
a line. If the line seems to have the form '# 123 filename'
|
a line. If the line seems to have the form '# 123 filename'
|
||||||
.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. */
|
||||||
@ -177,12 +180,13 @@ const char line_comment_chars[] = "#";
|
|||||||
|
|
||||||
const char line_separator_chars[] = ";";
|
const char line_separator_chars[] = ";";
|
||||||
|
|
||||||
/* Chars that can be used to separate mant from exp in floating point nums */
|
/* Chars that can be used to separate mant from exp in floating point
|
||||||
|
nums. */
|
||||||
const char EXP_CHARS[] = "eE";
|
const char EXP_CHARS[] = "eE";
|
||||||
|
|
||||||
/* Chars that mean this number is a floating point constant */
|
/* Chars that mean this number is a floating point constant.
|
||||||
/* As in 0f12.456 */
|
As in 0f12.456
|
||||||
/* or 0d1.2345e12 */
|
or 0d1.2345e12 */
|
||||||
const char FLT_CHARS[] = "rRsSfFdDxXpP";
|
const char FLT_CHARS[] = "rRsSfFdDxXpP";
|
||||||
|
|
||||||
/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
|
/* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
|
||||||
@ -323,8 +327,7 @@ sparc_target_format ()
|
|||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* md_parse_option
|
||||||
* md_parse_option
|
|
||||||
* Invocation line includes a switch not recognized by the base assembler.
|
* Invocation line includes a switch not recognized by the base assembler.
|
||||||
* See if it's a processor-specific option. These are:
|
* See if it's a processor-specific option. These are:
|
||||||
*
|
*
|
||||||
@ -424,7 +427,8 @@ struct option md_longopts[] = {
|
|||||||
{"no-relax", no_argument, NULL, OPTION_NO_RELAX},
|
{"no-relax", no_argument, NULL, OPTION_NO_RELAX},
|
||||||
{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);
|
||||||
|
|
||||||
int
|
int
|
||||||
md_parse_option (c, arg)
|
md_parse_option (c, arg)
|
||||||
@ -451,8 +455,7 @@ md_parse_option (c, arg)
|
|||||||
as_bad (_("invalid architecture -xarch=%s"), arg);
|
as_bad (_("invalid architecture -xarch=%s"), arg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/* Fall through. */
|
||||||
/* fall through */
|
|
||||||
|
|
||||||
case 'A':
|
case 'A':
|
||||||
{
|
{
|
||||||
@ -554,15 +557,15 @@ md_parse_option (c, arg)
|
|||||||
|
|
||||||
case 'Q':
|
case 'Q':
|
||||||
/* Qy - do emit .comment
|
/* Qy - do emit .comment
|
||||||
Qn - do not emit .comment */
|
Qn - do not emit .comment. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
/* use .stab instead of .stab.excl */
|
/* Use .stab instead of .stab.excl. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'q':
|
case 'q':
|
||||||
/* quick -- native assembler does fewer checks */
|
/* quick -- Native assembler does fewer checks. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'K':
|
case 'K':
|
||||||
@ -607,7 +610,7 @@ md_show_usage (stream)
|
|||||||
if (! default_init_p)
|
if (! default_init_p)
|
||||||
init_default_arch ();
|
init_default_arch ();
|
||||||
|
|
||||||
fprintf(stream, _("SPARC options:\n"));
|
fprintf (stream, _("SPARC options:\n"));
|
||||||
for (arch = &sparc_arch_table[0]; arch->name; arch++)
|
for (arch = &sparc_arch_table[0]; arch->name; arch++)
|
||||||
{
|
{
|
||||||
if (arch != &sparc_arch_table[0])
|
if (arch != &sparc_arch_table[0])
|
||||||
@ -659,7 +662,7 @@ md_show_usage (stream)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* native operand size opcode translation */
|
/* Native operand size opcode translation. */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
@ -680,7 +683,7 @@ struct
|
|||||||
{NULL, NULL, NULL},
|
{NULL, NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* sparc64 priviledged registers */
|
/* sparc64 priviledged registers. */
|
||||||
|
|
||||||
struct priv_reg_entry
|
struct priv_reg_entry
|
||||||
{
|
{
|
||||||
@ -707,10 +710,10 @@ struct priv_reg_entry priv_reg_table[] =
|
|||||||
{"wstate", 14},
|
{"wstate", 14},
|
||||||
{"fq", 15},
|
{"fq", 15},
|
||||||
{"ver", 31},
|
{"ver", 31},
|
||||||
{"", -1}, /* end marker */
|
{"", -1}, /* End marker. */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* v9a specific asrs */
|
/* v9a specific asrs. */
|
||||||
|
|
||||||
struct priv_reg_entry v9a_asr_table[] =
|
struct priv_reg_entry v9a_asr_table[] =
|
||||||
{
|
{
|
||||||
@ -722,7 +725,7 @@ struct priv_reg_entry v9a_asr_table[] =
|
|||||||
{"gsr", 19},
|
{"gsr", 19},
|
||||||
{"dcr", 18},
|
{"dcr", 18},
|
||||||
{"clear_softint", 21},
|
{"clear_softint", 21},
|
||||||
{"", -1}, /* end marker */
|
{"", -1}, /* End marker. */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -737,7 +740,8 @@ cmp_reg_entry (parg, qarg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This function is called once, at assembler startup time. It should
|
/* This function is called once, at assembler startup time. It should
|
||||||
set up all the tables, etc. that the MD part of the assembler will need. */
|
set up all the tables, etc. that the MD part of the assembler will
|
||||||
|
need. */
|
||||||
|
|
||||||
void
|
void
|
||||||
md_begin ()
|
md_begin ()
|
||||||
@ -783,7 +787,7 @@ md_begin ()
|
|||||||
const struct sparc_opcode *insn;
|
const struct sparc_opcode *insn;
|
||||||
char *name = sparc_arch_size == 32 ? native_op_table[i].name32 :
|
char *name = sparc_arch_size == 32 ? native_op_table[i].name32 :
|
||||||
native_op_table[i].name64;
|
native_op_table[i].name64;
|
||||||
insn = (struct sparc_opcode *)hash_find (op_hash, name);
|
insn = (struct sparc_opcode *) hash_find (op_hash, name);
|
||||||
if (insn == NULL)
|
if (insn == NULL)
|
||||||
{
|
{
|
||||||
as_bad (_("Internal error: can't find opcode `%s' for `%s'\n"),
|
as_bad (_("Internal error: can't find opcode `%s' for `%s'\n"),
|
||||||
@ -857,9 +861,9 @@ sparc_md_end ()
|
|||||||
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_sparclite_le);
|
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_sparclite_le);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* The sparclite is treated like a normal sparc. Perhaps it shouldn't
|
/* The sparclite is treated like a normal sparc. Perhaps it
|
||||||
be but for now it is (since that's the way it's always been
|
shouldn't be but for now it is (since that's the way it's
|
||||||
treated). */
|
always been treated). */
|
||||||
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc);
|
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -877,7 +881,7 @@ in_signed_range (val, max)
|
|||||||
0xffffffff is always considered -1 on sparc32. */
|
0xffffffff is always considered -1 on sparc32. */
|
||||||
if (sparc_arch_size == 32)
|
if (sparc_arch_size == 32)
|
||||||
{
|
{
|
||||||
bfd_signed_vma sign = (bfd_signed_vma)1 << 31;
|
bfd_signed_vma sign = (bfd_signed_vma) 1 << 31;
|
||||||
val = ((val & 0xffffffff) ^ sign) - sign;
|
val = ((val & 0xffffffff) ^ sign) - sign;
|
||||||
}
|
}
|
||||||
if (val > max)
|
if (val > max)
|
||||||
@ -967,6 +971,7 @@ static const struct sparc_opcode *last_insn;
|
|||||||
static unsigned long last_opcode;
|
static unsigned long last_opcode;
|
||||||
|
|
||||||
/* Handle the set and setuw synthetic instructions. */
|
/* Handle the set and setuw synthetic instructions. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
synthetize_setuw (insn)
|
synthetize_setuw (insn)
|
||||||
const struct sparc_opcode *insn;
|
const struct sparc_opcode *insn;
|
||||||
@ -978,18 +983,18 @@ synthetize_setuw (insn)
|
|||||||
{
|
{
|
||||||
if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
|
if (SPARC_OPCODE_ARCH_V9_P (max_architecture))
|
||||||
{
|
{
|
||||||
if (sizeof(offsetT) > 4
|
if (sizeof (offsetT) > 4
|
||||||
&& (the_insn.exp.X_add_number < 0
|
&& (the_insn.exp.X_add_number < 0
|
||||||
|| the_insn.exp.X_add_number > (offsetT) 0xffffffff))
|
|| the_insn.exp.X_add_number > (offsetT) 0xffffffff))
|
||||||
as_warn (_("set: number not in 0..4294967295 range"));
|
as_warn (_("set: number not in 0..4294967295 range"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (sizeof(offsetT) > 4
|
if (sizeof (offsetT) > 4
|
||||||
&& (the_insn.exp.X_add_number < -(offsetT) 0x80000000
|
&& (the_insn.exp.X_add_number < -(offsetT) 0x80000000
|
||||||
|| the_insn.exp.X_add_number > (offsetT) 0xffffffff))
|
|| the_insn.exp.X_add_number > (offsetT) 0xffffffff))
|
||||||
as_warn (_("set: number not in -2147483648..4294967295 range"));
|
as_warn (_("set: number not in -2147483648..4294967295 range"));
|
||||||
the_insn.exp.X_add_number = (int)the_insn.exp.X_add_number;
|
the_insn.exp.X_add_number = (int) the_insn.exp.X_add_number;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1026,6 +1031,7 @@ synthetize_setuw (insn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Handle the setsw synthetic instruction. */
|
/* Handle the setsw synthetic instruction. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
synthetize_setsw (insn)
|
synthetize_setsw (insn)
|
||||||
const struct sparc_opcode *insn;
|
const struct sparc_opcode *insn;
|
||||||
@ -1045,7 +1051,7 @@ synthetize_setsw (insn)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sizeof(offsetT) > 4
|
if (sizeof (offsetT) > 4
|
||||||
&& (the_insn.exp.X_add_number < -(offsetT) 0x80000000
|
&& (the_insn.exp.X_add_number < -(offsetT) 0x80000000
|
||||||
|| the_insn.exp.X_add_number > (offsetT) 0xffffffff))
|
|| the_insn.exp.X_add_number > (offsetT) 0xffffffff))
|
||||||
as_warn (_("setsw: number not in -2147483648..4294967295 range"));
|
as_warn (_("setsw: number not in -2147483648..4294967295 range"));
|
||||||
@ -1077,6 +1083,7 @@ synthetize_setsw (insn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Handle the setsw synthetic instruction. */
|
/* Handle the setsw synthetic instruction. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
synthetize_setx (insn)
|
synthetize_setx (insn)
|
||||||
const struct sparc_opcode *insn;
|
const struct sparc_opcode *insn;
|
||||||
@ -1285,7 +1292,7 @@ md_assemble (str)
|
|||||||
switch (special_case)
|
switch (special_case)
|
||||||
{
|
{
|
||||||
case SPECIAL_CASE_NONE:
|
case SPECIAL_CASE_NONE:
|
||||||
/* normal insn */
|
/* Normal insn. */
|
||||||
output_insn (insn, &the_insn);
|
output_insn (insn, &the_insn);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1358,8 +1365,7 @@ sparc_ip (str, pinsn)
|
|||||||
|
|
||||||
case ',':
|
case ',':
|
||||||
comma = 1;
|
comma = 1;
|
||||||
|
/* Fall through. */
|
||||||
/*FALLTHROUGH */
|
|
||||||
|
|
||||||
case ' ':
|
case ' ':
|
||||||
*s++ = '\0';
|
*s++ = '\0';
|
||||||
@ -1388,10 +1394,8 @@ sparc_ip (str, pinsn)
|
|||||||
the_insn.reloc = BFD_RELOC_NONE;
|
the_insn.reloc = BFD_RELOC_NONE;
|
||||||
v9_arg_p = 0;
|
v9_arg_p = 0;
|
||||||
|
|
||||||
/*
|
/* Build the opcode, checking as we go to make sure that the
|
||||||
* Build the opcode, checking as we go to make
|
operands match. */
|
||||||
* sure that the operands match
|
|
||||||
*/
|
|
||||||
for (args = insn->args;; ++args)
|
for (args = insn->args;; ++args)
|
||||||
{
|
{
|
||||||
switch (*args)
|
switch (*args)
|
||||||
@ -1474,7 +1478,7 @@ sparc_ip (str, pinsn)
|
|||||||
if (*s == '%')
|
if (*s == '%')
|
||||||
{
|
{
|
||||||
struct priv_reg_entry *p = priv_reg_table;
|
struct priv_reg_entry *p = priv_reg_table;
|
||||||
unsigned int len = 9999999; /* init to make gcc happy */
|
unsigned int len = 9999999; /* Init to make gcc happy. */
|
||||||
|
|
||||||
s += 1;
|
s += 1;
|
||||||
while (p->name[0] > s[0])
|
while (p->name[0] > s[0])
|
||||||
@ -1510,7 +1514,7 @@ sparc_ip (str, pinsn)
|
|||||||
if (*s == '%')
|
if (*s == '%')
|
||||||
{
|
{
|
||||||
struct priv_reg_entry *p = v9a_asr_table;
|
struct priv_reg_entry *p = v9a_asr_table;
|
||||||
unsigned int len = 9999999; /* init to make gcc happy */
|
unsigned int len = 9999999; /* Init to make gcc happy. */
|
||||||
|
|
||||||
s += 1;
|
s += 1;
|
||||||
while (p->name[0] > s[0])
|
while (p->name[0] > s[0])
|
||||||
@ -1731,7 +1735,7 @@ sparc_ip (str, pinsn)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '\0': /* end of args */
|
case '\0': /* End of args. */
|
||||||
if (*s == '\0')
|
if (*s == '\0')
|
||||||
{
|
{
|
||||||
match = 1;
|
match = 1;
|
||||||
@ -1750,7 +1754,7 @@ sparc_ip (str, pinsn)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '[': /* these must match exactly */
|
case '[': /* These must match exactly. */
|
||||||
case ']':
|
case ']':
|
||||||
case ',':
|
case ',':
|
||||||
case ' ':
|
case ' ':
|
||||||
@ -1758,7 +1762,7 @@ sparc_ip (str, pinsn)
|
|||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '#': /* must be at least one digit */
|
case '#': /* Must be at least one digit. */
|
||||||
if (isdigit ((unsigned char) *s++))
|
if (isdigit ((unsigned char) *s++))
|
||||||
{
|
{
|
||||||
while (isdigit ((unsigned char) *s))
|
while (isdigit ((unsigned char) *s))
|
||||||
@ -1769,7 +1773,7 @@ sparc_ip (str, pinsn)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'C': /* coprocessor state register */
|
case 'C': /* Coprocessor state register. */
|
||||||
if (strncmp (s, "%csr", 4) == 0)
|
if (strncmp (s, "%csr", 4) == 0)
|
||||||
{
|
{
|
||||||
s += 4;
|
s += 4;
|
||||||
@ -1777,7 +1781,7 @@ sparc_ip (str, pinsn)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'b': /* next operand is a coprocessor register */
|
case 'b': /* Next operand is a coprocessor register. */
|
||||||
case 'c':
|
case 'c':
|
||||||
case 'D':
|
case 'D':
|
||||||
if (*s++ == '%' && *s++ == 'c' && isdigit ((unsigned char) *s))
|
if (*s++ == '%' && *s++ == 'c' && isdigit ((unsigned char) *s))
|
||||||
@ -1910,7 +1914,7 @@ sparc_ip (str, pinsn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((mask & ~1) == 2 && sparc_arch_size == 64
|
if ((mask & ~1) == 2 && sparc_arch_size == 64
|
||||||
&& no_undeclared_regs && ! globals [mask])
|
&& no_undeclared_regs && ! globals[mask])
|
||||||
as_bad (_("detected global register use not covered by .register pseudo-op"));
|
as_bad (_("detected global register use not covered by .register pseudo-op"));
|
||||||
|
|
||||||
/* Got the register, now figure out where
|
/* Got the register, now figure out where
|
||||||
@ -2014,7 +2018,6 @@ sparc_ip (str, pinsn)
|
|||||||
opcode |= RS1 (mask);
|
opcode |= RS1 (mask);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
||||||
case 'f':
|
case 'f':
|
||||||
case 'B':
|
case 'B':
|
||||||
case 'R':
|
case 'R':
|
||||||
@ -2169,10 +2172,11 @@ sparc_ip (str, pinsn)
|
|||||||
*s1 = '0';
|
*s1 = '0';
|
||||||
s = s1;
|
s = s1;
|
||||||
op_exp = the_insn.exp;
|
op_exp = the_insn.exp;
|
||||||
memset (&the_insn.exp, 0, sizeof(the_insn.exp));
|
memset (&the_insn.exp, 0, sizeof (the_insn.exp));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++) ;
|
for (s1 = s; *s1 && *s1 != ',' && *s1 != ']'; s1++)
|
||||||
|
;
|
||||||
|
|
||||||
if (s1 != s && isdigit ((unsigned char) s1[-1]))
|
if (s1 != s && isdigit ((unsigned char) s1[-1]))
|
||||||
{
|
{
|
||||||
@ -2227,7 +2231,7 @@ sparc_ip (str, pinsn)
|
|||||||
|
|
||||||
case BFD_RELOC_SPARC_HH22:
|
case BFD_RELOC_SPARC_HH22:
|
||||||
val = BSR (val, 32);
|
val = BSR (val, 32);
|
||||||
/* intentional fallthrough */
|
/* Fall through. */
|
||||||
|
|
||||||
case BFD_RELOC_SPARC_LM22:
|
case BFD_RELOC_SPARC_LM22:
|
||||||
case BFD_RELOC_HI22:
|
case BFD_RELOC_HI22:
|
||||||
@ -2236,7 +2240,7 @@ sparc_ip (str, pinsn)
|
|||||||
|
|
||||||
case BFD_RELOC_SPARC_HM10:
|
case BFD_RELOC_SPARC_HM10:
|
||||||
val = BSR (val, 32);
|
val = BSR (val, 32);
|
||||||
/* intentional fallthrough */
|
/* Fall through. */
|
||||||
|
|
||||||
case BFD_RELOC_LO10:
|
case BFD_RELOC_LO10:
|
||||||
val &= 0x3ff;
|
val &= 0x3ff;
|
||||||
@ -2352,7 +2356,7 @@ sparc_ip (str, pinsn)
|
|||||||
}
|
}
|
||||||
opcode |= ASI (asi);
|
opcode |= ASI (asi);
|
||||||
continue;
|
continue;
|
||||||
} /* alternate space */
|
} /* Alternate space. */
|
||||||
|
|
||||||
case 'p':
|
case 'p':
|
||||||
if (strncmp (s, "%psr", 4) == 0)
|
if (strncmp (s, "%psr", 4) == 0)
|
||||||
@ -2362,7 +2366,7 @@ sparc_ip (str, pinsn)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'q': /* floating point queue */
|
case 'q': /* Floating point queue. */
|
||||||
if (strncmp (s, "%fq", 3) == 0)
|
if (strncmp (s, "%fq", 3) == 0)
|
||||||
{
|
{
|
||||||
s += 3;
|
s += 3;
|
||||||
@ -2370,7 +2374,7 @@ sparc_ip (str, pinsn)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'Q': /* coprocessor queue */
|
case 'Q': /* Coprocessor queue. */
|
||||||
if (strncmp (s, "%cq", 3) == 0)
|
if (strncmp (s, "%cq", 3) == 0)
|
||||||
{
|
{
|
||||||
s += 3;
|
s += 3;
|
||||||
@ -2476,11 +2480,11 @@ sparc_ip (str, pinsn)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
as_fatal (_("failed sanity check."));
|
as_fatal (_("failed sanity check."));
|
||||||
} /* switch on arg code */
|
} /* switch on arg code. */
|
||||||
|
|
||||||
/* Break out of for() loop. */
|
/* Break out of for() loop. */
|
||||||
break;
|
break;
|
||||||
} /* for each arg that we expect */
|
} /* For each arg that we expect. */
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (match == 0)
|
if (match == 0)
|
||||||
@ -2502,7 +2506,7 @@ sparc_ip (str, pinsn)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We have a match. Now see if the architecture is ok. */
|
/* We have a match. Now see if the architecture is OK. */
|
||||||
int needed_arch_mask = insn->architecture;
|
int needed_arch_mask = insn->architecture;
|
||||||
|
|
||||||
if (v9_arg_p)
|
if (v9_arg_p)
|
||||||
@ -2512,10 +2516,13 @@ sparc_ip (str, pinsn)
|
|||||||
needed_arch_mask |= (1 << SPARC_OPCODE_ARCH_V9);
|
needed_arch_mask |= (1 << SPARC_OPCODE_ARCH_V9);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needed_arch_mask & SPARC_OPCODE_SUPPORTED (current_architecture))
|
if (needed_arch_mask
|
||||||
; /* ok */
|
& SPARC_OPCODE_SUPPORTED (current_architecture))
|
||||||
|
/* OK. */
|
||||||
|
;
|
||||||
/* Can we bump up the architecture? */
|
/* Can we bump up the architecture? */
|
||||||
else if (needed_arch_mask & SPARC_OPCODE_SUPPORTED (max_architecture))
|
else if (needed_arch_mask
|
||||||
|
& SPARC_OPCODE_SUPPORTED (max_architecture))
|
||||||
{
|
{
|
||||||
enum sparc_opcode_arch_val needed_architecture =
|
enum sparc_opcode_arch_val needed_architecture =
|
||||||
sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture)
|
sparc_ffs (SPARC_OPCODE_SUPPORTED (max_architecture)
|
||||||
@ -2540,12 +2547,12 @@ sparc_ip (str, pinsn)
|
|||||||
happen but what about tomorrow? */
|
happen but what about tomorrow? */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int arch,printed_one_p = 0;
|
int arch, printed_one_p = 0;
|
||||||
char *p;
|
char *p;
|
||||||
char required_archs[SPARC_OPCODE_ARCH_MAX * 16];
|
char required_archs[SPARC_OPCODE_ARCH_MAX * 16];
|
||||||
|
|
||||||
/* Create a list of the architectures that support the insn. */
|
/* Create a list of the architectures that support the insn. */
|
||||||
needed_arch_mask &= ~ SPARC_OPCODE_SUPPORTED (max_architecture);
|
needed_arch_mask &= ~SPARC_OPCODE_SUPPORTED (max_architecture);
|
||||||
p = required_archs;
|
p = required_archs;
|
||||||
arch = sparc_ffs (needed_arch_mask);
|
arch = sparc_ffs (needed_arch_mask);
|
||||||
while ((1 << arch) <= needed_arch_mask)
|
while ((1 << arch) <= needed_arch_mask)
|
||||||
@ -2567,10 +2574,10 @@ sparc_ip (str, pinsn)
|
|||||||
sparc_opcode_archs[max_architecture].name);
|
sparc_opcode_archs[max_architecture].name);
|
||||||
return special_case;
|
return special_case;
|
||||||
}
|
}
|
||||||
} /* if no match */
|
} /* If no match. */
|
||||||
|
|
||||||
break;
|
break;
|
||||||
} /* forever looking for a match */
|
} /* Forever looking for a match. */
|
||||||
|
|
||||||
the_insn.opcode = opcode;
|
the_insn.opcode = opcode;
|
||||||
return special_case;
|
return special_case;
|
||||||
@ -2676,18 +2683,18 @@ output_insn (insn, the_insn)
|
|||||||
{
|
{
|
||||||
char *toP = frag_more (4);
|
char *toP = frag_more (4);
|
||||||
|
|
||||||
/* put out the opcode */
|
/* Put out the opcode. */
|
||||||
if (INSN_BIG_ENDIAN)
|
if (INSN_BIG_ENDIAN)
|
||||||
number_to_chars_bigendian (toP, (valueT) the_insn->opcode, 4);
|
number_to_chars_bigendian (toP, (valueT) the_insn->opcode, 4);
|
||||||
else
|
else
|
||||||
number_to_chars_littleendian (toP, (valueT) the_insn->opcode, 4);
|
number_to_chars_littleendian (toP, (valueT) the_insn->opcode, 4);
|
||||||
|
|
||||||
/* put out the symbol-dependent stuff */
|
/* Put out the symbol-dependent stuff. */
|
||||||
if (the_insn->reloc != BFD_RELOC_NONE)
|
if (the_insn->reloc != BFD_RELOC_NONE)
|
||||||
{
|
{
|
||||||
fixS *fixP = fix_new_exp (frag_now, /* which frag */
|
fixS *fixP = fix_new_exp (frag_now, /* Which frag. */
|
||||||
(toP - frag_now->fr_literal), /* where */
|
(toP - frag_now->fr_literal), /* Where. */
|
||||||
4, /* size */
|
4, /* Size. */
|
||||||
&the_insn->exp,
|
&the_insn->exp,
|
||||||
the_insn->pcrel,
|
the_insn->pcrel,
|
||||||
the_insn->reloc);
|
the_insn->reloc);
|
||||||
@ -2704,16 +2711,15 @@ output_insn (insn, the_insn)
|
|||||||
last_opcode = the_insn->opcode;
|
last_opcode = the_insn->opcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* This is identical to the md_atof in m68k.c. I think this is right,
|
||||||
This is identical to the md_atof in m68k.c. I think this is right,
|
|
||||||
but I'm not sure.
|
but I'm not sure.
|
||||||
|
|
||||||
Turn a string in input_line_pointer into a floating point constant of type
|
Turn a string in input_line_pointer into a floating point constant
|
||||||
type, and store the appropriate bytes in *litP. The number of LITTLENUMS
|
of type TYPE, and store the appropriate bytes in *LITP. The number
|
||||||
emitted is stored in *sizeP . An error message is returned, or NULL on OK.
|
of LITTLENUMS emitted is stored in *SIZEP. An error message is
|
||||||
*/
|
returned, or NULL on OK. */
|
||||||
|
|
||||||
/* Equal to MAX_PRECISION in atof-ieee.c */
|
/* Equal to MAX_PRECISION in atof-ieee.c. */
|
||||||
#define MAX_LITTLENUMS 6
|
#define MAX_LITTLENUMS 6
|
||||||
|
|
||||||
char *
|
char *
|
||||||
@ -2722,7 +2728,7 @@ md_atof (type, litP, sizeP)
|
|||||||
char *litP;
|
char *litP;
|
||||||
int *sizeP;
|
int *sizeP;
|
||||||
{
|
{
|
||||||
int i,prec;
|
int i, prec;
|
||||||
LITTLENUM_TYPE words[MAX_LITTLENUMS];
|
LITTLENUM_TYPE words[MAX_LITTLENUMS];
|
||||||
char *t;
|
char *t;
|
||||||
|
|
||||||
@ -2795,7 +2801,8 @@ md_number_to_chars (buf, val, n)
|
|||||||
number_to_chars_bigendian (buf, val, n);
|
number_to_chars_bigendian (buf, val, n);
|
||||||
else if (target_little_endian_data
|
else if (target_little_endian_data
|
||||||
&& ((n == 4 || n == 2) && ~now_seg->flags & SEC_ALLOC))
|
&& ((n == 4 || n == 2) && ~now_seg->flags & SEC_ALLOC))
|
||||||
/* Output debug words, which are not in allocated sections, as big endian */
|
/* Output debug words, which are not in allocated sections, as big
|
||||||
|
endian. */
|
||||||
number_to_chars_bigendian (buf, val, n);
|
number_to_chars_bigendian (buf, val, n);
|
||||||
else if (target_little_endian_data || ! target_big_endian)
|
else if (target_little_endian_data || ! target_big_endian)
|
||||||
number_to_chars_littleendian (buf, val, n);
|
number_to_chars_littleendian (buf, val, n);
|
||||||
@ -2818,7 +2825,7 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
|
|
||||||
assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
|
assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
|
||||||
|
|
||||||
fixP->fx_addnumber = val; /* Remember value for emit_reloc */
|
fixP->fx_addnumber = val; /* Remember value for emit_reloc. */
|
||||||
|
|
||||||
#ifdef OBJ_ELF
|
#ifdef OBJ_ELF
|
||||||
/* FIXME: SPARC ELF relocations don't use an addend in the data
|
/* FIXME: SPARC ELF relocations don't use an addend in the data
|
||||||
@ -2935,7 +2942,7 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
|
|
||||||
insn |= val & 0x3fffffff;
|
insn |= val & 0x3fffffff;
|
||||||
|
|
||||||
/* See if we have a delay slot */
|
/* See if we have a delay slot. */
|
||||||
if (sparc_relax && fixP->fx_where + 8 <= fixP->fx_frag->fr_fix)
|
if (sparc_relax && fixP->fx_where + 8 <= fixP->fx_frag->fr_fix)
|
||||||
{
|
{
|
||||||
#define G0 0
|
#define G0 0
|
||||||
@ -2960,15 +2967,15 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
delay = bfd_getb32 ((unsigned char *) buf + 4);
|
delay = bfd_getb32 ((unsigned char *) buf + 4);
|
||||||
else
|
else
|
||||||
delay = bfd_getl32 ((unsigned char *) buf + 4);
|
delay = bfd_getl32 ((unsigned char *) buf + 4);
|
||||||
if ((insn & OP(~0)) != OP(1) || (delay & OP(~0)) != OP(2))
|
if ((insn & OP (~0)) != OP (1) || (delay & OP (~0)) != OP (2))
|
||||||
break;
|
break;
|
||||||
if ((delay & OP3(~0)) != OP3(0x3d) /* restore */
|
if ((delay & OP3 (~0)) != OP3 (0x3d) /* Restore. */
|
||||||
&& ((delay & OP3(0x28)) != 0 /* arithmetic */
|
&& ((delay & OP3 (0x28)) != 0 /* Arithmetic. */
|
||||||
|| ((delay & RD(~0)) != RD(O7))))
|
|| ((delay & RD (~0)) != RD (O7))))
|
||||||
break;
|
break;
|
||||||
if ((delay & RS1(~0)) == RS1(O7)
|
if ((delay & RS1 (~0)) == RS1 (O7)
|
||||||
|| ((delay & F3I(~0)) == 0
|
|| ((delay & F3I (~0)) == 0
|
||||||
&& (delay & RS2(~0)) == RS2(O7)))
|
&& (delay & RS2 (~0)) == RS2 (O7)))
|
||||||
break;
|
break;
|
||||||
/* Ensure the branch will fit into simm22. */
|
/* Ensure the branch will fit into simm22. */
|
||||||
if ((val & 0x3fe00000)
|
if ((val & 0x3fe00000)
|
||||||
@ -2986,8 +2993,8 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
/* ba */
|
/* ba */
|
||||||
insn = INSN_BA | (val & 0x3fffff);
|
insn = INSN_BA | (val & 0x3fffff);
|
||||||
if (fixP->fx_where >= 4
|
if (fixP->fx_where >= 4
|
||||||
&& ((delay & (0xffffffff ^ RS1(~0)))
|
&& ((delay & (0xffffffff ^ RS1 (~0)))
|
||||||
== (INSN_OR | RD(O7) | RS2(G0))))
|
== (INSN_OR | RD (O7) | RS2 (G0))))
|
||||||
{
|
{
|
||||||
long setter;
|
long setter;
|
||||||
int reg;
|
int reg;
|
||||||
@ -2996,8 +3003,8 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
setter = bfd_getb32 ((unsigned char *) buf - 4);
|
setter = bfd_getb32 ((unsigned char *) buf - 4);
|
||||||
else
|
else
|
||||||
setter = bfd_getl32 ((unsigned char *) buf - 4);
|
setter = bfd_getl32 ((unsigned char *) buf - 4);
|
||||||
if ((setter & (0xffffffff ^ RD(~0)))
|
if ((setter & (0xffffffff ^ RD (~0)))
|
||||||
!= (INSN_OR | RS1(O7) | RS2(G0)))
|
!= (INSN_OR | RS1 (O7) | RS2 (G0)))
|
||||||
break;
|
break;
|
||||||
/* The sequence was
|
/* The sequence was
|
||||||
or %o7, %g0, %rN
|
or %o7, %g0, %rN
|
||||||
@ -3006,8 +3013,8 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
|
|
||||||
If call foo was replaced with ba, replace
|
If call foo was replaced with ba, replace
|
||||||
or %rN, %g0, %o7 with nop. */
|
or %rN, %g0, %o7 with nop. */
|
||||||
reg = (delay & RS1(~0)) >> 14;
|
reg = (delay & RS1 (~0)) >> 14;
|
||||||
if (reg != ((setter & RD(~0)) >> 25)
|
if (reg != ((setter & RD (~0)) >> 25)
|
||||||
|| reg == G0 || reg == O7)
|
|| reg == G0 || reg == O7)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -3055,7 +3062,7 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case BFD_RELOC_SPARC_WDISP16:
|
case BFD_RELOC_SPARC_WDISP16:
|
||||||
/* FIXME: simplify */
|
/* FIXME: simplify. */
|
||||||
if (((val > 0) && (val & ~0x3fffc))
|
if (((val > 0) && (val & ~0x3fffc))
|
||||||
|| ((val < 0) && (~(val - 1) & ~0x3fffc)))
|
|| ((val < 0) && (~(val - 1) & ~0x3fffc)))
|
||||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||||
@ -3066,7 +3073,7 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case BFD_RELOC_SPARC_WDISP19:
|
case BFD_RELOC_SPARC_WDISP19:
|
||||||
/* FIXME: simplify */
|
/* FIXME: simplify. */
|
||||||
if (((val > 0) && (val & ~0x1ffffc))
|
if (((val > 0) && (val & ~0x1ffffc))
|
||||||
|| ((val < 0) && (~(val - 1) & ~0x1ffffc)))
|
|| ((val < 0) && (~(val - 1) & ~0x1ffffc)))
|
||||||
as_bad_where (fixP->fx_file, fixP->fx_line,
|
as_bad_where (fixP->fx_file, fixP->fx_line,
|
||||||
@ -3078,7 +3085,7 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
|
|
||||||
case BFD_RELOC_SPARC_HH22:
|
case BFD_RELOC_SPARC_HH22:
|
||||||
val = BSR (val, 32);
|
val = BSR (val, 32);
|
||||||
/* intentional fallthrough */
|
/* Fall through. */
|
||||||
|
|
||||||
case BFD_RELOC_SPARC_LM22:
|
case BFD_RELOC_SPARC_LM22:
|
||||||
case BFD_RELOC_HI22:
|
case BFD_RELOC_HI22:
|
||||||
@ -3102,7 +3109,7 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
|
|
||||||
case BFD_RELOC_SPARC_HM10:
|
case BFD_RELOC_SPARC_HM10:
|
||||||
val = BSR (val, 32);
|
val = BSR (val, 32);
|
||||||
/* intentional fallthrough */
|
/* Fall through. */
|
||||||
|
|
||||||
case BFD_RELOC_LO10:
|
case BFD_RELOC_LO10:
|
||||||
if (!fixP->fx_addsy)
|
if (!fixP->fx_addsy)
|
||||||
@ -3119,7 +3126,7 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
case BFD_RELOC_SPARC_OLO10:
|
case BFD_RELOC_SPARC_OLO10:
|
||||||
val &= 0x3ff;
|
val &= 0x3ff;
|
||||||
val += fixP->tc_fix_data;
|
val += fixP->tc_fix_data;
|
||||||
/* intentional fallthrough */
|
/* Fall through. */
|
||||||
|
|
||||||
case BFD_RELOC_SPARC13:
|
case BFD_RELOC_SPARC13:
|
||||||
if (! in_signed_range (val, 0x1fff))
|
if (! in_signed_range (val, 0x1fff))
|
||||||
@ -3130,7 +3137,7 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
|
|
||||||
case BFD_RELOC_SPARC_WDISP22:
|
case BFD_RELOC_SPARC_WDISP22:
|
||||||
val = (val >> 2) + 1;
|
val = (val >> 2) + 1;
|
||||||
/* FALLTHROUGH */
|
/* Fall through. */
|
||||||
case BFD_RELOC_SPARC_BASE22:
|
case BFD_RELOC_SPARC_BASE22:
|
||||||
insn |= val & 0x3fffff;
|
insn |= val & 0x3fffff;
|
||||||
break;
|
break;
|
||||||
@ -3190,6 +3197,7 @@ md_apply_fix3 (fixP, value, segment)
|
|||||||
|
|
||||||
/* Translate internal representation of relocation info to BFD target
|
/* Translate internal representation of relocation info to BFD target
|
||||||
format. */
|
format. */
|
||||||
|
|
||||||
arelent **
|
arelent **
|
||||||
tc_gen_reloc (section, fixp)
|
tc_gen_reloc (section, fixp)
|
||||||
asection *section;
|
asection *section;
|
||||||
@ -3358,15 +3366,15 @@ tc_gen_reloc (section, fixp)
|
|||||||
|
|
||||||
/* We have no need to default values of symbols. */
|
/* We have no need to default values of symbols. */
|
||||||
|
|
||||||
/* ARGSUSED */
|
|
||||||
symbolS *
|
symbolS *
|
||||||
md_undefined_symbol (name)
|
md_undefined_symbol (name)
|
||||||
char *name;
|
char *name;
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
} /* md_undefined_symbol() */
|
}
|
||||||
|
|
||||||
/* Round up a section size to the appropriate boundary. */
|
/* Round up a section size to the appropriate boundary. */
|
||||||
|
|
||||||
valueT
|
valueT
|
||||||
md_section_align (segment, size)
|
md_section_align (segment, size)
|
||||||
segT segment;
|
segT segment;
|
||||||
@ -3378,7 +3386,8 @@ md_section_align (segment, size)
|
|||||||
valueT align = ((valueT) 1
|
valueT align = ((valueT) 1
|
||||||
<< (valueT) bfd_get_section_alignment (stdoutput, segment));
|
<< (valueT) bfd_get_section_alignment (stdoutput, segment));
|
||||||
valueT newsize;
|
valueT newsize;
|
||||||
/* turn alignment value into a mask */
|
|
||||||
|
/* Turn alignment value into a mask. */
|
||||||
align--;
|
align--;
|
||||||
newsize = (size + align) & ~align;
|
newsize = (size + align) & ~align;
|
||||||
return newsize;
|
return newsize;
|
||||||
@ -3423,9 +3432,7 @@ log2 (value)
|
|||||||
return (value == 1) ? shift : -1;
|
return (value == 1) ? shift : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Sort of like s_lcomm. */
|
||||||
* sort of like s_lcomm
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBJ_ELF
|
#ifndef OBJ_ELF
|
||||||
static int max_alignment = 15;
|
static int max_alignment = 15;
|
||||||
@ -3463,7 +3470,7 @@ s_reserve (ignore)
|
|||||||
as_bad (_("BSS length (%d.) <0! Ignored."), size);
|
as_bad (_("BSS length (%d.) <0! Ignored."), size);
|
||||||
ignore_rest_of_line ();
|
ignore_rest_of_line ();
|
||||||
return;
|
return;
|
||||||
} /* bad length */
|
} /* Bad length. */
|
||||||
|
|
||||||
*p = 0;
|
*p = 0;
|
||||||
symbolP = symbol_find_or_make (name);
|
symbolP = symbol_find_or_make (name);
|
||||||
@ -3542,18 +3549,20 @@ s_reserve (ignore)
|
|||||||
segT current_seg = now_seg;
|
segT current_seg = now_seg;
|
||||||
subsegT current_subseg = now_subseg;
|
subsegT current_subseg = now_subseg;
|
||||||
|
|
||||||
subseg_set (bss_section, 1); /* switch to bss */
|
/* Switch to bss. */
|
||||||
|
subseg_set (bss_section, 1);
|
||||||
|
|
||||||
if (align)
|
if (align)
|
||||||
frag_align (align, 0, 0); /* do alignment */
|
/* Do alignment. */
|
||||||
|
frag_align (align, 0, 0);
|
||||||
|
|
||||||
/* detach from old frag */
|
/* Detach from old frag. */
|
||||||
if (S_GET_SEGMENT(symbolP) == bss_section)
|
if (S_GET_SEGMENT(symbolP) == bss_section)
|
||||||
symbol_get_frag (symbolP)->fr_symbol = NULL;
|
symbol_get_frag (symbolP)->fr_symbol = NULL;
|
||||||
|
|
||||||
symbol_set_frag (symbolP, frag_now);
|
symbol_set_frag (symbolP, frag_now);
|
||||||
pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
|
pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
|
||||||
(offsetT) size, (char *)0);
|
(offsetT) size, (char *) 0);
|
||||||
*pfrag = 0;
|
*pfrag = 0;
|
||||||
|
|
||||||
S_SET_SEGMENT (symbolP, bss_section);
|
S_SET_SEGMENT (symbolP, bss_section);
|
||||||
@ -3569,7 +3578,7 @@ s_reserve (ignore)
|
|||||||
{
|
{
|
||||||
as_warn("Ignoring attempt to re-define symbol %s",
|
as_warn("Ignoring attempt to re-define symbol %s",
|
||||||
S_GET_NAME (symbolP));
|
S_GET_NAME (symbolP));
|
||||||
} /* if not redefining */
|
} /* if not redefining. */
|
||||||
|
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
@ -3586,7 +3595,7 @@ s_common (ignore)
|
|||||||
|
|
||||||
name = input_line_pointer;
|
name = input_line_pointer;
|
||||||
c = get_symbol_end ();
|
c = get_symbol_end ();
|
||||||
/* just after name is now '\0' */
|
/* Just after name is now '\0'. */
|
||||||
p = input_line_pointer;
|
p = input_line_pointer;
|
||||||
*p = c;
|
*p = c;
|
||||||
SKIP_WHITESPACE ();
|
SKIP_WHITESPACE ();
|
||||||
@ -3596,7 +3605,10 @@ s_common (ignore)
|
|||||||
ignore_rest_of_line ();
|
ignore_rest_of_line ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
input_line_pointer++; /* skip ',' */
|
|
||||||
|
/* Skip ','. */
|
||||||
|
input_line_pointer++;
|
||||||
|
|
||||||
if ((temp = get_absolute_expression ()) < 0)
|
if ((temp = get_absolute_expression ()) < 0)
|
||||||
{
|
{
|
||||||
as_bad (_(".COMMon length (%d.) <0! Ignored."), temp);
|
as_bad (_(".COMMon length (%d.) <0! Ignored."), temp);
|
||||||
@ -3790,7 +3802,7 @@ s_seg (ignore)
|
|||||||
/* We only support 2 segments -- text and data -- for now, so
|
/* We only support 2 segments -- text and data -- for now, so
|
||||||
things in the "bss segment" will have to go into data for now.
|
things in the "bss segment" will have to go into data for now.
|
||||||
You can still allocate SEG_BSS stuff with .lcomm or .reserve. */
|
You can still allocate SEG_BSS stuff with .lcomm or .reserve. */
|
||||||
subseg_set (data_section, 255); /* FIXME-SOMEDAY */
|
subseg_set (data_section, 255); /* FIXME-SOMEDAY. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
as_bad (_("Unknown segment type"));
|
as_bad (_("Unknown segment type"));
|
||||||
@ -3850,7 +3862,7 @@ s_ncons (bytes)
|
|||||||
The syntax is:
|
The syntax is:
|
||||||
|
|
||||||
.register %g[2367],{#scratch|symbolname|#ignore}
|
.register %g[2367],{#scratch|symbolname|#ignore}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
s_register (ignore)
|
s_register (ignore)
|
||||||
@ -3889,17 +3901,17 @@ s_register (ignore)
|
|||||||
}
|
}
|
||||||
if (sparc_arch_size == 64)
|
if (sparc_arch_size == 64)
|
||||||
{
|
{
|
||||||
if (globals [reg])
|
if (globals[reg])
|
||||||
{
|
{
|
||||||
if ((regname && globals [reg] != (symbolS *)1
|
if ((regname && globals[reg] != (symbolS *) 1
|
||||||
&& strcmp (S_GET_NAME (globals [reg]), regname))
|
&& strcmp (S_GET_NAME (globals[reg]), regname))
|
||||||
|| ((regname != NULL) ^ (globals [reg] != (symbolS *)1)))
|
|| ((regname != NULL) ^ (globals[reg] != (symbolS *) 1)))
|
||||||
as_bad (_("redefinition of global register"));
|
as_bad (_("redefinition of global register"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (regname == NULL)
|
if (regname == NULL)
|
||||||
globals [reg] = (symbolS *)1;
|
globals[reg] = (symbolS *) 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (*regname)
|
if (*regname)
|
||||||
@ -3908,26 +3920,26 @@ s_register (ignore)
|
|||||||
as_bad (_("Register symbol %s already defined."),
|
as_bad (_("Register symbol %s already defined."),
|
||||||
regname);
|
regname);
|
||||||
}
|
}
|
||||||
globals [reg] = symbol_make (regname);
|
globals[reg] = symbol_make (regname);
|
||||||
flags = symbol_get_bfdsym (globals [reg])->flags;
|
flags = symbol_get_bfdsym (globals[reg])->flags;
|
||||||
if (! *regname)
|
if (! *regname)
|
||||||
flags = flags & ~(BSF_GLOBAL|BSF_LOCAL|BSF_WEAK);
|
flags = flags & ~(BSF_GLOBAL|BSF_LOCAL|BSF_WEAK);
|
||||||
if (! (flags & (BSF_GLOBAL|BSF_LOCAL|BSF_WEAK)))
|
if (! (flags & (BSF_GLOBAL|BSF_LOCAL|BSF_WEAK)))
|
||||||
flags |= BSF_GLOBAL;
|
flags |= BSF_GLOBAL;
|
||||||
symbol_get_bfdsym (globals [reg])->flags = flags;
|
symbol_get_bfdsym (globals[reg])->flags = flags;
|
||||||
S_SET_VALUE (globals [reg], (valueT)reg);
|
S_SET_VALUE (globals[reg], (valueT) reg);
|
||||||
S_SET_ALIGN (globals [reg], reg);
|
S_SET_ALIGN (globals[reg], reg);
|
||||||
S_SET_SIZE (globals [reg], 0);
|
S_SET_SIZE (globals[reg], 0);
|
||||||
/* Although we actually want undefined_section here,
|
/* Although we actually want undefined_section here,
|
||||||
we have to use absolute_section, because otherwise
|
we have to use absolute_section, because otherwise
|
||||||
generic as code will make it a COM section.
|
generic as code will make it a COM section.
|
||||||
We fix this up in sparc_adjust_symtab. */
|
We fix this up in sparc_adjust_symtab. */
|
||||||
S_SET_SEGMENT (globals [reg], absolute_section);
|
S_SET_SEGMENT (globals[reg], absolute_section);
|
||||||
S_SET_OTHER (globals [reg], 0);
|
S_SET_OTHER (globals[reg], 0);
|
||||||
elf_symbol (symbol_get_bfdsym (globals [reg]))
|
elf_symbol (symbol_get_bfdsym (globals[reg]))
|
||||||
->internal_elf_sym.st_info =
|
->internal_elf_sym.st_info =
|
||||||
ELF_ST_INFO(STB_GLOBAL, STT_REGISTER);
|
ELF_ST_INFO(STB_GLOBAL, STT_REGISTER);
|
||||||
elf_symbol (symbol_get_bfdsym (globals [reg]))
|
elf_symbol (symbol_get_bfdsym (globals[reg]))
|
||||||
->internal_elf_sym.st_shndx = SHN_UNDEF;
|
->internal_elf_sym.st_shndx = SHN_UNDEF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4026,16 +4038,17 @@ sparc_handle_align (fragp)
|
|||||||
if (count >= 4
|
if (count >= 4
|
||||||
&& !(count & 3)
|
&& !(count & 3)
|
||||||
&& count <= 1024
|
&& count <= 1024
|
||||||
&& !((long)(fragp->fr_literal + fragp->fr_fix) & 3))
|
&& !((long) (fragp->fr_literal + fragp->fr_fix) & 3))
|
||||||
{
|
{
|
||||||
unsigned *p = (unsigned *)(fragp->fr_literal + fragp->fr_fix);
|
unsigned *p = (unsigned *) (fragp->fr_literal + fragp->fr_fix);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < count; i += 4, p++)
|
for (i = 0; i < count; i += 4, p++)
|
||||||
if (INSN_BIG_ENDIAN)
|
if (INSN_BIG_ENDIAN)
|
||||||
number_to_chars_bigendian ((char *)p, 0x01000000, 4); /* emit nops */
|
/* Emit nops. */
|
||||||
|
number_to_chars_bigendian ((char *) p, 0x01000000, 4);
|
||||||
else
|
else
|
||||||
number_to_chars_littleendian ((char *)p, 0x10000000, 4);
|
number_to_chars_littleendian ((char *) p, 0x10000000, 4);
|
||||||
|
|
||||||
if (SPARC_OPCODE_ARCH_V9_P (max_architecture) && count > 8)
|
if (SPARC_OPCODE_ARCH_V9_P (max_architecture) && count > 8)
|
||||||
{
|
{
|
||||||
@ -4115,4 +4128,3 @@ elf32_sparc_force_relocation (fixp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -19,10 +19,8 @@
|
|||||||
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
|
|
||||||
/*
|
/* Written By Steve Chamberlain <sac@cygnus.com>. */
|
||||||
Written By Steve Chamberlain
|
|
||||||
sac@cygnus.com
|
|
||||||
*/
|
|
||||||
#define DEFINE_TABLE
|
#define DEFINE_TABLE
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@ -41,13 +39,6 @@ extern int coff_flags;
|
|||||||
int segmented_mode;
|
int segmented_mode;
|
||||||
const int md_reloc_size;
|
const int md_reloc_size;
|
||||||
|
|
||||||
/* This table describes all the machine specific pseudo-ops the assembler
|
|
||||||
has to support. The fields are:
|
|
||||||
pseudo-op name without dot
|
|
||||||
function to call to execute this pseudo-op
|
|
||||||
Integer arg to pass to the function
|
|
||||||
*/
|
|
||||||
|
|
||||||
void cons ();
|
void cons ();
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -66,8 +57,7 @@ s_unseg ()
|
|||||||
coff_flags = F_Z8002;
|
coff_flags = F_Z8002;
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static void
|
||||||
void
|
|
||||||
even ()
|
even ()
|
||||||
{
|
{
|
||||||
frag_align (1, 0, 0);
|
frag_align (1, 0, 0);
|
||||||
@ -90,7 +80,6 @@ tohex (c)
|
|||||||
void
|
void
|
||||||
sval ()
|
sval ()
|
||||||
{
|
{
|
||||||
|
|
||||||
SKIP_WHITESPACE ();
|
SKIP_WHITESPACE ();
|
||||||
if (*input_line_pointer == '\'')
|
if (*input_line_pointer == '\'')
|
||||||
{
|
{
|
||||||
@ -110,47 +99,53 @@ sval ()
|
|||||||
}
|
}
|
||||||
demand_empty_rest_of_line ();
|
demand_empty_rest_of_line ();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
const pseudo_typeS md_pseudo_table[] =
|
|
||||||
{
|
|
||||||
{"int", cons, 2},
|
|
||||||
{"data.b", cons, 1},
|
|
||||||
{"data.w", cons, 2},
|
|
||||||
{"data.l", cons, 4},
|
|
||||||
{"form", listing_psize, 0},
|
|
||||||
{"heading", listing_title, 0},
|
|
||||||
{"import", s_ignore, 0},
|
|
||||||
{"page", listing_eject, 0},
|
|
||||||
{"program", s_ignore, 0},
|
|
||||||
{"z8001", s_segm, 0},
|
|
||||||
{"z8002", s_unseg, 0},
|
|
||||||
|
|
||||||
|
/* This table describes all the machine specific pseudo-ops the assembler
|
||||||
|
has to support. The fields are:
|
||||||
|
pseudo-op name without dot
|
||||||
|
function to call to execute this pseudo-op
|
||||||
|
Integer arg to pass to the function
|
||||||
|
*/
|
||||||
|
|
||||||
{"segm", s_segm, 0},
|
const pseudo_typeS md_pseudo_table[] = {
|
||||||
{"unsegm", s_unseg, 0},
|
{"int" , cons , 2},
|
||||||
{"unseg", s_unseg, 0},
|
{"data.b" , cons , 1},
|
||||||
{"name", s_app_file, 0},
|
{"data.w" , cons , 2},
|
||||||
{"global", s_globl, 0},
|
{"data.l" , cons , 4},
|
||||||
{"wval", cons, 2},
|
{"form" , listing_psize , 0},
|
||||||
{"lval", cons, 4},
|
{"heading", listing_title , 0},
|
||||||
{"bval", cons, 1},
|
{"import" , s_ignore , 0},
|
||||||
{"sval", sval, 0},
|
{"page" , listing_eject , 0},
|
||||||
{"rsect", obj_coff_section, 0},
|
{"program", s_ignore , 0},
|
||||||
{"sect", obj_coff_section, 0},
|
{"z8001" , s_segm , 0},
|
||||||
{"block", s_space, 0},
|
{"z8002" , s_unseg , 0},
|
||||||
{"even", even, 0},
|
|
||||||
{0, 0, 0}
|
{"segm" , s_segm , 0},
|
||||||
|
{"unsegm" , s_unseg , 0},
|
||||||
|
{"unseg" , s_unseg , 0},
|
||||||
|
{"name" , s_app_file , 0},
|
||||||
|
{"global" , s_globl , 0},
|
||||||
|
{"wval" , cons , 2},
|
||||||
|
{"lval" , cons , 4},
|
||||||
|
{"bval" , cons , 1},
|
||||||
|
{"sval" , sval , 0},
|
||||||
|
{"rsect" , obj_coff_section, 0},
|
||||||
|
{"sect" , obj_coff_section, 0},
|
||||||
|
{"block" , s_space , 0},
|
||||||
|
{"even" , even , 0},
|
||||||
|
{0 , 0 , 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
const char EXP_CHARS[] = "eE";
|
const char EXP_CHARS[] = "eE";
|
||||||
|
|
||||||
/* Chars that mean this number is a floating point constant */
|
/* Chars that mean this number is a floating point constant.
|
||||||
/* As in 0f12.456 */
|
As in 0f12.456
|
||||||
/* or 0d1.2345e12 */
|
or 0d1.2345e12 */
|
||||||
const char FLT_CHARS[] = "rRsSfFdDxXpP";
|
const char FLT_CHARS[] = "rRsSfFdDxXpP";
|
||||||
|
|
||||||
static struct hash_control *opcode_hash_control; /* Opcode mnemonics */
|
/* Opcode mnemonics. */
|
||||||
|
static struct hash_control *opcode_hash_control;
|
||||||
|
|
||||||
void
|
void
|
||||||
md_begin ()
|
md_begin ()
|
||||||
@ -163,7 +158,7 @@ md_begin ()
|
|||||||
|
|
||||||
for (opcode = z8k_table; opcode->name; opcode++)
|
for (opcode = z8k_table; opcode->name; opcode++)
|
||||||
{
|
{
|
||||||
/* Only enter unique codes into the table */
|
/* Only enter unique codes into the table. */
|
||||||
char *src = opcode->name;
|
char *src = opcode->name;
|
||||||
|
|
||||||
if (strcmp (opcode->name, prev_name))
|
if (strcmp (opcode->name, prev_name))
|
||||||
@ -175,10 +170,10 @@ md_begin ()
|
|||||||
prev_name = opcode->name;
|
prev_name = opcode->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* default to z8002 */
|
/* Default to z8002. */
|
||||||
s_unseg ();
|
s_unseg ();
|
||||||
|
|
||||||
/* insert the pseudo ops too */
|
/* Insert the pseudo ops, too. */
|
||||||
for (idx = 0; md_pseudo_table[idx].poc_name; idx++)
|
for (idx = 0; md_pseudo_table[idx].poc_name; idx++)
|
||||||
{
|
{
|
||||||
opcode_entry_type *fake_opcode;
|
opcode_entry_type *fake_opcode;
|
||||||
@ -198,15 +193,22 @@ struct z8k_exp
|
|||||||
char *e_end;
|
char *e_end;
|
||||||
expressionS e_exp;
|
expressionS e_exp;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct z8k_op
|
typedef struct z8k_op
|
||||||
{
|
{
|
||||||
char regsize; /* 'b','w','r','q' */
|
/* 'b','w','r','q'. */
|
||||||
unsigned int reg; /* 0..15 */
|
char regsize;
|
||||||
|
|
||||||
|
/* 0 .. 15. */
|
||||||
|
unsigned int reg;
|
||||||
|
|
||||||
int mode;
|
int mode;
|
||||||
|
|
||||||
unsigned int x_reg; /* any other register associated with the mode */
|
/* Any other register associated with the mode. */
|
||||||
expressionS exp; /* any expression */
|
unsigned int x_reg;
|
||||||
|
|
||||||
|
/* Any expression. */
|
||||||
|
expressionS exp;
|
||||||
}
|
}
|
||||||
|
|
||||||
op_type;
|
op_type;
|
||||||
@ -237,8 +239,7 @@ whatreg (reg, src)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* Parse operands
|
||||||
parse operands
|
|
||||||
|
|
||||||
rh0-rh7, rl0-rl7
|
rh0-rh7, rl0-rl7
|
||||||
r0-r15
|
r0-r15
|
||||||
@ -250,8 +251,7 @@ whatreg (reg, src)
|
|||||||
@WREG+
|
@WREG+
|
||||||
@-WREG
|
@-WREG
|
||||||
#const
|
#const
|
||||||
|
*/
|
||||||
*/
|
|
||||||
|
|
||||||
/* Try to parse a reg name. Return a pointer to the first character
|
/* Try to parse a reg name. Return a pointer to the first character
|
||||||
in SRC after the reg name. */
|
in SRC after the reg name. */
|
||||||
@ -287,7 +287,7 @@ parse_reg (src, mode, reg)
|
|||||||
res = whatreg (reg, src + 2);
|
res = whatreg (reg, src + 2);
|
||||||
regno = *reg;
|
regno = *reg;
|
||||||
if (regno > 14)
|
if (regno > 14)
|
||||||
as_warn (_("register rr%d, out of range."),regno);
|
as_warn (_("register rr%d, out of range."), regno);
|
||||||
}
|
}
|
||||||
else if (src[1] == 'h')
|
else if (src[1] == 'h')
|
||||||
{
|
{
|
||||||
@ -295,7 +295,7 @@ parse_reg (src, mode, reg)
|
|||||||
res = whatreg (reg, src + 2);
|
res = whatreg (reg, src + 2);
|
||||||
regno = *reg;
|
regno = *reg;
|
||||||
if (regno > 7)
|
if (regno > 7)
|
||||||
as_warn (_("register rh%d, out of range."),regno);
|
as_warn (_("register rh%d, out of range."), regno);
|
||||||
}
|
}
|
||||||
else if (src[1] == 'l')
|
else if (src[1] == 'l')
|
||||||
{
|
{
|
||||||
@ -303,7 +303,7 @@ parse_reg (src, mode, reg)
|
|||||||
res = whatreg (reg, src + 2);
|
res = whatreg (reg, src + 2);
|
||||||
regno = *reg;
|
regno = *reg;
|
||||||
if (regno > 7)
|
if (regno > 7)
|
||||||
as_warn (_("register rl%d, out of range."),regno);
|
as_warn (_("register rl%d, out of range."), regno);
|
||||||
*reg += 8;
|
*reg += 8;
|
||||||
}
|
}
|
||||||
else if (src[1] == 'q')
|
else if (src[1] == 'q')
|
||||||
@ -312,7 +312,7 @@ parse_reg (src, mode, reg)
|
|||||||
res = whatreg (reg, src + 2);
|
res = whatreg (reg, src + 2);
|
||||||
regno = *reg;
|
regno = *reg;
|
||||||
if (regno > 12)
|
if (regno > 12)
|
||||||
as_warn (_("register rq%d, out of range."),regno);
|
as_warn (_("register rq%d, out of range."), regno);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -320,11 +320,10 @@ parse_reg (src, mode, reg)
|
|||||||
res = whatreg (reg, src + 1);
|
res = whatreg (reg, src + 1);
|
||||||
regno = *reg;
|
regno = *reg;
|
||||||
if (regno > 15)
|
if (regno > 15)
|
||||||
as_warn (_("register r%d, out of range."),regno);
|
as_warn (_("register r%d, out of range."), regno);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
@ -356,13 +355,9 @@ parse_exp (s, op)
|
|||||||
exp(r)
|
exp(r)
|
||||||
r(#exp)
|
r(#exp)
|
||||||
r(r)
|
r(r)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static
|
static char *
|
||||||
char *
|
|
||||||
checkfor (ptr, what)
|
checkfor (ptr, what)
|
||||||
char *ptr;
|
char *ptr;
|
||||||
char what;
|
char what;
|
||||||
@ -370,13 +365,13 @@ checkfor (ptr, what)
|
|||||||
if (*ptr == what)
|
if (*ptr == what)
|
||||||
ptr++;
|
ptr++;
|
||||||
else
|
else
|
||||||
{
|
|
||||||
as_bad (_("expected %c"), what);
|
as_bad (_("expected %c"), what);
|
||||||
}
|
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure the mode supplied is the size of a word */
|
/* Make sure the mode supplied is the size of a word. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
regword (mode, string)
|
regword (mode, string)
|
||||||
int mode;
|
int mode;
|
||||||
@ -391,7 +386,8 @@ regword (mode, string)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure the mode supplied is the size of an address */
|
/* Make sure the mode supplied is the size of an address. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
regaddr (mode, string)
|
regaddr (mode, string)
|
||||||
int mode;
|
int mode;
|
||||||
@ -412,8 +408,7 @@ struct ctrl_names
|
|||||||
char *name;
|
char *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ctrl_names ctrl_table[] =
|
struct ctrl_names ctrl_table[] = {
|
||||||
{
|
|
||||||
0x2, "fcw",
|
0x2, "fcw",
|
||||||
0X3, "refresh",
|
0X3, "refresh",
|
||||||
0x4, "psapseg",
|
0x4, "psapseg",
|
||||||
@ -422,7 +417,7 @@ struct ctrl_names ctrl_table[] =
|
|||||||
0x6, "nspseg",
|
0x6, "nspseg",
|
||||||
0x7, "nspoff",
|
0x7, "nspoff",
|
||||||
0x7, "nsp",
|
0x7, "nsp",
|
||||||
0, 0
|
0 , 0
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -451,7 +446,8 @@ get_ctrl_operand (ptr, mode, dst)
|
|||||||
the_ctrl = ctrl_table[i].value;
|
the_ctrl = ctrl_table[i].value;
|
||||||
*ptr = src + j;
|
*ptr = src + j;
|
||||||
return;
|
return;
|
||||||
fail:;
|
fail:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
the_ctrl = 0;
|
the_ctrl = 0;
|
||||||
return;
|
return;
|
||||||
@ -464,8 +460,7 @@ struct flag_names
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct flag_names flag_table[] =
|
struct flag_names flag_table[] = {
|
||||||
{
|
|
||||||
0x1, "p",
|
0x1, "p",
|
||||||
0x1, "v",
|
0x1, "v",
|
||||||
0x2, "s",
|
0x2, "s",
|
||||||
@ -512,7 +507,6 @@ get_flags_operand (ptr, mode, dst)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct interrupt_names
|
struct interrupt_names
|
||||||
{
|
{
|
||||||
int value;
|
int value;
|
||||||
@ -555,7 +549,8 @@ get_interrupt_operand (ptr, mode, dst)
|
|||||||
the_interrupt = intr_table[i].value;
|
the_interrupt = intr_table[i].value;
|
||||||
*ptr = src + j;
|
*ptr = src + j;
|
||||||
return;
|
return;
|
||||||
fail:;
|
fail:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
the_interrupt = 0x0;
|
the_interrupt = 0x0;
|
||||||
return;
|
return;
|
||||||
@ -568,8 +563,7 @@ struct cc_names
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cc_names table[] =
|
struct cc_names table[] = {
|
||||||
{
|
|
||||||
0x0, "f",
|
0x0, "f",
|
||||||
0x1, "lt",
|
0x1, "lt",
|
||||||
0x2, "le",
|
0x2, "le",
|
||||||
@ -592,7 +586,7 @@ struct cc_names table[] =
|
|||||||
0xe, "nz",
|
0xe, "nz",
|
||||||
0xf, "nc",
|
0xf, "nc",
|
||||||
0xf, "uge",
|
0xf, "uge",
|
||||||
0, 0
|
0 , 0
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -621,7 +615,8 @@ get_cc_operand (ptr, mode, dst)
|
|||||||
the_cc = table[i].value;
|
the_cc = table[i].value;
|
||||||
*ptr = src + j;
|
*ptr = src + j;
|
||||||
return;
|
return;
|
||||||
fail:;
|
fail:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
the_cc = 0x8;
|
the_cc = 0x8;
|
||||||
}
|
}
|
||||||
@ -672,20 +667,18 @@ get_operand (ptr, mode, dst)
|
|||||||
end = parse_reg (src, &nw, &nr);
|
end = parse_reg (src, &nw, &nr);
|
||||||
if (end)
|
if (end)
|
||||||
{
|
{
|
||||||
/* Got Ra(Rb) */
|
/* Got Ra(Rb). */
|
||||||
src = end;
|
src = end;
|
||||||
|
|
||||||
if (*src != ')')
|
if (*src != ')')
|
||||||
{
|
|
||||||
as_bad (_("Missing ) in ra(rb)"));
|
as_bad (_("Missing ) in ra(rb)"));
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
src++;
|
src++;
|
||||||
}
|
|
||||||
|
|
||||||
regaddr (mode->mode, "ra(rb) ra");
|
regaddr (mode->mode, "ra(rb) ra");
|
||||||
/* regword (mode->mode, "ra(rb) rb");*/
|
#if 0
|
||||||
|
regword (mode->mode, "ra(rb) rb");
|
||||||
|
#endif
|
||||||
mode->mode = CLASS_BX;
|
mode->mode = CLASS_BX;
|
||||||
mode->reg = regn;
|
mode->reg = regn;
|
||||||
mode->x_reg = nr;
|
mode->x_reg = nr;
|
||||||
@ -693,7 +686,7 @@ get_operand (ptr, mode, dst)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Got Ra(disp) */
|
/* Got Ra(disp). */
|
||||||
if (*src == '#')
|
if (*src == '#')
|
||||||
src++;
|
src++;
|
||||||
src = parse_exp (src, &(mode->exp));
|
src = parse_exp (src, &(mode->exp));
|
||||||
@ -712,7 +705,7 @@ get_operand (ptr, mode, dst)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* No initial reg */
|
/* No initial reg. */
|
||||||
src = parse_exp (src, &(mode->exp));
|
src = parse_exp (src, &(mode->exp));
|
||||||
if (*src == '(')
|
if (*src == '(')
|
||||||
{
|
{
|
||||||
@ -727,7 +720,7 @@ get_operand (ptr, mode, dst)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Just an address */
|
/* Just an address. */
|
||||||
mode->mode = CLASS_DA;
|
mode->mode = CLASS_DA;
|
||||||
mode->reg = 0;
|
mode->reg = 0;
|
||||||
mode->x_reg = 0;
|
mode->x_reg = 0;
|
||||||
@ -738,15 +731,15 @@ get_operand (ptr, mode, dst)
|
|||||||
*ptr = src;
|
*ptr = src;
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static char *
|
||||||
char *
|
|
||||||
get_operands (opcode, op_end, operand)
|
get_operands (opcode, op_end, operand)
|
||||||
opcode_entry_type *opcode;
|
opcode_entry_type *opcode;
|
||||||
char *op_end;
|
char *op_end;
|
||||||
op_type *operand;
|
op_type *operand;
|
||||||
{
|
{
|
||||||
char *ptr = op_end;
|
char *ptr = op_end;
|
||||||
char *savptr;
|
char *savptr;
|
||||||
|
|
||||||
switch (opcode->noperands)
|
switch (opcode->noperands)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
@ -764,7 +757,7 @@ char *savptr;
|
|||||||
{
|
{
|
||||||
get_flags_operand (&ptr, operand + 0, 0);
|
get_flags_operand (&ptr, operand + 0, 0);
|
||||||
}
|
}
|
||||||
else if (opcode->arg_info[0] == (CLASS_IMM +(ARG_IMM2)))
|
else if (opcode->arg_info[0] == (CLASS_IMM + (ARG_IMM2)))
|
||||||
{
|
{
|
||||||
get_interrupt_operand (&ptr, operand + 0, 0);
|
get_interrupt_operand (&ptr, operand + 0, 0);
|
||||||
}
|
}
|
||||||
@ -832,6 +825,7 @@ char *savptr;
|
|||||||
ptr++;
|
ptr++;
|
||||||
get_cc_operand (&ptr, operand + 3, 3);
|
get_cc_operand (&ptr, operand + 3, 3);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
@ -840,12 +834,10 @@ char *savptr;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Passed a pointer to a list of opcodes which use different
|
/* Passed a pointer to a list of opcodes which use different
|
||||||
addressing modes, return the opcode which matches the opcodes
|
addressing modes. Return the opcode which matches the opcodes
|
||||||
provided
|
provided. */
|
||||||
*/
|
|
||||||
|
|
||||||
static
|
static opcode_entry_type *
|
||||||
opcode_entry_type *
|
|
||||||
get_specific (opcode, operands)
|
get_specific (opcode, operands)
|
||||||
opcode_entry_type *opcode;
|
opcode_entry_type *opcode;
|
||||||
op_type *operands;
|
op_type *operands;
|
||||||
@ -869,29 +861,29 @@ get_specific (opcode, operands)
|
|||||||
|
|
||||||
if ((mode & CLASS_MASK) != (this_try->arg_info[i] & CLASS_MASK))
|
if ((mode & CLASS_MASK) != (this_try->arg_info[i] & CLASS_MASK))
|
||||||
{
|
{
|
||||||
/* it could be an pc rel operand, if this is a da mode and
|
/* It could be an pc rel operand, if this is a da mode
|
||||||
we like disps, then insert it */
|
and we like disps, then insert it. */
|
||||||
|
|
||||||
if (mode == CLASS_DA && this_try->arg_info[i] == CLASS_DISP)
|
if (mode == CLASS_DA && this_try->arg_info[i] == CLASS_DISP)
|
||||||
{
|
{
|
||||||
/* This is the case */
|
/* This is the case. */
|
||||||
operands[i].mode = CLASS_DISP;
|
operands[i].mode = CLASS_DISP;
|
||||||
}
|
}
|
||||||
else if (mode == CLASS_BA && this_try->arg_info[i])
|
else if (mode == CLASS_BA && this_try->arg_info[i])
|
||||||
{
|
{
|
||||||
/* Can't think of a way to turn what we've been given into
|
/* Can't think of a way to turn what we've been
|
||||||
something that's ok */
|
given into something that's OK. */
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
else if (this_try->arg_info[i] & CLASS_PR)
|
else if (this_try->arg_info[i] & CLASS_PR)
|
||||||
{
|
{
|
||||||
if (mode == CLASS_REG_LONG && segmented_mode)
|
if (mode == CLASS_REG_LONG && segmented_mode)
|
||||||
{
|
{
|
||||||
/* ok */
|
/* OK. */
|
||||||
}
|
}
|
||||||
else if (mode == CLASS_REG_WORD && !segmented_mode)
|
else if (mode == CLASS_REG_WORD && !segmented_mode)
|
||||||
{
|
{
|
||||||
/* ok */
|
/* OK. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -920,7 +912,8 @@ get_specific (opcode, operands)
|
|||||||
}
|
}
|
||||||
|
|
||||||
found = 1;
|
found = 1;
|
||||||
fail:;
|
fail:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
if (found)
|
if (found)
|
||||||
return this_try;
|
return this_try;
|
||||||
@ -938,13 +931,15 @@ check_operand (operand, width, string)
|
|||||||
&& operand->exp.X_op_symbol == 0)
|
&& operand->exp.X_op_symbol == 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* No symbol involved, let's look at offset, it's dangerous if any of
|
/* No symbol involved, let's look at offset, it's dangerous if
|
||||||
the high bits are not 0 or ff's, find out by oring or anding with
|
any of the high bits are not 0 or ff's, find out by oring or
|
||||||
the width and seeing if the answer is 0 or all fs*/
|
anding with the width and seeing if the answer is 0 or all
|
||||||
|
fs. */
|
||||||
if ((operand->exp.X_add_number & ~width) != 0 &&
|
if ((operand->exp.X_add_number & ~width) != 0 &&
|
||||||
(operand->exp.X_add_number | width) != (~0))
|
(operand->exp.X_add_number | width) != (~0))
|
||||||
{
|
{
|
||||||
as_warn (_("operand %s0x%x out of range."), string, operand->exp.X_add_number);
|
as_warn (_("operand %s0x%x out of range."),
|
||||||
|
string, operand->exp.X_add_number);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1004,12 +999,12 @@ apply_fix (ptr, type, operand, size)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now we know what sort of opcodes it is, lets build the bytes -
|
/* Now we know what sort of opcodes it is. Let's build the bytes. */
|
||||||
*/
|
|
||||||
#define INSERT(x,y) *x++ = y>>24; *x++ = y>> 16; *x++=y>>8; *x++ =y;
|
#define INSERT(x,y) *x++ = y>>24; *x++ = y>> 16; *x++=y>>8; *x++ =y;
|
||||||
static void
|
static void
|
||||||
build_bytes (this_try, operand)
|
build_bytes (this_try, operand)
|
||||||
opcode_entry_type * this_try;
|
opcode_entry_type *this_try;
|
||||||
struct z8k_op *operand;
|
struct z8k_op *operand;
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@ -1029,18 +1024,18 @@ build_bytes (this_try, operand)
|
|||||||
|
|
||||||
memset (buffer, 20, 0);
|
memset (buffer, 20, 0);
|
||||||
class_ptr = this_try->byte_info;
|
class_ptr = this_try->byte_info;
|
||||||
top:;
|
|
||||||
|
|
||||||
|
top:
|
||||||
for (nibble = 0; c = *class_ptr++; nibble++)
|
for (nibble = 0; c = *class_ptr++; nibble++)
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (c & CLASS_MASK)
|
switch (c & CLASS_MASK)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
|
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
case CLASS_ADDRESS:
|
case CLASS_ADDRESS:
|
||||||
/* Direct address, we don't cope with the SS mode right now */
|
/* Direct address, we don't cope with the SS mode right now. */
|
||||||
if (segmented_mode)
|
if (segmented_mode)
|
||||||
{
|
{
|
||||||
da_operand->X_add_number |= 0x80000000;
|
da_operand->X_add_number |= 0x80000000;
|
||||||
@ -1078,18 +1073,12 @@ top:;
|
|||||||
if (imm_operand)
|
if (imm_operand)
|
||||||
{
|
{
|
||||||
if (imm_operand->X_add_number == 2)
|
if (imm_operand->X_add_number == 2)
|
||||||
{
|
|
||||||
*output_ptr |= 2;
|
*output_ptr |= 2;
|
||||||
}
|
|
||||||
else if (imm_operand->X_add_number != 1)
|
else if (imm_operand->X_add_number != 1)
|
||||||
{
|
|
||||||
as_bad (_("immediate must be 1 or 2"));
|
as_bad (_("immediate must be 1 or 2"));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
as_bad (_("immediate 1 or 2 expected"));
|
as_bad (_("immediate 1 or 2 expected"));
|
||||||
}
|
|
||||||
output_ptr++;
|
output_ptr++;
|
||||||
break;
|
break;
|
||||||
case CLASS_CC:
|
case CLASS_CC:
|
||||||
@ -1115,16 +1104,14 @@ top:;
|
|||||||
break;
|
break;
|
||||||
case CLASS_REGN0:
|
case CLASS_REGN0:
|
||||||
if (reg[c & 0xf] == 0)
|
if (reg[c & 0xf] == 0)
|
||||||
{
|
|
||||||
as_bad (_("can't use R0 here"));
|
as_bad (_("can't use R0 here"));
|
||||||
}
|
/* Fall through. */
|
||||||
case CLASS_REG:
|
case CLASS_REG:
|
||||||
case CLASS_REG_BYTE:
|
case CLASS_REG_BYTE:
|
||||||
case CLASS_REG_WORD:
|
case CLASS_REG_WORD:
|
||||||
case CLASS_REG_LONG:
|
case CLASS_REG_LONG:
|
||||||
case CLASS_REG_QUAD:
|
case CLASS_REG_QUAD:
|
||||||
/* Insert bit mattern of
|
/* Insert bit mattern of right reg. */
|
||||||
right reg */
|
|
||||||
*output_ptr++ = reg[c & 0xf];
|
*output_ptr++ = reg[c & 0xf];
|
||||||
break;
|
break;
|
||||||
case CLASS_DISP:
|
case CLASS_DISP:
|
||||||
@ -1168,8 +1155,7 @@ top:;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy from the nibble buffer into the frag */
|
/* Copy from the nibble buffer into the frag. */
|
||||||
|
|
||||||
{
|
{
|
||||||
int length = (output_ptr - buffer) / 2;
|
int length = (output_ptr - buffer) / 2;
|
||||||
char *src = buffer;
|
char *src = buffer;
|
||||||
@ -1181,9 +1167,7 @@ top:;
|
|||||||
src += 2;
|
src += 2;
|
||||||
fragp++;
|
fragp++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is the guts of the machine-dependent assembler. STR points to a
|
/* This is the guts of the machine-dependent assembler. STR points to a
|
||||||
@ -1204,17 +1188,14 @@ md_assemble (str)
|
|||||||
char *dot = 0;
|
char *dot = 0;
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
/* Drop leading whitespace */
|
/* Drop leading whitespace. */
|
||||||
while (*str == ' ')
|
while (*str == ' ')
|
||||||
str++;
|
str++;
|
||||||
|
|
||||||
/* find the op code end */
|
/* Find the op code end. */
|
||||||
for (op_start = op_end = str;
|
for (op_start = op_end = str;
|
||||||
*op_end != 0 && *op_end != ' ';
|
*op_end != 0 && *op_end != ' ';
|
||||||
op_end++)
|
op_end++)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
if (op_end == op_start)
|
if (op_end == op_start)
|
||||||
@ -1225,9 +1206,7 @@ md_assemble (str)
|
|||||||
|
|
||||||
*op_end = 0;
|
*op_end = 0;
|
||||||
|
|
||||||
opcode = (opcode_entry_type *) hash_find (opcode_hash_control,
|
opcode = (opcode_entry_type *) hash_find (opcode_hash_control, op_start);
|
||||||
op_start);
|
|
||||||
|
|
||||||
|
|
||||||
if (opcode == NULL)
|
if (opcode == NULL)
|
||||||
{
|
{
|
||||||
@ -1237,7 +1216,7 @@ md_assemble (str)
|
|||||||
|
|
||||||
if (opcode->opcode == 250)
|
if (opcode->opcode == 250)
|
||||||
{
|
{
|
||||||
/* was really a pseudo op */
|
/* Was really a pseudo op. */
|
||||||
|
|
||||||
pseudo_typeS *p;
|
pseudo_typeS *p;
|
||||||
char oc;
|
char oc;
|
||||||
@ -1245,7 +1224,6 @@ md_assemble (str)
|
|||||||
char *old = input_line_pointer;
|
char *old = input_line_pointer;
|
||||||
*op_end = c;
|
*op_end = c;
|
||||||
|
|
||||||
|
|
||||||
input_line_pointer = op_end;
|
input_line_pointer = op_end;
|
||||||
|
|
||||||
oc = *old;
|
oc = *old;
|
||||||
@ -1260,15 +1238,14 @@ md_assemble (str)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
input_line_pointer = get_operands (opcode, op_end,
|
input_line_pointer = get_operands (opcode, op_end, operand);
|
||||||
operand);
|
|
||||||
prev_opcode = opcode;
|
prev_opcode = opcode;
|
||||||
|
|
||||||
opcode = get_specific (opcode, operand);
|
opcode = get_specific (opcode, operand);
|
||||||
|
|
||||||
if (opcode == 0)
|
if (opcode == 0)
|
||||||
{
|
{
|
||||||
/* Couldn't find an opcode which matched the operands */
|
/* Couldn't find an opcode which matched the operands. */
|
||||||
char *where = frag_more (2);
|
char *where = frag_more (2);
|
||||||
|
|
||||||
where[0] = 0x0;
|
where[0] = 0x0;
|
||||||
@ -1303,14 +1280,15 @@ tc_headers_hook (headers)
|
|||||||
printf (_("call to tc_headers_hook \n"));
|
printf (_("call to tc_headers_hook \n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Various routines to kill one day */
|
/* Various routines to kill one day. */
|
||||||
/* Equal to MAX_PRECISION in atof-ieee.c */
|
/* Equal to MAX_PRECISION in atof-ieee.c. */
|
||||||
#define MAX_LITTLENUMS 6
|
#define MAX_LITTLENUMS 6
|
||||||
|
|
||||||
/* Turn a string in input_line_pointer into a floating point constant of type
|
/* Turn a string in input_line_pointer into a floating point constant
|
||||||
type, and store the appropriate bytes in *litP. The number of LITTLENUMS
|
of type TYPE, and store the appropriate bytes in *LITP. The number
|
||||||
emitted is stored in *sizeP . An error message is returned, or NULL on OK.
|
of LITTLENUMS emitted is stored in *SIZEP. An error message is
|
||||||
*/
|
returned, or NULL on OK. */
|
||||||
|
|
||||||
char *
|
char *
|
||||||
md_atof (type, litP, sizeP)
|
md_atof (type, litP, sizeP)
|
||||||
char type;
|
char type;
|
||||||
@ -1367,10 +1345,12 @@ md_atof (type, litP, sizeP)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CONST char *md_shortopts = "z:";
|
CONST char *md_shortopts = "z:";
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
int
|
int
|
||||||
md_parse_option (c, arg)
|
md_parse_option (c, arg)
|
||||||
@ -1402,7 +1382,7 @@ void
|
|||||||
md_show_usage (stream)
|
md_show_usage (stream)
|
||||||
FILE *stream;
|
FILE *stream;
|
||||||
{
|
{
|
||||||
fprintf(stream, _("\
|
fprintf (stream, _("\
|
||||||
Z8K options:\n\
|
Z8K options:\n\
|
||||||
-z8001 generate segmented code\n\
|
-z8001 generate segmented code\n\
|
||||||
-z8002 generate unsegmented code\n"));
|
-z8002 generate unsegmented code\n"));
|
||||||
@ -1430,7 +1410,8 @@ md_section_align (seg, size)
|
|||||||
segT seg;
|
segT seg;
|
||||||
valueT size;
|
valueT size;
|
||||||
{
|
{
|
||||||
return ((size + (1 << section_alignment[(int) seg]) - 1) & (-1 << section_alignment[(int) seg]));
|
return ((size + (1 << section_alignment[(int) seg]) - 1)
|
||||||
|
& (-1 << section_alignment[(int) seg]));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1450,13 +1431,19 @@ md_apply_fix (fixP, val)
|
|||||||
case R_JR:
|
case R_JR:
|
||||||
|
|
||||||
*buf++ = val;
|
*buf++ = val;
|
||||||
/* if (val != 0) abort();*/
|
#if 0
|
||||||
|
if (val != 0)
|
||||||
|
abort ();
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_DISP7:
|
case R_DISP7:
|
||||||
|
|
||||||
*buf++ += val;
|
*buf++ += val;
|
||||||
/* if (val != 0) abort();*/
|
#if 0
|
||||||
|
if (val != 0)
|
||||||
|
abort ();
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R_IMM8:
|
case R_IMM8:
|
||||||
@ -1487,7 +1474,6 @@ md_apply_fix (fixP, val)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1500,7 +1486,7 @@ md_estimate_size_before_relax (fragP, segment_type)
|
|||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Put number into target byte order */
|
/* Put number into target byte order. */
|
||||||
|
|
||||||
void
|
void
|
||||||
md_number_to_chars (ptr, use, nbytes)
|
md_number_to_chars (ptr, use, nbytes)
|
||||||
@ -1510,6 +1496,7 @@ md_number_to_chars (ptr, use, nbytes)
|
|||||||
{
|
{
|
||||||
number_to_chars_bigendian (ptr, use, nbytes);
|
number_to_chars_bigendian (ptr, use, nbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
long
|
long
|
||||||
md_pcrel_from (fixP)
|
md_pcrel_from (fixP)
|
||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
@ -1532,18 +1519,19 @@ tc_reloc_mangle (fix_ptr, intr, base)
|
|||||||
{
|
{
|
||||||
symbolS *symbol_ptr;
|
symbolS *symbol_ptr;
|
||||||
|
|
||||||
if (fix_ptr->fx_addsy &&
|
if (fix_ptr->fx_addsy
|
||||||
fix_ptr->fx_subsy)
|
&& fix_ptr->fx_subsy)
|
||||||
{
|
{
|
||||||
symbolS *add = fix_ptr->fx_addsy;
|
symbolS *add = fix_ptr->fx_addsy;
|
||||||
symbolS *sub = fix_ptr->fx_subsy;
|
symbolS *sub = fix_ptr->fx_subsy;
|
||||||
if (S_GET_SEGMENT(add) != S_GET_SEGMENT(sub))
|
|
||||||
|
if (S_GET_SEGMENT (add) != S_GET_SEGMENT (sub))
|
||||||
|
as_bad (_("Can't subtract symbols in different sections %s %s"),
|
||||||
|
S_GET_NAME (add), S_GET_NAME (sub));
|
||||||
|
else
|
||||||
{
|
{
|
||||||
as_bad(_("Can't subtract symbols in different sections %s %s"),
|
int diff = S_GET_VALUE (add) - S_GET_VALUE (sub);
|
||||||
S_GET_NAME(add), S_GET_NAME(sub));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int diff = S_GET_VALUE(add) - S_GET_VALUE(sub);
|
|
||||||
fix_ptr->fx_addsy = 0;
|
fix_ptr->fx_addsy = 0;
|
||||||
fix_ptr->fx_subsy = 0;
|
fix_ptr->fx_subsy = 0;
|
||||||
fix_ptr->fx_offset += diff;
|
fix_ptr->fx_offset += diff;
|
||||||
@ -1552,10 +1540,10 @@ tc_reloc_mangle (fix_ptr, intr, base)
|
|||||||
symbol_ptr = fix_ptr->fx_addsy;
|
symbol_ptr = fix_ptr->fx_addsy;
|
||||||
|
|
||||||
/* If this relocation is attached to a symbol then it's ok
|
/* If this relocation is attached to a symbol then it's ok
|
||||||
to output it */
|
to output it. */
|
||||||
if (fix_ptr->fx_r_type == 0)
|
if (fix_ptr->fx_r_type == 0)
|
||||||
{
|
{
|
||||||
/* cons likes to create reloc32's whatever the size of the reloc.. */
|
/* cons likes to create reloc32's whatever the size of the reloc. */
|
||||||
switch (fix_ptr->fx_size)
|
switch (fix_ptr->fx_size)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
@ -1570,12 +1558,9 @@ tc_reloc_mangle (fix_ptr, intr, base)
|
|||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
intr->r_type = fix_ptr->fx_r_type;
|
intr->r_type = fix_ptr->fx_r_type;
|
||||||
}
|
|
||||||
|
|
||||||
intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
|
intr->r_vaddr = fix_ptr->fx_frag->fr_address + fix_ptr->fx_where + base;
|
||||||
intr->r_offset = fix_ptr->fx_offset;
|
intr->r_offset = fix_ptr->fx_offset;
|
||||||
@ -1585,4 +1570,3 @@ tc_reloc_mangle (fix_ptr, intr, base)
|
|||||||
else
|
else
|
||||||
intr->r_symndx = -1;
|
intr->r_symndx = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user