view test/test_align.h @ 11:13575ba795d3

impl/gcc: add native 256-bit and 512-bit intrinsics these are simple to implement. At some point I'd like to refactor vec into using a union and being able to detect AVX512 and friends at compile time, so that the processors that *can* use it are enabled at runtime. This would mean adding a vec_init function, which isn't that big of a deal and can just be run at startup anyway and will grab the CPU flags we need.
author Paper <paper@tflc.us>
date Mon, 18 Nov 2024 16:12:24 -0500
parents 6ff0b7a44bb6
children 53197dbf4e8e
line wrap: on
line source

static int test_align(void)
{
	int ret = 0;

#define RUN_TEST(sign, csign, bits, size) \
	do { \
		/* allocate the aligned array */ \
		V##csign##INT##bits##x##size##_ALIGNED_ARRAY(vec_arr); \
	\
		/* fill the values */ \
		for (int i = 0; i < V##csign##INT##bits##x##size##_ALIGNED_ARRAY_LENGTH(vec_arr); i++) \
			vec_arr[i] = i; \
	\
		/* try to load it */ \
		v##sign##int##bits##x##size vec = v##sign##int##bits##x##size##_load_aligned(vec_arr); \
	\
		/* now allocate an output array */ \
		V##csign##INT##bits##x##size##_ALIGNED_ARRAY(vec_arr_out); \
	\
		/* try storing it */ \
		v##sign##int##bits##x##size##_store_aligned(vec, vec_arr_out); \
	\
		/* mark success or failure */ \
		ret |= !!memcmp(vec_arr, vec_arr_out, V##csign##INT##bits##x##size##_ALIGNED_ARRAY_LENGTH(vec_arr)); \
	\
		ret |= !V##csign##INT##bits##x##size##_PTR_ALIGNED(vec_arr); \
		ret |= !V##csign##INT##bits##x##size##_PTR_ALIGNED(vec_arr_out); \
	} while (0);

#define RUN_TESTS(bits, size) \
	RUN_TEST( ,  , bits, size) \
	RUN_TEST(u, U, bits, size)

	RUN_TESTS(8, 16)
	RUN_TESTS(16, 8)
	RUN_TESTS(32, 4)
	RUN_TESTS(64, 2)

	RUN_TESTS(8, 32)
	RUN_TESTS(16, 16)
	RUN_TESTS(32, 8)
	RUN_TESTS(64, 4)

#undef RUN_TESTS
#undef RUN_TEST

	return ret;
}