From c7539aa0a66f7ca93def2759d15b6641e0b733fe Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 21 May 2002 19:54:40 -0600 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 ++++ gcc/optabs.c | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dbdb2f4670c..dcb685d466d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -42,6 +42,10 @@ 2002-05-21 Jeffrey A Law + * 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). + * i386.c (ix86_sched_reorder_ppro): Fix typo/thinko. (ix86_sched_reorder): Make sure to initialize scheduling data even when there's only one insn in the ready queue. diff --git a/gcc/optabs.c b/gcc/optabs.c index 46b86c534da..da43dd18417 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) -- 2.30.2