mirror of git://gcc.gnu.org/git/gcc.git
arm.c (arm_emit_coreregs_64bit_shift): Clear the result register only if "in" and "out" are different registers.
2016-10-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
* config/arm/arm.c (arm_emit_coreregs_64bit_shift): Clear the result
register only if "in" and "out" are different registers.
From-SVN: r241348
This commit is contained in:
parent
29849c91e4
commit
c6cc81d613
|
|
@ -1,3 +1,8 @@
|
||||||
|
2016-10-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
|
||||||
|
|
||||||
|
* config/arm/arm.c (arm_emit_coreregs_64bit_shift): Clear the result
|
||||||
|
register only if "in" and "out" are different registers.
|
||||||
|
|
||||||
2016-10-19 Eric Botcazou <ebotcazou@adacore.com>
|
2016-10-19 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
* omp-low.c (pass_oacc_device_lower::gate): New method.
|
* omp-low.c (pass_oacc_device_lower::gate): New method.
|
||||||
|
|
|
||||||
|
|
@ -29218,8 +29218,10 @@ arm_emit_coreregs_64bit_shift (enum rtx_code code, rtx out, rtx in,
|
||||||
|
|
||||||
/* Clearing the out register in DImode first avoids lots
|
/* Clearing the out register in DImode first avoids lots
|
||||||
of spilling and results in less stack usage.
|
of spilling and results in less stack usage.
|
||||||
Later this redundant insn is completely removed. */
|
Later this redundant insn is completely removed.
|
||||||
emit_insn (SET (out, const0_rtx));
|
Do that only if "in" and "out" are different registers. */
|
||||||
|
if (REG_P (out) && REG_P (in) && REGNO (out) != REGNO (in))
|
||||||
|
emit_insn (SET (out, const0_rtx));
|
||||||
emit_insn (SET (out_down, LSHIFT (code, in_down, amount)));
|
emit_insn (SET (out_down, LSHIFT (code, in_down, amount)));
|
||||||
emit_insn (SET (out_down,
|
emit_insn (SET (out_down,
|
||||||
ORR (REV_LSHIFT (code, in_up, reverse_amount),
|
ORR (REV_LSHIFT (code, in_up, reverse_amount),
|
||||||
|
|
@ -29231,11 +29233,14 @@ arm_emit_coreregs_64bit_shift (enum rtx_code code, rtx out, rtx in,
|
||||||
/* Shifts by a constant greater than 31. */
|
/* Shifts by a constant greater than 31. */
|
||||||
rtx adj_amount = GEN_INT (INTVAL (amount) - 32);
|
rtx adj_amount = GEN_INT (INTVAL (amount) - 32);
|
||||||
|
|
||||||
emit_insn (SET (out, const0_rtx));
|
if (REG_P (out) && REG_P (in) && REGNO (out) != REGNO (in))
|
||||||
|
emit_insn (SET (out, const0_rtx));
|
||||||
emit_insn (SET (out_down, SHIFT (code, in_up, adj_amount)));
|
emit_insn (SET (out_down, SHIFT (code, in_up, adj_amount)));
|
||||||
if (code == ASHIFTRT)
|
if (code == ASHIFTRT)
|
||||||
emit_insn (gen_ashrsi3 (out_up, in_up,
|
emit_insn (gen_ashrsi3 (out_up, in_up,
|
||||||
GEN_INT (31)));
|
GEN_INT (31)));
|
||||||
|
else
|
||||||
|
emit_insn (SET (out_up, const0_rtx));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue