annotate graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/DeoptimizationStub.java @ 21708:6df25b1418be

moved com.oracle.asm.** to jvmci-util.jar (JBS:GRAAL-53)
author Doug Simon <doug.simon@oracle.com>
date Wed, 03 Jun 2015 18:06:44 +0200
parents 48c1ebd24120
children d915361cc3a1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
1 /*
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
2 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
4 *
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
7 * published by the Free Software Foundation.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
8 *
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
13 * accompanied this code).
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
14 *
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
18 *
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
21 * questions.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
22 */
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
23 package com.oracle.graal.hotspot.stubs;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
24
21708
6df25b1418be moved com.oracle.asm.** to jvmci-util.jar (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21556
diff changeset
25 import com.oracle.jvmci.asm.*;
21556
48c1ebd24120 renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21551
diff changeset
26 import com.oracle.jvmci.code.Register;
48c1ebd24120 renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21551
diff changeset
27 import com.oracle.jvmci.code.TargetDescription;
48c1ebd24120 renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21551
diff changeset
28 import com.oracle.jvmci.meta.ForeignCallDescriptor;
21708
6df25b1418be moved com.oracle.asm.** to jvmci-util.jar (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21556
diff changeset
29
15968
42eaa579e134 more improvements to runtime initialization:
Doug Simon <doug.simon@oracle.com>
parents: 15926
diff changeset
30 import static com.oracle.graal.hotspot.HotSpotBackend.*;
19462
33a783b15758 made use of Graal stubs instead of equivalent HotSpot stubs optional and off by default
Doug Simon <doug.simon@oracle.com>
parents: 18669
diff changeset
31 import static com.oracle.graal.hotspot.HotSpotBackend.Options.*;
15968
42eaa579e134 more improvements to runtime initialization:
Doug Simon <doug.simon@oracle.com>
parents: 15926
diff changeset
32 import static com.oracle.graal.hotspot.nodes.DeoptimizationFetchUnrollInfoCallNode.*;
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
33 import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*;
19462
33a783b15758 made use of Graal stubs instead of equivalent HotSpot stubs optional and off by default
Doug Simon <doug.simon@oracle.com>
parents: 18669
diff changeset
34 import static com.oracle.graal.hotspot.stubs.UncommonTrapStub.*;
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
35
18370
6713fef8c859 Make the @Fold annotation a top-level interface in the api project. It is not tied to the Snippet class where it was located before.
Christian Wimmer <christian.wimmer@oracle.com>
parents: 16441
diff changeset
36 import com.oracle.graal.api.replacements.*;
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
37 import com.oracle.graal.graph.Node.ConstantNodeParameter;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
38 import com.oracle.graal.graph.Node.NodeIntrinsic;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
39 import com.oracle.graal.hotspot.*;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
40 import com.oracle.graal.hotspot.meta.*;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
41 import com.oracle.graal.hotspot.nodes.*;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
42 import com.oracle.graal.replacements.*;
15926
af0e42dad358 reduced time to initialize ForeignCallProviders by avoiding triggering class initialization of Node subclasses as well as making annotation parsing lazy in SnippetInfo
Doug Simon <doug.simon@oracle.com>
parents: 15456
diff changeset
43 import com.oracle.graal.replacements.Snippet.ConstantParameter;
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
44 import com.oracle.graal.word.*;
21543
93c50cefb9e8 moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21526
diff changeset
45 import com.oracle.jvmci.common.*;
21551
5324104ac4f3 moved com.oracle.graal.hotspot.jvmci classes to com.oracle.jvmci.hotspot module (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21543
diff changeset
46 import com.oracle.jvmci.hotspot.*;
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
47
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
48 /**
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
49 * Deoptimization stub.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
50 *
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
51 * This is the entry point for code which is returning to a de-optimized frame.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
52 *
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
53 * The steps taken by this frame are as follows:
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
54 *
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
55 * <li>push a dummy "register_save" and save the return values (O0, O1, F0/F1, G1) and all
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
56 * potentially live registers (at a pollpoint many registers can be live).
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
57 *
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
58 * <li>call the C routine: Deoptimization::fetch_unroll_info (this function returns information
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
59 * about the number and size of interpreter frames which are equivalent to the frame which is being
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
60 * deoptimized)
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
61 *
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
62 * <li>deallocate the unpack frame, restoring only results values. Other volatile registers will now
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
63 * be captured in the vframeArray as needed.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
64 *
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
65 * <li>deallocate the deoptimization frame
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
66 *
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
67 * <li>in a loop using the information returned in the previous step push new interpreter frames
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
68 * (take care to propagate the return values through each new frame pushed)
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
69 *
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
70 * <li>create a dummy "unpack_frame" and save the return values (O0, O1, F0)
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
71 *
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
72 * <li>call the C routine: Deoptimization::unpack_frames (this function lays out values on the
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
73 * interpreter frame which was just created)
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
74 *
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
75 * <li>deallocate the dummy unpack_frame
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
76 *
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
77 * <li>ensure that all the return values are correctly set and then do a return to the interpreter
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
78 * entry point
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
79 *
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
80 * <p>
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
81 * <b>ATTENTION: We cannot do any complicated operations e.g. logging via printf in this snippet
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
82 * because we change the current stack layout and so the code is very sensitive to register
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
83 * allocation.</b>
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
84 */
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
85 public class DeoptimizationStub extends SnippetStub {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
86
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
87 private final TargetDescription target;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
88
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
89 public DeoptimizationStub(HotSpotProviders providers, TargetDescription target, HotSpotForeignCallLinkage linkage) {
19791
14e703edb2ab use GraphBuilderPlugins for method substitutions, intrinsics and snippets (GRAAL-982)
Doug Simon <doug.simon@oracle.com>
parents: 19507
diff changeset
90 super(DeoptimizationStub.class, "deoptimizationHandler", providers, linkage);
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
91 this.target = target;
19462
33a783b15758 made use of Graal stubs instead of equivalent HotSpot stubs optional and off by default
Doug Simon <doug.simon@oracle.com>
parents: 18669
diff changeset
92 assert PreferGraalStubs.getValue();
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
93 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
94
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
95 @Override
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
96 public boolean preservesRegisters() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
97 return false;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
98 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
99
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
100 @Override
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
101 protected Object getConstantParameterValue(int index, String name) {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
102 switch (index) {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
103 case 0:
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
104 return providers.getRegisters().getThreadRegister();
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
105 case 1:
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
106 return providers.getRegisters().getStackPointerRegister();
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
107 default:
21543
93c50cefb9e8 moved GraalInternalError to com.oracle.jvmci.common and renamed it to JVMCIError (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 21526
diff changeset
108 throw JVMCIError.shouldNotReachHere("unknown parameter " + name + " at index " + index);
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
109 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
110 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
111
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
112 /**
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
113 * Deoptimization handler for normal deoptimization
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
114 * {@link HotSpotVMConfig#deoptimizationUnpackDeopt}.
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
115 */
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
116 @Snippet
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
117 private static void deoptimizationHandler(@ConstantParameter Register threadRegister, @ConstantParameter Register stackPointerRegister) {
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
118 final Word thread = registerAsWord(threadRegister);
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
119 final long registerSaver = SaveAllRegistersNode.saveAllRegisters();
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
120
15968
42eaa579e134 more improvements to runtime initialization:
Doug Simon <doug.simon@oracle.com>
parents: 15926
diff changeset
121 final Word unrollBlock = fetchUnrollInfo(registerSaver);
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
122
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
123 // Pop all the frames we must move/replace.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
124 //
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
125 // Frame picture (youngest to oldest)
15345
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
126 // 1: self-frame
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
127 // 2: deoptimizing frame
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
128 // 3: caller of deoptimizing frame (could be compiled/interpreted).
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
129
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
130 // Pop self-frame.
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
131 LeaveCurrentStackFrameNode.leaveCurrentStackFrame(registerSaver);
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
132
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
133 // Load the initial info we should save (e.g. frame pointer).
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
134 final Word initialInfo = unrollBlock.readWord(deoptimizationUnrollBlockInitialInfoOffset());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
135
15345
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
136 // Pop deoptimized frame.
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
137 final int sizeOfDeoptimizedFrame = unrollBlock.readInt(deoptimizationUnrollBlockSizeOfDeoptimizedFrameOffset());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
138 LeaveDeoptimizedStackFrameNode.leaveDeoptimizedStackFrame(sizeOfDeoptimizedFrame, initialInfo);
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
139
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
140 /*
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
141 * Stack bang to make sure there's enough room for the interpreter frames. Bang stack for
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
142 * total size of the interpreter frames plus shadow page size. Bang one page at a time
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
143 * because large sizes can bang beyond yellow and red zones.
19507
1cde96b96673 Fixed code format issues.
Roland Schatz <roland.schatz@oracle.com>
parents: 19462
diff changeset
144 *
15345
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
145 * @deprecated This code should go away as soon as JDK-8032410 hits the Graal repository.
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
146 */
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
147 final int totalFrameSizes = unrollBlock.readInt(deoptimizationUnrollBlockTotalFrameSizesOffset());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
148 final int bangPages = NumUtil.roundUp(totalFrameSizes, pageSize()) / pageSize() + stackShadowPages();
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
149 Word stackPointer = readRegister(stackPointerRegister);
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
150
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
151 for (int i = 1; i < bangPages; i++) {
19462
33a783b15758 made use of Graal stubs instead of equivalent HotSpot stubs optional and off by default
Doug Simon <doug.simon@oracle.com>
parents: 18669
diff changeset
152 stackPointer.writeInt((-i * pageSize()) + stackBias(), 0, STACK_BANG_LOCATION);
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
153 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
154
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
155 // Load number of interpreter frames.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
156 final int numberOfFrames = unrollBlock.readInt(deoptimizationUnrollBlockNumberOfFramesOffset());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
157
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
158 // Load address of array of frame sizes.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
159 final Word frameSizes = unrollBlock.readWord(deoptimizationUnrollBlockFrameSizesOffset());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
160
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
161 // Load address of array of frame PCs.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
162 final Word framePcs = unrollBlock.readWord(deoptimizationUnrollBlockFramePcsOffset());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
163
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
164 /*
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
165 * Get the current stack pointer (sender's original SP) before adjustment so that we can
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
166 * save it in the skeletal interpreter frame.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
167 */
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
168 Word senderSp = readRegister(stackPointerRegister);
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
169
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
170 // Adjust old interpreter frame to make space for new frame's extra Java locals.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
171 final int callerAdjustment = unrollBlock.readInt(deoptimizationUnrollBlockCallerAdjustmentOffset());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
172 writeRegister(stackPointerRegister, readRegister(stackPointerRegister).subtract(callerAdjustment));
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
173
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
174 for (int i = 0; i < numberOfFrames; i++) {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
175 final Word frameSize = frameSizes.readWord(i * wordSize());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
176 final Word framePc = framePcs.readWord(i * wordSize());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
177
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
178 // Push an interpreter frame onto the stack.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
179 PushInterpreterFrameNode.pushInterpreterFrame(frameSize, framePc, senderSp, initialInfo);
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
180
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
181 // Get the current stack pointer (sender SP) and pass it to next frame.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
182 senderSp = readRegister(stackPointerRegister);
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
183 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
184
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
185 // Get final return address.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
186 final Word framePc = framePcs.readWord(numberOfFrames * wordSize());
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
187
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
188 /*
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
189 * Enter a frame to call out to unpack frames. Since we changed the stack pointer to an
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
190 * unknown alignment we need to align it here before calling C++ code.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
191 */
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
192 final Word senderFp = initialInfo;
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
193 EnterUnpackFramesStackFrameNode.enterUnpackFramesStackFrame(framePc, senderSp, senderFp, registerSaver);
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
194
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
195 // Pass unpack deopt mode to unpack frames.
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
196 final int mode = deoptimizationUnpackDeopt();
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
197 unpackFrames(UNPACK_FRAMES, thread, mode);
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
198
15456
bb97b75d1d65 AMD64: implemented DeoptimizationStub.deoptimizationHandler
twisti
parents: 15345
diff changeset
199 LeaveUnpackFramesStackFrameNode.leaveUnpackFramesStackFrame(registerSaver);
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
200 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
201
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
202 /**
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
203 * Reads the value of the passed register as a Word.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
204 */
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
205 private static Word readRegister(Register register) {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
206 return registerAsWord(register, false, false);
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
207 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
208
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
209 /**
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
210 * Writes the value of the passed register.
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
211 *
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
212 * @param value value the register should be set to
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
213 */
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
214 private static void writeRegister(Register register, Word value) {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
215 writeRegisterAsWord(register, value);
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
216 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
217
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
218 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
219 private static int stackShadowPages() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
220 return config().useStackBanging ? config().stackShadowPages : 0;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
221 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
222
15345
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
223 /**
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
224 * Returns the stack bias for the host architecture.
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
225 *
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
226 * @deprecated This method should go away as soon as JDK-8032410 hits the Graal repository.
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
227 *
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
228 * @return stack bias
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
229 */
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
230 @Deprecated
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
231 @Fold
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
232 private static int stackBias() {
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
233 return config().stackBias;
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
234 }
109d6c7c40b5 implement SPARC uncommon trap stub
twisti
parents: 15193
diff changeset
235
15104
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
236 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
237 private static int deoptimizationUnrollBlockSizeOfDeoptimizedFrameOffset() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
238 return config().deoptimizationUnrollBlockSizeOfDeoptimizedFrameOffset;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
239 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
240
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
241 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
242 private static int deoptimizationUnrollBlockCallerAdjustmentOffset() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
243 return config().deoptimizationUnrollBlockCallerAdjustmentOffset;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
244 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
245
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
246 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
247 private static int deoptimizationUnrollBlockNumberOfFramesOffset() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
248 return config().deoptimizationUnrollBlockNumberOfFramesOffset;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
249 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
250
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
251 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
252 private static int deoptimizationUnrollBlockTotalFrameSizesOffset() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
253 return config().deoptimizationUnrollBlockTotalFrameSizesOffset;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
254 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
255
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
256 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
257 private static int deoptimizationUnrollBlockFrameSizesOffset() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
258 return config().deoptimizationUnrollBlockFrameSizesOffset;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
259 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
260
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
261 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
262 private static int deoptimizationUnrollBlockFramePcsOffset() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
263 return config().deoptimizationUnrollBlockFramePcsOffset;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
264 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
265
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
266 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
267 private static int deoptimizationUnrollBlockInitialInfoOffset() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
268 return config().deoptimizationUnrollBlockInitialInfoOffset;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
269 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
270
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
271 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
272 private static int deoptimizationUnpackDeopt() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
273 return config().deoptimizationUnpackDeopt;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
274 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
275
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
276 @Fold
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
277 private static int deoptimizationUnpackUncommonTrap() {
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
278 return config().deoptimizationUnpackUncommonTrap;
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
279 }
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
280
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
281 @NodeIntrinsic(value = StubForeignCallNode.class, setStampFromReturnType = true)
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
282 public static native int unpackFrames(@ConstantNodeParameter ForeignCallDescriptor unpackFrames, Word thread, int mode);
ed29f7ff71eb add DeoptimizationStub
twisti
parents:
diff changeset
283 }