[FFmpeg-devel] [PATCH] EA TGQ video fixes

Måns Rullgård mans
Thu Apr 16 21:01:39 CEST 2009


Michael Niedermayer <michaelni at gmx.at> writes:

> On Thu, Apr 16, 2009 at 07:03:17PM +0100, M?ns Rullg?rd wrote:
>> Reimar D?ffinger <Reimar.Doeffinger at gmx.de> writes:
>> 
>> > On Thu, Apr 16, 2009 at 07:46:38PM +0200, Vitor Sessak wrote:
>> >> Reimar D?ffinger wrote:
>> >> >> > -    DCTELEM block[6][64];
>> >> >> > +    DECLARE_ALIGNED_8(DCTELEM, block[6][64]);
>> >> >> >  
>> >> >> >      mode = bytestream_get_byte((const uint8_t**)bs);
>> >> >> >      if (mode>buf_end-*bs) {
>> >> > 
>> >> > Moving it into the context instead should be more reliable.
>> >> 
>> >> Why?
>> >
>> > Because you are declaring a stack variable as aligned which only works
>> > up to the value that the stack is already aligned usually which in the
>> > past on e.g. Windows usually meant it wouldn't be aligned.
>> > The situation should be better now but I doubt it is flawless and I also
>> > don't really see a point in keeping the variable on the stack anyway.
>> 
>> Very few platforms are capable of aligning stack variables to 16 bytes
>> or more.  It's pretty much only gcc on x86, and then only if main()
>
> may i protest, its not a limitation of platforms but compilers.

In this respect, the compiler can be considered part of the platform.
I could have made this more clear.

> you certainly can align the stack as much as you like by using asm()

That's highly non-portable.

> also theres no relation to main() beyond the compilers just being utter
> crap.

As long as those are the compilers we have to used, we must live with
their limitations.

> the following will fix up alignment in a nearly porable way given that
> the function uses the right amount of stack space itself
> align_stack(func_ptr, int align){
>     some variables
>     if(stack is not aligned by align)
>         return align_stack(func_ptr, align);
>     else
>         return func_ptr()
> }

Doing that in every function that needs an aligned stack is not good.

> a variable size array could also be used to achive this like
> align_stack2(func_ptr, int eat){
>     volatile char x[eat];
>     return func_ptr();
> }

The compiler is free to optimise that array out entirely, and *you*
would call it crap if it did not.

> for(i=0; i<123; i++)
>     if(align_stack2(check_align, i))
>         break;
> eat= i;
>
> anyway, iam of course aware this stuff above has issues like when a compiler
> tries to preserve (non existing) alignment
> but that just from a users POV, a compiler itself could easily fix things
> up using such an approuch

But they do not.  Now please stop pretending otherwise.

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



More information about the ffmpeg-devel mailing list