diff options
Diffstat (limited to 'SingleSource/UnitTests/Vector/AVX512F/xor.c')
-rw-r--r-- | SingleSource/UnitTests/Vector/AVX512F/xor.c | 93 |
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; +} |