[FFmpeg-devel] [PATCH] lavu/common: use fabs(f) for FFABS/FFNABS

Anton Khirnov anton at khirnov.net
Wed Aug 14 16:10:28 EEST 2024


Quoting RĂ©mi Denis-Courmont (2024-07-26 18:32:19)
> The absolute value of a floating point value is easier to calculate than
> that of an integer: it is obtained by either clearing the sign or xoring it
> with itself. Accordingly, Arm, LoongArch, RISC-V have dedicated instructions
> to manipulate float sign bits. x86-64 has ANDPS.
> 
> As per C11 appendix F, FFABS() is not quite the same as fabs() however,
> due to differing NaN handling. GCC is able to optimise the current FFABS
> definition to match fabs() anyway with just -fno-signed-zeros. But Clang is
> evidently not doing so and inserts a comparison with 0 and a conditional
> select or branch. Now that we have C11, this is easy to fix properly.
> (Another option is to manually audit which of the ~880 FFABS/FFNABS use
> sites involve floating point values.)
> 
> Note that this still preserves the old definitions for C++ and pre-C11
> compilers since the 2 macros are public (even though they start with FF).
> ---
>  libavutil/common.h | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/libavutil/common.h b/libavutil/common.h
> index 3b830daf30..48761885fb 100644
> --- a/libavutil/common.h
> +++ b/libavutil/common.h
> @@ -71,7 +71,14 @@
>   * as with *abs()
>   * @see FFNABS()
>   */
> +#if !defined (__cplusplus) && __STDC_VERSION__ >= 201112L

Is __STDC_VERSION__ defined for C++?

-- 
Anton Khirnov


More information about the ffmpeg-devel mailing list