[theora-dev] "Xiph needs someone to help with assembly for MSVC!"

Fernando Pelliccioni fpelliccioni at gmail.com
Thu Oct 2 07:30:33 PDT 2008


I think that the idea is to have a utility that makes the code
portable. Like the boost philosophy.

int val1, val2;

GNU Assembler:
    asm
    (
        "movl %%eax, %0;"
        "movl %%ebx, %1;"

         : "=r" ( val1 ), "=r" ( val2 )
    );

MASM:
   __asm
    {
         movl val1, eax
         movl val2, ebx
     };


En Preprocessor code:

    asm_open
            asm_op_2(movl , asm_c_var(val1), eax);
            asm_op_2(movl , asm_c_var(val2), ebx);
            asm_outputs
            bind_asm_reg(val1, "=r")
            bind_asm_reg(val2, "=r")
            asm_inputs
            asm_clobbers
    asm_close


I don't known how to count the 'asm_c_var' entries to convert to '%0',
'%1', ... '%n' ...

Regards,
Fernando Pelliccioni.

On Thu, Oct 2, 2008 at 11:14 AM, Chris Brien <chris.brien at tandberg.com> wrote:
> Fernando Pelliccioni wrote:
>>
>> Hello,
>>
>> I write to you for the announcement in this blog:
>> http://blog.hartwork.org/?p=86.
>>
>> I am interested in the open-source solution proposed in this article
>> (the preprocessor-macros solution).
>
> I would suggest using a compiler which understands GCC-style assembly syntax
> such as Intel's ICC, rather than making the effort to rewrite. Since this is
> for MSVC users, the fact that it is non-free is moot.
>
> Otherwise, it is relatively straightforward to write macros which expand to
> MSVC or GCC style syntax, such as
>
> #ifdef GCC
> #define asm_op_3(instruction, a, b, c) instruction %a,%b,%c
> #else
> #define asm_op_3(instruction, a, b, c) instruction c,b,a
> #endif
>
> The major difference being the order of operands is exactly reversed, which
> is easy to deal with using a macro. The only other thing to worry about is
> how to specify C variables from assembly. GCC uses complicated constraints
> whereas MSVC can refer to variables directly.
>
> #ifdef GCC
> #define asm_c_var(x) %x
> #define bind_asm_c_var(name, constraint) (name) constraint (name)
> #else
> #define asm_c_var(x) x
> #define bind_asm_c_var(name, constraint)
> #endif
>
> So you can then write
> asm
> {
>        asm_op_2(movd, asm_c_var(foo), xmm1);
>        asm_op_3(pushfd, 0xd, xmm1, xmm2);
>        asm_inputs
>        bind_asm_reg(foo, "m,r")
>        asm_outputs
>        asm_clobbers
> };
>
> Etcetera.
>
> Chris
>


More information about the theora-dev mailing list