Commit 0d53e346 by Bernd Schmidt Committed by Bernd Schmidt

pr-support.c (pop_compact_frame, pop_frame): Correct logic for doubleword pops.

	* config/c6x/pr-support.c (pop_compact_frame, pop_frame): Correct
	logic for doubleword pops.

From-SVN: r180435
parent 5b2d9d90
...@@ -3,6 +3,9 @@ ...@@ -3,6 +3,9 @@
* config/c6x/pr-support.c (__gnu_unwind_24bit): Correct logic for the * config/c6x/pr-support.c (__gnu_unwind_24bit): Correct logic for the
case where B3 isn't the return register. 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> 2011-10-25 Andreas Tobler <andreast@fgznet.ch>
* config/rs6000/t-freebsd: Add wildcard. * config/rs6000/t-freebsd: Add wildcard.
......
...@@ -153,10 +153,7 @@ pop_compact_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp) ...@@ -153,10 +153,7 @@ pop_compact_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp)
{ {
int size; int size;
_uw test; _uw test;
int i; int i, regno, nregs;
int regno;
int regno2;
int nregs;
size = 0; size = 0;
nregs = __builtin_popcount (mask); nregs = __builtin_popcount (mask);
...@@ -167,13 +164,11 @@ pop_compact_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp) ...@@ -167,13 +164,11 @@ pop_compact_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp)
continue; continue;
regno = unwind_frame_regs[12 - i]; 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++; i++;
nregs--; nregs--;
...@@ -196,12 +191,11 @@ pop_compact_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp) ...@@ -196,12 +191,11 @@ pop_compact_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp)
continue; continue;
regno = unwind_frame_regs[12 - i]; 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. */ /* Register pair. */
unwind_restore_pair (context, regno, ptr); unwind_restore_pair (context, regno, ptr);
...@@ -243,7 +237,7 @@ pop_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp) ...@@ -243,7 +237,7 @@ pop_frame (_Unwind_Context * context, _uw mask, _uw *ptr, int inc_sp)
if ((mask & (1 << i)) == 0) if ((mask & (1 << i)) == 0)
continue; continue;
regno = unwind_frame_regs[12 - i]; 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 && (mask & (1 << (i + 1))) != 0
&& (((_uw)ptr) & 4) == 0 && (((_uw)ptr) & 4) == 0
&& (regno & 1) == 0) && (regno & 1) == 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment