view test/test.c @ 23:e26874655738

*: huge refactor, new major release (hahaha) I keep finding things that are broken... The problem NOW was that vec would unintentionally build some functions with extended instruction sets, which is Bad and would mean that for all intents and purposes the CPU detection was completely broken. Now vec is no longer header only either. Boohoo. However this gives a lot more flexibility to vec since we no longer want or need to care about C++ crap. The NEON and Altivec implementations have not been updated which means they won't compile hence why they're commented out in the cmake build file.
author Paper <paper@tflc.us>
date Sun, 24 Nov 2024 02:52:40 -0500
parents cf04071d2148
children
line wrap: on
line source

#include "vec/vec.h"

#include <stdio.h>
#include <string.h>
#include <inttypes.h>

#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))

static const int8_t testval8[] = {
	INT8_C(-80), INT8_C(-3), INT8_C(25), INT8_C(0x7F),
	INT8_C(-42), INT8_C(27), INT8_C(24), INT8_C(0x40),
};

static const uint8_t testvalu8[] = {
	UINT8_C(0x00), UINT8_C(0xFF), UINT8_C(0xFE), UINT8_C(0x7F),
	UINT8_C(0xC0), UINT8_C(0x80), UINT8_C(0x20), UINT8_C(0x50),
};

static const int16_t testval16[] = {
	INT16_C(-8000), INT16_C(-30), INT16_MAX, INT16_C(0x4000),
	INT16_C(-42),   INT16_C(250), INT16_MIN, INT16_C(0x500),
};

static const uint16_t testvalu16[] = {
	UINT16_C(0x0000), UINT16_C(0xFFFF), UINT16_C(0xFEA), UINT16_C(0x7FF),
	UINT16_C(0x7FFF), UINT16_C(0x8000), UINT16_C(0x20B), UINT16_C(0x50C),
};

static const int32_t testval32[] = {
	INT32_C(-1000000),   INT32_C(-3), INT32_C(0x00000000), INT32_C(0xFFFFFFFF),
	INT32_C(     -42),   INT32_C(27), INT32_C(0xABCDEF03), INT32_C(0x00000FFF),
	INT32_C(0xFFFFFFFF), INT32_C( 0), INT32_C(0xFFFFFFFE), INT32_C(         1),
};

static const uint32_t testvalu32[] = {
	UINT32_C(0x00000000), UINT32_C(0xDEADBEEF), UINT32_C(42), UINT32_C(0x12340000),
	UINT32_C(0xFFFFFFFF), UINT32_C(0xFEDCBA98), UINT32_C(17), UINT32_C(0x00012345),
	UINT32_C(0xFFFFFFFF), UINT32_C(0xFFFFFFFE), UINT32_C( 0), UINT32_C(         1),
};

static const int64_t testval64[] = {
	INT64_MAX, INT64_C(-3),     INT64_C(0x00000000),   INT64_C(0xFFFFFFFFF),
	INT64_MIN, INT64_C(645366), INT64_C(0x12345ABCDE), INT64_C(0xF00000FFF),
};

static const uint64_t testvalu64[] = {
	UINT64_MAX,     UINT64_C(0x44354365), UINT64_C(0x00000000),   UINT64_C(0xFFFFFFFFF),
	UINT64_C(0xff), UINT64_C(645366),     UINT64_C(0x12345ABCDE), UINT64_C(0xF00000FFF),
};

#define VTEST(sign, csign, bits, size) \
	static inline v##sign##int##bits##x##size vtest##sign##bits##x##size(const size_t start) \
	{ \
		V##csign##INT##bits##x##size##_ALIGNED_ARRAY(x); \
		for (size_t i = 0; i < size; i++) \
			x[i] = testval##sign##bits[(start + i) % ARRAY_SIZE(testval##sign##bits)]; \
		return v##sign##int##bits##x##size##_load_aligned(x); \
	}

#define VPRINT(sign, csign, psign, bits, size) \
	static inline void print_v##sign##int##bits##x##size(FILE *file, v##sign##int##bits##x##size vec) \
	{ \
		fputs("vector: ", file); \
	\
		V##csign##INT##bits##x##size##_ALIGNED_ARRAY(v); \
	\
		v##sign##int##bits##x##size##_store_aligned(vec, v); \
	\
		fprintf(file, "%" PRI ## psign ## bits, v[0]); \
	\
		for (int i = 1; i < size; i++) \
			fprintf(file, ", %" PRI ## psign ## bits, v[i]); \
	\
		fputs("\n", file); \
	\
	}

#define DEF_VEC_TEST_FUNCS(bits, size) \
	VTEST(, , bits, size)     VTEST(u, U, bits, size) \
	VPRINT(, , d, bits, size) VPRINT(u, U, u, bits, size)

DEF_VEC_TEST_FUNCS(8, 2)

DEF_VEC_TEST_FUNCS(8, 4)
DEF_VEC_TEST_FUNCS(16, 2)

DEF_VEC_TEST_FUNCS(8, 8)
DEF_VEC_TEST_FUNCS(16, 4)
DEF_VEC_TEST_FUNCS(32, 2)

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

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

DEF_VEC_TEST_FUNCS(8, 64)
DEF_VEC_TEST_FUNCS(16, 32)
DEF_VEC_TEST_FUNCS(32, 16)
DEF_VEC_TEST_FUNCS(64, 8)

#undef DEF_VEC_TEST_FUNCS
#undef VPRINT
#undef VTEST

// ------------------------------------------------------------

#include "test_align.h"
#include "test_arith.h"
#include "test_compare.h"
#include "test_shift.h"

// ------------------------------------------------------------

int main(void)
{
	int ret = 0;

	vec_init();

	ret |= test_align();
	ret |= test_arith();
	ret |= test_compare();
	ret |= test_shift();

	return ret;
}