[LLVMdev] Adding xadd instruction to X86

John Criswell criswell at cs.uiuc.edu
Fri Dec 3 08:02:18 PST 2004


Chris Lattner wrote:
> On Thu, 2 Dec 2004, Brent Monroe wrote:
> 
>>I'm trying to add the xadd instruction to the X86 back end.
>>xadd r/m32, r32
>>exchanges r/m32 and r32, and loads the sum into r/m32.  I'm
>>interested in the case where the destination operand is a
>>memory location.
>>
>>I've added the following entry to X86InstrInfo.td:
>>def XADD32mr  : I<0x87, MRMDestMem,
>>                (ops i32mem:$src1, R32:$src2),
> 
> 
> This looks fine.
> 
> 
>>                "xadd{l} {$src1|$src2}, {$src2|$src1}">;
> 
> 
> I haven't checked this, but it's probably fine.
> 
> 
>>The xadd is emitted for the intrinsic function:
>>call int (<integer type>*, <integer type>)*
>>%llvm.atomic_fetch_add_store(<integer type>* <pointer>,
>>
>><integer type> <value>)
>>
>>I currently have the following code (PtrReg contains the
>>pointer argument, ValReg the value arg, and TmpReg an unused
>>register.):
>>
>>addDirectMem(BuildMI(BB, X86::XADD32mr, 4,
>>TmpReg).addReg(TwoReg), ValReg);
> 
> 
> This is the problem.  Try this:
>  addDirectMem(BuildMI(BB, X86::XADD32mr, 4, TmpReg), ValReg).addReg(TwoReg);
> 
> In particular, you want to add the memory address before the other reg.
> 
> Another problem though, is that (without looking at manual) I think xadd
> modifies the register value.  If this is the case, you will want to define
> it as a "two-operand" instruction.  Making the above change should get the
> assertion to go away though.

How do we define an instruction as a two-operand instruction?

> 
> -Chris
> 

-- John T.




More information about the llvm-dev mailing list