Skip to content

Commit

Permalink
Cleanups related to object and code headers
Browse files Browse the repository at this point in the history
  • Loading branch information
fniephaus committed Oct 19, 2024
1 parent 49a46bc commit 0f52c02
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
*/
package de.hpi.swa.trufflesqueak.image;

import de.hpi.swa.trufflesqueak.util.MiscUtils;

public final class SqueakImageConstants {

/** General. */
Expand All @@ -22,6 +20,7 @@ public final class SqueakImageConstants {
/** Object Header. */
public static final long OVERFLOW_SLOTS = 255;
public static final long SLOTS_MASK = 0xFFL << 56;
public static final int IDENTITY_HASH_HALF_WORD_MASK = (1 << 22) - 1;

/** Object Header Tag Bits. */
public static final int NUM_TAG_BITS = 3;
Expand Down Expand Up @@ -99,33 +98,28 @@ public static int classTableIndexFor(final int majorIndex, final int minorIndex)
* </pre>
*/
public static final class ObjectHeader {
private static final int NUM_SLOTS_SIZE = 1 << 8;
public static final int HASH_AND_CLASS_INDEX_SIZE = 1 << 22;
private static final int FORMAT_SIZE = 1 << 5;
private static final int PINNED_BIT_SHIFT = 30;

public static int getClassIndex(final long headerWord) {
return MiscUtils.bitSplit(headerWord, 0, HASH_AND_CLASS_INDEX_SIZE);
public static int getClassIndex(final long header) {
return (int) header & CLASS_INDEX_MASK;
}

public static int getFormat(final long headerWord) {
return MiscUtils.bitSplit(headerWord, 24, FORMAT_SIZE);
public static int getFormat(final long header) {
return (int) (header >> 24) & 0x1f;
}

public static int getHash(final long headerWord) {
return MiscUtils.bitSplit(headerWord, 32, HASH_AND_CLASS_INDEX_SIZE);
public static int getHash(final long header) {
return (int) (header >> 32) & IDENTITY_HASH_HALF_WORD_MASK;
}

public static int getNumSlots(final long headerWord) {
return MiscUtils.bitSplit(headerWord, 56, NUM_SLOTS_SIZE);
public static int getNumSlots(final long header) {
return (int) (header >> 56) & 255;
}

public static boolean isPinned(final long headerWord) {
return (headerWord >> PINNED_BIT_SHIFT & 1) == 1;
public static boolean isPinned(final long header) {
return (header >> 30 & 1) == 1;
}

public static long getHeader(final long numSlots, final long identityHash, final long format, final long classIndex) {
assert numSlots < NUM_SLOTS_SIZE && identityHash < HASH_AND_CLASS_INDEX_SIZE && format < FORMAT_SIZE && classIndex < HASH_AND_CLASS_INDEX_SIZE;
assert numSlots < 0x100 && identityHash < 0x400000 && format < 0x20 && classIndex < 0x400000;
return numSlots << 56 | identityHash << 32 | format << 24 | classIndex;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import de.hpi.swa.trufflesqueak.util.ObjectGraphUtils.ObjectTracer;

public abstract class AbstractSqueakObjectWithClassAndHash extends AbstractSqueakObject {
public static final int SQUEAK_HASH_MASK = ObjectHeader.HASH_AND_CLASS_INDEX_SIZE - 1;
private static final int MARK_BIT = 1 << 24;
/* Generate new hash if hash is 0 (see SpurMemoryManager>>#hashBitsOf:). */
private static final int HASH_UNINITIALIZED = 0;
Expand All @@ -38,15 +37,15 @@ public abstract class AbstractSqueakObjectWithClassAndHash extends AbstractSquea
* can be represented by just one 64-bit word.
*/
private ClassObject squeakClass;
private int squeahHashAndBits;
private int squeakHashAndBits;

// For special/well-known objects only.
protected AbstractSqueakObjectWithClassAndHash() {
this(HASH_UNINITIALIZED, null);
}

protected AbstractSqueakObjectWithClassAndHash(final long header, final ClassObject klass) {
squeahHashAndBits = ObjectHeader.getHash(header);
squeakHashAndBits = ObjectHeader.getHash(header);
squeakClass = klass;
// mark bit zero when loading image
}
Expand All @@ -56,15 +55,15 @@ protected AbstractSqueakObjectWithClassAndHash(final SqueakImageContext image, f
}

private AbstractSqueakObjectWithClassAndHash(final boolean markingFlag, final ClassObject klass) {
squeahHashAndBits = AbstractSqueakObjectWithClassAndHash.HASH_UNINITIALIZED;
squeakHashAndBits = AbstractSqueakObjectWithClassAndHash.HASH_UNINITIALIZED;
squeakClass = klass;
if (markingFlag) {
toggleMarkingFlag();
}
}

protected AbstractSqueakObjectWithClassAndHash(final AbstractSqueakObjectWithClassAndHash original) {
squeahHashAndBits = original.squeahHashAndBits;
squeakHashAndBits = original.squeakHashAndBits;
setSqueakHash(HASH_UNINITIALIZED);
squeakClass = original.squeakClass;
}
Expand Down Expand Up @@ -112,30 +111,30 @@ public final long getOrCreateSqueakHash(final InlinedBranchProfile needsHashProf
if (needsSqueakHash()) {
/** Lazily initialize squeakHash and derive value from hashCode. */
needsHashProfile.enter(node);
setSqueakHash(System.identityHashCode(this) & SQUEAK_HASH_MASK);
setSqueakHash(System.identityHashCode(this) & SqueakImageConstants.IDENTITY_HASH_HALF_WORD_MASK);
}
return getSqueakHash();
}

public long getSqueakHash() {
return squeahHashAndBits & SQUEAK_HASH_MASK;
return squeakHashAndBits & SqueakImageConstants.IDENTITY_HASH_HALF_WORD_MASK;
}

public final boolean needsSqueakHash() {
return getSqueakHash() == HASH_UNINITIALIZED;
}

public final void setSqueakHash(final int newHash) {
assert newHash <= SQUEAK_HASH_MASK;
squeahHashAndBits = (squeahHashAndBits & ~SQUEAK_HASH_MASK) + newHash;
assert newHash <= SqueakImageConstants.IDENTITY_HASH_HALF_WORD_MASK;
squeakHashAndBits = (squeakHashAndBits & ~SqueakImageConstants.IDENTITY_HASH_HALF_WORD_MASK) + newHash;
}

public final boolean getMarkingFlag() {
return (squeahHashAndBits & MARK_BIT) != 0;
return (squeakHashAndBits & MARK_BIT) != 0;
}

private void toggleMarkingFlag() {
squeahHashAndBits ^= MARK_BIT;
squeakHashAndBits ^= MARK_BIT;
}

public final boolean isMarked(final boolean currentMarkingFlag) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@
import de.hpi.swa.trufflesqueak.shared.SqueakLanguageConfig;
import de.hpi.swa.trufflesqueak.util.ArrayUtils;
import de.hpi.swa.trufflesqueak.util.FrameAccess;
import de.hpi.swa.trufflesqueak.util.MiscUtils;
import de.hpi.swa.trufflesqueak.util.ObjectGraphUtils.ObjectTracer;
import de.hpi.swa.trufflesqueak.util.UnsafeUtils;

Expand Down Expand Up @@ -681,28 +680,24 @@ public CompiledCodeObject getMethodUnsafe() {
* </pre>
*/
private static final class CompiledCodeHeaderDecoder {
private static final int NUM_LITERALS_SIZE = 1 << 15;
private static final int NUM_TEMPS_TEMPS_SIZE = 1 << 6;
private static final int NUM_ARGUMENTS_SIZE = 1 << 4;

private static int getNumLiterals(final long headerWord) {
return MiscUtils.bitSplit(headerWord, 0, NUM_LITERALS_SIZE);
private static int getNumLiterals(final long header) {
return (int) (header & 0x7FFF);
}

private static boolean getHasPrimitive(final long headerWord) {
return (headerWord & 1 << 16) != 0;
private static boolean getHasPrimitive(final long header) {
return (header & 0x10000) != 0;
}

private static boolean getNeedsLargeFrame(final long headerWord) {
return (headerWord & 1 << 17) != 0;
private static boolean getNeedsLargeFrame(final long header) {
return (header & 0x20000) != 0;
}

private static int getNumTemps(final long headerWord) {
return MiscUtils.bitSplit(headerWord, 18, NUM_TEMPS_TEMPS_SIZE);
private static int getNumTemps(final long header) {
return (int) (header >> 18) & 0x3F;
}

private static int getNumArguments(final long headerWord) {
return MiscUtils.bitSplit(headerWord, 24, NUM_ARGUMENTS_SIZE);
private static int getNumArguments(final long header) {
return (int) (header >> 24) & 0x0F;
}

private static boolean getSignFlag(final long headerWord) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -803,7 +803,7 @@ protected static final AbstractSqueakObject doCopy(final AbstractSqueakObjectWit
public static final class PrimMaxIdentityHashNode extends AbstractSingletonPrimitiveNode {
@Override
public Object execute() {
return (long) AbstractSqueakObjectWithClassAndHash.SQUEAK_HASH_MASK;
return (long) SqueakImageConstants.IDENTITY_HASH_HALF_WORD_MASK;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,6 @@ public final class MiscUtils {
private MiscUtils() {
}

public static int bitSplit(final long value, final int offset, final int size) {
return (int) (value >> offset & size - 1);
}

public static long clamp(final long value, final long min, final long max) {
return Math.max(min, Math.min(value, max));
}
Expand Down

1 comment on commit 0f52c02

@TruffleSqueak-Bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Performance Report (0f52c02)

Benchmarks ran on 22.0.2-graal.

Steady (after 100 iterations)

Benchmark Name Min Geomean Median Mean Max Total (ms) Total (min)
Bounce 517 524 519.63 518 519.62 103925 1.73
CD 488 504 491.59 489 491.58 98318 1.64
DeltaBlue 275 483 413.75 423 411.99 82750 1.38
Havlak 1111 1169 1144.28 1148 1144.2 228856 3.81
Json 367 378 372.29 371 372.27 74457 1.24
List 307 317 308.35 308 308.35 61670 1.03
Mandelbrot 127 142 127.76 127 127.74 25551 0.43
NBody 250 263 253.13 251 253.11 50626 0.84
Permute 157 184 166.59 163 166.51 33318 0.56
Queens 229 242 230.83 231 230.82 46166 0.77
Richards 1218 1231 1222.03 1223 1222.02 244405 4.07
Sieve 177 189 178.02 178 178.01 35603 0.59
Storage 140 150 141.64 140 141.62 28328 0.47
Towers 194 211 195.51 195 195.5 39101 0.65
5557 5987 5765.37 5765 5763.34 1153074 19.22

0f52c02-2-steady.svg

Warmup (first 100 iterations)

0f52c02-3-warmup.svg

Please sign in to comment.