/*
 * Copyright (c) 2017 ARM Limited.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef ARM_COMPUTE_FIXED_POINT_H
#define ARM_COMPUTE_FIXED_POINT_H

#define TYPE_ALIAS(type, alias)  \
    typedef type alias;          \
    typedef type alias##x##1;    \
    typedef type##2 alias##x##2; \
    typedef type##3 alias##x##3; \
    typedef type##4 alias##x##4; \
    typedef type##8 alias##x##8; \
    typedef type##16 alias##x##16;

TYPE_ALIAS(char, qs8)
TYPE_ALIAS(short, qs16)
TYPE_ALIAS(int, qs32)

#define qs8_MIN ((char)CHAR_MIN)
#define qs8_MAX ((char)CHAR_MAX)
#define qs16_MIN ((short)SHRT_MIN)
#define qs16_MAX ((short)SHRT_MAX)
#define qs32_MIN ((int)INT_MIN)
#define qs32_MAX ((int)INT_MAX)

#define qu8_MIN ((uchar)0)
#define qu8_MAX ((uchar)UCHAR_MAX)
#define qu16_MIN ((ushort)0)
#define qu16_MAX ((ushort)USHRT_MAX)
#define qu32_MIN ((uint)0)
#define qu32_MAX ((uint)UINT_MAX)

#define qs8_TYPE char
#define qs8x1_TYPE char
#define qs8x2_TYPE char2
#define qs8x4_TYPE char4
#define qs8x8_TYPE char8
#define qs8x16_TYPE char16

#define qs16_TYPE short
#define qs16x1_TYPE short
#define qs16x2_TYPE short2
#define qs16x4_TYPE short4
#define qs16x8_TYPE short8
#define qs16x16_TYPE short16

#define qs32_TYPE int
#define qs32x1_TYPE int
#define qs32x2_TYPE int2
#define qs32x4_TYPE int4
#define qs32x8_TYPE int8
#define qs32x16_TYPE int16

/* All internal constants are represented in the maximum supported fixed point format (QS16),
 * thus we define an additional shift parameter required to convert the constant
 * from the maximum supported format to the require one.
 */
#define qs8_SHIFT 8
#define qs16_SHIFT 0

#undef VEC_DATA_TYPE_STR
#undef VEC_DATA_TYPE
#undef CONVERT_STR
#undef CONVERT
#undef CONVERT_SAT_STR
#undef CONVERT_SAT

#define VEC_DATA_TYPE_STR(type, size) type##x##size
#define VEC_DATA_TYPE(type, size) VEC_DATA_TYPE_STR(type, size)

#define CONVERT_STR3(x, type, rtype) (convert_##rtype((x)))
#define CONVERT_STR2(x, type, rtype) CONVERT_STR3(x, type, rtype)
#define CONVERT_STR(x, type) CONVERT_STR2(x, type, type##_TYPE)
#define CONVERT(x, type) CONVERT_STR(x, type)

#define CONVERT_SAT_STR3(x, type, rtype) (convert_##rtype##_sat((x)))
#define CONVERT_SAT_STR2(x, type, rtype) CONVERT_SAT_STR3(x, type, rtype)
#define CONVERT_SAT_STR(x, type) CONVERT_SAT_STR2(x, type, type##_TYPE)
#define CONVERT_SAT(x, type) CONVERT_SAT_STR(x, type)

/** Computes max of fixed point types.
  *
  * @param[in] type the actual data type.
  *
  * @return The result of the fixed point maximum.
  */
#define MAXQ_IMPL(type)                          \
    inline type max_##type(type VopA, type VopB) \
    {                                            \
        return max(VopA, VopB);                  \
    }

MAXQ_IMPL(qs8x1)
MAXQ_IMPL(qs8x2)
MAXQ_IMPL(qs8x4)
MAXQ_IMPL(qs8x8)
MAXQ_IMPL(qs8x16)
MAXQ_IMPL(qs16x1)
MAXQ_IMPL(qs16x2)
MAXQ_IMPL(qs16x4)
MAXQ_IMPL(qs16x8)
MAXQ_IMPL(qs16x16)

