Uros Bizjak <[email protected]> 于2026年9月11日周五 17:22写道:
>
> On Fri, Sep 11, 2026 at 10:50 AM Hongyu Wang <[email protected]> wrote:
> >
> > Hi,
> >
> > The unordered compares (UNLT, UNLE, UNGT, UNGE and UNEQ) must not raise
> > FE_INVALID on a quiet NaN.  AVX and AVX512 have an imm8 encoding for the
> > quiet _UQ predicate of each, so just select it.
> >
> > Legacy SSE2 has only 8 predicates and can express UNGE/UNGT/UNLT/UNLE
> > only as the signaling NLT/NLE. So reject those four codes in the packed
> > FP vec_cmp expanders under trapping math and NaNs are honored.
> >
> > Bootstrapped & regtested under x86_64-pc-linux-gnu. Ok for trunk?
> >
> > gcc/ChangeLog:
> >
> >         PR target/127177
> >         * config/i386/i386-expand.cc (ix86_fp_cmp_code_to_pcmp_immediate):
> >         Return the _UQ predicate immediates for UNLE, UNLT, UNGE, UNGT and
> >         UNEQ.
> >         * config/i386/i386.cc (ix86_print_operand):Likewise to print the
> >         _uq suffixed AVX predicates for these codes.
> >         * config/i386/predicates.md (ix86_fp_vec_cmp_operator): New
> >         predicate.
> >         * config/i386/sse.md (vec_cmp<mode><sseintvecmodelower>): Use the
> >         new predicate for the VF_128 compare.
> >         * config/i386/mmx.md (vec_cmpv2sfv2si): Likewise.
> >
> > gcc/testsuite/ChangeLog:
> >
> >         PR target/127177
> >         * gcc.target/i386/pr127177-1.c: New test.
> >         * gcc.target/i386/pr127177-2.c: Likewise.
> >         * gcc.target/i386/pr127177-3.c: Likewise.
> >         * gcc.target/i386/pr127177-4.c: Likewise.
> >         * gcc.target/i386/pr127177-5.c: Likewise.
>
> > +;; SSE2 doesn't have quiet vector compare for LT/LE/GT/GE, so
> > +;; disable them under trapping-math or HONOR_NANS.
> > +
> > +(define_predicate "ix86_fp_vec_cmp_operator"
> > +  (and (match_operand 0 "comparison_operator")
> > +       (ior (not (match_code "unlt,unle,ungt,unge"))
> > +           (match_test "TARGET_AVX
> > +                        || !flag_trapping_math
> > +                        || !HONOR_NANS (GET_MODE (XEXP (op, 0)))"))))
>
> FYI, binary operators (ior, and, ...) can have multiple inputs in
> define_predicate, so:
>
> (ior (not (match_code "..."))
>       (match_test "TARGET_AVX")
>       (not (match_test "flag_trapping_math"))
>       (not (match_test "HONOR_NANS (...)")))
>

Indeed, updated in the attached patch.

> Uros.

Attachment: 0001-i386-Don-t-turn-quiet-FP-comparisons-into-signaling-.patch
Description: Binary data

Reply via email to