mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 10:34:21 +08:00
cpu32 and -mno-688?1 support from p3
This commit is contained in:
@ -381,7 +381,7 @@ struct m68k_incant {
|
|||||||
unsigned long m_opcode;
|
unsigned long m_opcode;
|
||||||
short m_opnum;
|
short m_opnum;
|
||||||
short m_codenum;
|
short m_codenum;
|
||||||
enum m68k_architecture m_arch;
|
int m_arch;
|
||||||
struct m68k_incant *m_next;
|
struct m68k_incant *m_next;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -426,7 +426,7 @@ static void s_proc();
|
|||||||
|
|
||||||
#endif /* not __STDC__ */
|
#endif /* not __STDC__ */
|
||||||
|
|
||||||
static enum m68k_architecture current_architecture = 0;
|
static int current_architecture = 0;
|
||||||
|
|
||||||
/* BCC68000 is for patching in an extra jmp instruction for long offsets
|
/* BCC68000 is for patching in an extra jmp instruction for long offsets
|
||||||
on the 68000. The 68000 doesn't support long branches with branchs */
|
on the 68000. The 68000 doesn't support long branches with branchs */
|
||||||
@ -1470,6 +1470,14 @@ void m68k_ip (instring)
|
|||||||
losing++;
|
losing++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case '`':
|
||||||
|
switch (opP->mode) {
|
||||||
|
case MSCR: case IMMED: case DREG: case AREG:
|
||||||
|
case AINC: case REGLST: case AINDR:
|
||||||
|
losing++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case '#':
|
case '#':
|
||||||
if(opP->mode!=IMMED)
|
if(opP->mode!=IMMED)
|
||||||
losing++;
|
losing++;
|
||||||
@ -1831,7 +1839,7 @@ void m68k_ip (instring)
|
|||||||
{
|
{
|
||||||
int got_one = 0, idx;
|
int got_one = 0, idx;
|
||||||
const static struct {
|
const static struct {
|
||||||
enum m68k_architecture arch;
|
int arch;
|
||||||
const char *name;
|
const char *name;
|
||||||
} archs[] = {
|
} archs[] = {
|
||||||
m68000, "68000",
|
m68000, "68000",
|
||||||
@ -1839,6 +1847,7 @@ void m68k_ip (instring)
|
|||||||
m68020, "68020",
|
m68020, "68020",
|
||||||
m68030, "68030",
|
m68030, "68030",
|
||||||
m68040, "68040",
|
m68040, "68040",
|
||||||
|
cpu32, "cpu32",
|
||||||
m68881, "68881",
|
m68881, "68881",
|
||||||
m68851, "68851",
|
m68851, "68851",
|
||||||
};
|
};
|
||||||
@ -1894,6 +1903,7 @@ void m68k_ip (instring)
|
|||||||
case '$':
|
case '$':
|
||||||
case '?':
|
case '?':
|
||||||
case '/':
|
case '/':
|
||||||
|
case '`':
|
||||||
#ifndef NO_68851
|
#ifndef NO_68851
|
||||||
case '|':
|
case '|':
|
||||||
#endif
|
#endif
|
||||||
@ -3082,6 +3092,7 @@ init_regtable()
|
|||||||
insert_reg(init_table[i].name, init_table[i].number);
|
insert_reg(init_table[i].name, init_table[i].number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int no_68851, no_68881;
|
||||||
|
|
||||||
void
|
void
|
||||||
md_assemble(str)
|
md_assemble(str)
|
||||||
@ -3101,7 +3112,7 @@ md_assemble(str)
|
|||||||
|
|
||||||
if (cpu_of_arch (current_architecture) == 0)
|
if (cpu_of_arch (current_architecture) == 0)
|
||||||
{
|
{
|
||||||
enum m68k_architecture cpu_type;
|
int cpu_type;
|
||||||
|
|
||||||
#ifndef TARGET_CPU
|
#ifndef TARGET_CPU
|
||||||
cpu_type = m68020;
|
cpu_type = m68020;
|
||||||
@ -3117,33 +3128,42 @@ md_assemble(str)
|
|||||||
cpu_type = m68030;
|
cpu_type = m68030;
|
||||||
else if (strcmp (TARGET_CPU, "m68040") == 0)
|
else if (strcmp (TARGET_CPU, "m68040") == 0)
|
||||||
cpu_type = m68040;
|
cpu_type = m68040;
|
||||||
|
else if (strcmp (TARGET_CPU, "cpu32") == 0)
|
||||||
|
cpu_type = cpu32;
|
||||||
else
|
else
|
||||||
cpu_type = m68020;
|
cpu_type = m68020;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If float or mmu were specified, just default cpu. */
|
current_architecture |= cpu_type;
|
||||||
if (current_architecture != 0)
|
|
||||||
current_architecture |= cpu_type;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((cpu_type & m68020up) != 0)
|
|
||||||
current_architecture = (cpu_type
|
|
||||||
#ifndef NO_68881
|
|
||||||
| m68881
|
|
||||||
#endif
|
|
||||||
#ifndef NO_68851
|
|
||||||
| m68851
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
else
|
|
||||||
current_architecture = cpu_type;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (cpu_of_arch (current_architecture) == m68000
|
if (current_architecture & m68881)
|
||||||
&& (current_architecture & m68881) != 0)
|
|
||||||
{
|
{
|
||||||
as_bad ("incompatible processors 68000 and 68881 specified");
|
if (current_architecture & m68000)
|
||||||
|
as_bad ("incompatible processors 68000 and 68881/2 specified");
|
||||||
|
if (current_architecture & m68010)
|
||||||
|
as_bad ("incompatible processors 68010 and 68881/2 specified");
|
||||||
|
if (current_architecture & m68040)
|
||||||
|
as_bad ("incompatible processors 68040 and 68881/2 specified");
|
||||||
}
|
}
|
||||||
|
/* What other incompatibilities ought we to check for? */
|
||||||
|
|
||||||
|
/* Toss in some default assumptions about coprocessors. */
|
||||||
|
if (!no_68881
|
||||||
|
&& (cpu_of_arch (current_architecture)
|
||||||
|
/* Can CPU32 have a 68881 coprocessor?? */
|
||||||
|
& (m68020 | m68030 | cpu32)))
|
||||||
|
{
|
||||||
|
current_architecture |= m68881;
|
||||||
|
}
|
||||||
|
if (!no_68851
|
||||||
|
&& (cpu_of_arch (current_architecture) & m68020up) != 0)
|
||||||
|
{
|
||||||
|
current_architecture |= m68851;
|
||||||
|
}
|
||||||
|
if (no_68881 && (current_architecture & m68881))
|
||||||
|
as_bad ("options for 68881 and no-68881 both given");
|
||||||
|
if (no_68851 && (current_architecture & m68851))
|
||||||
|
as_bad ("options for 68851 and no-68851 both given");
|
||||||
done_first_time = 1;
|
done_first_time = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4229,6 +4249,10 @@ static void s_proc() {
|
|||||||
* errors. More than one may be specified. The default is
|
* errors. More than one may be specified. The default is
|
||||||
* -m68020 -m68851 -m68881. Note that -m68008 is a synonym
|
* -m68020 -m68851 -m68881. Note that -m68008 is a synonym
|
||||||
* for -m68000, and -m68882 is a synonym for -m68881.
|
* for -m68000, and -m68882 is a synonym for -m68881.
|
||||||
|
* -[A]m[c]no-68851, -[A]m[c]no-68881
|
||||||
|
* Don't accept 688?1 instructions. (The "c" is kind of silly,
|
||||||
|
* so don't use or document it, but that's the way the parsing
|
||||||
|
* works).
|
||||||
*
|
*
|
||||||
* MAYBE_FLOAT_TOO is defined below so that specifying a processor type
|
* MAYBE_FLOAT_TOO is defined below so that specifying a processor type
|
||||||
* (e.g. m68020) also requests that float instructions be included. This
|
* (e.g. m68020) also requests that float instructions be included. This
|
||||||
@ -4238,7 +4262,7 @@ static void s_proc() {
|
|||||||
* of that funny floaty stuff going on. FIXME-later.
|
* of that funny floaty stuff going on. FIXME-later.
|
||||||
*/
|
*/
|
||||||
#ifndef MAYBE_FLOAT_TOO
|
#ifndef MAYBE_FLOAT_TOO
|
||||||
#define MAYBE_FLOAT_TOO m68881
|
#define MAYBE_FLOAT_TOO /* m68881 */ 0 /* this is handled later */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int md_parse_option(argP,cntP,vecP)
|
int md_parse_option(argP,cntP,vecP)
|
||||||
@ -4288,13 +4312,21 @@ char ***vecP;
|
|||||||
|
|
||||||
} else if (!strcmp(*argP, "68882")) {
|
} else if (!strcmp(*argP, "68882")) {
|
||||||
current_architecture |= m68882;
|
current_architecture |= m68882;
|
||||||
|
|
||||||
#endif /* NO_68881 */
|
#endif /* NO_68881 */
|
||||||
|
/* Even if we aren't configured to support the processor,
|
||||||
|
it should still be possible to assert that the user
|
||||||
|
doesn't have it... */
|
||||||
|
} else if (!strcmp (*argP, "no-68881")
|
||||||
|
|| !strcmp (*argP, "no-68882")) {
|
||||||
|
no_68881 = 1;
|
||||||
#ifndef NO_68851
|
#ifndef NO_68851
|
||||||
} else if (!strcmp(*argP,"68851")) {
|
} else if (!strcmp(*argP,"68851")) {
|
||||||
current_architecture |= m68851;
|
current_architecture |= m68851;
|
||||||
|
|
||||||
#endif /* NO_68851 */
|
#endif /* NO_68851 */
|
||||||
|
} else if (!strcmp (*argP, "no-68851")) {
|
||||||
|
no_68851 = 1;
|
||||||
|
} else if (!strcmp (*argP, "pu32")) { /* "-mcpu32" */
|
||||||
|
current_architecture |= cpu32;
|
||||||
} else {
|
} else {
|
||||||
as_warn("Unknown architecture, \"%s\". option ignored", *argP);
|
as_warn("Unknown architecture, \"%s\". option ignored", *argP);
|
||||||
} /* switch on architecture */
|
} /* switch on architecture */
|
||||||
|
Reference in New Issue
Block a user