changeset 22:fbcd3fa6f8fc

chore: merge diverging branches
author Paper <paper@tflc.us>
date Sat, 23 Nov 2024 04:09:44 +0000
parents 697b9ba1c1de (diff) 4de858e14464 (current diff)
children e26874655738
files
diffstat 4 files changed, 73 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/include/vec/impl/cpu.h	Fri Nov 22 23:03:34 2024 -0500
+++ b/include/vec/impl/cpu.h	Sat Nov 23 04:09:44 2024 +0000
@@ -311,8 +311,8 @@
 	void (*handler)(int sig);
 	handler = signal(SIGILL, vec_CPU_illegal_instruction);
 	if (!setjmp(vec_jmpbuf)) {
-		asm volatile("mtspr 256, %0\n\t"
-					 "vand %%v0, %%v0, %%v0" ::"r"(-1));
+		vector unsigned char vec;
+		vec_and(vec, vec);
 		altivec = 1;
 	}
 	signal(SIGILL, handler);
@@ -324,13 +324,14 @@
 {
 	volatile int vsx = 0;
 #if defined(VEC_COMPILER_HAS_ALTIVEC_VSX) && defined(__GNUC__)
+# warning Compiling UNTESTED code for VSX.
 	void (*handler)(int sig);
 	handler = signal(SIGILL, vec_CPU_illegal_instruction);
 	if (!setjmp(vec_jmpbuf)) {
 		// this is completely untested
-		asm volatile("mtspr 256, %0\n\t"
-					 "xxland %%v0, %%v0, %%v0" ::"r"(-1));
-		vsx = 1;
+		//__asm__ __volatile__("mtspr 256, %0\n\t"
+		//			 "xxland %%v0, %%v0, %%v0" ::"r"(-1));
+		//vsx = 1;
 	}
 	signal(SIGILL, handler);
 #endif
--- a/include/vec/impl/generic.h	Fri Nov 22 23:03:34 2024 -0500
+++ b/include/vec/impl/generic.h	Sat Nov 23 04:09:44 2024 +0000
@@ -78,18 +78,32 @@
 		return vec; \
 	} \
 	\
+	static v##sign##int##bits##x##size v##sign##int##bits##x##size##_generic_load(const vec_##sign##int##bits in[size]) \
+	{ \
+		v##sign##int##bits##x##size vec; \
+		vec.generic[0] = v##sign##int##bits##x##halfsize##_load(in); \
+		vec.generic[1] = v##sign##int##bits##x##halfsize##_load(in + halfsize); \
+		return vec; \
+	} \
+	\
 	static void v##sign##int##bits##x##size##_generic_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \
 	{ \
 		v##sign##int##bits##x##halfsize##_store_aligned(vec.generic[0], out); \
 		v##sign##int##bits##x##halfsize##_store_aligned(vec.generic[1], out + halfsize); \
 	} \
 	\
+	static void v##sign##int##bits##x##size##_generic_store(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \
+	{ \
+		v##sign##int##bits##x##halfsize##_store(vec.generic[0], out); \
+		v##sign##int##bits##x##halfsize##_store(vec.generic[1], out + halfsize); \
+	} \
+	\
 	static v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_generic = { \
 		/* .splat = */ NULL, \
 		v##sign##int##bits##x##size##_generic_load_aligned, \
-		v##sign##int##bits##x##size##_generic_load_aligned, \
+		v##sign##int##bits##x##size##_generic_load, \
 		v##sign##int##bits##x##size##_generic_store_aligned, \
-		v##sign##int##bits##x##size##_generic_store_aligned, \
+		v##sign##int##bits##x##size##_generic_store, \
 	};
 
 #define VEC_GENERIC_DEFINE_OPERATIONS(bits, size, halfsize) \
--- a/include/vec/impl/ppc/altivec.h	Fri Nov 22 23:03:34 2024 -0500
+++ b/include/vec/impl/ppc/altivec.h	Sat Nov 23 04:09:44 2024 +0000
@@ -76,6 +76,13 @@
 #define VEC_ALTIVEC_DEFINE_LRSHIFT(sign, csign, bits, size)
 #define VEC_ALTIVEC_STRUCT_LRSHIFT(sign, csign, bits, size) NULL
 
