mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
5b2d9d9084
commit
0d53e34681
|
@ -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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
Loading…
Reference in New Issue