| /* { dg-additional-options "-mavx2 -mtune-ctrl=use_gather" { target avx2_runtime } } */ |
| |
| #include "tree-vect.h" |
| |
| #define MASKGATHER(SUFF, TYPE1, TYPE2) \ |
| TYPE1 * __attribute__((noipa)) \ |
| maskgather ## SUFF (int n, TYPE2 *indices, TYPE1 *data) \ |
| { \ |
| TYPE1 *out = __builtin_malloc (sizeof (TYPE1) * n); \ |
| for (int i = 0; i < n; ++i) \ |
| { \ |
| TYPE2 d = indices[i]; \ |
| if (d > 1) \ |
| out[i] = data[d]; \ |
| } \ |
| return out; \ |
| } |
| |
| MASKGATHER(udiusi, unsigned long long, unsigned int) |
| MASKGATHER(usiusi, unsigned int, unsigned int) |
| MASKGATHER(udiudi, unsigned long long, unsigned long long) |
| MASKGATHER(usiudi, unsigned int, unsigned long long) |
| |
| int |
| main() |
| { |
| check_vect (); |
| |
| unsigned int idx4[32], data4[32]; |
| unsigned long long idx8[32], data8[32]; |
| for (int i = 0; i < 32; ++i) |
| { |
| idx4[i] = i; |
| idx8[i] = i; |
| data4[i] = i; |
| data8[i] = i; |
| } |
| unsigned long long *resudiusi = maskgatherudiusi (16, idx4, data8); |
| unsigned int *resusiusi = maskgatherusiusi (16, idx4, data4); |
| unsigned long long *resudiudi = maskgatherudiudi (16, idx8, data8); |
| unsigned int *resusiudi = maskgatherusiudi (16, idx8, data4); |
| for (int i = 0; i < 16; ++i) |
| { |
| unsigned int d = idx4[i]; |
| if (d > 1) |
| { |
| if (resudiusi[i] != data4[d]) |
| __builtin_abort (); |
| if (resudiudi[i] != data4[d]) |
| __builtin_abort (); |
| if (resusiudi[i] != data4[d]) |
| __builtin_abort (); |
| if (resusiusi[i] != data4[d]) |
| __builtin_abort (); |
| } |
| } |
| return 0; |
| } |
| |