[FFmpeg-cvslog] r24926 - trunk/libavcodec/x86/vp56dsp.asm
Reimar Döffinger
Reimar.Doeffinger
Thu Aug 26 22:19:10 CEST 2010
On Thu, Aug 26, 2010 at 08:39:25PM +0100, M?ns Rullg?rd wrote:
> Reimar D?ffinger <Reimar.Doeffinger at gmx.de> writes:
> > On Thu, Aug 26, 2010 at 03:25:52PM -0400, Ronald S. Bultje wrote:
> >> On Thu, Aug 26, 2010 at 3:10 PM, Reimar D?ffinger
> >> <Reimar.Doeffinger at gmx.de> wrote:
> >> > I complained about the name back then already, but x86_reg is designed
> >> > to and can be used just fine on all architectures, there really
> >> > is no need to reinvent the wheel.
> >> > If the term "x86" alone makes you run away screaming then the
> >> > solution is to rename it and move it out of x86_cpu.h, but
> >> > you certainly don't need to reinvent it!
> >>
> >> Got it, the name confused me. I'm OK with it then, if Mans is OK also
> >> (even though the problem is limited to x86 only, apparently).
> >
> > This specific problem? Yes.
> > The problem in general? Not so sure.
> > Nowadays compilers tend to be brighter, but one of the issues tended to be that
> > something like
> > int i;
> > for (i = 0; i < j; i++)
> > array[i];
> > ended up with a sign-extension inside the loop.
> > I'd think that is not that unlikely to apply to other 64 bit
> > architectures as well and would make a "register-size" type
> > useful for them as well.
>
> That problem is also specific to x86. I know of no other architecture
> where the declared type of the counter would make a difference in a
> construct like that.
I'd appreciate it if you could give me the impression
of at least trying to understand me instead of just
finding a way to bash x86.
But in case I was unclear, I actually managed to construct
a case (of course very artificial) that shows the issue
_in principle_ even with non-broken/ancient compilers.
extern long j;
extern char *array;
int test(void)
{
int i;
int s;
for (i = 0; i < j; i++)
s += array[i];
return s;
}
int test2(void)
{
unsigned i;
int s;
for (i = 0; i < j; i++)
s += array[i];
return s;
}
int test3(void)
{
unsigned long i;
int s;
for (i = 0; i < j; i++)
s += array[i];
return s;
}
Compiled on PowerPC 64 the three loops are:
.L3:
lbzx 0,9,11
addi 11,11,1
add 0,0,3
extsw 3,0
bdnz .L3
.L9:
lbzx 9,10,11
addi 0,11,1
rldicl 11,0,0,32
add 9,9,3
cmpd 7,11,8
extsw 3,9
blt 7,.L9
.L14:
lbzx 0,9,11
addi 11,11,1
add 0,0,3
extsw 3,0
bdnz .L14
More information about the ffmpeg-cvslog
mailing list