(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
ifcvt-reduction-logic-op.c
       1  /* PR tree-optimization/103126.  */
       2  /* { dg-do compile } */
       3  /* { dg-options "-Ofast -mavx2 -ftree-vectorize -fdump-tree-vect-details" } */
       4  /* { dg-final { scan-tree-dump-times "vectorized \[1-3] loops" 3 "vect" } } */
       5  #include<stdint.h>
       6  
       7  void xor_bit_arr_nolcd (uint64_t *__restrict mat, uint64_t* a,uint64_t* b, uint64_t *__restrict ans,
       8      int64_t n)
       9  {
      10    int64_t i;
      11    uint64_t vec1, sum1;
      12    uint64_t vec2, sum2;
      13  
      14    while (n > 0) {
      15      sum1 = 0;
      16      vec1 = a[n];
      17      sum2 = 0;
      18      vec2 = b[n];
      19  
      20      for (i = 0; i < 64; i++) {
      21        uint64_t tmp = mat[i];
      22        uint64_t vec1_i = (vec1 >> i);
      23        uint64_t vec2_i = (vec2 >> i);
      24        sum1 ^= (vec1_i & 1) ? tmp : 0;
      25        if (vec2_i&1) sum2 ^= tmp;
      26      }
      27      *ans++ ^= sum1;  n--;
      28      *ans++ ^= sum2;  n--;
      29    }
      30  }
      31  
      32  void ior_bit_arr_nolcd (uint64_t *__restrict mat, uint64_t* a,uint64_t* b, uint64_t *__restrict ans,
      33      int64_t n)
      34  {
      35    int64_t i;
      36    uint64_t vec1, sum1;
      37    uint64_t vec2, sum2;
      38  
      39    while (n > 0) {
      40      sum1 = 0;
      41      vec1 = a[n];
      42      sum2 = 0;
      43      vec2 = b[n];
      44  
      45      for (i = 0; i < 64; i++) {
      46        uint64_t tmp = mat[i];
      47        uint64_t vec1_i = (vec1 >> i);
      48        uint64_t vec2_i = (vec2 >> i);
      49        sum1 |= (vec1_i & 1) ? tmp : 0;
      50        if (vec2_i&1) sum2 |= tmp;
      51      }
      52      *ans++ |= sum1;  n--;
      53      *ans++ |= sum2;  n--;
      54    }
      55  }
      56  
      57  void and_bit_arr_nolcd (uint64_t *__restrict mat, uint64_t* a,uint64_t* b, uint64_t *__restrict ans,
      58      int64_t n)
      59  {
      60    int64_t i;
      61    uint64_t vec1, sum1;
      62    uint64_t vec2, sum2;
      63  
      64    while (n > 0) {
      65      sum1 = -1;
      66      vec1 = a[n];
      67      sum2 = 0;
      68      vec2 = b[n];
      69  
      70      for (i = 0; i < 64; i++) {
      71        uint64_t tmp = mat[i];
      72        uint64_t vec1_i = (vec1 >> i);
      73        uint64_t vec2_i = (vec2 >> i);
      74        sum1 &= (vec1_i & 1) ? tmp : -1;
      75        if (vec2_i&1) sum2 &= tmp;
      76      }
      77      *ans++ &= sum1;  n--;
      78      *ans++ &= sum2;  n--;
      79    }
      80  }