diff options
-rw-r--r-- | gas/ChangeLog | 9 | ||||
-rw-r--r-- | gas/config/tc-ia64.c | 39 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/ia64.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/operands.l | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/operands.s | 6 |
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 |