Re: [FFmpeg-devel] [PATCH 1/4] libavutil: Add saturating subtraction functions
On 2 December 2017 at 17:36, Andrew D'Addesiowrote: > Add av_sat_sub32 and av_sat_dsub32 as the subtraction analogues to > av_sat_add32/av_sat_dadd32. > > Also clarify the formulas for dadd32/dsub32. > > Signed-off-by: Andrew D'Addesio > --- > libavutil/arm/intmath.h | 16 > libavutil/common.h | 32 +++- > 2 files changed, 47 insertions(+), 1 deletion(-) > > diff --git a/libavutil/arm/intmath.h b/libavutil/arm/intmath.h > index 65e42c5..5311a7d 100644 > --- a/libavutil/arm/intmath.h > +++ b/libavutil/arm/intmath.h > @@ -94,6 +94,22 @@ static av_always_inline int av_sat_dadd32_arm(int a, > int b) > return r; > } > > +#define av_sat_sub32 av_sat_sub32_arm > +static av_always_inline int av_sat_sub32_arm(int a, int b) > +{ > +int r; > +__asm__ ("qsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); > +return r; > +} > + > +#define av_sat_dsub32 av_sat_dsub32_arm > +static av_always_inline int av_sat_dsub32_arm(int a, int b) > +{ > +int r; > +__asm__ ("qdsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); > +return r; > +} > + > #endif /* HAVE_ARMV6_INLINE */ > > #if HAVE_ASM_MOD_Q > diff --git a/libavutil/common.h b/libavutil/common.h > index 8142b31..5e03828 100644 > --- a/libavutil/common.h > +++ b/libavutil/common.h > @@ -260,13 +260,37 @@ static av_always_inline int av_sat_add32_c(int a, > int b) > * > * @param a first value > * @param b value doubled and added to a > - * @return sum with signed saturation > + * @return sum sat(a + sat(2*b)) 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)); > } > > +/** > + * Subtract two signed 32-bit values with saturation. > + * > + * @param a one value > + * @param b another value > + * @return difference with signed saturation > + */ > +static av_always_inline int av_sat_sub32_c(int a, int b) > +{ > +return av_clipl_int32((int64_t)a - b); > +} > + > +/** > + * Subtract a doubled value from another value with saturation at both > stages. > + * > + * @param a first value > + * @param b value doubled and subtracted from a > + * @return difference sat(a - sat(2*b)) with signed saturation > + */ > +static av_always_inline int av_sat_dsub32_c(int a, int b) > +{ > +return av_sat_sub32(a, av_sat_add32(b, b)); > +} > + > /** > * Clip a float value into the amin-amax range. > * @param a value to clip > @@ -513,6 +537,12 @@ static av_always_inline av_const int > av_parity_c(uint32_t v) > #ifndef av_sat_dadd32 > # define av_sat_dadd32av_sat_dadd32_c > #endif > +#ifndef av_sat_sub32 > +# define av_sat_sub32 av_sat_sub32_c > +#endif > +#ifndef av_sat_dsub32 > +# define av_sat_dsub32av_sat_dsub32_c > +#endif > #ifndef av_clipf > # define av_clipf av_clipf_c > #endif > -- > 2.15.1.windows.2 > > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > Pushed with a minor bump, these will be useful for some entropy coding systems which rely on saturated adds. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH 1/4] libavutil: Add saturating subtraction functions
On Sat, Dec 02, 2017 at 11:46:56AM -0600, Andrew D'Addesio wrote: > Add av_sat_sub32 and av_sat_dsub32 as the subtraction analogues to > av_sat_add32/av_sat_dadd32. > > Also clarify the formulas for dadd32/dsub32. > > Signed-off-by: Andrew D'Addesio> --- > libavutil/arm/intmath.h | 16 > libavutil/common.h | 32 +++- > 2 files changed, 47 insertions(+), 1 deletion(-) this should bump something in version.h [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB The real ebay dictionary, page 2 "100% positive feedback" - "All either got their money back or didnt complain" "Best seller ever, very honest" - "Seller refunded buyer after failed scam" signature.asc Description: Digital signature ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 1/4] libavutil: Add saturating subtraction functions
Add av_sat_sub32 and av_sat_dsub32 as the subtraction analogues to av_sat_add32/av_sat_dadd32. Also clarify the formulas for dadd32/dsub32. Signed-off-by: Andrew D'Addesio--- libavutil/arm/intmath.h | 16 libavutil/common.h | 32 +++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/libavutil/arm/intmath.h b/libavutil/arm/intmath.h index 65e42c5..5311a7d 100644 --- a/libavutil/arm/intmath.h +++ b/libavutil/arm/intmath.h @@ -94,6 +94,22 @@ static av_always_inline int av_sat_dadd32_arm(int a, int b) return r; } +#define av_sat_sub32 av_sat_sub32_arm +static av_always_inline int av_sat_sub32_arm(int a, int b) +{ +int r; +__asm__ ("qsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); +return r; +} + +#define av_sat_dsub32 av_sat_dsub32_arm +static av_always_inline int av_sat_dsub32_arm(int a, int b) +{ +int r; +__asm__ ("qdsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); +return r; +} + #endif /* HAVE_ARMV6_INLINE */ #if HAVE_ASM_MOD_Q diff --git a/libavutil/common.h b/libavutil/common.h index 8142b31..5e03828 100644 --- a/libavutil/common.h +++ b/libavutil/common.h @@ -260,13 +260,37 @@ static av_always_inline int av_sat_add32_c(int a, int b) * * @param a first value * @param b value doubled and added to a - * @return sum with signed saturation + * @return sum sat(a + sat(2*b)) 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)); } +/** + * Subtract two signed 32-bit values with saturation. + * + * @param a one value + * @param b another value + * @return difference with signed saturation + */ +static av_always_inline int av_sat_sub32_c(int a, int b) +{ +return av_clipl_int32((int64_t)a - b); +} + +/** + * Subtract a doubled value from another value with saturation at both stages. + * + * @param a first value + * @param b value doubled and subtracted from a + * @return difference sat(a - sat(2*b)) with signed saturation + */ +static av_always_inline int av_sat_dsub32_c(int a, int b) +{ +return av_sat_sub32(a, av_sat_add32(b, b)); +} + /** * Clip a float value into the amin-amax range. * @param a value to clip @@ -513,6 +537,12 @@ static av_always_inline av_const int av_parity_c(uint32_t v) #ifndef av_sat_dadd32 # define av_sat_dadd32av_sat_dadd32_c #endif +#ifndef av_sat_sub32 +# define av_sat_sub32 av_sat_sub32_c +#endif +#ifndef av_sat_dsub32 +# define av_sat_dsub32av_sat_dsub32_c +#endif #ifndef av_clipf # define av_clipf av_clipf_c #endif -- 2.15.1.windows.2 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 1/4] libavutil: Add saturating subtraction functions
Add av_sat_sub32 and av_sat_dsub32 as the subtraction analogues to av_sat_add32/av_sat_dadd32. Also clarify the formulas for dadd32/dsub32. Signed-off-by: Andrew D'Addesio--- libavutil/arm/intmath.h | 16 libavutil/common.h | 32 +++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/libavutil/arm/intmath.h b/libavutil/arm/intmath.h index 65e42c5..5311a7d 100644 --- a/libavutil/arm/intmath.h +++ b/libavutil/arm/intmath.h @@ -94,6 +94,22 @@ static av_always_inline int av_sat_dadd32_arm(int a, int b) return r; } +#define av_sat_sub32 av_sat_sub32_arm +static av_always_inline int av_sat_sub32_arm(int a, int b) +{ +int r; +__asm__ ("qsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); +return r; +} + +#define av_sat_dsub32 av_sat_dsub32_arm +static av_always_inline int av_sat_dsub32_arm(int a, int b) +{ +int r; +__asm__ ("qdsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); +return r; +} + #endif /* HAVE_ARMV6_INLINE */ #if HAVE_ASM_MOD_Q diff --git a/libavutil/common.h b/libavutil/common.h index 8142b31..5e03828 100644 --- a/libavutil/common.h +++ b/libavutil/common.h @@ -260,13 +260,37 @@ static av_always_inline int av_sat_add32_c(int a, int b) * * @param a first value * @param b value doubled and added to a - * @return sum with signed saturation + * @return sum sat(a + sat(2*b)) 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)); } +/** + * Subtract two signed 32-bit values with saturation. + * + * @param a one value + * @param b another value + * @return difference with signed saturation + */ +static av_always_inline int av_sat_sub32_c(int a, int b) +{ +return av_clipl_int32((int64_t)a - b); +} + +/** + * Subtract a doubled value from another value with saturation at both stages. + * + * @param a first value + * @param b value doubled and subtracted from a + * @return difference sat(a - sat(2*b)) with signed saturation + */ +static av_always_inline int av_sat_dsub32_c(int a, int b) +{ +return av_sat_sub32(a, av_sat_add32(b, b)); +} + /** * Clip a float value into the amin-amax range. * @param a value to clip @@ -513,6 +537,12 @@ static av_always_inline av_const int av_parity_c(uint32_t v) #ifndef av_sat_dadd32 # define av_sat_dadd32av_sat_dadd32_c #endif +#ifndef av_sat_sub32 +# define av_sat_sub32 av_sat_sub32_c +#endif +#ifndef av_sat_dsub32 +# define av_sat_dsub32av_sat_dsub32_c +#endif #ifndef av_clipf # define av_clipf av_clipf_c #endif -- 2.15.1.windows.2 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel