https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91323

Uroš Bizjak <ubizjak at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |joseph at codesourcery dot com,
                   |                            |rguenth at gcc dot gnu.org

--- Comment #2 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Ilya Leoshkevich from comment #0)
> I'm implementing signaling comparisons on S/390 and I'm trying to figure out
> whether or not LTGT is supposed to be signaling.
> I've decided to check what Intel does, and ran into what appears to be a bug.
> 
> Consider the following functions:
> 
> int f1(float a, float b) { return a < b || a > b; }
> int f2(float a, float b) { return __builtin_isless(a, b) ||
> __builtin_isgreater(a, b); }
> int f3(float a, float b) { return __builtin_islessgreater(a, b); }
> 
> gcc creates LTGT rtx for f1 and UNEQ for f2 and f3.
> However, for all 3 variants it then emits UCOMISS instruction.
> I would expect f1 to be compiled to COMISS, since I believe that comparison
> operators in C are supposed to be signaling.

Based on the above observation, LTGT should trap, since either LT or GT traps.

It also means that __builtin_islessgreater is confusingly named.

Reply via email to