Mercurial > vec
diff src/impl/arm/neon.c @ 31:bf6ad516f1e6
Backed out changeset c6c99ab1088a
author | Paper <paper@tflc.us> |
---|---|
date | Fri, 25 Apr 2025 17:40:33 -0400 |
parents | c6c99ab1088a |
children | 0de48dc864ea |
line wrap: on
line diff
--- a/src/impl/arm/neon.c Fri Apr 25 17:40:30 2025 -0400 +++ b/src/impl/arm/neon.c Fri Apr 25 17:40:33 2025 -0400 @@ -39,19 +39,19 @@ VEC_STATIC_ASSERT(VEC_ALIGNOF(sign##int##bits##x##size##_t) <= VEC_ALIGNOF(v##sign##int##bits##x##size), "vec: v" #sign "int" #bits "x" #size " alignment needs to be expanded to fit intrinsic type size"); \ VEC_STATIC_ASSERT(sizeof(sign##int##bits##x##size##_t) <= sizeof(v##sign##int##bits##x##size), "vec: v" #sign "int" #bits "x" #size " needs to be expanded to fit intrinsic type size"); \ \ - VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_load_aligned(const vec_##sign##int##bits in[size]) \ + static v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_load_aligned(const vec_##sign##int##bits in[size]) \ { \ union v##sign##int##bits##x##size##_impl_data vec; \ vec.neon = vld1_##sign##bits(in); \ return vec.vec; \ } \ \ - VEC_FUNC_IMPL void v##sign##int##bits##x##size##_neon_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ + static void v##sign##int##bits##x##size##_neon_store_aligned(v##sign##int##bits##x##size vec, vec_##sign##int##bits out[size]) \ { \ vstore_lane_##bits(sign, ((union v##sign##int##bits##x##size##_impl_data *)&vec)->neon, out); \ } \ \ - VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ + static v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_add(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ { \ union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ @@ -60,7 +60,7 @@ return vec1d->vec; \ } \ \ - VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ + static v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_sub(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ { \ union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ @@ -69,7 +69,7 @@ return vec1d->vec; \ } \ \ - VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_mul(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ + static v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_mul(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ { \ union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ @@ -78,7 +78,7 @@ return vec1d->vec; \ } \ \ - VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_lshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ + static v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_lshift(v##sign##int##bits##x##size vec1, vuint##bits##x##size vec2) \ { \ union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ union vuint##bits##x##size##_impl_data *vec2d = (union vuint##bits##x##size##_impl_data *)&vec2; \ @@ -87,7 +87,7 @@ return vec1d->vec; \ } \ \ - VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ + static v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_and(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ { \ union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ @@ -96,7 +96,7 @@ return vec1d->vec; \ } \ \ - VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ + static v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_or(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ { \ union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ @@ -105,7 +105,7 @@ return vec1d->vec; \ } \ \ - VEC_FUNC_IMPL v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ + static v##sign##int##bits##x##size v##sign##int##bits##x##size##_neon_xor(v##sign##int##bits##x##size vec1, v##sign##int##bits##x##size vec2) \ { \ union v##sign##int##bits##x##size##_impl_data *vec1d = (union v##sign##int##bits##x##size##_impl_data *)&vec1; \ union v##sign##int##bits##x##size##_impl_data *vec2d = (union v##sign##int##bits##x##size##_impl_data *)&vec2; \ @@ -114,18 +114,29 @@ return vec1d->vec; \ } \ \ - const v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_neon = { \ - .load = v##sign##int##bits##x##size##_neon_load_aligned, \ - .load_aligned = v##sign##int##bits##x##size##_neon_load_aligned, \ - .store = v##sign##int##bits##x##size##_neon_store_aligned, \ - .store_aligned = v##sign##int##bits##x##size##_neon_store_aligned, \ - .add = v##sign##int##bits##x##size##_neon_add, \ - .sub = v##sign##int##bits##x##size##_neon_sub, \ - .mul = v##sign##int##bits##x##size##_neon_mul, \ - .band = v##sign##int##bits##x##size##_neon_and, \ - .bor = v##sign##int##bits##x##size##_neon_or, \ - .bxor = v##sign##int##bits##x##size##_neon_xor, \ - .lshift = v##sign##int##bits##x##size##_neon_lshift, \ + static v##sign##int##bits##x##size##_impl v##sign##int##bits##x##size##_impl_neon = { \ + v##sign##int##bits##x##size##_fallback_splat, \ + v##sign##int##bits##x##size##_neon_load_aligned, \ + v##sign##int##bits##x##size##_neon_load_aligned, \ + v##sign##int##bits##x##size##_neon_store_aligned, \ + v##sign##int##bits##x##size##_neon_store_aligned, \ + v##sign##int##bits##x##size##_neon_add, \ + v##sign##int##bits##x##size##_neon_sub, \ + v##sign##int##bits##x##size##_neon_mul, \ + v##sign##int##bits##x##size##_fallback_div, \ + v##sign##int##bits##x##size##_fallback_avg, \ + v##sign##int##bits##x##size##_neon_and, \ + v##sign##int##bits##x##size##_neon_or, \ + v##sign##int##bits##x##size##_neon_xor, \ + v##sign##int##bits##x##size##_fallback_not, \ + v##sign##int##bits##x##size##_neon_lshift, \ + v##sign##int##bits##x##size##_fallback_rshift, \ + v##sign##int##bits##x##size##_fallback_lrshift, \ + v##sign##int##bits##x##size##_fallback_cmplt, \ + v##sign##int##bits##x##size##_fallback_cmple, \ + v##sign##int##bits##x##size##_fallback_cmpeq, \ + v##sign##int##bits##x##size##_fallback_cmpge, \ + v##sign##int##bits##x##size##_fallback_cmpgt, \ }; #define VEC_DEFINE_OPERATIONS(bits, size) \ @@ -233,7 +244,7 @@ // NEON doesn't have native 64-bit multiplication, so we have // to do it ourselves -VEC_FUNC_IMPL int64x2_t vmulq_s64(const int64x2_t a, const int64x2_t b) +static inline int64x2_t vmulq_s64(const int64x2_t a, const int64x2_t b) { const uint32x2_t ac = vreinterpret_u32_s32(vmovn_s64(a)); const uint32x2_t pr = vreinterpret_u32_s32(vmovn_s64(b)); @@ -243,7 +254,7 @@ return vreinterpretq_s64_u64(vmlal_u32(vreinterpretq_u64_s64(vshlq_n_s64(vreinterpretq_s64_u64(vpaddlq_u32(vreinterpretq_u32_s32(hi))), 32)), ac, pr)); } -VEC_FUNC_IMPL uint64x2_t vmulq_u64(const uint64x2_t a, const uint64x2_t b) +static inline uint64x2_t vmulq_u64(const uint64x2_t a, const uint64x2_t b) { const uint32x2_t ac = vmovn_u64(a); const uint32x2_t pr = vmovn_u64(b);