/*
 * 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_FIXEDPOINT_H__
#define __ARM_COMPUTE_FIXEDPOINT_H__

#include <cstdint>

namespace arm_compute
{
using qint8_t  = int8_t;  /**< 8 bit fixed point scalar value */
using qint16_t = int16_t; /**< 16 bit fixed point scalar value */
using qint32_t = int32_t; /**< 32 bit fixed point scalar value */
using qint64_t = int64_t; /**< 64 bit fixed point scalar value */

/** 8 bit fixed point scalar saturating shift left
 *
 * @param[in] a     First 8 bit fixed point input
 * @param[in] shift Shift amount (positive only values)
 *
 * @return The result of the 8 bit fixed point shift. The result is saturated in case of overflow
 */
qint8_t sqshl_qs8(qint8_t a, int shift);

/** 8 bit fixed point scalar shift right
 *
 * @param[in] a     First 8 bit fixed point input
 * @param[in] shift Shift amount (positive only values)
 *
 * @return The result of the 8 bit fixed point shift
 */
qint8_t sshr_qs8(qint8_t a, int shift);

/** 16 bit fixed point scalar shift right
 *
 * @param[in] a     First 16 bit fixed point input
 * @param[in] shift Shift amount (positive only values)
 *
 * @return The result of the 16 bit fixed point shift
 */
qint16_t sshr_qs16(qint16_t a, int shift);

/** 16 bit fixed point scalar saturating shift left
 *
 * @param[in] a     First 16 bit fixed point input
 * @param[in] shift Shift amount (positive only values)
 *
 * @return The result of the 16 bit fixed point shift. The result is saturated in case of overflow
 */
qint16_t sqshl_qs16(qint16_t a, int shift);

/** 8 bit fixed point scalar absolute value
 *
 * @param[in] a 8 bit fixed point input
 *
 * @return The result of the 8 bit fixed point absolute value
 */
qint8_t sabs_qs8(qint8_t a);

/** 16 bit fixed point scalar absolute value
 *
 * @param[in] a 16 bit fixed point input
 *
 * @return The result of the 16 bit fixed point absolute value
 */
qint16_t sabs_qs16(qint16_t a);

/** 8 bit fixed point scalar add
 *
 * @param[in] a First 8 bit fixed point input
 * @param[in] b Second 8 bit fixed point input
 *
 * @return The result of the 8 bit fixed point addition
 */
qint8_t sadd_qs8(qint8_t a, qint8_t b);

/** 16 bit fixed point scalar add
 *
 * @param[in] a First 16 bit fixed point input
 * @param[in] b Second 16 bit fixed point input
 *
 * @return The result of the 16 bit fixed point addition
 */
qint16_t sadd_qs16(qint16_t a, qint16_t b);

/** 8 bit fixed point scalar saturating add
 *
 * @param[in] a First 8 bit fixed point input
 * @param[in] b Second 8 bit fixed point input
 *
 * @return The result of the 8 bit fixed point addition. The result is saturated in case of overflow
 */
qint8_t sqadd_qs8(qint8_t a, qint8_t b);

/** 16 bit fixed point scalar saturating add
 *
 * @param[in] a First 16 bit fixed point input
 * @param[in] b Second 16 bit fixed point input
 *
 * @return The result of the 16 bit fixed point addition. The result is saturated in case of overflow
 */
qint16_t sqadd_qs16(qint16_t a, qint16_t b);

/** 32 bit fixed point scalar saturating add
 *
 * @param[in] a First 32 bit fixed point input
 * @param[in] b Second 32 bit fixed point input
 *
 * @return The result of the 32 bit fixed point addition. The result is saturated in case of overflow
 */
qint32_t sqadd_qs32(qint32_t a, qint32_t b);

/** 8 bit fixed point scalar subtraction
 *
 * @param[in] a First 8 bit fixed point input
 * @param[in] b Second 8 bit fixed point input
 *
 * @return The result of the 8 bit fixed point subtraction
 */
qint8_t ssub_qs8(qint8_t a, qint8_t b);

/** 16 bit fixed point scalar subtraction
 *
 * @param[in] a First 16 bit fixed point input
 * @param[in] b Second 16 bit fixed point input
 *
 * @return The result of the 16 bit fixed point subtraction
 */
qint16_t ssub_qs16(qint16_t a, qint16_t b);

/** 8 bit fixed point scalar saturating subtraction
 *
 * @param[in] a First 8 bit fixed point input
 * @param[in] b Second 8 bit fixed point input
 *
 * @return The result of the 8 bit fixed point subtraction. The result is saturated in case of overflow
 */
qint8_t sqsub_qs8(qint8_t a, qint8_t b);

/** 16 bit fixed point scalar saturating subtraction
 *
 * @param[in] a First 16 bit fixed point input
 * @param[in] b Second 16 bit fixed point input
 *
 * @return The result of the 16 bit fixed point subtraction. The result is saturated in case of overflow
 */
qint16_t sqsub_qs16(qint16_t a, qint16_t b);

/** 8 bit fixed point scalar multiply
 *
 * @param[in] a                    First 8 bit fixed point input
 * @param[in] b                    Second 8 bit fixed point input
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the 8 bit fixed point multiplication.
 */
qint8_t smul_qs8(qint8_t a, qint8_t b, int fixed_point_position);

/** 16 bit fixed point scalar multiply
 *
 * @param[in] a                    First 16 bit fixed point input
 * @param[in] b                    Second 16 bit fixed point input
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the 16 bit fixed point multiplication.
 */
