#include "avx-check.h"
|
#include "avx-check.h"
|
#include "args.h"
|
#include "args.h"
|
|
|
struct IntegerRegisters iregs;
|
struct IntegerRegisters iregs;
|
struct FloatRegisters fregs;
|
struct FloatRegisters fregs;
|
unsigned int num_iregs, num_fregs;
|
unsigned int num_iregs, num_fregs;
|
|
|
union un1
|
union un1
|
{
|
{
|
__m256 x;
|
__m256 x;
|
float f;
|
float f;
|
};
|
};
|
|
|
union un2
|
union un2
|
{
|
{
|
__m256 x;
|
__m256 x;
|
double d;
|
double d;
|
};
|
};
|
|
|
union un3
|
union un3
|
{
|
{
|
__m256 x;
|
__m256 x;
|
__m128 v;
|
__m128 v;
|
};
|
};
|
|
|
union un4
|
union un4
|
{
|
{
|
__m256 x;
|
__m256 x;
|
long double ld;
|
long double ld;
|
};
|
};
|
|
|
union un5
|
union un5
|
{
|
{
|
__m256 x;
|
__m256 x;
|
int i;
|
int i;
|
};
|
};
|
|
|
void
|
void
|
check_union_passing1(union un1 u1 ATTRIBUTE_UNUSED,
|
check_union_passing1(union un1 u1 ATTRIBUTE_UNUSED,
|
union un1 u2 ATTRIBUTE_UNUSED,
|
union un1 u2 ATTRIBUTE_UNUSED,
|
union un1 u3 ATTRIBUTE_UNUSED,
|
union un1 u3 ATTRIBUTE_UNUSED,
|
union un1 u4 ATTRIBUTE_UNUSED,
|
union un1 u4 ATTRIBUTE_UNUSED,
|
union un1 u5 ATTRIBUTE_UNUSED,
|
union un1 u5 ATTRIBUTE_UNUSED,
|
union un1 u6 ATTRIBUTE_UNUSED,
|
union un1 u6 ATTRIBUTE_UNUSED,
|
union un1 u7 ATTRIBUTE_UNUSED,
|
union un1 u7 ATTRIBUTE_UNUSED,
|
union un1 u8 ATTRIBUTE_UNUSED)
|
union un1 u8 ATTRIBUTE_UNUSED)
|
{
|
{
|
check_m256_arguments;
|
check_m256_arguments;
|
}
|
}
|
|
|
void
|
void
|
check_union_passing2(union un2 u1 ATTRIBUTE_UNUSED,
|
check_union_passing2(union un2 u1 ATTRIBUTE_UNUSED,
|
union un2 u2 ATTRIBUTE_UNUSED,
|
union un2 u2 ATTRIBUTE_UNUSED,
|
union un2 u3 ATTRIBUTE_UNUSED,
|
union un2 u3 ATTRIBUTE_UNUSED,
|
union un2 u4 ATTRIBUTE_UNUSED,
|
union un2 u4 ATTRIBUTE_UNUSED,
|
union un2 u5 ATTRIBUTE_UNUSED,
|
union un2 u5 ATTRIBUTE_UNUSED,
|
union un2 u6 ATTRIBUTE_UNUSED,
|
union un2 u6 ATTRIBUTE_UNUSED,
|
union un2 u7 ATTRIBUTE_UNUSED,
|
union un2 u7 ATTRIBUTE_UNUSED,
|
union un2 u8 ATTRIBUTE_UNUSED)
|
union un2 u8 ATTRIBUTE_UNUSED)
|
{
|
{
|
check_m256_arguments;
|
check_m256_arguments;
|
}
|
}
|
|
|
void
|
void
|
check_union_passing3(union un3 u1 ATTRIBUTE_UNUSED,
|
check_union_passing3(union un3 u1 ATTRIBUTE_UNUSED,
|
union un3 u2 ATTRIBUTE_UNUSED,
|
union un3 u2 ATTRIBUTE_UNUSED,
|
union un3 u3 ATTRIBUTE_UNUSED,
|
union un3 u3 ATTRIBUTE_UNUSED,
|
union un3 u4 ATTRIBUTE_UNUSED,
|
union un3 u4 ATTRIBUTE_UNUSED,
|
union un3 u5 ATTRIBUTE_UNUSED,
|
union un3 u5 ATTRIBUTE_UNUSED,
|
union un3 u6 ATTRIBUTE_UNUSED,
|
union un3 u6 ATTRIBUTE_UNUSED,
|
union un3 u7 ATTRIBUTE_UNUSED,
|
union un3 u7 ATTRIBUTE_UNUSED,
|
union un3 u8 ATTRIBUTE_UNUSED)
|
union un3 u8 ATTRIBUTE_UNUSED)
|
{
|
{
|
check_m256_arguments;
|
check_m256_arguments;
|
}
|
}
|
|
|
void
|
void
|
check_union_passing4(union un4 u ATTRIBUTE_UNUSED)
|
check_union_passing4(union un4 u ATTRIBUTE_UNUSED)
|
{
|
{
|
/* Check the passing on the stack by comparing the address of the
|
/* Check the passing on the stack by comparing the address of the
|
stack elements to the expected place on the stack. */
|
stack elements to the expected place on the stack. */
|
assert ((unsigned long)&u.x == rsp+8);
|
assert ((unsigned long)&u.x == rsp+8);
|
assert ((unsigned long)&u.ld == rsp+8);
|
assert ((unsigned long)&u.ld == rsp+8);
|
}
|
}
|
|
|
void
|
void
|
check_union_passing5(union un5 u ATTRIBUTE_UNUSED)
|
check_union_passing5(union un5 u ATTRIBUTE_UNUSED)
|
{
|
{
|
/* Check the passing on the stack by comparing the address of the
|
/* Check the passing on the stack by comparing the address of the
|
stack elements to the expected place on the stack. */
|
stack elements to the expected place on the stack. */
|
assert ((unsigned long)&u.x == rsp+8);
|
assert ((unsigned long)&u.x == rsp+8);
|
assert ((unsigned long)&u.i == rsp+8);
|
assert ((unsigned long)&u.i == rsp+8);
|
}
|
}
|
|
|
#define check_union_passing1 WRAP_CALL(check_union_passing1)
|
#define check_union_passing1 WRAP_CALL(check_union_passing1)
|
#define check_union_passing2 WRAP_CALL(check_union_passing2)
|
#define check_union_passing2 WRAP_CALL(check_union_passing2)
|
#define check_union_passing3 WRAP_CALL(check_union_passing3)
|
#define check_union_passing3 WRAP_CALL(check_union_passing3)
|
#define check_union_passing4 WRAP_CALL(check_union_passing4)
|
#define check_union_passing4 WRAP_CALL(check_union_passing4)
|
#define check_union_passing5 WRAP_CALL(check_union_passing5)
|
#define check_union_passing5 WRAP_CALL(check_union_passing5)
|
|
|
static void
|
static void
|
avx_test (void)
|
avx_test (void)
|
{
|
{
|
union un1 u1[8];
|
union un1 u1[8];
|
union un2 u2[8];
|
union un2 u2[8];
|
union un3 u3[8];
|
union un3 u3[8];
|
union un4 u4;
|
union un4 u4;
|
union un5 u5;
|
union un5 u5;
|
int i;
|
int i;
|
|
|
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
u1[i].x = (__m256){32+i, 0, i, 0, -i, 0, i - 12, i + 8};
|
u1[i].x = (__m256){32+i, 0, i, 0, -i, 0, i - 12, i + 8};
|
|
|
clear_struct_registers;
|
clear_struct_registers;
|
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
fregs.ymm0._m256[i] = u1[i].x;
|
fregs.ymm0._m256[i] = u1[i].x;
|
num_fregs = 8;
|
num_fregs = 8;
|
check_union_passing1(u1[0], u1[1], u1[2], u1[3],
|
check_union_passing1(u1[0], u1[1], u1[2], u1[3],
|
u1[4], u1[5], u1[6], u1[7]);
|
u1[4], u1[5], u1[6], u1[7]);
|
|
|
clear_struct_registers;
|
clear_struct_registers;
|
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
{
|
{
|
u2[i].x = u1[i].x;
|
u2[i].x = u1[i].x;
|
fregs.ymm0._m256[i] = u2[i].x;
|
fregs.ymm0._m256[i] = u2[i].x;
|
}
|
}
|
num_fregs = 8;
|
num_fregs = 8;
|
check_union_passing2(u2[0], u2[1], u2[2], u2[3],
|
check_union_passing2(u2[0], u2[1], u2[2], u2[3],
|
u2[4], u2[5], u2[6], u2[7]);
|
u2[4], u2[5], u2[6], u2[7]);
|
|
|
clear_struct_registers;
|
clear_struct_registers;
|
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
{
|
{
|
u3[i].x = u1[i].x;
|
u3[i].x = u1[i].x;
|
fregs.ymm0._m256[i] = u3[i].x;
|
fregs.ymm0._m256[i] = u3[i].x;
|
}
|
}
|
num_fregs = 8;
|
num_fregs = 8;
|
check_union_passing3(u3[0], u3[1], u3[2], u3[3],
|
check_union_passing3(u3[0], u3[1], u3[2], u3[3],
|
u3[4], u3[5], u3[6], u3[7]);
|
u3[4], u3[5], u3[6], u3[7]);
|
|
|
check_union_passing4(u4);
|
check_union_passing4(u4);
|
check_union_passing5(u5);
|
check_union_passing5(u5);
|
}
|
}
|
|
|