gas/
2005-09-29 Jan Beulich <jbeulich@novell.com> * config/tc-ia64.c (parse_operands): Always parse first operand of alloc. gas/testsuite/ 2005-09-29 Jan Beulich <jbeulich@novell.com> * gas/ia64/alloc.[sl]: New. * gas/ia64/ia64.exp: Run new test.
This commit is contained in:
parent
c9c5dcdafc
commit
ef0241e727
@ -1,3 +1,8 @@
|
||||
2005-09-29 Jan Beulich <jbeulich@novell.com>
|
||||
|
||||
* config/tc-ia64.c (parse_operands): Always parse first operand of
|
||||
alloc.
|
||||
|
||||
2005-09-29 Arnold Metselaar <arnold.metselaar@planet.nl>
|
||||
Alan Modra <amodra@bigpond.net.au>
|
||||
|
||||
|
@ -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);
|
||||
/* 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;
|
||||
/* 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];
|
||||
}
|
||||
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;
|
||||
|
@ -1,3 +1,8 @@
|
||||
2005-09-29 Jan Beulich <jbeulich@novell.com>
|
||||
|
||||
* gas/ia64/alloc.[sl]: New.
|
||||
* gas/ia64/ia64.exp: Run new test.
|
||||
|
||||
2005-09-28 Jan Beulich <jbeulich@novell.com>
|
||||
|
||||
* gas/i386/x86-64-stack.s, gas/i386/x86-64-stack.d,
|
||||
|
11
gas/testsuite/gas/ia64/alloc.l
Normal file
11
gas/testsuite/gas/ia64/alloc.l
Normal file
@ -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 .*
|
14
gas/testsuite/gas/ia64/alloc.s
Normal file
14
gas/testsuite/gas/ia64/alloc.s
Normal file
@ -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
|
@ -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" ""
|
||||
|
Loading…
Reference in New Issue
Block a user