[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