* 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:
David Edelsohn
1996-01-22 17:53:34 +00:00
parent c9c7c1d777
commit 6df07e7f7e
6 changed files with 267 additions and 195 deletions

View File

@ -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> Mon Jan 22 17:24:47 1996 James G. Smith <jsmith@cygnus.co.uk>
* config/tc-mips.c (load_register): Optimise "dli" loads. * config/tc-mips.c (load_register): Optimise "dli" loads.

View File

@ -28,8 +28,9 @@
#undef MANY_SEGMENTS #undef MANY_SEGMENTS
/* Needed only for sparc configuration */ /* Needed only for sparc configuration. */
#undef sparcv9 #undef SPARC_V9
#undef SPARC_ARCH64
/* Needed only for some configurations that can produce multiple output /* Needed only for some configurations that can produce multiple output
formats. */ formats. */

View File

@ -1,5 +1,5 @@
/* tc-sparc.c -- Assemble for the SPARC /* 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. This file is part of GAS, the GNU Assembler.
@ -28,11 +28,25 @@
static void sparc_ip PARAMS ((char *)); static void sparc_ip PARAMS ((char *));
#ifdef sparcv9 #ifdef SPARC_V9
static enum sparc_architecture current_architecture = 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 #else
static enum sparc_architecture current_architecture = v6; static enum sparc_architecture initial_architecture = v6;
#endif #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 architecture_requested;
static int warn_on_bump; static int warn_on_bump;
@ -62,12 +76,10 @@ const pseudo_typeS md_pseudo_table[] =
{"seg", s_seg, 0}, {"seg", s_seg, 0},
{"skip", s_space, 0}, {"skip", s_space, 0},
{"word", cons, 4}, {"word", cons, 4},
#ifndef NO_V9
{"xword", cons, 8}, {"xword", cons, 8},
#ifdef OBJ_ELF #ifdef OBJ_ELF
{"uaxword", cons, 8}, {"uaxword", cons, 8},
#endif #endif
#endif
#ifdef OBJ_ELF #ifdef OBJ_ELF
/* these are specific to sparc/svr4 */ /* these are specific to sparc/svr4 */
{"pushsection", obj_elf_section, 0}, {"pushsection", obj_elf_section, 0},
@ -502,7 +514,7 @@ s_proc (ignore)
++input_line_pointer; ++input_line_pointer;
} }
#ifndef NO_V9 /* sparc64 priviledged registers */
struct priv_reg_entry struct priv_reg_entry
{ {
@ -532,26 +544,6 @@ struct priv_reg_entry priv_reg_table[] =
{"", -1}, /* end marker */ {"", -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 static int
cmp_reg_entry (p, q) cmp_reg_entry (p, q)
struct priv_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); return strcmp (q->name, p->name);
} }
#endif
/* 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 ()
{ {
@ -608,12 +599,42 @@ md_begin ()
for (i = 'A'; i <= 'F'; ++i) for (i = 'A'; i <= 'F'; ++i)
toHex[i] = i + 10 - 'A'; toHex[i] = i + 10 - 'A';
#ifndef NO_V9
qsort (priv_reg_table, sizeof (priv_reg_table) / sizeof (priv_reg_table[0]), qsort (priv_reg_table, sizeof (priv_reg_table) / sizeof (priv_reg_table[0]),
sizeof (priv_reg_table[0]), cmp_reg_entry); sizeof (priv_reg_table[0]), cmp_reg_entry);
#endif
target_big_endian = 1; 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 void
@ -710,6 +731,67 @@ BSR (val, amount)
return 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 static void
sparc_ip (str) sparc_ip (str)
char *str; char *str;
@ -725,12 +807,13 @@ sparc_ip (str)
int match = 0; int match = 0;
int comma = 0; int comma = 0;
long immediate_max = 0; long immediate_max = 0;
int v9_arg_p;
for (s = str; islower (*s) || (*s >= '0' && *s <= '3'); ++s) for (s = str; islower (*s) || (*s >= '0' && *s <= '3'); ++s)
; ;
switch (*s) switch (*s)
{ {
case '\0': case '\0':
break; break;
@ -756,12 +839,14 @@ sparc_ip (str)
{ {
*--s = ','; *--s = ',';
} }
argsStart = s; argsStart = s;
for (;;) for (;;)
{ {
opcode = insn->match; opcode = insn->match;
memset (&the_insn, '\0', sizeof (the_insn)); memset (&the_insn, '\0', sizeof (the_insn));
the_insn.reloc = BFD_RELOC_NONE; the_insn.reloc = BFD_RELOC_NONE;
v9_arg_p = 0;
/* /*
* Build the opcode, checking as we go to make * Build the opcode, checking as we go to make
@ -771,114 +856,81 @@ sparc_ip (str)
{ {
switch (*args) switch (*args)
{ {
#ifndef NO_V9
case 'K': case 'K':
{ {
int kmask = 0; int kmask = 0;
int i;
/* Parse a series of masks. */ /* Parse a series of masks. */
if (*s == '#') if (*s == '#')
{ {
while (*s == '#') while (*s == '#')
{ {
++s; int mask;
for (i = 0; i < MEMBAR_MASKS_SIZE; i++)
if (!strncmp (s, membar_masks[i].name, if (! parse_keyword_arg (sparc_encode_membar, &s,
membar_masks[i].len)) &mask))
break;
if (i < MEMBAR_MASKS_SIZE)
{
kmask |= membar_masks[i].mask;
s += membar_masks[i].len;
}
else
{ {
error_message = ": invalid membar mask name"; error_message = ": invalid membar mask name";
goto error; goto error;
} }
if (*s == '|') kmask |= mask;
while (*s == ' ') { ++s; continue; }
if (*s == '|' || *s == '+')
++s; ++s;
while (*s == ' ') { ++s; continue; }
} }
} }
else else
{ {
expressionS exp; if (! parse_const_expr_arg (&s, &kmask))
char *hold; {
char *send; error_message = ": invalid membar mask expression";
goto error;
hold = input_line_pointer; }
input_line_pointer = s; if (kmask < 0 || kmask > 127)
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)
{ {
error_message = ": invalid membar mask number"; error_message = ": invalid membar mask number";
goto error; goto error;
} }
s = send;
} }
opcode |= SIMM13 (kmask); opcode |= MEMBAR (kmask);
continue; continue;
} }
case '*': case '*':
{ {
int prefetch_fcn = 0; int fcn = 0;
/* Parse a prefetch function. */ /* Parse a prefetch function. */
if (*s == '#') if (*s == '#')
{ {
s += 1; if (! parse_keyword_arg (sparc_encode_prefetch, &s, &fcn))
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
{ {
error_message = ": invalid prefetch function name"; error_message = ": invalid prefetch function name";
goto error; goto error;
} }
} }
else if (isdigit (*s)) else
{ {
while (isdigit (*s)) if (! parse_const_expr_arg (&s, &fcn))
{ {
prefetch_fcn = prefetch_fcn * 10 + *s - '0'; error_message = ": invalid prefetch function expression";
++s; goto error;
} }
if (fcn < 0 || fcn > 31)
if (prefetch_fcn < 0 || prefetch_fcn > 31)
{ {
error_message = ": invalid prefetch function number"; error_message = ": invalid prefetch function number";
goto error; goto error;
} }
} }
else opcode |= RD (fcn);
{
error_message = ": unrecognizable prefetch function";
goto error;
}
opcode |= RD (prefetch_fcn);
continue; continue;
} }
case '!': case '!':
case '?': case '?':
/* Parse a privileged register. */ /* Parse a sparc64 privileged register. */
if (*s == '%') if (*s == '%')
{ {
struct priv_reg_entry *p = priv_reg_table; struct priv_reg_entry *p = priv_reg_table;
@ -911,7 +963,6 @@ sparc_ip (str)
error_message = ": unrecognizable privileged register"; error_message = ": unrecognizable privileged register";
goto error; goto error;
} }
#endif
case 'M': case 'M':
case 'm': case 'm':
@ -947,7 +998,6 @@ sparc_ip (str)
} /* if %asr */ } /* if %asr */
break; break;
#ifndef NO_V9
case 'I': case 'I':
the_insn.reloc = BFD_RELOC_SPARC_11; the_insn.reloc = BFD_RELOC_SPARC_11;
immediate_max = 0x03FF; immediate_max = 0x03FF;
@ -1071,7 +1121,6 @@ sparc_ip (str)
continue; continue;
} }
break; break;
#endif /* NO_V9 */
case '\0': /* end of args */ case '\0': /* end of args */
if (*s == '\0') if (*s == '\0')
@ -1245,10 +1294,9 @@ sparc_ip (str)
default: default:
goto error; goto error;
} }
/*
* Got the register, now figure out where /* Got the register, now figure out where
* it goes in the opcode. it goes in the opcode. */
*/
switch (*args) switch (*args)
{ {
@ -1310,23 +1358,27 @@ sparc_ip (str)
break; break;
} /* register must be multiple of 4 */ } /* register must be multiple of 4 */
#ifndef NO_V9
if (mask >= 64) if (mask >= 64)
{ {
if (can_bump_v9_p)
error_message = ": There are only 64 f registers; [0-63]"; error_message = ": There are only 64 f registers; [0-63]";
goto error; else
} /* on error */
if (mask >= 32)
{
mask -= 31;
} /* wrap high bit */
#else
if (mask >= 32)
{
error_message = ": There are only 32 f registers; [0-31]"; error_message = ": There are only 32 f registers; [0-31]";
goto error; goto error;
} /* on error */ } /* on error */
#endif else if (mask >= 32)
{
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 else
{ {
@ -1335,7 +1387,6 @@ sparc_ip (str)
switch (*args) switch (*args)
{ {
case 'v': case 'v':
case 'V': case 'V':
case 'e': case 'e':
@ -1407,13 +1458,13 @@ sparc_ip (str)
the_insn.reloc = BFD_RELOC_LO10; the_insn.reloc = BFD_RELOC_LO10;
s += 3; s += 3;
} }
#ifndef NO_V9
else if (c == 'u' else if (c == 'u'
&& s[2] == 'h' && s[2] == 'h'
&& s[3] == 'i') && s[3] == 'i')
{ {
the_insn.reloc = BFD_RELOC_SPARC_HH22; the_insn.reloc = BFD_RELOC_SPARC_HH22;
s += 4; s += 4;
v9_arg_p = 1;
} }
else if (c == 'u' else if (c == 'u'
&& s[2] == 'l' && s[2] == 'l'
@ -1421,8 +1472,8 @@ sparc_ip (str)
{ {
the_insn.reloc = BFD_RELOC_SPARC_HM10; the_insn.reloc = BFD_RELOC_SPARC_HM10;
s += 4; s += 4;
v9_arg_p = 1;
} }
#endif /* NO_V9 */
else else
break; break;
} }
@ -1469,7 +1520,6 @@ sparc_ip (str)
&& the_insn.exp.X_add_symbol == 0 && the_insn.exp.X_add_symbol == 0
&& the_insn.exp.X_op_symbol == 0) && the_insn.exp.X_op_symbol == 0)
{ {
#ifndef NO_V9
/* Handle %uhi/%ulo by moving the upper word to the lower /* Handle %uhi/%ulo by moving the upper word to the lower
one and pretending it's %hi/%lo. We also need to watch one and pretending it's %hi/%lo. We also need to watch
for %hi/%lo: the top word needs to be zeroed otherwise 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.reloc = BFD_RELOC_LO10;
the_insn.exp.X_add_number = BSR (the_insn.exp.X_add_number, 32); the_insn.exp.X_add_number = BSR (the_insn.exp.X_add_number, 32);
break; break;
default:
break;
case BFD_RELOC_HI22: case BFD_RELOC_HI22:
case BFD_RELOC_LO10: case BFD_RELOC_LO10:
the_insn.exp.X_add_number &= 0xffffffff; the_insn.exp.X_add_number &= 0xffffffff;
break; break;
default:
break;
} }
#endif
/* For pc-relative call instructions, we reject /* For pc-relative call instructions, we reject
constants to get better code. */ constants to get better code. */
if (the_insn.pcrel if (the_insn.pcrel
@ -1548,40 +1598,22 @@ sparc_ip (str)
/* Parse an asi. */ /* Parse an asi. */
if (*s == '#') if (*s == '#')
{ {
char c, *p; if (! parse_keyword_arg (sparc_encode_asi, &s, &asi))
for (p = s + 1; isalpha (*p) || *p == '_'; ++p)
continue;
c = *p;
*p = 0;
asi = sparc_encode_asi (s);
*p = c;
if (asi == -1)
{ {
error_message = ": invalid asi name"; error_message = ": invalid ASI name";
goto error; goto error;
} }
s = p;
} }
else else
{ {
char *push = input_line_pointer; if (! parse_const_expr_arg (&s, &asi))
expressionS e;
input_line_pointer = s;
expression (&e);
if (e.X_op != O_constant)
{ {
error_message = ": constant required for ASI"; error_message = ": invalid ASI expression";
goto error; goto error;
} }
asi = e.X_add_number;
s = input_line_pointer;
input_line_pointer = push;
if (asi < 0 || asi > 255) if (asi < 0 || asi > 255)
{ {
error_message = ": invalid asi number"; error_message = ": invalid ASI number";
goto error; goto error;
} }
} }
@ -1626,7 +1658,6 @@ sparc_ip (str)
} }
break; break;
#ifndef NO_V9
case 'o': case 'o':
if (strncmp (s, "%asi", 4) != 0) if (strncmp (s, "%asi", 4) != 0)
break; break;
@ -1644,7 +1675,6 @@ sparc_ip (str)
break; break;
s += 4; s += 4;
continue; continue;
#endif /* NO_V9 */
case 't': case 't':
if (strncmp (s, "%tbr", 4) != 0) if (strncmp (s, "%tbr", 4) != 0)
@ -1658,7 +1688,6 @@ sparc_ip (str)
s += 4; s += 4;
continue; continue;
#ifndef NO_V9
case 'x': case 'x':
{ {
char *push = input_line_pointer; char *push = input_line_pointer;
@ -1680,7 +1709,6 @@ sparc_ip (str)
input_line_pointer = push; input_line_pointer = push;
continue; continue;
} }
#endif
case 'y': case 'y':
if (strncmp (s, "%y", 2) != 0) if (strncmp (s, "%y", 2) != 0)
@ -1691,8 +1719,11 @@ sparc_ip (str)
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; break;
} /* for each arg that we expect */ } /* for each arg that we expect */
error: error:
if (match == 0) if (match == 0)
{ {
@ -1715,29 +1746,36 @@ sparc_ip (str)
{ {
if (insn->architecture > current_architecture if (insn->architecture > current_architecture
|| (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) if ((!architecture_requested || warn_on_bump)
&& !ARCHITECTURES_CONFLICT_P (current_architecture, && !ARCHITECTURES_CONFLICT_P (current_architecture,
insn->architecture) needed_architecture)
&& !ARCHITECTURES_CONFLICT_P (insn->architecture, && !ARCHITECTURES_CONFLICT_P (needed_architecture,
current_architecture)) current_architecture)
&& (needed_architecture < v9 || can_bump_v9_p))
{ {
if (warn_on_bump) if (warn_on_bump)
{ {
as_warn ("architecture bumped from \"%s\" to \"%s\" on \"%s\"", as_warn ("architecture bumped from \"%s\" to \"%s\" on \"%s\"",
architecture_pname[current_architecture], architecture_pname[current_architecture],
architecture_pname[insn->architecture], architecture_pname[needed_architecture],
str); str);
} /* if warning */ } /* if warning */
current_architecture = insn->architecture; if (needed_architecture > current_architecture)
current_architecture = needed_architecture;
} }
else else
{ {
as_bad ("Architecture mismatch on \"%s\".", str); as_bad ("Architecture mismatch on \"%s\".", str);
as_tsktsk (" (Requires %s; current architecture is %s.)", as_tsktsk (" (Requires %s; current architecture is %s.)",
architecture_pname[insn->architecture], architecture_pname[needed_architecture],
architecture_pname[current_architecture]); architecture_pname[current_architecture]);
return; return;
} /* if bump ok else error */ } /* if bump ok else error */
@ -1947,7 +1985,6 @@ md_apply_fix (fixP, value)
buf[3] = val; buf[3] = val;
break; break;
#ifndef NO_V9
case BFD_RELOC_64: case BFD_RELOC_64:
{ {
bfd_vma valh = BSR (val, 32); bfd_vma valh = BSR (val, 32);
@ -2013,11 +2050,8 @@ md_apply_fix (fixP, value)
case BFD_RELOC_SPARC_HH22: case BFD_RELOC_SPARC_HH22:
val = BSR (val, 32); val = BSR (val, 32);
/* intentional fallthrough */ /* intentional fallthrough */
#endif /* NO_V9 */
#ifndef NO_V9
case BFD_RELOC_SPARC_LM22: case BFD_RELOC_SPARC_LM22:
#endif
case BFD_RELOC_HI22: case BFD_RELOC_HI22:
if (!fixP->fx_addsy) if (!fixP->fx_addsy)
{ {
@ -2042,11 +2076,9 @@ md_apply_fix (fixP, value)
buf[3] = val & 0xff; buf[3] = val & 0xff;
break; break;
#ifndef NO_V9
case BFD_RELOC_SPARC_HM10: case BFD_RELOC_SPARC_HM10:
val = BSR (val, 32); val = BSR (val, 32);
/* intentional fallthrough */ /* intentional fallthrough */
#endif /* NO_V9 */
case BFD_RELOC_LO10: case BFD_RELOC_LO10:
if (!fixP->fx_addsy) if (!fixP->fx_addsy)
@ -2280,7 +2312,9 @@ print_insn (insn)
* supported by the selected architecture cause fatal errors. * supported by the selected architecture cause fatal errors.
* *
* The default is to start at v6, and bump the architecture up * 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 * If -bump is specified, a warning is printing when bumping to
* higher levels. * higher levels.
@ -2289,7 +2323,7 @@ print_insn (insn)
* that architecture. Any higher level instructions are flagged * that architecture. Any higher level instructions are flagged
* as errors. * 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 * architecture starts at the specified level, but bumps are
* warnings. * warnings.
* *
@ -2346,15 +2380,17 @@ md_parse_option (c, arg)
else else
{ {
enum sparc_architecture new_arch = arch - architecture_pname; enum sparc_architecture new_arch = arch - architecture_pname;
#ifdef NO_V9
if (new_arch == v9) initial_architecture = new_arch;
{
as_error ("v9 support not compiled in");
return 0;
}
#endif
current_architecture = new_arch;
architecture_requested = 1; 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; break;

View File

@ -66,7 +66,8 @@
#undef MANY_SEGMENTS #undef MANY_SEGMENTS
/* Needed only for sparc configuration */ /* Needed only for sparc configuration */
#undef sparcv9 #undef SPARC_V9
#undef SPARC_ARCH64
/* Define if you have the remove function. */ /* Define if you have the remove function. */
#define HAVE_REMOVE #define HAVE_REMOVE

51
gas/configure vendored
View File

@ -686,9 +686,9 @@ case ${target_cpu} in
powerpcle*) cpu_type=ppc endian=little ;; powerpcle*) cpu_type=ppc endian=little ;;
powerpc*) cpu_type=ppc endian=big ;; powerpc*) cpu_type=ppc endian=big ;;
rs6000*) cpu_type=ppc ;; rs6000*) cpu_type=ppc ;;
sparc64) cpu_type=sparc obj_format=elf sparc64) cpu_type=sparc
cat >> confdefs.h <<\EOF cat >> confdefs.h <<\EOF
#define sparcv9 1 #define SPARC_V9 1
EOF EOF
;; ;;
sparclite*) cpu_type=sparc ;; sparclite*) cpu_type=sparc ;;
@ -753,7 +753,7 @@ for this_target in $target $canon_targets ; do
powerpcle*) cpu_type=ppc endian=little ;; powerpcle*) cpu_type=ppc endian=little ;;
powerpc*) cpu_type=ppc endian=big ;; powerpc*) cpu_type=ppc endian=big ;;
rs6000*) cpu_type=ppc ;; 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 ;; sparclite*) cpu_type=sparc ;;
*) cpu_type=${cpu} ;; *) cpu_type=${cpu} ;;
esac esac
@ -946,7 +946,7 @@ for this_target in $target $canon_targets ; do
*-*-xray | *-*-hms) fmt=coff ;; *-*-xray | *-*-hms) fmt=coff ;;
*-*-sim) fmt=coff ;; *-*-sim) fmt=coff ;;
*-*-elf | *-*-sysv4* | *-*-solaris*) *-*-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 ;; fmt=elf dev=yes ;;
*-*-vxworks) fmt=aout ;; *-*-vxworks) fmt=aout ;;
*-*-netware) fmt=elf ;; *-*-netware) fmt=elf ;;
@ -968,11 +968,18 @@ for this_target in $target $canon_targets ; do
# Other random stuff. # Other random stuff.
test -n "$want_sparcv9" && cat >> confdefs.h <<\EOF test -n "$want_sparc_v9" && cat >> confdefs.h <<\EOF
#define sparcv9 1 #define SPARC_V9 1
EOF EOF
case ${cpu}-${vendor}-${os} in
sparc64-*-elf*) cat >> confdefs.h <<\EOF
#define SPARC_ARCH64 1
EOF
;;
esac
case ${cpu_type} in case ${cpu_type} in
m68k) extra_objects="$extra_objects m68k-parse.o" ;; m68k) extra_objects="$extra_objects m68k-parse.o" ;;
esac esac
@ -1432,7 +1439,7 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser, # On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. # not just through cpp.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1436 "configure" #line 1443 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
@ -1446,7 +1453,7 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp" CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1450 "configure" #line 1457 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error 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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1483 "configure" #line 1490 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <$ac_hdr> #include <$ac_hdr>
EOF EOF
@ -1531,7 +1538,7 @@ else
ac_cv_c_cross=yes ac_cv_c_cross=yes
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1535 "configure" #line 1542 "configure"
#include "confdefs.h" #include "confdefs.h"
main(){return(0);} main(){return(0);}
EOF 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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1559 "configure" #line 1566 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <alloca.h> #include <alloca.h>
int main() { return 0; } 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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1591 "configure" #line 1598 "configure"
#include "confdefs.h" #include "confdefs.h"
#ifdef __GNUC__ #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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1650 "configure" #line 1657 "configure"
#include "confdefs.h" #include "confdefs.h"
#if defined(CRAY) && ! defined(CRAY2) #if defined(CRAY) && ! defined(CRAY2)
webecray 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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1679 "configure" #line 1686 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */ which can conflict with char $ac_func(); below. */
@ -1729,7 +1736,7 @@ else
ac_cv_c_stack_direction=0 ac_cv_c_stack_direction=0
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1733 "configure" #line 1740 "configure"
#include "confdefs.h" #include "confdefs.h"
find_stack_direction () find_stack_direction ()
{ {
@ -1772,7 +1779,7 @@ else
ac_cv_c_inline=no ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do for ac_kw in inline __inline__ __inline; do
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1776 "configure" #line 1783 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } 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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1816 "configure" #line 1823 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */ 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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1869 "configure" #line 1876 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */ 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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1922 "configure" #line 1929 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
#include <stdio.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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1979 "configure" #line 1986 "configure"
#include "confdefs.h" #include "confdefs.h"
$gas_test_headers $gas_test_headers
int main() { return 0; } 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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2015 "configure" #line 2022 "configure"
#include "confdefs.h" #include "confdefs.h"
$gas_test_headers $gas_test_headers
int main() { return 0; } 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 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2054 "configure" #line 2061 "configure"
#include "confdefs.h" #include "confdefs.h"
#ifdef HAVE_ERRNO_H #ifdef HAVE_ERRNO_H

View File

@ -53,8 +53,8 @@ changequote([,])dnl
powerpcle*) cpu_type=ppc endian=little ;; powerpcle*) cpu_type=ppc endian=little ;;
powerpc*) cpu_type=ppc endian=big ;; powerpc*) cpu_type=ppc endian=big ;;
rs6000*) cpu_type=ppc ;; rs6000*) cpu_type=ppc ;;
sparc64) cpu_type=sparc obj_format=elf sparc64) cpu_type=sparc
AC_DEFINE(sparcv9) ;; AC_DEFINE(SPARC_V9) ;;
sparclite*) cpu_type=sparc ;; sparclite*) cpu_type=sparc ;;
*) cpu_type=${target_cpu} ;; *) cpu_type=${target_cpu} ;;
esac esac
@ -107,7 +107,7 @@ changequote([,])dnl
powerpcle*) cpu_type=ppc endian=little ;; powerpcle*) cpu_type=ppc endian=little ;;
powerpc*) cpu_type=ppc endian=big ;; powerpc*) cpu_type=ppc endian=big ;;
rs6000*) cpu_type=ppc ;; 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 ;; sparclite*) cpu_type=sparc ;;
*) cpu_type=${cpu} ;; *) cpu_type=${cpu} ;;
esac esac
@ -300,7 +300,7 @@ changequote([,])dnl
*-*-xray | *-*-hms) fmt=coff ;; *-*-xray | *-*-hms) fmt=coff ;;
*-*-sim) fmt=coff ;; *-*-sim) fmt=coff ;;
*-*-elf | *-*-sysv4* | *-*-solaris*) *-*-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 ;; fmt=elf dev=yes ;;
*-*-vxworks) fmt=aout ;; *-*-vxworks) fmt=aout ;;
*-*-netware) fmt=elf ;; *-*-netware) fmt=elf ;;
@ -322,7 +322,11 @@ changequote([,])dnl
# Other random stuff. # 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 case ${cpu_type} in
m68k) extra_objects="$extra_objects m68k-parse.o" ;; m68k) extra_objects="$extra_objects m68k-parse.o" ;;