Hi,

On Mon, Mar 19, 2012 at 12:03 PM, Jason Garrett-Glaser <[email protected]> wrote:
> On Mon, Mar 19, 2012 at 10:14 AM, Ronald S. Bultje <[email protected]> wrote:
>> On Mon, Mar 19, 2012 at 9:48 AM, Jason Garrett-Glaser <[email protected]> wrote:
>>> On Sat, Mar 17, 2012 at 9:34 AM, Ronald S. Bultje <[email protected]> 
>>> wrote:
>>>> ---
>>>>  libavcodec/x86/cabac.h |   17 ++++++++++-------
>>>>  1 files changed, 10 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/libavcodec/x86/cabac.h b/libavcodec/x86/cabac.h
>>>> index 3c3652d..c4832c3 100644
>>>> --- a/libavcodec/x86/cabac.h
>>>> +++ b/libavcodec/x86/cabac.h
>>>> @@ -105,8 +105,8 @@ static av_always_inline int 
>>>> get_cabac_bypass_sign_x86(CABACContext *c, int val)
>>>>  {
>>>>     x86_reg tmp;
>>>>     __asm__ volatile(
>>>> -        "movl %4, %k1                           \n\t"
>>>> -        "movl %2, %%eax                         \n\t"
>>>> +        "movl %c5(%2), %k1                      \n\t"
>>>> +        "movl %c3(%2), %%eax                    \n\t"
>>>>         "shl $17, %k1                           \n\t"
>>>>         "add %%eax, %%eax                       \n\t"
>>>>         "sub %k1, %%eax                         \n\t"
>>>> @@ -117,7 +117,7 @@ static av_always_inline int 
>>>> get_cabac_bypass_sign_x86(CABACContext *c, int val)
>>>>         "sub %%edx, %%ecx                       \n\t"
>>>>         "test %%ax, %%ax                        \n\t"
>>>>         " jnz 1f                                \n\t"
>>>> -        "mov  %3, %1                            \n\t"
>>>> +        "mov  %c4(%2), %1                       \n\t"
>>>>         "subl $0xFFFF, %%eax                    \n\t"
>>>>         "movzwl (%1), %%edx                     \n\t"
>>>>         "bswap %%edx                            \n\t"
>>>> @@ -126,11 +126,14 @@ static av_always_inline int 
>>>> get_cabac_bypass_sign_x86(CABACContext *c, int val)
>>>>         "addl %%edx, %%eax                      \n\t"
>>>>         "mov  %1, %3                            \n\t"
>>>>         "1:                                     \n\t"
>>>> -        "movl %%eax, %2                         \n\t"
>>>> +        "movl %%eax, %c4(%2)                    \n\t"
>>>>
>>>> -        :"+c"(val), "=&r"(tmp), "+m"(c->low), "+m"(c->bytestream)
>>>> -        :"m"(c->range)
>>>> -        : "%eax", "%edx"
>>>> +        : "+c"(val), "=&r"(tmp)
>>>> +        : "r"(c),
>>>> +          "i"(offsetof(CABACContext, low)),
>>>> +          "i"(offsetof(CABACContext, bytestream)),
>>>> +          "i"(offsetof(CABACContext, range))
>>>> +        : "%eax", "%edx", "memory"
>>>
>>> IMO clobbering memory looks very very hacky, and I don't like it.  If
>>> you need to clobber something, it'd be much better if we could clobber
>>> exactly what needs clobbering, and nothing more.
>>
>> Well, I don't think inline assembly supports explicitely clobbering
>> variables without marking them as "+m" or "+r", which messes up the
>> register allocator for at least gcc-4.2.1 (it uses a different
>> register for each "m"(c->...), thus running out of registers; yes,
>> there's many things wrong there).
>
> You can clobber a memory location without referencing it in the asm,
> and thus without allocating a register for it.

That sounds useful, how do I do that?

Ronald
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to