1 /* { dg-do run { target bmi2 } } */
2 /* { dg-options "-mbmi2 -O2 -dp" } */
3 
4 #include "bmi2-check.h"
5 
6 __attribute__((noinline))
7 unsigned
calc_rorx_u32(unsigned a,int l)8 calc_rorx_u32 (unsigned a, int l)
9 {
10   unsigned volatile res = a;
11   int i;
12   for (i = 0; i < l; ++i)
13     res = (res >> 1) | ((res & 1) << 31);
14 
15   return res;
16 }
17 
18 #define SHIFT_VAL 0x0e
19 
20 static void
bmi2_test()21 bmi2_test ()
22 {
23   unsigned i;
24   unsigned src = 0xce7ace0;
25   unsigned res, res_ref;
26 
27   for (i = 0; i < 5; ++i) {
28     src = src * (i + 1);
29 
30     res_ref = calc_rorx_u32 (src, SHIFT_VAL);
31     res = (src >> SHIFT_VAL) | (src << (32 - SHIFT_VAL));
32 
33     if (res != res_ref)
34       abort();
35   }
36 }
37