aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog9
-rw-r--r--gas/config/tc-ia64.c39
-rw-r--r--gas/testsuite/ChangeLog5
-rw-r--r--gas/testsuite/gas/ia64/ia64.exp1
-rw-r--r--gas/testsuite/gas/ia64/operands.l5
-rw-r--r--gas/testsuite/gas/ia64/operands.s6
6 files changed, 55 insertions, 10 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 0af5769..c110faf 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,14 @@
2005-01-31 Jan Beulich <jbeulich@novell.com>
+ * config/tc-ia64.c (parse_operands): Parse all specified operands,
+ immediately discarding (but counting) those exceeding the maximum
+ possible amount. Track whether output and input operand counts ever
+ matched, and use this to better indicate which of the operands/
+ operand types was wrong; specifically don't default to pointing to
+ the first operand.
+
+2005-01-31 Jan Beulich <jbeulich@novell.com>
+
* config/tc-ia64.c (unwind): Remove proc_end (now an automatic
variable in dot_endp). Add body and insn. Make prologue,
prologue_mask, body, and insn bitfields.
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c
index 7d87cc5..f6a6002 100644
--- a/gas/config/tc-ia64.c
+++ b/gas/config/tc-ia64.c
@@ -5956,11 +5956,22 @@ parse_operands (idesc)
++num_outputs;
}
- for (; i < NELEMS (CURR_SLOT.opnd); ++i)
+ for (; ; ++i)
{
- sep = parse_operand (CURR_SLOT.opnd + i);
- if (CURR_SLOT.opnd[i].X_op == O_absent)
- break;
+ if (i < NELEMS (CURR_SLOT.opnd))
+ {
+ sep = parse_operand (CURR_SLOT.opnd + i);
+ if (CURR_SLOT.opnd[i].X_op == O_absent)
+ break;
+ }
+ else
+ {
+ expressionS dummy;
+
+ sep = parse_operand (&dummy);
+ if (dummy.X_op == O_absent)
+ break;
+ }
++num_operands;
@@ -6014,14 +6025,22 @@ parse_operands (idesc)
}
}
- highest_unmatched_operand = 0;
+ highest_unmatched_operand = -4;
curr_out_of_range_pos = -1;
error_pos = 0;
- expected_operand = idesc->operands[0];
for (; idesc; idesc = get_next_opcode (idesc))
{
if (num_outputs != idesc->num_outputs)
continue; /* mismatch in # of outputs */
+ if (highest_unmatched_operand < 0)
+ highest_unmatched_operand |= 1;
+ if (num_operands > NELEMS (idesc->operands)
+ || (num_operands < NELEMS (idesc->operands)
+ && idesc->operands[num_operands])
+ || (num_operands > 0 && !idesc->operands[num_operands - 1]))
+ continue; /* mismatch in number of arguments */
+ if (highest_unmatched_operand < 0)
+ highest_unmatched_operand |= 2;
CURR_SLOT.num_fixups = 0;
@@ -6074,10 +6093,6 @@ parse_operands (idesc)
continue;
}
- if (num_operands < NELEMS (idesc->operands)
- && idesc->operands[num_operands])
- continue; /* mismatch in number of arguments */
-
break;
}
if (!idesc)
@@ -6086,6 +6101,10 @@ parse_operands (idesc)
as_bad ("Operand %u of `%s' should be %s",
error_pos + 1, mnemonic,
elf64_ia64_operands[expected_operand].desc);
+ else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 1))
+ as_bad ("Wrong number of output operands");
+ else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 2))
+ as_bad ("Wrong number of input operands");
else
as_bad ("Operand mismatch");
return 0;
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 353e3ff..860a9a9 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2005-01-31 Jan Beulich <jbeulich@novell.com>
+ * gas/ia64/operands.[ls]: New.
+ * gas/ia64/ia64.exp: Run new test.
+
+2005-01-31 Jan Beulich <jbeulich@novell.com>
+
* gas/ia64/proc.[ls]: New.
* gas/ia64/unwind-err.[ls]: New.
* gas/ia64/ia64.exp: Run new tests.
diff --git a/gas/testsuite/gas/ia64/ia64.exp b/gas/testsuite/gas/ia64/ia64.exp
index c5dc9e1..89c5d20 100644
--- a/gas/testsuite/gas/ia64/ia64.exp
+++ b/gas/testsuite/gas/ia64/ia64.exp
@@ -27,6 +27,7 @@ if [istarget "ia64-*"] then {
run_dump_test "pseudo"
run_dump_test "nop_x"
run_dump_test "mov-ar"
+ run_list_test "operands" ""
run_list_test "dv-raw-err" ""
run_list_test "dv-waw-err" ""
diff --git a/gas/testsuite/gas/ia64/operands.l b/gas/testsuite/gas/ia64/operands.l
new file mode 100644
index 0000000..440c78b
--- /dev/null
+++ b/gas/testsuite/gas/ia64/operands.l
@@ -0,0 +1,5 @@
+.*: Assembler messages:
+.*:3: Error: .* output .*
+.*:4: Error: .* input .*
+.*:5: Error: .* 1 .*
+.*:6: Error: .* 2 .*
diff --git a/gas/testsuite/gas/ia64/operands.s b/gas/testsuite/gas/ia64/operands.s
new file mode 100644
index 0000000..08f4ec1
--- /dev/null
+++ b/gas/testsuite/gas/ia64/operands.s
@@ -0,0 +1,6 @@
+ .text
+_start:
+ zxt1 r1, r2 = r3
+ zxt2 r4 = r5, r6
+ zxt4 p1 = r8
+ sxt1 r7 = 0