/* { dg-do run } */ /* { dg-options "-O2 -mavx512vl -mavx512fp16" } */ /* { dg-require-effective-target avx512vl } */ /* { dg-require-effective-target avx512fp16 } */ #define AVX512VL #define AVX512FP16 #ifndef CHECK #define CHECK "avx512f-helper.h" #endif #include CHECK #include "pr102327-1.c" #define RUNCHECK_VEC_EXTRACT(U,V,S,IDX) \ do \ { \ S tmp = vec_extract_##V##_##IDX ((V)U.x); \ if (tmp != U.a[IDX]) \ abort(); \ } \ while (0) #define RUNCHECK_VEC_SET(UTYPE,U,V,S,IDX,NUM) \ do \ { \ S tmp = 3.0f; \ UTYPE res; \ res.x = vec_set_##V##_##IDX ((V)U.x, tmp); \ for (int i = 0; i != NUM; i++) \ if (i == IDX) \ { \ if (res.a[i] != tmp) \ abort (); \ } \ else if (res.a[i] != U.a[i]) \ abort(); \ } \ while (0) void test_256 (void) { union512h g1; union256h t1; union128h x1; int sign = 1; int i = 0; for (i = 0; i < 32; i++) { g1.a[i] = 56.78 * (i - 30) * sign; sign = -sign; } for (i = 0; i != 16; i++) { t1.a[i] = 90.12 * (i + 40) * sign; sign = -sign; } for (i = 0; i != 8; i++) { x1.a[i] = 90.12 * (i + 40) * sign; sign = -sign; } RUNCHECK_VEC_EXTRACT (x1, v8hf, _Float16, 4); RUNCHECK_VEC_EXTRACT (t1, v16hf, _Float16, 3); RUNCHECK_VEC_EXTRACT (t1, v16hf, _Float16, 8); RUNCHECK_VEC_EXTRACT (t1, v16hf, _Float16, 15); RUNCHECK_VEC_EXTRACT (g1, v32hf, _Float16, 5); RUNCHECK_VEC_EXTRACT (g1, v32hf, _Float16, 8); RUNCHECK_VEC_EXTRACT (g1, v32hf, _Float16, 14); RUNCHECK_VEC_EXTRACT (g1, v32hf, _Float16, 16); RUNCHECK_VEC_EXTRACT (g1, v32hf, _Float16, 24); RUNCHECK_VEC_EXTRACT (g1, v32hf, _Float16, 28); RUNCHECK_VEC_SET (union128h, x1, v8hf, _Float16, 4, 8); RUNCHECK_VEC_SET (union256h, t1, v16hf, _Float16, 3, 16); RUNCHECK_VEC_SET (union256h, t1, v16hf, _Float16, 8, 16); RUNCHECK_VEC_SET (union256h, t1, v16hf, _Float16, 15, 16); RUNCHECK_VEC_SET (union512h, g1, v32hf, _Float16, 5, 32); RUNCHECK_VEC_SET (union512h, g1, v32hf, _Float16, 8, 32); RUNCHECK_VEC_SET (union512h, g1, v32hf, _Float16, 14, 32); RUNCHECK_VEC_SET (union512h, g1, v32hf, _Float16, 16, 32); RUNCHECK_VEC_SET (union512h, g1, v32hf, _Float16, 24, 32); RUNCHECK_VEC_SET (union512h, g1, v32hf, _Float16, 28, 32); } void test_128() { }