1  /* { dg-do run } */
       2  /* { dg-options "-mavx512f -O2" } */
       3  /* { dg-require-effective-target avx512f } */
       4  
       5  #include <math.h>
       6  #include "avx512f-check.h"
       7  
       8  #define SIZE (128 / 64)
       9  #include "avx512f-mask-type.h"
      10  
      11  static void
      12  compute_scalefsd (double *s1, double *s2, double *r)
      13  {
      14    r[0] = s1[0] * pow (2, floor (s2[0]));
      15    r[1] = s1[1];
      16  }
      17  
      18  void static
      19  avx512f_test (void)
      20  {
      21    union128d res1, res2, res3, res4, res5, res6;
      22    union128d s1, s2;
      23    double res_ref[SIZE];
      24    MASK_TYPE mask = MASK_VALUE;
      25    int i;
      26  
      27    for (i = 0; i < SIZE; i++)
      28      {
      29        s1.a[i] = 11.5 * (i + 1);
      30        s2.a[i] = 10.5 * (i + 1);
      31        res_ref[i] = 9.5 * (i + 1);
      32        res1.a[i] = DEFAULT_VALUE;
      33        res2.a[i] = DEFAULT_VALUE;
      34        res3.a[i] = DEFAULT_VALUE;
      35        res4.a[i] = DEFAULT_VALUE;
      36        res5.a[i] = DEFAULT_VALUE;
      37        res6.a[i] = DEFAULT_VALUE;
      38      }
      39  
      40    res1.x = _mm_scalef_sd (s1.x, s2.x);
      41    res2.x = _mm_scalef_round_sd (s1.x, s2.x,
      42                _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
      43    res3.x = _mm_mask_scalef_round_sd (s1.x, mask, s1.x, s2.x,
      44                _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
      45    res4.x = _mm_maskz_scalef_round_sd (mask, s1.x, s2.x,
      46                _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
      47    res5.x = _mm_mask_scalef_sd (s1.x, mask, s1.x, s2.x);
      48    res6.x = _mm_maskz_scalef_sd (mask, s1.x, s2.x);
      49  
      50    compute_scalefsd (s1.a, s2.a, res_ref);
      51  
      52    if (check_union128d (res1, res_ref))
      53      abort ();
      54    if (check_union128d (res2, res_ref))
      55      abort ();
      56  
      57    MASK_MERGE (d) (res_ref, mask, 1);
      58  
      59    if (check_union128d (res3, res_ref))
      60      abort ();
      61  
      62    if (check_union128d (res5, res_ref))
      63      abort ();
      64  
      65    MASK_ZERO (d) (res_ref, mask, 1);
      66  
      67    if (check_union128d (res4, res_ref))
      68      abort ();
      69  
      70    if (check_union128d (res6, res_ref))
      71      abort ();
      72  }