diff options
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r-- | gcc/expmed.c | 12 |
1 files changed, 5 insertions, 7 deletions
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) { |