[PATCH] ia64: certain symbol names were unusable
Jan Beulich
JBeulich@novell.com
Tue Feb 8 17:05:00 GMT 2005
Variables starting with 'in', 'loc', or 'out' and continuing with
decimal
numbers not fitting the 0-95 range (used for the stacked register
aliases) or
starting with zeroes were considered reserved, while they really
aren't.
Rotating registers allocated through .rotX could not start with 'in',
'loc',
or 'out' followed by at least one digit (and then anything) at all.
Built and tested on ia64-unknown-linux-gnu.
Jan
gas/
2005-02-08 Jan Beulich <jbeulich@novell.com>
* config/tc-ia64.c (ia64_parse_name): Don't advance 'name' when
parsing inN, locN, outN. Set 'idx' to offset register number
starts
at. Don't handle numbers with leading zeroes or beyond 95.
Remove
pointless cast.
gas/testsuite/
2005-02-08 Jan Beulich <jbeulich@novell.com>
* gas/ia64/nostkreg.[ds]: New.
* gas/ia64/ia64.exp: Run new test.
---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/config/tc-ia64.c 2005-02-02
08:33:18.000000000 +0100
+++ 2005-02-08/gas/config/tc-ia64.c 2005-02-08 12:05:12.000000000
+0100
@@ -7586,7 +7586,7 @@ ia64_parse_name (name, e)
{
struct const_desc *cdesc;
struct dynreg *dr = 0;
- unsigned int regnum;
+ unsigned int idx;
struct symbol *sym;
char *end;
@@ -7608,43 +7608,37 @@ ia64_parse_name (name, e)
}
/* check for inN, locN, or outN: */
+ idx = 0;
switch (name[0])
{
case 'i':
- if (name[1] == 'n' && ISDIGIT (name[2]))
- {
- dr = &md.in;
- name += 2;
- }
+ if (name[1] == 'n' && ISDIGIT (name[idx = 2]))
+ dr = &md.in;
break;
case 'l':
- if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[3]))
- {
- dr = &md.loc;
- name += 3;
- }
+ if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[idx =
3]))
+ dr = &md.loc;
break;
case 'o':
- if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[3]))
- {
- dr = &md.out;
- name += 3;
- }
+ if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[idx =
3]))
+ dr = &md.out;
break;
default:
break;
}
- if (dr)
+ if (dr && (name[idx] != '0' || name[idx + 1] == '\0'))
{
+ unsigned long regnum;
+
/* The name is inN, locN, or outN; parse the register number.
*/
- regnum = strtoul (name, &end, 10);
- if (end > name && *end == '\0')
+ regnum = strtoul (name + idx, &end, 10);
+ if (end > name + idx && *end == '\0' && regnum < 96)
{
- if ((unsigned) regnum >= dr->num_regs)
+ if (regnum >= dr->num_regs)
{
if (!dr->num_regs)
as_bad ("No current frame");
---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/ia64.exp 2005-02-02
08:33:18.000000000 +0100
+++ 2005-02-08/gas/testsuite/gas/ia64/ia64.exp 2005-02-08
11:43:19.000000000 +0100
@@ -44,7 +44,8 @@ if [istarget "ia64-*"] then {
run_dump_test "ldxmov-1"
run_list_test "ldxmov-2" ""
run_dump_test "ltoff22x-1"
-
+
+ run_dump_test "nostkreg"
run_list_test "invalid-ar" ""
run_dump_test "dependency-1"
---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/nostkreg.d 1970-01-01
01:00:00.000000000 +0100
+++ 2005-02-08/gas/testsuite/gas/ia64/nostkreg.d 2005-02-04
15:02:33.000000000 +0100
@@ -0,0 +1,16 @@
+#objdump: -dr
+#name: ia64 not stacked registers
+
+.*: +file format .*
+
+Disassembly of section \.text:
+
+0+000 <_start>:
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+\[M[IM]I\][[:space:]]+mov[[:space:]]+r5=0
+[[:space:]]+0:[[:space:]]+IMM22[[:space:]]+in00
+[[:space:]]+1:[[:space:]]+IMM22[[:space:]]+loc96
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+mov[[:space:]]+r6=0
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+mov[[:space:]]+r7=r32
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+\[M[IM]B\][[:space:]]+mov[[:space:]]+r8=r34
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+mov[[:space:]]+r9=r36
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+br\.ret\.sptk\.few[[:space:]]+(b0|rp);;
---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/nostkreg.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-02-08/gas/testsuite/gas/ia64/nostkreg.s 2005-02-04
14:47:29.000000000 +0100
@@ -0,0 +1,9 @@
+_start:
+ mov r5 = in00
+ mov r6 = loc96
+ .regstk 2, 6, 2, 8
+ .rotr in0I[2], loc1L[2], out2O[2]
+ mov r7 = in0I[0]
+ mov r8 = loc1L[0]
+ mov r9 = out2O[0]
+ br.ret.sptk rp
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: binutils-mainline-ia64-in-loc-out.patch
URL: <https://sourceware.org/pipermail/binutils/attachments/20050208/c9349100/attachment.ksh>
More information about the Binutils
mailing list