[FFmpeg-devel] r9017 breaks WMA decoding on Intel Macs
Graham Booker
gbooker
Sun Jun 3 19:45:05 CEST 2007
On Jun 3, 2007, at 12:11 PM, Trent Piepho wrote:
> On Sun, 3 Jun 2007, Graham Booker wrote:
>> one) seems to assume that the evaluation of the operator is 0 (not
>> the whole expression btw) meaning it evaluates to 0(..). So, what
>> about offest+1*%number. The newer gas assumes offset+1*0(...) in the
>> case of no offset in the %number, and the older gas assumes offset+0
>> (...) in the same case. For both, if the %number contains an offset,
>> then these evaluate to offset1+1*offset2(%register).
>
> That's pretty clever. Have you tested it with objdump -d to see if
> the
> disassembled object has the correct offset?
>
Actually, I was using gdb and doing a disassemble, but anyway, the
mac equivalent (otool -tv) on libavcodec/i386/fft_sse.o yields:
...
_ff_imdct_calc_sse:
00000187 pushl %ebp
...
00000227 movaps (%ecx),%xmm0
0000022a movaps (%ebx),%xmm3
0000022d movaps 0x10(%ecx),%xmm4
00000231 movaps 0x10(%ebx),%xmm7
00000235 movlps (%edx),%xmm1
00000238 movlps (%eax),%xmm2
0000023b movlps 0x08(%edx),%xmm5
0000023f movlps 0x08(%eax),%xmm6
...
Seems correct to me
>> P.S. Does anyone know a way to force gcc to give me a %number that
>> evaluates to offset(%register)? I can't seem to get it to test that
>
> Ask for "m" with something that's a stack variable or one of the
> function
> arguments, you should get "offset(%ebp)" or "offset(%esp)"
> depending on the
> value of omit-frame-pointer.
>
Ahh, good idea. Tested on:
"movaps %0, %%xmm0 \n\t" // xmm0 = r0 X r1
X : in2
"movaps %1, %%xmm3 \n\t" // xmm3 = X i1 X
i0: in1
"movaps -16+1*%0, %%xmm4 \n\t" // xmm4 = r0 X r1
X : in2
"movaps 16+1*%1, %%xmm7 \n\t" // xmm7 = X i1 X
i0: in1
I modified the above code so that %1 was "m"(s) and got:
0000021c movaps (%ecx),%xmm0
0000021f movaps 0x08(%ebp),%xmm3
00000223 movaps 0xf0(%ecx),%xmm4
00000227 movaps 0x18(%ebp),%xmm7
Notice, the offset of 0x8 and 0x18 for the second and fourth
instructions. The latter should be 16 bytes later in memory, and it
is. Looks like my modifications works. Tested it on linux, and it
yielded:
1d7: 0f 28 07 movaps (%edi),%xmm0
1da: 0f 28 5c 24 50 movaps 0x50(%esp),%xmm3
1df: 0f 28 67 f0 movaps 0xfffffff0(%edi),%xmm4
1e3: 0f 28 7c 24 60 movaps 0x60(%esp),%xmm7
Again, looks like it worked.
> If you reqest two "m" inputs, where one is a constant offset from the
> other, it should give you an offset too. x[i] and x[i+1], or x-
> >foo and
> x->bar for example.
>
> foo(int i,int x[20]) {asm("# %0 %1" :: "m"(x[i]), "m"(x[i+1])); }
> # (%eax,%edx,4) 4(%eax,%edx,4)
I actually tried this one, just got a different register :(. Maybe
my offsets were just too large when I tried it or something. Anyway,
using a "m" on a stack variable worked just fine.
- Graham
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 1601 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20070603/e7d4dab4/attachment.bin>
More information about the ffmpeg-devel
mailing list