From: Richard Stallman Date: Wed, 3 Nov 1993 21:16:16 +0000 (+0000) Subject: (output_move_double): Fix up the test for overlap X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3a58400f8515d6768877c47b7592daa0f0c7cd82;p=gcc.git (output_move_double): Fix up the test for overlap of source address with operands[0]. From-SVN: r5987 --- diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c index 4f71e0591bf..1e29a6db6a7 100644 --- a/gcc/config/m68k/m68k.c +++ b/gcc/config/m68k/m68k.c @@ -1077,11 +1077,14 @@ output_move_double (operands) if (optype0 == REGOP && (optype1 == OFFSOP || optype1 == MEMOP)) { - if (reg_overlap_mentioned_p (operands[0], XEXP (operands[1], 0)) + rtx testlow = gen_rtx (REG, SImode, REGNO (operands[0])); + + if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0)) && reg_overlap_mentioned_p (latehalf[0], XEXP (operands[1], 0))) { /* If both halves of dest are used in the src memory address, - compute the address into latehalf of dest. */ + compute the address into latehalf of dest. + Note that this can't happen if the dest is two data regs. */ compadr: xops[0] = latehalf[0]; xops[1] = XEXP (operands[1], 0); @@ -1102,8 +1105,13 @@ compadr: && reg_overlap_mentioned_p (middlehalf[0], XEXP (operands[1], 0))) { - /* Check for two regs used by both source and dest. */ - if (reg_overlap_mentioned_p (operands[0], XEXP (operands[1], 0)) + /* Check for two regs used by both source and dest. + Note that this can't happen if the dest is all data regs. + It can happen if the dest is d6, d7, a0. + But in that case, latehalf is an addr reg, so + the code at compadr does ok. */ + + if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0)) || reg_overlap_mentioned_p (latehalf[0], XEXP (operands[1], 0))) goto compadr;