https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114402
--- Comment #1 from Kewen Lin <linkw at gcc dot gnu.org> --- Currently the only pattern to match IEEE128 comparison is: ;; IEEE 128-bit comparisons (define_insn "*cmp<mode>_hw" [(set (match_operand:CCFP 0 "cc_reg_operand" "=y") (compare:CCFP (match_operand:IEEE128 1 "altivec_register_operand" "v") (match_operand:IEEE128 2 "altivec_register_operand" "v")))] "TARGET_FLOAT128_HW && FLOAT128_IEEE_P (<MODE>mode)" "xscmpuqp %0,%1,%2" [(set_attr "type" "veccmp") (set_attr "size" "128")]) It requires TARGET_FLOAT128_HW, so nothing can be used for matching. The below patch can fix this ICE, it makes no-vsx IEEE128 also go with libfunc call like !TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode). diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 5d975dab921..237d138faec 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -15329,7 +15329,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode) rtx op0 = XEXP (cmp, 0); rtx op1 = XEXP (cmp, 1); - if (!TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode)) + if (!TARGET_FLOAT128_HW && FLOAT128_IEEE_P (mode)) comp_mode = CCmode; else if (FLOAT_MODE_P (mode)) comp_mode = CCFPmode; @@ -15361,7 +15361,7 @@ rs6000_generate_compare (rtx cmp, machine_mode mode) /* IEEE 128-bit support in VSX registers when we do not have hardware support. */ - if (!TARGET_FLOAT128_HW && FLOAT128_VECTOR_P (mode)) + if (!TARGET_FLOAT128_HW && FLOAT128_IEEE_P (mode)) { rtx libfunc = NULL_RTX; bool check_nan = false;