+#define VEC_ALTIVEC_CAST_BOOL_8 (vector signed char)
+#define VEC_ALTIVEC_CAST_BOOL_U8 (vector unsigned char)
+#define VEC_ALTIVEC_CAST_BOOL_16 (vector signed short)
+#define VEC_ALTIVEC_CAST_BOOL_U16 (vector unsigned short)
+#define VEC_ALTIVEC_CAST_BOOL_32 (vector signed int)
+#define VEC_ALTIVEC_CAST_BOOL_U32 (vector unsigned int)
+
 /* Since altivec conveniently made their API super user friendly, we can just use
  * one giant macro to define literally everything */
 #define VEC_DEFINE_OPERATIONS_SIGN(sign, csign, bits, size) \
@@ -160,6 +167,41 @@
 	\
 	VEC_ALTIVEC_DEFINE_SPLAT(sign, csign, bits, size) \
 	\
+	static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmplt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
+	{ \
+		v##sign##int##bits##x##size vec; \
+		vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits  vec_cmplt(vec1.altivec, vec2.altivec); \
+		return vec; \
+	} \
+	\
+	static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmple(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
+	{ \
+		v##sign##int##bits##x##size vec; \
+		vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmplt(vec1.altivec, vec2.altivec), vec_cmpeq(vec1.altivec, vec2.altivec)); \
+		return vec; \
+	} \
+	\
+	static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmpeq(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
+	{ \
+		v##sign##int##bits##x##size vec; \
+		vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpeq(vec1.altivec, vec2.altivec); \
+		return vec; \
+	} \
+	\
+	static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmpge(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
+	{ \
+		v##sign##int##bits##x##size vec; \
+		vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_or(vec_cmpgt(vec1.altivec, vec2.altivec), vec_cmpeq(vec1.altivec, vec2.altivec)); \
+		return vec; \
+	} \
+	\
+	static v##sign##int##bits##x##size v##sign##int##bits##x##size##_altivec_cmpgt(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \
+	{ \
+		v##sign##int##bits##x##size vec; \
+		vec.altivec = VEC_ALTIVEC_CAST_BOOL_##csign##bits vec_cmpgt(vec1.altivec, vec2.altivec); \
+		return vec; \
+	} \
+	\
 	static v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_altivec = { \
 		VEC_ALTIVEC_STRUCT_SPLAT(sign, csign, bits, size), \
 		v##sign##int##bits##x##size##_altivec_load_aligned, \
@@ -178,6 +220,11 @@
 		v##sign##int##bits##x##size##_altivec_lshift, \
 		v##sign##int##bits##x##size##_altivec_rshift, \
 		VEC_ALTIVEC_STRUCT_##sign##LRSHIFT(sign, csign, bits, size), \
+		v##sign##int##bits##x##size##_altivec_cmplt, \
+		v##sign##int##bits##x##size##_altivec_cmple, \
+		v##sign##int##bits##x##size##_altivec_cmpeq, \
+		v##sign##int##bits##x##size##_altivec_cmpge, \
+		v##sign##int##bits##x##size##_altivec_cmpgt, \
 	};
 
 #define VEC_DEFINE_OPERATIONS(bits, size) \
@@ -187,9 +234,9 @@
 VEC_DEFINE_OPERATIONS(8, 16)
 VEC_DEFINE_OPERATIONS(16, 8)
 VEC_DEFINE_OPERATIONS(32, 4)
-#ifdef VEC_COMPILER_HAS_ALTIVEC_VSX
-VEC_DEFINE_OPERATIONS(64, 2)
-#endif
+//#ifdef VEC_COMPILER_HAS_ALTIVEC_VSX
+//VEC_DEFINE_OPERATIONS(64, 2)
+//#endif
 
 #undef VEC_DEFINE_OPERATIONS
 #undef VEC_DEFINE_OPERATIONS_SIGN
--- a/test/test_compare.h	Fri Nov 22 23:03:34 2024 -0500
+++ b/test/test_compare.h	Sat Nov 23 04:09:44 2024 +0000
@@ -109,4 +109,4 @@
 #undef RUN_TESTS
 
 	return ret;
-}
\ No newline at end of file
+}