summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2005-09-29 07:00:54 +0000
committerJan Beulich <jbeulich@novell.com>2005-09-29 07:00:54 +0000
commitef0241e727d448bf82983b97aa4c2dbe6b66c0d4 (patch)
treec12875f7d5b4c2cfa2877601e27fe5a6f81b4743 /gas
parentc9c5dcdafcab3311b88e0d23f244c9879b9455b6 (diff)
downloadbinutils-gdb-ef0241e727d448bf82983b97aa4c2dbe6b66c0d4.tar.gz
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.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-ia64.c58
-rw-r--r--gas/testsuite/ChangeLog5
-rw-r--r--gas/testsuite/gas/ia64/alloc.l11
-rw-r--r--gas/testsuite/gas/ia64/alloc.s14
-rw-r--r--gas/testsuite/gas/ia64/ia64.exp1
6 files changed, 67 insertions, 27 deletions
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 <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>
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 <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,
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" ""