blob: 72982f95aed7c36348bb21bf67afe0fa385d3aee [file] [log] [blame]
/* This file is used to reduce a number of runtime tests for AVX512F
and AVX512VL instructions. Idea is to create one file per instruction -
avx512f-insn-2.c - using defines from this file instead of intrinsic
name, vector length etc. Then dg-options are set with appropriate
-Dwhatever options in that .c file producing tests for specific
length. */
#ifndef AVX512F_HELPER_INCLUDED
#define AVX512F_HELPER_INCLUDED
#include "avx512-check.h"
/* Macros expansion. */
#define CONCAT(a,b,c) a ## b ## c
#define EVAL(a,b,c) CONCAT(a,b,c)
/* Value to be written into destination.
We have one value for all types so it must be small enough
to fit into signed char. */
#ifndef DEFAULT_VALUE
#define DEFAULT_VALUE 117
#endif
#define MAKE_MASK_MERGE(NAME, TYPE) \
static void \
__attribute__((noinline, unused)) \
merge_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
{ \
int i; \
for (i = 0; i < size; i++) \
{ \
arr[i] = (mask & (1LL << i)) ? arr[i] : DEFAULT_VALUE; \
} \
}
MAKE_MASK_MERGE(i_b, char)
MAKE_MASK_MERGE(i_w, short)
MAKE_MASK_MERGE(i_d, int)
MAKE_MASK_MERGE(i_q, long long)
MAKE_MASK_MERGE(, float)
MAKE_MASK_MERGE(d, double)
MAKE_MASK_MERGE(i_ub, unsigned char)
MAKE_MASK_MERGE(i_uw, unsigned short)
MAKE_MASK_MERGE(i_ud, unsigned int)
MAKE_MASK_MERGE(i_uq, unsigned long long)
#define MASK_MERGE(TYPE) merge_masking_##TYPE
#define MAKE_MASK_ZERO(NAME, TYPE) \
static void \
__attribute__((noinline, unused)) \
zero_masking_##NAME (TYPE *arr, unsigned long long mask, int size) \
{ \
int i; \
for (i = 0; i < size; i++) \
{ \
arr[i] = (mask & (1LL << i)) ? arr[i] : 0; \
} \
}
MAKE_MASK_ZERO(i_b, char)
MAKE_MASK_ZERO(i_w, short)
MAKE_MASK_ZERO(i_d, int)
MAKE_MASK_ZERO(i_q, long long)
MAKE_MASK_ZERO(, float)
MAKE_MASK_ZERO(d, double)
MAKE_MASK_ZERO(i_ub, unsigned char)
MAKE_MASK_ZERO(i_uw, unsigned short)
MAKE_MASK_ZERO(i_ud, unsigned int)
MAKE_MASK_ZERO(i_uq, unsigned long long)
#define MASK_ZERO(TYPE) zero_masking_##TYPE
/* Unions used for testing (for example union512d, union256d etc.). */
#define UNION_TYPE(SIZE, NAME) EVAL(union, SIZE, NAME)
/* Corresponding union check. */
#define UNION_CHECK(SIZE, NAME) EVAL(check_union, SIZE, NAME)
/* Corresponding fp union check. */
#define UNION_FP_CHECK(SIZE, NAME) EVAL(check_fp_union, SIZE, NAME)
/* Corresponding rough union check. */
#define UNION_ROUGH_CHECK(SIZE, NAME) \
EVAL(check_rough_union, SIZE, NAME)
/* Function which tests intrinsic for given length. */
#define TEST EVAL(test_, AVX512F_LEN,)
/* Function which calculates result. */
#define CALC EVAL(calc_, AVX512F_LEN,)
#ifndef AVX512VL
#define AVX512F_LEN 512
#define AVX512F_LEN_HALF 256
#endif
#endif /* AVX512F_HELPER_INCLUDED */
/* Intrinsic being tested. It has different deffinitions,
depending on AVX512F_LEN, so it's outside include guards
and in undefed away to silence warnings. */
#if defined INTRINSIC
#undef INTRINSIC
#endif
#if AVX512F_LEN != 128
#define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME)
#else
#define INTRINSIC(NAME) _mm ## NAME
#endif