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