blob: 40b8eb9929dabe37e890138e97ecdef70e3afbdb [file] [log] [blame]
/* PR target/87767 */
/* { dg-do run } */
/* { dg-options "-O2 -mavx512f -mavx512vl" } */
/* { dg-require-effective-target avx512vl } */
#define AVX512VL
#include "avx512f-helper.h"
#include "avx512vl-broadcast-pr87767-3.c"
#define RTEST(VTYPE, TYPE, N, OP_NAME, OP1, OP2) \
do \
{ \
TYPE exp[N], src1[N], src2[N]; \
VTYPE res; \
for (int i = 0; i < N; i++) \
{ \
src1[i] = i * i * 107.2f; \
src2[i] = i * 2.f - 404.f; \
} \
res = foo_##OP_NAME##_##VTYPE (*(VTYPE*)&src1[0], *(VTYPE*)&src2[0]); \
for (int i = 0; i < N; i ++) \
exp[i] = (OP1 src1[i] * src2[i]) OP2 CONSTANT; \
for (int j = 0; j < N; j++) \
{ \
if (res[j] != exp[j]) \
abort(); \
} \
} \
while (0)
void
test_256 (void)
{
RTEST (v8sf, float, 8, fma,, +);
RTEST (v4df, double, 4, fma,, +);
RTEST (v8sf, float, 8, fms,, -);
RTEST (v4df, double, 4, fms,, -);
RTEST (v8sf, float, 8, fnma,-, +);
RTEST (v4df, double, 4, fnma,-, +);
RTEST (v8sf, float, 8, fnms,-, -);
RTEST (v4df, double, 4, fnms,-, -);
}
void
test_128 (void)
{
RTEST (v4sf, float, 4, fma,, +);
RTEST (v2df, double, 2, fma,, +);
RTEST (v4sf, float, 4, fms,, -);
RTEST (v2df, double, 2, fms,, -);
RTEST (v4sf, float, 4, fnma,-, +);
RTEST (v2df, double, 2, fnma,-, +);
RTEST (v4sf, float, 4, fnms,-, -);
RTEST (v2df, double, 2, fnms,-, -);
}