summaryrefslogtreecommitdiff
path: root/gcc/expmed.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r--gcc/expmed.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 4565bcce99e..fa8972dd177 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -3397,7 +3397,7 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val,
rtx
expand_mult (machine_mode mode, rtx op0, rtx op1, rtx target,
- int unsignedp)
+ int unsignedp, bool no_libcall)
{
enum mult_variant variant;
struct algorithm algorithm;
@@ -3533,14 +3533,16 @@ expand_mult (machine_mode mode, rtx op0, rtx op1, rtx target,
{
op0 = force_reg (GET_MODE (op0), op0);
return expand_binop (mode, add_optab, op0, op0,
- target, unsignedp, OPTAB_LIB_WIDEN);
+ target, unsignedp,
+ no_libcall ? OPTAB_WIDEN : OPTAB_LIB_WIDEN);
}
/* This used to use umul_optab if unsigned, but for non-widening multiply
there is no difference between signed and unsigned. */
op0 = expand_binop (mode, do_trapv ? smulv_optab : smul_optab,
- op0, op1, target, unsignedp, OPTAB_LIB_WIDEN);
- gcc_assert (op0);
+ op0, op1, target, unsignedp,
+ no_libcall ? OPTAB_WIDEN : OPTAB_LIB_WIDEN);
+ gcc_assert (op0 || no_libcall);
return op0;
}