annotate graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParseHelper.java @ 14900:be4c28683c08

Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
author Josef Eisl <josef.eisl@jku.at>
date Mon, 31 Mar 2014 14:28:12 +0200
parents e2a5528599e0
children b4d069921b5f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14854
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1 /*
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
2 * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
4 *
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
7 * published by the Free Software Foundation.
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
8 *
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
13 * accompanied this code).
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
14 *
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
15 * You should have received a copy of the GNU General Public License version
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
18 *
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
21 * questions.
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
22 */
64e6a5484cac Fix style issues.
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
23
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
24 package com.oracle.graal.java;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
25
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
26 import static com.oracle.graal.api.code.TypeCheckHints.*;
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
27 import static com.oracle.graal.bytecode.Bytecodes.*;
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
28 import static java.lang.reflect.Modifier.*;
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
29
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
30 import java.util.*;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
31
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
32 import com.oracle.graal.api.code.*;
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
33 import com.oracle.graal.api.meta.*;
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
34 import com.oracle.graal.api.meta.ProfilingInfo.TriState;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
35 import com.oracle.graal.api.meta.ResolvedJavaType.Representation;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
36 import com.oracle.graal.bytecode.*;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
37 import com.oracle.graal.debug.*;
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
38 import com.oracle.graal.graph.*;
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
39 import com.oracle.graal.java.BciBlockMapping.BciBlock;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
40 import com.oracle.graal.nodes.*;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
41 import com.oracle.graal.nodes.calc.*;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
42 import com.oracle.graal.nodes.calc.FloatConvertNode.FloatConvert;
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
43 import com.oracle.graal.phases.*;
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
44
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
45 public abstract class BytecodeParseHelper<T extends KindInterface, F extends AbstractFrameStateBuilder<T>> {
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
46
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
47 protected F frameState;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
48 protected BytecodeStream stream; // the bytecode stream
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
49 private GraphBuilderConfiguration graphBuilderConfig;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
50 protected ResolvedJavaMethod method;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
51 protected BciBlock currentBlock;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
52 protected ProfilingInfo profilingInfo;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
53 protected OptimisticOptimizations optimisticOpts;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
54 protected ConstantPool constantPool;
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
55 private final MetaAccessProvider metaAccess;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
56 protected int entryBCI;
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
57
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
58 public BytecodeParseHelper(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, F frameState,
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
59 BytecodeStream stream, ProfilingInfo profilingInfo, ConstantPool constantPool, int entryBCI) {
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
60 this.frameState = frameState;
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
61 this.graphBuilderConfig = graphBuilderConfig;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
62 this.optimisticOpts = optimisticOpts;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
63 this.metaAccess = metaAccess;
14896
89be1673acd8 BytecodeParseHelper initialize members.
Josef Eisl <josef.eisl@jku.at>
parents: 14895
diff changeset
64 this.stream = stream;
89be1673acd8 BytecodeParseHelper initialize members.
Josef Eisl <josef.eisl@jku.at>
parents: 14895
diff changeset
65 this.profilingInfo = profilingInfo;
89be1673acd8 BytecodeParseHelper initialize members.
Josef Eisl <josef.eisl@jku.at>
parents: 14895
diff changeset
66 this.constantPool = constantPool;
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
67 this.entryBCI = entryBCI;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
68 this.method = method;
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
69 assert metaAccess != null;
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
70 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
71
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
72 /**
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
73 * Start the bytecode parser.
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
74 */
14899
e2a5528599e0 Merge (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14854 14896
diff changeset
75 protected abstract void build();
e2a5528599e0 Merge (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14854 14896
diff changeset
76
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
77 public void setCurrentFrameState(F frameState) {
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
78 this.frameState = frameState;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
79 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
80
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
81 public final void setStream(BytecodeStream stream) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
82 this.stream = stream;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
83 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
84
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
85 protected final BytecodeStream getStream() {
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
86 return stream;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
87 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
88
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
89 protected int bci() {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
90 return stream.currentBCI();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
91 }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
92
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
93 public void loadLocal(int index, Kind kind) {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
94 frameState.push(kind, frameState.loadLocal(index));
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
95 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
96
14895
d76fce67b49d Created BaselineCompiler BytecodeParser inner class.
Josef Eisl <josef.eisl@jku.at>
parents: 14894
diff changeset
97 public void storeLocal(Kind kind, int index) {
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
98 T value;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
99 if (kind == Kind.Object) {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
100 value = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
101 // astore and astore_<n> may be used to store a returnAddress (jsr)
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
102 assert value.getKind() == Kind.Object || value.getKind() == Kind.Int;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
103 } else {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
104 value = frameState.pop(kind);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
105 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
106 frameState.storeLocal(index, value);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
107 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
108
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
109 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
110 * @param type the unresolved type of the constant
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
111 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
112 protected abstract void handleUnresolvedLoadConstant(JavaType type);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
113
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
114 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
115 * @param type the unresolved type of the type check
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
116 * @param object the object value whose type is being checked against {@code type}
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
117 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
118 protected abstract void handleUnresolvedCheckCast(JavaType type, T object);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
119
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
120 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
121 * @param type the unresolved type of the type check
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
122 * @param object the object value whose type is being checked against {@code type}
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
123 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
124 protected abstract void handleUnresolvedInstanceOf(JavaType type, T object);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
125
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
126 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
127 * @param type the type being instantiated
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
128 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
129 protected abstract void handleUnresolvedNewInstance(JavaType type);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
130
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
131 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
132 * @param type the type of the array being instantiated
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
133 * @param length the length of the array
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
134 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
135 protected abstract void handleUnresolvedNewObjectArray(JavaType type, T length);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
136
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
137 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
138 * @param type the type being instantiated
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
139 * @param dims the dimensions for the multi-array
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
140 */
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
141 protected abstract void handleUnresolvedNewMultiArray(JavaType type, List<T> dims);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
142
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
143 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
144 * @param field the unresolved field
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
145 * @param receiver the object containing the field or {@code null} if {@code field} is static
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
146 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
147 protected abstract void handleUnresolvedLoadField(JavaField field, T receiver);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
148
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
149 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
150 * @param field the unresolved field
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
151 * @param value the value being stored to the field
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
152 * @param receiver the object containing the field or {@code null} if {@code field} is static
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
153 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
154 protected abstract void handleUnresolvedStoreField(JavaField field, T value, T receiver);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
155
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
156 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
157 * @param representation
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
158 * @param type
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
159 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
160 protected abstract void handleUnresolvedExceptionType(Representation representation, JavaType type);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
161
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
162 // protected abstract void handleUnresolvedInvoke(JavaMethod javaMethod, InvokeKind invokeKind);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
163
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
164 // protected abstract DispatchBeginNode handleException(T exceptionObject, int bci);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
165
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
166 private void genLoadConstant(int cpi, int opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
167 Object con = lookupConstant(cpi, opcode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
168
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
169 if (con instanceof JavaType) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
170 // this is a load of class constant which might be unresolved
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
171 JavaType type = (JavaType) con;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
172 if (type instanceof ResolvedJavaType) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
173 frameState.push(Kind.Object, appendConstant(((ResolvedJavaType) type).getEncoding(Representation.JavaClass)));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
174 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
175 handleUnresolvedLoadConstant(type);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
176 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
177 } else if (con instanceof Constant) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
178 Constant constant = (Constant) con;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
179 frameState.push(constant.getKind().getStackKind(), appendConstant(constant));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
180 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
181 throw new Error("lookupConstant returned an object of incorrect type");
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
182 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
183 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
184
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
185 protected abstract T genLoadIndexed(T index, T array, Kind kind);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
186
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
187 private void genLoadIndexed(Kind kind) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
188 emitExplicitExceptions(frameState.peek(1), frameState.peek(0));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
189
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
190 T index = frameState.ipop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
191 T array = frameState.apop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
192 frameState.push(kind.getStackKind(), append(genLoadIndexed(array, index, kind)));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
193 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
194
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
195 protected abstract T genStoreIndexed(T array, T index, Kind kind, T value);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
196
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
197 private void genStoreIndexed(Kind kind) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
198 emitExplicitExceptions(frameState.peek(2), frameState.peek(1));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
199
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
200 T value = frameState.pop(kind.getStackKind());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
201 T index = frameState.ipop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
202 T array = frameState.apop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
203 append(genStoreIndexed(array, index, kind, value));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
204 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
205
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
206 private void stackOp(int opcode) {
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
207 switch (opcode) {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
208 case POP: {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
209 frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
210 break;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
211 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
212 case POP2: {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
213 frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
214 frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
215 break;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
216 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
217 case DUP: {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
218 T w = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
219 frameState.xpush(w);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
220 frameState.xpush(w);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
221 break;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
222 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
223 case DUP_X1: {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
224 T w1 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
225 T w2 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
226 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
227 frameState.xpush(w2);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
228 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
229 break;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
230 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
231 case DUP_X2: {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
232 T w1 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
233 T w2 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
234 T w3 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
235 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
236 frameState.xpush(w3);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
237 frameState.xpush(w2);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
238 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
239 break;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
240 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
241 case DUP2: {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
242 T w1 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
243 T w2 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
244 frameState.xpush(w2);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
245 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
246 frameState.xpush(w2);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
247 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
248 break;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
249 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
250 case DUP2_X1: {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
251 T w1 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
252 T w2 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
253 T w3 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
254 frameState.xpush(w2);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
255 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
256 frameState.xpush(w3);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
257 frameState.xpush(w2);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
258 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
259 break;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
260 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
261 case DUP2_X2: {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
262 T w1 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
263 T w2 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
264 T w3 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
265 T w4 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
266 frameState.xpush(w2);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
267 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
268 frameState.xpush(w4);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
269 frameState.xpush(w3);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
270 frameState.xpush(w2);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
271 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
272 break;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
273 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
274 case SWAP: {
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
275 T w1 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
276 T w2 = frameState.xpop();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
277 frameState.xpush(w1);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
278 frameState.xpush(w2);
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
279 break;
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
280 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
281 default:
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
282 throw GraalInternalError.shouldNotReachHere();
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
283 }
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
284 }
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
285
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
286 protected abstract T genIntegerAdd(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
287
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
288 protected abstract T genIntegerSub(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
289
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
290 protected abstract T genIntegerMul(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
291
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
292 protected abstract T genFloatAdd(Kind kind, T x, T y, boolean isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
293
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
294 protected abstract T genFloatSub(Kind kind, T x, T y, boolean isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
295
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
296 protected abstract T genFloatMul(Kind kind, T x, T y, boolean isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
297
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
298 protected abstract T genFloatDiv(Kind kind, T x, T y, boolean isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
299
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
300 protected abstract T genFloatRem(Kind kind, T x, T y, boolean isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
301
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
302 private void genArithmeticOp(Kind result, int opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
303 T y = frameState.pop(result);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
304 T x = frameState.pop(result);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
305 boolean isStrictFP = isStrict(method.getModifiers());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
306 T v;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
307 switch (opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
308 case IADD:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
309 case LADD:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
310 v = genIntegerAdd(result, x, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
311 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
312 case FADD:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
313 case DADD:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
314 v = genFloatAdd(result, x, y, isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
315 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
316 case ISUB:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
317 case LSUB:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
318 v = genIntegerSub(result, x, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
319 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
320 case FSUB:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
321 case DSUB:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
322 v = genFloatSub(result, x, y, isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
323 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
324 case IMUL:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
325 case LMUL:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
326 v = genIntegerMul(result, x, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
327 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
328 case FMUL:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
329 case DMUL:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
330 v = genFloatMul(result, x, y, isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
331 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
332 case FDIV:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
333 case DDIV:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
334 v = genFloatDiv(result, x, y, isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
335 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
336 case FREM:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
337 case DREM:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
338 v = genFloatRem(result, x, y, isStrictFP);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
339 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
340 default:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
341 throw new GraalInternalError("should not reach");
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
342 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
343 frameState.push(result, append(v));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
344 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
345
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
346 protected abstract T genIntegerDiv(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
347
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
348 protected abstract T genIntegerRem(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
349
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
350 private void genIntegerDivOp(Kind result, int opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
351 T y = frameState.pop(result);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
352 T x = frameState.pop(result);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
353 T v;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
354 switch (opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
355 case IDIV:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
356 case LDIV:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
357 v = genIntegerDiv(result, x, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
358 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
359 case IREM:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
360 case LREM:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
361 v = genIntegerRem(result, x, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
362 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
363 default:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
364 throw new GraalInternalError("should not reach");
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
365 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
366 frameState.push(result, append(v));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
367 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
368
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
369 protected abstract T genNegateOp(T x);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
370
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
371 private void genNegateOp(Kind kind) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
372 frameState.push(kind, append(genNegateOp(frameState.pop(kind))));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
373 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
374
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
375 protected abstract T genLeftShift(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
376
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
377 protected abstract T genRightShift(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
378
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
379 protected abstract T genUnsignedRightShift(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
380
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
381 private void genShiftOp(Kind kind, int opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
382 T s = frameState.ipop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
383 T x = frameState.pop(kind);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
384 T v;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
385 switch (opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
386 case ISHL:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
387 case LSHL:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
388 v = genLeftShift(kind, x, s);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
389 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
390 case ISHR:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
391 case LSHR:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
392 v = genRightShift(kind, x, s);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
393 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
394 case IUSHR:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
395 case LUSHR:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
396 v = genUnsignedRightShift(kind, x, s);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
397 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
398 default:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
399 throw new GraalInternalError("should not reach");
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
400 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
401 frameState.push(kind, append(v));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
402 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
403
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
404 protected abstract T genAnd(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
405
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
406 protected abstract T genOr(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
407
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
408 protected abstract T genXor(Kind kind, T x, T y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
409
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
410 private void genLogicOp(Kind kind, int opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
411 T y = frameState.pop(kind);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
412 T x = frameState.pop(kind);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
413 T v;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
414 switch (opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
415 case IAND:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
416 case LAND:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
417 v = genAnd(kind, x, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
418 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
419 case IOR:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
420 case LOR:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
421 v = genOr(kind, x, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
422 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
423 case IXOR:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
424 case LXOR:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
425 v = genXor(kind, x, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
426 break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
427 default:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
428 throw new GraalInternalError("should not reach");
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
429 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
430 frameState.push(kind, append(v));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
431 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
432
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
433 protected abstract T genNormalizeCompare(T x, T y, boolean isUnorderedLess);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
434
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
435 private void genCompareOp(Kind kind, boolean isUnorderedLess) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
436 T y = frameState.pop(kind);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
437 T x = frameState.pop(kind);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
438 frameState.ipush(append(genNormalizeCompare(x, y, isUnorderedLess)));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
439 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
440
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
441 protected abstract T genFloatConvert(FloatConvert op, T input);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
442
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
443 private void genFloatConvert(FloatConvert op, Kind from, Kind to) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
444 T input = frameState.pop(from.getStackKind());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
445 frameState.push(to.getStackKind(), append(genFloatConvert(op, input)));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
446 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
447
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
448 protected abstract T genNarrow(T input, int bitCount);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
449
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
450 protected abstract T genSignExtend(T input, int bitCount);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
451
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
452 protected abstract T genZeroExtend(T input, int bitCount);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
453
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
454 private void genSignExtend(Kind from, Kind to) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
455 T input = frameState.pop(from.getStackKind());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
456 if (from != from.getStackKind()) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
457 input = append(genNarrow(input, from.getBitCount()));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
458 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
459 frameState.push(to.getStackKind(), append(genSignExtend(input, to.getBitCount())));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
460 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
461
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
462 private void genZeroExtend(Kind from, Kind to) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
463 T input = frameState.pop(from.getStackKind());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
464 if (from != from.getStackKind()) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
465 input = append(genNarrow(input, from.getBitCount()));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
466 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
467 frameState.push(to.getStackKind(), append(genZeroExtend(input, to.getBitCount())));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
468 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
469
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
470 private void genNarrow(Kind from, Kind to) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
471 T input = frameState.pop(from.getStackKind());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
472 frameState.push(to.getStackKind(), append(genNarrow(input, to.getBitCount())));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
473 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
474
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
475 private void genIncrement() {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
476 int index = getStream().readLocalIndex();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
477 int delta = getStream().readIncrement();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
478 T x = frameState.loadLocal(index);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
479 T y = appendConstant(Constant.forInt(delta));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
480 frameState.storeLocal(index, append(genIntegerAdd(Kind.Int, x, y)));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
481 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
482
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
483 private void genGoto() {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
484 appendGoto(createTarget(currentBlock.getSuccessors().get(0), frameState));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
485 // assert currentBlock.numNormalSuccessors() == 1;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
486 assert currentBlock.getSuccessors().size() == 1;
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
487 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
488
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
489 protected abstract T genObjectEquals(T x, T y);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
490
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
491 protected abstract T genIntegerEquals(T x, T y);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
492
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
493 protected abstract T genIntegerLessThan(T x, T y);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
494
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
495 protected abstract T genUnique(T x);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
496
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
497 protected abstract T genIf(T condition, T falseSuccessor, T trueSuccessor, double d);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
498
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
499 private void ifNode(T x, Condition cond, T y) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
500 // assert !x.isDeleted() && !y.isDeleted();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
501 // assert currentBlock.numNormalSuccessors() == 2;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
502 assert currentBlock.getSuccessors().size() == 2;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
503 BciBlock trueBlock = currentBlock.getSuccessors().get(0);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
504 BciBlock falseBlock = currentBlock.getSuccessors().get(1);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
505 if (trueBlock == falseBlock) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
506 appendGoto(createTarget(trueBlock, frameState));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
507 return;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
508 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
509
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
510 double probability = profilingInfo.getBranchTakenProbability(bci());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
511 if (probability < 0) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
512 assert probability == -1 : "invalid probability";
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
513 Debug.log("missing probability in %s at bci %d", method, bci());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
514 probability = 0.5;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
515 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
516
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
517 if (!optimisticOpts.removeNeverExecutedCode()) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
518 if (probability == 0) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
519 probability = 0.0000001;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
520 } else if (probability == 1) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
521 probability = 0.999999;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
522 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
523 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
524
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
525 // the mirroring and negation operations get the condition into canonical form
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
526 boolean mirror = cond.canonicalMirror();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
527 boolean negate = cond.canonicalNegate();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
528
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
529 T a = mirror ? y : x;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
530 T b = mirror ? x : y;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
531
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
532 T condition;
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
533 assert !a.getKind().isNumericFloat();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
534 if (cond == Condition.EQ || cond == Condition.NE) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
535 if (a.getKind() == Kind.Object) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
536 condition = genObjectEquals(a, b);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
537 } else {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
538 condition = genIntegerEquals(a, b);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
539 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
540 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
541 assert a.getKind() != Kind.Object && !cond.isUnsigned();
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
542 condition = genIntegerLessThan(a, b);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
543 }
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
544 condition = genUnique(condition);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
545
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
546 T trueSuccessor = createBlockTarget(probability, trueBlock, frameState);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
547 T falseSuccessor = createBlockTarget(1 - probability, falseBlock, frameState);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
548
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
549 T ifNode = negate ? genIf(condition, falseSuccessor, trueSuccessor, 1 - probability) : genIf(condition, trueSuccessor, falseSuccessor, probability);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
550 append(ifNode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
551 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
552
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
553 private void genIfZero(Condition cond) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
554 T y = appendConstant(Constant.INT_0);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
555 T x = frameState.ipop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
556 ifNode(x, cond, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
557 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
558
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
559 private void genIfNull(Condition cond) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
560 T y = appendConstant(Constant.NULL_OBJECT);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
561 T x = frameState.apop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
562 ifNode(x, cond, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
563 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
564
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
565 private void genIfSame(Kind kind, Condition cond) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
566 T y = frameState.pop(kind);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
567 T x = frameState.pop(kind);
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
568 // assert !x.isDeleted() && !y.isDeleted();
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
569 ifNode(x, cond, y);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
570 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
571
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
572 protected abstract void genThrow();
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
573
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
574 protected JavaType lookupType(int cpi, int bytecode) {
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
575 eagerResolvingForSnippets(cpi, bytecode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
576 JavaType result = constantPool.lookupType(cpi, bytecode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
577 assert !graphBuilderConfig.unresolvedIsError() || result instanceof ResolvedJavaType;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
578 return result;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
579 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
580
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
581 private JavaMethod lookupMethod(int cpi, int opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
582 eagerResolvingForSnippets(cpi, opcode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
583 JavaMethod result = constantPool.lookupMethod(cpi, opcode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
584 /*
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
585 * In general, one cannot assume that the declaring class being initialized is useful, since
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
586 * the actual concrete receiver may be a different class (except for static calls). Also,
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
587 * interfaces are initialized only under special circumstances, so that this assertion would
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
588 * often fail for interface calls.
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
589 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
590 assert !graphBuilderConfig.unresolvedIsError() || (result instanceof ResolvedJavaMethod && (opcode != INVOKESTATIC || ((ResolvedJavaMethod) result).getDeclaringClass().isInitialized())) : result;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
591 return result;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
592 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
593
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
594 private JavaField lookupField(int cpi, int opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
595 eagerResolvingForSnippets(cpi, opcode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
596 JavaField result = constantPool.lookupField(cpi, opcode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
597 assert !graphBuilderConfig.unresolvedIsError() || (result instanceof ResolvedJavaField && ((ResolvedJavaField) result).getDeclaringClass().isInitialized()) : result;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
598 return result;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
599 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
600
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
601 private Object lookupConstant(int cpi, int opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
602 eagerResolvingForSnippets(cpi, opcode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
603 Object result = constantPool.lookupConstant(cpi);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
604 assert !graphBuilderConfig.eagerResolving() || !(result instanceof JavaType) || (result instanceof ResolvedJavaType) : result;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
605 return result;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
606 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
607
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
608 private void eagerResolvingForSnippets(int cpi, int bytecode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
609 if (graphBuilderConfig.eagerResolving()) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
610 constantPool.loadReferencedType(cpi, bytecode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
611 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
612 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
613
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
614 private JavaTypeProfile getProfileForTypeCheck(ResolvedJavaType type) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
615 if (!optimisticOpts.useTypeCheckHints() || !canHaveSubtype(type)) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
616 return null;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
617 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
618 return profilingInfo.getTypeProfile(bci());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
619 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
620 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
621
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
622 protected abstract T genCheckCast(ResolvedJavaType type, T object, JavaTypeProfile profileForTypeCheck, boolean b);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
623
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
624 private void genCheckCast() {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
625 int cpi = getStream().readCPI();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
626 JavaType type = lookupType(cpi, CHECKCAST);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
627 T object = frameState.apop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
628 if (type instanceof ResolvedJavaType) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
629 JavaTypeProfile profileForTypeCheck = getProfileForTypeCheck((ResolvedJavaType) type);
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
630 T checkCastNode = append(genCheckCast((ResolvedJavaType) type, object, profileForTypeCheck, false));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
631 frameState.apush(checkCastNode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
632 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
633 handleUnresolvedCheckCast(type, object);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
634 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
635 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
636
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
637 protected abstract T genInstanceOf(ResolvedJavaType type, T object, JavaTypeProfile profileForTypeCheck);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
638
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
639 protected abstract T genConditional(T x);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
640
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
641 private void genInstanceOf() {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
642 int cpi = getStream().readCPI();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
643 JavaType type = lookupType(cpi, INSTANCEOF);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
644 T object = frameState.apop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
645 if (type instanceof ResolvedJavaType) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
646 ResolvedJavaType resolvedType = (ResolvedJavaType) type;
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
647 T instanceOfNode = genInstanceOf((ResolvedJavaType) type, object, getProfileForTypeCheck(resolvedType));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
648 frameState.ipush(append(genConditional(genUnique(instanceOfNode))));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
649 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
650 handleUnresolvedInstanceOf(type, object);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
651 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
652 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
653
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
654 protected abstract T createNewInstance(ResolvedJavaType type, boolean fillContents);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
655
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
656 void genNewInstance(int cpi) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
657 JavaType type = lookupType(cpi, NEW);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
658 if (type instanceof ResolvedJavaType && ((ResolvedJavaType) type).isInitialized()) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
659 frameState.apush(append(createNewInstance((ResolvedJavaType) type, true)));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
660 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
661 handleUnresolvedNewInstance(type);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
662 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
663 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
664
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
665 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
666 * Gets the kind of array elements for the array type code that appears in a
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
667 * {@link Bytecodes#NEWARRAY} bytecode.
14899
e2a5528599e0 Merge (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14854 14896
diff changeset
668 *
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
669 * @param code the array type code
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
670 * @return the kind from the array type code
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
671 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
672 public static Class<?> arrayTypeCodeToClass(int code) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
673 // Checkstyle: stop
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
674 switch (code) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
675 case 4:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
676 return boolean.class;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
677 case 5:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
678 return char.class;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
679 case 6:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
680 return float.class;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
681 case 7:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
682 return double.class;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
683 case 8:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
684 return byte.class;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
685 case 9:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
686 return short.class;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
687 case 10:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
688 return int.class;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
689 case 11:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
690 return long.class;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
691 default:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
692 throw new IllegalArgumentException("unknown array type code: " + code);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
693 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
694 // Checkstyle: resume
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
695 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
696
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
697 private void genNewPrimitiveArray(int typeCode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
698 Class<?> clazz = arrayTypeCodeToClass(typeCode);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
699 ResolvedJavaType elementType = metaAccess.lookupJavaType(clazz);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
700 frameState.apush(append(createNewArray(elementType, frameState.ipop(), true)));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
701 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
702
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
703 private void genNewObjectArray(int cpi) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
704 JavaType type = lookupType(cpi, ANEWARRAY);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
705 T length = frameState.ipop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
706 if (type instanceof ResolvedJavaType) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
707 frameState.apush(append(createNewArray((ResolvedJavaType) type, length, true)));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
708 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
709 handleUnresolvedNewObjectArray(type, length);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
710 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
711
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
712 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
713
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
714 protected abstract T createNewArray(ResolvedJavaType elementType, T length, boolean fillContents);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
715
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
716 private void genNewMultiArray(int cpi) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
717 JavaType type = lookupType(cpi, MULTIANEWARRAY);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
718 int rank = getStream().readUByte(bci() + 3);
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
719 List<T> dims = new ArrayList<>(Collections.nCopies(rank, null));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
720 for (int i = rank - 1; i >= 0; i--) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
721 dims.set(i, frameState.ipop());
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
722 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
723 if (type instanceof ResolvedJavaType) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
724 frameState.apush(append(createNewMultiArray((ResolvedJavaType) type, dims)));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
725 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
726 handleUnresolvedNewMultiArray(type, dims);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
727 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
728 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
729
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
730 protected abstract T createNewMultiArray(ResolvedJavaType type, List<T> dims);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
731
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
732 protected abstract T genLoadField(T receiver, ResolvedJavaField field);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
733
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
734 private void genGetField(JavaField field) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
735 emitExplicitExceptions(frameState.peek(0), null);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
736
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
737 Kind kind = field.getKind();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
738 T receiver = frameState.apop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
739 if ((field instanceof ResolvedJavaField) && ((ResolvedJavaField) field).getDeclaringClass().isInitialized()) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
740 appendOptimizedLoadField(kind, genLoadField(receiver, (ResolvedJavaField) field));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
741 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
742 handleUnresolvedLoadField(field, receiver);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
743 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
744 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
745
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
746 // public static class ExceptionInfo {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
747 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
748 // public final FixedWithNextNode exceptionEdge;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
749 // public final T exception;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
750 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
751 // public ExceptionInfo(FixedWithNextNode exceptionEdge, T exception) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
752 // this.exceptionEdge = exceptionEdge;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
753 // this.exception = exception;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
754 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
755 // }
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
756
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
757 protected abstract void emitNullCheck(T receiver);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
758
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
759 protected static final ArrayIndexOutOfBoundsException cachedArrayIndexOutOfBoundsException = new ArrayIndexOutOfBoundsException();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
760 protected static final NullPointerException cachedNullPointerException = new NullPointerException();
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
761 static {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
762 cachedArrayIndexOutOfBoundsException.setStackTrace(new StackTraceElement[0]);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
763 cachedNullPointerException.setStackTrace(new StackTraceElement[0]);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
764 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
765
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
766 protected abstract void emitBoundsCheck(T index, T length);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
767
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
768 private static final DebugMetric EXPLICIT_EXCEPTIONS = Debug.metric("ExplicitExceptions");
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
769
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
770 protected abstract T genArrayLength(T x);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
771
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
772 protected void emitExplicitExceptions(T receiver, T outOfBoundsIndex) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
773 assert receiver != null;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
774 if (graphBuilderConfig.omitAllExceptionEdges() || (optimisticOpts.useExceptionProbabilityForOperations() && profilingInfo.getExceptionSeen(bci()) == TriState.FALSE)) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
775 return;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
776 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
777
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
778 emitNullCheck(receiver);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
779 if (outOfBoundsIndex != null) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
780 T length = append(genArrayLength(receiver));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
781 emitBoundsCheck(outOfBoundsIndex, length);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
782 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
783 EXPLICIT_EXCEPTIONS.increment();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
784 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
785
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
786 protected abstract T genStoreField(T receiver, ResolvedJavaField field, T value);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
787
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
788 private void genPutField(JavaField field) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
789 emitExplicitExceptions(frameState.peek(1), null);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
790
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
791 T value = frameState.pop(field.getKind().getStackKind());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
792 T receiver = frameState.apop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
793 if (field instanceof ResolvedJavaField && ((ResolvedJavaField) field).getDeclaringClass().isInitialized()) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
794 appendOptimizedStoreField(genStoreField(receiver, (ResolvedJavaField) field, value));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
795 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
796 handleUnresolvedStoreField(field, value, receiver);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
797 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
798 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
799
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
800 private void genGetStatic(JavaField field) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
801 Kind kind = field.getKind();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
802 if (field instanceof ResolvedJavaField && ((ResolvedJavaType) field.getDeclaringClass()).isInitialized()) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
803 appendOptimizedLoadField(kind, genLoadField(null, (ResolvedJavaField) field));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
804 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
805 handleUnresolvedLoadField(field, null);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
806 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
807 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
808
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
809 private void genPutStatic(JavaField field) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
810 T value = frameState.pop(field.getKind().getStackKind());
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
811 if (field instanceof ResolvedJavaField && ((ResolvedJavaType) field.getDeclaringClass()).isInitialized()) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
812 appendOptimizedStoreField(genStoreField(null, (ResolvedJavaField) field, value));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
813 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
814 handleUnresolvedStoreField(field, value, null);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
815 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
816 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
817
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
818 protected void appendOptimizedStoreField(T store) {
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
819 append(store);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
820 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
821
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
822 protected void appendOptimizedLoadField(Kind kind, T load) {
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
823 // append the load to the instruction
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
824 T optimized = append(load);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
825 frameState.push(kind.getStackKind(), optimized);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
826 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
827
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
828 protected abstract void genInvokeStatic(JavaMethod target);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
829
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
830 protected abstract void genInvokeInterface(JavaMethod target);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
831
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
832 protected abstract void genInvokeDynamic(JavaMethod target);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
833
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
834 protected abstract void genInvokeVirtual(JavaMethod target);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
835
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
836 protected abstract void genInvokeSpecial(JavaMethod target);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
837
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
838 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
839 // protected MethodCallTargetNode createMethodCallTarget(InvokeKind invokeKind, ResolvedJavaMethod
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
840 // targetMethod, T[] args, JavaType returnType) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
841 // return new MethodCallTargetNode(invokeKind, targetMethod, args, returnType);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
842 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
843 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
844 // protected InvokeNode createInvoke(CallTargetNode callTarget, Kind resultType) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
845 // InvokeNode invoke = append(new InvokeNode(callTarget, bci()));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
846 // frameState.pushReturn(resultType, invoke);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
847 // return invoke;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
848 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
849 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
850 // protected InvokeWithExceptionNode createInvokeWithException(CallTargetNode callTarget, Kind
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
851 // resultType) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
852 // DispatchBeginNode exceptionEdge = handleException(null, bci());
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
853 // InvokeWithExceptionNode invoke = append(new InvokeWithExceptionNode(callTarget, exceptionEdge,
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
854 // bci()));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
855 // frameState.pushReturn(resultType, invoke);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
856 // BciBlock nextBlock = currentBlock.getSuccessor(0);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
857 // invoke.setStateAfter(frameState.create(nextBlock.startBci));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
858 // return invoke;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
859 // }
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
860
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
861 protected abstract void genReturn(T x);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
862
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
863 protected abstract T genMonitorEnter(T x);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
864
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
865 protected abstract T genMonitorExit(T x, T returnValue);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
866
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
867 protected abstract void genJsr(int dest);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
868
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
869 protected abstract void genRet(int localIndex);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
870
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
871 private double[] switchProbability(int numberOfCases, int bci) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
872 double[] prob = profilingInfo.getSwitchProbabilities(bci);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
873 if (prob != null) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
874 assert prob.length == numberOfCases;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
875 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
876 Debug.log("Missing probability (switch) in %s at bci %d", method, bci);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
877 prob = new double[numberOfCases];
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
878 for (int i = 0; i < numberOfCases; i++) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
879 prob[i] = 1.0d / numberOfCases;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
880 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
881 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
882 assert allPositive(prob);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
883 return prob;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
884 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
885
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
886 private static boolean allPositive(double[] a) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
887 for (double d : a) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
888 if (d < 0) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
889 return false;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
890 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
891 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
892 return true;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
893 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
894
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
895 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
896 * Helper function that sums up the probabilities of all keys that lead to a specific successor.
14899
e2a5528599e0 Merge (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14854 14896
diff changeset
897 *
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
898 * @return an array of size successorCount with the accumulated probability for each successor.
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
899 */
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
900 private static double[] successorProbabilites(int successorCount, int[] keySuccessors, double[] keyProbabilities) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
901 double[] probability = new double[successorCount];
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
902 for (int i = 0; i < keySuccessors.length; i++) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
903 probability[keySuccessors[i]] += keyProbabilities[i];
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
904 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
905 return probability;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
906 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
907
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
908 private void genSwitch(BytecodeSwitch bs) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
909 int bci = bci();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
910 T value = frameState.ipop();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
911
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
912 int nofCases = bs.numberOfCases();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
913 double[] keyProbabilities = switchProbability(nofCases + 1, bci);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
914
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
915 Map<Integer, SuccessorInfo> bciToBlockSuccessorIndex = new HashMap<>();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
916 for (int i = 0; i < currentBlock.getSuccessorCount(); i++) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
917 assert !bciToBlockSuccessorIndex.containsKey(currentBlock.getSuccessors().get(i).startBci);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
918 if (!bciToBlockSuccessorIndex.containsKey(currentBlock.getSuccessors().get(i).startBci)) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
919 bciToBlockSuccessorIndex.put(currentBlock.getSuccessors().get(i).startBci, new SuccessorInfo(i));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
920 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
921 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
922
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
923 ArrayList<BciBlock> actualSuccessors = new ArrayList<>();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
924 int[] keys = new int[nofCases];
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
925 int[] keySuccessors = new int[nofCases + 1];
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
926 int deoptSuccessorIndex = -1;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
927 int nextSuccessorIndex = 0;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
928 for (int i = 0; i < nofCases + 1; i++) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
929 if (i < nofCases) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
930 keys[i] = bs.keyAt(i);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
931 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
932
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
933 if (isNeverExecutedCode(keyProbabilities[i])) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
934 if (deoptSuccessorIndex < 0) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
935 deoptSuccessorIndex = nextSuccessorIndex++;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
936 actualSuccessors.add(null);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
937 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
938 keySuccessors[i] = deoptSuccessorIndex;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
939 } else {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
940 int targetBci = i >= nofCases ? bs.defaultTarget() : bs.targetAt(i);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
941 SuccessorInfo info = bciToBlockSuccessorIndex.get(targetBci);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
942 if (info.actualIndex < 0) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
943 info.actualIndex = nextSuccessorIndex++;
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
944 actualSuccessors.add(currentBlock.getSuccessors().get(info.blockIndex));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
945 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
946 keySuccessors[i] = info.actualIndex;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
947 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
948 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
949
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
950 double[] successorProbabilities = successorProbabilites(actualSuccessors.size(), keySuccessors, keyProbabilities);
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
951 T switchNode = append(genIntegerSwitch(value, actualSuccessors.size(), keys, keyProbabilities, keySuccessors));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
952 for (int i = 0; i < actualSuccessors.size(); i++) {
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
953 setBlockSuccessor(switchNode, i, createBlockTarget(successorProbabilities[i], actualSuccessors.get(i), frameState));
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
954 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
955
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
956 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
957
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
958 protected abstract void setBlockSuccessor(T switchNode, int i, T createBlockTarget);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
959
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
960 protected abstract T genIntegerSwitch(T value, int size, int[] keys, double[] keyProbabilities, int[] keySuccessors);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
961
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
962 private static class SuccessorInfo {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
963
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
964 int blockIndex;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
965 int actualIndex;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
966
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
967 public SuccessorInfo(int blockSuccessorIndex) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
968 this.blockIndex = blockSuccessorIndex;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
969 actualIndex = -1;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
970 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
971 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
972
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
973 protected abstract T appendConstant(Constant constant);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
974
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
975 protected abstract T append(T v);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
976
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
977 private boolean isNeverExecutedCode(double probability) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
978 return probability == 0 && optimisticOpts.removeNeverExecutedCode() && entryBCI == StructuredGraph.INVOCATION_ENTRY_BCI;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
979 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
980
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
981 protected abstract T genDeoptimization();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
982
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
983 protected T createTarget(double probability, BciBlock block, AbstractFrameStateBuilder<T> stateAfter) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
984 assert probability >= 0 && probability <= 1.01 : probability;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
985 if (isNeverExecutedCode(probability)) {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
986 return genDeoptimization();
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
987 } else {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
988 assert block != null;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
989 return createTarget(block, stateAfter);
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
990 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
991 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
992
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
993 protected abstract T createTarget(BciBlock trueBlock, AbstractFrameStateBuilder<T> state);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
994
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
995 /**
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
996 * Returns a block begin node with the specified state. If the specified probability is 0, the
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
997 * block deoptimizes immediately.
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
998 */
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
999 protected abstract T createBlockTarget(double probability, BciBlock bciBlock, AbstractFrameStateBuilder<T> stateAfter);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1000
14894
3676333a46bb Use BciBlock in BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14893
diff changeset
1001 protected abstract void processBlock(BciBlock block);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1002
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1003 // private void connectLoopEndToBegin() {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1004 // for (LoopBeginNode begin : currentGraph.getNodes(LoopBeginNode.class)) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1005 // if (begin.loopEnds().isEmpty()) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1006 // // @formatter:off
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1007 // // Remove loop header without loop ends.
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1008 // // This can happen with degenerated loops like this one:
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1009 // // for (;;) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1010 // // try {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1011 // // break;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1012 // // } catch (UnresolvedException iioe) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1013 // // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1014 // // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1015 // // @formatter:on
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1016 // assert begin.forwardEndCount() == 1;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1017 // currentGraph.reduceDegenerateLoopBegin(begin);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1018 // } else {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1019 // GraphUtil.normalizeLoopBegin(begin);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1020 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1021 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1022 // }
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1023
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1024 // private void createUnwind() {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1025 // assert frameState.stackSize() == 1 : frameState;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1026 // T exception = frameState.apop();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1027 // append(new FixedGuardNode(currentGraph.unique(new IsNullNode(exception)), NullCheckException,
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1028 // InvalidateReprofile, true));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1029 // synchronizedEpilogue(FrameState.AFTER_EXCEPTION_BCI, null);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1030 // append(new UnwindNode(exception));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1031 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1032 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1033 // private void synchronizedEpilogue(int bci, T returnValue) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1034 // if (Modifier.isSynchronized(method.getModifiers())) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1035 // MonitorExitNode monitorExit = genMonitorExit(methodSynchronizedObject, returnValue);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1036 // if (returnValue != null) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1037 // frameState.push(returnValue.getKind(), returnValue);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1038 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1039 // monitorExit.setStateAfter(frameState.create(bci));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1040 // assert !frameState.rethrowException();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1041 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1042 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1043 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1044 // private void createExceptionDispatch(ExceptionDispatchBlock block) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1045 // assert frameState.stackSize() == 1 : frameState;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1046 // if (block.handler.isCatchAll()) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1047 // assert block.getSuccessorCount() == 1;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1048 // appendGoto(createTarget(block.getSuccessor(0), frameState));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1049 // return;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1050 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1051 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1052 // JavaType catchType = block.handler.getCatchType();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1053 // if (graphBuilderConfig.eagerResolving()) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1054 // catchType = lookupType(block.handler.catchTypeCPI(), INSTANCEOF);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1055 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1056 // boolean initialized = (catchType instanceof ResolvedJavaType);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1057 // if (initialized && graphBuilderConfig.getSkippedExceptionTypes() != null) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1058 // ResolvedJavaType resolvedCatchType = (ResolvedJavaType) catchType;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1059 // for (ResolvedJavaType skippedType : graphBuilderConfig.getSkippedExceptionTypes()) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1060 // if (skippedType.isAssignableFrom(resolvedCatchType)) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1061 // BciBlock nextBlock = block.getSuccessorCount() == 1 ? unwindBlock(block.deoptBci) :
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1062 // block.getSuccessor(1);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1063 // T exception = frameState.stackAt(0);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1064 // FixedNode trueSuccessor = currentGraph.add(new DeoptimizeNode(InvalidateReprofile,
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1065 // UnreachedCode));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1066 // FixedNode nextDispatch = createTarget(nextBlock, frameState);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1067 // append(new IfNode(currentGraph.unique(new InstanceOfNode((ResolvedJavaType) catchType, exception,
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1068 // null)), trueSuccessor, nextDispatch, 0));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1069 // return;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1070 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1071 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1072 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1073 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1074 // if (initialized) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1075 // BciBlock nextBlock = block.getSuccessorCount() == 1 ? unwindBlock(block.deoptBci) :
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1076 // block.getSuccessor(1);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1077 // T exception = frameState.stackAt(0);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1078 // CheckCastNode checkCast = currentGraph.add(new CheckCastNode((ResolvedJavaType) catchType,
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1079 // exception, null, false));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1080 // frameState.apop();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1081 // frameState.push(Kind.Object, checkCast);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1082 // FixedNode catchSuccessor = createTarget(block.getSuccessor(0), frameState);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1083 // frameState.apop();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1084 // frameState.push(Kind.Object, exception);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1085 // FixedNode nextDispatch = createTarget(nextBlock, frameState);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1086 // checkCast.setNext(catchSuccessor);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1087 // append(new IfNode(currentGraph.unique(new InstanceOfNode((ResolvedJavaType) catchType, exception,
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1088 // null)), checkCast, nextDispatch, 0.5));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1089 // } else {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1090 // handleUnresolvedExceptionType(Representation.ObjectHub, catchType);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1091 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1092 // }
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1093
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1094 protected abstract void appendGoto(T target);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1095
14894
3676333a46bb Use BciBlock in BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14893
diff changeset
1096 protected abstract void iterateBytecodesForBlock(BciBlock block);
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1097
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1098 // private void iterateBytecodesForBlock(BciBlock block) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1099 // if (block.isLoopHeader) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1100 // // Create the loop header block, which later will merge the backward branches of the
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1101 // // loop.
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1102 // AbstractEndNode preLoopEnd = currentGraph.add(new EndNode());
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1103 // LoopBeginNode loopBegin = currentGraph.add(new LoopBeginNode());
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1104 // lastInstr.setNext(preLoopEnd);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1105 // // Add the single non-loop predecessor of the loop header.
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1106 // loopBegin.addForwardEnd(preLoopEnd);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1107 // lastInstr = loopBegin;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1108 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1109 // // Create phi functions for all local variables and operand stack slots.
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1110 // frameState.insertLoopPhis(loopBegin);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1111 // loopBegin.setStateAfter(frameState.create(block.startBci));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1112 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1113 // /*
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1114 // * We have seen all forward branches. All subsequent backward branches will merge to the
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1115 // * loop header. This ensures that the loop header has exactly one non-loop predecessor.
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1116 // */
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1117 // block.firstInstruction = loopBegin;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1118 // /*
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1119 // * We need to preserve the frame state builder of the loop header so that we can merge
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1120 // * values for phi functions, so make a copy of it.
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1121 // */
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1122 // block.entryState = frameState.copy();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1123 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1124 // Debug.log(" created loop header %s", loopBegin);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1125 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1126 // assert lastInstr.next() == null : "instructions already appended at block " + block;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1127 // Debug.log(" frameState: %s", frameState);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1128 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1129 // int endBCI = stream.endBCI();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1130 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1131 // stream.setBCI(block.startBci);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1132 // int bci = block.startBci;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1133 // BytecodesParsed.add(block.endBci - bci);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1134 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1135 // while (bci < endBCI) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1136 // if (graphBuilderConfig.eagerInfopointMode() && lnt != null) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1137 // currentLineNumber = lnt.getLineNumber(bci);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1138 // if (currentLineNumber != previousLineNumber) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1139 // append(new InfopointNode(InfopointReason.LINE_NUMBER, frameState.create(bci)));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1140 // previousLineNumber = currentLineNumber;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1141 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1142 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1143 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1144 // // read the opcode
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1145 // int opcode = stream.currentBC();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1146 // traceState();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1147 // traceInstruction(bci, opcode, bci == block.startBci);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1148 // if (bci == entryBCI) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1149 // if (block.jsrScope != JsrScope.EMPTY_SCOPE) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1150 // throw new BailoutException("OSR into a JSR scope is not supported");
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1151 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1152 // EntryMarkerNode x = append(new EntryMarkerNode());
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1153 // frameState.insertProxies(x);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1154 // x.setStateAfter(frameState.create(bci));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1155 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1156 // parseHelper.processBytecode(bci, opcode);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1157 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1158 // if (lastInstr == null || isBlockEnd(lastInstr) || lastInstr.next() != null) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1159 // break;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1160 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1161 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1162 // stream.next();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1163 // bci = stream.currentBCI();
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1164 //
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1165 // if (bci > block.endBci) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1166 // frameState.clearNonLiveLocals(currentBlock, liveness, false);
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1167 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1168 // if (lastInstr instanceof StateSplit) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1169 // if (lastInstr.getClass() == AbstractBeginNode.class) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1170 // // BeginNodes do not need a frame state
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1171 // } else {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1172 // StateSplit stateSplit = (StateSplit) lastInstr;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1173 // if (stateSplit.stateAfter() == null) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1174 // stateSplit.setStateAfter(frameState.create(bci));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1175 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1176 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1177 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1178 // if (bci < endBCI) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1179 // if (bci > block.endBci) {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1180 // assert !block.getSuccessor(0).isExceptionEntry;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1181 // assert block.numNormalSuccessors() == 1;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1182 // // we fell through to the next block, add a goto and break
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1183 // appendGoto(createTarget(block.getSuccessor(0), frameState));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1184 // break;
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1185 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1186 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1187 // }
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1188 // }
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1189
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1190 // private final int traceLevel = Options.TraceBytecodeParserLevel.getValue();
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1191 //
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1192 // private void traceState() {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1193 // if (traceLevel >= TRACELEVEL_STATE && Debug.isLogEnabled()) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1194 // Debug.log(String.format("| state [nr locals = %d, stack depth = %d, method = %s]",
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1195 // frameState.localsSize(), frameState.stackSize(), method));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1196 // for (int i = 0; i < frameState.localsSize(); ++i) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1197 // T value = frameState.localAt(i);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1198 // Debug.log(String.format("| local[%d] = %-8s : %s", i, value == null ? "bogus" :
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1199 // value.getKind().getJavaName(), value));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1200 // }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1201 // for (int i = 0; i < frameState.stackSize(); ++i) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1202 // T value = frameState.stackAt(i);
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1203 // Debug.log(String.format("| stack[%d] = %-8s : %s", i, value == null ? "bogus" :
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1204 // value.getKind().getJavaName(), value));
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1205 // }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1206 // }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1207 // }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1208
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1209 public void processBytecode(int bci, int opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1210 int cpi;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1211
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1212 // Checkstyle: stop
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1213 // @formatter:off
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1214 switch (opcode) {
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1215 case NOP : /* nothing to do */ break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1216 case ACONST_NULL : frameState.apush(appendConstant(Constant.NULL_OBJECT)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1217 case ICONST_M1 : frameState.ipush(appendConstant(Constant.INT_MINUS_1)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1218 case ICONST_0 : frameState.ipush(appendConstant(Constant.INT_0)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1219 case ICONST_1 : frameState.ipush(appendConstant(Constant.INT_1)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1220 case ICONST_2 : frameState.ipush(appendConstant(Constant.INT_2)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1221 case ICONST_3 : frameState.ipush(appendConstant(Constant.INT_3)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1222 case ICONST_4 : frameState.ipush(appendConstant(Constant.INT_4)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1223 case ICONST_5 : frameState.ipush(appendConstant(Constant.INT_5)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1224 case LCONST_0 : frameState.lpush(appendConstant(Constant.LONG_0)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1225 case LCONST_1 : frameState.lpush(appendConstant(Constant.LONG_1)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1226 case FCONST_0 : frameState.fpush(appendConstant(Constant.FLOAT_0)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1227 case FCONST_1 : frameState.fpush(appendConstant(Constant.FLOAT_1)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1228 case FCONST_2 : frameState.fpush(appendConstant(Constant.FLOAT_2)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1229 case DCONST_0 : frameState.dpush(appendConstant(Constant.DOUBLE_0)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1230 case DCONST_1 : frameState.dpush(appendConstant(Constant.DOUBLE_1)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1231 case BIPUSH : frameState.ipush(appendConstant(Constant.forInt(stream.readByte()))); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1232 case SIPUSH : frameState.ipush(appendConstant(Constant.forInt(stream.readShort()))); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1233 case LDC : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1234 case LDC_W : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1235 case LDC2_W : genLoadConstant(stream.readCPI(), opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1236 case ILOAD : loadLocal(stream.readLocalIndex(), Kind.Int); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1237 case LLOAD : loadLocal(stream.readLocalIndex(), Kind.Long); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1238 case FLOAD : loadLocal(stream.readLocalIndex(), Kind.Float); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1239 case DLOAD : loadLocal(stream.readLocalIndex(), Kind.Double); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1240 case ALOAD : loadLocal(stream.readLocalIndex(), Kind.Object); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1241 case ILOAD_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1242 case ILOAD_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1243 case ILOAD_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1244 case ILOAD_3 : loadLocal(opcode - ILOAD_0, Kind.Int); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1245 case LLOAD_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1246 case LLOAD_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1247 case LLOAD_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1248 case LLOAD_3 : loadLocal(opcode - LLOAD_0, Kind.Long); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1249 case FLOAD_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1250 case FLOAD_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1251 case FLOAD_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1252 case FLOAD_3 : loadLocal(opcode - FLOAD_0, Kind.Float); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1253 case DLOAD_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1254 case DLOAD_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1255 case DLOAD_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1256 case DLOAD_3 : loadLocal(opcode - DLOAD_0, Kind.Double); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1257 case ALOAD_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1258 case ALOAD_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1259 case ALOAD_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1260 case ALOAD_3 : loadLocal(opcode - ALOAD_0, Kind.Object); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1261 case IALOAD : genLoadIndexed(Kind.Int ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1262 case LALOAD : genLoadIndexed(Kind.Long ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1263 case FALOAD : genLoadIndexed(Kind.Float ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1264 case DALOAD : genLoadIndexed(Kind.Double); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1265 case AALOAD : genLoadIndexed(Kind.Object); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1266 case BALOAD : genLoadIndexed(Kind.Byte ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1267 case CALOAD : genLoadIndexed(Kind.Char ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1268 case SALOAD : genLoadIndexed(Kind.Short ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1269 case ISTORE : storeLocal(Kind.Int, stream.readLocalIndex()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1270 case LSTORE : storeLocal(Kind.Long, stream.readLocalIndex()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1271 case FSTORE : storeLocal(Kind.Float, stream.readLocalIndex()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1272 case DSTORE : storeLocal(Kind.Double, stream.readLocalIndex()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1273 case ASTORE : storeLocal(Kind.Object, stream.readLocalIndex()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1274 case ISTORE_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1275 case ISTORE_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1276 case ISTORE_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1277 case ISTORE_3 : storeLocal(Kind.Int, opcode - ISTORE_0); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1278 case LSTORE_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1279 case LSTORE_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1280 case LSTORE_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1281 case LSTORE_3 : storeLocal(Kind.Long, opcode - LSTORE_0); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1282 case FSTORE_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1283 case FSTORE_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1284 case FSTORE_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1285 case FSTORE_3 : storeLocal(Kind.Float, opcode - FSTORE_0); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1286 case DSTORE_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1287 case DSTORE_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1288 case DSTORE_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1289 case DSTORE_3 : storeLocal(Kind.Double, opcode - DSTORE_0); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1290 case ASTORE_0 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1291 case ASTORE_1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1292 case ASTORE_2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1293 case ASTORE_3 : storeLocal(Kind.Object, opcode - ASTORE_0); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1294 case IASTORE : genStoreIndexed(Kind.Int ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1295 case LASTORE : genStoreIndexed(Kind.Long ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1296 case FASTORE : genStoreIndexed(Kind.Float ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1297 case DASTORE : genStoreIndexed(Kind.Double); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1298 case AASTORE : genStoreIndexed(Kind.Object); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1299 case BASTORE : genStoreIndexed(Kind.Byte ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1300 case CASTORE : genStoreIndexed(Kind.Char ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1301 case SASTORE : genStoreIndexed(Kind.Short ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1302 case POP : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1303 case POP2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1304 case DUP : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1305 case DUP_X1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1306 case DUP_X2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1307 case DUP2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1308 case DUP2_X1 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1309 case DUP2_X2 : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1310 case SWAP : stackOp(opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1311 case IADD : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1312 case ISUB : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1313 case IMUL : genArithmeticOp(Kind.Int, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1314 case IDIV : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1315 case IREM : genIntegerDivOp(Kind.Int, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1316 case LADD : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1317 case LSUB : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1318 case LMUL : genArithmeticOp(Kind.Long, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1319 case LDIV : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1320 case LREM : genIntegerDivOp(Kind.Long, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1321 case FADD : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1322 case FSUB : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1323 case FMUL : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1324 case FDIV : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1325 case FREM : genArithmeticOp(Kind.Float, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1326 case DADD : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1327 case DSUB : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1328 case DMUL : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1329 case DDIV : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1330 case DREM : genArithmeticOp(Kind.Double, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1331 case INEG : genNegateOp(Kind.Int); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1332 case LNEG : genNegateOp(Kind.Long); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1333 case FNEG : genNegateOp(Kind.Float); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1334 case DNEG : genNegateOp(Kind.Double); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1335 case ISHL : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1336 case ISHR : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1337 case IUSHR : genShiftOp(Kind.Int, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1338 case IAND : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1339 case IOR : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1340 case IXOR : genLogicOp(Kind.Int, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1341 case LSHL : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1342 case LSHR : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1343 case LUSHR : genShiftOp(Kind.Long, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1344 case LAND : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1345 case LOR : // fall through
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1346 case LXOR : genLogicOp(Kind.Long, opcode); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1347 case IINC : genIncrement(); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1348 case I2F : genFloatConvert(FloatConvert.I2F, Kind.Int, Kind.Float); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1349 case I2D : genFloatConvert(FloatConvert.I2D, Kind.Int, Kind.Double); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1350 case L2F : genFloatConvert(FloatConvert.L2F, Kind.Long, Kind.Float); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1351 case L2D : genFloatConvert(FloatConvert.L2D, Kind.Long, Kind.Double); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1352 case F2I : genFloatConvert(FloatConvert.F2I, Kind.Float, Kind.Int); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1353 case F2L : genFloatConvert(FloatConvert.F2L, Kind.Float, Kind.Long); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1354 case F2D : genFloatConvert(FloatConvert.F2D, Kind.Float, Kind.Double); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1355 case D2I : genFloatConvert(FloatConvert.D2I, Kind.Double, Kind.Int); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1356 case D2L : genFloatConvert(FloatConvert.D2L, Kind.Double, Kind.Long); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1357 case D2F : genFloatConvert(FloatConvert.D2F, Kind.Double, Kind.Float); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1358 case L2I : genNarrow(Kind.Long, Kind.Int); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1359 case I2L : genSignExtend(Kind.Int, Kind.Long); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1360 case I2B : genSignExtend(Kind.Byte, Kind.Int); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1361 case I2S : genSignExtend(Kind.Short, Kind.Int); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1362 case I2C : genZeroExtend(Kind.Char, Kind.Int); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1363 case LCMP : genCompareOp(Kind.Long, false); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1364 case FCMPL : genCompareOp(Kind.Float, true); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1365 case FCMPG : genCompareOp(Kind.Float, false); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1366 case DCMPL : genCompareOp(Kind.Double, true); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1367 case DCMPG : genCompareOp(Kind.Double, false); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1368 case IFEQ : genIfZero(Condition.EQ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1369 case IFNE : genIfZero(Condition.NE); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1370 case IFLT : genIfZero(Condition.LT); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1371 case IFGE : genIfZero(Condition.GE); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1372 case IFGT : genIfZero(Condition.GT); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1373 case IFLE : genIfZero(Condition.LE); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1374 case IF_ICMPEQ : genIfSame(Kind.Int, Condition.EQ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1375 case IF_ICMPNE : genIfSame(Kind.Int, Condition.NE); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1376 case IF_ICMPLT : genIfSame(Kind.Int, Condition.LT); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1377 case IF_ICMPGE : genIfSame(Kind.Int, Condition.GE); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1378 case IF_ICMPGT : genIfSame(Kind.Int, Condition.GT); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1379 case IF_ICMPLE : genIfSame(Kind.Int, Condition.LE); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1380 case IF_ACMPEQ : genIfSame(Kind.Object, Condition.EQ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1381 case IF_ACMPNE : genIfSame(Kind.Object, Condition.NE); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1382 case GOTO : genGoto(); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1383 case JSR : genJsr(stream.readBranchDest()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1384 case RET : genRet(stream.readLocalIndex()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1385 case TABLESWITCH : genSwitch(new BytecodeTableSwitch(getStream(), bci())); break;
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1386 case LOOKUPSWITCH : genSwitch(new BytecodeLookupSwitch(getStream(), bci())); break;
14892
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1387 case IRETURN : genReturn(frameState.ipop()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1388 case LRETURN : genReturn(frameState.lpop()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1389 case FRETURN : genReturn(frameState.fpop()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1390 case DRETURN : genReturn(frameState.dpop()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1391 case ARETURN : genReturn(frameState.apop()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1392 case RETURN : genReturn(null); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1393 case GETSTATIC : cpi = stream.readCPI(); genGetStatic(lookupField(cpi, opcode)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1394 case PUTSTATIC : cpi = stream.readCPI(); genPutStatic(lookupField(cpi, opcode)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1395 case GETFIELD : cpi = stream.readCPI(); genGetField(lookupField(cpi, opcode)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1396 case PUTFIELD : cpi = stream.readCPI(); genPutField(lookupField(cpi, opcode)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1397 case INVOKEVIRTUAL : cpi = stream.readCPI(); genInvokeVirtual(lookupMethod(cpi, opcode)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1398 case INVOKESPECIAL : cpi = stream.readCPI(); genInvokeSpecial(lookupMethod(cpi, opcode)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1399 case INVOKESTATIC : cpi = stream.readCPI(); genInvokeStatic(lookupMethod(cpi, opcode)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1400 case INVOKEINTERFACE: cpi = stream.readCPI(); genInvokeInterface(lookupMethod(cpi, opcode)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1401 case INVOKEDYNAMIC : cpi = stream.readCPI4(); genInvokeDynamic(lookupMethod(cpi, opcode)); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1402 case NEW : genNewInstance(stream.readCPI()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1403 case NEWARRAY : genNewPrimitiveArray(stream.readLocalIndex()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1404 case ANEWARRAY : genNewObjectArray(stream.readCPI()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1405 case ARRAYLENGTH : genArrayLength(); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1406 case ATHROW : genThrow(); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1407 case CHECKCAST : genCheckCast(); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1408 case INSTANCEOF : genInstanceOf(); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1409 case MONITORENTER : genMonitorEnter(frameState.apop()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1410 case MONITOREXIT : genMonitorExit(frameState.apop(), null); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1411 case MULTIANEWARRAY : genNewMultiArray(stream.readCPI()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1412 case IFNULL : genIfNull(Condition.EQ); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1413 case IFNONNULL : genIfNull(Condition.NE); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1414 case GOTO_W : genGoto(); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1415 case JSR_W : genJsr(stream.readBranchDest()); break;
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1416 case BREAKPOINT:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1417 throw new BailoutException("concurrent setting of breakpoint");
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1418 default:
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1419 throw new BailoutException("Unsupported opcode " + opcode + " (" + nameOf(opcode) + ") [bci=" + bci + "]");
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1420 }
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1421 // @formatter:on
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1422 // Checkstyle: resume
75104db5215e Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14830
diff changeset
1423 }
14893
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1424
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1425 private void genArrayLength() {
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1426 frameState.ipush(append(genArrayLength(frameState.apop())));
f97c85e6366d Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents: 14892
diff changeset
1427 }
14899
e2a5528599e0 Merge (defunc).
Josef Eisl <josef.eisl@jku.at>
parents: 14854 14896
diff changeset
1428
14900
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1429 public ResolvedJavaMethod getMethod() {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1430 return method;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1431 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1432
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1433 public F getFrameState() {
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1434 return frameState;
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1435 }
be4c28683c08 Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents: 14899
diff changeset
1436
14818
3d04915a55c6 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
Niclas Adlertz <niclas.adlertz@oracle.com>
parents:
diff changeset
1437 }