(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
sse2-ucomisd-pr106113-2.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2 -msse2" } */
       3  /* { dg-require-effective-target sse2 } */
       4  
       5  #ifndef CHECK_H
       6  #define CHECK_H "sse2-check.h"
       7  #endif
       8  
       9  #ifndef TEST
      10  #define TEST sse2_test
      11  #endif
      12  
      13  #include CHECK_H
      14  
      15  #include <emmintrin.h>
      16  
      17  #define CMP(PRED, EXP) \
      18        res = _mm_ucomi##PRED##_sd (__A, __B);           \
      19          if (res != EXP)                               \
      20  	    abort ();
      21  static void 
      22  __attribute__((noinline, unused))
      23  do_check (double s1, double s2)
      24  {
      25    __m128d __A = _mm_load_sd (&s1);
      26    __m128d __B = _mm_load_sd (&s2);
      27    int res;
      28    
      29    CMP (eq, (!__builtin_isunordered (s1, s2) && s1 == s2));
      30    CMP (ge, (!__builtin_isunordered (s1, s2) && s1 >= s2));
      31    CMP (gt, (!__builtin_isunordered (s1, s2) && s1 > s2));
      32    CMP (lt, (!__builtin_isunordered (s1, s2) && s1 < s2));
      33    CMP (le, (!__builtin_isunordered (s1, s2) && s1 <= s2));
      34    CMP (neq, (__builtin_isunordered (s1, s2) || s1 != s2));
      35  }
      36  
      37  static void
      38  TEST (void)
      39  {
      40    struct
      41      {
      42        double x1;
      43        double x2;
      44      }
      45    inputs[] =
      46      {
      47        { 4.3, 2.18 },
      48        { -4.3, 3.18 },
      49        { __builtin_nan (""), -5.8 },
      50        { -4.8, __builtin_nans ("") },
      51        { 3.8, __builtin_nans ("") },
      52        { 4.2, 4.2 },
      53        { __builtin_nan (""), __builtin_nans ("") },
      54      };
      55    int i;
      56  
      57    for (i = 0; i < sizeof (inputs) / sizeof (inputs[0]); i++)
      58      do_check (inputs[i].x1, inputs[i].x2);
      59  }