#include #include "m128-check.h" #ifndef max #define max(a, b) (((a) > (b)) ? (a):(b)) #endif #ifndef min #define min(a, b) (((a) < (b)) ? (a):(b)) #endif typedef union { __m256i x; char a[32]; } union256i_b; typedef union { __m256i x; short a[16]; } union256i_w; typedef union { __m256i x; int a[8]; } union256i_d; typedef union { __m256i x; long long a[4]; } union256i_q; typedef union { __m256 x; float a[8]; } union256; typedef union { __m256d x; double a[4]; } union256d; CHECK_EXP (union256i_b, char, "%d") CHECK_EXP (union256i_w, short, "%d") CHECK_EXP (union256i_d, int, "0x%x") CHECK_EXP (union256i_q, long long, "0x%llx") CHECK_EXP (union256, float, "%f") CHECK_EXP (union256d, double, "%f") #define CHECK_FP_EXP(UINON_TYPE, VALUE_TYPE, ESP, FMT) \ static int \ __attribute__((noinline, unused)) \ check_fp_##UINON_TYPE (UINON_TYPE u, const VALUE_TYPE *v) \ { \ int i; \ int err = 0; \ \ for (i = 0; i < ARRAY_SIZE (u.a); i++) \ if (u.a[i] > (v[i] + (ESP)) || u.a[i] < (v[i] - (ESP))) \ { \ err++; \ PRINTF ("%i: " FMT " != " FMT "\n", \ i, v[i], u.a[i]); \ } \ return err; \ } CHECK_FP_EXP (union256, float, ESP_FLOAT, "%f") CHECK_FP_EXP (union256d, double, ESP_DOUBLE, "%f")