1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx512f -mavx512vnni" } */
       3  /* { dg-require-effective-target avx512f } */
       4  /* { dg-require-effective-target avx512vnni } */
       5  
       6  #define AVX512F
       7  
       8  #define AVX512VNNI
       9  #include "avx512f-helper.h"
      10  
      11  #define SIZE (AVX512F_LEN / 8)
      12  #define SIZE_RES (AVX512F_LEN / 32)
      13  
      14  #include "avx512f-mask-type.h"
      15  
      16  static void
      17  CALC (int *r, int *dst, unsigned char *s1, char *s2)
      18  {
      19    short tempres[SIZE];
      20    for (int i = 0; i < SIZE; i++) {
      21      tempres[i] = ((unsigned short)(s1[i]) * (short)(s2[i]));
      22    }
      23    for (int i = 0; i < SIZE_RES; i++) {
      24      long long test = (long long)dst[i] + tempres[i*4] + tempres[i*4 + 1] + tempres[i*4 + 2] + tempres[i*4 + 3];
      25      r[i] = test;
      26    }
      27  }
      28  
      29  void
      30  TEST (void)
      31  {
      32    int i;
      33    UNION_TYPE (AVX512F_LEN, i_d) res1, res2, res3;
      34    UNION_TYPE (AVX512F_LEN, i_ub) src1;
      35    UNION_TYPE (AVX512F_LEN, i_b) src2;
      36    MASK_TYPE mask = MASK_VALUE;
      37    int res_ref[SIZE_RES], res_ref2[SIZE_RES];
      38  
      39    for (i = 0; i < SIZE; i++)
      40      {
      41        int sign = i % 2 ? 1 : -1;
      42        src1.a[i] = 10 +  3*i*i + sign;
      43        src2.a[i] = sign*10*i*i;
      44     }
      45  
      46    for (i = 0; i < SIZE_RES; i++)
      47      {
      48        res1.a[i] = 0x7FFFFFFF;
      49        res2.a[i] = DEFAULT_VALUE;
      50        res3.a[i] = DEFAULT_VALUE;
      51      }
      52  
      53    CALC (res_ref, res1.a, src1.a, src2.a);
      54    CALC (res_ref2, res2.a, src1.a, src2.a);
      55  
      56    res1.x = INTRINSIC (_dpbusd_epi32) (res1.x, src1.x, src2.x);
      57    res2.x = INTRINSIC (_mask_dpbusd_epi32) (res2.x, mask, src1.x, src2.x);
      58    res3.x = INTRINSIC (_maskz_dpbusd_epi32) (mask, res3.x, src1.x, src2.x);
      59  
      60    if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
      61      abort ();
      62  
      63    MASK_MERGE (i_d) (res_ref2, mask, SIZE_RES);
      64    if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref2))
      65      abort ();
      66  
      67    MASK_ZERO (i_d) (res_ref2, mask, SIZE_RES);
      68    if (UNION_CHECK (AVX512F_LEN, i_d) (res3, res_ref2))
      69      abort ();
      70  }