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

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Actually, it ICEs for me only if auto-host.h doesn't have HAVE_POPCNTD defined.
And the problem is in mismatch of the conditions:
(define_expand "fixuns_trunc<mode>di2"
  [(set (match_operand:DI 0 "register_operand" "")
        (unsigned_fix:DI (match_operand:SFDF 1 "register_operand" "")))]
  "TARGET_HARD_FLOAT && (TARGET_FCTIDUZ || VECTOR_UNIT_VSX_P (<MODE>mode))"
  "")

(define_insn "*fixuns_trunc<mode>di2_fctiduz"
  [(set (match_operand:DI 0 "gpc_reg_operand" "=d,wi")
        (unsigned_fix:DI (match_operand:SFDF 1 "gpc_reg_operand"
"<Ff>,<Fv>")))]
  "TARGET_HARD_FLOAT && TARGET_DOUBLE_FLOAT && TARGET_FPRS
    && TARGET_FCTIDUZ"
  "@
   fctiduz %0,%1
   xscvdpuxds %x0,%x1"
  [(set_attr "type" "fp")])

If TARGET_FCTIDUZ is 0, then the second insn isn't enabled at all, while
VECTOR_UNIT_VSX_P (DFmode) can still be true and then there is no insn to
actually satisfy that.  So, shall there be another define_insn like
*fixuns_trunc<mode>di2_fctiduz for the !TARGET_FCTIDUZ case that will handle
the VECTOR_UNIT_VSX_P (<MODE>mode) cases otherwise?  Or just enable it under
the same condition as the expander and if not TARGET_FCTIDUZ disable the first
alternative?  Also, why doesn't the define_expand have && TARGET_DOUBLE_FLOAT
&& TARGET_FPRS conditions?

Reply via email to