gas/
authorJan Beulich <jbeulich@novell.com>
Thu, 17 Feb 2005 07:43:12 +0000 (07:43 +0000)
committerJan Beulich <jbeulich@novell.com>
Thu, 17 Feb 2005 07:43:12 +0000 (07:43 +0000)
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.

gas/testsuite/
2005-02-17  Jan Beulich  <jbeulich@novell.com>

* gas/ia64/nostkreg.[ds]: New.
* gas/ia64/ia64.exp: Run new test.

gas/ChangeLog
gas/config/tc-ia64.c
gas/testsuite/ChangeLog
gas/testsuite/gas/ia64/ia64.exp
gas/testsuite/gas/ia64/nostkreg.d [new file with mode: 0644]
gas/testsuite/gas/ia64/nostkreg.s [new file with mode: 0644]

index 1f50fc2..7dbcef3 100644 (file)
@@ -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.
index 42aad8f..e43619d 100644 (file)
@@ -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");
index d93c49d..680365d 100644 (file)
@@ -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.
index 2968622..0f1ec68 100644 (file)
@@ -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 (file)
index 0000000..e1eee70
--- /dev/null
@@ -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 (file)
index 0000000..ecdba2b
--- /dev/null
@@ -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