1/* { dg-do run } */ 2/* { dg-require-effective-target avx2 } */ 3/* { dg-options "-O3 -mavx2 -ffast-math" } */ 4 5#include "avx2-check.h" 6 7#define N 1024 8float f[N]; 9double d[N]; 10int k[N]; 11float *l[N]; 12double *n[N]; 13int **m[N]; 14long **o[N]; 15long q[N]; 16long *r[N]; 17int *s[N]; 18 19__attribute__((noinline, noclone)) float 20f1 (void) 21{ 22 int i; 23 float g = 0.0; 24 for (i = 0; i < N / 2; i++) 25 g += f[k[i]]; 26 return g; 27} 28 29__attribute__((noinline, noclone)) float 30f2 (float *p) 31{ 32 int i; 33 float g = 0.0; 34 for (i = 0; i < N / 2; i++) 35 g += p[k[i]]; 36 return g; 37} 38 39__attribute__((noinline, noclone)) float 40f3 (void) 41{ 42 int i; 43 float g = 0.0; 44 for (i = 0; i < N / 2; i++) 45 g += *l[i]; 46 return g; 47} 48 49__attribute__((noinline, noclone)) int 50f4 (void) 51{ 52 int i; 53 int g = 0; 54 for (i = 0; i < N / 2; i++) 55 g += **m[i]; 56 return g; 57} 58 59__attribute__((noinline, noclone)) double 60f5 (void) 61{ 62 int i; 63 double g = 0.0; 64 for (i = 0; i < N / 2; i++) 65 g += d[k[i]]; 66 return g; 67} 68 69__attribute__((noinline, noclone)) double 70f6 (double *p) 71{ 72 int i; 73 double g = 0.0; 74 for (i = 0; i < N / 2; i++) 75 g += p[k[i]]; 76 return g; 77} 78 79__attribute__((noinline, noclone)) double 80f7 (void) 81{ 82 int i; 83 double g = 0.0; 84 for (i = 0; i < N / 2; i++) 85 g += *n[i]; 86 return g; 87} 88 89__attribute__((noinline, noclone)) int 90f8 (void) 91{ 92 int i; 93 int g = 0; 94 for (i = 0; i < N / 2; i++) 95 g += **o[i]; 96 return g; 97} 98 99__attribute__((noinline, noclone)) float 100f9 (void) 101{ 102 int i; 103 float g = 0.0; 104 for (i = 0; i < N / 2; i++) 105 g += f[q[i]]; 106 return g; 107} 108 109__attribute__((noinline, noclone)) float 110f10 (float *p) 111{ 112 int i; 113 float g = 0.0; 114 for (i = 0; i < N / 2; i++) 115 g += p[q[i]]; 116 return g; 117} 118 119__attribute__((noinline, noclone)) double 120f11 (void) 121{ 122 int i; 123 double g = 0.0; 124 for (i = 0; i < N / 2; i++) 125 g += d[q[i]]; 126 return g; 127} 128 129__attribute__((noinline, noclone)) double 130f12 (double *p) 131{ 132 int i; 133 double g = 0.0; 134 for (i = 0; i < N / 2; i++) 135 g += p[q[i]]; 136 return g; 137} 138 139static void 140avx2_test (void) 141{ 142 int i; 143 144 for (i = 0; i < N; i++) 145 { 146 asm (""); 147 f[i] = -256.0f + i; 148 d[i] = -258.0 + i; 149 k[i] = (i * 731) & (N - 1); 150 q[i] = (i * 657) & (N - 1); 151 l[i] = &f[(i * 239) & (N - 1)]; 152 n[i] = &d[(i * 271) & (N - 1)]; 153 r[i] = &q[(i * 323) & (N - 1)]; 154 s[i] = &k[(i * 565) & (N - 1)]; 155 m[i] = &s[(i * 13) & (N - 1)]; 156 o[i] = &r[(i * 19) & (N - 1)]; 157 } 158 159 if (f1 () != 136448.0f || f2 (f) != 136448.0f || f3 () != 130304.0) 160 abort (); 161 if (f4 () != 261376 || f5 () != 135424.0 || f6 (d) != 135424.0) 162 abort (); 163 if (f7 () != 129280.0 || f8 () != 259840L || f9 () != 130816.0f) 164 abort (); 165 if (f10 (f) != 130816.0f || f11 () != 129792.0 || f12 (d) != 129792.0) 166 abort (); 167} 168