qint16_t smul_qs16(qint16_t a, qint16_t b, int fixed_point_position);

/** 8 bit fixed point scalar saturating multiply
 *
 * @param[in] a                    First 8 bit fixed point input
 * @param[in] b                    Second 8 bit fixed point input
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the 8 bit fixed point multiplication. The result is saturated in case of overflow
 */
qint8_t sqmul_qs8(qint8_t a, qint8_t b, int fixed_point_position);

/** 16 bit fixed point scalar saturating multiply
 *
 * @param[in] a                    First 16 bit fixed point input
 * @param[in] b                    Second 16 bit fixed point input
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the 16 bit fixed point multiplication. The result is saturated in case of overflow
 */
qint16_t sqmul_qs16(qint16_t a, qint16_t b, int fixed_point_position);

/** 8 bit fixed point scalar multiply long
 *
 * @param[in] a                    First 8 bit fixed point input
 * @param[in] b                    Second 8 bit fixed point input
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the 8 bit fixed point multiplication long. The result is saturated in case of overflow
 */
qint16_t sqmull_qs8(qint8_t a, qint8_t b, int fixed_point_position);

/** 16 bit fixed point scalar multiply long
 *
 * @param[in] a                    First 16 bit fixed point input
 * @param[in] b                    Second 16 bit fixed point input
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the 16 bit fixed point multiplication long. The result is saturated in case of overflow
 */
qint32_t sqmull_qs16(qint16_t a, qint16_t b, int fixed_point_position);

/** 16 bit fixed point scalar saturating multiply
*
* @param[in] a                    First 16 bit fixed point input
* @param[in] b                    Second 16 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 16 bit fixed point multiplication. The result is saturated in case of overflow
*/
qint16_t sqmul_qs16(qint16_t a, qint16_t b, int fixed_point_position);

/** 8 bit fixed point scalar inverse square root
*
* @param[in] a                    8 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 8 bit fixed point inverse square root.
*/
qint8_t sinvsqrt_qs8(qint8_t a, int fixed_point_position);

/** 16 bit fixed point scalar inverse square root
*
* @param[in] a                    16 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 16 bit fixed point inverse square root.
*/
qint16_t sinvsqrt_qs16(qint16_t a, int fixed_point_position);

/** 8 bit fixed point scalar division
*
* @param[in] a                    First 8 bit fixed point input
* @param[in] b                    Second 8 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 8 bit fixed point division.
*/
qint8_t sdiv_qs8(qint8_t a, qint8_t b, int fixed_point_position);

/** 16 bit fixed point scalar division
*
* @param[in] a                    First 16 bit fixed point input
* @param[in] b                    Second 16 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 16 bit fixed point division.
*/
qint16_t sdiv_qs16(qint16_t a, qint16_t b, int fixed_point_position);

/** 8 bit fixed point scalar exponential
*
* @param[in] a                    8 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 8 bit fixed point exponential.
*/
qint8_t sqexp_qs8(qint8_t a, int fixed_point_position);

/** 16 bit fixed point scalar exponential
*
* @param[in] a                    16 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 16 bit fixed point exponential.
*/
qint16_t sqexp_qs16(qint16_t a, int fixed_point_position);

/** 16 bit fixed point scalar exponential
*
* @param[in] a                    16 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 16 bit fixed point exponential.
*/
qint16_t sexp_qs16(qint16_t a, int fixed_point_position);

/** 8 bit fixed point scalar logarithm
*
* @param[in] a                    8 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 8 bit fixed point logarithm.
*/
qint8_t slog_qs8(qint8_t a, int fixed_point_position);

/** 16 bit fixed point scalar logarithm
*
* @param[in] a                    16 bit fixed point input
* @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
*
* @return The result of the 16 bit fixed point logarithm.
*/
qint16_t slog_qs16(qint16_t a, int fixed_point_position);

/** Convert an 8 bit fixed point to float
 *
 * @param[in] a                    Input to convert
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the conversion 8 bit fixed point -> float
 */
float scvt_f32_qs8(qint8_t a, int fixed_point_position);

/** Convert a float to 8 bit fixed point
 *
 * @param[in] a                    Input to convert
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the conversion float -> 8 bit fixed point
 */
qint8_t sqcvt_qs8_f32(float a, int fixed_point_position);

/** Convert a 16 bit fixed point to float
 *
 * @param[in] a                    Input to convert
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the conversion 16 bit fixed point -> float
 */
float scvt_f32_qs16(qint16_t a, int fixed_point_position);

/** Convert a float to 16 bit fixed point
 *
 * @param[in] a                    Input to convert
 * @param[in] fixed_point_position Fixed point position that expresses the number of bits for the fractional part of the number
 *
 * @return The result of the conversion float -> 16 bit fixed point
 */
qint16_t sqcvt_qs16_f32(float a, int fixed_point_position);

/** Scalar saturating move and narrow.
 *
 * @param[in] a Input to convert to 8 bit fixed point
 *
 * @return The narrowing conversion to 8 bit
 */
qint8_t sqmovn_qs16(qint16_t a);

/** Scalar saturating move and narrow.
 *
 * @param[in] a Input to convert to 16 bit fixed point
 *
 * @return The narrowing conversion to 16 bit
 */
qint16_t sqmovn_qs32(qint32_t a);
}
#include "arm_compute/core/FixedPoint.inl"
#endif /* __ARM_COMPUTE_FIXEDPOINT_H__ */
