/* { dg-do run { target avx512fp16 } } */
/* { dg-options "-O2 -mavx512fp16 -mavx512dq" } */


#define DEBUG

#define AVX512FP16
#include "avx512fp16-helper.h"

#define N_ELEMS (AVX512F_LEN / 16)

void NOINLINE
EMULATE(scalef_ph) (V512 * dest, V512 op1, V512 op2,
		  __mmask32 k, int zero_mask)
{
  V512 v1, v2, v3, v4, v5, v6, v7, v8; 
  int i;
  __mmask16 m1, m2;

  m1 = k & 0xffff;
  m2 = (k >> 16) & 0xffff;

  unpack_ph_2twops(op1, &v1, &v2);
  unpack_ph_2twops(op2, &v3, &v4);
  unpack_ph_2twops(*dest, &v7, &v8);

  for (i = 0; i < 16; i++) {
      if (((1 << i) & m1) == 0) {
	  if (zero_mask) {
	      v5.f32[i] = 0;
	  }
	  else {
	      v5.u32[i] = v7.u32[i];
	  }
      }
      else {
	  v5.f32[i] = v1.f32[i] * powf(2.0f, floorf(v3.f32[i]));
      }

      if (((1 << i) & m2) == 0) {
	  if (zero_mask) {
	      v6.f32[i] = 0;
	  }
	  else {
	      v6.u32[i] = v8.u32[i];
	  }
      }
      else {
	  v6.f32[i] = v2.f32[i] * powf(2.0f, floorf(v4.f32[i]));
      }
  }
  *dest = pack_twops_2ph(v5, v6);
}

void
TEST (void)
{
  V512 res;
  V512 exp;

  init_src();

  EMULATE(scalef_ph) (&exp, src1, src2,  NET_MASK, 0);
  HF(res) = INTRINSIC (_scalef_ph) (HF(src1), HF(src2));
  CHECK_RESULT (&res, &exp, N_ELEMS, _scalef_ph);

  init_dest(&res, &exp);
  EMULATE(scalef_ph) (&exp, src1, src2,  MASK_VALUE, 0);
  HF(res) = INTRINSIC (_mask_scalef_ph) (HF(res), MASK_VALUE, HF(src1), HF(src2));
  CHECK_RESULT (&res, &exp, N_ELEMS, _mask_scalef_ph);

  EMULATE(scalef_ph) (&exp, src1, src2,  ZMASK_VALUE, 1);
  HF(res) = INTRINSIC (_maskz_scalef_ph) (ZMASK_VALUE, HF(src1), HF(src2));
  CHECK_RESULT (&res, &exp, N_ELEMS, _maskz_scalef_ph);

#if AVX512F_LEN == 512
  EMULATE(scalef_ph) (&exp, src1, src2,  NET_MASK, 0);
  HF(res) = INTRINSIC (_scalef_round_ph) (HF(src1), HF(src2), 0x04);
  CHECK_RESULT (&res, &exp, N_ELEMS, _scalef_round_ph);

  init_dest(&res, &exp);
  EMULATE(scalef_ph) (&exp, src1, src2,  MASK_VALUE, 0);
  HF(res) = INTRINSIC (_mask_scalef_round_ph) (HF(res), MASK_VALUE, HF(src1), HF(src2), 0x04);
  CHECK_RESULT (&res, &exp, N_ELEMS, _mask_scalef_round_ph);

  EMULATE(scalef_ph) (&exp, src1, src2,  ZMASK_VALUE, 1);
  HF(res) = INTRINSIC (_maskz_scalef_round_ph) (ZMASK_VALUE, HF(src1), HF(src2), 0x04);
  CHECK_RESULT (&res, &exp, N_ELEMS, _maskz_scalef_round_ph);
#endif

  if (n_errs != 0)
    abort ();
}

