[FFmpeg-cvslog] r21922 - trunk/libavutil/internal.h

Måns Rullgård mans
Sat Feb 20 19:05:01 CET 2010


Michael Niedermayer <michaelni at gmx.at> writes:

> On Sat, Feb 20, 2010 at 05:02:48PM +0100, mru wrote:
>> Author: mru
>> Date: Sat Feb 20 17:02:48 2010
>> New Revision: 21922
>> 
>> Log:
>> Add casts to correct return type in macros for missing libm funcs
>> 
>> Modified:
>>    trunk/libavutil/internal.h
>> 
>> Modified: trunk/libavutil/internal.h
>> ==============================================================================
>> --- trunk/libavutil/internal.h	Sat Feb 20 16:39:27 2010	(r21921)
>> +++ trunk/libavutil/internal.h	Sat Feb 20 17:02:48 2010	(r21922)
>> @@ -221,12 +221,12 @@ static inline av_const unsigned int ff_s
>>  
>>  #if !HAVE_EXP2F
>>  #undef exp2f
>> -#define exp2f(x) exp2(x)
>> +#define exp2f(x) ((float)exp2(x))
>>  #endif /* HAVE_EXP2F */
>>  
>>  #if !HAVE_LLRINT
>>  #undef llrint
>> -#define llrint(x) rint(x)
>> +#define llrint(x) ((long long)rint(x))
>>  #endif /* HAVE_LLRINT */
>>  
>>  #if !HAVE_LOG2
>> @@ -236,7 +236,7 @@ static inline av_const unsigned int ff_s
>>  
>>  #if !HAVE_LOG2F
>>  #undef log2f
>> -#define log2f(x) log2(x)
>> +#define log2f(x) ((float)log2(x))
>>  #endif /* HAVE_LOG2F */
>
> This causes a serious speedloss

Only on broken platforms.  I added this because someone was insisting
it was needed, and while that was probably due to a bug, I still think
this is correct.  Those functions are defined by the C standard to
have those return types, so any replacement should follow that as
closely as possible.

>
> double func(double d){
>     return log2(d);
> }
>
> double func2(double d){
>     return (float)log2(d);
> }
>
> with gcc (Debian 4.3.3-14) 4.3.3
> results in:
>
> func2:
>         pushl   %ebp
>         movl    %esp, %ebp
>         subl    $24, %esp
>         fldl    8(%ebp)
>         fstpl   (%esp)
>         call    log2
>         fstps   -4(%ebp)
>         flds    -4(%ebp)
>         leave
>         ret
> func:
>         pushl   %ebp
>         movl    %esp, %ebp
>         popl    %ebp
>         jmp     log2

Try using the value in a float context instead.  It should make no
difference at all there, and that is how these calls are actually used
in FFmpeg.

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-cvslog mailing list