From: DJ Delorie Date: Fri, 8 Jan 2010 19:02:28 +0000 (-0500) Subject: sh.c (sh_expand_epilogue): Fix interrupt handler register popping order. X-Git-Tag: releases/gcc-4.5.0~1334 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6a62ca52285abbd6295a31a62bc1358e902979c9;p=thirdparty%2Fgcc.git sh.c (sh_expand_epilogue): Fix interrupt handler register popping order. * config/sh/sh.c (sh_expand_epilogue): Fix interrupt handler register popping order. From-SVN: r155742 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f7f36f80486..fdf4c850516d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-01-08 DJ Delorie + + * config/sh/sh.c (sh_expand_epilogue): Fix interrupt handler + register popping order. + 2010-01-08 Richard Guenther PR lto/42528 diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 5fe752eac200..aaa745dbbb92 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -7254,13 +7254,13 @@ sh_expand_epilogue (bool sibcall_p) pop (PR_REG); } - /* Banked registers are poped first to avoid being scheduled in the + /* Banked registers are popped first to avoid being scheduled in the delay slot. RTE switches banks before the ds instruction. */ if (current_function_interrupt) { - for (i = FIRST_BANKED_REG; i <= LAST_BANKED_REG; i++) - if (TEST_HARD_REG_BIT (live_regs_mask, i)) - pop (LAST_BANKED_REG - i); + for (i = LAST_BANKED_REG; i >= FIRST_BANKED_REG; i--) + if (TEST_HARD_REG_BIT (live_regs_mask, i)) + pop (i); last_reg = FIRST_PSEUDO_REGISTER - LAST_BANKED_REG - 1; }