<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>If done in the assembler, this is branch relaxation.  You need to
      implement the calls backs mayNeedRelaxation, and relaxInstruction
      on your target MCAsmBackend.  The iteration relaxation logic
      already exists, see the generic MC code.  <br>
    </p>
    <p>Philip<br>
    </p>
    <div class="moz-cite-prefix">On 10/5/20 8:20 PM, Kai Wang via
      llvm-dev wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAHfQQ_U_rYPnyZKUWxOPb9Kf7jpZMPbt6OpHgPugPBDE5O1rmQ@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">
        <div>Correct the title.</div>
        <br>
        <div class="gmail_quote">
          <div dir="ltr" class="gmail_attr">On Tue, Oct 6, 2020 at 11:11
            AM Kai Wang <<a href="mailto:kai.wang@sifive.com"
              moz-do-not-send="true">kai.wang@sifive.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">
            <div dir="ltr">
              <div>Hi all,</div>
              <div><br>
              </div>
              In RISC-V ISA, the range of conditional branches is within
              4KiB. In current implementation, if the branch target is
              out of range, LLVM MC will issue an error message to tell
              users it could not resolve the fixup record. I have
              compared the result with the GNU assembler. GNU assembler
              will convert the branch to inverted one plus jump to make
              the branch possible. The range of unconditional jump is
              1MiB. It looks like<br>
              <br>
              ##########################<br>
              bne a0, a1, FAR_BRANCH<br>
              …<br>
              FAR_BRANCH:<br>
              <br>
              converted to
              <div><br>
                ##########################<br>
                beq a0, a1, SKIP_J<br>
                j FAR_BRANCH<br>
                SKIP_J:<br>
                …<br>
                FAR_BRANCH:<br>
                <br>
                I found there is a target hook, relaxInstruction, that
                tries to achieve the similar goal. However, the target
                hook only replaces one MCInst with another one with a
                larger branch range. For example, c.beqz will be
                converted to beq in the RISC-V backend if the fixup
                value is out of range. There seems no target hook to
                convert one MCInst to a complex pattern in LLVM MC. Do I
                miss something obvious?<br>
                <br>
                I found there is a target hook, finishLayout, to
                manipulate the code generated. Does it make sense to
                implement the feature in finishLayout? Or is there any
                better idea to achieve the conversion? Thanks a lot.<br>
                <div><br>
                </div>
                <div>Best,</div>
                <div>Kai</div>
              </div>
            </div>
          </blockquote>
        </div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
    </blockquote>
  </body>
</html>