blob: abf320f3a6c69df12cdefa83d048152a18e57b2f [file] [log] [blame]
#include "m512_test_util.h"
#include <stdio.h>
#include <string.h>
/*
* Here we check for _mm512_[mask|maskz]_[rsqrt14|rcp14] intrinsics.
*/
#define CHECK_PD(op) \
{ \
volatile __m512d r = _mm512_##op##_pd(v1); \
check_equal_ndf(&r, &exp, 8, "_mm512_" #op "_pd", __LINE__); \
k8 = 0xAA; \
r = _mm512_mask_##op##_pd(undef, k8, v1); \
check_equal_ndf(&r, &expm, 8, "_mm512_mask_" #op "_pd{1}", __LINE__); \
r = _mm512_maskz_##op##_pd(k8, v1); \
check_equal_ndf(&r, &expzm, 8, "_mm512_maskz_" #op "_pd{0}", __LINE__); \
}
#define DECL_PD(op, srcv, expv) \
void NOINLINE do_##op##_pd() { \
__mmask8 k8; \
volatile __m512d v1 = _mm512_set1_pd((srcv)); \
\
volatile __m512d undef = _mm512_set1_pd(3.0); \
__m512d exp = _mm512_set1_pd(expv); \
__m512d expm = \
_mm512_set_pd((expv), 3.0, (expv), 3.0, (expv), 3.0, (expv), 3.0); \
__m512d expzm = _mm512_set_pd((expv), 0, (expv), 0, (expv), 0, (expv), 0); \
\
CHECK_PD(op); \
}
#define TEST_PD(op) do_##op##_pd()
// PS version starts here.
#define CHECK_PS(op) \
{ \
volatile __m512 r = _mm512_##op##_ps(v1); \
check_equal_nsf(&r, &exp, 16, "_mm512_" #op "_ps", __LINE__); \
k8 = 0xAAAA; \
r = _mm512_mask_##op##_ps(undef, k8, v1); \
check_equal_nsf(&r, &expm, 16, "_mm512_mask_" #op "_ps{1}", __LINE__); \
r = _mm512_maskz_##op##_ps(k8, v1); \
check_equal_nsf(&r, &expzm, 16, "_mm512_maskz_" #op "_ps{0}", __LINE__); \
}
#define DECL_PS(op, srcv, expv) \
void NOINLINE do_##op##_ps() { \
__mmask16 k8; \
volatile __m512 v1 = _mm512_set1_ps((srcv)); \
\
volatile __m512 undef = _mm512_set1_ps(3.0); \
__m512 exp = _mm512_set1_ps(expv); \
__m512 expm = \
_mm512_set_ps((expv), 3.0, (expv), 3.0, (expv), 3.0, (expv), 3.0, \
(expv), 3.0, (expv), 3.0, (expv), 3.0, (expv), 3.0); \
__m512 expzm = _mm512_set_ps((expv), 0, (expv), 0, (expv), 0, (expv), 0, \
(expv), 0, (expv), 0, (expv), 0, (expv), 0); \
\
CHECK_PS(op); \
}
#define TEST_PS(op) do_##op##_ps()
DECL_PD(rsqrt14, 0.25, 2.0)
DECL_PS(rsqrt14, 0.16f, 2.5f)
DECL_PD(rcp14, 0.5, 2.0)
DECL_PS(rcp14, 0.4f, 2.5f)
int main(int argc, char *argv[]) {
TEST_PD(rcp14);
TEST_PS(rcp14);
TEST_PD(rsqrt14);
TEST_PS(rsqrt14);
if (n_errs != 0) {
printf("FAILED\n");
return 1;
}
printf("PASSED\n");
return 0;
}