On Thu, Mar 12, 2015 at 1:15 PM, Peter Levart
<peter.lev...@gmail.com <mailto:peter.lev...@gmail.com>> wrote:
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