> +/* RCODE0, RCODE1 and a valid return value should be enum rtx_code. > + TCODE should be enum tree_code. > + Check whether two compares are a valid combination in the target to > generate > + a conditional compare. If valid, return the new compare after > combination. > + */ > +DEFHOOK > +(legitimize_cmp_combination, > + "This target hook returns the dominance compare if the two compares are\n\ > +a valid combination. This target hook is required only when the target\n\ > +supports conditional compare, such as ARM.", > + int, (int rcode0, int rcode1, int tcode), > + default_legitimize_cmp_combination) > + > +/* RCODE0, RCODE1 and a valid return value should be enum rtx_code. > + TCODE should be enum tree_code. > + Check whether two compares are a valid combination in the target to > generate > + a conditional compare. If valid, return the new compare after > combination. > + The difference from legitimize_cmp_combination is that its first compare > is > + the result of a previous conditional compare, which leads to more > constrain > + on it, since no way to swap the two compares. */ > +DEFHOOK > +(legitimize_ccmp_combination, > + "This target hook returns the dominance compare if the two compares are\n\ > +a valid combination. This target hook is required only when the target\n\ > +supports conditional compare, such as ARM.", > + int, (int rcode0, int rcode1, int tcode), > + default_legitimize_ccmp_combination) > +
Why do these hooks still exist? They should be redundant with ... > +/* CMP0 and CMP1 are two compares. USED_AS_CC_P indicates whether the target > + is used as CC or not. TCODE should be enum tree_code. > + The hook will return a condtional compare RTX if all checkes are OK. */ > +DEFHOOK > +(gen_ccmp_with_cmp_cmp, > + "This target hook returns a condtional compare RTX if the two compares > are\n\ > +a valid combination. This target hook is required only when the target\n\ > +supports conditional compare, such as ARM.", > + rtx, (gimple cmp0, gimple cmp1, int tcode, bool used_as_cc_p), > + default_gen_ccmp_with_cmp_cmp) > + > +/* CC is the result of a previous conditional compare. CMP1 is a compare. > + USED_AS_CC_P indicates whether the target is used as CC or not. > + TCODE should be enum tree_code. > + The hook will return a condtional compare rtx if all checkes are OK. */ > +DEFHOOK > +(gen_ccmp_with_ccmp_cmp, > + "This target hook returns a condtional compare RTX if the CC and CMP1 are\n\ > +a valid combination. This target hook is required only when the target\n\ > +supports conditional compare, such as ARM.", > + rtx, (rtx cc, gimple cmp1, int tcode, bool used_as_cc_p), > + default_gen_ccmp_with_ccmp_cmp) > + ... these. Why in the world are you passing down gimple to the backends? The expand_operands done therein should have been done in expr.c. The hooks are still not what I suggested, particularly gen_ccmp_with_cmp_cmp is what I was trying to avoid, passing down two initial compares like that. To be 100% explicit this time, I think the hooks should be DEFHOOK (gen_ccmp_first, "This function emits a comparison insn for the first of a sequence of\n\ conditional comparisions. It returns a comparison expression appropriate\n\ for passing to @code{gen_ccmp_next} or to @code{cbranch_optab}.", rtx, (int code, rtx op0, rtx op1), NULL) DEFHOOK (gen_ccmp_next, "This function emits a conditional comparison within a sequence of\n\ conditional comparisons. The @code{prev} expression is the result of a\n\ prior call to @code{gen_ccmp_first} or @code{gen_ccmp_next}. It may return\n\ @code{NULL} if the combination of @code{prev} and this comparison is\n\ not supported, otherwise the result must be appropriate for passing to @code{gen_ccmp_next} or @code{cbranch_optab}.", rtx, (rtx prev, int code, rtx op0, rtx op1), NULL) All of your existing tests for HAVE_ccmp should be replaced with if (targetm.gen_ccmp_first == NULL) return; /* No ccmp supported. */ gcc_checking_assert(targetm.gen_ccmp_next != NULL); r~