[LLVMdev] Implementing llvm.atomic.cmp.swap.i32 on PowerPC

Evan Cheng evan.cheng at apple.com
Mon Jun 30 14:14:29 PDT 2008

You need to insert new basic blocks and update CFG to accomplish this.  
There is a hackish way to do this right now.  Add a pseudo instruction  
to represent this operation and mark it usesCustomDAGSchedInserter.  
This means the intrinsic is mapped to a single (pseudo) node. But it  
is then expanded into instructions that can span multiple basic  
blocks. See PPCTargetLowering::EmitInstrWithCustomInserter().


On Jun 30, 2008, at 6:10 AM, Gary Benson wrote:

> Chris Lattner wrote:
>> On Jun 27, 2008, at 8:27 AM, Gary Benson wrote:
>>> def CMP_UNRESw : Pseudo<(outs), (ins GPRC:$rA, GPRC:$rB, i32imm:
>>> $label),
>>>                          "cmpw $rA, $rB\n\tbne- La${label}_exit",
>>>                          [(PPCcmp_unres GPRC:$rA, GPRC:$rB, imm:
>>> $label)]>;
>>> }
>>> ...and I can't figure out the syntax for that.  Any suggestions?
>> You have to write custom encoding logic in C++ for this.  This
>> should go in PPCCodeEmitter::emitBasicBlock.  I admit this isn't
>> very elegant.  A better solution would be to fix the lowering to
>> produce two instructions instead of this pseudo instruction.
> Hi Chris,
> I'd prefer to fix the lowering if possible; the pseudo instructions
> are only used in three places, so it shouldn't be a huge change.
> I need to generate labels in PPCTargetLowering::LowerAtomicCMP_SWAP
> however: how do I do that?  FWIW the code it needs to emit is:
>  ; inputs: ptr, oldval, newval
>  loop:
>        lwarx $tmp, 0, $ptr
>        cmpw $oldval, $tmp
>        bne- exit
>        stwcx. $newval, 0, $ptr
>        bne- loop
>  exit:
>        ...
> Cheers,
> Gary
> -- 
> http://gbenson.net/
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

More information about the llvm-dev mailing list