annotate graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/UncommonTrapStub.java @ 19462:33a783b15758

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