1  /* { dg-do run } */
       2  /* { dg-options "-mavx512f -O2" } */
       3  /* { dg-require-effective-target avx512f } */
       4  
       5  #define SIZE (128 / 64)
       6  
       7  #include <math.h>
       8  #include "avx512f-check.h"
       9  #include "avx512f-mask-type.h"
      10  
      11  static void
      12  compute_rndscalesd (double *s1, double *s2, double *r, int imm)
      13  {
      14    int rc, m;
      15    rc = imm & 0xf;
      16    m = imm >> 4;
      17  
      18    switch (rc)
      19      {
      20      case _MM_FROUND_FLOOR:
      21        r[0] = floor (s2[0] * pow (2, m)) / pow (2, m);
      22        break;
      23      case _MM_FROUND_CEIL:
      24        r[0] = ceil (s2[0] * pow (2, m)) / pow (2, m);
      25        break;
      26      default:
      27        abort ();
      28        break;
      29      }
      30  
      31    r[1] = s1[1];
      32  }
      33  
      34  static void
      35  avx512f_test (void)
      36  {
      37    int i, imm;
      38    union128d s1, s2, res1, res2, res3, res4, res5, res6;
      39    double res_ref[SIZE];
      40    
      41    MASK_TYPE mask = MASK_VALUE;
      42  
      43    imm = _MM_FROUND_FLOOR | (7 << 4);
      44  
      45    s1.x = _mm_set_pd (4.05084, -1.23162);
      46    s2.x = _mm_set_pd (-3.53222, 7.33527);
      47  
      48    for(i = 0; i < SIZE; i++)
      49      {
      50        res2.a[i] = DEFAULT_VALUE;
      51        res5.a[i] = DEFAULT_VALUE;
      52      }
      53  
      54    res1.x = _mm_roundscale_sd (s1.x, s2.x, imm);
      55    res2.x = _mm_mask_roundscale_sd (res2.x, mask, s1.x, s2.x, imm);
      56    res3.x = _mm_maskz_roundscale_sd (mask, s1.x, s2.x, imm);
      57    res4.x = _mm_roundscale_round_sd (s1.x, s2.x, imm, _MM_FROUND_NO_EXC);
      58    res5.x = _mm_mask_roundscale_round_sd (res5.x, mask, s1.x, s2.x, imm, _MM_FROUND_NO_EXC);
      59    res6.x = _mm_maskz_roundscale_round_sd (mask, s1.x, s2.x, imm, _MM_FROUND_NO_EXC);
      60  
      61    compute_rndscalesd (s1.a, s2.a, res_ref, imm);
      62  
      63    if (check_union128d (res1, res_ref))
      64      abort ();
      65  
      66    MASK_MERGE (d) (res_ref, mask, 1);
      67    if (check_union128d (res2, res_ref))
      68      abort ();
      69    
      70    MASK_ZERO (d) (res_ref, mask, 1);
      71    if (check_union128d (res3, res_ref))
      72      abort ();
      73  
      74    compute_rndscalesd (s1.a, s2.a, res_ref, imm);
      75  
      76    if (check_union128d (res4, res_ref))
      77      abort ();
      78  
      79    MASK_MERGE (d) (res_ref, mask, 1);
      80    if (check_union128d (res5, res_ref))
      81      abort ();
      82    
      83    MASK_ZERO (d) (res_ref, mask, 1);
      84    if (check_union128d (res6, res_ref))
      85      abort ();
      86  
      87  }