Mercurial > hg > truffle
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 |
rev | line source |
---|---|
14854 | 1 /* |
2 * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. | |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
20 * or visit www.oracle.com if you need additional information or have any | |
21 * questions. | |
22 */ | |
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 | 75 protected abstract void build(); |
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 | 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 | 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 | 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 } |