/* { dg-do compile }  */
/* { dg-require-effective-target arm_v8_2a_fp16_scalar_ok }  */
/* { dg-options "-O2" }  */
/* { dg-add-options arm_v8_2a_fp16_scalar }  */
/* { dg-additional-options "-mfloat-abi=hard" } */
/* { dg-final { check-function-bodies "**" "" } } */

/*
**test_load_1:
**	...
**	vld1.16	{d[0-9]+\[[0-9]+\]}, \[r[0-9]+\]
**	...
*/
__fp16
test_load_1 (__fp16* a)
{
  return *a;
}

/*
**test_load_2:
**	...
**	vld1.16	{d[0-9]+\[[0-9]+\]}, \[r[0-9]+\]
**	...
*/
__fp16
test_load_2 (__fp16* a, int i)
{
  return a[i];
}

/*
**test_store_1:
**	...
**	vst1.16	{d[0-9]+\[[0-9]+\]}, \[r[0-9]+\]
**	...
*/
void
test_store_1 (__fp16* a, __fp16 b)
{
  *a = b;
}

/*
**test_store_2:
**	...
**	vst1.16	{d[0-9]+\[[0-9]+\]}, \[r[0-9]+\]
**	...
*/
void
test_store_2 (__fp16* a, int i, __fp16 b)
{
  a[i] = b;
}

/*
**test_load_store_1:
**	...
**	vld1.16	{d[0-9]+\[[0-9]+\]}, \[r[0-9]+\]
**	...
**	vst1.16	{d[0-9]+\[[0-9]+\]}, \[r[0-9]+\]
**	...
*/
__fp16
test_load_store_1 (__fp16* a, int i, __fp16* b)
{
  a[i] = b[i];
}

/*
**test_load_store_2:
**	...
**	vld1.16	{d[0-9]+\[[0-9]+\]}, \[r[0-9]+\]
**	...
**	vst1.16	{d[0-9]+\[[0-9]+\]}, \[r[0-9]+\]
**	...
*/
__fp16
test_load_store_2 (__fp16* a, int i, __fp16* b)
{
  a[i] = b[i + 2];
  return a[i];
}

__fp16
test_select_1 (int sel, __fp16 a, __fp16 b)
{
  if (sel)
    return a;
  else
    return b;
}

__fp16
test_select_2 (int sel, __fp16 a, __fp16 b)
{
  return sel ? a : b;
}

__fp16
test_select_3 (__fp16 a, __fp16 b, __fp16 c)
{
  return (a == b) ? b : c;
}

__fp16
test_select_4 (__fp16 a, __fp16 b, __fp16 c)
{
  return (a != b) ? b : c;
}

__fp16
test_select_5 (__fp16 a, __fp16 b, __fp16 c)
{
  return (a < b) ? b : c;
}

__fp16
test_select_6 (__fp16 a, __fp16 b, __fp16 c)
{
  return (a <= b) ? b : c;
}

__fp16
test_select_7 (__fp16 a, __fp16 b, __fp16 c)
{
  return (a > b) ? b : c;
}

__fp16
test_select_8 (__fp16 a, __fp16 b, __fp16 c)
{
  return (a >= b) ? b : c;
}

/* { dg-final { scan-assembler-times {vseleq\.f16\ts[0-9]+, s[0-9]+, s[0-9]+} 4 } } */
/* { dg-final { scan-assembler-times {vselgt\.f16\ts[0-9]+, s[0-9]+, s[0-9]+} 1 } }  */
/* { dg-final { scan-assembler-times {vselge\.f16\ts[0-9]+, s[0-9]+, s[0-9]+} 1 } }  */

/* { dg-final { scan-assembler-not {vmov\.f16} } }  */

int
test_compare_1 (__fp16 a, __fp16 b)
{
  if (a == b)
    return -1;
  else
    return 0;
}

int
test_compare_ (__fp16 a, __fp16 b)
{
  if (a != b)
    return -1;
  else
    return 0;
}

int
test_compare_2 (__fp16 a, __fp16 b)
{
  if (a > b)
    return -1;
  else
    return 0;
}

int
test_compare_3 (__fp16 a, __fp16 b)
{
  if (a >= b)
    return -1;
  else
    return 0;
}

int
test_compare_4 (__fp16 a, __fp16 b)
{
  if (a < b)
    return -1;
  else
    return 0;
}

int
test_compare_5 (__fp16 a, __fp16 b)
{
  if (a <= b)
    return -1;
  else
    return 0;
}

/* { dg-final { scan-assembler-not {vcmp\.f16} } }  */
/* { dg-final { scan-assembler-not {vcmpe\.f16} } }  */

/* { dg-final { scan-assembler-times {vcmp\.f32} 4 } }  */
/* { dg-final { scan-assembler-times {vcmpe\.f32} 8 } }  */
