1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx2 -ftree-vectorize -fvect-cost-model=unlimited -mprefer-vector-width=256" } */
       3  /* { dg-require-effective-target avx2 } */
       4  
       5  #include "avx2-check.h"
       6  #include <string.h>
       7  #include "pr103144-mul-1.c"
       8  
       9  typedef int v8si __attribute__((vector_size(32)));
      10  
      11  void
      12  avx2_test (void)
      13  {
      14    int* epi32_exp = (int*) malloc (N * sizeof (int));
      15    int* epi32_dst = (int*) malloc (N * sizeof (int));
      16  
      17    __builtin_memset (epi32_exp, 0, N * sizeof (int));
      18    int b = 8;
      19    v8si init = __extension__(v8si) { b, b * 3, b * 9, b * 27, b * 81, b * 243, b * 729, b * 2187 };
      20  
      21    for (int i = 0; i != N / 8; i++)
      22      {
      23        memcpy (epi32_exp + i * 8, &init, 32);
      24        init *= 6561;
      25      }
      26  
      27    foo_mul (epi32_dst, b);
      28    if (__builtin_memcmp (epi32_dst, epi32_exp, N * sizeof (int)) != 0)
      29      __builtin_abort ();
      30  
      31    foo_mul_peel (epi32_dst, b);
      32    if (__builtin_memcmp (epi32_dst, epi32_exp, 39 * 4) != 0)
      33      __builtin_abort ();
      34  
      35    init = __extension__(v8si) { 1, 3, 9, 27, 81, 243, 729, 2187 };
      36    for (int i = 0; i != N / 8; i++)
      37      {
      38        memcpy (epi32_exp + i * 8, &init, 32);
      39        init *= 6561;
      40      }
      41  
      42    foo_mul_const (epi32_dst);
      43    if (__builtin_memcmp (epi32_dst, epi32_exp, N * sizeof (int)) != 0)
      44      __builtin_abort ();
      45  
      46    foo_mul_peel_const (epi32_dst);
      47    if (__builtin_memcmp (epi32_dst, epi32_exp, 39 * 4) != 0)
      48      __builtin_abort ();
      49  
      50    return;
      51  }