From c9e8cb32e3e00dcb180e6c14f14d5ff4636c86a0 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Fri, 2 Nov 2001 16:53:25 -0500 Subject: [PATCH] rs6000.c (rs6000_emit_move): Make sure that using FP registers for DImode mem-mem moves is acceptable. * config/rs6000/rs6000.c (rs6000_emit_move): Make sure that using FP registers for DImode mem-mem moves is acceptable. From-SVN: r46720 --- gcc/ChangeLog | 5 +++++ gcc/config/rs6000/rs6000.c | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 95ea42222d1..c2c619f3d3c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-11-02 DJ Delorie + + * config/rs6000/rs6000.c (rs6000_emit_move): Make sure that + using FP registers for DImode mem-mem moves is acceptable. + 2001-11-02 Aldy Hernandez * builtins.c (apply_args_size): Handle vector arguments. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index a87e4ef2c0f..f10cef5aee8 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1805,6 +1805,25 @@ rs6000_emit_move (dest, source, mode) || (CONST_DOUBLE_HIGH (operands[1]) == -1 && CONST_DOUBLE_LOW (operands[1]) < 0))) abort (); + + /* Check if GCC is setting up a block move that will end up using FP + registers as temporaries. We must make sure this is acceptable. */ + if (GET_CODE (operands[0]) == MEM + && GET_CODE (operands[1]) == MEM + && mode == DImode + && ! TARGET_POWERPC64 + && (SLOW_UNALIGNED_ACCESS(DImode, MEM_ALIGN(operands[0])) + || SLOW_UNALIGNED_ACCESS(DImode, MEM_ALIGN(operands[1])))) + { + rtx reg1, reg2; + reg1 = gen_reg_rtx(SImode); + reg2 = gen_reg_rtx(SImode); + rs6000_emit_move (reg1, simplify_subreg (SImode, operands[1], DImode, 0), SImode); + rs6000_emit_move (reg2, simplify_subreg (SImode, operands[1], DImode, 4), SImode); + rs6000_emit_move (simplify_subreg (SImode, operands[0], DImode, 0), reg1, SImode); + rs6000_emit_move (simplify_subreg (SImode, operands[0], DImode, 4), reg2, SImode); + return; + } if (! no_new_pseudos && GET_CODE (operands[0]) != REG) operands[1] = force_reg (mode, operands[1]);