(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512fp16-vreduceph-1b.c
       1  /* { dg-do run { target avx512fp16 } } */
       2  /* { dg-options "-O2 -mavx512fp16 -mavx512dq" } */
       3  
       4  
       5  #define AVX512FP16
       6  #include "avx512fp16-helper.h"
       7  
       8  #define N_ELEMS (AVX512F_LEN / 16)
       9  
      10  #ifndef __REDUCEPH__
      11  #define __REDUCEPH__
      12  V512 borrow_reduce_ps(V512 v, int imm8)
      13  {
      14    V512 temp;
      15    switch (imm8)
      16      {
      17      case 1: temp.zmm =  _mm512_mask_reduce_ps (v.zmm, 0xffff, v.zmm, 1);break;
      18      case 2: temp.zmm =  _mm512_mask_reduce_ps (v.zmm, 0xffff, v.zmm, 2);break;
      19      case 3: temp.zmm =  _mm512_mask_reduce_ps (v.zmm, 0xffff, v.zmm, 3);break;
      20      case 4: temp.zmm =  _mm512_mask_reduce_ps (v.zmm, 0xffff, v.zmm, 4);break;
      21      case 5: temp.zmm =  _mm512_mask_reduce_ps (v.zmm, 0xffff, v.zmm, 5);break;
      22      case 6: temp.zmm =  _mm512_mask_reduce_ps (v.zmm, 0xffff, v.zmm, 6);break;
      23      case 7: temp.zmm =  _mm512_mask_reduce_ps (v.zmm, 0xffff, v.zmm, 7);break;
      24      case 8: temp.zmm =  _mm512_mask_reduce_ps (v.zmm, 0xffff, v.zmm, 8);break;
      25      }
      26    return temp;
      27  }
      28  #endif
      29  
      30  void NOINLINE
      31  EMULATE(reduce_ph) (V512 * dest, V512 op1,
      32  		  __mmask32 k, int imm8, int zero_mask)
      33  {
      34    V512 v1, v2, v3, v4, v5, v6, v7, v8;
      35    V512 t1,t2;
      36    int i;
      37    __mmask16 m1, m2;
      38  
      39    m1 = k & 0xffff;
      40    m2 = (k >> 16) & 0xffff;
      41  
      42    unpack_ph_2twops(op1, &v1, &v2);
      43    unpack_ph_2twops(*dest, &v7, &v8);
      44    t1 = borrow_reduce_ps(v1, imm8);
      45    t2 = borrow_reduce_ps(v2, imm8);
      46  
      47    for (i = 0; i < 16; i++) {
      48        if (((1 << i) & m1) == 0) {
      49  	  if (zero_mask) {
      50  	      v5.f32[i] = 0;
      51  	  }
      52  	  else {
      53  	      v5.u32[i] = v7.u32[i];
      54  	  }
      55        }
      56        else {
      57  	  v5.f32[i] = t1.f32[i];
      58        }
      59  
      60        if (((1 << i) & m2) == 0) {
      61  	  if (zero_mask) {
      62  	      v6.f32[i] = 0;
      63  	  }
      64  	  else {
      65  	      v6.u32[i] = v8.u32[i];
      66  	  }
      67        }
      68        else {
      69  	  v6.f32[i] = t2.f32[i];
      70        }
      71  
      72    }
      73    *dest = pack_twops_2ph(v5, v6);
      74  }
      75  
      76  void
      77  TEST (void)
      78  {
      79    V512 res;
      80    V512 exp;
      81  
      82    init_src();
      83  
      84    EMULATE(reduce_ph) (&exp, src1,  NET_MASK, 6, 0);
      85    HF(res) = INTRINSIC (_reduce_ph) (HF(src1), 6);
      86    CHECK_RESULT (&res, &exp, N_ELEMS, _reduce_ph);
      87  
      88    init_dest(&res, &exp);
      89    EMULATE(reduce_ph) (&exp, src1, MASK_VALUE, 5, 0);
      90    HF(res) = INTRINSIC (_mask_reduce_ph) (HF(res), MASK_VALUE, HF(src1), 5);
      91    CHECK_RESULT (&res, &exp, N_ELEMS, _mask_reduce_ph);
      92  
      93    EMULATE(reduce_ph) (&exp, src1,  ZMASK_VALUE, 4, 1);
      94    HF(res) = INTRINSIC (_maskz_reduce_ph) (ZMASK_VALUE, HF(src1), 4);
      95    CHECK_RESULT (&res, &exp, N_ELEMS, _maskz_reduce_ph);
      96  
      97  #if AVX512F_LEN == 512
      98    EMULATE(reduce_ph) (&exp, src1,  NET_MASK, 6, 0);
      99    HF(res) = INTRINSIC (_reduce_round_ph) (HF(src1), 6, _ROUND_CUR);
     100    CHECK_RESULT (&res, &exp, N_ELEMS, _reduce_round_ph);
     101  
     102    init_dest(&res, &exp);
     103    EMULATE(reduce_ph) (&exp, src1, MASK_VALUE, 5, 0);
     104    HF(res) = INTRINSIC (_mask_reduce_round_ph) (HF(res), MASK_VALUE, HF(src1), 5, _ROUND_CUR);
     105    CHECK_RESULT (&res, &exp, N_ELEMS, _mask_reduce_round_ph);
     106  
     107    EMULATE(reduce_ph) (&exp, src1,  ZMASK_VALUE, 4, 1);
     108    HF(res) = INTRINSIC (_maskz_reduce_round_ph) (ZMASK_VALUE, HF(src1), 4, _ROUND_CUR);
     109    CHECK_RESULT (&res, &exp, N_ELEMS, _maskz_reduce_round_ph);
     110  #endif
     111  
     112    if (n_errs != 0) {
     113        abort ();
     114    }
     115  }
     116