* config/tc-hppa.c (pa_ip): Change condition args to have '?' prefix.

This commit is contained in:
Jeff Law
1999-08-05 22:56:06 +00:00
parent 336f7c7060
commit 55a914bc48
2 changed files with 410 additions and 394 deletions

View File

@ -1,3 +1,7 @@
Thu Aug 5 16:52:51 1999 Jerry Quinn <jquinn@nortelnetworks.com>
* config/tc-hppa.c (pa_ip): Change condition args to have '?' prefix.
Thu Aug 5 23:05:56 1999 J"orn Rennecke <amylaar@cygnus.co.uk> Thu Aug 5 23:05:56 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
* config/tc-sh.c (md_assemble): Call as_bad when there are excess * config/tc-sh.c (md_assemble): Call as_bad when there are excess

View File

@ -1717,407 +1717,424 @@ pa_ip (str)
INSERT_FIELD_AND_CONTINUE (opcode, a, 13); INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
} }
/* Handle a non-negated compare/stubtract condition. */ /* Handle all conditions. */
case '<':
cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1);
if (cmpltr < 0)
{
as_bad (_("Invalid Compare/Subtract Condition: %c"), *s);
cmpltr = 0;
}
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
/* Handle a negated or non-negated compare/subtract condition. */
case '?': case '?':
save_s = s; {
cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1); args++;
if (cmpltr < 0) switch (*args)
{ {
s = save_s; /* Handle FP compare conditions. */
cmpltr = pa_parse_neg_cmpsub_cmpltr (&s, 1); case 'f':
if (cmpltr < 0) cond = pa_parse_fp_cmp_cond (&s);
{ INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
as_bad (_("Invalid Compare/Subtract Condition."));
cmpltr = 0;
}
else
{
/* Negated condition requires an opcode change. */
opcode |= 1 << 27;
}
}
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
/* Handle non-negated add condition. */ /* Handle an add condition. */
case '!': case 'a':
cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1); cmpltr = 0;
if (cmpltr < 0) flag = 0;
{ if (*s == ',')
as_bad (_("Invalid Compare/Subtract Condition: %c"), *s); {
cmpltr = 0; s++;
} name = s;
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13); while (*s != ',' && *s != ' ' && *s != '\t')
s += 1;
c = *s;
*s = 0x00;
if (strcmp (name, "=") == 0)
cmpltr = 1;
else if (strcmp (name, "<") == 0)
cmpltr = 2;
else if (strcmp (name, "<=") == 0)
cmpltr = 3;
else if (strcasecmp (name, "nuv") == 0)
cmpltr = 4;
else if (strcasecmp (name, "znv") == 0)
cmpltr = 5;
else if (strcasecmp (name, "sv") == 0)
cmpltr = 6;
else if (strcasecmp (name, "od") == 0)
cmpltr = 7;
else if (strcasecmp (name, "tr") == 0)
{
cmpltr = 0;
flag = 1;
}
else if (strcmp (name, "<>") == 0)
{
cmpltr = 1;
flag = 1;
}
else if (strcmp (name, ">=") == 0)
{
cmpltr = 2;
flag = 1;
}
else if (strcmp (name, ">") == 0)
{
cmpltr = 3;
flag = 1;
}
else if (strcasecmp (name, "uv") == 0)
{
cmpltr = 4;
flag = 1;
}
else if (strcasecmp (name, "vnz") == 0)
{
cmpltr = 5;
flag = 1;
}
else if (strcasecmp (name, "nsv") == 0)
{
cmpltr = 6;
flag = 1;
}
else if (strcasecmp (name, "ev") == 0)
{
cmpltr = 7;
flag = 1;
}
else
as_bad (_("Invalid Add Condition: %s"), name);
*s = c;
}
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
/* Handle a negated or non-negated add condition. */ /* Handle non-negated add and branch condition. */
case '@': case 'd':
save_s = s; cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1);
cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1); if (cmpltr < 0)
if (cmpltr < 0) {
{ as_bad (_("Invalid Compare/Subtract Condition: %c"), *s);
s = save_s; cmpltr = 0;
cmpltr = pa_parse_neg_add_cmpltr (&s, 1); }
if (cmpltr < 0) INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
{
as_bad (_("Invalid Compare/Subtract Condition"));
cmpltr = 0;
}
else
{
/* Negated condition requires an opcode change. */
opcode |= 1 << 27;
}
}
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
/* Handle a compare/subtract condition. */ /* Handle a negated or non-negated add and branch
case 'a': condition. */
cmpltr = 0; case '@':
flag = 0; save_s = s;
if (*s == ',') cmpltr = pa_parse_nonneg_add_cmpltr (&s, 1);
{ if (cmpltr < 0)
s++; {
name = s; s = save_s;
while (*s != ',' && *s != ' ' && *s != '\t') cmpltr = pa_parse_neg_add_cmpltr (&s, 1);
s += 1; if (cmpltr < 0)
c = *s; {
*s = 0x00; as_bad (_("Invalid Compare/Subtract Condition"));
if (strcmp (name, "=") == 0) cmpltr = 0;
cmpltr = 1; }
else if (strcmp (name, "<") == 0) else
cmpltr = 2; {
else if (strcmp (name, "<=") == 0) /* Negated condition requires an opcode change. */
cmpltr = 3; opcode |= 1 << 27;
else if (strcasecmp (name, "<<") == 0) }
cmpltr = 4; }
else if (strcasecmp (name, "<<=") == 0) INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
cmpltr = 5;
else if (strcasecmp (name, "sv") == 0)
cmpltr = 6;
else if (strcasecmp (name, "od") == 0)
cmpltr = 7;
else if (strcasecmp (name, "tr") == 0)
{
cmpltr = 0;
flag = 1;
}
else if (strcmp (name, "<>") == 0)
{
cmpltr = 1;
flag = 1;
}
else if (strcmp (name, ">=") == 0)
{
cmpltr = 2;
flag = 1;
}
else if (strcmp (name, ">") == 0)
{
cmpltr = 3;
flag = 1;
}
else if (strcasecmp (name, ">>=") == 0)
{
cmpltr = 4;
flag = 1;
}
else if (strcasecmp (name, ">>") == 0)
{
cmpltr = 5;
flag = 1;
}
else if (strcasecmp (name, "nsv") == 0)
{
cmpltr = 6;
flag = 1;
}
else if (strcasecmp (name, "ev") == 0)
{
cmpltr = 7;
flag = 1;
}
else
as_bad (_("Invalid Add Condition: %s"), name);
*s = c;
}
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
/* Handle a non-negated add condition. */ /* Handle branch on bit conditions. */
case 'd': case 'b':
cmpltr = 0; cmpltr = 0;
flag = 0; if (*s == ',')
if (*s == ',') {
{ s++;
s++; if (strncmp (s, "<", 1) == 0)
name = s; {
while (*s != ',' && *s != ' ' && *s != '\t') cmpltr = 0;
s += 1; s++;
c = *s; }
*s = 0x00; else if (strncmp (s, ">=", 2) == 0)
if (strcmp (name, "=") == 0) {
cmpltr = 1; cmpltr = 1;
else if (strcmp (name, "<") == 0) s += 2;
cmpltr = 2; }
else if (strcmp (name, "<=") == 0) else
cmpltr = 3; as_bad (_("Invalid Bit Branch Condition: %c"), *s);
else if (strcasecmp (name, "nuv") == 0) }
cmpltr = 4; INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
else if (strcasecmp (name, "znv") == 0)
cmpltr = 5;
else if (strcasecmp (name, "sv") == 0)
cmpltr = 6;
else if (strcasecmp (name, "od") == 0)
cmpltr = 7;
else if (strcasecmp (name, "tr") == 0)
{
cmpltr = 0;
flag = 1;
}
else if (strcmp (name, "<>") == 0)
{
cmpltr = 1;
flag = 1;
}
else if (strcmp (name, ">=") == 0)
{
cmpltr = 2;
flag = 1;
}
else if (strcmp (name, ">") == 0)
{
cmpltr = 3;
flag = 1;
}
else if (strcasecmp (name, "uv") == 0)
{
cmpltr = 4;
flag = 1;
}
else if (strcasecmp (name, "vnz") == 0)
{
cmpltr = 5;
flag = 1;
}
else if (strcasecmp (name, "nsv") == 0)
{
cmpltr = 6;
flag = 1;
}
else if (strcasecmp (name, "ev") == 0)
{
cmpltr = 7;
flag = 1;
}
else
as_bad (_("Invalid Add Condition: %s"), name);
*s = c;
}
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
/* HANDLE a logical instruction condition. */ /* Handle a compare/subtract condition. */
case '&': case 's':
cmpltr = 0; cmpltr = 0;
flag = 0; flag = 0;
if (*s == ',') if (*s == ',')
{ {
s++; s++;
name = s; name = s;
while (*s != ',' && *s != ' ' && *s != '\t') while (*s != ',' && *s != ' ' && *s != '\t')
s += 1; s += 1;
c = *s; c = *s;
*s = 0x00; *s = 0x00;
if (strcmp (name, "=") == 0)
cmpltr = 1;
else if (strcmp (name, "<") == 0)
cmpltr = 2;
else if (strcmp (name, "<=") == 0)
cmpltr = 3;
else if (strcasecmp (name, "<<") == 0)
cmpltr = 4;
else if (strcasecmp (name, "<<=") == 0)
cmpltr = 5;
else if (strcasecmp (name, "sv") == 0)
cmpltr = 6;
else if (strcasecmp (name, "od") == 0)
cmpltr = 7;
else if (strcasecmp (name, "tr") == 0)
{
cmpltr = 0;
flag = 1;
}
else if (strcmp (name, "<>") == 0)
{
cmpltr = 1;
flag = 1;
}
else if (strcmp (name, ">=") == 0)
{
cmpltr = 2;
flag = 1;
}
else if (strcmp (name, ">") == 0)
{
cmpltr = 3;
flag = 1;
}
else if (strcasecmp (name, ">>=") == 0)
{
cmpltr = 4;
flag = 1;
}
else if (strcasecmp (name, ">>") == 0)
{
cmpltr = 5;
flag = 1;
}
else if (strcasecmp (name, "nsv") == 0)
{
cmpltr = 6;
flag = 1;
}
else if (strcasecmp (name, "ev") == 0)
{
cmpltr = 7;
flag = 1;
}
else
as_bad (_("Invalid Compare/Subtract Condition: %s"),
name);
*s = c;
}
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
/* Handle a non-negated compare condition. */
case 't':
cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1);
if (cmpltr < 0)
{
as_bad (_("Invalid Compare/Subtract Condition: %c"), *s);
cmpltr = 0;
}
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
/* Handle a negated or non-negated compare/subtract
condition. */
case 'n':
save_s = s;
cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s, 1);
if (cmpltr < 0)
{
s = save_s;
cmpltr = pa_parse_neg_cmpsub_cmpltr (&s, 1);
if (cmpltr < 0)
{
as_bad (_("Invalid Compare/Subtract Condition."));
cmpltr = 0;
}
else
{
/* Negated condition requires an opcode change. */
opcode |= 1 << 27;
}
}
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
if (strcmp (name, "=") == 0) /* Handle a logical instruction condition. */
cmpltr = 1; case 'l':
else if (strcmp (name, "<") == 0) cmpltr = 0;
cmpltr = 2; flag = 0;
else if (strcmp (name, "<=") == 0) if (*s == ',')
cmpltr = 3; {
else if (strcasecmp (name, "od") == 0) s++;
cmpltr = 7; name = s;
else if (strcasecmp (name, "tr") == 0) while (*s != ',' && *s != ' ' && *s != '\t')
{ s += 1;
cmpltr = 0; c = *s;
flag = 1; *s = 0x00;
}
else if (strcmp (name, "<>") == 0)
{ if (strcmp (name, "=") == 0)
cmpltr = 1; cmpltr = 1;
flag = 1; else if (strcmp (name, "<") == 0)
} cmpltr = 2;
else if (strcmp (name, ">=") == 0) else if (strcmp (name, "<=") == 0)
{ cmpltr = 3;
cmpltr = 2; else if (strcasecmp (name, "od") == 0)
flag = 1; cmpltr = 7;
} else if (strcasecmp (name, "tr") == 0)
else if (strcmp (name, ">") == 0) {
{ cmpltr = 0;
cmpltr = 3; flag = 1;
flag = 1; }
} else if (strcmp (name, "<>") == 0)
else if (strcasecmp (name, "ev") == 0) {
{ cmpltr = 1;
cmpltr = 7; flag = 1;
flag = 1; }
} else if (strcmp (name, ">=") == 0)
else {
as_bad (_("Invalid Logical Instruction Condition.")); cmpltr = 2;
*s = c; flag = 1;
} }
opcode |= cmpltr << 13; else if (strcmp (name, ">") == 0)
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); {
cmpltr = 3;
flag = 1;
}
else if (strcasecmp (name, "ev") == 0)
{
cmpltr = 7;
flag = 1;
}
else
as_bad (_("Invalid Logical Instruction Condition."));
*s = c;
}
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
/* Handle a unit instruction condition. */ /* Handle a shift/extract/deposit condition. */
case 'U': case 'x':
cmpltr = 0; case 'y':
flag = 0; cmpltr = 0;
if (*s == ',') if (*s == ',')
{ {
s++; save_s = s++;
name = s;
while (*s != ',' && *s != ' ' && *s != '\t')
s += 1;
c = *s;
*s = 0x00;
if (strcmp (name, "=") == 0)
cmpltr = 1;
else if (strcmp (name, "<") == 0)
cmpltr = 2;
else if (strcasecmp (name, "od") == 0)
cmpltr = 3;
else if (strcasecmp (name, "tr") == 0)
cmpltr = 4;
else if (strcmp (name, "<>") == 0)
cmpltr = 5;
else if (strcmp (name, ">=") == 0)
cmpltr = 6;
else if (strcasecmp (name, "ev") == 0)
cmpltr = 7;
/* Handle movb,n. Put things back the way they were.
This includes moving s back to where it started. */
else if (strcasecmp (name, "n") == 0 && *args == 'y')
{
*s = c;
s = save_s;
continue;
}
else
as_bad (_("Invalid Shift/Extract/Deposit Condition."));
*s = c;
}
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
if (strncasecmp (s, "sbz", 3) == 0) /* Handle a unit instruction condition. */
{ case 'u': /* unit */
cmpltr = 2; cmpltr = 0;
s += 3; flag = 0;
} if (*s == ',')
else if (strncasecmp (s, "shz", 3) == 0) {
{ s++;
cmpltr = 3;
s += 3; if (strncasecmp (s, "sbz", 3) == 0)
} {
else if (strncasecmp (s, "sdc", 3) == 0) cmpltr = 2;
{ s += 3;
cmpltr = 4; }
s += 3; else if (strncasecmp (s, "shz", 3) == 0)
} {
else if (strncasecmp (s, "sbc", 3) == 0) cmpltr = 3;
{ s += 3;
cmpltr = 6; }
s += 3; else if (strncasecmp (s, "sdc", 3) == 0)
} {
else if (strncasecmp (s, "shc", 3) == 0) cmpltr = 4;
{ s += 3;
cmpltr = 7; }
s += 3; else if (strncasecmp (s, "sbc", 3) == 0)
} {
else if (strncasecmp (s, "tr", 2) == 0) cmpltr = 6;
{ s += 3;
cmpltr = 0; }
flag = 1; else if (strncasecmp (s, "shc", 3) == 0)
s += 2; {
} cmpltr = 7;
else if (strncasecmp (s, "nbz", 3) == 0) s += 3;
{ }
cmpltr = 2; else if (strncasecmp (s, "tr", 2) == 0)
flag = 1; {
s += 3; cmpltr = 0;
} flag = 1;
else if (strncasecmp (s, "nhz", 3) == 0) s += 2;
{ }
cmpltr = 3; else if (strncasecmp (s, "nbz", 3) == 0)
flag = 1; {
s += 3; cmpltr = 2;
} flag = 1;
else if (strncasecmp (s, "ndc", 3) == 0) s += 3;
{ }
cmpltr = 4; else if (strncasecmp (s, "nhz", 3) == 0)
flag = 1; {
s += 3; cmpltr = 3;
} flag = 1;
else if (strncasecmp (s, "nbc", 3) == 0) s += 3;
{ }
cmpltr = 6; else if (strncasecmp (s, "ndc", 3) == 0)
flag = 1; {
s += 3; cmpltr = 4;
} flag = 1;
else if (strncasecmp (s, "nhc", 3) == 0) s += 3;
{ }
cmpltr = 7; else if (strncasecmp (s, "nbc", 3) == 0)
flag = 1; {
s += 3; cmpltr = 6;
} flag = 1;
else s += 3;
as_bad (_("Invalid Logical Instruction Condition.")); }
} else if (strncasecmp (s, "nhc", 3) == 0)
opcode |= cmpltr << 13; {
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12); cmpltr = 7;
flag = 1;
s += 3;
}
else
as_bad (_("Invalid Unit Instruction Condition."));
}
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
/* Handle a shift/extract/deposit condition. */ default:
case '|': abort ();
case '>': }
cmpltr = 0; }
if (*s == ',')
{
save_s = s++;
name = s;
while (*s != ',' && *s != ' ' && *s != '\t')
s += 1;
c = *s;
*s = 0x00;
if (strcmp (name, "=") == 0)
cmpltr = 1;
else if (strcmp (name, "<") == 0)
cmpltr = 2;
else if (strcasecmp (name, "od") == 0)
cmpltr = 3;
else if (strcasecmp (name, "tr") == 0)
cmpltr = 4;
else if (strcmp (name, "<>") == 0)
cmpltr = 5;
else if (strcmp (name, ">=") == 0)
cmpltr = 6;
else if (strcasecmp (name, "ev") == 0)
cmpltr = 7;
/* Handle movb,n. Put things back the way they were.
This includes moving s back to where it started. */
else if (strcasecmp (name, "n") == 0 && *args == '|')
{
*s = c;
s = save_s;
continue;
}
else
as_bad (_("Invalid Shift/Extract/Deposit Condition."));
*s = c;
}
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
/* Handle bvb and bb conditions. */
case '~':
cmpltr = 0;
if (*s == ',')
{
s++;
if (strncmp (s, "<", 1) == 0)
{
cmpltr = 0;
s++;
}
else if (strncmp (s, ">=", 2) == 0)
{
cmpltr = 1;
s += 2;
}
else
as_bad (_("Invalid Bit Branch Condition: %c"), *s);
}
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
/* Handle a system control completer. */ /* Handle a system control completer. */
case 'Z': case 'Z':
@ -2430,11 +2447,6 @@ pa_ip (str)
the_insn.fpof2 = flag; the_insn.fpof2 = flag;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 13); INSERT_FIELD_AND_CONTINUE (opcode, flag, 13);
/* Handle FP compare conditions. */
case 'M':
cond = pa_parse_fp_cmp_cond (&s);
INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
/* Handle L/R register halves like 't'. */ /* Handle L/R register halves like 't'. */
case 'v': case 'v':
{ {