<div dir="ltr">Right, ok -- just wanted to make sure I wasn't missing something.  For platforms that don't support unaligned access, is it expected that callers will be reading/writing addresses that are unaligned to the size of the type they're reading? My hunch is that on such platforms folks would tend to align their data layouts so as to avoid unaligned operations, in which case checking for "natural" alignment first makes sense.  But I don't know if that's actually true or not.</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 12, 2015 at 2:07 PM, Peter Levart <span dir="ltr"><<a href="mailto:peter.levart@gmail.com" target="_blank">peter.levart@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div style="background-color:rgb(255,255,255);color:rgb(0,0,0)" bgcolor="#FFFFFF" text="#000000"><span class="">
    <br>
    <br>
    <div>On 03/12/2015 06:30 PM, Vitaly
      Davidovich wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">Isn't the C2 intrinsic just reading the value
        starting at the specified offset directly (when unaligned access
        is supported) and not doing the branching?</div>
      </blockquote>
    <br></span>
    It is. This code is for those platforms not supporting unaligned
    accesses.<span class="HOEnZb"><font color="#888888"><br>
    <br>
    Peter</font></span><div><div class="h5"><br>
    <br>
    <blockquote type="cite">
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Thu, Mar 12, 2015 at 1:15 PM, Peter
          Levart <span dir="ltr"><<a href="mailto:peter.levart@gmail.com" target="_blank">peter.levart@gmail.com</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div style="background-color:rgb(255,255,255);color:rgb(0,0,0)" bgcolor="#FFFFFF" text="#000000"><span> <br>
                <br>
                <div>On 03/10/2015 08:02 PM, Andrew Haley wrote:<br>
                </div>
                <blockquote type="cite">
                  <pre>The new algorithm does an N-way branch, always loading and storing
subwords according to their natural alignment.  So, if the address is
random and the size is long it will access 8 bytes 50% of the time, 4
shorts 25% of the time, 2 ints 12.5% of the time, and 1 long 12.5% of
the time.  So, for every random load/store we have a 4-way branch.</pre>
                  </blockquote>
                <br>
                <br>
              </span> ...so do you think it would be better if the order
              of checks in if/else chain:<br>
              <br>
               972     public final long getLongUnaligned(Object o, long
              offset) {<br>
               973         if ((offset & 7) == 0) {<br>
               974             return getLong(o, offset);<br>
               975         } else if ((offset & 3) == 0) {<br>
               976             return makeLong(getInt(o, offset),<br>
               977                             getInt(o, offset + 4));<br>
               978         } else if ((offset & 1) == 0) {<br>
               979             return makeLong(getShort(o, offset),<br>
               980                             getShort(o, offset + 2),<br>
               981                             getShort(o, offset + 4),<br>
               982                             getShort(o, offset + 6));<br>
               983         } else {<br>
               984             return makeLong(getByte(o, offset),<br>
               985                             getByte(o, offset + 1),<br>
               986                             getByte(o, offset + 2),<br>
               987                             getByte(o, offset + 3),<br>
               988                             getByte(o, offset + 4),<br>
               989                             getByte(o, offset + 5),<br>
               990                             getByte(o, offset + 6),<br>
               991                             getByte(o, offset + 7));<br>
               992         }<br>
               993     }<br>
              <br>
              <br>
              ...was reversed:<br>
              <br>
              if ((offset & 1) == 1) {<br>
                  // bytes<br>
              } else if ((offset & 2) == 2) {<br>
                  // shorts<br>
              } else if ((offset & 4) == 4) {<br>
                  // ints<br>
              } else {<br>
                  // longs<br>
              }<br>
              <br>
              <br>
              ...or are JIT+CPU smart enough and there would be no
              difference?<span><font color="#888888"><br>
                  <br>
                  <br>
                  Peter<br>
                  <br>
                </font></span></div>
          </blockquote>
        </div>
        <br>
      </div>
      </blockquote>
    <br>
  </div></div></div>

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