blob: 01fbeb77e8e05d0c1a1ab4622f6e2140295c8684 [file] [log] [blame]
/*
* Test xor intrinsics.
* This test was created to check the correctness
* of the following intrinsics support:
* _mm512_xor_epi32()
* _mm512_mask_xor_epi32()
* _mm512_xor_epi64()
* _mm512_mask_xor_epi64()
*/
#include "m512_test_util.h"
#include <stdio.h>
volatile int vol = 0; /* Inhibit optimization */
__m512 f1, f2, f3, f3_orig;
__m512d d1, d2, d3, d3_orig;
__m512i i1, i2, i3, i3_orig;
void NOINLINE set_nonzero(void *vp, int c) {
int i;
V512 *v = (V512 *)vp;
for (i = 0; i < 16; i++) {
v->u32[i] = 10 * i * i - 3 * i + c;
if (v->u32[i] == 0) {
v->u32[i] = 1234;
}
}
}
void NOINLINE check_xor(void *vp1, void *vp2, void *vp3, void *vp_orig,
int mask, char *banner) {
int i;
V512 *v1 = (V512 *)vp1;
V512 *v2 = (V512 *)vp2;
V512 *v3 = (V512 *)vp3;
V512 *v_orig = (V512 *)vp_orig;
for (i = 0; i < 16; i++) {
int actual = v3->u32[i];
int expected = v_orig->u32[i];
if (mask & (1 << i)) {
expected = v1->u32[i] ^ v2->u32[i];
}
if (actual + vol != expected - vol) {
printf("ERROR: %s failed\n", banner ? banner : "");
n_errs++;
break;
}
}
}
void NOINLINE do_xor() {
set_nonzero(&i1, 99);
set_nonzero(&i2, 100);
set_nonzero(&f1, 33);
set_nonzero(&f2, -35);
set_nonzero(&d1, -11);
set_nonzero(&d2, 14);
set_nonzero(&i3, 1000);
i3_orig = i3;
i3 = _mm512_xor_epi32(i1, i2);
check_xor(&i1, &i2, &i3, &i3_orig, 0xffff, "_mm512_xor_epi32");
set_nonzero(&i3, 1500);
i3_orig = i3;
i3 = _mm512_mask_xor_epi32(i3_orig, 0x5555, i1, i2);
check_xor(&i1, &i2, &i3, &i3_orig, 0x5555, "_mm512_mask_xor_epi32");
set_nonzero(&i3, 2000);
i3_orig = i3;
i3 = _mm512_xor_epi64(i1, i2);
check_xor(&i1, &i2, &i3, &i3_orig, 0xffff, "_mm512_xor_epi64");
set_nonzero(&i3, 2500);
i3_orig = i3;
i3 = _mm512_mask_xor_epi64(i3_orig, 0x55, i1, i2);
check_xor(&i1, &i2, &i3, &i3_orig, 0x3333, "_mm512_mask_xor_epi64");
}
int main() {
do_xor();
if (n_errs != 0) {
printf("FAILED\n");
return 1;
}
printf("PASSED\n");
return 0;
}