https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98612
Bug ID: 98612 Summary: _mm_comieq_sd has wrong semantics Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: guillaume.piolat at gmail dot com Target Milestone: --- Created attachment 49926 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=49926&action=edit Behaviour with 3 compilers _mm_comieq_sd has different NaN semantics for different people. # The Unordered team - GCC will return 1 for a comparison that involved NaN. - this maps to the underlying instruction # The Ordered team - Intel intrinsics guide says: RETURN ( a[63:0] == b[63:0] ) ? 1 : 0 which indicates an ordered comparison. - ICC and clang return 0 for a NaN comparison (see image attachments) As the x86 "intrinsics" are meant as a portable API (vs "builtins"), I would suggest it is expected that the same result than clang and ICC is returned. GCC has the same problem for other intrinsics that don't actually map to the instruction semantics, such as: sse2: - _mm_comieq_sd - _mm_comile_sd - _mm_comilt_sd - _mm_comineq_sd (instruction is an ordered comparison, but intrinsics is an unordered comparison) sse: - _mm_comieq_ss - _mm_comile_ss - _mm_comilt_ss - _mm_comineq_ss I don't know for later instruction sets.