mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
libavutil: add saturating addition functions
Fixed-point audio codecs often use saturating arithmetic, and special instructions for these operations are common. Signed-off-by: Mans Rullgard <mans@mansr.com>
This commit is contained in:
parent
17c11cef9f
commit
6c4975eaaf
@ -83,6 +83,21 @@ static av_always_inline av_const unsigned av_clip_uintp2_arm(int a, int p)
|
|||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define av_sat_add32 av_sat_add32_arm
|
||||||
|
static av_always_inline int av_sat_add32_arm(int a, int b)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
__asm__ ("qadd %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define av_sat_dadd32 av_sat_dadd32_arm
|
||||||
|
static av_always_inline int av_sat_dadd32_arm(int a, int b)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
__asm__ ("qdadd %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
#else /* HAVE_ARMV6 */
|
#else /* HAVE_ARMV6 */
|
||||||
|
|
||||||
|
@ -181,6 +181,30 @@ static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p)
|
|||||||
else return a;
|
else return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add two signed 32-bit values with saturation.
|
||||||
|
*
|
||||||
|
* @param a one value
|
||||||
|
* @param b another value
|
||||||
|
* @return sum with signed saturation
|
||||||
|
*/
|
||||||
|
static av_always_inline int av_sat_add32_c(int a, int b)
|
||||||
|
{
|
||||||
|
return av_clipl_int32((int64_t)a + b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a doubled value to another value with saturation at both stages.
|
||||||
|
*
|
||||||
|
* @param a first value
|
||||||
|
* @param b value doubled and added to a
|
||||||
|
* @return sum with signed saturation
|
||||||
|
*/
|
||||||
|
static av_always_inline int av_sat_dadd32_c(int a, int b)
|
||||||
|
{
|
||||||
|
return av_sat_add32(a, av_sat_add32(b, b));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clip a float value into the amin-amax range.
|
* Clip a float value into the amin-amax range.
|
||||||
* @param a value to clip
|
* @param a value to clip
|
||||||
@ -387,6 +411,12 @@ static av_always_inline av_const int av_popcount64_c(uint64_t x)
|
|||||||
#ifndef av_clip_uintp2
|
#ifndef av_clip_uintp2
|
||||||
# define av_clip_uintp2 av_clip_uintp2_c
|
# define av_clip_uintp2 av_clip_uintp2_c
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef av_sat_add32
|
||||||
|
# define av_sat_add32 av_sat_add32_c
|
||||||
|
#endif
|
||||||
|
#ifndef av_sat_dadd32
|
||||||
|
# define av_sat_dadd32 av_sat_dadd32_c
|
||||||
|
#endif
|
||||||
#ifndef av_clipf
|
#ifndef av_clipf
|
||||||
# define av_clipf av_clipf_c
|
# define av_clipf av_clipf_c
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user