]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
pr-support.c (pop_compact_frame, pop_frame): Correct logic for doubleword pops.
authorBernd Schmidt <bernds@codesourcery.com>
Tue, 25 Oct 2011 15:45:08 +0000 (15:45 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Tue, 25 Oct 2011 15:45:08 +0000 (15:45 +0000)
* config/c6x/pr-support.c (pop_compact_frame, pop_frame): Correct
logic for doubleword pops.

From-SVN: r180435

libgcc/ChangeLog
libgcc/config/c6x/pr-support.c

index e39fccc322c4cbc95ec5ff30da6b56f99601d849..2ceb1921591b3ad48788997cc54aa6757b00985f 100644 (file)
@@ -3,6 +3,9 @@
        * config/c6x/pr-support.c (__gnu_unwind_24bit): Correct logic for the
        case where B3 isn't the return register.
 
+       * config/c6x/pr-support.c (pop_compact_frame, pop_frame): Correct
+       logic for doubleword pops.
+
 2011-10-25  Andreas Tobler  <andreast@fgznet.ch>
 
        * config/rs6000/t-freebsd: Add wildcard.
index e635a6033c26e363b20ed081c73fadb20acc5410..2e0958c4a23bec3bc5a97be489e315b280bd477a 100644 (file)
@@ -153,10 +153,7 @@ pop_compact_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp)
 {
   int size;
   _uw test;
-  int i;
-  int regno;
-  int regno2;
-  int nregs;
+  int i, regno, nregs;
 
   size = 0;
   nregs = __builtin_popcount (mask);
@@ -167,13 +164,11 @@ pop_compact_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp)
        continue;
 
       regno = unwind_frame_regs[12 - i];
-      /* The last slot is a sigle word, so cannot store a register pair.  */
-      if (nregs > 2)
-       regno2 = unwind_frame_regs[13 - i];
-      else
-       regno2 = 0xff;
 
-      if ((mask & (test << 1)) != 0 && regno2 == regno + 1 && (regno & 1) == 0)
+      if (i < 12 && nregs > 2
+         && (mask & (test << 1)) != 0
+         && unwind_frame_regs[11 - i] == regno + 1
+         && (regno & 1) == 0)
        {
          i++;
          nregs--;
@@ -196,12 +191,11 @@ pop_compact_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp)
        continue;
 
       regno = unwind_frame_regs[12 - i];
-      if (nregs > 2)
-       regno2 = unwind_frame_regs[13 - i];
-      else
-       regno2 = 0xff;
 
-      if ((mask & (test << 1)) != 0 && regno2 == regno + 1 && (regno & 1) == 0)
+      if (i < 12 && nregs > 2
+         && (mask & (test << 1)) != 0
+         && unwind_frame_regs[11 - i] == regno + 1
+         && (regno & 1) == 0)
        {
          /* Register pair.  */
          unwind_restore_pair (context, regno, ptr);
@@ -243,7 +237,7 @@ pop_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp)
       if ((mask & (1 << i)) == 0)
        continue;
       regno = unwind_frame_regs[12 - i];
-      if (i < 12 && unwind_frame_regs[13 - i] == (regno + 1)
+      if (i < 12 && unwind_frame_regs[11 - i] == (regno + 1)
          && (mask & (1 << (i + 1))) != 0
          && (((_uw)ptr) & 4) == 0
          && (regno & 1) == 0)