1/* { dg-do run } */ 2/* { dg-options "-mavx512f -O2" } */ 3/* { dg-require-effective-target avx512f } */ 4 5#include "avx512f-check.h" 6 7#define SCALE 2 8 9static void 10compute_gatherdq (long long *res, __mmask8 m8, int *idx, 11 long long *src, int scale, long long *r) 12{ 13 int i; 14 15 for (i = 0; i < 8; i++) 16 { 17 if (m8 & (1 << i)) 18 r[i] = *(long long *) 19 (((unsigned char *) src) + idx[i] * scale); 20 else 21 r[i] = res[i]; 22 } 23} 24 25static void 26avx512f_test (void) 27{ 28 int i; 29 union256i_d idx; 30 union512i_q res; 31 long long src[8]; 32 long long res_ref[8]; 33 __mmask8 m8 = 0xC5; 34 35 for (i = 0; i < 8; i++) 36 { 37 src[i] = 1983 * (i + 1) * (i + 2); 38 39 /* About to gather in reverse order, 40 divide by 2 to demonstrate scale */ 41 idx.a[i] = (64 - (i + 1) * 8) >> 1; 42 } 43 44 res.x = _mm512_mask_i32gather_epi64 (res.x, m8, idx.x, src, SCALE); 45 compute_gatherdq (res.a, m8, idx.a, src, SCALE, res_ref); 46 47 if (check_union512i_q (res, res_ref)) 48 abort (); 49 50 res.x = _mm512_i32gather_epi64 (idx.x, src, SCALE); 51 compute_gatherdq (res.a, 0xFF, idx.a, src, SCALE, res_ref); 52 53 if (check_union512i_q (res, res_ref)) 54 abort (); 55} 56