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

Michael Niedermayer michaelni
Sat Feb 20 19:50:44 CET 2010


On Sat, Feb 20, 2010 at 06:05:01PM +0000, M?ns Rullg?rd wrote:
> 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.

the long long cast is needed the float should not be IMHO
consdider llrint(1.0)/2
without the cast that should end at 0.5



> 
> >
> > 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.

double log2x(double arg); //gcc will replace log2() by log2f()

float func(float d){
    return log2x(d) * log2x(d);
}

float func2(float d){
    return (float)log2x(d) * (float)log2x(d);
}

results in:

func2:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        flds    8(%ebp)
        fstpl   (%esp)
        call    log2x
        fstpl   -16(%ebp)
        flds    8(%ebp)
        fstpl   (%esp)
        call    log2x
        fldl    -16(%ebp)
        fstps   -4(%ebp)
        flds    -4(%ebp)
        fxch    %st(1)
        fstps   -4(%ebp)
        flds    -4(%ebp)
        fmulp   %st, %st(1)
        leave
        ret
func:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        flds    8(%ebp)
        fstpl   (%esp)
        call    log2x
        fstpl   -16(%ebp)
        flds    8(%ebp)
        fstpl   (%esp)
        call    log2x
        fmull   -16(%ebp)
        fstps   -4(%ebp)
        flds    -4(%ebp)
        leave
        ret

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Everything should be made as simple as possible, but not simpler.
-- Albert Einstein
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-cvslog/attachments/20100220/b6a813f6/attachment.pgp>



More information about the ffmpeg-cvslog mailing list