/* { dg-require-effective-target ppc_float128_hw } */
/* { dg-require-effective-target power10_ok } */
/* { dg-options "-mdejagnu-cpu=power10 -O2" } */

/* Test whether the LXVKQ instruction is generated to load special IEEE 128-bit
   constants.  */

_Float128
return_0 (void)
{
  return 0.0f128;			/* XXSPLTIB 34,0.  */
}

_Float128
return_1 (void)
{
  return 1.0f128;			/* LXVKQ 34,1.  */
}

_Float128
return_2 (void)
{
  return 2.0f128;			/* LXVKQ 34,2.  */
}

_Float128
return_3 (void)
{
  return 3.0f128;			/* LXVKQ 34,3.  */
}

_Float128
return_4 (void)
{
  return 4.0f128;			/* LXVKQ 34,4.  */
}

_Float128
return_5 (void)
{
  return 5.0f128;			/* LXVKQ 34,5.  */
}

_Float128
return_6 (void)
{
  return 6.0f128;			/* LXVKQ 34,6.  */
}

_Float128
return_7 (void)
{
  return 7.0f128;			/* LXVKQ 34,7.  */
}

_Float128
return_m0 (void)
{
  return -0.0f128;			/* LXVKQ 34,16.  */
}

_Float128
return_m1 (void)
{
  return -1.0f128;			/* LXVKQ 34,17.  */
}

_Float128
return_m2 (void)
{
  return -2.0f128;			/* LXVKQ 34,18.  */
}

_Float128
return_m3 (void)
{
  return -3.0f128;			/* LXVKQ 34,19.  */
}

_Float128
return_m4 (void)
{
  return -4.0f128;			/* LXVKQ 34,20.  */
}

_Float128
return_m5 (void)
{
  return -5.0f128;			/* LXVKQ 34,21.  */
}

_Float128
return_m6 (void)
{
  return -6.0f128;			/* LXVKQ 34,22.  */
}

_Float128
return_m7 (void)
{
  return -7.0f128;			/* LXVKQ 34,23.  */
}

_Float128
return_inf (void)
{
  return __builtin_inff128 ();		/* LXVKQ 34,8.  */
}

_Float128
return_minf (void)
{
  return - __builtin_inff128 ();	/* LXVKQ 34,24.  */
}

_Float128
return_nan (void)
{
  return __builtin_nanf128 ("");	/* LXVKQ 34,9.  */
}

/* Note, the following NaNs should not generate a LXVKQ instruction.  */
_Float128
return_mnan (void)
{
  return - __builtin_nanf128 ("");	/* PLXV 34,... */
}

_Float128
return_nan2 (void)
{
  return __builtin_nanf128 ("1");	/* PLXV 34,... */
}

_Float128
return_nans (void)
{
  return __builtin_nansf128 ("");	/* PLXV 34,... */
}

vector long long
return_longlong_neg_0 (void)
{
  /* This vector is the same pattern as -0.0F128.  */
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define FIRST	0x8000000000000000
#define SECOND	0x0000000000000000

#else
#define FIRST	0x0000000000000000
#define SECOND	0x8000000000000000
#endif

  return (vector long long) { FIRST, SECOND };	/* LXVKQ 34,16.  */
}

/* { dg-final { scan-assembler-times {\mlxvkq\M}    19 } } */
/* { dg-final { scan-assembler-times {\mplxv\M}      3 } } */
/* { dg-final { scan-assembler-times {\mxxspltib\M}  1 } } */