aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-a29k.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1993-10-28 17:14:16 +0000
committerIan Lance Taylor <ian@airs.com>1993-10-28 17:14:16 +0000
commit6121fb06adec6e5b49814c7f788e85c90060ce1e (patch)
tree08a8b66107da92543bbf341745bf26869c21d6d4 /gas/config/tc-a29k.c
parent355b334f68ff59f3d24376ae374b9f50def45124 (diff)
downloadgdb-6121fb06adec6e5b49814c7f788e85c90060ce1e.zip
gdb-6121fb06adec6e5b49814c7f788e85c90060ce1e.tar.gz
gdb-6121fb06adec6e5b49814c7f788e85c90060ce1e.tar.bz2
* config/tc-a29k.c (md_begin): When opcodes are mashed together in
the table, require that the one without bit 0x1000000 set come first. Require further that it be case 'b' or 'P'. The a29k opcode table already meets these constraints. (machine_ip): When handling case 'i' or 'A', make sure that the appropriate opcode really exists by looking at the next entry in the opcode table.
Diffstat (limited to 'gas/config/tc-a29k.c')
-rw-r--r--gas/config/tc-a29k.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/gas/config/tc-a29k.c b/gas/config/tc-a29k.c
index 288779b..877a924 100644
--- a/gas/config/tc-a29k.c
+++ b/gas/config/tc-a29k.c
@@ -292,8 +292,10 @@ md_begin ()
if (!strcmp (name, machine_opcodes[i + 1].name))
{
- if ((machine_opcodes[i].opcode ^ machine_opcodes[i + 1].opcode)
- != 0x01000000)
+ if ((machine_opcodes[i].opcode & 0x01000000) != 0
+ || (machine_opcodes[i + 1].opcode & 0x01000000) == 0
+ || ((machine_opcodes[i].opcode | 0x01000000)
+ != machine_opcodes[i + 1].opcode))
goto bad_table;
strend = machine_opcodes[i].args + strlen (machine_opcodes[i].args) - 1;
strend2 = machine_opcodes[i + 1].args + strlen (machine_opcodes[i + 1].args) - 1;
@@ -303,18 +305,10 @@ md_begin ()
if (*strend2 != 'i')
goto bad_table;
break;
- case 'i':
- if (*strend2 != 'b')
- goto bad_table;
- break;
case 'P':
if (*strend2 != 'A')
goto bad_table;
break;
- case 'A':
- if (*strend2 != 'P')
- goto bad_table;
- break;
default:
bad_table:
fprintf (stderr, "internal error: can't handle opcode %s\n",
@@ -325,10 +319,7 @@ md_begin ()
/* OK, this is an i/b or A/P pair. We skip the
higher-valued one, and let the code for operand checking
handle OR-ing in the bit. */
- if (machine_opcodes[i].opcode & 1)
- continue;
- else
- skipnext = 1;
+ skipnext = 1;
}
retval = hash_insert (op_hash, name, (PTR) &machine_opcodes[i]);
@@ -512,6 +503,10 @@ machine_ip (str)
if (operand->X_op == O_register)
goto general_reg;
+ /* Make sure the 'i' case really exists. */
+ if ((insn->opcode | IMMEDIATE_BIT) != (insn + 1)->opcode)
+ break;
+
opcode |= IMMEDIATE_BIT;
if (operand->X_op == O_constant)
{
@@ -594,6 +589,9 @@ machine_ip (str)
opcode table entries together. */
if (operand->X_op == O_constant)
{
+ /* Make sure the 'A' case really exists. */
+ if ((insn->opcode | ABSOLUTE_BIT) != (insn + 1)->opcode)
+ break;
opcode |= ABSOLUTE_BIT |
(operand->X_add_number & 0x0003FC00) << 6 |
((operand->X_add_number & 0x000003FC) >> 2);