[LLVMdev] Question to use inline assemble in X86

Chris Lattner clattner at apple.com
Tue Dec 29 11:48:53 PST 2009


On Dec 29, 2009, at 3:09 AM, Heyu Zhu wrote:

> Hi everyone,
>  
> I try to add an instruction to x86. The instruction is a multiply-add instruction  
> MULADD A, B, C; //A = A + B * C.
> I use the instruction by inline assemble as below
>  
> int x, y, z;
> .....  ....
> x = 0;
> asm("MULADD %0, %1, %2":"=r"(x):"0"(x), "r"(y), "r"(z));
> ..... ....
>  
> The backend does allocate registers %edx, %edi, %esi for x,y, z respectively,
> but its assemble output is
>         MULADD %edx, %edx, %esi
> I expects it could output:
>         MULADD %edx, %edi, %esi
>  
> What's  matter with my constraints of inline asm?
>  

The constraint tells the compiler what registers are valid to use.  "r" means that it can use any register.  You need to tell the compiler what registers need to be used, because it doesn't look inside the asm string.  Please take a look at the GCC documentation for more details:
http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Extended-Asm
http://gcc.gnu.org/onlinedocs/gcc/Constraints.html#Constraints

-Chris





More information about the llvm-dev mailing list