(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512fp16-reduce-op-3.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O2 -mavx512fp16" } */
       3  /* { dg-require-effective-target avx512fp16 } */
       4  /* { dg-require-effective-target avx512vl } */
       5  
       6  #define AVX512FP16
       7  #define AVX512VL
       8  
       9  #include "avx512f-helper.h"
      10  
      11  #include "avx512fp16-reduce-op-2.c"
      12  
      13  void
      14  test_256 (void)
      15  {
      16    _Float16 a[32];
      17    int sign = 1;
      18    _Float16 res1 = 0, exp1;
      19    _Float16 res2 = 0, exp2;
      20    _Float16 res3 = 0, exp3;
      21  
      22    for (int i = 0; i != 32; i++)
      23      {
      24        a[i] = sign * (4.0 * i);
      25        sign *= -1;
      26        if (i < 8)
      27  	res1 += a[i];
      28        if (i < 16)
      29  	res2 += a[i];
      30        res3 += a[i];
      31      }
      32  
      33    exp1 = reduc_add_128 (a);
      34    exp2 = reduc_add_256 (a);
      35    exp3 = reduc_add_512 (a);
      36    if (exp1 != res1 || exp2 != res2 || exp3 != res3)
      37      abort();
      38  }
      39  
      40  #define MAX(A, B) ((A) > (B) ? (A) : (B))
      41  #define MIN(A, B) ((A) < (B) ? (A) : (B))
      42  
      43  void
      44  test_128 ()
      45  {
      46    _Float16 a[32];
      47    int sign = 1;
      48    _Float16 min_res1, min_exp1, max_res1, max_exp1;
      49    _Float16 min_res2, min_exp2, max_res2, max_exp2;
      50    _Float16 min_res3, min_exp3, max_res3, max_exp3;
      51  
      52    for (int i = 0; i != 32; i++)
      53      {
      54        a[i] = sign * (4.9 * i * i - 8.3 * i + 14.8);
      55        sign *= -1;
      56      }
      57  
      58    min_res1 = max_res1 = a[0];
      59    for (int i = 0 ; i != 8; i++)
      60      {
      61        min_res1 = MIN (min_res1, a[i]);
      62        max_res1 = MAX (max_res1, a[i]);
      63      }
      64  
      65    min_res2 = min_res1;
      66    max_res2 = max_res1;
      67    for (int i = 8 ; i != 16; i++)
      68      {
      69        min_res2 = MIN (min_res2, a[i]);
      70        max_res2 = MAX (max_res2, a[i]);
      71      }
      72  
      73    min_res3 = min_res2;
      74    max_res3 = max_res2;
      75    for (int i = 16 ; i != 32; i++)
      76      {
      77        min_res3 = MIN (min_res3, a[i]);
      78        max_res3 = MAX (max_res3, a[i]);
      79      }
      80  
      81    min_exp1 = reduc_min_128 (a);
      82    min_exp2 = reduc_min_256 (a);
      83    min_exp3 = reduc_min_512 (a);
      84    max_exp1 = reduc_max_128 (a);
      85    max_exp2 = reduc_max_256 (a);
      86    max_exp3 = reduc_max_512 (a);
      87  
      88    if (min_exp1 != min_res1 || min_exp2 != min_res2 || min_exp3 != min_res3
      89        || max_exp1 != max_res1 || max_exp2 != max_res2 || max_exp3 != max_res3)
      90      abort();
      91  }