* config/tc-m68k.c (m68k_float_copnum): New static variable.

(md_pseudo_table): Add fopt and mask2.
	(m68k_ip): Use m68k_float_copnum, not COPNUM, when setting
	coprocessor register to use.  In case 'I' when checking operands,
	correct coprocessor register numbers.  In case 'I' when setting
	operands, don't add 1.
	(s_fopt): New static function.
	* config/m68k-parse.h (COPNUM): Don't define.
This commit is contained in:
Ian Lance Taylor
1995-08-09 19:32:49 +00:00
parent 51a3bc1501
commit 27a53b88d7
2 changed files with 40 additions and 11 deletions

View File

@ -38,7 +38,6 @@
#define DATA DATA0 #define DATA DATA0
#define ADDR ADDR0 #define ADDR ADDR0
#define SP ADDR7 #define SP ADDR7
#define COPNUM COP0
#define BAD BAD0 #define BAD BAD0
#define BAC BAC0 #define BAC BAC0
@ -71,10 +70,7 @@ enum m68k_register
FP6, FP6,
FP7, FP7,
/* Note that COP0==processor #1 -- COP0+7==#8, which stores as 000 */ COP0, /* Co-processor #0-#7 */
/* I think. . . */
COP0, /* Co-processor #1-#8 */
COP1, COP1,
COP2, COP2,
COP3, COP3,

View File

@ -73,6 +73,9 @@ int flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
int flag_reg_prefix_optional; int flag_reg_prefix_optional;
#endif #endif
/* The floating point coprocessor to use by default. */
static enum m68k_register m68k_float_copnum = COP1;
/* 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;
@ -276,6 +279,7 @@ static void s_even PARAMS ((int));
static void s_proc PARAMS ((int)); static void s_proc PARAMS ((int));
static void mri_chip PARAMS ((void)); static void mri_chip PARAMS ((void));
static void s_chip PARAMS ((int)); static void s_chip PARAMS ((int));
static void s_fopt PARAMS ((int));
static int current_architecture; static int current_architecture;
@ -404,6 +408,8 @@ CONST pseudo_typeS md_pseudo_table[] =
/* The following pseudo-ops are supported for MRI compatibility. */ /* The following pseudo-ops are supported for MRI compatibility. */
{"chip", s_chip, 0}, {"chip", s_chip, 0},
{"comline", s_space, 1}, {"comline", s_space, 1},
{"fopt", s_fopt, 0},
{"mask2", s_ignore, 0},
{0, 0, 0} {0, 0, 0}
}; };
@ -670,7 +676,7 @@ m68k_ip (instring)
memset ((char *) (&the_ins.operands[0]), '\0', memset ((char *) (&the_ins.operands[0]), '\0',
sizeof (the_ins.operands[0])); sizeof (the_ins.operands[0]));
the_ins.operands[0].mode = CONTROL; the_ins.operands[0].mode = CONTROL;
the_ins.operands[0].reg = COPNUM; /* COP #1 */ the_ins.operands[0].reg = m68k_float_copnum;
opsfound++; opsfound++;
} }
@ -953,8 +959,8 @@ m68k_ip (instring)
case 'I': case 'I':
if (opP->mode != CONTROL if (opP->mode != CONTROL
|| opP->reg < COPNUM || opP->reg < COP0
|| opP->reg >= COPNUM + 7) || opP->reg > COP7)
losing++; losing++;
break; break;
@ -1927,9 +1933,7 @@ m68k_ip (instring)
break; break;
case 'I': case 'I':
tmpreg = 1 + opP->reg - COPNUM; tmpreg = opP->reg - COP0;
if (tmpreg == 8)
tmpreg = 0;
install_operand (s[1], tmpreg); install_operand (s[1], tmpreg);
break; break;
@ -4034,6 +4038,35 @@ s_chip (ignore)
mri_chip (); mri_chip ();
demand_empty_rest_of_line (); demand_empty_rest_of_line ();
} }
/* The MRI FOPT pseudo-op. */
static void
s_fopt (ignore)
int ignore;
{
SKIP_WHITESPACE ();
if (strncasecmp (input_line_pointer, "ID=", 3) == 0)
{
int temp;
input_line_pointer += 3;
temp = get_absolute_expression ();
if (temp < 0 || temp > 7)
as_bad ("bad coprocessor id");
else
m68k_float_copnum = COP0 + temp;
}
else
{
as_bad ("unrecognized fopt option");
ignore_rest_of_line ();
return;
}
demand_empty_rest_of_line ();
}
/* /*
* md_parse_option * md_parse_option