https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92865
--- Comment #6 from Hongtao.liu <crazylht at gmail dot com> --- The missing point of my patch is for 512-bit vector compare, integer mask vector compare still should be used even with target_xop, that's the root cause of this issue. Refer to this part. --------------- - if (GET_MODE_SIZE (cmp_ops_mode) == 64) + if (ix86_valid_mask_cmp_mode (cmp_ops_mode)) { unsigned int nbits = GET_MODE_NUNITS (cmp_ops_mode); - cmp_mode = int_mode_for_size (nbits, 0).require (); maskcmp = true; + cmp_mode = nbits > 8 ? int_mode_for_size (nbits, 0).require () : E_QImode; } else cmp_mode = cmp_ops_mode; @@ -3461,37 +3484,6 @@ ix86_expand_sse_cmp (rtx dest, enum rtx_code code, rtx cmp_op0, rtx cmp_op1, || (op_false && reg_overlap_mentioned_p (dest, op_false))) dest = gen_reg_rtx (maskcmp ? cmp_mode : mode); - /* Compare patterns for int modes are unspec in AVX512F only. */ - if (maskcmp && (code == GT || code == EQ)) - { - rtx (*gen)(rtx, rtx, rtx); - - switch (cmp_ops_mode) - { - case E_V64QImode: - gcc_assert (TARGET_AVX512BW); - gen = code == GT ? gen_avx512bw_gtv64qi3 : gen_avx512bw_eqv64qi3_1; - break; - case E_V32HImode: - gcc_assert (TARGET_AVX512BW); - gen = code == GT ? gen_avx512bw_gtv32hi3 : gen_avx512bw_eqv32hi3_1; - break; - case E_V16SImode: - gen = code == GT ? gen_avx512f_gtv16si3 : gen_avx512f_eqv16si3_1; - break; - case E_V8DImode: - gen = code == GT ? gen_avx512f_gtv8di3 : gen_avx512f_eqv8di3_1; - break; - default: - gen = NULL; - } - - if (gen) - { - emit_insn (gen (dest, cmp_op0, cmp_op1)); - return dest; - } - } x = gen_rtx_fmt_ee (code, cmp_mode, cmp_op0, cmp_op1); if (cmp_mode != mode && !maskcmp) -------------------------