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 * 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 * 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