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 11 typedef union 12 { 13 __m256i x; 14 char a[32]; 15 } union256i_b; 16 17 typedef union 18 { 19 __m256i x; 20 short a[16]; 21 } union256i_w; 22 23 typedef union 24 { 25 __m256i x; 26 int a[8]; 27 } union256i_d; 28 29 typedef union 30 { 31 __m256i x; 32 long long a[4]; 33 } union256i_q; 34 35 typedef union 36 { 37 __m256 x; 38 float a[8]; 39 } union256; 40 41 typedef union 42 { 43 __m256d x; 44 double a[4]; 45 } union256d; 46 47 typedef union 48 { 49 __m256i x; 50 unsigned char a[32]; 51 } union256i_ub; 52 53 typedef union 54 { 55 __m256i x; 56 unsigned short a[16]; 57 } union256i_uw; 58 59 typedef union 60 { 61 __m256i x; 62 unsigned int a[8]; 63 } union256i_ud; 64 65 typedef union 66 { 67 __m256i x; 68 unsigned long long a[4]; 69 } union256i_uq; 70 71 CHECK_EXP (union256i_b, char, "%d") 72 CHECK_EXP (union256i_w, short, "%d") 73 CHECK_EXP (union256i_d, int, "0x%x") 74 CHECK_EXP (union256i_q, long long, "0x%llx") 75 CHECK_EXP (union256, float, "%f") 76 CHECK_EXP (union256d, double, "%f") 77 CHECK_EXP (union256i_ub, unsigned char, "%d") 78 CHECK_EXP (union256i_uw, unsigned short, "%d") 79 CHECK_EXP (union256i_ud, unsigned int, "0x%x") 80 CHECK_EXP (union256i_uq, unsigned long long, "0x%llx") 81 82 #define CHECK_FP_EXP(UNION_TYPE, VALUE_TYPE, ESP, FMT) \ 83 static int \ 84 __attribute__((noinline, unused)) \ 85 check_fp_##UNION_TYPE (UNION_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 100 CHECK_FP_EXP (union256, float, ESP_FLOAT, "%f") 101 CHECK_FP_EXP (union256d, double, ESP_DOUBLE, "%f") 102