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