#define MAX_OP_EXPAND_STR(a, b, type, size) max_##type##x##size((a), (b))
#define MAX_OP_EXPAND(a, b, type, size) MAX_OP_EXPAND_STR(a, b, type, size)

/** Computes saturated addition of fixed point types.
  *
  * @param[in] type the actual data type.
  *
  * @return The result of the fixed point addition. The result is saturated in case of overflow
  */
#define ADDQ_SAT_IMPL(type)                          \
    inline type add_sat_##type(type VopA, type VopB) \
    {                                                \
        return add_sat(VopA, VopB);                  \
    }

ADDQ_SAT_IMPL(qs8x1)
ADDQ_SAT_IMPL(qs8x2)
ADDQ_SAT_IMPL(qs8x4)
ADDQ_SAT_IMPL(qs8x8)
ADDQ_SAT_IMPL(qs8x16)
ADDQ_SAT_IMPL(qs16x1)
ADDQ_SAT_IMPL(qs16x2)
ADDQ_SAT_IMPL(qs16x4)
ADDQ_SAT_IMPL(qs16x8)
ADDQ_SAT_IMPL(qs16x16)

#define ADD_SAT_OP_EXPAND_STR(a, b, type, size) add_sat_##type##x##size((a), (b))
#define ADD_SAT_OP_EXPAND(a, b, type, size) ADD_SAT_OP_EXPAND_STR(a, b, type, size)

/** Computes saturated subtraction of fixed point types.
  *
  * @param[in] type the actual data type.
  *
  * @return The result of the fixed point subtraction. The result is saturated in case of overflow
  */
#define SUBQ_SAT_IMPL(type)                          \
    inline type sub_sat_##type(type VopA, type VopB) \
    {                                                \
        return sub_sat(VopA, VopB);                  \
    }

SUBQ_SAT_IMPL(qs8x1)
SUBQ_SAT_IMPL(qs8x2)
SUBQ_SAT_IMPL(qs8x4)
SUBQ_SAT_IMPL(qs8x8)
SUBQ_SAT_IMPL(qs8x16)
SUBQ_SAT_IMPL(qs16x1)
SUBQ_SAT_IMPL(qs16x2)
SUBQ_SAT_IMPL(qs16x4)
SUBQ_SAT_IMPL(qs16x8)
SUBQ_SAT_IMPL(qs16x16)

#define SUB_SAT_OP_EXPAND_STR(a, b, type, size) sub_sat_##type##x##size((a), (b))
#define SUB_SAT_OP_EXPAND(a, b, type, size) SUB_SAT_OP_EXPAND_STR(a, b, type, size)

/* Multiply of two fixed point numbers
 *
 * @param[in] type  the actual data type.
 * @param[in] itype the intermediate data type.
 *
 * @return The result of the fixed point multiplication.
 */
#define MULQ_IMPL(type, itype)                                                         \
    inline type mul_##type(type VopA, type VopB, int fixed_point_position)             \
    {                                                                                  \
        itype round_val = (itype)(1 << (fixed_point_position - 1));                    \
        itype res       = CONVERT((VopA), itype) * CONVERT((VopB), itype) + round_val; \
        return CONVERT((res >> (itype)fixed_point_position), type);                    \
    }

MULQ_IMPL(qs8x16, qs16x16)
MULQ_IMPL(qs16x16, qs32x16)

#define MUL_OP_EXPAND_STR(a, b, type, size, position) mul_##type##x##size((a), (b), (position))
#define MUL_OP_EXPAND(a, b, type, size, position) MUL_OP_EXPAND_STR(a, b, type, size, position)

/* Saturate multiply of two fixed point numbers
 *
 * @param[in] type  the actual data type.
 * @param[in] itype the intermediate data type.
 *
 * @return The result of the fixed point multiplication. The result is saturated in case of overflow
 */
#define MULQ_SAT_IMPL(type, itype)                                                            \
    inline type mul_sat_##type(type VopA, type VopB, int fixed_point_position)                \
    {                                                                                         \
        itype round_val = (itype)(1 << (fixed_point_position - 1));                           \
        itype res       = mad_sat(CONVERT((VopA), itype), CONVERT((VopB), itype), round_val); \
        return CONVERT_SAT((res >> (itype)fixed_point_position), type);                       \
    }

