1249259Sdim/* { dg-do run } */ 2249259Sdim/* { dg-options "-O2 -mavx512f" } */ 3249259Sdim/* { dg-require-effective-target avx512f } */ 4249259Sdim 5249259Sdim#define AVX512F 6249259Sdim 7249259Sdim#include "avx512f-helper.h" 8249259Sdim 9249259Sdim#define SIZE (AVX512F_LEN / 64) 10249259Sdim#include "avx512f-mask-type.h" 11249259Sdim 12249259Sdim#if AVX512F_LEN > 256 13249259Sdim #define CTRL 129 14249259Sdim#elif AVX512F_LEN > 128 15249259Sdim #define CTRL 5 16249259Sdim#else 17249259Sdim #define CTRL 1 18249259Sdim#endif 19249259Sdim 20249259Sdimstatic void 21249259SdimCALC (double *s1, int s2, double *r) 22249259Sdim{ 23249259Sdim int i; 24249259Sdim 25249259Sdim for (i = 0; i < SIZE; i++) 26249259Sdim { 27249259Sdim r[i] = (s2 & (1 << i)) ? s1[1 + 2 * (i / 2)] : s1[2 * (i / 2)]; 28249259Sdim } 29249259Sdim} 30249259Sdim 31249259Sdimvoid 32249259SdimTEST (void) 33249259Sdim{ 34249259Sdim UNION_TYPE (AVX512F_LEN, d) s1, res1, res2, res3; 35249259Sdim MASK_TYPE mask = MASK_VALUE; 36249259Sdim double res_ref[SIZE]; 37249259Sdim int i; 38249259Sdim 39249259Sdim for (i = 0; i < SIZE; i++) 40249259Sdim { 41249259Sdim s1.a[i] = i + 10.; 42249259Sdim res2.a[i] = DEFAULT_VALUE; 43249259Sdim } 44249259Sdim 45249259Sdim res1.x = INTRINSIC (_permute_pd) (s1.x, CTRL); 46249259Sdim res2.x = INTRINSIC (_mask_permute_pd) (res2.x, mask, s1.x, CTRL); 47249259Sdim res3.x = INTRINSIC (_maskz_permute_pd) (mask, s1.x, CTRL); 48249259Sdim 49249259Sdim CALC (s1.a, CTRL, res_ref); 50249259Sdim 51249259Sdim if (UNION_CHECK (AVX512F_LEN, d) (res1, res_ref)) 52249259Sdim abort (); 53249259Sdim 54249259Sdim MASK_MERGE (d) (res_ref, mask, SIZE); 55249259Sdim if (UNION_CHECK (AVX512F_LEN, d) (res2, res_ref)) 56249259Sdim abort (); 57249259Sdim 58249259Sdim MASK_ZERO (d) (res_ref, mask, SIZE); 59249259Sdim if (UNION_CHECK (AVX512F_LEN, d) (res3, res_ref)) 60249259Sdim abort (); 61249259Sdim} 62249259Sdim 63249259Sdim#undef CTRL 64249259Sdim