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  void NOINLINE
      11  EMULATE(getexp_ph) (V512 * dest, V512 op1,
      12                    __mmask32 k, int zero_mask)
      13  {
      14      V512 v1, v2, v3, v4, v5, v6, v7, v8;
      15      int i;
      16      float emu[32];
      17      __mmask16 m1, m2;
      18      m1 = k & 0xffff;
      19      m2 = (k >> 16) & 0xffff;
      20      unpack_ph_2twops(op1, &v1, &v2);
      21      unpack_ph_2twops(*dest, &v7, &v8);
      22      v3.zmm = _mm512_getexp_round_ps(v1.zmm, _ROUND_CUR);
      23      v4.zmm = _mm512_getexp_round_ps(v2.zmm, _ROUND_CUR);
      24      for (i=0; i<16; i++)
      25        {
      26        emu[i] = v3.f32[i];
      27        emu[i+16] = v4.f32[i];
      28        }
      29      for (i = 0; i < 16; i++) {
      30          if (((1 << i) & m1) == 0) {
      31              if (zero_mask) {
      32                 v5.f32[i] = 0;
      33              }
      34              else {
      35                 v5.u32[i] = v7.u32[i];
      36              }
      37          }
      38          else {
      39              v5.f32[i] = emu[i];
      40  
      41          }
      42  
      43          if (((1 << i) & m2) == 0) {
      44              if (zero_mask) {
      45                 v6.f32[i] = 0;
      46              }
      47              else {
      48                 v6.u32[i] = v8.u32[i];
      49              }
      50          }
      51          else {
      52              v6.f32[i] = emu[i+16];
      53          }
      54  
      55      }
      56      *dest = pack_twops_2ph(v5, v6);
      57  }
      58  
      59  void
      60  TEST (void)
      61  {
      62    V512 res;
      63    V512 exp;
      64  
      65    init_src();
      66  
      67    EMULATE(getexp_ph) (&exp, src1,  NET_MASK, 0);
      68    HF(res) = INTRINSIC (_getexp_ph) (HF(src1));
      69    CHECK_RESULT (&res, &exp, N_ELEMS, _getexp_ph);
      70  
      71    init_dest(&res, &exp);
      72    EMULATE(getexp_ph) (&exp, src1, MASK_VALUE, 0);
      73    HF(res) = INTRINSIC (_mask_getexp_ph) (HF(res), MASK_VALUE, HF(src1));
      74    CHECK_RESULT (&res, &exp, N_ELEMS, _mask_getexp_ph);
      75  
      76    EMULATE(getexp_ph) (&exp, src1,  ZMASK_VALUE, 1);
      77    HF(res) = INTRINSIC (_maskz_getexp_ph) (ZMASK_VALUE, HF(src1));
      78    CHECK_RESULT (&res, &exp, N_ELEMS, _maskz_getexp_ph);
      79  #if AVX512F_LEN == 512
      80    EMULATE(getexp_ph) (&exp, src1,  NET_MASK, 0);
      81    HF(res) = INTRINSIC (_getexp_round_ph) (HF(src1), _ROUND_CUR);
      82    CHECK_RESULT (&res, &exp, N_ELEMS, _getexp_round_ph);
      83  
      84    init_dest(&res, &exp);
      85    EMULATE(getexp_ph) (&exp, src1, MASK_VALUE, 0);
      86    HF(res) = INTRINSIC (_mask_getexp_round_ph) (HF(res), MASK_VALUE, HF(src1),
      87  					 _ROUND_CUR);
      88    CHECK_RESULT (&res, &exp, N_ELEMS, _mask_getexp_round_ph);
      89  
      90    EMULATE(getexp_ph) (&exp, src1,  ZMASK_VALUE, 1);
      91    HF(res) = INTRINSIC (_maskz_getexp_round_ph) (ZMASK_VALUE, HF(src1), _ROUND_CUR);
      92    CHECK_RESULT (&res, &exp, N_ELEMS, _maskz_getexp_round_ph);
      93  #endif
      94  
      95    if (n_errs != 0) {
      96        abort ();
      97    }
      98  }
      99