1  #ifndef AUTOVEC_H
       2  #define AUTOVEC_H 1
       3  
       4  #define QUIET_EQ(x, y) ((x) == (y))
       5  #define QUIET_GE __builtin_isgreaterequal
       6  #define QUIET_GT __builtin_isgreater
       7  #define QUIET_LE __builtin_islessequal
       8  #define QUIET_LT __builtin_isless
       9  #define QUIET_ORDERED(x, y) (!__builtin_isunordered ((x), (y)))
      10  #define QUIET_UNEQ(x, y) (__builtin_isless ((x), (y)) \
      11                            || __builtin_isgreater ((x), (y)))
      12  #define QUIET_UNORDERED __builtin_isunordered
      13  #define SIGNALING_EQ(x, y) (((x) <= (y)) && ((x) >= (y)))
      14  #define SIGNALING_GE(x, y) ((x) >= (y))
      15  #define SIGNALING_GT(x, y) ((x) > (y))
      16  #define SIGNALING_LE(x, y) ((x) <= (y))
      17  #define SIGNALING_LT(x, y) ((x) < (y))
      18  #define SIGNALING_LTGT(x, y) (((x) < (y)) || ((x) > (y)))
      19  
      20  #define AUTOVEC(RESULT_TYPE, OP_TYPE, OP) void \
      21  f (RESULT_TYPE *r, const OP_TYPE *x, const OP_TYPE *y) \
      22  { \
      23    int i; \
      24  \
      25    for (i = 0; i < 1000000; i++) \
      26      { \
      27        OP_TYPE xi = x[i], yi = y[i]; \
      28  \
      29        r[i] = OP (xi, yi); \
      30      } \
      31  }
      32  
      33  #define AUTOVEC_DOUBLE(OP) AUTOVEC (long long, double, OP)
      34  
      35  #define AUTOVEC_FLOAT(OP) AUTOVEC (int, float, OP)
      36  
      37  #ifdef __SIZEOF_INT128__
      38  typedef __int128 v1ti __attribute__ ((vector_size (16)));
      39  typedef long double v1tf __attribute__ ((vector_size (16)));
      40  #define AUTOVEC_LONG_DOUBLE(OP) AUTOVEC (v1ti, v1tf, OP)
      41  #endif
      42  
      43  #endif