blob: 6e00500b1016de0f7741e125609bc0343cedc3cc [file] [log] [blame]
/*
* 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__ */