On 03/10/2015 08:02 PM, Andrew Haley wrote:
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.


...so do you think it would be better if the order of checks in if/else chain:

 972     public final long getLongUnaligned(Object o, long offset) {
 973         if ((offset & 7) == 0) {
 974             return getLong(o, offset);
 975         } else if ((offset & 3) == 0) {
 976             return makeLong(getInt(o, offset),
 977                             getInt(o, offset + 4));
 978         } else if ((offset & 1) == 0) {
 979             return makeLong(getShort(o, offset),
 980                             getShort(o, offset + 2),
 981                             getShort(o, offset + 4),
 982                             getShort(o, offset + 6));
 983         } else {
 984             return makeLong(getByte(o, offset),
 985                             getByte(o, offset + 1),
 986                             getByte(o, offset + 2),
 987                             getByte(o, offset + 3),
 988                             getByte(o, offset + 4),
 989                             getByte(o, offset + 5),
 990                             getByte(o, offset + 6),
 991                             getByte(o, offset + 7));
 992         }
 993     }


...was reversed:

if ((offset & 1) == 1) {
    // bytes
} else if ((offset & 2) == 2) {
    // shorts
} else if ((offset & 4) == 4) {
    // ints
} else {
    // longs
}


...or are JIT+CPU smart enough and there would be no difference?


Peter

Reply via email to