diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/tc-ia64.c | 19 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/ia64.exp | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/nostkreg.d | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/nostkreg.s | 9 |
6 files changed, 50 insertions, 9 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 1f50fc2..7dbcef3 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2005-02-17 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. + 2005-02-16 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> * config/tc-mips.c (load_address): Fix formatting. diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index 42aad8f..e43619d 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -7735,7 +7735,6 @@ ia64_parse_name (name, e, nextcharP) { struct const_desc *cdesc; struct dynreg *dr = 0; - unsigned int regnum; unsigned int idx; struct symbol *sym; char *end; @@ -7841,13 +7840,14 @@ ia64_parse_name (name, e, nextcharP) } /* 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; + idx = 2; } break; @@ -7855,7 +7855,7 @@ ia64_parse_name (name, e, nextcharP) if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[3])) { dr = &md.loc; - name += 3; + idx = 3; } break; @@ -7863,7 +7863,7 @@ ia64_parse_name (name, e, nextcharP) if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[3])) { dr = &md.out; - name += 3; + idx = 3; } break; @@ -7871,13 +7871,16 @@ ia64_parse_name (name, e, nextcharP) break; } - if (dr) + /* Ignore register numbers with leading zeroes, except zero itself. */ + 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"); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index d93c49d..680365d 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-02-17 Jan Beulich <jbeulich@novell.com> + + * gas/ia64/nostkreg.[ds]: New. + * gas/ia64/ia64.exp: Run new test. + 2005-02-16 Alan Modra <amodra@bigpond.net.au> * gas/all/gas.exp (quad): Don't run on i960. diff --git a/gas/testsuite/gas/ia64/ia64.exp b/gas/testsuite/gas/ia64/ia64.exp index 2968622..0f1ec68 100644 --- a/gas/testsuite/gas/ia64/ia64.exp +++ b/gas/testsuite/gas/ia64/ia64.exp @@ -46,7 +46,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" diff --git a/gas/testsuite/gas/ia64/nostkreg.d b/gas/testsuite/gas/ia64/nostkreg.d new file mode 100644 index 0000000..e1eee70 --- /dev/null +++ b/gas/testsuite/gas/ia64/nostkreg.d @@ -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);; diff --git a/gas/testsuite/gas/ia64/nostkreg.s b/gas/testsuite/gas/ia64/nostkreg.s new file mode 100644 index 0000000..ecdba2b --- /dev/null +++ b/gas/testsuite/gas/ia64/nostkreg.s @@ -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 |