From d3156ecc655da60ddcc1f846ae55f943548205cb Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 31 Jan 2005 10:01:02 +0000 Subject: [PATCH] gas/ 2005-01-31 Jan Beulich * 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. gas/testsuite/ 2005-01-31 Jan Beulich * gas/ia64/operands.[ls]: New. * gas/ia64/ia64.exp: Run new test. --- gas/ChangeLog | 9 +++++++ gas/config/tc-ia64.c | 39 +++++++++++++++++++++++-------- gas/testsuite/ChangeLog | 5 ++++ gas/testsuite/gas/ia64/ia64.exp | 1 + gas/testsuite/gas/ia64/operands.l | 5 ++++ gas/testsuite/gas/ia64/operands.s | 6 +++++ 6 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 gas/testsuite/gas/ia64/operands.l create mode 100644 gas/testsuite/gas/ia64/operands.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 0af5769087..c110fafd01 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2005-01-31 Jan Beulich + + * 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 * config/tc-ia64.c (unwind): Remove proc_end (now an automatic diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index 7d87cc538b..f6a60028d9 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 353e3ffa12..860a9a9e7d 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-01-31 Jan Beulich + + * gas/ia64/operands.[ls]: New. + * gas/ia64/ia64.exp: Run new test. + 2005-01-31 Jan Beulich * gas/ia64/proc.[ls]: New. diff --git a/gas/testsuite/gas/ia64/ia64.exp b/gas/testsuite/gas/ia64/ia64.exp index c5dc9e122f..89c5d20aec 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 0000000000..440c78b526 --- /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 0000000000..08f4ec15b6 --- /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