From ef0241e727d448bf82983b97aa4c2dbe6b66c0d4 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Thu, 29 Sep 2005 07:00:54 +0000 Subject: [PATCH] gas/ 2005-09-29 Jan Beulich * config/tc-ia64.c (parse_operands): Always parse first operand of alloc. gas/testsuite/ 2005-09-29 Jan Beulich * gas/ia64/alloc.[sl]: New. * gas/ia64/ia64.exp: Run new test. --- gas/ChangeLog | 5 +++ gas/config/tc-ia64.c | 58 ++++++++++++++++++--------------- gas/testsuite/ChangeLog | 5 +++ gas/testsuite/gas/ia64/alloc.l | 11 +++++++ gas/testsuite/gas/ia64/alloc.s | 14 ++++++++ gas/testsuite/gas/ia64/ia64.exp | 1 + 6 files changed, 67 insertions(+), 27 deletions(-) create mode 100644 gas/testsuite/gas/ia64/alloc.l create mode 100644 gas/testsuite/gas/ia64/alloc.s diff --git a/gas/ChangeLog b/gas/ChangeLog index ed2b33147f9..65c7e7aea60 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2005-09-29 Jan Beulich + + * config/tc-ia64.c (parse_operands): Always parse first operand of + alloc. + 2005-09-29 Arnold Metselaar Alan Modra diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index 5875551c78d..334eb3285d2 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -6278,34 +6278,38 @@ parse_operands (idesc) if (idesc->operands[2] == IA64_OPND_SOF || idesc->operands[1] == IA64_OPND_SOF) { - /* map alloc r1=ar.pfs,i,l,o,r to alloc r1=ar.pfs,(i+l+o),(i+l),r */ + /* Map alloc r1=ar.pfs,i,l,o,r to alloc r1=ar.pfs,(i+l+o),(i+l),r. + Note, however, that due to that mapping operand numbers in error + messages for any of the constant operands will not be correct. */ know (strcmp (idesc->name, "alloc") == 0); - i = (CURR_SLOT.opnd[1].X_op == O_register - && CURR_SLOT.opnd[1].X_add_number == REG_AR + AR_PFS) ? 2 : 1; - if (num_operands == i + 3 /* first_arg not included in this count! */ - && CURR_SLOT.opnd[i].X_op == O_constant - && CURR_SLOT.opnd[i + 1].X_op == O_constant - && CURR_SLOT.opnd[i + 2].X_op == O_constant - && CURR_SLOT.opnd[i + 3].X_op == O_constant) - { - sof = set_regstack (CURR_SLOT.opnd[i].X_add_number, - CURR_SLOT.opnd[i + 1].X_add_number, - CURR_SLOT.opnd[i + 2].X_add_number, - CURR_SLOT.opnd[i + 3].X_add_number); - - /* now we can parse the first arg: */ - saved_input_pointer = input_line_pointer; - input_line_pointer = first_arg; - sep = parse_operand (CURR_SLOT.opnd + 0, '='); - if (sep != '=') - --num_outputs; /* force error */ - input_line_pointer = saved_input_pointer; - - CURR_SLOT.opnd[i].X_add_number = sof; - CURR_SLOT.opnd[i + 1].X_add_number - = sof - CURR_SLOT.opnd[i + 2].X_add_number; - CURR_SLOT.opnd[i + 2] = CURR_SLOT.opnd[i + 3]; - } + /* The first operand hasn't been parsed/initialized, yet (but + num_operands intentionally doesn't account for that). */ + i = num_operands > 4 ? 2 : 1; +#define FORCE_CONST(n) (CURR_SLOT.opnd[n].X_op == O_constant \ + ? CURR_SLOT.opnd[n].X_add_number \ + : 0) + sof = set_regstack (FORCE_CONST(i), + FORCE_CONST(i + 1), + FORCE_CONST(i + 2), + FORCE_CONST(i + 3)); +#undef FORCE_CONST + + /* now we can parse the first arg: */ + saved_input_pointer = input_line_pointer; + input_line_pointer = first_arg; + sep = parse_operand (CURR_SLOT.opnd + 0, '='); + if (sep != '=') + --num_outputs; /* force error */ + input_line_pointer = saved_input_pointer; + + CURR_SLOT.opnd[i].X_add_number = sof; + if (CURR_SLOT.opnd[i + 1].X_op == O_constant + && CURR_SLOT.opnd[i + 2].X_op == O_constant) + CURR_SLOT.opnd[i + 1].X_add_number + = sof - CURR_SLOT.opnd[i + 2].X_add_number; + else + CURR_SLOT.opnd[i + 1].X_op = O_illegal; + CURR_SLOT.opnd[i + 2] = CURR_SLOT.opnd[i + 3]; } highest_unmatched_operand = -4; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 13be2738c76..9e690887575 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-09-29 Jan Beulich + + * gas/ia64/alloc.[sl]: New. + * gas/ia64/ia64.exp: Run new test. + 2005-09-28 Jan Beulich * gas/i386/x86-64-stack.s, gas/i386/x86-64-stack.d, diff --git a/gas/testsuite/gas/ia64/alloc.l b/gas/testsuite/gas/ia64/alloc.l new file mode 100644 index 00000000000..42a866a1830 --- /dev/null +++ b/gas/testsuite/gas/ia64/alloc.l @@ -0,0 +1,11 @@ +# Currently in the error messages the operand numbers for the constants +# aren't correct, which is why the patterns only check for ranges. +.*: Assembler messages: +.*:7: Error: Operand [345] of .alloc. should be .* +.*:8: Error: Operand [345] of .alloc. should be .* +.*:9: Error: Operand [345] of .alloc. should be .* +.*:10: Error: Operand [56] of .alloc. should be .* +.*:11: Error: Operand [234] of .alloc. should be .* +.*:12: Error: Operand [234] of .alloc. should be .* +.*:13: Error: Operand [234] of .alloc. should be .* +.*:14: Error: Operand [45] of .alloc. should be .* diff --git a/gas/testsuite/gas/ia64/alloc.s b/gas/testsuite/gas/ia64/alloc.s new file mode 100644 index 00000000000..0fcdb848b35 --- /dev/null +++ b/gas/testsuite/gas/ia64/alloc.s @@ -0,0 +1,14 @@ +// Make sure error messages on 'alloc' don't needlessly refer to operand 1 +// (which gets parsed late) when only one of the other operands is wrong. + + .text + +alloc: + alloc r2 = ar.pfs, x, 0, 0, 0 + alloc r2 = ar.pfs, 0, x, 0, 0 + alloc r2 = ar.pfs, 0, 0, x, 0 + alloc r2 = ar.pfs, 0, 0, 0, x + alloc r3 = x, 0, 0, 0 + alloc r3 = 0, x, 0, 0 + alloc r3 = 0, 0, x, 0 + alloc r3 = 0, 0, 0, x diff --git a/gas/testsuite/gas/ia64/ia64.exp b/gas/testsuite/gas/ia64/ia64.exp index 8b4b999ad21..5ecdff31dca 100644 --- a/gas/testsuite/gas/ia64/ia64.exp +++ b/gas/testsuite/gas/ia64/ia64.exp @@ -76,6 +76,7 @@ if [istarget "ia64-*"] then { run_dump_test "group-2" } + run_list_test "alloc" "" run_dump_test "bundling" run_list_test "label" "" run_list_test "last" "" -- 2.30.2