mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-24 20:28:28 +08:00
68060 support
This commit is contained in:
@ -74,6 +74,12 @@ const int md_reloc_size = 8; /* Size of relocation record */
|
|||||||
references. */
|
references. */
|
||||||
int flag_want_pic;
|
int flag_want_pic;
|
||||||
|
|
||||||
|
#ifdef REGISTER_PREFIX_OPTIONAL
|
||||||
|
int flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
|
||||||
|
#else
|
||||||
|
int flag_reg_prefix_optional;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Its an arbitrary name: This means I don't approve of it */
|
/* Its an arbitrary name: This means I don't approve of it */
|
||||||
/* See flames below */
|
/* See flames below */
|
||||||
static struct obstack robyn;
|
static struct obstack robyn;
|
||||||
@ -187,13 +193,25 @@ struct m68k_exp
|
|||||||
short e_siz; /* 0== default 1==short/byte 2==word 3==long */
|
short e_siz; /* 0== default 1==short/byte 2==word 3==long */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* DATA and ADDR have to be contiguous, so that reg-DATA gives 0-7==data reg,
|
/* DATA and ADDR have to be contiguous, so that reg-DATA gives
|
||||||
8-15==addr reg for operands that take both types */
|
0-7==data reg, 8-15==addr reg for operands that take both types.
|
||||||
|
|
||||||
|
We don't use forms like "ADDR0 = ADDR" here because this file is
|
||||||
|
likely to be used on an Apollo, and the broken Apollo compiler
|
||||||
|
gives an `undefined variable' error if we do that, according to
|
||||||
|
troy@cbme.unsw.edu.au. */
|
||||||
|
|
||||||
|
#define DATA DATA0
|
||||||
|
#define ADDR ADDR0
|
||||||
|
#define SP ADDR7
|
||||||
|
#define FPREG FP0
|
||||||
|
#define COPNUM COP0
|
||||||
|
#define BAD BAD0
|
||||||
|
#define BAC BAC0
|
||||||
|
|
||||||
enum _register
|
enum _register
|
||||||
{
|
{
|
||||||
DATA = 1, /* 1- 8 == data registers 0-7 */
|
DATA0 = 1, /* 1- 8 == data registers 0-7 */
|
||||||
DATA0 = DATA,
|
|
||||||
DATA1,
|
DATA1,
|
||||||
DATA2,
|
DATA2,
|
||||||
DATA3,
|
DATA3,
|
||||||
@ -202,8 +220,7 @@ enum _register
|
|||||||
DATA6,
|
DATA6,
|
||||||
DATA7,
|
DATA7,
|
||||||
|
|
||||||
ADDR,
|
ADDR0,
|
||||||
ADDR0 = ADDR,
|
|
||||||
ADDR1,
|
ADDR1,
|
||||||
ADDR2,
|
ADDR2,
|
||||||
ADDR3,
|
ADDR3,
|
||||||
@ -212,13 +229,10 @@ enum _register
|
|||||||
ADDR6,
|
ADDR6,
|
||||||
ADDR7,
|
ADDR7,
|
||||||
|
|
||||||
/* Note that COPNUM==processor #1 -- COPNUM+7==#8, which stores as 000 */
|
/* Note that COP0==processor #1 -- COP0+7==#8, which stores as 000 */
|
||||||
/* I think. . . */
|
/* I think. . . */
|
||||||
|
|
||||||
SP = ADDR7,
|
FP0, /* Eight FP registers */
|
||||||
|
|
||||||
FPREG, /* Eight FP registers */
|
|
||||||
FP0 = FPREG,
|
|
||||||
FP1,
|
FP1,
|
||||||
FP2,
|
FP2,
|
||||||
FP3,
|
FP3,
|
||||||
@ -226,8 +240,8 @@ enum _register
|
|||||||
FP5,
|
FP5,
|
||||||
FP6,
|
FP6,
|
||||||
FP7,
|
FP7,
|
||||||
COPNUM = (FPREG + 8), /* Co-processor #1-#8 */
|
|
||||||
COP0 = COPNUM,
|
COP0, /* Co-processor #1-#8 */
|
||||||
COP1,
|
COP1,
|
||||||
COP2,
|
COP2,
|
||||||
COP3,
|
COP3,
|
||||||
@ -235,12 +249,13 @@ enum _register
|
|||||||
COP5,
|
COP5,
|
||||||
COP6,
|
COP6,
|
||||||
COP7,
|
COP7,
|
||||||
|
|
||||||
PC, /* Program counter */
|
PC, /* Program counter */
|
||||||
ZPC, /* Hack for Program space, but 0 addressing */
|
ZPC, /* Hack for Program space, but 0 addressing */
|
||||||
SR, /* Status Reg */
|
SR, /* Status Reg */
|
||||||
CCR, /* Condition code Reg */
|
CCR, /* Condition code Reg */
|
||||||
|
|
||||||
/* These have to be in order for the movec instruction to work. */
|
/* These have to be grouped together for the movec instruction to work. */
|
||||||
USP, /* User Stack Pointer */
|
USP, /* User Stack Pointer */
|
||||||
ISP, /* Interrupt stack pointer */
|
ISP, /* Interrupt stack pointer */
|
||||||
SFC,
|
SFC,
|
||||||
@ -257,6 +272,9 @@ enum _register
|
|||||||
TC,
|
TC,
|
||||||
SRP,
|
SRP,
|
||||||
URP,
|
URP,
|
||||||
|
BUSCR, /* 68060 added these */
|
||||||
|
PCR,
|
||||||
|
#define last_movec_reg PCR
|
||||||
/* end of movec ordering constraints */
|
/* end of movec ordering constraints */
|
||||||
|
|
||||||
FPI,
|
FPI,
|
||||||
@ -269,8 +287,7 @@ enum _register
|
|||||||
VAL,
|
VAL,
|
||||||
SCC,
|
SCC,
|
||||||
AC,
|
AC,
|
||||||
BAD,
|
BAD0,
|
||||||
BAD0 = BAD,
|
|
||||||
BAD1,
|
BAD1,
|
||||||
BAD2,
|
BAD2,
|
||||||
BAD3,
|
BAD3,
|
||||||
@ -278,8 +295,7 @@ enum _register
|
|||||||
BAD5,
|
BAD5,
|
||||||
BAD6,
|
BAD6,
|
||||||
BAD7,
|
BAD7,
|
||||||
BAC,
|
BAC0,
|
||||||
BAC0 = BAC,
|
|
||||||
BAC1,
|
BAC1,
|
||||||
BAC2,
|
BAC2,
|
||||||
BAC3,
|
BAC3,
|
||||||
@ -300,6 +316,28 @@ enum _register
|
|||||||
TT1,
|
TT1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const enum _register m68000_control_regs[] = { 0 };
|
||||||
|
static const enum _register m68010_control_regs[] = {
|
||||||
|
SFC, DFC, USP, VBR,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
static const enum _register m68020_control_regs[] = {
|
||||||
|
SFC, DFC, USP, VBR, CACR, CAAR, MSP, ISP,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
static const enum _register m68040_control_regs[] = {
|
||||||
|
SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1,
|
||||||
|
USP, VBR, MSP, ISP, MMUSR, URP, SRP,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
static const enum _register m68060_control_regs[] = {
|
||||||
|
SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1, BUSCR,
|
||||||
|
USP, VBR, URP, SRP, PCR,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
static const enum _register *control_regs;
|
||||||
|
|
||||||
/* Internal form of an operand. */
|
/* Internal form of an operand. */
|
||||||
struct m68k_op
|
struct m68k_op
|
||||||
{
|
{
|
||||||
@ -597,15 +635,19 @@ m68k_reg_parse (ccp)
|
|||||||
char *p;
|
char *p;
|
||||||
symbolS *symbolP;
|
symbolS *symbolP;
|
||||||
|
|
||||||
#ifdef REGISTER_PREFIX
|
if (flag_reg_prefix_optional)
|
||||||
|
{
|
||||||
|
if (*start == REGISTER_PREFIX)
|
||||||
|
start++;
|
||||||
|
p = start;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (*start != REGISTER_PREFIX)
|
if (*start != REGISTER_PREFIX)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
p = start + 1;
|
p = start + 1;
|
||||||
#else
|
}
|
||||||
p = start;
|
|
||||||
if (*p == OPTIONAL_REGISTER_PREFIX)
|
|
||||||
p++, start++;
|
|
||||||
#endif
|
|
||||||
if (!isalpha (*p) || !is_name_beginner (*p))
|
if (!isalpha (*p) || !is_name_beginner (*p))
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
@ -846,7 +888,7 @@ m68k_ip_op (str, opP)
|
|||||||
;
|
;
|
||||||
--strend;
|
--strend;
|
||||||
|
|
||||||
if (*str == '#')
|
if (*str == '#' || *str == '&')
|
||||||
{
|
{
|
||||||
str++;
|
str++;
|
||||||
opP->con1 = add_exp (str, strend);
|
opP->con1 = add_exp (str, strend);
|
||||||
@ -1002,9 +1044,8 @@ m68k_ip_op (str, opP)
|
|||||||
{
|
{
|
||||||
/* "(EXPR,..." , a displacement */
|
/* "(EXPR,..." , a displacement */
|
||||||
char *stmp;
|
char *stmp;
|
||||||
char *index ();
|
|
||||||
|
|
||||||
if ((stmp = index (str, ',')) != NULL)
|
if ((stmp = strchr (str, ',')) != NULL)
|
||||||
{
|
{
|
||||||
opP->con1 = add_exp (str, stmp - 1);
|
opP->con1 = add_exp (str, stmp - 1);
|
||||||
str = stmp;
|
str = stmp;
|
||||||
@ -1097,8 +1138,7 @@ m68k_ip_op (str, opP)
|
|||||||
{
|
{
|
||||||
/* "EXP2" or "EXP2(REG..." */
|
/* "EXP2" or "EXP2(REG..." */
|
||||||
char *stmp;
|
char *stmp;
|
||||||
char *index ();
|
if ((stmp = strchr (str, '(')) != NULL)
|
||||||
if ((stmp = index (str, '(')) != NULL)
|
|
||||||
{
|
{
|
||||||
char *ostr = str;
|
char *ostr = str;
|
||||||
|
|
||||||
@ -1397,10 +1437,47 @@ m68k_ip_op (str, opP)
|
|||||||
|
|
||||||
#if defined (M68KCOFF) && !defined (BFD_ASSEMBLER)
|
#if defined (M68KCOFF) && !defined (BFD_ASSEMBLER)
|
||||||
|
|
||||||
|
#ifdef NO_PCREL_RELOCS
|
||||||
|
|
||||||
|
int
|
||||||
|
make_pcrel_absolute(fixP, add_number)
|
||||||
|
fixS *fixP;
|
||||||
|
long *add_number;
|
||||||
|
{
|
||||||
|
register unsigned char *opcode = fixP->fx_frag->fr_opcode;
|
||||||
|
|
||||||
|
/* rewrite the PC relative instructions to absolute address ones.
|
||||||
|
* these are rumoured to be faster, and the apollo linker refuses
|
||||||
|
* to deal with the PC relative relocations.
|
||||||
|
*/
|
||||||
|
if (opcode[0] == 0x60 && opcode[1] == 0xff) /* BRA -> JMP */
|
||||||
|
{
|
||||||
|
opcode[0] = 0x4e;
|
||||||
|
opcode[1] = 0xf9;
|
||||||
|
}
|
||||||
|
else if (opcode[0] == 0x61 && opcode[1] == 0xff) /* BSR -> JSR */
|
||||||
|
{
|
||||||
|
opcode[0] = 0x4e;
|
||||||
|
opcode[1] = 0xb9;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
as_fatal ("Unknown PC relative instruction");
|
||||||
|
*add_number -= 4;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* NO_PCREL_RELOCS */
|
||||||
|
|
||||||
short
|
short
|
||||||
tc_coff_fix2rtype (fixP)
|
tc_coff_fix2rtype (fixP)
|
||||||
fixS *fixP;
|
fixS *fixP;
|
||||||
{
|
{
|
||||||
|
#ifdef NO_PCREL_RELOCS
|
||||||
|
know (fixP->fx_pcrel == 0);
|
||||||
|
return (fixP->fx_size == 1 ? R_RELBYTE
|
||||||
|
: fixP->fx_size == 2 ? R_DIR16
|
||||||
|
: R_DIR32);
|
||||||
|
#else
|
||||||
return (fixP->fx_pcrel ?
|
return (fixP->fx_pcrel ?
|
||||||
(fixP->fx_size == 1 ? R_PCRBYTE :
|
(fixP->fx_size == 1 ? R_PCRBYTE :
|
||||||
fixP->fx_size == 2 ? R_PCRWORD :
|
fixP->fx_size == 2 ? R_PCRWORD :
|
||||||
@ -1408,8 +1485,7 @@ tc_coff_fix2rtype (fixP)
|
|||||||
(fixP->fx_size == 1 ? R_RELBYTE :
|
(fixP->fx_size == 1 ? R_RELBYTE :
|
||||||
fixP->fx_size == 2 ? R_RELWORD :
|
fixP->fx_size == 2 ? R_RELWORD :
|
||||||
R_RELLONG));
|
R_RELLONG));
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@ -1823,27 +1899,17 @@ m68k_ip (instring)
|
|||||||
case 'J':
|
case 'J':
|
||||||
if (opP->mode != MSCR
|
if (opP->mode != MSCR
|
||||||
|| opP->reg < USP
|
|| opP->reg < USP
|
||||||
|| opP->reg > URP
|
|| opP->reg > last_movec_reg)
|
||||||
|| cpu_of_arch (current_architecture) < m68010 /* before 68010 had none */
|
|
||||||
|| (cpu_of_arch (current_architecture) < m68020
|
|
||||||
&& opP->reg != SFC
|
|
||||||
&& opP->reg != DFC
|
|
||||||
&& opP->reg != USP
|
|
||||||
&& opP->reg != VBR) /* 68010's had only these */
|
|
||||||
|| (cpu_of_arch (current_architecture) < m68040
|
|
||||||
&& opP->reg != SFC
|
|
||||||
&& opP->reg != DFC
|
|
||||||
&& opP->reg != USP
|
|
||||||
&& opP->reg != VBR
|
|
||||||
&& opP->reg != CACR
|
|
||||||
&& opP->reg != CAAR
|
|
||||||
&& opP->reg != MSP
|
|
||||||
&& opP->reg != ISP) /* 680[23]0's have only these */
|
|
||||||
|| (cpu_of_arch (current_architecture) == m68040 /* 68040 has all but this */
|
|
||||||
&& opP->reg == CAAR))
|
|
||||||
{
|
|
||||||
losing++;
|
losing++;
|
||||||
} /* doesn't cut it */
|
else
|
||||||
|
{
|
||||||
|
enum _register *rp;
|
||||||
|
for (rp = control_regs; *rp; rp++)
|
||||||
|
if (*rp == opP->reg)
|
||||||
|
break;
|
||||||
|
if (*rp == 0)
|
||||||
|
losing++;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'k':
|
case 'k':
|
||||||
@ -2042,7 +2108,7 @@ m68k_ip (instring)
|
|||||||
switch (ok_arch)
|
switch (ok_arch)
|
||||||
{
|
{
|
||||||
case mfloat:
|
case mfloat:
|
||||||
strcpy (cp, "fpu (68040 or 68881/68882)");
|
strcpy (cp, "fpu (68040, 68060 or 68881/68882)");
|
||||||
break;
|
break;
|
||||||
case mmmu:
|
case mmmu:
|
||||||
strcpy (cp, "mmu (68030 or 68851)");
|
strcpy (cp, "mmu (68030 or 68851)");
|
||||||
@ -2071,6 +2137,7 @@ m68k_ip (instring)
|
|||||||
{ m68020, "68020" },
|
{ m68020, "68020" },
|
||||||
{ m68030, "68030" },
|
{ m68030, "68030" },
|
||||||
{ m68040, "68040" },
|
{ m68040, "68040" },
|
||||||
|
{ m68060, "68060" },
|
||||||
{ cpu32, "cpu32" },
|
{ cpu32, "cpu32" },
|
||||||
{ m68881, "68881" },
|
{ m68881, "68881" },
|
||||||
{ m68851, "68851" }
|
{ m68851, "68851" }
|
||||||
@ -2267,6 +2334,7 @@ m68k_ip (instring)
|
|||||||
if (opP->reg == PC)
|
if (opP->reg == PC)
|
||||||
{
|
{
|
||||||
addword (0x0170);
|
addword (0x0170);
|
||||||
|
opP->con1->e_exp.X_add_number += 6;
|
||||||
add_fix ('l', opP->con1, 1);
|
add_fix ('l', opP->con1, 1);
|
||||||
addword (0), addword (0);
|
addword (0), addword (0);
|
||||||
break;
|
break;
|
||||||
@ -2292,6 +2360,7 @@ m68k_ip (instring)
|
|||||||
{
|
{
|
||||||
if (opP->reg == PC)
|
if (opP->reg == PC)
|
||||||
{
|
{
|
||||||
|
opP->con1->e_exp.X_add_number += 2;
|
||||||
add_fix ('w', opP->con1, 1);
|
add_fix ('w', opP->con1, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -3376,24 +3445,25 @@ insert_reg (regname, regnum)
|
|||||||
{
|
{
|
||||||
char buf[100];
|
char buf[100];
|
||||||
int i;
|
int i;
|
||||||
symbolS *s;
|
|
||||||
|
|
||||||
#ifdef REGISTER_PREFIX
|
#ifdef REGISTER_PREFIX
|
||||||
|
if (!flag_reg_prefix_optional)
|
||||||
|
{
|
||||||
buf[0] = REGISTER_PREFIX;
|
buf[0] = REGISTER_PREFIX;
|
||||||
strcpy (buf + 1, regname);
|
strcpy (buf + 1, regname);
|
||||||
regname = buf;
|
regname = buf;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
symbol_table_insert (s = symbol_new (regname, reg_section, regnum, &zero_address_frag));
|
symbol_table_insert (symbol_new (regname, reg_section, regnum,
|
||||||
|
&zero_address_frag));
|
||||||
verify_symbol_chain_2 (s);
|
|
||||||
|
|
||||||
for (i = 0; regname[i]; i++)
|
for (i = 0; regname[i]; i++)
|
||||||
buf[i] = islower (regname[i]) ? toupper (regname[i]) : regname[i];
|
buf[i] = islower (regname[i]) ? toupper (regname[i]) : regname[i];
|
||||||
buf[i] = '\0';
|
buf[i] = '\0';
|
||||||
|
|
||||||
symbol_table_insert (s = symbol_new (buf, reg_section, regnum, &zero_address_frag));
|
symbol_table_insert (symbol_new (buf, reg_section, regnum,
|
||||||
verify_symbol_chain_2 (s);
|
&zero_address_frag));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct init_entry
|
struct init_entry
|
||||||
@ -3538,83 +3608,6 @@ md_assemble (str)
|
|||||||
int m, n = 0;
|
int m, n = 0;
|
||||||
char *to_beg_P;
|
char *to_beg_P;
|
||||||
int shorts_this_frag;
|
int shorts_this_frag;
|
||||||
static int done_first_time;
|
|
||||||
|
|
||||||
if (!done_first_time)
|
|
||||||
{
|
|
||||||
done_first_time = 1;
|
|
||||||
|
|
||||||
if (cpu_of_arch (current_architecture) == 0)
|
|
||||||
{
|
|
||||||
int cpu_type;
|
|
||||||
|
|
||||||
if (strcmp (TARGET_CPU, "m68000") == 0
|
|
||||||
|| strcmp (TARGET_CPU, "m68302") == 0)
|
|
||||||
cpu_type = m68000;
|
|
||||||
else if (strcmp (TARGET_CPU, "m68010") == 0)
|
|
||||||
cpu_type = m68010;
|
|
||||||
else if (strcmp (TARGET_CPU, "m68020") == 0
|
|
||||||
|| strcmp (TARGET_CPU, "m68k") == 0)
|
|
||||||
cpu_type = m68020;
|
|
||||||
else if (strcmp (TARGET_CPU, "m68030") == 0)
|
|
||||||
cpu_type = m68030;
|
|
||||||
else if (strcmp (TARGET_CPU, "m68040") == 0)
|
|
||||||
cpu_type = m68040;
|
|
||||||
else if (strcmp (TARGET_CPU, "cpu32") == 0
|
|
||||||
|| strcmp (TARGET_CPU, "m68331") == 0
|
|
||||||
|| strcmp (TARGET_CPU, "m68332") == 0
|
|
||||||
|| strcmp (TARGET_CPU, "m68333") == 0
|
|
||||||
|| strcmp (TARGET_CPU, "m68340") == 0)
|
|
||||||
cpu_type = cpu32;
|
|
||||||
else
|
|
||||||
cpu_type = m68020;
|
|
||||||
|
|
||||||
current_architecture |= cpu_type;
|
|
||||||
}
|
|
||||||
#if 0 /* Could be doing emulation. */
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* What other incompatibilities could we 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
|
|
||||||
&& cpu_of_arch (current_architecture) != m68040)
|
|
||||||
{
|
|
||||||
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");
|
|
||||||
|
|
||||||
#ifdef OBJ_AOUT
|
|
||||||
/* Work out the magic number. This isn't very general. */
|
|
||||||
if (current_architecture & m68000)
|
|
||||||
m68k_aout_machtype = 0;
|
|
||||||
else if (current_architecture & m68010)
|
|
||||||
m68k_aout_machtype = 1;
|
|
||||||
else if (current_architecture & m68020)
|
|
||||||
m68k_aout_machtype = 2;
|
|
||||||
else
|
|
||||||
m68k_aout_machtype = 2;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
memset ((char *) (&the_ins), '\0', sizeof (the_ins));
|
memset ((char *) (&the_ins), '\0', sizeof (the_ins));
|
||||||
m68k_ip (str);
|
m68k_ip (str);
|
||||||
@ -3791,8 +3784,7 @@ md_begin ()
|
|||||||
register unsigned int i;
|
register unsigned int i;
|
||||||
register char c;
|
register char c;
|
||||||
|
|
||||||
if ((op_hash = hash_new ()) == NULL)
|
op_hash = hash_new ();
|
||||||
as_fatal ("Virtual memory exhausted");
|
|
||||||
|
|
||||||
obstack_begin (&robyn, 4000);
|
obstack_begin (&robyn, 4000);
|
||||||
for (i = 0; i < numopcodes; i++)
|
for (i = 0; i < numopcodes; i++)
|
||||||
@ -3822,7 +3814,6 @@ md_begin ()
|
|||||||
while (slak);
|
while (slak);
|
||||||
|
|
||||||
retval = hash_insert (op_hash, ins->name, (char *) hack);
|
retval = hash_insert (op_hash, ins->name, (char *) hack);
|
||||||
/* Didn't his mommy tell him about null pointers? */
|
|
||||||
if (retval)
|
if (retval)
|
||||||
as_bad ("Internal Error: Can't hash %s: %s", ins->name, retval);
|
as_bad ("Internal Error: Can't hash %s: %s", ins->name, retval);
|
||||||
}
|
}
|
||||||
@ -3848,9 +3839,6 @@ md_begin ()
|
|||||||
#ifdef REGISTER_PREFIX
|
#ifdef REGISTER_PREFIX
|
||||||
alt_notend_table[REGISTER_PREFIX] = 1;
|
alt_notend_table[REGISTER_PREFIX] = 1;
|
||||||
#endif
|
#endif
|
||||||
#ifdef OPTIONAL_REGISTER_PREFIX
|
|
||||||
alt_notend_table[OPTIONAL_REGISTER_PREFIX] = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MIT_SYNTAX_ONLY
|
#ifndef MIT_SYNTAX_ONLY
|
||||||
/* Insert pseudo ops, these have to go into the opcode table since
|
/* Insert pseudo ops, these have to go into the opcode table since
|
||||||
@ -3873,20 +3861,119 @@ md_begin ()
|
|||||||
init_regtable ();
|
init_regtable ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
m68k_init_after_args ()
|
||||||
|
{
|
||||||
|
if (cpu_of_arch (current_architecture) == 0)
|
||||||
|
{
|
||||||
|
int cpu_type;
|
||||||
|
|
||||||
|
if (strcmp (TARGET_CPU, "m68000") == 0
|
||||||
|
|| strcmp (TARGET_CPU, "m68302") == 0)
|
||||||
|
cpu_type = m68000;
|
||||||
|
else if (strcmp (TARGET_CPU, "m68010") == 0)
|
||||||
|
cpu_type = m68010;
|
||||||
|
else if (strcmp (TARGET_CPU, "m68020") == 0
|
||||||
|
|| strcmp (TARGET_CPU, "m68k") == 0)
|
||||||
|
cpu_type = m68020;
|
||||||
|
else if (strcmp (TARGET_CPU, "m68030") == 0)
|
||||||
|
cpu_type = m68030;
|
||||||
|
else if (strcmp (TARGET_CPU, "m68040") == 0)
|
||||||
|
cpu_type = m68040;
|
||||||
|
else if (strcmp (TARGET_CPU, "m68060") == 0)
|
||||||
|
cpu_type = m68060;
|
||||||
|
else if (strcmp (TARGET_CPU, "cpu32") == 0
|
||||||
|
|| strcmp (TARGET_CPU, "m68331") == 0
|
||||||
|
|| strcmp (TARGET_CPU, "m68332") == 0
|
||||||
|
|| strcmp (TARGET_CPU, "m68333") == 0
|
||||||
|
|| strcmp (TARGET_CPU, "m68340") == 0)
|
||||||
|
cpu_type = cpu32;
|
||||||
|
else
|
||||||
|
cpu_type = m68020;
|
||||||
|
|
||||||
|
current_architecture |= cpu_type;
|
||||||
|
}
|
||||||
|
#if 0 /* Could be doing emulation. */
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (current_architecture & m68851)
|
||||||
|
{
|
||||||
|
if (current_architecture & m68040)
|
||||||
|
{
|
||||||
|
as_warn ("68040 and 68851 specified; mmu instructions may assemble incorrectly");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* What other incompatibilities could we 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
|
||||||
|
&& (cpu_of_arch (current_architecture) & m68040up) == 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");
|
||||||
|
|
||||||
|
#ifdef OBJ_AOUT
|
||||||
|
/* Work out the magic number. This isn't very general. */
|
||||||
|
if (current_architecture & m68000)
|
||||||
|
m68k_aout_machtype = 0;
|
||||||
|
else if (current_architecture & m68010)
|
||||||
|
m68k_aout_machtype = 1;
|
||||||
|
else if (current_architecture & m68020)
|
||||||
|
m68k_aout_machtype = 2;
|
||||||
|
else
|
||||||
|
m68k_aout_machtype = 2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Note which set of "movec" control registers is available. */
|
||||||
|
switch (cpu_of_arch (current_architecture))
|
||||||
|
{
|
||||||
|
case m68000:
|
||||||
|
control_regs = m68000_control_regs;
|
||||||
|
break;
|
||||||
|
case m68010:
|
||||||
|
control_regs = m68010_control_regs;
|
||||||
|
break;
|
||||||
|
case m68020:
|
||||||
|
case m68030:
|
||||||
|
control_regs = m68020_control_regs;
|
||||||
|
break;
|
||||||
|
case m68040:
|
||||||
|
control_regs = m68040_control_regs;
|
||||||
|
break;
|
||||||
|
case m68060:
|
||||||
|
control_regs = m68060_control_regs;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
#define notend(s) ((*s == ',' || *s == '}' || *s == '{' \
|
#define notend(s) ((*s == ',' || *s == '}' || *s == '{' \
|
||||||
|| (*s == ':' && strchr("aAdD#", s[1]))) \
|
|| (*s == ':' && strchr("aAdD#", s[1]))) \
|
||||||
? 0 : 1)
|
? 0 : 1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* This funciton is called once, before the assembler exits. It is
|
|
||||||
supposed to do any final cleanup for this part of the assembler.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
md_end ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Equal to MAX_PRECISION in atof-ieee.c */
|
/* Equal to MAX_PRECISION in atof-ieee.c */
|
||||||
#define MAX_LITTLENUMS 6
|
#define MAX_LITTLENUMS 6
|
||||||
|
|
||||||
@ -3949,37 +4036,13 @@ md_atof (type, litP, sizeP)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Turn an integer of n bytes (in val) into a stream of bytes appropriate
|
|
||||||
for use in the a.out file, and stores them in the array pointed to by buf.
|
|
||||||
This knows about the endian-ness of the target machine and does
|
|
||||||
THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
|
|
||||||
2 (short) and 4 (long) Floating numbers are put out as a series of
|
|
||||||
LITTLENUMS (shorts, here at least)
|
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
md_number_to_chars (buf, val, n)
|
md_number_to_chars (buf, val, n)
|
||||||
char *buf;
|
char *buf;
|
||||||
valueT val;
|
valueT val;
|
||||||
int n;
|
int n;
|
||||||
{
|
{
|
||||||
switch (n)
|
number_to_chars_bigendian (buf, val, n);
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
*buf++ = val;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
*buf++ = (val >> 8);
|
|
||||||
*buf++ = val;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
*buf++ = (val >> 24);
|
|
||||||
*buf++ = (val >> 16);
|
|
||||||
*buf++ = (val >> 8);
|
|
||||||
*buf++ = val;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
as_fatal ("failed sanity check.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -4526,8 +4589,7 @@ tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
|
|||||||
* Out: GNU LD relocation length code: 0, 1, or 2.
|
* Out: GNU LD relocation length code: 0, 1, or 2.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static CONST unsigned char nbytes_r_length[] =
|
static CONST unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2};
|
||||||
{42, 0, 1, 42, 2};
|
|
||||||
long r_symbolnum;
|
long r_symbolnum;
|
||||||
|
|
||||||
know (fixP->fx_addsy != NULL);
|
know (fixP->fx_addsy != NULL);
|
||||||
@ -4545,8 +4607,6 @@ tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
|
|||||||
where[6] = r_symbolnum & 0x0ff;
|
where[6] = r_symbolnum & 0x0ff;
|
||||||
where[7] = (((fixP->fx_pcrel << 7) & 0x80) | ((nbytes_r_length[fixP->fx_size] << 5) & 0x60) |
|
where[7] = (((fixP->fx_pcrel << 7) & 0x80) | ((nbytes_r_length[fixP->fx_size] << 5) & 0x60) |
|
||||||
(((!S_IS_DEFINED (fixP->fx_addsy)) << 4) & 0x10));
|
(((!S_IS_DEFINED (fixP->fx_addsy)) << 4) & 0x10));
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -4896,6 +4956,20 @@ s_proc (ignore)
|
|||||||
#define MAYBE_FLOAT_TOO /* m68881 */ 0 /* this is handled later */
|
#define MAYBE_FLOAT_TOO /* m68881 */ 0 /* this is handled later */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
m68k_parse_long_option (opt)
|
||||||
|
char *opt;
|
||||||
|
{
|
||||||
|
/* Skip over double-dash. */
|
||||||
|
opt += 2;
|
||||||
|
if (!strcmp (opt, "register-prefix-optional"))
|
||||||
|
{
|
||||||
|
flag_reg_prefix_optional = 1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
md_parse_option (argP, cntP, vecP)
|
md_parse_option (argP, cntP, vecP)
|
||||||
char **argP;
|
char **argP;
|
||||||
@ -4945,6 +5019,10 @@ md_parse_option (argP, cntP, vecP)
|
|||||||
{
|
{
|
||||||
current_architecture |= m68040 | MAYBE_FLOAT_TOO;
|
current_architecture |= m68040 | MAYBE_FLOAT_TOO;
|
||||||
}
|
}
|
||||||
|
else if (!strcmp (*argP, "68060"))
|
||||||
|
{
|
||||||
|
current_architecture |= m68060 | MAYBE_FLOAT_TOO;
|
||||||
|
}
|
||||||
#ifndef NO_68881
|
#ifndef NO_68881
|
||||||
else if (!strcmp (*argP, "68881"))
|
else if (!strcmp (*argP, "68881"))
|
||||||
{
|
{
|
||||||
|
@ -109,7 +109,7 @@ case ${target_cpu} in
|
|||||||
# but this is what the support files are named...
|
# but this is what the support files are named...
|
||||||
hppa*) cpu_type=hppa ;;
|
hppa*) cpu_type=hppa ;;
|
||||||
i486) cpu_type=i386 ;;
|
i486) cpu_type=i386 ;;
|
||||||
m680[01234]0) cpu_type=m68k ;;
|
m680[012346]0) cpu_type=m68k ;;
|
||||||
m68008) cpu_type=m68k ;;
|
m68008) cpu_type=m68k ;;
|
||||||
m683??) cpu_type=m68k ;;
|
m683??) cpu_type=m68k ;;
|
||||||
m8*) cpu_type=m88k ;;
|
m8*) cpu_type=m88k ;;
|
||||||
|
Reference in New Issue
Block a user