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
44