/* { dg-do run } */ /* { dg-options "-O2 -msse" } */ /* { dg-require-effective-target sse } */ #ifndef CHECK_H #define CHECK_H "sse-check.h" #endif #ifndef TEST #define TEST sse_test #endif #include CHECK_H #include #define CMP(PRED, EXP) \ res = _mm_comi##PRED##_ss (__A, __B); \ if (res != EXP) \ abort (); static void __attribute__((noinline, unused)) do_check (float s1, float s2) { __m128 __A = _mm_load_ss (&s1); __m128 __B = _mm_load_ss (&s2); int res; CMP (eq, (!__builtin_isunordered (s1, s2) && s1 == s2)); CMP (ge, (!__builtin_isunordered (s1, s2) && s1 >= s2)); CMP (gt, (!__builtin_isunordered (s1, s2) && s1 > s2)); CMP (lt, (!__builtin_isunordered (s1, s2) && s1 < s2)); CMP (le, (!__builtin_isunordered (s1, s2) && s1 <= s2)); CMP (neq, (__builtin_isunordered (s1, s2) || s1 != s2)); } static void TEST (void) { struct { float x1; float x2; } inputs[] = { { 4.3, 2.18 }, { -4.3, 3.18 }, { __builtin_nanf (""), -5.8 }, { -4.8, __builtin_nansf ("") }, { 3.8, __builtin_nansf ("") }, { 4.2, 4.2 }, { __builtin_nanf (""), __builtin_nansf ("") }, }; int i; for (i = 0; i < sizeof (inputs) / sizeof (inputs[0]); i++) do_check (inputs[i].x1, inputs[i].x2); }