<div dir="ltr"><div>Matt,</div><div><br></div><div>  so in AMDGPU, the operands are sort of 'generic'? Can you point me to the right places?</div><div><br></div><div>Thanks.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 12, 2017 at 1:36 PM, Matt Arsenault <span dir="ltr"><<a href="mailto:Matthew.Arsenault@amd.com" target="_blank">Matthew.Arsenault@amd.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000"><div><div class="h5">
    <div class="m_-8996911971075530376moz-cite-prefix">On 04/12/2017 10:25 AM, Ryan Taylor via
      llvm-dev wrote:<br>
    </div>
    </div></div><blockquote type="cite"><div><div class="h5">
      
      <div dir="ltr">
        <div>For example, given a multiclass for ADD 32 bit that might
          produce something like:</div>
        <div><br>
        </div>
        <div>ADD32_REG_REG_REG (operands are all registers for a 32 bit
          add)</div>
        <div>ADD32_REG_IMM_REG (srcA is a register, srcB is an immediate
          and dst is a register)</div>
        <div>ADD32_REG_IMM_MEM (srcA is a register, srcB is an immediate
          and dst is a memory address)</div>
        <div><br>
        </div>
        <div>What I'd like to do is replace an operand, for example,
          change srcA from a REG to a MEM in ADD32_REG_REG_REG (so it
          would be ADD32_MEM_REG_REG).</div>
        <div><br>
        </div>
        <div>Currently, I'm simply building a new machine instruction
          via BuildMI with the appropriate operands and then removing
          the old machine instruction.</div>
        <div><br>
        </div>
        <div>My problem comes in trying to correlate the operation given
          the old instruction to the new instruction. How can I tell the
          old instruction was an ADD32? </div>
        <div><br>
        </div>
        <div>The problem I'm trying to solve is the DAG is CSE'd, which
          is generating extra move instructions (memory into register)
          when the memory is used more than once, this is unnecessary
          for us. Would it be possible to change the DAG right before
          Instruction Selection (this would be much easier than doing it
          in the backend but when I've tried in the past, CSE is
          performed always).</div>
        <div><br>
        </div>
        <div>Thanks.</div>
      </div>
      <br>
      <fieldset class="m_-8996911971075530376mimeAttachmentHeader"></fieldset>
      <br>
      </div></div><pre>______________________________<wbr>_________________
LLVM Developers mailing list
<a class="m_-8996911971075530376moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a class="m_-8996911971075530376moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a>
</pre>
    </blockquote>
    <p>I would recommend not having separate instruction definitions for
      every permutation of register and immediate operands, although I
      realize this is what most targets seem to do. Then you can simply
      replace the operand of the instruction rather than having to
      figure out the new opcode you need to use. What AMDGPU does is
      define various RegisterOperands with custom types that are allowed
      by the verifier to contain immediates. The same principle should
      also work for mem operands. You could also try to define an
      InstrMapping to get the other versions of the opcode.<span class="HOEnZb"><font color="#888888"><br>
    </font></span></p><span class="HOEnZb"><font color="#888888">
    <p>-Matt<br>
    </p>
  </font></span></div>

</blockquote></div><br></div>