2 /* { dg-options "-O3 -mvsx -Wno-psabi" } */
3 /* { dg-additional-options "-mdejagnu-cpu=power8" { target { ! has_arch_pwr8 } } } */
4 /* { dg-require-effective-target p8vector_hw } */
7 #define CHECK_H "ssse3-check.h"
11 #define TEST ssse3_test
16 #include "ssse3-vals.h"
18 #include <tmmintrin.h>
22 /* Test the 64-bit form */
24 ssse3_test_palignr (__m64
*i1
, __m64
*i2
, unsigned int imm
, __m64
*r
)
29 *r
= _mm_alignr_pi8 (*i1
, *i2
, 0);
32 *r
= _mm_alignr_pi8 (*i1
, *i2
, 1);
35 *r
= _mm_alignr_pi8 (*i1
, *i2
, 2);
38 *r
= _mm_alignr_pi8 (*i1
, *i2
, 3);
41 *r
= _mm_alignr_pi8 (*i1
, *i2
, 4);
44 *r
= _mm_alignr_pi8 (*i1
, *i2
, 5);
47 *r
= _mm_alignr_pi8 (*i1
, *i2
, 6);
50 *r
= _mm_alignr_pi8 (*i1
, *i2
, 7);
53 *r
= _mm_alignr_pi8 (*i1
, *i2
, 8);
56 *r
= _mm_alignr_pi8 (*i1
, *i2
, 9);
59 *r
= _mm_alignr_pi8 (*i1
, *i2
, 10);
62 *r
= _mm_alignr_pi8 (*i1
, *i2
, 11);
65 *r
= _mm_alignr_pi8 (*i1
, *i2
, 12);
68 *r
= _mm_alignr_pi8 (*i1
, *i2
, 13);
71 *r
= _mm_alignr_pi8 (*i1
, *i2
, 14);
74 *r
= _mm_alignr_pi8 (*i1
, *i2
, 15);
77 *r
= _mm_alignr_pi8 (*i1
, *i2
, 16);
85 /* Test the 128-bit form */
87 ssse3_test_palignr128 (__m128i
*i1
, __m128i
*i2
, unsigned int imm
, __m128i
*r
)
89 /* Assumes incoming pointers are 16-byte aligned */
94 *r
= _mm_alignr_epi8 (*i1
, *i2
, 0);
97 *r
= _mm_alignr_epi8 (*i1
, *i2
, 1);
100 *r
= _mm_alignr_epi8 (*i1
, *i2
, 2);
103 *r
= _mm_alignr_epi8 (*i1
, *i2
, 3);
106 *r
= _mm_alignr_epi8 (*i1
, *i2
, 4);
109 *r
= _mm_alignr_epi8 (*i1
, *i2
, 5);
112 *r
= _mm_alignr_epi8 (*i1
, *i2
, 6);
115 *r
= _mm_alignr_epi8 (*i1
, *i2
, 7);
118 *r
= _mm_alignr_epi8 (*i1
, *i2
, 8);
121 *r
= _mm_alignr_epi8 (*i1
, *i2
, 9);
124 *r
= _mm_alignr_epi8 (*i1
, *i2
, 10);
127 *r
= _mm_alignr_epi8 (*i1
, *i2
, 11);
130 *r
= _mm_alignr_epi8 (*i1
, *i2
, 12);
133 *r
= _mm_alignr_epi8 (*i1
, *i2
, 13);
136 *r
= _mm_alignr_epi8 (*i1
, *i2
, 14);
139 *r
= _mm_alignr_epi8 (*i1
, *i2
, 15);
142 *r
= _mm_alignr_epi8 (*i1
, *i2
, 16);
145 *r
= _mm_alignr_epi8 (*i1
, *i2
, 17);
148 *r
= _mm_alignr_epi8 (*i1
, *i2
, 18);
151 *r
= _mm_alignr_epi8 (*i1
, *i2
, 19);
154 *r
= _mm_alignr_epi8 (*i1
, *i2
, 20);
157 *r
= _mm_alignr_epi8 (*i1
, *i2
, 21);
160 *r
= _mm_alignr_epi8 (*i1
, *i2
, 22);
163 *r
= _mm_alignr_epi8 (*i1
, *i2
, 23);
166 *r
= _mm_alignr_epi8 (*i1
, *i2
, 24);
169 *r
= _mm_alignr_epi8 (*i1
, *i2
, 25);
172 *r
= _mm_alignr_epi8 (*i1
, *i2
, 26);
175 *r
= _mm_alignr_epi8 (*i1
, *i2
, 27);
178 *r
= _mm_alignr_epi8 (*i1
, *i2
, 28);
181 *r
= _mm_alignr_epi8 (*i1
, *i2
, 29);
184 *r
= _mm_alignr_epi8 (*i1
, *i2
, 30);
187 *r
= _mm_alignr_epi8 (*i1
, *i2
, 31);
190 *r
= _mm_alignr_epi8 (*i1
, *i2
, 32);
195 /* Routine to manually compute the results */
197 compute_correct_result_128 (signed char *i1
, signed char *i2
, unsigned int imm
,
200 signed char buf
[32];
203 memcpy (&buf
[0], i2
, 16);
204 memcpy (&buf
[16], i1
, 16);
206 for (i
= 0; i
< 16; i
++)
207 if (imm
>= 32 || imm
+ i
>= 32)
215 compute_correct_result_64 (signed char *i1
, signed char *i2
, unsigned int imm
,
218 signed char buf
[16];
221 /* Handle the first half */
222 memcpy (&buf
[0], &i2
[0], 8);
223 memcpy (&buf
[8], &i1
[0], 8);
225 for (i
= 0; i
< 8; i
++)
226 if (imm
>= 16 || imm
+ i
>= 16)
231 /* Handle the second half */
232 memcpy (&buf
[0], &i2
[8], 8);
233 memcpy (&buf
[8], &i1
[8], 8);
235 for (i
= 0; i
< 8; i
++)
236 if (imm
>= 16 || imm
+ i
>= 16)
239 r
[i
+ 8] = buf
[imm
+ i
];
247 union data r
__attribute__ ((aligned(16)));
252 for (i
= 0; i
< ARRAY_SIZE (vals
) - 1; i
++)
253 for (imm
= 0; imm
< 100; imm
++)
256 /* Manually compute the result */
257 compute_correct_result_64 (&vals
[i
+ 0].b
[0],
258 &vals
[i
+ 1].b
[0], imm
, &ck
.b
[0]);
260 /* Run the 64-bit tests */
261 ssse3_test_palignr (&vals
[i
+ 0].ll
[0],
262 &vals
[i
+ 1].ll
[0], imm
, &r
.ll
[0]);
263 ssse3_test_palignr (&vals
[i
+ 0].ll
[1],
264 &vals
[i
+ 1].ll
[1], imm
, &r
.ll
[1]);
265 fail
+= chk_128 (ck
.m
[0], r
.m
[0]);
268 /* Recompute the results for 128-bits */
269 compute_correct_result_128 (&vals
[i
+ 0].b
[0],
270 &vals
[i
+ 1].b
[0], imm
, &ck
.b
[0]);
272 /* Run the 128-bit tests */
273 ssse3_test_palignr128 (&vals
[i
+ 0].m
[0],
274 &vals
[i
+ 1].m
[0], imm
, &r
.m
[0]);
275 fail
+= chk_128 (ck
.m
[0], r
.m
[0]);