# HG changeset patch # User Niclas Adlertz # Date 1395224947 0 # Node ID 3d04915a55c6f406b2349cf7095473670a5befef # Parent 80147dac0d6e4df55011d06274449269f5c97d45 added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing diff -r 80147dac0d6e -r 3d04915a55c6 graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java Tue Mar 18 09:56:20 2014 +0000 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java Wed Mar 19 10:29:07 2014 +0000 @@ -3,7 +3,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; -public abstract class AbstractFrameStateBuilder { +public abstract class AbstractFrameStateBuilder { protected final ResolvedJavaMethod method; protected int stackSize; diff -r 80147dac0d6e -r 3d04915a55c6 graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParseHelper.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParseHelper.java Wed Mar 19 10:29:07 2014 +0000 @@ -0,0 +1,116 @@ +package com.oracle.graal.java; + +import static com.oracle.graal.bytecode.Bytecodes.*; + +import com.oracle.graal.api.meta.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.*; + +public class BytecodeParseHelper { + + private AbstractFrameStateBuilder frameState; + + public BytecodeParseHelper(AbstractFrameStateBuilder frameState) { + this.frameState = frameState; + } + + public void setCurrentFrameState(AbstractFrameStateBuilder frameState) { + this.frameState = frameState; + } + + public void loadLocal(int index, Kind kind) { + frameState.push(kind, frameState.loadLocal(index)); + } + + public void storeLocal(Kind kind, int index) { + T value; + if (kind == Kind.Object) { + value = frameState.xpop(); + // astore and astore_ may be used to store a returnAddress (jsr) + assert value.getKind() == Kind.Object || value.getKind() == Kind.Int; + } else { + value = frameState.pop(kind); + } + frameState.storeLocal(index, value); + } + + public void stackOp(int opcode) { + switch (opcode) { + case POP: { + frameState.xpop(); + break; + } + case POP2: { + frameState.xpop(); + frameState.xpop(); + break; + } + case DUP: { + T w = frameState.xpop(); + frameState.xpush(w); + frameState.xpush(w); + break; + } + case DUP_X1: { + T w1 = frameState.xpop(); + T w2 = frameState.xpop(); + frameState.xpush(w1); + frameState.xpush(w2); + frameState.xpush(w1); + break; + } + case DUP_X2: { + T w1 = frameState.xpop(); + T w2 = frameState.xpop(); + T w3 = frameState.xpop(); + frameState.xpush(w1); + frameState.xpush(w3); + frameState.xpush(w2); + frameState.xpush(w1); + break; + } + case DUP2: { + T w1 = frameState.xpop(); + T w2 = frameState.xpop(); + frameState.xpush(w2); + frameState.xpush(w1); + frameState.xpush(w2); + frameState.xpush(w1); + break; + } + case DUP2_X1: { + T w1 = frameState.xpop(); + T w2 = frameState.xpop(); + T w3 = frameState.xpop(); + frameState.xpush(w2); + frameState.xpush(w1); + frameState.xpush(w3); + frameState.xpush(w2); + frameState.xpush(w1); + break; + } + case DUP2_X2: { + T w1 = frameState.xpop(); + T w2 = frameState.xpop(); + T w3 = frameState.xpop(); + T w4 = frameState.xpop(); + frameState.xpush(w2); + frameState.xpush(w1); + frameState.xpush(w4); + frameState.xpush(w3); + frameState.xpush(w2); + frameState.xpush(w1); + break; + } + case SWAP: { + T w1 = frameState.xpop(); + T w2 = frameState.xpop(); + frameState.xpush(w1); + frameState.xpush(w2); + break; + } + default: + throw GraalInternalError.shouldNotReachHere(); + } + } +} diff -r 80147dac0d6e -r 3d04915a55c6 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Mar 18 09:56:20 2014 +0000 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Wed Mar 19 10:29:07 2014 +0000 @@ -118,6 +118,7 @@ private BytecodeStream stream; // the bytecode stream protected HIRFrameStateBuilder frameState; // the current execution state + private BytecodeParseHelper parseHelper; private Block currentBlock; private ValueNode methodSynchronizedObject; @@ -203,6 +204,7 @@ methodSynchronizedObject = null; this.currentGraph = graph; this.frameState = new HIRFrameStateBuilder(method, graph, graphBuilderConfig.eagerResolving()); + this.parseHelper = new BytecodeParseHelper<>(frameState); TTY.Filter filter = new TTY.Filter(PrintFilter.getValue(), method); try { build(); @@ -304,10 +306,6 @@ return stream.currentBCI(); } - private void loadLocal(int index, Kind kind) { - frameState.push(kind, frameState.loadLocal(index)); - } - private void storeLocal(Kind kind, int index) { ValueNode value; if (kind == Kind.Object) { @@ -572,7 +570,6 @@ default: throw GraalInternalError.shouldNotReachHere(); } - } private void genArithmeticOp(Kind result, int opcode) { @@ -1640,6 +1637,7 @@ lastInstr = block.firstInstruction; frameState = block.entryState; + parseHelper.setCurrentFrameState(frameState); currentBlock = block; frameState.cleanupDeletedPhis(); @@ -1893,31 +1891,31 @@ case LDC : // fall through case LDC_W : // fall through case LDC2_W : genLoadConstant(stream.readCPI(), opcode); break; - case ILOAD : loadLocal(stream.readLocalIndex(), Kind.Int); break; - case LLOAD : loadLocal(stream.readLocalIndex(), Kind.Long); break; - case FLOAD : loadLocal(stream.readLocalIndex(), Kind.Float); break; - case DLOAD : loadLocal(stream.readLocalIndex(), Kind.Double); break; - case ALOAD : loadLocal(stream.readLocalIndex(), Kind.Object); break; + case ILOAD : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Int); break; + case LLOAD : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Long); break; + case FLOAD : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Float); break; + case DLOAD : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Double); break; + case ALOAD : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Object); break; case ILOAD_0 : // fall through case ILOAD_1 : // fall through case ILOAD_2 : // fall through - case ILOAD_3 : loadLocal(opcode - ILOAD_0, Kind.Int); break; + case ILOAD_3 : parseHelper.loadLocal(opcode - ILOAD_0, Kind.Int); break; case LLOAD_0 : // fall through case LLOAD_1 : // fall through case LLOAD_2 : // fall through - case LLOAD_3 : loadLocal(opcode - LLOAD_0, Kind.Long); break; + case LLOAD_3 : parseHelper.loadLocal(opcode - LLOAD_0, Kind.Long); break; case FLOAD_0 : // fall through case FLOAD_1 : // fall through case FLOAD_2 : // fall through - case FLOAD_3 : loadLocal(opcode - FLOAD_0, Kind.Float); break; + case FLOAD_3 : parseHelper.loadLocal(opcode - FLOAD_0, Kind.Float); break; case DLOAD_0 : // fall through case DLOAD_1 : // fall through case DLOAD_2 : // fall through - case DLOAD_3 : loadLocal(opcode - DLOAD_0, Kind.Double); break; + case DLOAD_3 : parseHelper.loadLocal(opcode - DLOAD_0, Kind.Double); break; case ALOAD_0 : // fall through case ALOAD_1 : // fall through case ALOAD_2 : // fall through - case ALOAD_3 : loadLocal(opcode - ALOAD_0, Kind.Object); break; + case ALOAD_3 : parseHelper.loadLocal(opcode - ALOAD_0, Kind.Object); break; case IALOAD : genLoadIndexed(Kind.Int ); break; case LALOAD : genLoadIndexed(Kind.Long ); break; case FALOAD : genLoadIndexed(Kind.Float ); break; diff -r 80147dac0d6e -r 3d04915a55c6 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/Variable.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/Variable.java Tue Mar 18 09:56:20 2014 +0000 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/Variable.java Wed Mar 19 10:29:07 2014 +0000 @@ -24,12 +24,13 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.nodes.*; /** * Represents a value that is yet to be bound to a machine location (such as a {@link RegisterValue} * or {@link StackSlot}) by a register allocator. */ -public final class Variable extends AllocatableValue { +public final class Variable extends AllocatableValue implements KindInterface { private static final long serialVersionUID = 4507578431686109809L; diff -r 80147dac0d6e -r 3d04915a55c6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/KindInterface.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/KindInterface.java Wed Mar 19 10:29:07 2014 +0000 @@ -0,0 +1,9 @@ +package com.oracle.graal.nodes; + +import com.oracle.graal.api.meta.*; + +public interface KindInterface { + + public Kind getKind(); + +} diff -r 80147dac0d6e -r 3d04915a55c6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Tue Mar 18 09:56:20 2014 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Wed Mar 19 10:29:07 2014 +0000 @@ -31,7 +31,7 @@ * This class represents a value within the graph, including local variables, phis, and all other * instructions. */ -public abstract class ValueNode extends ScheduledNode implements StampProvider { +public abstract class ValueNode extends ScheduledNode implements StampProvider, KindInterface { /** * The kind of this value. This is {@link Kind#Void} for instructions that produce no value. diff -r 80147dac0d6e -r 3d04915a55c6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNodeUtil.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNodeUtil.java Tue Mar 18 09:56:20 2014 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNodeUtil.java Wed Mar 19 10:29:07 2014 +0000 @@ -87,7 +87,7 @@ /** * Converts a given instruction to a value string. The representation of an node as a value is * formed by concatenating the {@linkplain com.oracle.graal.api.meta.Kind#getTypeChar character} - * denoting its {@linkplain ValueNode#kind kind} and its id. For example, {@code "i13"}. + * denoting its {@linkplain ValueNode#getKind kind} and its id. For example, {@code "i13"}. * * @param value the instruction to convert to a value string. If {@code value == null}, then "-" * is returned.