Mercurial > hg > truffle
annotate graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java @ 19050:75da87c96605
initial commit of GraphBuilderPhase plugins
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Sat, 31 Jan 2015 00:30:00 +0100 |
parents | 07f2a49f0bfb |
children | 0b15114268c8 |
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.*; |
16841
cbd42807a31f
moved NodeInfo and friends into separate com.oracle.graal.nodeinfo project so that annotation processor can be applied to the base Node class
Doug Simon <doug.simon@oracle.com>
parents:
16036
diff
changeset
|
28 |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
29 import java.util.*; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
30 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
31 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
|
32 import com.oracle.graal.api.meta.*; |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
33 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
|
34 import com.oracle.graal.bytecode.*; |
15193
96bb07a5d667
Spit up and move GraalInternalError.
Josef Eisl <josef.eisl@jku.at>
parents:
15031
diff
changeset
|
35 import com.oracle.graal.compiler.common.*; |
15200
97eed257999b
Move Condition to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents:
15193
diff
changeset
|
36 import com.oracle.graal.compiler.common.calc.*; |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
37 import com.oracle.graal.debug.*; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
38 import com.oracle.graal.java.BciBlockMapping.BciBlock; |
14922
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
39 import com.oracle.graal.options.*; |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
40 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
|
41 |
15031
14e542e27076
Lift implementation from HIRFrameStateBuilder up to AbstractFrameStateBuilder if possible.
Josef Eisl <josef.eisl@jku.at>
parents:
15030
diff
changeset
|
42 public abstract class AbstractBytecodeParser<T extends KindProvider, F extends AbstractFrameStateBuilder<T, F>> { |
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
|
43 |
14922
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
44 static class Options { |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
45 // @formatter:off |
18674
ecb9d0cedbab
First draft of option classification.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18490
diff
changeset
|
46 @Option(help = "The trace level for the bytecode parser used when building a graph from bytecode", type = OptionType.Debug) |
14922
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
47 public static final OptionValue<Integer> TraceBytecodeParserLevel = new OptionValue<>(0); |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
48 // @formatter:on |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
49 } |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
50 |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
51 /** |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
52 * The minimum value to which {@link Options#TraceBytecodeParserLevel} must be set to trace the |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
53 * bytecode instructions as they are parsed. |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
54 */ |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
55 public static final int TRACELEVEL_INSTRUCTIONS = 1; |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
56 |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
57 /** |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
58 * The minimum value to which {@link Options#TraceBytecodeParserLevel} must be set to trace the |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
59 * frame state before each bytecode instruction as it is parsed. |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
60 */ |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
61 public static final int TRACELEVEL_STATE = 2; |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
62 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
63 protected F frameState; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
64 protected BciBlock currentBlock; |
18918
e8fd0342d9c4
GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18917
diff
changeset
|
65 |
e8fd0342d9c4
GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18917
diff
changeset
|
66 protected final BytecodeStream stream; |
e8fd0342d9c4
GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18917
diff
changeset
|
67 protected final GraphBuilderConfiguration graphBuilderConfig; |
e8fd0342d9c4
GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18917
diff
changeset
|
68 protected final ResolvedJavaMethod method; |
e8fd0342d9c4
GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18917
diff
changeset
|
69 protected final ProfilingInfo profilingInfo; |
e8fd0342d9c4
GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18917
diff
changeset
|
70 protected final OptimisticOptimizations optimisticOpts; |
e8fd0342d9c4
GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18917
diff
changeset
|
71 protected final ConstantPool constantPool; |
18935
07f2a49f0bfb
Various adjustments to simplify future merges
Paul Woegerer <paul.woegerer@oracle.com>
parents:
18920
diff
changeset
|
72 protected final MetaAccessProvider metaAccess; |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
73 |
14922
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
74 /** |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
75 * Meters the number of actual bytecodes parsed. |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
76 */ |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
77 public static final DebugMetric BytecodesParsed = Debug.metric("BytecodesParsed"); |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
78 |
18920
4af661af76fd
Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18918
diff
changeset
|
79 public AbstractBytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts) { |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
80 this.graphBuilderConfig = graphBuilderConfig; |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
81 this.optimisticOpts = optimisticOpts; |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
82 this.metaAccess = metaAccess; |
18918
e8fd0342d9c4
GraphBuilder simplifications.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18917
diff
changeset
|
83 this.stream = new BytecodeStream(method.getCode()); |
18917
323ac2b4d988
Small simplification for BaselineBytecodeParser.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18825
diff
changeset
|
84 this.profilingInfo = method.getProfilingInfo(); |
323ac2b4d988
Small simplification for BaselineBytecodeParser.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18825
diff
changeset
|
85 this.constantPool = method.getConstantPool(); |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
86 this.method = method; |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
87 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
|
88 } |
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
|
89 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
90 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
|
91 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
|
92 } |
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 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
94 protected final BytecodeStream getStream() { |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
95 return stream; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
96 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
97 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
98 protected int bci() { |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
99 return stream.currentBCI(); |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
100 } |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
101 |
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
|
102 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
|
103 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
|
104 } |
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 |
14895
d76fce67b49d
Created BaselineCompiler BytecodeParser inner class.
Josef Eisl <josef.eisl@jku.at>
parents:
14894
diff
changeset
|
106 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
|
107 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
|
108 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
|
109 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
|
110 // 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
|
111 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
|
112 } 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
|
113 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
|
114 } |
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
|
115 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
|
116 } |
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
|
117 |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
118 /** |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
119 * @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
|
120 */ |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
121 protected abstract void handleUnresolvedLoadConstant(JavaType type); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
122 |
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 * @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
|
125 * @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
|
126 */ |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
127 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
|
128 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
129 /** |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
130 * @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
|
131 * @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
|
132 */ |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
133 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
|
134 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
135 /** |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
136 * @param type the type being instantiated |
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 protected abstract void handleUnresolvedNewInstance(JavaType type); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
139 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
140 /** |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
141 * @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
|
142 * @param length the length of the array |
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 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
|
145 |
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 * @param type the type being instantiated |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
148 * @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
|
149 */ |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
150 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
|
151 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
152 /** |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
153 * @param field the unresolved field |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
154 * @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
|
155 */ |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
156 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
|
157 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
158 /** |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
159 * @param field the unresolved field |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
160 * @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
|
161 * @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
|
162 */ |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
163 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
|
164 |
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 * @param type |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
167 */ |
18361
6ac7e9c85be6
Split getEncoding into two methods.
Roland Schatz <roland.schatz@oracle.com>
parents:
18187
diff
changeset
|
168 protected abstract void handleUnresolvedExceptionType(JavaType type); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
169 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
170 // 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
|
171 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
172 // 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
|
173 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
174 private void genLoadConstant(int cpi, int opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
175 Object con = lookupConstant(cpi, opcode); |
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 if (con instanceof JavaType) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
178 // 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
|
179 JavaType type = (JavaType) con; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
180 if (type instanceof ResolvedJavaType) { |
18361
6ac7e9c85be6
Split getEncoding into two methods.
Roland Schatz <roland.schatz@oracle.com>
parents:
18187
diff
changeset
|
181 frameState.push(Kind.Object, appendConstant(((ResolvedJavaType) type).getJavaClass())); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
182 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
183 handleUnresolvedLoadConstant(type); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
184 } |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
185 } else if (con instanceof JavaConstant) { |
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
186 JavaConstant constant = (JavaConstant) con; |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
187 frameState.push(constant.getKind().getStackKind(), appendConstant(constant)); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
188 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
189 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
|
190 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
191 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
192 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
193 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
|
194 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
195 private void genLoadIndexed(Kind kind) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
196 emitExplicitExceptions(frameState.peek(1), frameState.peek(0)); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
197 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
198 T index = frameState.ipop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
199 T array = frameState.apop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
200 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
|
201 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
202 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
203 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
|
204 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
205 private void genStoreIndexed(Kind kind) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
206 emitExplicitExceptions(frameState.peek(2), frameState.peek(1)); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
207 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
208 T value = frameState.pop(kind.getStackKind()); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
209 T index = frameState.ipop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
210 T array = frameState.apop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
211 append(genStoreIndexed(array, index, kind, value)); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
212 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
213 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
214 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
|
215 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
|
216 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
|
217 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
|
218 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
|
219 } |
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 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
|
221 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
|
222 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
|
223 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
|
224 } |
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 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
|
226 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
|
227 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
|
228 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
|
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_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
|
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 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
|
235 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
|
236 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
|
237 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
|
238 } |
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 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
|
240 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
|
241 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
|
242 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
|
243 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
|
244 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
|
245 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
|
246 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
|
247 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
|
248 } |
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 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
|
250 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
|
251 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
|
252 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
|
253 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
|
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 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
|
257 } |
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 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
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 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
|
267 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
|
268 } |
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 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
|
270 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
|
271 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
|
272 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
|
273 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
|
274 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
|
275 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
|
276 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
|
277 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
|
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 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
|
280 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
|
281 } |
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 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
|
283 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
|
284 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
|
285 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
|
286 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
|
287 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
|
288 } |
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
|
289 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
|
290 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
|
291 } |
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
|
292 } |
14892
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 genIntegerAdd(Kind kind, T x, T y); |
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 genIntegerSub(Kind kind, T x, T y); |
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 genIntegerMul(Kind kind, T x, T y); |
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 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
|
301 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
302 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
|
303 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
304 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
|
305 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
306 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
|
307 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
308 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
|
309 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
310 private void genArithmeticOp(Kind result, int opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
311 T y = frameState.pop(result); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
312 T x = frameState.pop(result); |
15311
820c6d353358
added ModifiersProvider as superinterface for ResolvedJava[Method|Field|Type] and implemented all checks against modifiers as default methods
Doug Simon <doug.simon@oracle.com>
parents:
15294
diff
changeset
|
313 boolean isStrictFP = method.isStrict(); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
314 T v; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
315 switch (opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
316 case IADD: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
317 case LADD: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
318 v = genIntegerAdd(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 FADD: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
321 case DADD: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
322 v = genFloatAdd(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 ISUB: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
325 case LSUB: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
326 v = genIntegerSub(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 FSUB: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
329 case DSUB: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
330 v = genFloatSub(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 IMUL: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
333 case LMUL: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
334 v = genIntegerMul(result, x, y); |
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 FMUL: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
337 case DMUL: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
338 v = genFloatMul(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 case FDIV: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
341 case DDIV: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
342 v = genFloatDiv(result, x, y, isStrictFP); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
343 break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
344 case FREM: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
345 case DREM: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
346 v = genFloatRem(result, x, y, isStrictFP); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
347 break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
348 default: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
349 throw new GraalInternalError("should not reach"); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
350 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
351 frameState.push(result, append(v)); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
352 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
353 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
354 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
|
355 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
356 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
|
357 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
358 private void genIntegerDivOp(Kind result, int opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
359 T y = frameState.pop(result); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
360 T x = frameState.pop(result); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
361 T v; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
362 switch (opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
363 case IDIV: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
364 case LDIV: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
365 v = genIntegerDiv(result, x, y); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
366 break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
367 case IREM: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
368 case LREM: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
369 v = genIntegerRem(result, x, y); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
370 break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
371 default: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
372 throw new GraalInternalError("should not reach"); |
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 frameState.push(result, append(v)); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
375 } |
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 genNegateOp(T x); |
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 private void genNegateOp(Kind kind) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
380 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
|
381 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
382 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
383 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
|
384 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
385 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
|
386 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
387 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
|
388 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
389 private void genShiftOp(Kind kind, int opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
390 T s = frameState.ipop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
391 T x = frameState.pop(kind); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
392 T v; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
393 switch (opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
394 case ISHL: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
395 case LSHL: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
396 v = genLeftShift(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 case ISHR: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
399 case LSHR: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
400 v = genRightShift(kind, x, s); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
401 break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
402 case IUSHR: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
403 case LUSHR: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
404 v = genUnsignedRightShift(kind, x, s); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
405 break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
406 default: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
407 throw new GraalInternalError("should not reach"); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
408 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
409 frameState.push(kind, append(v)); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
410 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
411 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
412 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
|
413 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
414 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
|
415 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
416 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
|
417 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
418 private void genLogicOp(Kind kind, int opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
419 T y = frameState.pop(kind); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
420 T x = frameState.pop(kind); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
421 T v; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
422 switch (opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
423 case IAND: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
424 case LAND: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
425 v = genAnd(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 case IOR: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
428 case LOR: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
429 v = genOr(kind, x, y); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
430 break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
431 case IXOR: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
432 case LXOR: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
433 v = genXor(kind, x, y); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
434 break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
435 default: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
436 throw new GraalInternalError("should not reach"); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
437 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
438 frameState.push(kind, append(v)); |
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 genNormalizeCompare(T x, T y, boolean isUnorderedLess); |
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 genCompareOp(Kind kind, boolean isUnorderedLess) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
444 T y = frameState.pop(kind); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
445 T x = frameState.pop(kind); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
446 frameState.ipush(append(genNormalizeCompare(x, y, isUnorderedLess))); |
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 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
449 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
|
450 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
451 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
|
452 T input = frameState.pop(from.getStackKind()); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
453 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
|
454 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
455 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
456 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
|
457 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
458 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
|
459 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
460 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
|
461 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
462 private void genSignExtend(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(genSignExtend(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 genZeroExtend(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 if (from != from.getStackKind()) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
473 input = append(genNarrow(input, from.getBitCount())); |
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 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
|
476 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
477 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
478 private void genNarrow(Kind from, Kind to) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
479 T input = frameState.pop(from.getStackKind()); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
480 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
|
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 genIncrement() { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
484 int index = getStream().readLocalIndex(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
485 int delta = getStream().readIncrement(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
486 T x = frameState.loadLocal(index); |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
487 T y = appendConstant(JavaConstant.forInt(delta)); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
488 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
|
489 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
490 |
15030
e098038093d5
AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
15029
diff
changeset
|
491 protected abstract void genGoto(); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
492 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
493 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
|
494 |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
495 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
|
496 |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
497 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
|
498 |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
499 protected abstract T genUnique(T x); |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
500 |
14948
bc72e5ed9752
AbstractBytecodeParser: rename ifNode to genIf.
Josef Eisl <josef.eisl@jku.at>
parents:
14947
diff
changeset
|
501 protected abstract void genIf(T x, Condition cond, T y); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
502 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
503 private void genIfZero(Condition cond) { |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
504 T y = appendConstant(JavaConstant.INT_0); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
505 T x = frameState.ipop(); |
14948
bc72e5ed9752
AbstractBytecodeParser: rename ifNode to genIf.
Josef Eisl <josef.eisl@jku.at>
parents:
14947
diff
changeset
|
506 genIf(x, cond, y); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
507 } |
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 private void genIfNull(Condition cond) { |
18490
ca81508f2a19
Generalize NULL handling to work on arbitrary pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
18361
diff
changeset
|
510 T y = appendConstant(JavaConstant.NULL_POINTER); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
511 T x = frameState.apop(); |
14948
bc72e5ed9752
AbstractBytecodeParser: rename ifNode to genIf.
Josef Eisl <josef.eisl@jku.at>
parents:
14947
diff
changeset
|
512 genIf(x, cond, y); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
513 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
514 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
515 private void genIfSame(Kind kind, Condition cond) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
516 T y = frameState.pop(kind); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
517 T x = frameState.pop(kind); |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
518 // assert !x.isDeleted() && !y.isDeleted(); |
14948
bc72e5ed9752
AbstractBytecodeParser: rename ifNode to genIf.
Josef Eisl <josef.eisl@jku.at>
parents:
14947
diff
changeset
|
519 genIf(x, cond, y); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
520 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
521 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
522 protected abstract void genThrow(); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
523 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
524 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
|
525 eagerResolvingForSnippets(cpi, bytecode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
526 JavaType result = constantPool.lookupType(cpi, bytecode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
527 assert !graphBuilderConfig.unresolvedIsError() || result instanceof ResolvedJavaType; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
528 return result; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
529 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
530 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
531 private JavaMethod lookupMethod(int cpi, int opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
532 eagerResolvingForSnippets(cpi, opcode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
533 JavaMethod result = constantPool.lookupMethod(cpi, opcode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
534 /* |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
535 * 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
|
536 * 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
|
537 * 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
|
538 * often fail for interface calls. |
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 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
|
541 return result; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
542 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
543 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
544 private JavaField lookupField(int cpi, int opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
545 eagerResolvingForSnippets(cpi, opcode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
546 JavaField result = constantPool.lookupField(cpi, opcode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
547 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
|
548 return result; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
549 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
550 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
551 private Object lookupConstant(int cpi, int opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
552 eagerResolvingForSnippets(cpi, opcode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
553 Object result = constantPool.lookupConstant(cpi); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
554 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
|
555 return result; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
556 } |
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 private void eagerResolvingForSnippets(int cpi, int bytecode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
559 if (graphBuilderConfig.eagerResolving()) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
560 constantPool.loadReferencedType(cpi, bytecode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
561 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
562 } |
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 private JavaTypeProfile getProfileForTypeCheck(ResolvedJavaType type) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
565 if (!optimisticOpts.useTypeCheckHints() || !canHaveSubtype(type)) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
566 return null; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
567 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
568 return profilingInfo.getTypeProfile(bci()); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
569 } |
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 |
15837
6fe57ff3f02c
Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents:
15311
diff
changeset
|
572 protected abstract T createCheckCast(ResolvedJavaType type, T object, JavaTypeProfile profileForTypeCheck, boolean forStoreCheck); |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
573 |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
574 private void genCheckCast() { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
575 int cpi = getStream().readCPI(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
576 JavaType type = lookupType(cpi, CHECKCAST); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
577 T object = frameState.apop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
578 if (type instanceof ResolvedJavaType) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
579 JavaTypeProfile profileForTypeCheck = getProfileForTypeCheck((ResolvedJavaType) type); |
15837
6fe57ff3f02c
Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents:
15311
diff
changeset
|
580 T checkCastNode = append(createCheckCast((ResolvedJavaType) type, object, profileForTypeCheck, false)); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
581 frameState.apush(checkCastNode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
582 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
583 handleUnresolvedCheckCast(type, object); |
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 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
586 |
15837
6fe57ff3f02c
Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents:
15311
diff
changeset
|
587 protected abstract T createInstanceOf(ResolvedJavaType type, T object, JavaTypeProfile profileForTypeCheck); |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
588 |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
589 protected abstract T genConditional(T x); |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
590 |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
591 private void genInstanceOf() { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
592 int cpi = getStream().readCPI(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
593 JavaType type = lookupType(cpi, INSTANCEOF); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
594 T object = frameState.apop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
595 if (type instanceof ResolvedJavaType) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
596 ResolvedJavaType resolvedType = (ResolvedJavaType) type; |
15837
6fe57ff3f02c
Rename methods to have consistent names, allow subclasses of bytecode parsers
Christian Wimmer <christian.wimmer@oracle.com>
parents:
15311
diff
changeset
|
597 T instanceOfNode = createInstanceOf((ResolvedJavaType) type, object, getProfileForTypeCheck(resolvedType)); |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
598 frameState.ipush(append(genConditional(genUnique(instanceOfNode)))); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
599 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
600 handleUnresolvedInstanceOf(type, object); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
601 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
602 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
603 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
604 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
|
605 |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
606 void genNewInstance(int cpi) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
607 JavaType type = lookupType(cpi, NEW); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
608 if (type instanceof ResolvedJavaType && ((ResolvedJavaType) type).isInitialized()) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
609 frameState.apush(append(createNewInstance((ResolvedJavaType) type, true))); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
610 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
611 handleUnresolvedNewInstance(type); |
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 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
615 /** |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
616 * 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
|
617 * {@link Bytecodes#NEWARRAY} bytecode. |
14899 | 618 * |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
619 * @param code the array type code |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
620 * @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
|
621 */ |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
622 public static Class<?> arrayTypeCodeToClass(int code) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
623 // Checkstyle: stop |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
624 switch (code) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
625 case 4: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
626 return boolean.class; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
627 case 5: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
628 return char.class; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
629 case 6: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
630 return float.class; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
631 case 7: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
632 return double.class; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
633 case 8: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
634 return byte.class; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
635 case 9: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
636 return short.class; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
637 case 10: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
638 return int.class; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
639 case 11: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
640 return long.class; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
641 default: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
642 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
|
643 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
644 // Checkstyle: resume |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
645 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
646 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
647 private void genNewPrimitiveArray(int typeCode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
648 Class<?> clazz = arrayTypeCodeToClass(typeCode); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
649 ResolvedJavaType elementType = metaAccess.lookupJavaType(clazz); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
650 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
|
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 private void genNewObjectArray(int cpi) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
654 JavaType type = lookupType(cpi, ANEWARRAY); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
655 T length = frameState.ipop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
656 if (type instanceof ResolvedJavaType) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
657 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
|
658 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
659 handleUnresolvedNewObjectArray(type, length); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
660 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
661 |
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 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
664 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
|
665 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
666 private void genNewMultiArray(int cpi) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
667 JavaType type = lookupType(cpi, MULTIANEWARRAY); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
668 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
|
669 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
|
670 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
|
671 dims.set(i, frameState.ipop()); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
672 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
673 if (type instanceof ResolvedJavaType) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
674 frameState.apush(append(createNewMultiArray((ResolvedJavaType) type, dims))); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
675 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
676 handleUnresolvedNewMultiArray(type, dims); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
677 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
678 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
679 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
680 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
|
681 |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
682 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
|
683 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
684 private void genGetField(JavaField field) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
685 emitExplicitExceptions(frameState.peek(0), null); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
686 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
687 Kind kind = field.getKind(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
688 T receiver = frameState.apop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
689 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
|
690 appendOptimizedLoadField(kind, genLoadField(receiver, (ResolvedJavaField) field)); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
691 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
692 handleUnresolvedLoadField(field, receiver); |
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 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
695 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
696 protected abstract void emitNullCheck(T receiver); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
697 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
698 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
|
699 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
700 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
|
701 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
702 protected abstract T genArrayLength(T x); |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
703 |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
704 protected void emitExplicitExceptions(T receiver, T outOfBoundsIndex) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
705 assert receiver != null; |
18825
bf382ef59838
Avoid using placeholder nodes when emitting explicit exceptions. Introduce StressExplictExceptionCode flag for debugging.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18818
diff
changeset
|
706 if (graphBuilderConfig.omitAllExceptionEdges() || |
bf382ef59838
Avoid using placeholder nodes when emitting explicit exceptions. Introduce StressExplictExceptionCode flag for debugging.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18818
diff
changeset
|
707 (optimisticOpts.useExceptionProbabilityForOperations() && profilingInfo.getExceptionSeen(bci()) == TriState.FALSE && !GraalOptions.StressExplicitExceptionCode.getValue())) { |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
708 return; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
709 } |
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 emitNullCheck(receiver); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
712 if (outOfBoundsIndex != null) { |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
713 T length = append(genArrayLength(receiver)); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
714 emitBoundsCheck(outOfBoundsIndex, length); |
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 EXPLICIT_EXCEPTIONS.increment(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
717 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
718 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
719 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
|
720 |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
721 private void genPutField(JavaField field) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
722 emitExplicitExceptions(frameState.peek(1), null); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
723 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
724 T value = frameState.pop(field.getKind().getStackKind()); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
725 T receiver = frameState.apop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
726 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
|
727 appendOptimizedStoreField(genStoreField(receiver, (ResolvedJavaField) field, value)); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
728 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
729 handleUnresolvedStoreField(field, value, receiver); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
730 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
731 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
732 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
733 private void genGetStatic(JavaField field) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
734 Kind kind = field.getKind(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
735 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
|
736 appendOptimizedLoadField(kind, genLoadField(null, (ResolvedJavaField) field)); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
737 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
738 handleUnresolvedLoadField(field, null); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
739 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
740 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
741 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
742 private void genPutStatic(JavaField field) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
743 T value = frameState.pop(field.getKind().getStackKind()); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
744 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
|
745 appendOptimizedStoreField(genStoreField(null, (ResolvedJavaField) field, value)); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
746 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
747 handleUnresolvedStoreField(field, value, null); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
748 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
749 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
750 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
751 protected void appendOptimizedStoreField(T store) { |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
752 append(store); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
753 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
754 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
755 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
|
756 // append the load to the instruction |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
757 T optimized = append(load); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
758 frameState.push(kind.getStackKind(), optimized); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
759 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
760 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
761 protected abstract void genInvokeStatic(JavaMethod target); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
762 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
763 protected abstract void genInvokeInterface(JavaMethod target); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
764 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
765 protected abstract void genInvokeDynamic(JavaMethod target); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
766 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
767 protected abstract void genInvokeVirtual(JavaMethod target); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
768 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
769 protected abstract void genInvokeSpecial(JavaMethod target); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
770 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
771 protected abstract void genReturn(T x); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
772 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
773 protected abstract T genMonitorEnter(T x); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
774 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
775 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
|
776 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
777 protected abstract void genJsr(int dest); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
778 |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
779 protected abstract void genRet(int localIndex); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
780 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
781 private double[] switchProbability(int numberOfCases, int bci) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
782 double[] prob = profilingInfo.getSwitchProbabilities(bci); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
783 if (prob != null) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
784 assert prob.length == numberOfCases; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
785 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
786 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
|
787 prob = new double[numberOfCases]; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
788 for (int i = 0; i < numberOfCases; i++) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
789 prob[i] = 1.0d / numberOfCases; |
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 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
792 assert allPositive(prob); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
793 return prob; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
794 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
795 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
796 private static boolean allPositive(double[] a) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
797 for (double d : a) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
798 if (d < 0) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
799 return false; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
800 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
801 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
802 return true; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
803 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
804 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
805 /** |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
806 * Helper function that sums up the probabilities of all keys that lead to a specific successor. |
14899 | 807 * |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
808 * @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
|
809 */ |
15028
7ee9decb2784
AbstractBytecodeParser: rework genIntegerSwitch.
Josef Eisl <josef.eisl@jku.at>
parents:
15027
diff
changeset
|
810 public static double[] successorProbabilites(int successorCount, int[] keySuccessors, double[] keyProbabilities) { |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
811 double[] probability = new double[successorCount]; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
812 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
|
813 probability[keySuccessors[i]] += keyProbabilities[i]; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
814 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
815 return probability; |
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 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
818 private void genSwitch(BytecodeSwitch bs) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
819 int bci = bci(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
820 T value = frameState.ipop(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
821 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
822 int nofCases = bs.numberOfCases(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
823 double[] keyProbabilities = switchProbability(nofCases + 1, bci); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
824 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
825 Map<Integer, SuccessorInfo> bciToBlockSuccessorIndex = new HashMap<>(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
826 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
|
827 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
|
828 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
|
829 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
|
830 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
831 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
832 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
833 ArrayList<BciBlock> actualSuccessors = new ArrayList<>(); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
834 int[] keys = new int[nofCases]; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
835 int[] keySuccessors = new int[nofCases + 1]; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
836 int deoptSuccessorIndex = -1; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
837 int nextSuccessorIndex = 0; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
838 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
|
839 if (i < nofCases) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
840 keys[i] = bs.keyAt(i); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
841 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
842 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
843 if (isNeverExecutedCode(keyProbabilities[i])) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
844 if (deoptSuccessorIndex < 0) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
845 deoptSuccessorIndex = nextSuccessorIndex++; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
846 actualSuccessors.add(null); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
847 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
848 keySuccessors[i] = deoptSuccessorIndex; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
849 } else { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
850 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
|
851 SuccessorInfo info = bciToBlockSuccessorIndex.get(targetBci); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
852 if (info.actualIndex < 0) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
853 info.actualIndex = nextSuccessorIndex++; |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
854 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
|
855 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
856 keySuccessors[i] = info.actualIndex; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
857 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
858 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
859 |
15028
7ee9decb2784
AbstractBytecodeParser: rework genIntegerSwitch.
Josef Eisl <josef.eisl@jku.at>
parents:
15027
diff
changeset
|
860 genIntegerSwitch(value, actualSuccessors, keys, keyProbabilities, keySuccessors); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
861 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
862 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
863 |
15028
7ee9decb2784
AbstractBytecodeParser: rework genIntegerSwitch.
Josef Eisl <josef.eisl@jku.at>
parents:
15027
diff
changeset
|
864 protected abstract void genIntegerSwitch(T value, ArrayList<BciBlock> actualSuccessors, int[] keys, double[] keyProbabilities, int[] keySuccessors); |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
865 |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
866 private static class SuccessorInfo { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
867 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
868 int blockIndex; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
869 int actualIndex; |
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 public SuccessorInfo(int blockSuccessorIndex) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
872 this.blockIndex = blockSuccessorIndex; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
873 actualIndex = -1; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
874 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
875 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
876 |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
877 protected abstract T appendConstant(JavaConstant constant); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
878 |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
879 protected abstract T append(T v); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
880 |
15030
e098038093d5
AbstractBytecodeParser: move createTarget to GraphBuilderPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
15029
diff
changeset
|
881 protected boolean isNeverExecutedCode(double probability) { |
18920
4af661af76fd
Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18918
diff
changeset
|
882 return probability == 0 && optimisticOpts.removeNeverExecutedCode(); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
883 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
884 |
16886
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
885 protected double branchProbability() { |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
886 double probability = profilingInfo.getBranchTakenProbability(bci()); |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
887 if (probability < 0) { |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
888 assert probability == -1 : "invalid probability"; |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
889 Debug.log("missing probability in %s at bci %d", method, bci()); |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
890 probability = 0.5; |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
891 } |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
892 |
18920
4af661af76fd
Restructuring in the GraphBuilder to have less fields in the phase instance.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18918
diff
changeset
|
893 if (!optimisticOpts.removeNeverExecutedCode()) { |
16886
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
894 if (probability == 0) { |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
895 probability = 0.0000001; |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
896 } else if (probability == 1) { |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
897 probability = 0.999999; |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
898 } |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
899 } |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
900 return probability; |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
901 } |
b61b88c9c103
Make handling of removeNeverExecutedCode more consistent
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16841
diff
changeset
|
902 |
14894
3676333a46bb
Use BciBlock in BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14893
diff
changeset
|
903 protected abstract void iterateBytecodesForBlock(BciBlock block); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
904 |
18817
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
905 public final void processBytecode(int bci, int opcode) { |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
906 int cpi; |
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 // Checkstyle: stop |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
909 // @formatter:off |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
910 switch (opcode) { |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
911 case NOP : /* nothing to do */ break; |
18490
ca81508f2a19
Generalize NULL handling to work on arbitrary pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
18361
diff
changeset
|
912 case ACONST_NULL : frameState.apush(appendConstant(JavaConstant.NULL_POINTER)); break; |
16036
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
913 case ICONST_M1 : // fall through |
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
914 case ICONST_0 : // fall through |
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
915 case ICONST_1 : // fall through |
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
916 case ICONST_2 : // fall through |
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
917 case ICONST_3 : // fall through |
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
918 case ICONST_4 : // fall through |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
919 case ICONST_5 : frameState.ipush(appendConstant(JavaConstant.forInt(opcode - ICONST_0))); break; |
16036
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
920 case LCONST_0 : // fall through |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
921 case LCONST_1 : frameState.lpush(appendConstant(JavaConstant.forLong(opcode - LCONST_0))); break; |
16036
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
922 case FCONST_0 : // fall through |
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
923 case FCONST_1 : // fall through |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
924 case FCONST_2 : frameState.fpush(appendConstant(JavaConstant.forFloat(opcode - FCONST_0))); break; |
16036
4161a58e48cb
refactor/simplify Constant
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15837
diff
changeset
|
925 case DCONST_0 : // fall through |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
926 case DCONST_1 : frameState.dpush(appendConstant(JavaConstant.forDouble(opcode - DCONST_0))); break; |
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
927 case BIPUSH : frameState.ipush(appendConstant(JavaConstant.forInt(stream.readByte()))); break; |
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
17341
diff
changeset
|
928 case SIPUSH : frameState.ipush(appendConstant(JavaConstant.forInt(stream.readShort()))); break; |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
929 case LDC : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
930 case LDC_W : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
931 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
|
932 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
|
933 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
|
934 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
|
935 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
|
936 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
|
937 case ILOAD_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
938 case ILOAD_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
939 case ILOAD_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
940 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
|
941 case LLOAD_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
942 case LLOAD_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
943 case LLOAD_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
944 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
|
945 case FLOAD_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
946 case FLOAD_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
947 case FLOAD_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
948 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
|
949 case DLOAD_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
950 case DLOAD_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
951 case DLOAD_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
952 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
|
953 case ALOAD_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
954 case ALOAD_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
955 case ALOAD_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
956 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
|
957 case IALOAD : genLoadIndexed(Kind.Int ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
958 case LALOAD : genLoadIndexed(Kind.Long ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
959 case FALOAD : genLoadIndexed(Kind.Float ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
960 case DALOAD : genLoadIndexed(Kind.Double); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
961 case AALOAD : genLoadIndexed(Kind.Object); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
962 case BALOAD : genLoadIndexed(Kind.Byte ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
963 case CALOAD : genLoadIndexed(Kind.Char ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
964 case SALOAD : genLoadIndexed(Kind.Short ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
965 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
|
966 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
|
967 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
|
968 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
|
969 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
|
970 case ISTORE_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
971 case ISTORE_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
972 case ISTORE_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
973 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
|
974 case LSTORE_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
975 case LSTORE_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
976 case LSTORE_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
977 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
|
978 case FSTORE_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
979 case FSTORE_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
980 case FSTORE_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
981 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
|
982 case DSTORE_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
983 case DSTORE_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
984 case DSTORE_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
985 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
|
986 case ASTORE_0 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
987 case ASTORE_1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
988 case ASTORE_2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
989 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
|
990 case IASTORE : genStoreIndexed(Kind.Int ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
991 case LASTORE : genStoreIndexed(Kind.Long ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
992 case FASTORE : genStoreIndexed(Kind.Float ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
993 case DASTORE : genStoreIndexed(Kind.Double); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
994 case AASTORE : genStoreIndexed(Kind.Object); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
995 case BASTORE : genStoreIndexed(Kind.Byte ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
996 case CASTORE : genStoreIndexed(Kind.Char ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
997 case SASTORE : genStoreIndexed(Kind.Short ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
998 case POP : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
999 case POP2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1000 case DUP : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1001 case DUP_X1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1002 case DUP_X2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1003 case DUP2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1004 case DUP2_X1 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1005 case DUP2_X2 : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1006 case SWAP : stackOp(opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1007 case IADD : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1008 case ISUB : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1009 case IMUL : genArithmeticOp(Kind.Int, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1010 case IDIV : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1011 case IREM : genIntegerDivOp(Kind.Int, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1012 case LADD : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1013 case LSUB : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1014 case LMUL : genArithmeticOp(Kind.Long, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1015 case LDIV : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1016 case LREM : genIntegerDivOp(Kind.Long, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1017 case FADD : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1018 case FSUB : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1019 case FMUL : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1020 case FDIV : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1021 case FREM : genArithmeticOp(Kind.Float, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1022 case DADD : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1023 case DSUB : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1024 case DMUL : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1025 case DDIV : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1026 case DREM : genArithmeticOp(Kind.Double, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1027 case INEG : genNegateOp(Kind.Int); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1028 case LNEG : genNegateOp(Kind.Long); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1029 case FNEG : genNegateOp(Kind.Float); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1030 case DNEG : genNegateOp(Kind.Double); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1031 case ISHL : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1032 case ISHR : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1033 case IUSHR : genShiftOp(Kind.Int, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1034 case IAND : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1035 case IOR : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1036 case IXOR : genLogicOp(Kind.Int, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1037 case LSHL : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1038 case LSHR : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1039 case LUSHR : genShiftOp(Kind.Long, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1040 case LAND : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1041 case LOR : // fall through |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1042 case LXOR : genLogicOp(Kind.Long, opcode); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1043 case IINC : genIncrement(); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1044 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
|
1045 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
|
1046 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
|
1047 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
|
1048 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
|
1049 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
|
1050 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
|
1051 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
|
1052 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
|
1053 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
|
1054 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
|
1055 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
|
1056 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
|
1057 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
|
1058 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
|
1059 case LCMP : genCompareOp(Kind.Long, false); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1060 case FCMPL : genCompareOp(Kind.Float, true); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1061 case FCMPG : genCompareOp(Kind.Float, false); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1062 case DCMPL : genCompareOp(Kind.Double, true); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1063 case DCMPG : genCompareOp(Kind.Double, false); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1064 case IFEQ : genIfZero(Condition.EQ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1065 case IFNE : genIfZero(Condition.NE); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1066 case IFLT : genIfZero(Condition.LT); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1067 case IFGE : genIfZero(Condition.GE); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1068 case IFGT : genIfZero(Condition.GT); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1069 case IFLE : genIfZero(Condition.LE); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1070 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
|
1071 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
|
1072 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
|
1073 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
|
1074 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
|
1075 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
|
1076 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
|
1077 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
|
1078 case GOTO : genGoto(); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1079 case JSR : genJsr(stream.readBranchDest()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1080 case RET : genRet(stream.readLocalIndex()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1081 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
|
1082 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
|
1083 case IRETURN : genReturn(frameState.ipop()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1084 case LRETURN : genReturn(frameState.lpop()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1085 case FRETURN : genReturn(frameState.fpop()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1086 case DRETURN : genReturn(frameState.dpop()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1087 case ARETURN : genReturn(frameState.apop()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1088 case RETURN : genReturn(null); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1089 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
|
1090 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
|
1091 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
|
1092 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
|
1093 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
|
1094 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
|
1095 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
|
1096 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
|
1097 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
|
1098 case NEW : genNewInstance(stream.readCPI()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1099 case NEWARRAY : genNewPrimitiveArray(stream.readLocalIndex()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1100 case ANEWARRAY : genNewObjectArray(stream.readCPI()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1101 case ARRAYLENGTH : genArrayLength(); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1102 case ATHROW : genThrow(); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1103 case CHECKCAST : genCheckCast(); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1104 case INSTANCEOF : genInstanceOf(); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1105 case MONITORENTER : genMonitorEnter(frameState.apop()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1106 case MONITOREXIT : genMonitorExit(frameState.apop(), null); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1107 case MULTIANEWARRAY : genNewMultiArray(stream.readCPI()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1108 case IFNULL : genIfNull(Condition.EQ); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1109 case IFNONNULL : genIfNull(Condition.NE); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1110 case GOTO_W : genGoto(); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1111 case JSR_W : genJsr(stream.readBranchDest()); break; |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1112 case BREAKPOINT: |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1113 throw new BailoutException("concurrent setting of breakpoint"); |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1114 default: |
17341
e3f3233ec6cd
refactor BailoutException to include information about non-permanent errors
Lukas Stadler <lukas.stadler@oracle.com>
parents:
17131
diff
changeset
|
1115 throw new BailoutException("Unsupported opcode %d (%s) [bci=%d]", opcode, nameOf(opcode), bci); |
14892
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1116 } |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1117 // @formatter:on |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1118 // Checkstyle: resume |
75104db5215e
Move Bytecode parsing into BytecodeParseHelper (defunc).
Josef Eisl <josef.eisl@jku.at>
parents:
14830
diff
changeset
|
1119 } |
14893
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
1120 |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
1121 private void genArrayLength() { |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
1122 frameState.ipush(append(genArrayLength(frameState.apop()))); |
f97c85e6366d
Finished cleaning up BytecodeParseHelper abstract base class.
Josef Eisl <josef.eisl@jku.at>
parents:
14892
diff
changeset
|
1123 } |
14899 | 1124 |
14900
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1125 public ResolvedJavaMethod getMethod() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1126 return method; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1127 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1128 |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1129 public F getFrameState() { |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1130 return frameState; |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1131 } |
be4c28683c08
Moved bytecode parsing from GraphBuilderPhase to BytecodeParseHelper.
Josef Eisl <josef.eisl@jku.at>
parents:
14899
diff
changeset
|
1132 |
14922
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
1133 protected void traceInstruction(int bci, int opcode, boolean blockStart) { |
18817
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1134 if (Debug.isEnabled() && Options.TraceBytecodeParserLevel.getValue() >= TRACELEVEL_INSTRUCTIONS && Debug.isLogEnabled()) { |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1135 traceInstructionHelper(bci, opcode, blockStart); |
14922
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
1136 } |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
1137 } |
ea57ed7085cf
Move options from GraphBuilderPhase to AbstractBytecodeParser.
Josef Eisl <josef.eisl@jku.at>
parents:
14902
diff
changeset
|
1138 |
18817
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1139 private void traceInstructionHelper(int bci, int opcode, boolean blockStart) { |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1140 StringBuilder sb = new StringBuilder(40); |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1141 sb.append(blockStart ? '+' : '|'); |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1142 if (bci < 10) { |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1143 sb.append(" "); |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1144 } else if (bci < 100) { |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1145 sb.append(' '); |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1146 } |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1147 sb.append(bci).append(": ").append(Bytecodes.nameOf(opcode)); |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1148 for (int i = bci + 1; i < stream.nextBCI(); ++i) { |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1149 sb.append(' ').append(stream.readUByte(i)); |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1150 } |
18818
adf3a8581a67
Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18817
diff
changeset
|
1151 if (!currentBlock.getJsrScope().isEmpty()) { |
adf3a8581a67
Factor JSR info data into separate data structure from BciBlock.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18817
diff
changeset
|
1152 sb.append(' ').append(currentBlock.getJsrScope()); |
18817
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1153 } |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1154 Debug.log("%s", sb); |
b51cfbc2bd07
Make allocation of loop header array in BciBlockMapping lazy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18674
diff
changeset
|
1155 } |
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
|
1156 } |