Mercurial > hg > graal-compiler
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 |
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 | 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 } |