<div dir="ltr"><div>The reason the ones in PPCInstrInfo.td don't have the patterns to match is the reason they are more analogous to your problem. Namely, tblgen does not have a way to produce nodes with more than one result. The load-with-update instructions do exactly that - one of the inputs is also an output, but the other output is independent (and necessarily a separate register). The FMA variants have patterns in the .td file because they don't have multiple results - they just have one of their operands being both an input and an output.<br><br></div>So the idea is that you specify your `outs` in the instruction definition, one of those will have a `RegConstraint` on them and finally, you emit these nodes in your <TargetName>ISelDAGToDAG.cpp.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 30, 2017 at 3:01 PM, Dr. ERDI Gergo <span dir="ltr"><<a href="mailto:gergo@erdi.hu" target="_blank">gergo@erdi.hu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Tue, 30 May 2017, Nemanja Ivanovic wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This is typically accomplished with something like PPC's `RegConstraint` and<br>
`NoEncode`. You can see examples of it that are very similar to what you're after in<br>
PPC's load/store with update forms (i.e. load a value and update the base register<br>
with the effective address - these are used for pre-increment loads/stores).<br>
For example: the definition of LBZU and friends in lib/Target/PowerPC/PPCInstrInf<wbr><a href="http://o.td">o.td</a>.<br>
For a simpler example of just the `RegConstraint` usage (as it doesn't use a compound<br>
node like PPC's address nodes), you can look at all the fused multiply-add such as<br>
XSMADDADP in lib/Target/PowerPC/PPCInstrVSX<wbr>.td.<br>
<br>
Hope this helps.<br>
</blockquote>
<br>
Thanks!<br>
<br>
However, none of the NoEncode examples in PPCInstrInfo.td seem to have an isel pattern; and the VSX examples, like XSMADDADP, seem to match on setting a single output:<br>
<br>
  let BaseName = "XSMADDADP" in {<br>
  let isCommutable = 1 in<br>
  def XSMADDADP : XX3Form<60, 33,<br>
                          (outs vsfrc:$XT), (ins vsfrc:$XTi, vsfrc:$XA, vsfrc:$XB),<br>
                          "xsmaddadp $XT, $XA, $XB", IIC_VecFP,<br>
                          [(set f64:$XT, (fma f64:$XA, f64:$XB, f64:$XTi))]>,<br>
                          RegConstraint<"$XTi = $XT">, NoEncode<"$XTi">,<br>
                          AltVSXFMARel;<br>
<br>
If I'm reading this right, this matches an instruction that updates $XT by taking the current $XT, and two extra args in $XA and $XB. However, my situation would be something akin to<br>
<br>
(set f64:$XC, (fma f64:$XA, f64:$XB, f64:$XTi))<br>
<br>
with the extra constraint that $XTi is overwritten in the process.<br>
<br>
Is there maybe a way to write a pattern like<br>
<br>
(set (tuple f64:$XC, f64:$XT), (fma f64:$XA, f64:$XB, f64:$XTi))<br>
<br>
that would match<br>
<br>
(set f64:$XC, (fma f64:$XA, f64:$XB, f64:$XTi))<br>
<br>
by automatically lifting it to store $XT as well? (of course, with a RegConstraint that $XT = $XTi)<br>
</blockquote></div><br></div>