* Michael Meissner: > +enum reverse_cond_t { > + REVERSE_COND_ORDERED_OK, > + REVERSE_COND_NO_ORDERED > +};
This should probably be something like enum reverse_cond_t { ordered_ok, no_ordered, }; to inhibit implicit conversion to integer types and bool. (Completely untested.) > + > extern enum rtx_code rs6000_reverse_condition (machine_mode, > - enum rtx_code); > + enum rtx_code, > + enum reverse_cond_t); > extern rtx rs6000_emit_eqne (machine_mode, rtx, rtx, rtx); > extern rtx rs6000_emit_fp_cror (rtx_code, machine_mode, rtx); > extern void rs6000_emit_sCOND (machine_mode, rtx[]); > diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc > index f9f9a0b931d..c2235d917ad 100644 > --- a/gcc/config/rs6000/rs6000.cc > +++ b/gcc/config/rs6000/rs6000.cc > @@ -15360,17 +15360,38 @@ rs6000_print_patchable_function_entry (FILE *file, > } > > enum rtx_code > -rs6000_reverse_condition (machine_mode mode, enum rtx_code code) > +rs6000_reverse_condition (machine_mode mode, > + enum rtx_code code, > + enum reverse_cond_t ordered_cmp_ok) > { > /* Reversal of FP compares takes care -- an ordered compare > - becomes an unordered compare and vice versa. */ > - if (mode == CCFPmode > - && (!flag_finite_math_only > - || code == UNLT || code == UNLE || code == UNGT || code == UNGE > - || code == UNEQ || code == LTGT)) > - return reverse_condition_maybe_unordered (code); > - else > - return reverse_condition (code); > + becomes an unordered compare and vice versa. > + > + However, this is not safe for ordered comparisons (i.e. for isgreater, > + etc.) starting with the power9 because ifcvt.cc will want to create a > fp > + cmove, and the x{s,v}cmp{eq,gt,ge}{dp,qp} instructions will trap if one > of > + the arguments is a signalling NaN. */ > + > + if (mode == CCFPmode) > + { > + /* If NaNs are allowed, don't allow the reversal of floating point > + comparisons when the comparison is used in the context of a floating > + point conditional move when REVERSE_COND_NO_ORDERED is passed. We do > + allow the comparsion to be reversed for explicit jumps when > + REVERSE_COND_ORDERED_OK is passed. */ > + if (!flag_finite_math_only) > + return (ordered_cmp_ok == REVERSE_COND_NO_ORDERED That would turn into ordered_cmp_ok == reverse_cond_t::no_ordered (Note that identifiers ending in _t are reserved by POSIX.)