changeset 21:697b9ba1c1de

impl/ppc/altivec: implement comparison functions had to prune some up eh, vec_cmple/vec_cmpge is only available in VSX
author Paper <paper@tflc.us>
date Thu, 21 Nov 2024 21:55:20 +0000
parents 627d548b23c8
children fbcd3fa6f8fc
files include/vec/impl/ppc/altivec.h
diffstat 1 files changed, 50 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/include/vec/impl/ppc/altivec.h	Thu Nov 21 21:19:11 2024 +0000
+++ b/include/vec/impl/ppc/altivec.h	Thu Nov 21 21:55:20 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,11 +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), \
-		/* .cmplt = */ NULL, \
-		/* .cmple = */ NULL, \
-		/* .cmpeq = */ NULL, \
-		/* .cmpgt = */ NULL, \
-		/* .cmpge = */ NULL, \
+		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) \
@@ -192,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