<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jun 26, 2019 at 1:37 PM Tim Northover <<a href="mailto:t.p.northover@gmail.com">t.p.northover@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Wed, 26 Jun 2019 at 10:27, Gleb Popov <<a href="mailto:6yearold@gmail.com" target="_blank">6yearold@gmail.com</a>> wrote:<br>
> For the sake of simplicity I decided not to bother with stack register yet and instead I just emit FrameIndex as immediate:<br>
><br>
> bool MyBackendDAGToDAGISel::SelectAddrFI(SDValue &N, SDValue &R) {<br>
>   if (N.getOpcode() != ISD::FrameIndex)<br>
>     return false;<br>
>   MachineFrameInfo &MFI = MF->getFrameInfo();<br>
>   int FX = cast<FrameIndexSDNode>(N)->getIndex();<br>
>   R = CurDAG->getTargetFrameIndex(FX, MVT::i32);<br>
>   return true;<br>
> }<br>
><br>
> This way I end up with<br>
><br>
> store %r1, [1]<br>
><br>
> and handle it in my CPU emulator accordingly.<br>
><br>
> So, instead of matching that FrameIndex in store, I really want to emit a load first and then use a register in the store instruction.<br>
<br>
As you say, SelectAddrFI will only be used when looking into a store,<br>
and I think that's fine: it's a specialized addressing-mode<br>
implemented in just the right place. You need a completely separate<br>
"case" in MyBackendDAGToDAGISel::Select to handle a bare<br>
ISD::FrameIndex.<br></blockquote><div><br></div><div>Thanks for clearing this up! I was thinking the same, but wasn't sure.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Since you don't use SP, your implementation of FrameIndex will<br>
probably just be a MOV-immediate instruction. Final output would be<br>
something like:<br>
<br>
    mov %r1, 2     // Produced by matching the ISD::FrameIndex<br>
    store %r1, [1]<br>
<br>
I don't think load is going to be involved anywhere unless you meant<br>
it in the broader sense where (e.g.) Z80 referred to its move<br>
instructions as loads.<br></blockquote><div><br></div><div>Silly me -_\</div><div>Why was I talking about a load all this time? You're right, I needed a simple mov there. I have added the following code into MyBackendDAGToDAGISel::Select() and it worked:</div><div><br></div><div>if(FrameIndexSDNode *FIN = dyn_cast<FrameIndexSDNode>(N))<br>  {<br>      auto Addr = CurDAG->getTargetFrameIndex(<br>                    FIN->getIndex(), TLI->getPointerTy(CurDAG->getDataLayout()));<br>      SDNode *MOV = CurDAG->getMachineNode(MYBACK::MovRI, dl, MVT::i32, Addr);<br>      CurDAG->ReplaceAllUsesWith(N, MOV);<br>      return;<br>  }</div><div><br></div><div>I'm eternally grateful for helping me with this, thank you again.<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Cheers.<br>
<br>
Tim.<br>
</blockquote></div></div>