From 190e95346588b771817f4ebc2a4c0c46b9a46371 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 7 Jun 2006 12:07:24 +0000 Subject: [PATCH] re PR target/27390 (gcc.target/x86_64/abi/test_complex_returning.c execution fails at -O0) 2006-06-07 Paolo Bonzini PR target/27390 * reg-stack.c (subst_stack_regs_pat): Reorder resetting of the imaginary and real parts of a clobbered register. Emit insn to set the imaginary part. From-SVN: r114462 --- gcc/ChangeLog | 7 +++++++ gcc/reg-stack.c | 18 +++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2d79f7b1148..4c72bd917d3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-06-07 Paolo Bonzini + + PR target/27390 + * reg-stack.c (subst_stack_regs_pat): Reorder resetting of + the imaginary and real parts of a clobbered register. + Emit insn to set the imaginary part. + 2006-06-06 Peter Lemieszewski * config/s390/t-tpf (LIB2ADDEH): Include unwind-dw2-fde-glibc.c diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index bb2e1a1f9c6..83f4ebb081e 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -1371,16 +1371,20 @@ subst_stack_regs_pat (rtx insn, stack regstack, rtx pat) if (!note) { rtx t = *dest; + if (COMPLEX_MODE_P (GET_MODE (t))) + { + rtx u = FP_MODE_REG (REGNO (t) + 1, SFmode); + if (get_hard_regnum (regstack, u) == -1) + { + rtx pat2 = gen_rtx_CLOBBER (VOIDmode, u); + rtx insn2 = emit_insn_before (pat2, insn); + control_flow_insn_deleted + |= move_nan_for_stack_reg (insn2, regstack, u); + } + } if (get_hard_regnum (regstack, t) == -1) control_flow_insn_deleted |= move_nan_for_stack_reg (insn, regstack, t); - if (COMPLEX_MODE_P (GET_MODE (t))) - { - t = FP_MODE_REG (REGNO (t) + 1, DFmode); - if (get_hard_regnum (regstack, t) == -1) - control_flow_insn_deleted - |= move_nan_for_stack_reg (insn, regstack, t); - } } } }