On Fri, Sep 23, 2011 at 10:12 AM, Jakub Jelinek <ja...@redhat.com> wrote:
>> > --- gcc/config/i386/i386.c.jj   2011-09-02 16:29:38.000000000 +0200
>> > +++ gcc/config/i386/i386.c      2011-09-07 21:57:52.000000000 +0200
>> > @@ -18304,6 +18304,11 @@ ix86_prepare_sse_fp_compare_args (rtx de
>> >  {
>> >   rtx tmp;
>> >
>> > +  /* AVX supports all the needed comparisons, no need to swap arguments
>> > +     nor help reload.  */
>> > +  if (TARGET_AVX)
>> > +    return code;
>> > +
>>
>> Unfortunately, this part prevents generation of vmin/vmax instructions
>> for TARGET_AVX. In ix86_expand_fp_movcc, we call
>> ix86_prepare_sse_fp_compare_args, where we previously converted GT
>> into LT. LT is recognized in ix86_expand_sse_fp_minmax as valid
>> operand for MIN/MAX, whereas GT is not.
>>
>> I'm not sure if we can swap operands in ix86_expand_sse_fp_minmax,
>> there is a scary comment  in front of ix86_expand_sse_fp_minmax w.r.t.
>> to IEEE safety.
>
> swap_condition is documented to be IEEE safe:
> /* Similar, but return the code when two operands of a comparison are swapped.
>   This IS safe for IEEE floating-point.  */
>
> So, do you prefer this?


Yes, since the operands can be swapped, this looks OK to me. Also, the
comments are very informative.

> 2011-09-23  Jakub Jelinek  <ja...@redhat.com>
>
>        * config/i386/i386.c (ix86_prepare_sse_fp_compare_args): For
>        GE/GT/UNLE/UNLT swap arguments and condition even for TARGET_AVX.
>
>        * gcc.target/i386/avxfp-1.c: New test.
>        * gcc.target/i386/avxfp-2.c: New test.

OK.

Thanks,
Uros.

Reply via email to