1#include <immintrin.h> 2#include "m128-check.h" 3 4#ifndef max 5#define max(a, b) (((a) > (b)) ? (a):(b)) 6#endif 7#ifndef min 8#define min(a, b) (((a) < (b)) ? (a):(b)) 9#endif 10 11typedef union 12{ 13 __m256i x; 14 char a[32]; 15} union256i_b; 16 17typedef union 18{ 19 __m256i x; 20 short a[16]; 21} union256i_w; 22 23typedef union 24{ 25 __m256i x; 26 int a[8]; 27} union256i_d; 28 29typedef union 30{ 31 __m256i x; 32 long long a[4]; 33} union256i_q; 34 35typedef union 36{ 37 __m256 x; 38 float a[8]; 39} union256; 40 41typedef union 42{ 43 __m256d x; 44 double a[4]; 45} union256d; 46 47typedef union 48{ 49 __m256i x; 50 unsigned char a[32]; 51} union256i_ub; 52 53typedef union 54{ 55 __m256i x; 56 unsigned short a[16]; 57} union256i_uw; 58 59typedef union 60{ 61 __m256i x; 62 unsigned int a[8]; 63} union256i_ud; 64 65typedef union 66{ 67 __m256i x; 68 unsigned long long a[4]; 69} union256i_uq; 70 71CHECK_EXP (union256i_b, char, "%d") 72CHECK_EXP (union256i_w, short, "%d") 73CHECK_EXP (union256i_d, int, "0x%x") 74CHECK_EXP (union256i_q, long long, "0x%llx") 75CHECK_EXP (union256, float, "%f") 76CHECK_EXP (union256d, double, "%f") 77CHECK_EXP (union256i_ub, unsigned char, "%d") 78CHECK_EXP (union256i_uw, unsigned short, "%d") 79CHECK_EXP (union256i_ud, unsigned int, "0x%x") 80CHECK_EXP (union256i_uq, unsigned long long, "0x%llx") 81 82#define CHECK_FP_EXP(UINON_TYPE, VALUE_TYPE, ESP, FMT) \ 83static int \ 84__attribute__((noinline, unused)) \ 85check_fp_##UINON_TYPE (UINON_TYPE u, const VALUE_TYPE *v) \ 86{ \ 87 int i; \ 88 int err = 0; \ 89 \ 90 for (i = 0; i < ARRAY_SIZE (u.a); i++) \ 91 if (u.a[i] > (v[i] + (ESP)) || u.a[i] < (v[i] - (ESP))) \ 92 { \ 93 err++; \ 94 PRINTF ("%i: " FMT " != " FMT "\n", \ 95 i, v[i], u.a[i]); \ 96 } \ 97 return err; \ 98} 99 100CHECK_FP_EXP (union256, float, ESP_FLOAT, "%f") 101CHECK_FP_EXP (union256d, double, ESP_DOUBLE, "%f") 102