1160814Ssimon/* { dg-do run } */ 2280304Sjkim/* { dg-options "-mavx512f -O2" } */ 3160814Ssimon/* { dg-require-effective-target avx512f } */ 4280304Sjkim 5160814Ssimon#include "avx512f-check.h" 6160814Ssimon 7160814Ssimonstatic void 8160814Ssimoninit_vpadd_mask (int* dst, int *src1, int *src2, int seed) 9160814Ssimon{ 10160814Ssimon int i; 11160814Ssimon 12160814Ssimon for (i = 0; i < 16; i++) 13160814Ssimon { 14280304Sjkim dst[i] = -1; 15160814Ssimon src1[i] = seed * 2 * i + 1; 16160814Ssimon src2[i] = seed * 2 * i; 17160814Ssimon } 18160814Ssimon} 19160814Ssimon 20160814Ssimonstatic inline void 21160814Ssimoncalc_vpadd_mask_zeroed (int *dst, __mmask16 m, int *src1, int *src2) 22160814Ssimon{ 23160814Ssimon int i; 24160814Ssimon 25160814Ssimon for (i = 0; i < 16; i++) 26160814Ssimon { 27160814Ssimon if (m & (1 << i)) 28160814Ssimon dst[i] = src1[i] + src2[i]; 29160814Ssimon else 30160814Ssimon dst[i] = 0; 31160814Ssimon } 32160814Ssimon} 33160814Ssimon 34160814Ssimonvoid static 35160814Ssimonavx512f_test (void) 36160814Ssimon{ 37160814Ssimon /* Checking mask arithmetic instruction */ 38160814Ssimon 39160814Ssimon __mmask16 msk_dst, msk_src1, msk_src2, msk_dst_ref; 40160814Ssimon 41160814Ssimon msk_src1 = 0x0FFB; 42160814Ssimon msk_src2 = 0x0F0F; 43160814Ssimon 44160814Ssimon asm ("kandw\t%2, %1, %0" 45160814Ssimon : "=k" (msk_dst) 46160814Ssimon : "k" (msk_src1), "k" (msk_src2)); 47160814Ssimon 48160814Ssimon msk_dst_ref = _mm512_kand (msk_src1, msk_src2); 49160814Ssimon if (msk_dst != msk_dst_ref) 50160814Ssimon abort (); 51160814Ssimon 52160814Ssimon 53160814Ssimon /* Checking zero-masked vector instruction */ 54160814Ssimon union512i_d dst, src1, src2; 55160814Ssimon int dst_ref[16]; 56160814Ssimon 57160814Ssimon init_vpadd_mask (dst.a, src1.a, src2.a, 1); 58160814Ssimon init_vpadd_mask (dst_ref, src1.a, src2.a, 1); 59160814Ssimon 60160814Ssimon asm ("vpaddd\t%2, %1, %0 %{%3%}%{z%}" 61160814Ssimon : "=x" (dst.x) 62160814Ssimon : "x" (src1.x), "x" (src2.x), "Yk" (msk_dst)); 63160814Ssimon 64160814Ssimon calc_vpadd_mask_zeroed (dst_ref, msk_dst, src1.a, src2.a); 65280304Sjkim 66160814Ssimon if (check_union512i_d (dst, dst_ref)) 67160814Ssimon abort (); 68160814Ssimon} 69160814Ssimon