MULQ_SAT_IMPL(qs8x16, qs16x16)
MULQ_SAT_IMPL(qs16x8, qs32x8)
MULQ_SAT_IMPL(qs16x16, qs32x16)

#define MUL_SAT_OP_EXPAND_STR(a, b, type, size, position) mul_sat_##type##x##size((a), (b), (position))
#define MUL_SAT_OP_EXPAND(a, b, type, size, position) MUL_SAT_OP_EXPAND_STR(a, b, type, size, position)

/** Saturate multiply-accumulate
  *
  * @param[in] type  the actual data type.
  * @param[in] itype the intermediate data type.
  *
  * @return The result of the fixed point multiply-accumulate. The result is saturated in case of overflow
  */
#define MLAQ_SAT_IMPL(type, itype)                                                                                 \
    type mla_sat_##type(type VopA, type VopB, type VopC, int fixed_point_position)                                 \
    {                                                                                                              \
        itype res = mad_sat(CONVERT(VopB, itype), CONVERT(VopC, itype), (itype)(1 << (fixed_point_position - 1))); \
        return add_sat(VopA, CONVERT_SAT(res >> (itype)fixed_point_position, type));                               \
    }

MLAQ_SAT_IMPL(qs8x8, qs16x8)
MLAQ_SAT_IMPL(qs8x16, qs16x16)
MLAQ_SAT_IMPL(qs16x8, qs32x8)

#define MLA_SAT_OP_EXPAND_STR(a, b, c, type, size, position) mla_sat_##type##x##size((a), (b), (c), (position))
#define MLA_SAT_OP_EXPAND(a, b, c, type, size, position) MLA_SAT_OP_EXPAND_STR(a, b, c, type, size, position)

/** Saturate multiply-accumulate long
  *
  * @param[in] type  the actual data type.
  * @param[in] itype the intermediate data type.
  *
  * @return The result of the fixed point multiply-accumulate long. The result is saturated in case of overflow
  */
#define MLALQ_SAT_IMPL(type, itype)                                                                                \
    itype mlal_sat_##type(itype VopA, type VopB, type VopC, int fixed_point_position)                              \
    {                                                                                                              \
        itype res = mad_sat(CONVERT(VopB, itype), CONVERT(VopC, itype), (itype)(1 << (fixed_point_position - 1))); \
        return add_sat(VopA, res >> (itype)fixed_point_position);                                                  \
    }

MLALQ_SAT_IMPL(qs8x8, qs16x8)
MLALQ_SAT_IMPL(qs16x8, qs32x8)

#define MLAL_SAT_OP_EXPAND_STR(a, b, c, type, size, position) mlal_sat_##type##x##size((a), (b), (c), (position))
#define MLAL_SAT_OP_EXPAND(a, b, c, type, size, position) MLAL_SAT_OP_EXPAND_STR(a, b, c, type, size, position)

/** Saturate division of two fixed point numbers
  *
  * @param[in] stype the actual scalar data type.
  * @param[in] type  the actual data type.
  * @param[in] itype the intermediate data type.
  *
  * @return The result of the fixed point division. The result is saturated in case of overflow
  */
