aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-m68k.c
diff options
context:
space:
mode:
Diffstat (limited to 'gas/config/tc-m68k.c')
-rw-r--r--gas/config/tc-m68k.c86
1 files changed, 59 insertions, 27 deletions
diff --git a/gas/config/tc-m68k.c b/gas/config/tc-m68k.c
index 0cfc1a0..8ad6fa7 100644
--- a/gas/config/tc-m68k.c
+++ b/gas/config/tc-m68k.c
@@ -381,7 +381,7 @@ struct m68k_incant {
unsigned long m_opcode;
short m_opnum;
short m_codenum;
- enum m68k_architecture m_arch;
+ int m_arch;
struct m68k_incant *m_next;
};
@@ -426,7 +426,7 @@ static void s_proc();
#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
on the 68000. The 68000 doesn't support long branches with branchs */
@@ -1470,6 +1470,14 @@ void m68k_ip (instring)
losing++;
break;
+ case '`':
+ switch (opP->mode) {
+ case MSCR: case IMMED: case DREG: case AREG:
+ case AINC: case REGLST: case AINDR:
+ losing++;
+ }
+ break;
+
case '#':
if(opP->mode!=IMMED)
losing++;
@@ -1831,7 +1839,7 @@ void m68k_ip (instring)
{
int got_one = 0, idx;
const static struct {
- enum m68k_architecture arch;
+ int arch;
const char *name;
} archs[] = {
m68000, "68000",
@@ -1839,6 +1847,7 @@ void m68k_ip (instring)
m68020, "68020",
m68030, "68030",
m68040, "68040",
+ cpu32, "cpu32",
m68881, "68881",
m68851, "68851",
};
@@ -1894,6 +1903,7 @@ void m68k_ip (instring)
case '$':
case '?':
case '/':
+ case '`':
#ifndef NO_68851
case '|':
#endif
@@ -3082,6 +3092,7 @@ init_regtable()
insert_reg(init_table[i].name, init_table[i].number);
}
+static int no_68851, no_68881;
void
md_assemble(str)
@@ -3101,7 +3112,7 @@ md_assemble(str)
if (cpu_of_arch (current_architecture) == 0)
{
- enum m68k_architecture cpu_type;
+ int cpu_type;
#ifndef TARGET_CPU
cpu_type = m68020;
@@ -3117,33 +3128,42 @@ md_assemble(str)
cpu_type = m68030;
else if (strcmp (TARGET_CPU, "m68040") == 0)
cpu_type = m68040;
+ else if (strcmp (TARGET_CPU, "cpu32") == 0)
+ cpu_type = cpu32;
else
cpu_type = m68020;
#endif
- /* If float or mmu were specified, just default cpu. */
- 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;
- }
+ current_architecture |= cpu_type;
}
- if (cpu_of_arch (current_architecture) == m68000
- && (current_architecture & m68881) != 0)
+ if (current_architecture & m68881)
+ {
+ 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)))
{
- as_bad ("incompatible processors 68000 and 68881 specified");
+ 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;
}
@@ -4229,6 +4249,10 @@ static void s_proc() {
* errors. More than one may be specified. The default is
* -m68020 -m68851 -m68881. Note that -m68008 is a synonym
* 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
* (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.
*/
#ifndef MAYBE_FLOAT_TOO
-#define MAYBE_FLOAT_TOO m68881
+#define MAYBE_FLOAT_TOO /* m68881 */ 0 /* this is handled later */
#endif
int md_parse_option(argP,cntP,vecP)
@@ -4288,13 +4312,21 @@ char ***vecP;
} else if (!strcmp(*argP, "68882")) {
current_architecture |= m68882;
-
#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
} else if (!strcmp(*argP,"68851")) {
current_architecture |= m68851;
-
#endif /* NO_68851 */
+ } else if (!strcmp (*argP, "no-68851")) {
+ no_68851 = 1;
+ } else if (!strcmp (*argP, "pu32")) { /* "-mcpu32" */
+ current_architecture |= cpu32;
} else {
as_warn("Unknown architecture, \"%s\". option ignored", *argP);
} /* switch on architecture */