https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82981

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
That might not be that easy without repeating there big chunks of internal-fn.c
stuff.
In any case, what is mips64r6 using?
From the above it seems it doesn't have a corresponding optab, so
  if (icode == CODE_FOR_nothing)
is true.  Thus, is it:
      if (GET_MODE_2XWIDER_MODE (mode).exists (&wmode)
          && targetm.scalar_mode_supported_p (wmode))
or
      else if (int_mode_for_size (prec / 2, 1).exists (&hmode)
               && 2 * GET_MODE_PRECISION (hmode) == prec)
or the fallback case that doesn't report overflow:
      else
        {
          gcc_assert (!is_ubsan);
          ops.code = MULT_EXPR;
          ops.type = type;
          res = expand_expr_real_2 (&ops, NULL_RTX, mode, EXPAND_NORMAL);
          emit_jump (done_label);
        }
?  If it is the first one from these, perhaps we should have some extra checks
there whether WIDEN_MULT_EXPR will be emitted as a library call or not.
Though, if mips64r6 has hipart multiplication, I don't see why it couldn't
handle the widening multiplication by performing normal DImode multiplication
plus highpart DImode multiplication or something similar.

Reply via email to