@Override
protected ValueNode createReadHub(StructuredGraph graph, ValueNode object, LoweringTool tool) {
if (tool.getLoweringStage() != LoweringTool.StandardLoweringStage.LOW_TIER) {
return graph.unique(new LoadHubNode(tool.getStampProvider(), object));
}
assert !object.isConstant() || object.asJavaConstant().isNull();
Stamp headerBitsStamp = StampFactory.forUnsignedInteger(8 * getObjectLayout().getReferenceSize());
ConstantNode headerOffset = ConstantNode.forIntegerKind(target.wordJavaKind, getObjectLayout().getHubOffset(), graph);
AddressNode headerAddress = graph.unique(new OffsetAddressNode(object, headerOffset));
ValueNode headerBits = graph.unique(new FloatingReadNode(headerAddress, NamedLocationIdentity.FINAL_LOCATION, null, headerBitsStamp, null, BarrierType.NONE));
ValueNode hubBits;
int encodingShift = ReferenceAccess.singleton().getCompressEncoding().getShift();
if (encodingShift != 0) {
assert (Long.MAX_VALUE << encodingShift) == ObjectHeader.BITS_CLEAR.rawValue() : "Compression shift must mask object header bits";
hubBits = graph.unique(new UnsignedRightShiftNode(headerBits, ConstantNode.forInt(encodingShift, graph)));
} else {
hubBits = graph.unique(new AndNode(headerBits, ConstantNode.forIntegerStamp(headerBitsStamp, ObjectHeader.BITS_CLEAR.rawValue(), graph)));
}
FloatingWordCastNode hubRef = graph.unique(new FloatingWordCastNode(hubStamp, hubBits));
return maybeUncompress(hubRef);
}