* gcc.target/powerpc/builtins-1-be.c <vclzb>: Rename duplicate test
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / m128-check.h
blobfcb631a19ff05b580c8c9c311bf56f467a533777
1 #include <stdio.h>
3 #define NO_WARN_X86_INTRINSICS 1
5 #ifdef __ALTIVEC__
6 #include <xmmintrin.h>
8 #ifdef __VSX_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 #if __VSX__
48 typedef union
50 __m128i x;
51 long long a[2];
52 } union128i_q;
54 typedef union
56 __m128i x;
57 unsigned long long a[2];
58 } union128i_uq;
61 typedef union
63 __m128d x;
64 double a[2];
65 } union128d;
66 #endif
68 #endif
69 typedef union
71 __m128 x;
72 float a[4];
73 int i[4];
74 } union128;
76 #ifndef ARRAY_SIZE
77 #define ARRAY_SIZE(A) (sizeof (A) / sizeof ((A)[0]))
78 #endif
80 #ifdef DEBUG
81 #define PRINTF printf
82 #else
83 #define PRINTF(...)
84 #endif
86 #define CHECK_EXP(UINON_TYPE, VALUE_TYPE, FMT) \
87 static int \
88 __attribute__((noinline, unused)) \
89 check_##UINON_TYPE (UINON_TYPE u, const VALUE_TYPE *v) \
90 { \
91 int i; \
92 int err = 0; \
94 for (i = 0; i < ARRAY_SIZE (u.a); i++) \
95 if (u.a[i] != v[i]) \
96 { \
97 err++; \
98 PRINTF ("%i: " FMT " != " FMT "\n", \
99 i, v[i], u.a[i]); \
101 return err; \
104 #ifdef __VSX_SSE2__
105 CHECK_EXP (union128i_b, char, "%d")
106 CHECK_EXP (union128i_ub, unsigned char, "%d")
107 CHECK_EXP (union128i_w, short, "%d")
108 CHECK_EXP (union128i_uw, unsigned short, "%d")
109 CHECK_EXP (union128i_d, int, "0x%x")
110 CHECK_EXP (union128i_ud, unsigned int, "0x%x")
111 #ifdef __VSX__
112 CHECK_EXP (union128i_q, long long, "0x%llx")
113 CHECK_EXP (union128i_uq, unsigned long long, "0x%llx")
114 CHECK_EXP (union128d, double, "%f")
115 #endif
116 #endif
118 CHECK_EXP (union128, float, "%f")
120 #define ESP_FLOAT 0.000001
121 #define ESP_DOUBLE 0.000001
122 #define CHECK_ARRAY(ARRAY, TYPE, FMT) \
123 static int \
124 __attribute__((noinline, unused)) \
125 checkV##ARRAY (const TYPE *v, const TYPE *e, int n) \
127 int i; \
128 int err = 0; \
130 for (i = 0; i < n; i++) \
131 if (v[i] != e[i]) \
133 err++; \
134 PRINTF ("%i: " FMT " != " FMT "\n", \
135 i, v[i], e[i]); \
137 return err; \
140 CHECK_ARRAY(c, char, "0x%hhx")
141 CHECK_ARRAY(s, short, "0x%hx")
142 CHECK_ARRAY(i, int, "0x%x")
143 CHECK_ARRAY(l, long long, "0x%llx")
144 CHECK_ARRAY(uc, unsigned char, "0x%hhx")
145 CHECK_ARRAY(us, unsigned short, "0x%hx")
146 CHECK_ARRAY(ui, unsigned int, "0x%x")
147 CHECK_ARRAY(ul, unsigned long long, "0x%llx")
151 #define CHECK_FP_ARRAY(ARRAY, TYPE, ESP, FMT) \
152 static int \
153 __attribute__((noinline, unused)) \
154 checkV##ARRAY (const TYPE *v, const TYPE *e, int n) \
156 int i; \
157 int err = 0; \
159 for (i = 0; i < n; i++) \
160 if (v[i] > (e[i] + (ESP)) || v[i] < (e[i] - (ESP))) \
161 if (e[i] != v[i]) \
163 err++; \
164 PRINTF ("%i: " FMT " != " FMT "\n", \
165 i, v[i], e[i]); \
167 return err; \
170 CHECK_FP_ARRAY (d, double, ESP_DOUBLE, "%f")
171 CHECK_FP_ARRAY (f, float, ESP_FLOAT, "%f")
173 #ifdef NEED_IEEE754_FLOAT
174 union ieee754_float
176 float d;
177 struct
179 unsigned long frac : 23;
180 unsigned exp : 8;
181 unsigned sign : 1;
182 } bits __attribute__((packed));
184 #endif
186 #ifdef NEED_IEEE754_DOUBLE
187 union ieee754_double
189 double d;
190 struct
192 unsigned long frac1 : 32;
193 unsigned long frac0 : 20;
194 unsigned exp : 11;
195 unsigned sign : 1;
196 } bits __attribute__((packed));
198 #endif
200 #define CHECK_FP_EXP(UINON_TYPE, VALUE_TYPE, ESP, FMT) \
201 static int \
202 __attribute__((noinline, unused)) \
203 check_fp_##UINON_TYPE (UINON_TYPE u, const VALUE_TYPE *v) \
205 int i; \
206 int err = 0; \
208 for (i = 0; i < ARRAY_SIZE (u.a); i++) \
209 if (u.a[i] > (v[i] + (ESP)) || u.a[i] < (v[i] - (ESP))) \
211 err++; \
212 PRINTF ("%i: " FMT " != " FMT "\n", \
213 i, v[i], u.a[i]); \
215 return err; \
218 CHECK_FP_EXP (union128, float, ESP_FLOAT, "%f")
219 #ifdef __VSX_SSE2__
220 CHECK_FP_EXP (union128d, double, ESP_DOUBLE, "%f")
221 #endif
222 #endif /* __ALTIVEC__ */