36 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.getAndClearObjectResult;
37 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeTlab;
38 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.isInstanceKlassFullyInitialized;
39 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readLayoutHelper;
40 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.log2WordSize;
41 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.prototypeMarkWordOffset;
42 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabEnd;
43 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabStart;
44 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabTop;
45 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord;
46 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadAllocatedBytesOffset;
47 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadTlabSizeOffset;
48 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabAlignmentReserveInHeapWords;
49 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabFastRefillWasteOffset;
50 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabIntArrayMarkWord;
51 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabNumberOfRefillsOffset;
52 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabRefillWasteIncrement;
53 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabRefillWasteLimitOffset;
54 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabSlowAllocationsOffset;
55 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabStats;
56 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useG1GC;
57 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useTLAB;
58 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.wordSize;
59 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.writeTlabTop;
60 import static org.graalvm.compiler.hotspot.stubs.StubUtil.handlePendingException;
61 import static org.graalvm.compiler.hotspot.stubs.StubUtil.newDescriptor;
62 import static org.graalvm.compiler.hotspot.stubs.StubUtil.printf;
63 import static org.graalvm.compiler.hotspot.stubs.StubUtil.verifyObject;
64 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.FAST_PATH_PROBABILITY;
65 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.probability;
66
67 import org.graalvm.compiler.api.replacements.Fold;
68 import org.graalvm.compiler.api.replacements.Snippet;
69 import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
70 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
71 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
72 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
73 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
74 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
75 import org.graalvm.compiler.hotspot.nodes.GraalHotSpotVMConfigNode;
130 @Fold
131 static boolean logging(OptionValues options) {
132 return StubOptions.TraceNewInstanceStub.getValue(options);
133 }
134
135 /**
136 * Re-attempts allocation after an initial TLAB allocation failed or was skipped (e.g., due to
137 * -XX:-UseTLAB).
138 *
139 * @param hub the hub of the object to be allocated
140 * @param intArrayHub the hub for {@code int[].class}
141 */
142 @Snippet
143 private static Object newInstance(KlassPointer hub, @ConstantParameter KlassPointer intArrayHub, @ConstantParameter Register threadRegister, @ConstantParameter OptionValues options) {
144 /*
145 * The type is known to be an instance so Klass::_layout_helper is the instance size as a
146 * raw number
147 */
148 Word thread = registerAsWord(threadRegister);
149 boolean inlineContiguousAllocationSupported = GraalHotSpotVMConfigNode.inlineContiguousAllocationSupported();
150 if (!forceSlowPath(options) && inlineContiguousAllocationSupported) {
151 if (isInstanceKlassFullyInitialized(hub)) {
152 int sizeInBytes = readLayoutHelper(hub);
153 Word memory = refillAllocate(thread, intArrayHub, sizeInBytes, logging(options));
154 if (memory.notEqual(0)) {
155 Word prototypeMarkWord = hub.readWord(prototypeMarkWordOffset(INJECTED_VMCONFIG), PROTOTYPE_MARK_WORD_LOCATION);
156 NewObjectSnippets.formatObjectForStub(hub, sizeInBytes, memory, prototypeMarkWord);
157 return verifyObject(memory.toObject());
158 }
159 }
160 }
161
162 if (logging(options)) {
163 printf("newInstance: calling new_instance_c\n");
164 }
165
166 newInstanceC(NEW_INSTANCE_C, thread, hub);
167 handlePendingException(thread, true);
168 return verifyObject(getAndClearObjectResult(thread));
169 }
170
|
36 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.getAndClearObjectResult;
37 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.initializeTlab;
38 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.isInstanceKlassFullyInitialized;
39 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readLayoutHelper;
40 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.log2WordSize;
41 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.prototypeMarkWordOffset;
42 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabEnd;
43 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabStart;
44 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.readTlabTop;
45 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.registerAsWord;
46 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadAllocatedBytesOffset;
47 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.threadTlabSizeOffset;
48 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabAlignmentReserveInHeapWords;
49 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabFastRefillWasteOffset;
50 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabIntArrayMarkWord;
51 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabNumberOfRefillsOffset;
52 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabRefillWasteIncrement;
53 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabRefillWasteLimitOffset;
54 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabSlowAllocationsOffset;
55 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.tlabStats;
56 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useCMSIncrementalMode;
57 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useG1GC;
58 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.useTLAB;
59 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.wordSize;
60 import static org.graalvm.compiler.hotspot.replacements.HotSpotReplacementsUtil.writeTlabTop;
61 import static org.graalvm.compiler.hotspot.stubs.StubUtil.handlePendingException;
62 import static org.graalvm.compiler.hotspot.stubs.StubUtil.newDescriptor;
63 import static org.graalvm.compiler.hotspot.stubs.StubUtil.printf;
64 import static org.graalvm.compiler.hotspot.stubs.StubUtil.verifyObject;
65 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.FAST_PATH_PROBABILITY;
66 import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.probability;
67
68 import org.graalvm.compiler.api.replacements.Fold;
69 import org.graalvm.compiler.api.replacements.Snippet;
70 import org.graalvm.compiler.api.replacements.Snippet.ConstantParameter;
71 import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
72 import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
73 import org.graalvm.compiler.graph.Node.NodeIntrinsic;
74 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
75 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
76 import org.graalvm.compiler.hotspot.nodes.GraalHotSpotVMConfigNode;
131 @Fold
132 static boolean logging(OptionValues options) {
133 return StubOptions.TraceNewInstanceStub.getValue(options);
134 }
135
136 /**
137 * Re-attempts allocation after an initial TLAB allocation failed or was skipped (e.g., due to
138 * -XX:-UseTLAB).
139 *
140 * @param hub the hub of the object to be allocated
141 * @param intArrayHub the hub for {@code int[].class}
142 */
143 @Snippet
144 private static Object newInstance(KlassPointer hub, @ConstantParameter KlassPointer intArrayHub, @ConstantParameter Register threadRegister, @ConstantParameter OptionValues options) {
145 /*
146 * The type is known to be an instance so Klass::_layout_helper is the instance size as a
147 * raw number
148 */
149 Word thread = registerAsWord(threadRegister);
150 boolean inlineContiguousAllocationSupported = GraalHotSpotVMConfigNode.inlineContiguousAllocationSupported();
151 if (!forceSlowPath(options) && inlineContiguousAllocationSupported && !useCMSIncrementalMode(INJECTED_VMCONFIG)) {
152 if (isInstanceKlassFullyInitialized(hub)) {
153 int sizeInBytes = readLayoutHelper(hub);
154 Word memory = refillAllocate(thread, intArrayHub, sizeInBytes, logging(options));
155 if (memory.notEqual(0)) {
156 Word prototypeMarkWord = hub.readWord(prototypeMarkWordOffset(INJECTED_VMCONFIG), PROTOTYPE_MARK_WORD_LOCATION);
157 NewObjectSnippets.formatObjectForStub(hub, sizeInBytes, memory, prototypeMarkWord);
158 return verifyObject(memory.toObject());
159 }
160 }
161 }
162
163 if (logging(options)) {
164 printf("newInstance: calling new_instance_c\n");
165 }
166
167 newInstanceC(NEW_INSTANCE_C, thread, hub);
168 handlePendingException(thread, true);
169 return verifyObject(getAndClearObjectResult(thread));
170 }
171
|