From e55a7017897dd3993f40e324a14aa867a98d353a Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Tue, 1 Jul 2025 22:39:07 +0200 Subject: [PATCH] added support for int16_t --- polar_helper.hh | 101 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/polar_helper.hh b/polar_helper.hh index e05c599..a83504a 100644 --- a/polar_helper.hh +++ b/polar_helper.hh @@ -153,6 +153,58 @@ struct PolarHelper> } }; +template +struct PolarHelper> +{ + typedef SIMD TYPE; + typedef int PATH; + typedef SIMD MAP; + static TYPE one() + { + return vdup(1); + } + static TYPE zero() + { + return vzero(); + } + static TYPE signum(TYPE a) + { + return vsignum(a); + } + static TYPE qabs(TYPE a) + { + return vqabs(a); + } + static TYPE qadd(TYPE a, TYPE b) + { + return vqadd(a, b); + } + static TYPE qmul(TYPE a, TYPE b) + { +#ifdef __ARM_NEON + return vmul(a, b); +#else + return vsign(a, b); +#endif + } + static TYPE prod(TYPE a, TYPE b) + { +#ifdef __ARM_NEON + return vmul(vmul(vsignum(a), vsignum(b)), vmin(vqabs(a), vqabs(b))); +#else + return vsign(vmin(vqabs(a), vqabs(b)), vsign(vsignum(a), b)); +#endif + } + static TYPE madd(TYPE a, TYPE b, TYPE c) + { +#ifdef __ARM_NEON + return vmax(vqadd(vmul(a, vmax(b, vdup(-32767))), c), vdup(-32767)); +#else + return vmax(vqadd(vsign(vmax(b, vdup(-32767)), a), c), vdup(-32767)); +#endif + } +}; + template <> struct PolarHelper { @@ -202,5 +254,54 @@ struct PolarHelper } }; +template <> +struct PolarHelper +{ + typedef int PATH; + static int16_t one() + { + return 1; + } + static int16_t zero() + { + return 0; + } + static int16_t signum(int16_t v) + { + return (v > 0) - (v < 0); + } + template + static int16_t quant(IN in) + { + return std::min(std::max(std::nearbyint(in), -32767), 32767); + } + static int16_t qabs(int16_t a) + { + return std::abs(std::max(a, -32767)); + } + static int16_t qmin(int16_t a, int16_t b) + { + return std::min(a, b); + } + static int16_t qadd(int16_t a, int16_t b) + { + return std::min(std::max(int32_t(a) + int32_t(b), -32767), 32767); + } + static int16_t qmul(int16_t a, int16_t b) + { + // return std::min(std::max(int32_t(a) * int32_t(b), -32767), 32767); + // only used for hard decision values anyway + return a * b; + } + static int16_t prod(int16_t a, int16_t b) + { + return signum(a) * signum(b) * qmin(qabs(a), qabs(b)); + } + static int16_t madd(int16_t a, int16_t b, int16_t c) + { + return std::min(std::max(int32_t(a) * int32_t(b) + int32_t(c), -32767), 32767); + } +}; + }