From patchwork Mon Nov 19 18:13:39 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [committed] PR target/55276 Date: Mon, 19 Nov 2012 08:13:39 -0000 From: David Edelsohn X-Patchwork-Id: 200055 Message-Id: To: GCC Patches Mans pointed our in the PR that the change to not save VRSAVE register affected saving of callee saved registers. This patch partially reverts the earlier patch so vrsave_mask is computed, but VRSAVE is not written and not saved unless TARGET_ALTIVEC_VRSAVE is set. Committed. - David 2012-11-19 Mans Rullgard PR target/55276 * config/rs6000/rs6000.c (rs6000_stack_info): Always set vrsave_mask for TARGET_ALTIVEC_ABI. Zero vrsave_save_offset if !TARGET_ALTIVEC_VRSAVE. (rs6000_emit_prologue): For SAVE_INLINE_VLRs, check vrsave_size not vrsave_mask. Index: rs6000.c =================================================================== --- rs6000.c (revision 193626) +++ rs6000.c (working copy) @@ -17838,8 +17838,7 @@ else info_ptr->spe_gp_size = 0; - /* Set VRSAVE register if it is saved and restored. */ - if (TARGET_ALTIVEC_ABI && TARGET_ALTIVEC_VRSAVE) + if (TARGET_ALTIVEC_ABI) info_ptr->vrsave_mask = compute_vrsave_mask (); else info_ptr->vrsave_mask = 0; @@ -18027,7 +18026,8 @@ if (! TARGET_ALTIVEC_ABI || info_ptr->altivec_size == 0) info_ptr->altivec_save_offset = 0; - if (! TARGET_ALTIVEC_ABI || info_ptr->vrsave_mask == 0) + /* Zero VRSAVE offset if not saved and restored. */ + if (! TARGET_ALTIVEC_VRSAVE || info_ptr->vrsave_mask == 0) info_ptr->vrsave_save_offset = 0; if (! TARGET_SPE_ABI @@ -20058,7 +20058,7 @@ || (info->altivec_size != 0 && (info->altivec_save_offset + info->altivec_size - 16 + info->total_size - frame_off) > 32767) - || (info->vrsave_mask != 0 + || (info->vrsave_size != 0 && (info->vrsave_save_offset + info->total_size - frame_off) > 32767)) {