Mercurial > vec
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