#include #include "m256-check.h" typedef union { __m512i x; char a[64]; } union512i_b; typedef union { __m512i x; short a[32]; } union512i_w; typedef union { __m512i x; int a[16]; } union512i_d; typedef union { __m512i x; long long a[8]; } union512i_q; typedef union { __m512 x; float a[16]; } union512; typedef union { __m512d x; double a[8]; } union512d; typedef union { __m512i x; unsigned char a[64]; } union512i_ub; typedef union { __m512i x; unsigned short a[32]; } union512i_uw; typedef union { __m512i x; unsigned int a[16]; } union512i_ud; typedef union { __m512i x; unsigned long long a[8]; } union512i_uq; typedef union { __m128h x; _Float16 a[8]; } union128h; typedef union { __m256h x; _Float16 a[16]; } union256h; typedef union { __m512h x; _Float16 a[32]; } union512h; CHECK_EXP (union512i_b, char, "%d") CHECK_EXP (union512i_w, short, "%d") CHECK_EXP (union512i_d, int, "0x%x") CHECK_EXP (union512i_q, long long, "0x%llx") CHECK_EXP (union512, float, "%f") CHECK_EXP (union512d, double, "%f") CHECK_EXP (union512i_ub, unsigned char, "%d") CHECK_EXP (union512i_uw, unsigned short, "%d") CHECK_EXP (union512i_ud, unsigned int, "0x%x") CHECK_EXP (union512i_uq, unsigned long long, "0x%llx") CHECK_FP_EXP (union512, float, ESP_FLOAT, "%f") CHECK_FP_EXP (union512d, double, ESP_DOUBLE, "%f") #define CHECK_ROUGH_EXP(UNION_TYPE, VALUE_TYPE, FMT) \ static int \ __attribute__((noinline, unused)) \ check_rough_##UNION_TYPE (UNION_TYPE u, const VALUE_TYPE *v, \ VALUE_TYPE eps) \ { \ int i; \ int err = 0; \ \ for (i = 0; i < ARRAY_SIZE (u.a); i++) \ { \ /* We can have have v[i] == 0 == u.a[i] for some i, \ when we test zero-masking. */ \ if (v[i] == 0.0 && u.a[i] == 0.0) \ continue; \ if (v[i] == 0.0 && u.a[i] != 0.0) \ { \ err++; \ PRINTF ("%i: " FMT " != " FMT "\n", \ i, v[i], u.a[i]); \ } \ VALUE_TYPE rel_err = (u.a[i] - v[i]) / v[i]; \ if (((rel_err < 0) ? -rel_err : rel_err) > eps) \ { \ err++; \ PRINTF ("%i: " FMT " != " FMT "\n", \ i, v[i], u.a[i]); \ } \ } \ return err; \ } CHECK_ROUGH_EXP (union512, float, "%f") CHECK_ROUGH_EXP (union512d, double, "%f") CHECK_ROUGH_EXP (union256, float, "%f") CHECK_ROUGH_EXP (union256d, double, "%f") CHECK_ROUGH_EXP (union128, float, "%f") CHECK_ROUGH_EXP (union128d, double, "%f") #ifdef AVX512FP16 CHECK_EXP (union128h, _Float16, "%f") CHECK_EXP (union256h, _Float16, "%f") CHECK_EXP (union512h, _Float16, "%f") #ifndef ESP_FLOAT16 #define ESP_FLOAT16 0.27 #endif CHECK_FP_EXP (union128h, _Float16, ESP_FLOAT16, "%f") CHECK_FP_EXP (union256h, _Float16, ESP_FLOAT16, "%f") CHECK_FP_EXP (union512h, _Float16, ESP_FLOAT16, "%f") CHECK_ROUGH_EXP (union128h, _Float16, "%f") CHECK_ROUGH_EXP (union256h, _Float16, "%f") CHECK_ROUGH_EXP (union512h, _Float16, "%f") #endif