diff options
author | Bernd Schmidt <bernds@codesourcery.com> | 2011-10-25 15:45:08 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2011-10-25 15:45:08 +0000 |
commit | 0d53e34681bfbb0849726ee8d3b17cf330a33a76 (patch) | |
tree | d9964adb72e57b741bb3225e2132a5b666ea22a0 /libgcc/config/c6x | |
parent | 5b2d9d9084afb8803644c8e5ec8422d86606f9f0 (diff) | |
download | gcc-0d53e34681bfbb0849726ee8d3b17cf330a33a76.tar.gz |
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
Diffstat (limited to 'libgcc/config/c6x')
-rw-r--r-- | libgcc/config/c6x/pr-support.c | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/libgcc/config/c6x/pr-support.c b/libgcc/config/c6x/pr-support.c index e635a6033c2..2e0958c4a23 100644 --- a/libgcc/config/c6x/pr-support.c +++ b/libgcc/config/c6x/pr-support.c @@ -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) |