19948Sakulyakh/* Test that the compiler properly optimizes vector rotate instructions vector
29948Sakulyakh   into prot on XOP systems.  */
39948Sakulyakh
49948Sakulyakh/* { dg-do compile } */
59948Sakulyakh/* { dg-require-effective-target lp64 } */
69948Sakulyakh/* { dg-options "-O2 -mxop -ftree-vectorize" } */
79948Sakulyakh
89948Sakulyakhextern void exit (int);
99948Sakulyakh
109948Sakulyakhtypedef long __m128i  __attribute__ ((__vector_size__ (16), __may_alias__));
119948Sakulyakh
129948Sakulyakh#define SIZE 10240
139948Sakulyakh
149948Sakulyakhunion {
159948Sakulyakh  __m128i i_align;
169948Sakulyakh  unsigned u32[SIZE];
179948Sakulyakh} a, b, c;
189948Sakulyakh
199948Sakulyakhvoid
209948Sakulyakhright_rotate32_b (void)
219948Sakulyakh{
229948Sakulyakh  int i;
239948Sakulyakh
249948Sakulyakh  for (i = 0; i < SIZE; i++)
259948Sakulyakh    a.u32[i] = (b.u32[i] >> ((sizeof (int) * 8) - 4)) | (b.u32[i] << 4);
269948Sakulyakh}
279948Sakulyakh
289948Sakulyakhint
299948Sakulyakhmain ()
309948Sakulyakh{
319948Sakulyakh  right_rotate ();
329948Sakulyakh  exit (0);
339948Sakulyakh}
349948Sakulyakh
359948Sakulyakh/* { dg-final { scan-assembler "vprot" } } */
369948Sakulyakh