aboutsummaryrefslogtreecommitdiff
path: root/gcc/optabs.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2002-05-21 19:54:40 -0600
committerJeff Law <law@gcc.gnu.org>2002-05-21 19:54:40 -0600
commitc7539aa0a66f7ca93def2759d15b6641e0b733fe (patch)
tree18c228fed28fb6169779a104ca3a4b452f6a015e /gcc/optabs.c
parentf87c27b4ab7ed69554e44e8e8eb53e95495abcac (diff)
downloadgcc-c7539aa0a66f7ca93def2759d15b6641e0b733fe.zip
gcc-c7539aa0a66f7ca93def2759d15b6641e0b733fe.tar.gz
gcc-c7539aa0a66f7ca93def2759d15b6641e0b733fe.tar.bz2
optabs.c (expand_binop): For double-word integer multiplies...
* optabs.c (expand_binop): For double-word integer multiplies, do not compute intermediate results into something that is not a register (such as a SUBREG or MEM). From-SVN: r53718
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r--gcc/optabs.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 46b86c5..da43dd1 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -1461,6 +1461,9 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
rtx temp = expand_binop (word_mode, binoptab, op0_low, op1_xhigh,
NULL_RTX, 0, OPTAB_DIRECT);
+ if (!REG_P (product_high))
+ product_high = force_reg (word_mode, product_high);
+
if (temp != 0)
temp = expand_binop (word_mode, add_optab, temp, product_high,
product_high, 0, next_methods);
@@ -1480,6 +1483,8 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods)
if (temp != 0 && temp != product_high)
emit_move_insn (product_high, temp);
+ emit_move_insn (operand_subword (product, high, 1, mode), product_high);
+
if (temp != 0)
{
if (mov_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)