Daily bump.
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / m128-check.h
blobe90e1f02d32b48dc4635feb96266ca1d7289fcd7
1 #include <stdio.h>
2 #include <xmmintrin.h>
4 #ifndef ARRAY_SIZE
5 #define ARRAY_SIZE(A) (sizeof (A) / sizeof ((A)[0]))
6 #endif
8 #ifdef __SSE2__
9 #include <emmintrin.h>
11 typedef union
13 __m128i x;
14 char a[16];
15 } union128i_b;
17 typedef union
19 __m128i x;
20 unsigned char a[16];
21 } union128i_ub;
23 typedef union
25 __m128i x;
26 short a[8];
27 } union128i_w;
29 typedef union
31 __m128i x;
32 unsigned short a[8];
33 } union128i_uw;
35 typedef union
37 __m128i x;
38 int a[4];
39 } union128i_d;
41 typedef union
43 __m128i x;
44 unsigned int a[4];
45 } union128i_ud;
47 typedef union
49 __m128i x;
50 long long a[2];
51 } union128i_q;
53 typedef union
55 __m128i x;
56 unsigned long long a[2];
57 } union128i_uq;
60 typedef union
62 __m128d x;
63 double a[2];
64 } union128d;
65 #endif
67 typedef union
69 __m128 x;
70 float a[4];
71 } union128;
73 #ifdef DEBUG
74 #define PRINTF printf
75 #else
76 #define PRINTF(...)
77 #endif
79 #define CHECK_EXP(UNION_TYPE, VALUE_TYPE, FMT) \
80 static int \
81 __attribute__((noinline, unused)) \
82 check_##UNION_TYPE (UNION_TYPE u, const VALUE_TYPE *v) \
83 { \
84 int i; \
85 int err = 0; \
87 for (i = 0; i < ARRAY_SIZE (u.a); i++) \
88 if (u.a[i] != v[i]) \
89 { \
90 err++; \
91 PRINTF ("%i: " FMT " != " FMT "\n", \
92 i, v[i], u.a[i]); \
93 } \
94 return err; \
97 #ifdef __SSE2__
98 CHECK_EXP (union128i_b, char, "%d")
99 CHECK_EXP (union128i_ub, unsigned char, "%d")
100 CHECK_EXP (union128i_w, short, "%d")
101 CHECK_EXP (union128i_uw, unsigned short, "%d")
102 CHECK_EXP (union128i_d, int, "0x%x")
103 CHECK_EXP (union128i_ud, unsigned int, "0x%x")
104 CHECK_EXP (union128i_q, long long, "0x%llx")
105 CHECK_EXP (union128i_uq, unsigned long long, "0x%llx")
106 CHECK_EXP (union128d, double, "%f")
107 #endif
109 CHECK_EXP (union128, float, "%f")
111 #ifndef ESP_FLOAT
112 #define ESP_FLOAT 0.000001
113 #endif
114 #ifndef ESP_DOUBLE
115 #define ESP_DOUBLE 0.000001
116 #endif
117 #define CHECK_ARRAY(ARRAY, TYPE, FMT) \
118 static int \
119 __attribute__((noinline, unused)) \
120 checkV##ARRAY (const TYPE *v, const TYPE *e, int n) \
122 int i; \
123 int err = 0; \
125 for (i = 0; i < n; i++) \
126 if (v[i] != e[i]) \
128 err++; \
129 PRINTF ("%i: " FMT " != " FMT "\n", \
130 i, v[i], e[i]); \
132 return err; \
135 CHECK_ARRAY(c, char, "0x%hhx")
136 CHECK_ARRAY(s, short, "0x%hx")
137 CHECK_ARRAY(i, int, "0x%x")
138 CHECK_ARRAY(l, long long, "0x%llx")
139 CHECK_ARRAY(uc, unsigned char, "0x%hhx")
140 CHECK_ARRAY(us, unsigned short, "0x%hx")
141 CHECK_ARRAY(ui, unsigned int, "0x%x")
142 CHECK_ARRAY(ul, unsigned long long, "0x%llx")
146 #define CHECK_FP_ARRAY(ARRAY, TYPE, ESP, FMT) \
147 static int \
148 __attribute__((noinline, unused)) \
149 checkV##ARRAY (const TYPE *v, const TYPE *e, int n) \
151 int i; \
152 int err = 0; \
154 for (i = 0; i < n; i++) \
155 if (v[i] > (e[i] + (ESP)) || v[i] < (e[i] - (ESP))) \
156 if (e[i] != v[i]) \
158 err++; \
159 PRINTF ("%i: " FMT " != " FMT "\n", \
160 i, v[i], e[i]); \
162 return err; \
165 CHECK_FP_ARRAY (d, double, ESP_DOUBLE, "%f")
166 CHECK_FP_ARRAY (f, float, ESP_FLOAT, "%f")
168 #ifdef NEED_IEEE754_FLOAT
169 union ieee754_float
171 float d;
172 struct
174 unsigned long frac : 23;
175 unsigned exp : 8;
176 unsigned sign : 1;
177 } bits __attribute__((packed));
179 #endif
181 #ifdef NEED_IEEE754_DOUBLE
182 union ieee754_double
184 double d;
185 struct
187 unsigned long frac1 : 32;
188 unsigned long frac0 : 20;
189 unsigned exp : 11;
190 unsigned sign : 1;
191 } bits __attribute__((packed));
193 #endif
195 #define CHECK_FP_EXP(UNION_TYPE, VALUE_TYPE, ESP, FMT) \
196 static int \
197 __attribute__((noinline, unused)) \
198 check_fp_##UNION_TYPE (UNION_TYPE u, const VALUE_TYPE *v) \
200 int i; \
201 int err = 0; \
203 for (i = 0; i < ARRAY_SIZE (u.a); i++) \
204 if (u.a[i] > (v[i] + (ESP)) || u.a[i] < (v[i] - (ESP))) \
206 err++; \
207 PRINTF ("%i: " FMT " != " FMT "\n", \
208 i, v[i], u.a[i]); \
210 return err; \
213 CHECK_FP_EXP (union128, float, ESP_FLOAT, "%f")
214 #ifdef __SSE2__
215 CHECK_FP_EXP (union128d, double, ESP_DOUBLE, "%f")
216 #endif