(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512f-vscalefss-2.c
       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 / 32)
       9  #include "avx512f-mask-type.h"
      10  
      11  static void
      12  compute_scalefss (float *s1, float *s2, float *r)
      13  {
      14    r[0] = s1[0] * (float) pow (2, floor (s2[0]));
      15    r[1] = s1[1];
      16    r[2] = s1[2];
      17    r[3] = s1[3];
      18  }
      19  
      20  static void
      21  avx512f_test (void)
      22  {
      23    union128 res1, res2, res3, res4, res5, res6;
      24    union128 s1, s2;
      25    float res_ref[SIZE];
      26    MASK_TYPE mask = MASK_VALUE;
      27    int i;
      28  
      29    for (i = 0; i < SIZE; i++)
      30      {
      31        s1.a[i] = 11.5 * (i + 1);
      32        s2.a[i] = 10.5 * (i + 1);
      33        res_ref[i] = 9.5 * (i + 1);
      34        res1.a[i] = DEFAULT_VALUE;
      35        res2.a[i] = DEFAULT_VALUE;
      36        res3.a[i] = DEFAULT_VALUE;
      37        res4.a[i] = DEFAULT_VALUE;
      38        res5.a[i] = DEFAULT_VALUE;
      39        res6.a[i] = DEFAULT_VALUE;
      40      }
      41  
      42    res1.x = _mm_scalef_ss (s1.x, s2.x);
      43    res2.x = _mm_scalef_round_ss (s1.x, s2.x,
      44                _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
      45    res3.x = _mm_mask_scalef_round_ss (s1.x, mask, s1.x, s2.x,
      46                _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
      47    res4.x = _mm_maskz_scalef_round_ss (mask, s1.x, s2.x,
      48                _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC);
      49    res5.x = _mm_mask_scalef_ss (s1.x, mask, s1.x, s2.x);
      50    res6.x = _mm_maskz_scalef_ss (mask, s1.x, s2.x);
      51  
      52    compute_scalefss (s1.a, s2.a, res_ref);
      53  
      54    if (check_union128 (res1, res_ref))
      55      abort ();
      56    if (check_union128 (res2, res_ref))                                         
      57      abort ();
      58  
      59    MASK_MERGE () (res_ref, mask, 1);
      60  
      61    if (check_union128 (res3, res_ref))
      62      abort ();
      63  
      64    if (check_union128 (res5, res_ref))
      65      abort ();
      66  
      67    MASK_ZERO () (res_ref, mask, 1);
      68  
      69    if (check_union128 (res4, res_ref))
      70      abort ();
      71  
      72    if (check_union128 (res6, res_ref))
      73      abort ();
      74  }