aboutsummaryrefslogtreecommitdiff
path: root/SingleSource/UnitTests/Vector/AVX512F/xor.c
diff options
context:
space:
mode:
Diffstat (limited to 'SingleSource/UnitTests/Vector/AVX512F/xor.c')
-rw-r--r--SingleSource/UnitTests/Vector/AVX512F/xor.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/SingleSource/UnitTests/Vector/AVX512F/xor.c b/SingleSource/UnitTests/Vector/AVX512F/xor.c
new file mode 100644
index 00000000..01fbeb77
--- /dev/null
+++ b/SingleSource/UnitTests/Vector/AVX512F/xor.c
@@ -0,0 +1,93 @@
+/*
+ * 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;
+}