Re: "Xiph needs someone to help with assembly for MSVC!"

"Fernando Pelliccioni" <[email protected]>
Newsgroups gmane.comp.multimedia.ogg.theora.devel
Message-ID <[email protected]>
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 <[email protected]> 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
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.