<div dir="ltr"><div>Awesome, I ran into the same thing exactly.<br><br></div>And I have a patch for it. I wasn't sure that there were interest, but apparently, I'm not the only one.<br></div><div class="gmail_extra"><br><div class="gmail_quote">2014-08-01 14:41 GMT-07:00 Tom Stellard <span dir="ltr"><<a href="mailto:tom@stellard.net" target="_blank">tom@stellard.net</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Fri, Aug 01, 2014 at 01:23:37PM -0700, Jeff Kuskin wrote:<br>
> I am implementing a new backend and am pretty sure I don't quite understand "the way" one is supposed to implement conditional branches.<br>
><br>
> My target CPU natively supports a conditional branch instruction that accepts a condition to test (equal, less than, etc.), two operands (two registers, or one register and one immediate), and finally a target PC to branch to if the comparison succeeds.<br>
><br>
> Great -- that all seems to mesh directly with the ISD::BR_CC opcode.<br>
><br>
> However... I can't seem to use 'brcc' or 'br_cc' in the .td file.  Neither is recognized as a valid keyword.  I can use 'brcond', but given the capabilities of the CPU I'm targeting, it seems better to implement BR_CC directly and do setOperationAction(ISD::BRCOND, MVT::Other, Expand) to get BRCOND nodes expanded into BR_CC.  Correct?<br>
><br>
> I tried implementing comparison operations and 'brcond' in the .td file, but that yields assembly code that does a comparison instruction followed by a branch instruction, when the underlying CPU supports folding the comparison into the branch.<br>
><br>
><br>
> Is it in fact possible to use BR_CC directly in the TD file?  If so, how?  In particular, what pattern would I use?  If not, what is the recommended way to proceed (at a high level) when the target CPU supports conditional branches as I outlined above?<br>
><br>
<br>
There is no def in tablegen for br_cc.  I'm not sure why.  If you look in<br>
include/llvm/Target/TargetSelectionDAG.td, you will see all the SDNodes<br>
that can be used in TableGen.<br>
<br>
You have a few options for handling BR_CC.  You could custom select it<br>
to a target node during legalization.  It looks like there are a few<br>
targets that do this.  Or you could manually select it to a MachineSDNode<br>
in TargetDAGToDAGISel::Select().  You could also define a br_cc node in<br>
TableGen and write a pattern for it.<br>
<br>
-Tom<br>
<br>
><br>
> Thanks for any help!<br>
><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div><br></div>