[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