diff options
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 32 |
1 files changed, 21 insertions, 11 deletions
@@ -2987,7 +2987,7 @@ emit_move_resolve_push (enum machine_mode mode, rtx x) X is known to satisfy push_operand, and MODE is known to be complex. Returns the last instruction emitted. */ -static rtx +rtx emit_move_complex_push (enum machine_mode mode, rtx x, rtx y) { enum machine_mode submode = GET_MODE_INNER (mode); @@ -3027,6 +3027,25 @@ emit_move_complex_push (enum machine_mode mode, rtx x, rtx y) read_complex_part (y, !imag_first)); } +/* A subroutine of emit_move_complex. Perform the move from Y to X + via two moves of the parts. Returns the last instruction emitted. */ + +rtx +emit_move_complex_parts (rtx x, rtx y) +{ + /* Show the output dies here. This is necessary for SUBREGs + of pseudos since we cannot track their lifetimes correctly; + hard regs shouldn't appear here except as return values. */ + if (!reload_completed && !reload_in_progress + && REG_P (x) && !reg_overlap_mentioned_p (x, y)) + emit_insn (gen_rtx_CLOBBER (VOIDmode, x)); + + write_complex_part (x, read_complex_part (y, false), false); + write_complex_part (x, read_complex_part (y, true), true); + + return get_last_insn (); +} + /* A subroutine of emit_move_insn_1. Generate a move from Y into X. MODE is known to be complex. Returns the last instruction emitted. */ @@ -3081,16 +3100,7 @@ emit_move_complex (enum machine_mode mode, rtx x, rtx y) return ret; } - /* Show the output dies here. This is necessary for SUBREGs - of pseudos since we cannot track their lifetimes correctly; - hard regs shouldn't appear here except as return values. */ - if (!reload_completed && !reload_in_progress - && REG_P (x) && !reg_overlap_mentioned_p (x, y)) - emit_insn (gen_rtx_CLOBBER (VOIDmode, x)); - - write_complex_part (x, read_complex_part (y, false), false); - write_complex_part (x, read_complex_part (y, true), true); - return get_last_insn (); + return emit_move_complex_parts (x, y); } /* A subroutine of emit_move_insn_1. Generate a move from Y into X. |