(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
bmi-bextr-2.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O3 -fno-inline" } */
       3  /* { dg-require-effective-target lp64 } */
       4  /* { dg-require-effective-target ppc_cpu_supports_hw } */
       5  
       6  #define NO_WARN_X86_INTRINSICS 1
       7  #include <x86intrin.h>
       8  #include "bmi-check.h"
       9  
      10  unsigned calc_bextr_u32 (unsigned src1, unsigned src2)
      11  {
      12    unsigned res = 0;
      13    unsigned char start = (src2 & 0xff);
      14    unsigned char len = (int) ((src2 >> 8) & 0xff);
      15    if (start < 32) {
      16      unsigned i;
      17      unsigned last = (start+len) < 32 ? start+len : 32;
      18  
      19      src1 >>= start;
      20      for (i=start; i<last; ++i) {
      21        res |= (src1 & 1) << (i-start);
      22        src1 >>= 1;
      23      }
      24    }
      25  
      26    return res;
      27  }
      28  
      29  static void
      30  bmi_test ()
      31  {
      32    unsigned i;
      33    unsigned char start, len;
      34    unsigned src1 = 0xfacec0ff;
      35    unsigned res, res_ref, src2;
      36  
      37    for (i=0; i<5; ++i) {
      38      start = (i * 1983) % 32;
      39      len = (i + (i * 1983)) % 32;
      40  
      41      src1 = src1 * 3;
      42      src2 = start | (((unsigned)len) << 8);
      43  
      44      res_ref = calc_bextr_u32 (src1, src2);
      45      res = __bextr_u32 (src1, src2);
      46  
      47      if (res != res_ref)
      48        abort();
      49    }
      50  }