1135446Strhodes/* { dg-do run } */ 2254897Serwin/* { dg-options "-mavx2 -O2" } */ 3135446Strhodes/* { dg-require-effective-target avx2 } */ 4135446Strhodes 5193149Sdougb#include "avx2-check.h" 6135446Strhodes#include <string.h> 7135446Strhodes 8135446Strhodes#define NUM 10 9135446Strhodes 10135446Strhodesstatic void 11135446Strhodesinit_permd (int *src1, int *src2, int seed) 12135446Strhodes{ 13135446Strhodes int i, sign = 1; 14135446Strhodes 15135446Strhodes for (i = 0; i < 8; i++) 16135446Strhodes { 17135446Strhodes src1[i] = (i + seed) * (i + seed) * sign; 18254897Serwin src2[i] = (i + seed + 20) * sign; 19135446Strhodes sign = -sign; 20135446Strhodes } 21135446Strhodes} 22135446Strhodes 23135446Strhodesstatic void 24135446Strhodescalc_permd (int *src1, int *src2, int *dst) 25135446Strhodes{ 26135446Strhodes int i; 27193149Sdougb unsigned temp; 28170222Sdougb 29135446Strhodes memcpy (dst, src1, 32); 30135446Strhodes for (i = 0; i < 8; i++) 31135446Strhodes { 32135446Strhodes temp = src2[i]; 33135446Strhodes dst[i] = src1[temp & 7]; 34135446Strhodes } 35135446Strhodes} 36135446Strhodes 37135446Strhodesstatic void 38135446Strhodesavx2_test (void) 39135446Strhodes{ 40135446Strhodes union256i_d src1, src2, dst; 41135446Strhodes int dst_ref[8]; 42135446Strhodes int i; 43135446Strhodes 44135446Strhodes for (i = 0; i < NUM; i++) 45135446Strhodes { 46135446Strhodes init_permd (src1.a, src2.a, i); 47135446Strhodes 48135446Strhodes dst.x = _mm256_permutevar8x32_epi32 (src1.x, src2.x); 49135446Strhodes calc_permd (src1.a, src2.a, dst_ref); 50135446Strhodes 51135446Strhodes if (check_union256i_d (dst, dst_ref)) 52135446Strhodes abort (); 53170222Sdougb } 54170222Sdougb} 55170222Sdougb