blob: a0d5f988088fbbd5cd2ca73449cba7d5b5980061 [file] [log] [blame]
/* { dg-do run { target avx512fp16 } } */
/* { dg-options "-O2 -mavx512fp16 -mavx512vl -mprefer-vector-width=512" } */
static void condmov_test (void);
#define DO_TEST condmov_test
#define AVX512FP16
#define AVX512VL
#include "avx512f-check.h"
#include "avx512fp16-vcondmn-loop-1.c"
_Float16 a[32], b[32], c[32], fexp[32], fref[32];
s16 sa[32], sb[32], sc[32], sexp[32], sref[32];
u16 ua[32], ub[32], uc[32], uexp[32], uref[32];
#define EMULATE_CONDMOV_LOOP(size, type, ptype, op, name) \
void \
__attribute__ ((noinline, noclone)) \
scalar_cond_##size##ptype##type##name ( \
ptype * restrict a, ptype * restrict b, \
type * restrict c, type * restrict d) \
{ \
int i; \
for (i = 0; i < size; i++) \
{ \
if (a[i] op b[i]) \
d[i] = c[i]; \
} \
}
EMULATE_CONDMOV_LOOP (32, _Float16, _Float16, <, lt)
EMULATE_CONDMOV_LOOP (32, _Float16, _Float16, >, gt)
EMULATE_CONDMOV_LOOP (32, _Float16, _Float16, ==, eq)
EMULATE_CONDMOV_LOOP (16, _Float16, _Float16, <, lt)
EMULATE_CONDMOV_LOOP (16, _Float16, _Float16, >, gt)
EMULATE_CONDMOV_LOOP (16, _Float16, _Float16, ==, eq)
EMULATE_CONDMOV_LOOP (8, _Float16, _Float16, <, lt)
EMULATE_CONDMOV_LOOP (8, _Float16, _Float16, >, gt)
EMULATE_CONDMOV_LOOP (8, _Float16, _Float16, ==, eq)
EMULATE_CONDMOV_LOOP (32, _Float16, s16, <, lt)
EMULATE_CONDMOV_LOOP (32, _Float16, s16, >, gt)
EMULATE_CONDMOV_LOOP (32, _Float16, s16, ==, eq)
EMULATE_CONDMOV_LOOP (16, _Float16, s16, <, lt)
EMULATE_CONDMOV_LOOP (16, _Float16, s16, >, gt)
EMULATE_CONDMOV_LOOP (16, _Float16, s16, ==, eq)
EMULATE_CONDMOV_LOOP (8, _Float16, s16, <, lt)
EMULATE_CONDMOV_LOOP (8, _Float16, s16, >, gt)
EMULATE_CONDMOV_LOOP (8, _Float16, s16, ==, eq)
EMULATE_CONDMOV_LOOP (32, s16, _Float16, <, lt)
EMULATE_CONDMOV_LOOP (32, s16, _Float16, >, gt)
EMULATE_CONDMOV_LOOP (32, s16, _Float16, ==, eq)
EMULATE_CONDMOV_LOOP (16, s16, _Float16, <, lt)
EMULATE_CONDMOV_LOOP (16, s16, _Float16, >, gt)
EMULATE_CONDMOV_LOOP (16, s16, _Float16, ==, eq)
EMULATE_CONDMOV_LOOP (8, s16, _Float16, <, lt)
EMULATE_CONDMOV_LOOP (8, s16, _Float16, >, gt)
EMULATE_CONDMOV_LOOP (8, s16, _Float16, ==, eq)
EMULATE_CONDMOV_LOOP (32, _Float16, u16, <, lt)
EMULATE_CONDMOV_LOOP (32, _Float16, u16, >, gt)
EMULATE_CONDMOV_LOOP (32, _Float16, u16, ==, eq)
EMULATE_CONDMOV_LOOP (16, _Float16, u16, <, lt)
EMULATE_CONDMOV_LOOP (16, _Float16, u16, >, gt)
EMULATE_CONDMOV_LOOP (16, _Float16, u16, ==, eq)
EMULATE_CONDMOV_LOOP (8, _Float16, u16, <, lt)
EMULATE_CONDMOV_LOOP (8, _Float16, u16, >, gt)
EMULATE_CONDMOV_LOOP (8, _Float16, u16, ==, eq)
EMULATE_CONDMOV_LOOP (32, u16, _Float16, <, lt)
EMULATE_CONDMOV_LOOP (32, u16, _Float16, >, gt)
EMULATE_CONDMOV_LOOP (32, u16, _Float16, ==, eq)
EMULATE_CONDMOV_LOOP (16, u16, _Float16, <, lt)
EMULATE_CONDMOV_LOOP (16, u16, _Float16, >, gt)
EMULATE_CONDMOV_LOOP (16, u16, _Float16, ==, eq)
EMULATE_CONDMOV_LOOP (8, u16, _Float16, <, lt)
EMULATE_CONDMOV_LOOP (8, u16, _Float16, >, gt)
EMULATE_CONDMOV_LOOP (8, u16, _Float16, ==, eq)
void init()
{
int i;
for (i = 0; i < 32; i++)
{
ua[i] = sa[i] = a[i] = i;
ub[i] = sb[i] = b[i] = i;
uc[i] = sc[i] = c[i] = (32 - i) * 2;
uexp[i] = sexp[i] = fexp[i] = -1;
uref[i] = sref[i] = fref[i] = -1;
}
}
int check_cond(void *a, void *b, int size)
{
int i;
u16 *pa = (u16 *)a, *pb = (u16 *)b;
for (i = 0; i < size; i++)
if (pa[i] != pb[i])
return 0;
return 1;
}
#define TEST_CONDMOV_LOOP(size, name) \
{ \
init (); \
scalar_cond_##size##_Float16_Float16##name (a, b, c, fexp); \
loop_cond_##size##_Float16_Float16##name (a, b, c, fref); \
if (!check_cond ((void *)fexp, (void *)fref, size)) \
abort(); \
\
init (); \
scalar_cond_##size##_Float16s16##name (a, b, sc, sexp); \
loop_cond_##size##_Float16s16##name (a, b, sc, sref); \
if (!check_cond ((void *)sexp, (void *)sref, size)) \
abort(); \
\
init (); \
scalar_cond_##size##s16_Float16##name (sa, sb, c, fexp); \
loop_cond_##size##s16_Float16##name (sa, sb, c, fref); \
if (!check_cond ((void *)fexp, (void *)fref, size)) \
abort(); \
\
init (); \
scalar_cond_##size##_Float16u16##name (a, b, uc, uexp); \
loop_cond_##size##_Float16u16##name (a, b, uc, uref); \
if (!check_cond ((void *)uexp, (void *)uref, size)) \
abort(); \
\
init (); \
scalar_cond_##size##u16_Float16##name (ua, ub, c, fexp); \
loop_cond_##size##u16_Float16##name (ua, ub, c, fref); \
if (!check_cond ((void *)fexp, (void *)fref, size)) \
abort(); \
}
static void condmov_test()
{
TEST_CONDMOV_LOOP (32, lt)
TEST_CONDMOV_LOOP (32, gt)
TEST_CONDMOV_LOOP (32, eq)
TEST_CONDMOV_LOOP (16, lt)
TEST_CONDMOV_LOOP (16, gt)
TEST_CONDMOV_LOOP (16, eq)
TEST_CONDMOV_LOOP (8, lt)
TEST_CONDMOV_LOOP (8, gt)
TEST_CONDMOV_LOOP (8, eq)
}