* config/tc-sparc.h (TARGET_FORMAT): Use #ifdef SPARC_ARCH64 instead of
#ifdef sparcv9 when choosing value. (ENV64): Delete. (md_end): Define. (sparc_md_end): Declare. * config/tc-sparc.c (SPARC_V9): Renamed from sparcv9. (initial_architecture): New static local. (can_bump_v9_p): Likewise. (NO_V9): Delete all occurrences. (sparc_md_end): New function. (sparc_ip): New local v9_arg_p. Rework fp reg number test. Don't bump architecture to v9 unless can_bump_v9_p set. (md_parse_option): -A<arch> passed, set can_bump_v9_p accordingly. * configure.in (sparc64 target cpu): Don't set obj_format here. (SPARC_V9): Renamed from sparcv9. (sparc64-*-elf*): Define SPARC_ARCH64. * configure: Regenerated. * acconfig.h (SPARC_V9): Renamed from sparcv9. (SPARC_ARCH64): Add. * config/vmsconf.h: Update.
This commit is contained in:
parent
c9c7c1d777
commit
6df07e7f7e
6 changed files with 267 additions and 195 deletions
|
@ -1,3 +1,26 @@
|
|||
Mon Jan 22 09:21:36 1996 Doug Evans <dje@charmed.cygnus.com>
|
||||
|
||||
* config/tc-sparc.h (TARGET_FORMAT): Use #ifdef SPARC_ARCH64 instead of
|
||||
#ifdef sparcv9 when choosing value.
|
||||
(ENV64): Delete.
|
||||
(md_end): Define.
|
||||
(sparc_md_end): Declare.
|
||||
* config/tc-sparc.c (SPARC_V9): Renamed from sparcv9.
|
||||
(initial_architecture): New static local.
|
||||
(can_bump_v9_p): Likewise.
|
||||
(NO_V9): Delete all occurrences.
|
||||
(sparc_md_end): New function.
|
||||
(sparc_ip): New local v9_arg_p. Rework fp reg number test.
|
||||
Don't bump architecture to v9 unless can_bump_v9_p set.
|
||||
(md_parse_option): -A<arch> passed, set can_bump_v9_p accordingly.
|
||||
* configure.in (sparc64 target cpu): Don't set obj_format here.
|
||||
(SPARC_V9): Renamed from sparcv9.
|
||||
(sparc64-*-elf*): Define SPARC_ARCH64.
|
||||
* configure: Regenerated.
|
||||
* acconfig.h (SPARC_V9): Renamed from sparcv9.
|
||||
(SPARC_ARCH64): Add.
|
||||
* config/vmsconf.h: Update.
|
||||
|
||||
Mon Jan 22 17:24:47 1996 James G. Smith <jsmith@cygnus.co.uk>
|
||||
|
||||
* config/tc-mips.c (load_register): Optimise "dli" loads.
|
||||
|
|
|
@ -28,8 +28,9 @@
|
|||
|
||||
#undef MANY_SEGMENTS
|
||||
|
||||
/* Needed only for sparc configuration */
|
||||
#undef sparcv9
|
||||
/* Needed only for sparc configuration. */
|
||||
#undef SPARC_V9
|
||||
#undef SPARC_ARCH64
|
||||
|
||||
/* Needed only for some configurations that can produce multiple output
|
||||
formats. */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* tc-sparc.c -- Assemble for the SPARC
|
||||
Copyright (C) 1989, 90, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
|
||||
Copyright (C) 1989, 90-95, 1996 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GAS, the GNU Assembler.
|
||||
|
||||
|
@ -28,11 +28,25 @@
|
|||
|
||||
static void sparc_ip PARAMS ((char *));
|
||||
|
||||
#ifdef sparcv9
|
||||
static enum sparc_architecture current_architecture = v9;
|
||||
#ifdef SPARC_V9
|
||||
/* In a 32 bit environment, don't bump up to v9 unless necessary. */
|
||||
#ifdef SPARC_ARCH64
|
||||
static enum sparc_architecture initial_architecture = v9;
|
||||
#else
|
||||
static enum sparc_architecture current_architecture = v6;
|
||||
static enum sparc_architecture initial_architecture = v6;
|
||||
#endif
|
||||
#else
|
||||
static enum sparc_architecture initial_architecture = v6;
|
||||
#endif
|
||||
|
||||
/* If sparc64 was the configured cpu, allow bumping up to v9 by default. */
|
||||
#ifdef SPARC_V9
|
||||
static int can_bump_v9_p = 1;
|
||||
#else
|
||||
static int can_bump_v9_p = 0;
|
||||
#endif
|
||||
|
||||
static enum sparc_architecture current_architecture;
|
||||
static int architecture_requested;
|
||||
static int warn_on_bump;
|
||||
|
||||
|
@ -62,12 +76,10 @@ const pseudo_typeS md_pseudo_table[] =
|
|||
{"seg", s_seg, 0},
|
||||
{"skip", s_space, 0},
|
||||
{"word", cons, 4},
|
||||
#ifndef NO_V9
|
||||
{"xword", cons, 8},
|
||||
#ifdef OBJ_ELF
|
||||
{"uaxword", cons, 8},
|
||||
#endif
|
||||
#endif
|
||||
#ifdef OBJ_ELF
|
||||
/* these are specific to sparc/svr4 */
|
||||
{"pushsection", obj_elf_section, 0},
|
||||
|
@ -502,7 +514,7 @@ s_proc (ignore)
|
|||
++input_line_pointer;
|
||||
}
|
||||
|
||||
#ifndef NO_V9
|
||||
/* sparc64 priviledged registers */
|
||||
|
||||
struct priv_reg_entry
|
||||
{
|
||||
|
@ -532,26 +544,6 @@ struct priv_reg_entry priv_reg_table[] =
|
|||
{"", -1}, /* end marker */
|
||||
};
|
||||
|
||||
struct membar_masks
|
||||
{
|
||||
char *name;
|
||||
unsigned int len;
|
||||
unsigned int mask;
|
||||
};
|
||||
|
||||
#define MEMBAR_MASKS_SIZE 7
|
||||
|
||||
static const struct membar_masks membar_masks[MEMBAR_MASKS_SIZE] =
|
||||
{
|
||||
{"Sync", 4, 0x40},
|
||||
{"MemIssue", 8, 0x20},
|
||||
{"Lookaside", 9, 0x10},
|
||||
{"StoreStore", 10, 0x08},
|
||||
{"LoadStore", 9, 0x04},
|
||||
{"StoreLoad", 9, 0x02},
|
||||
{"LoadLoad", 8, 0x01},
|
||||
};
|
||||
|
||||
static int
|
||||
cmp_reg_entry (p, q)
|
||||
struct priv_reg_entry *p, *q;
|
||||
|
@ -559,10 +551,9 @@ cmp_reg_entry (p, q)
|
|||
return strcmp (q->name, p->name);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* 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. */
|
||||
|
||||
void
|
||||
md_begin ()
|
||||
{
|
||||
|
@ -608,12 +599,42 @@ md_begin ()
|
|||
for (i = 'A'; i <= 'F'; ++i)
|
||||
toHex[i] = i + 10 - 'A';
|
||||
|
||||
#ifndef NO_V9
|
||||
qsort (priv_reg_table, sizeof (priv_reg_table) / sizeof (priv_reg_table[0]),
|
||||
sizeof (priv_reg_table[0]), cmp_reg_entry);
|
||||
#endif
|
||||
|
||||
target_big_endian = 1;
|
||||
current_architecture = initial_architecture;
|
||||
}
|
||||
|
||||
/* Called after all assembly has been done. */
|
||||
|
||||
void
|
||||
sparc_md_end ()
|
||||
{
|
||||
/* If we bumped up in architecture, we need to change bfd's mach number. */
|
||||
/* ??? We could delete this test, I think. */
|
||||
if (current_architecture != initial_architecture)
|
||||
{
|
||||
#ifdef BFD64
|
||||
if (current_architecture < v9)
|
||||
abort ();
|
||||
else if (current_architecture == v9)
|
||||
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_v9);
|
||||
else if (current_architecture == v9a)
|
||||
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_v9a);
|
||||
else
|
||||
abort ();
|
||||
#else
|
||||
if (current_architecture < v9)
|
||||
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc);
|
||||
else if (current_architecture == v9)
|
||||
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_v8plus);
|
||||
else if (current_architecture == v9a)
|
||||
bfd_set_arch_mach (stdoutput, bfd_arch_sparc, bfd_mach_sparc_v8plusa);
|
||||
else
|
||||
abort ();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -710,6 +731,67 @@ BSR (val, amount)
|
|||
return val >> amount;
|
||||
}
|
||||
|
||||
/* Parse an argument that can be expressed as a keyword.
|
||||
(eg: #StoreStore).
|
||||
The result is a boolean indicating success.
|
||||
If successful, INPUT_POINTER is updated. */
|
||||
|
||||
static int
|
||||
parse_keyword_arg (lookup_fn, input_pointerP, valueP)
|
||||
int (*lookup_fn) ();
|
||||
char **input_pointerP;
|
||||
int *valueP;
|
||||
{
|
||||
int value;
|
||||
char c, *p, *q;
|
||||
|
||||
p = *input_pointerP;
|
||||
for (q = p + (*p == '#'); isalpha (*q) || *q == '_'; ++q)
|
||||
continue;
|
||||
c = *q;
|
||||
*q = 0;
|
||||
value = (*lookup_fn) (p);
|
||||
*q = c;
|
||||
if (value == -1)
|
||||
return 0;
|
||||
*valueP = value;
|
||||
*input_pointerP = q;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Parse an argument that is a constant expression.
|
||||
The result is a boolean indicating success. */
|
||||
|
||||
static int
|
||||
parse_const_expr_arg (input_pointerP, valueP)
|
||||
char **input_pointerP;
|
||||
int *valueP;
|
||||
{
|
||||
char *save = input_line_pointer;
|
||||
expressionS exp;
|
||||
|
||||
input_line_pointer = *input_pointerP;
|
||||
/* The next expression may be something other than a constant
|
||||
(say if we're not processing the right variant of the insn).
|
||||
Don't call expression unless we're sure it will succeed as it will
|
||||
signal an error (which we want to defer until later). */
|
||||
/* FIXME: It might be better to define md_operand and have it recognize
|
||||
things like %asi, etc. but continuing that route through to the end
|
||||
is a lot of work. */
|
||||
if (*input_line_pointer == '%')
|
||||
{
|
||||
input_line_pointer = save;
|
||||
return 0;
|
||||
}
|
||||
expression (&exp);
|
||||
*input_pointerP = input_line_pointer;
|
||||
input_line_pointer = save;
|
||||
if (exp.X_op != O_constant)
|
||||
return 0;
|
||||
*valueP = exp.X_add_number;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
sparc_ip (str)
|
||||
char *str;
|
||||
|
@ -725,12 +807,13 @@ sparc_ip (str)
|
|||
int match = 0;
|
||||
int comma = 0;
|
||||
long immediate_max = 0;
|
||||
int v9_arg_p;
|
||||
|
||||
for (s = str; islower (*s) || (*s >= '0' && *s <= '3'); ++s)
|
||||
;
|
||||
|
||||
switch (*s)
|
||||
{
|
||||
|
||||
case '\0':
|
||||
break;
|
||||
|
||||
|
@ -756,12 +839,14 @@ sparc_ip (str)
|
|||
{
|
||||
*--s = ',';
|
||||
}
|
||||
|
||||
argsStart = s;
|
||||
for (;;)
|
||||
{
|
||||
opcode = insn->match;
|
||||
memset (&the_insn, '\0', sizeof (the_insn));
|
||||
the_insn.reloc = BFD_RELOC_NONE;
|
||||
v9_arg_p = 0;
|
||||
|
||||
/*
|
||||
* Build the opcode, checking as we go to make
|
||||
|
@ -771,114 +856,81 @@ sparc_ip (str)
|
|||
{
|
||||
switch (*args)
|
||||
{
|
||||
#ifndef NO_V9
|
||||
case 'K':
|
||||
{
|
||||
int kmask = 0;
|
||||
int i;
|
||||
|
||||
/* Parse a series of masks. */
|
||||
if (*s == '#')
|
||||
{
|
||||
while (*s == '#')
|
||||
{
|
||||
++s;
|
||||
for (i = 0; i < MEMBAR_MASKS_SIZE; i++)
|
||||
if (!strncmp (s, membar_masks[i].name,
|
||||
membar_masks[i].len))
|
||||
break;
|
||||
if (i < MEMBAR_MASKS_SIZE)
|
||||
{
|
||||
kmask |= membar_masks[i].mask;
|
||||
s += membar_masks[i].len;
|
||||
}
|
||||
else
|
||||
int mask;
|
||||
|
||||
if (! parse_keyword_arg (sparc_encode_membar, &s,
|
||||
&mask))
|
||||
{
|
||||
error_message = ": invalid membar mask name";
|
||||
goto error;
|
||||
}
|
||||
if (*s == '|')
|
||||
kmask |= mask;
|
||||
while (*s == ' ') { ++s; continue; }
|
||||
if (*s == '|' || *s == '+')
|
||||
++s;
|
||||
while (*s == ' ') { ++s; continue; }
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
expressionS exp;
|
||||
char *hold;
|
||||
char *send;
|
||||
|
||||
hold = input_line_pointer;
|
||||
input_line_pointer = s;
|
||||
expression (&exp);
|
||||
send = input_line_pointer;
|
||||
input_line_pointer = hold;
|
||||
|
||||
kmask = exp.X_add_number;
|
||||
if (exp.X_op != O_constant
|
||||
|| kmask < 0
|
||||
|| kmask > 127)
|
||||
if (! parse_const_expr_arg (&s, &kmask))
|
||||
{
|
||||
error_message = ": invalid membar mask expression";
|
||||
goto error;
|
||||
}
|
||||
if (kmask < 0 || kmask > 127)
|
||||
{
|
||||
error_message = ": invalid membar mask number";
|
||||
goto error;
|
||||
}
|
||||
|
||||
s = send;
|
||||
}
|
||||
|
||||
opcode |= SIMM13 (kmask);
|
||||
opcode |= MEMBAR (kmask);
|
||||
continue;
|
||||
}
|
||||
|
||||
case '*':
|
||||
{
|
||||
int prefetch_fcn = 0;
|
||||
int fcn = 0;
|
||||
|
||||
/* Parse a prefetch function. */
|
||||
if (*s == '#')
|
||||
{
|
||||
s += 1;
|
||||
if (!strncmp (s, "n_reads", 7))
|
||||
prefetch_fcn = 0, s += 7;
|
||||
else if (!strncmp (s, "one_read", 8))
|
||||
prefetch_fcn = 1, s += 8;
|
||||
else if (!strncmp (s, "n_writes", 8))
|
||||
prefetch_fcn = 2, s += 8;
|
||||
else if (!strncmp (s, "one_write", 9))
|
||||
prefetch_fcn = 3, s += 9;
|
||||
else if (!strncmp (s, "page", 4))
|
||||
prefetch_fcn = 4, s += 4;
|
||||
else
|
||||
if (! parse_keyword_arg (sparc_encode_prefetch, &s, &fcn))
|
||||
{
|
||||
error_message = ": invalid prefetch function name";
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
else if (isdigit (*s))
|
||||
else
|
||||
{
|
||||
while (isdigit (*s))
|
||||
if (! parse_const_expr_arg (&s, &fcn))
|
||||
{
|
||||
prefetch_fcn = prefetch_fcn * 10 + *s - '0';
|
||||
++s;
|
||||
error_message = ": invalid prefetch function expression";
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (prefetch_fcn < 0 || prefetch_fcn > 31)
|
||||
if (fcn < 0 || fcn > 31)
|
||||
{
|
||||
error_message = ": invalid prefetch function number";
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error_message = ": unrecognizable prefetch function";
|
||||
goto error;
|
||||
}
|
||||
opcode |= RD (prefetch_fcn);
|
||||
opcode |= RD (fcn);
|
||||
continue;
|
||||
}
|
||||
|
||||
case '!':
|
||||
case '?':
|
||||
/* Parse a privileged register. */
|
||||
/* Parse a sparc64 privileged register. */
|
||||
if (*s == '%')
|
||||
{
|
||||
struct priv_reg_entry *p = priv_reg_table;
|
||||
|
@ -911,7 +963,6 @@ sparc_ip (str)
|
|||
error_message = ": unrecognizable privileged register";
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
case 'M':
|
||||
case 'm':
|
||||
|
@ -947,7 +998,6 @@ sparc_ip (str)
|
|||
} /* if %asr */
|
||||
break;
|
||||
|
||||
#ifndef NO_V9
|
||||
case 'I':
|
||||
the_insn.reloc = BFD_RELOC_SPARC_11;
|
||||
immediate_max = 0x03FF;
|
||||
|
@ -1071,7 +1121,6 @@ sparc_ip (str)
|
|||
continue;
|
||||
}
|
||||
break;
|
||||
#endif /* NO_V9 */
|
||||
|
||||
case '\0': /* end of args */
|
||||
if (*s == '\0')
|
||||
|
@ -1245,10 +1294,9 @@ sparc_ip (str)
|
|||
default:
|
||||
goto error;
|
||||
}
|
||||
/*
|
||||
* Got the register, now figure out where
|
||||
* it goes in the opcode.
|
||||
*/
|
||||
|
||||
/* Got the register, now figure out where
|
||||
it goes in the opcode. */
|
||||
switch (*args)
|
||||
{
|
||||
|
||||
|
@ -1310,23 +1358,27 @@ sparc_ip (str)
|
|||
break;
|
||||
} /* register must be multiple of 4 */
|
||||
|
||||
#ifndef NO_V9
|
||||
if (mask >= 64)
|
||||
{
|
||||
error_message = ": There are only 64 f registers; [0-63]";
|
||||
if (can_bump_v9_p)
|
||||
error_message = ": There are only 64 f registers; [0-63]";
|
||||
else
|
||||
error_message = ": There are only 32 f registers; [0-31]";
|
||||
goto error;
|
||||
} /* on error */
|
||||
if (mask >= 32)
|
||||
else if (mask >= 32)
|
||||
{
|
||||
mask -= 31;
|
||||
} /* wrap high bit */
|
||||
#else
|
||||
if (mask >= 32)
|
||||
{
|
||||
error_message = ": There are only 32 f registers; [0-31]";
|
||||
goto error;
|
||||
} /* on error */
|
||||
#endif
|
||||
if (can_bump_v9_p)
|
||||
{
|
||||
v9_arg_p = 1;
|
||||
mask -= 31; /* wrap high bit */
|
||||
}
|
||||
else
|
||||
{
|
||||
error_message = ": There are only 32 f registers; [0-31]";
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1335,7 +1387,6 @@ sparc_ip (str)
|
|||
|
||||
switch (*args)
|
||||
{
|
||||
|
||||
case 'v':
|
||||
case 'V':
|
||||
case 'e':
|
||||
|
@ -1407,13 +1458,13 @@ sparc_ip (str)
|
|||
the_insn.reloc = BFD_RELOC_LO10;
|
||||
s += 3;
|
||||
}
|
||||
#ifndef NO_V9
|
||||
else if (c == 'u'
|
||||
&& s[2] == 'h'
|
||||
&& s[3] == 'i')
|
||||
{
|
||||
the_insn.reloc = BFD_RELOC_SPARC_HH22;
|
||||
s += 4;
|
||||
v9_arg_p = 1;
|
||||
}
|
||||
else if (c == 'u'
|
||||
&& s[2] == 'l'
|
||||
|
@ -1421,8 +1472,8 @@ sparc_ip (str)
|
|||
{
|
||||
the_insn.reloc = BFD_RELOC_SPARC_HM10;
|
||||
s += 4;
|
||||
v9_arg_p = 1;
|
||||
}
|
||||
#endif /* NO_V9 */
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
@ -1469,7 +1520,6 @@ sparc_ip (str)
|
|||
&& the_insn.exp.X_add_symbol == 0
|
||||
&& the_insn.exp.X_op_symbol == 0)
|
||||
{
|
||||
#ifndef NO_V9
|
||||
/* Handle %uhi/%ulo by moving the upper word to the lower
|
||||
one and pretending it's %hi/%lo. We also need to watch
|
||||
for %hi/%lo: the top word needs to be zeroed otherwise
|
||||
|
@ -1484,14 +1534,14 @@ sparc_ip (str)
|
|||
the_insn.reloc = BFD_RELOC_LO10;
|
||||
the_insn.exp.X_add_number = BSR (the_insn.exp.X_add_number, 32);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case BFD_RELOC_HI22:
|
||||
case BFD_RELOC_LO10:
|
||||
the_insn.exp.X_add_number &= 0xffffffff;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* For pc-relative call instructions, we reject
|
||||
constants to get better code. */
|
||||
if (the_insn.pcrel
|
||||
|
@ -1548,40 +1598,22 @@ sparc_ip (str)
|
|||
/* Parse an asi. */
|
||||
if (*s == '#')
|
||||
{
|
||||
char c, *p;
|
||||
|
||||
for (p = s + 1; isalpha (*p) || *p == '_'; ++p)
|
||||
continue;
|
||||
c = *p;
|
||||
*p = 0;
|
||||
asi = sparc_encode_asi (s);
|
||||
*p = c;
|
||||
if (asi == -1)
|
||||
if (! parse_keyword_arg (sparc_encode_asi, &s, &asi))
|
||||
{
|
||||
error_message = ": invalid asi name";
|
||||
error_message = ": invalid ASI name";
|
||||
goto error;
|
||||
}
|
||||
s = p;
|
||||
}
|
||||
else
|
||||
{
|
||||
char *push = input_line_pointer;
|
||||
expressionS e;
|
||||
input_line_pointer = s;
|
||||
|
||||
expression (&e);
|
||||
if (e.X_op != O_constant)
|
||||
if (! parse_const_expr_arg (&s, &asi))
|
||||
{
|
||||
error_message = ": constant required for ASI";
|
||||
error_message = ": invalid ASI expression";
|
||||
goto error;
|
||||
}
|
||||
asi = e.X_add_number;
|
||||
s = input_line_pointer;
|
||||
input_line_pointer = push;
|
||||
|
||||
if (asi < 0 || asi > 255)
|
||||
{
|
||||
error_message = ": invalid asi number";
|
||||
error_message = ": invalid ASI number";
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
@ -1626,7 +1658,6 @@ sparc_ip (str)
|
|||
}
|
||||
break;
|
||||
|
||||
#ifndef NO_V9
|
||||
case 'o':
|
||||
if (strncmp (s, "%asi", 4) != 0)
|
||||
break;
|
||||
|
@ -1644,7 +1675,6 @@ sparc_ip (str)
|
|||
break;
|
||||
s += 4;
|
||||
continue;
|
||||
#endif /* NO_V9 */
|
||||
|
||||
case 't':
|
||||
if (strncmp (s, "%tbr", 4) != 0)
|
||||
|
@ -1658,7 +1688,6 @@ sparc_ip (str)
|
|||
s += 4;
|
||||
continue;
|
||||
|
||||
#ifndef NO_V9
|
||||
case 'x':
|
||||
{
|
||||
char *push = input_line_pointer;
|
||||
|
@ -1680,7 +1709,6 @@ sparc_ip (str)
|
|||
input_line_pointer = push;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
case 'y':
|
||||
if (strncmp (s, "%y", 2) != 0)
|
||||
|
@ -1691,8 +1719,11 @@ sparc_ip (str)
|
|||
default:
|
||||
as_fatal ("failed sanity check.");
|
||||
} /* switch on arg code */
|
||||
|
||||
/* Break out of for() loop. */
|
||||
break;
|
||||
} /* for each arg that we expect */
|
||||
|
||||
error:
|
||||
if (match == 0)
|
||||
{
|
||||
|
@ -1715,29 +1746,36 @@ sparc_ip (str)
|
|||
{
|
||||
if (insn->architecture > current_architecture
|
||||
|| (insn->architecture != current_architecture
|
||||
&& current_architecture > v8))
|
||||
&& current_architecture > v8)
|
||||
|| (v9_arg_p && current_architecture < v9))
|
||||
{
|
||||
enum sparc_architecture needed_architecture =
|
||||
((v9_arg_p && insn->architecture < v9)
|
||||
? v9 : insn->architecture);
|
||||
|
||||
if ((!architecture_requested || warn_on_bump)
|
||||
&& !ARCHITECTURES_CONFLICT_P (current_architecture,
|
||||
insn->architecture)
|
||||
&& !ARCHITECTURES_CONFLICT_P (insn->architecture,
|
||||
current_architecture))
|
||||
needed_architecture)
|
||||
&& !ARCHITECTURES_CONFLICT_P (needed_architecture,
|
||||
current_architecture)
|
||||
&& (needed_architecture < v9 || can_bump_v9_p))
|
||||
{
|
||||
if (warn_on_bump)
|
||||
{
|
||||
as_warn ("architecture bumped from \"%s\" to \"%s\" on \"%s\"",
|
||||
architecture_pname[current_architecture],
|
||||
architecture_pname[insn->architecture],
|
||||
architecture_pname[needed_architecture],
|
||||
str);
|
||||
} /* if warning */
|
||||
|
||||
current_architecture = insn->architecture;
|
||||
if (needed_architecture > current_architecture)
|
||||
current_architecture = needed_architecture;
|
||||
}
|
||||
else
|
||||
{
|
||||
as_bad ("Architecture mismatch on \"%s\".", str);
|
||||
as_tsktsk (" (Requires %s; current architecture is %s.)",
|
||||
architecture_pname[insn->architecture],
|
||||
architecture_pname[needed_architecture],
|
||||
architecture_pname[current_architecture]);
|
||||
return;
|
||||
} /* if bump ok else error */
|
||||
|
@ -1947,7 +1985,6 @@ md_apply_fix (fixP, value)
|
|||
buf[3] = val;
|
||||
break;
|
||||
|
||||
#ifndef NO_V9
|
||||
case BFD_RELOC_64:
|
||||
{
|
||||
bfd_vma valh = BSR (val, 32);
|
||||
|
@ -2013,11 +2050,8 @@ md_apply_fix (fixP, value)
|
|||
case BFD_RELOC_SPARC_HH22:
|
||||
val = BSR (val, 32);
|
||||
/* intentional fallthrough */
|
||||
#endif /* NO_V9 */
|
||||
|
||||
#ifndef NO_V9
|
||||
case BFD_RELOC_SPARC_LM22:
|
||||
#endif
|
||||
case BFD_RELOC_HI22:
|
||||
if (!fixP->fx_addsy)
|
||||
{
|
||||
|
@ -2042,11 +2076,9 @@ md_apply_fix (fixP, value)
|
|||
buf[3] = val & 0xff;
|
||||
break;
|
||||
|
||||
#ifndef NO_V9
|
||||
case BFD_RELOC_SPARC_HM10:
|
||||
val = BSR (val, 32);
|
||||
/* intentional fallthrough */
|
||||
#endif /* NO_V9 */
|
||||
|
||||
case BFD_RELOC_LO10:
|
||||
if (!fixP->fx_addsy)
|
||||
|
@ -2280,7 +2312,9 @@ print_insn (insn)
|
|||
* supported by the selected architecture cause fatal errors.
|
||||
*
|
||||
* The default is to start at v6, and bump the architecture up
|
||||
* whenever an instruction is seen at a higher level.
|
||||
* whenever an instruction is seen at a higher level. If sparc64
|
||||
* was not the target cpu, v9 is not bumped up to, the user must
|
||||
* pass -Av9.
|
||||
*
|
||||
* If -bump is specified, a warning is printing when bumping to
|
||||
* higher levels.
|
||||
|
@ -2289,7 +2323,7 @@ print_insn (insn)
|
|||
* that architecture. Any higher level instructions are flagged
|
||||
* as errors.
|
||||
*
|
||||
* if both an architecture and -bump are specified, the
|
||||
* If both an architecture and -bump are specified, the
|
||||
* architecture starts at the specified level, but bumps are
|
||||
* warnings.
|
||||
*
|
||||
|
@ -2346,15 +2380,17 @@ md_parse_option (c, arg)
|
|||
else
|
||||
{
|
||||
enum sparc_architecture new_arch = arch - architecture_pname;
|
||||
#ifdef NO_V9
|
||||
if (new_arch == v9)
|
||||
{
|
||||
as_error ("v9 support not compiled in");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
current_architecture = new_arch;
|
||||
|
||||
initial_architecture = new_arch;
|
||||
architecture_requested = 1;
|
||||
|
||||
/* ??? May wish an option to explicitly set `can_bump_v9_p'. */
|
||||
/* Set `can_bump_v9_p' if v9: we assume that if the current
|
||||
architecture is v9, it's set. */
|
||||
if (new_arch >= v9)
|
||||
can_bump_v9_p = 1;
|
||||
else
|
||||
can_bump_v9_p = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -66,7 +66,8 @@
|
|||
#undef MANY_SEGMENTS
|
||||
|
||||
/* Needed only for sparc configuration */
|
||||
#undef sparcv9
|
||||
#undef SPARC_V9
|
||||
#undef SPARC_ARCH64
|
||||
|
||||
/* Define if you have the remove function. */
|
||||
#define HAVE_REMOVE
|
||||
|
|
51
gas/configure
vendored
51
gas/configure
vendored
|
@ -686,9 +686,9 @@ case ${target_cpu} in
|
|||
powerpcle*) cpu_type=ppc endian=little ;;
|
||||
powerpc*) cpu_type=ppc endian=big ;;
|
||||
rs6000*) cpu_type=ppc ;;
|
||||
sparc64) cpu_type=sparc obj_format=elf
|
||||
sparc64) cpu_type=sparc
|
||||
cat >> confdefs.h <<\EOF
|
||||
#define sparcv9 1
|
||||
#define SPARC_V9 1
|
||||
EOF
|
||||
;;
|
||||
sparclite*) cpu_type=sparc ;;
|
||||
|
@ -753,7 +753,7 @@ for this_target in $target $canon_targets ; do
|
|||
powerpcle*) cpu_type=ppc endian=little ;;
|
||||
powerpc*) cpu_type=ppc endian=big ;;
|
||||
rs6000*) cpu_type=ppc ;;
|
||||
sparc64) cpu_type=sparc obj_format=elf want_sparcv9=true ;;
|
||||
sparc64) cpu_type=sparc want_sparc_v9=true ;;
|
||||
sparclite*) cpu_type=sparc ;;
|
||||
*) cpu_type=${cpu} ;;
|
||||
esac
|
||||
|
@ -946,7 +946,7 @@ for this_target in $target $canon_targets ; do
|
|||
*-*-xray | *-*-hms) fmt=coff ;;
|
||||
*-*-sim) fmt=coff ;;
|
||||
*-*-elf | *-*-sysv4* | *-*-solaris*)
|
||||
echo "configure: warning: GAS support for ELF format is incomplete." 1>&2
|
||||
echo "configure: warning: GAS support for ${generic_target} is incomplete." 1>&2
|
||||
fmt=elf dev=yes ;;
|
||||
*-*-vxworks) fmt=aout ;;
|
||||
*-*-netware) fmt=elf ;;
|
||||
|
@ -968,11 +968,18 @@ for this_target in $target $canon_targets ; do
|
|||
|
||||
# Other random stuff.
|
||||
|
||||
test -n "$want_sparcv9" && cat >> confdefs.h <<\EOF
|
||||
#define sparcv9 1
|
||||
test -n "$want_sparc_v9" && cat >> confdefs.h <<\EOF
|
||||
#define SPARC_V9 1
|
||||
EOF
|
||||
|
||||
|
||||
case ${cpu}-${vendor}-${os} in
|
||||
sparc64-*-elf*) cat >> confdefs.h <<\EOF
|
||||
#define SPARC_ARCH64 1
|
||||
EOF
|
||||
;;
|
||||
esac
|
||||
|
||||
case ${cpu_type} in
|
||||
m68k) extra_objects="$extra_objects m68k-parse.o" ;;
|
||||
esac
|
||||
|
@ -1432,7 +1439,7 @@ else
|
|||
# On the NeXT, cc -E runs the code through the compiler's parser,
|
||||
# not just through cpp.
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1436 "configure"
|
||||
#line 1443 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
|
@ -1446,7 +1453,7 @@ else
|
|||
rm -rf conftest*
|
||||
CPP="${CC-cc} -E -traditional-cpp"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1450 "configure"
|
||||
#line 1457 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
Syntax Error
|
||||
|
@ -1479,7 +1486,7 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1483 "configure"
|
||||
#line 1490 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <$ac_hdr>
|
||||
EOF
|
||||
|
@ -1531,7 +1538,7 @@ else
|
|||
ac_cv_c_cross=yes
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1535 "configure"
|
||||
#line 1542 "configure"
|
||||
#include "confdefs.h"
|
||||
main(){return(0);}
|
||||
EOF
|
||||
|
@ -1555,7 +1562,7 @@ if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1559 "configure"
|
||||
#line 1566 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <alloca.h>
|
||||
int main() { return 0; }
|
||||
|
@ -1587,7 +1594,7 @@ if eval "test \"`echo '$''{'ac_cv_func_alloca'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1591 "configure"
|
||||
#line 1598 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
#ifdef __GNUC__
|
||||
|
@ -1646,7 +1653,7 @@ if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1650 "configure"
|
||||
#line 1657 "configure"
|
||||
#include "confdefs.h"
|
||||
#if defined(CRAY) && ! defined(CRAY2)
|
||||
webecray
|
||||
|
@ -1675,7 +1682,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1679 "configure"
|
||||
#line 1686 "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char $ac_func(); below. */
|
||||
|
@ -1729,7 +1736,7 @@ else
|
|||
ac_cv_c_stack_direction=0
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1733 "configure"
|
||||
#line 1740 "configure"
|
||||
#include "confdefs.h"
|
||||
find_stack_direction ()
|
||||
{
|
||||
|
@ -1772,7 +1779,7 @@ else
|
|||
ac_cv_c_inline=no
|
||||
for ac_kw in inline __inline__ __inline; do
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1776 "configure"
|
||||
#line 1783 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
int main() { return 0; }
|
||||
|
@ -1812,7 +1819,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1816 "configure"
|
||||
#line 1823 "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char $ac_func(); below. */
|
||||
|
@ -1865,7 +1872,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1869 "configure"
|
||||
#line 1876 "configure"
|
||||
#include "confdefs.h"
|
||||
/* System header to define __stub macros and hopefully few prototypes,
|
||||
which can conflict with char $ac_func(); below. */
|
||||
|
@ -1918,7 +1925,7 @@ if eval "test \"`echo '$''{'gas_cv_assert_ok'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1922 "configure"
|
||||
#line 1929 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
@ -1975,7 +1982,7 @@ if eval "test \"`echo '$''{'gas_cv_decl_needed_malloc'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1979 "configure"
|
||||
#line 1986 "configure"
|
||||
#include "confdefs.h"
|
||||
$gas_test_headers
|
||||
int main() { return 0; }
|
||||
|
@ -2011,7 +2018,7 @@ if eval "test \"`echo '$''{'gas_cv_decl_needed_free'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2015 "configure"
|
||||
#line 2022 "configure"
|
||||
#include "confdefs.h"
|
||||
$gas_test_headers
|
||||
int main() { return 0; }
|
||||
|
@ -2050,7 +2057,7 @@ if eval "test \"`echo '$''{'gas_cv_decl_needed_errno'+set}'`\" = set"; then
|
|||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 2054 "configure"
|
||||
#line 2061 "configure"
|
||||
#include "confdefs.h"
|
||||
|
||||
#ifdef HAVE_ERRNO_H
|
||||
|
|
|
@ -53,8 +53,8 @@ changequote([,])dnl
|
|||
powerpcle*) cpu_type=ppc endian=little ;;
|
||||
powerpc*) cpu_type=ppc endian=big ;;
|
||||
rs6000*) cpu_type=ppc ;;
|
||||
sparc64) cpu_type=sparc obj_format=elf
|
||||
AC_DEFINE(sparcv9) ;;
|
||||
sparc64) cpu_type=sparc
|
||||
AC_DEFINE(SPARC_V9) ;;
|
||||
sparclite*) cpu_type=sparc ;;
|
||||
*) cpu_type=${target_cpu} ;;
|
||||
esac
|
||||
|
@ -107,7 +107,7 @@ changequote([,])dnl
|
|||
powerpcle*) cpu_type=ppc endian=little ;;
|
||||
powerpc*) cpu_type=ppc endian=big ;;
|
||||
rs6000*) cpu_type=ppc ;;
|
||||
sparc64) cpu_type=sparc obj_format=elf want_sparcv9=true ;;
|
||||
sparc64) cpu_type=sparc want_sparc_v9=true ;;
|
||||
sparclite*) cpu_type=sparc ;;
|
||||
*) cpu_type=${cpu} ;;
|
||||
esac
|
||||
|
@ -300,7 +300,7 @@ changequote([,])dnl
|
|||
*-*-xray | *-*-hms) fmt=coff ;;
|
||||
*-*-sim) fmt=coff ;;
|
||||
*-*-elf | *-*-sysv4* | *-*-solaris*)
|
||||
AC_MSG_WARN(GAS support for ELF format is incomplete.)
|
||||
AC_MSG_WARN(GAS support for ${generic_target} is incomplete.)
|
||||
fmt=elf dev=yes ;;
|
||||
*-*-vxworks) fmt=aout ;;
|
||||
*-*-netware) fmt=elf ;;
|
||||
|
@ -322,7 +322,11 @@ changequote([,])dnl
|
|||
|
||||
# Other random stuff.
|
||||
|
||||
test -n "$want_sparcv9" && AC_DEFINE(sparcv9)
|
||||
test -n "$want_sparc_v9" && AC_DEFINE(SPARC_V9)
|
||||
|
||||
case ${cpu}-${vendor}-${os} in
|
||||
sparc64-*-elf*) AC_DEFINE(SPARC_ARCH64) ;;
|
||||
esac
|
||||
|
||||
case ${cpu_type} in
|
||||
m68k) extra_objects="$extra_objects m68k-parse.o" ;;
|
||||
|
|
Loading…
Add table
Reference in a new issue