summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2004-04-21 17:02:19 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>2004-04-21 17:02:19 +0000
commitb4dcfd488e7bf438b934f030668c8ffdfb5a9ad3 (patch)
tree2c75dd3ba824a16844c1f27d411974966c382bea
parentabb13663a66a4e38613848766fe687c276ec41b6 (diff)
downloadgcc-b4dcfd488e7bf438b934f030668c8ffdfb5a9ad3.tar.gz
* expmed.c (expand_mult_highpart_optab): Use narrower version of OP1
in two more places; remove unneeded force_reg git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@80969 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/expmed.c12
2 files changed, 10 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3fc6309c5f5..1e5ac10935c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-04-21 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * expmed.c (expand_mult_highpart_optab): Use narrower version of OP1
+ in two more places; remove unneeded force_reg
+
2004-04-21 Andrew Pinski <pinskia@physics.uc.edu>
* config/rs6000/rs6000.c (symbol_ref_operand): Remove hack
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 3fb76b45a54..3eb745465da 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -2883,6 +2883,7 @@ static rtx
expand_mult_highpart_optab (enum machine_mode mode, rtx op0, rtx op1,
rtx target, int unsignedp, int max_cost)
{
+ rtx narrow_op1 = gen_int_mode (INTVAL (op1), mode);
enum machine_mode wider_mode;
optab moptab;
rtx tem;
@@ -2896,8 +2897,7 @@ expand_mult_highpart_optab (enum machine_mode mode, rtx op0, rtx op1,
if (mul_highpart_cost[(int) mode] < max_cost)
{
moptab = unsignedp ? umul_highpart_optab : smul_highpart_optab;
- tem = expand_binop (mode, moptab, op0,
- gen_int_mode (INTVAL (op1), mode), target,
+ tem = expand_binop (mode, moptab, op0, narrow_op1, target,
unsignedp, OPTAB_DIRECT);
if (tem)
return tem;
@@ -2910,8 +2910,7 @@ expand_mult_highpart_optab (enum machine_mode mode, rtx op0, rtx op1,
< max_cost))
{
moptab = unsignedp ? smul_highpart_optab : umul_highpart_optab;
- tem = expand_binop (mode, moptab, op0,
- gen_int_mode (INTVAL (op1), mode), target,
+ tem = expand_binop (mode, moptab, op0, narrow_op1, target,
unsignedp, OPTAB_DIRECT);
if (tem)
/* We used the wrong signedness. Adjust the result. */
@@ -2924,7 +2923,7 @@ expand_mult_highpart_optab (enum machine_mode mode, rtx op0, rtx op1,
if (moptab->handlers[(int) wider_mode].insn_code != CODE_FOR_nothing
&& mul_widen_cost[(int) wider_mode] < max_cost)
{
- tem = expand_binop (wider_mode, moptab, op0, op1, 0,
+ tem = expand_binop (wider_mode, moptab, op0, narrow_op1, 0,
unsignedp, OPTAB_WIDEN);
if (tem)
return extract_high_half (mode, tem);
@@ -2949,8 +2948,7 @@ expand_mult_highpart_optab (enum machine_mode mode, rtx op0, rtx op1,
&& (mul_widen_cost[(int) wider_mode]
+ 2 * shift_cost[size-1] + 4 * add_cost < max_cost))
{
- rtx regop1 = force_reg (mode, op1);
- tem = expand_binop (wider_mode, moptab, op0, regop1,
+ tem = expand_binop (wider_mode, moptab, op0, narrow_op1,
NULL_RTX, ! unsignedp, OPTAB_WIDEN);
if (tem != 0)
{