#define DIVQ_SAT_IMPL(stype, type, itype)                                                                                                                \
    inline type div_sat_##type(type VopA, type VopB, int fixed_point_position)                                                                           \
    {                                                                                                                                                    \
        itype conv_a      = CONVERT((VopA), itype);                                                                                                      \
        itype denominator = CONVERT((VopB), itype);                                                                                                      \
        itype numerator   = conv_a << (itype)(fixed_point_position);                                                                                     \
        itype res         = select(numerator / denominator, select((itype)stype##_MAX, (itype)stype##_MIN, conv_a < (itype)0), denominator == (itype)0); \
        return CONVERT_SAT((res), type);                                                                                                                 \
    }

DIVQ_SAT_IMPL(qs8, qs8x16, qs16x16)
DIVQ_SAT_IMPL(qs16, qs16x16, qs32x16)

#define DIV_SAT_OP_EXPAND_STR(a, b, type, size, position) div_sat_##type##x##size((a), (b), (position))
#define DIV_SAT_OP_EXPAND(a, b, type, size, position) DIV_SAT_OP_EXPAND_STR(a, b, type, size, position)

/** Saturate exponential of a fixed point vector
  *
  * @param[in] stype the actual scalar data type.
  * @param[in] type  the actual data type.
  * @param[in] size  the number of the calculated elements.
  *
  * @return The result of the fixed point exponential. The result is saturated in case of overflow
  */
#define EXPQ_IMPL(stype, type, size)                                                                                     \
    inline type exp_sat_##type(type VopA, int fixed_point_position)                                                      \
    {                                                                                                                    \
        type const_one = (type)(1 << (fixed_point_position));                                                            \
        type ln2       = (type)((((0x58B9 >> (14 - fixed_point_position))) + 1) >> 1);                                   \
        type inv_ln2   = (type)((((0x38AA >> (14 - fixed_point_position)) + 1) >> 1)) | const_one;                       \
        type A         = (type)(((0x7FBA >> (14 - fixed_point_position)) + 1) >> 1);                                     \
        type B         = (type)(((0x3FE9 >> (14 - fixed_point_position)) + 1) >> 1);                                     \
        type C         = (type)(((0x1693 >> (14 - fixed_point_position)) + 1) >> 1);                                     \
        type D         = (type)(((0x0592 >> (14 - fixed_point_position)) + 1) >> 1);                                     \
        type m         = MUL_SAT_OP_EXPAND(VopA, inv_ln2, stype, size, fixed_point_position);                            \
        type dec_m     = m >> (type)fixed_point_position;                                                                \
        type alpha     = MUL_SAT_OP_EXPAND(dec_m << (type)fixed_point_position, ln2, stype, size, fixed_point_position); \
        alpha          = CONVERT(abs_diff(VopA, alpha), type);                                                           \
        type sum       = add_sat(MUL_SAT_OP_EXPAND(alpha, D, stype, size, fixed_point_position), C);                     \
        sum            = add_sat(MUL_SAT_OP_EXPAND(alpha, sum, stype, size, fixed_point_position), B);                   \
        sum            = add_sat(MUL_SAT_OP_EXPAND(alpha, sum, stype, size, fixed_point_position), A);                   \
        sum            = add_sat(MUL_SAT_OP_EXPAND(alpha, sum, stype, size, fixed_point_position), const_one);           \
        return select(select(sum << dec_m, sum >> -dec_m, dec_m < (type)0), (type)stype##_MAX, clz(sum) <= dec_m);       \
    }

EXPQ_IMPL(qs8, qs8x16, 16)
EXPQ_IMPL(qs16, qs16x16, 16)

#define EXP_OP_EXPAND_STR(a, type, size, position) exp_sat_##type##x##size((a), (position))
#define EXP_OP_EXPAND(a, type, size, position) EXP_OP_EXPAND_STR(a, type, size, position)

/** Saturate logarithm of a fixed point vector
  *
  * @param[in] stype the actual scalar data type.
  * @param[in] type  the actual data type.
  * @param[in] size  the number of the calculated elements.
  *
  * @return The result of the fixed point logarithm. The result is saturated in case of overflow
  */
#define LOGQ_IMPL(stype, type, size)                                                                                                       \
    inline type log_sat_##type(type VopA, int fixed_point_position)                                                                        \
    {                                                                                                                                      \
        type const_one = (type)(1 << (fixed_point_position));                                                                              \
        type ln2       = (type)(0x58B9 >> (15 - fixed_point_position));                                                                    \
        type A         = (type)(0x5C0F >> (14 - fixed_point_position));                                                                    \
        type B         = -(type)(0x56AE >> (15 - fixed_point_position));                                                                   \
        type C         = (type)(0x2933 >> (15 - fixed_point_position));                                                                    \
        type D         = -(type)(0x0AA7 >> (15 - fixed_point_position));                                                                   \
        type inter_a   = select(VopA, DIV_SAT_OP_EXPAND(const_one, VopA, stype, size, fixed_point_position), VopA < const_one);            \
        type shift_val = (type)(15 - stype##_SHIFT) - clz(inter_a >> (type)fixed_point_position);                                          \
        inter_a        = inter_a >> shift_val;                                                                                             \
        inter_a        = sub_sat(inter_a, const_one);                                                                                      \
        type sum       = add_sat(MUL_SAT_OP_EXPAND(inter_a, D, stype, size, fixed_point_position), C);                                     \
        sum            = add_sat(MUL_SAT_OP_EXPAND(inter_a, sum, stype, size, fixed_point_position), B);                                   \
        sum            = add_sat(MUL_SAT_OP_EXPAND(inter_a, sum, stype, size, fixed_point_position), A);                                   \
        sum            = MUL_SAT_OP_EXPAND(inter_a, sum, stype, size, fixed_point_position);                                               \
        sum            = MUL_SAT_OP_EXPAND(add_sat(sum, shift_val << (type)fixed_point_position), ln2, stype, size, fixed_point_position); \
        return select(select(sum, -sum, VopA < const_one), (type)0, VopA < (type)0);                                                       \
    }

LOGQ_IMPL(qs8, qs8x16, 16)

#define LOG_OP_EXPAND_STR(a, type, size, position) log_sat_##type##x##size((a), (position))
#define LOG_OP_EXPAND(a, type, size, position) LOG_OP_EXPAND_STR(a, type, size, position)

/** Saturate inverse square root of a fixed point vector
  *
  * @param[in] stype the actual scalar data type.
  * @param[in] type  the actual data type.
  * @param[in] size  the number of the calculated elements.
  *
  * @return The result of the fixed point inverse square root. The result is saturated in case of overflow
  */
#define INVSQRTQ_IMPL(stype, type, size)                                                                                                                                                                                               \
    inline type invsqrt_sat_##type(type VopA, int fixed_point_position)                                                                                                                                                                \
    {                                                                                                                                                                                                                                  \
        type const_three = (type)(3 << (fixed_point_position));                                                                                                                                                                        \
        type shift_value = (type)(16 - stype##_SHIFT) - (clz(VopA) + (type)fixed_point_position);                                                                                                                                      \
        type temp        = select(VopA >> shift_value, VopA << (-shift_value), shift_value < (type)0);                                                                                                                                 \
        type x           = temp;                                                                                                                                                                                                       \
        x                = MUL_SAT_OP_EXPAND(x, sub_sat(const_three, MUL_SAT_OP_EXPAND(MUL_SAT_OP_EXPAND(x, x, stype, size, fixed_point_position), temp, stype, size, fixed_point_position)), stype, size, fixed_point_position) >> 1; \
        x                = MUL_SAT_OP_EXPAND(x, sub_sat(const_three, MUL_SAT_OP_EXPAND(MUL_SAT_OP_EXPAND(x, x, stype, size, fixed_point_position), temp, stype, size, fixed_point_position)), stype, size, fixed_point_position) >> 1; \
        x                = MUL_SAT_OP_EXPAND(x, sub_sat(const_three, MUL_SAT_OP_EXPAND(MUL_SAT_OP_EXPAND(x, x, stype, size, fixed_point_position), temp, stype, size, fixed_point_position)), stype, size, fixed_point_position) >> 1; \
        type res         = select(x >> (shift_value >> 1), x << ((-shift_value) >> 1), shift_value < (type)0);                                                                                                                         \
        return select(res, stype##_MAX, res < (type)0);                                                                                                                                                                                \
    }

INVSQRTQ_IMPL(qs8, qs8x16, 16)

#define INVSQRT_OP_EXPAND_STR(a, type, size, position) invsqrt_sat_##type##x##size((a), (position))
#define INVSQRT_OP_EXPAND(a, type, size, position) INVSQRT_OP_EXPAND_STR(a, type, size, position)

#endif // ARM_COMPUTE_FIXED_POINT_H
