blob: b8d3e8a4e9681f6776aae7a79a862373fc492d71 [file] [log] [blame]
/* { dg-do run { target avx512fp16 } } */
/* { dg-options "-O2 -mavx512fp16 -mavx512vl" } */
#include <string.h>
#include <stdlib.h>
static void do_test (void);
#define DO_TEST do_test
#define AVX512FP16
#include "avx512-check.h"
#include "avx512vlfp16-11a.c"
/* Get random float16 between -50.x to 50.x. */
_Float16
get_float16_noround()
{
return ((int) (100.0 * rand ()/ (RAND_MAX + 1.0)) - 50)
+ 0.1f * (int) (10 * rand() / (RAND_MAX + 1.0));
}
static void
do_test (void)
{
_Float16 x[16];
_Float16 y[16];
_Float16 res_add[16];
_Float16 res_sub[16];
_Float16 res_mul[16];
_Float16 res_div[16];
for (int i = 0 ; i != 16; i++)
{
x[i] = get_float16_noround ();
y[i] = get_float16_noround ();
if (y[i] == 0)
y[i] = 1.0f;
res_add[i] = x[i] + y[i];
res_sub[i] = x[i] - y[i];
res_mul[i] = x[i] * y[i];
res_div[i] = x[i] / y[i];
}
union128h u128 = { x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7] };
union128h u128_1 = { y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7] };
union256h u256 = { x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7],
x[8], x[9], x[10], x[11], x[12], x[13], x[14], x[15] };
union256h u256_1 = { y[0], y[1], y[2], y[3], y[4], y[5], y[6], y[7],
y[8], y[9], y[10], y[11], y[12], y[13], y[14], y[15]};
__m128h v128;
__m256h v256;
union128h a128;
union256h a256;
memset (&v128, -1, sizeof (v128));
v128 = vadd128 (u128.x, u128_1.x);
a128.x = v128;
if (check_union128h (a128, res_add))
abort ();
memset (&v128, -1, sizeof (v128));
v128 = vsub128 (u128.x, u128_1.x);
a128.x = v128;
if (check_union128h (a128, res_sub))
abort ();
memset (&v128, -1, sizeof (v128));
v128 = vmul128 (u128.x, u128_1.x);
a128.x = v128;
if (check_union128h (a128, res_mul))
abort ();
memset (&v128, -1, sizeof (v128));
v128 = vdiv128 (u128.x, u128_1.x);
a128.x = v128;
if (check_union128h (a128, res_div))
abort ();
memset (&v256, -1, sizeof (v256));
v256 = vadd256 (u256.x, u256_1.x);
a256.x = v256;
if (check_union256h (a256, res_add))
abort ();
memset (&v256, -1, sizeof (v256));
v256 = vsub256 (u256.x, u256_1.x);
a256.x = v256;
if (check_union256h (a256, res_sub))
abort ();
memset (&v256, -1, sizeof (v256));
v256 = vmul256 (u256.x, u256_1.x);
a256.x = v256;
if (check_union256h (a256, res_mul))
abort ();
memset (&v256, -1, sizeof (v256));
v256 = vdiv256 (u256.x, u256_1.x);
a256.x = v256;
if (check_union256h (a256, res_div))
abort ();
}