# HG changeset patch # User Josef Eisl # Date 1395830947 -3600 # Node ID 47e4d2e01c6e1f8e3000ac668576a0b759951fb9 # Parent f41429da98196d9df67708a420d1d82a0a6fbfac Split LIRGenerator and fix AMD64 backend. diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineCompiler.java --- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineCompiler.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineCompiler.java Wed Mar 26 11:49:07 2014 +0100 @@ -182,7 +182,7 @@ for (BciBlock block : blockMap.blocks) { - lirGen.doBlock(block, method, this); + // lirGen.doBlock(block, method, this); } // indent.outdent(); @@ -192,7 +192,8 @@ throw Debug.handle(e); } - try (Scope s = Debug.scope("Allocator", lirGen)) { + // try (Scope s = Debug.scope("Allocator", nodeLirGen)) { + try (Scope s = Debug.scope("Allocator")) { if (backend.shouldAllocateRegisters()) { new LinearScan(target, lir, frameMap).allocate(); @@ -790,7 +791,8 @@ // throw new BailoutException("unbalanced monitors"); // } - lirGen.visitReturn(x); + // lirGen.visitReturn(x); + throw GraalInternalError.unimplemented(); } public void setParameter(int i, Variable emitMove) { diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Wed Mar 26 11:49:07 2014 +0100 @@ -215,7 +215,7 @@ return new AMD64AddressValue(target().wordKind, baseRegister, indexRegister, scaleEnum, displacementInt); } - protected AMD64AddressValue asAddressValue(Value address) { + public AMD64AddressValue asAddressValue(Value address) { if (address instanceof AMD64AddressValue) { return (AMD64AddressValue) address; } else { @@ -256,13 +256,6 @@ } @Override - protected void emitIndirectCall(IndirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { - AllocatableValue targetAddress = AMD64.rax.asValue(); - emitMove(targetAddress, operand(callTarget.computedAddress())); - append(new AMD64Call.IndirectCallOp(callTarget.target(), result, parameters, temps, targetAddress, callState)); - } - - @Override public void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, double overflowProbability) { append(new BranchOp(ConditionFlag.Overflow, overflow, noOverflow, overflowProbability)); } @@ -360,12 +353,6 @@ } @Override - public void emitNullCheck(ValueNode v, DeoptimizingNode deopt) { - assert v.getKind() == Kind.Object : v + " - " + v.stamp() + " @ " + deopt; - append(new AMD64Move.NullCheckOp(load(operand(v)), state(deopt))); - } - - @Override public Variable emitNegate(Value inputVal) { AllocatableValue input = asAllocatable(inputVal); Variable result = newVariable(input.getKind()); @@ -505,33 +492,6 @@ } } - @Override - protected boolean peephole(ValueNode valueNode) { - if ((valueNode instanceof IntegerDivNode) || (valueNode instanceof IntegerRemNode)) { - FixedBinaryNode divRem = (FixedBinaryNode) valueNode; - FixedNode node = divRem.next(); - while (node instanceof FixedWithNextNode) { - FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) node; - if (((fixedWithNextNode instanceof IntegerDivNode) || (fixedWithNextNode instanceof IntegerRemNode)) && fixedWithNextNode.getClass() != divRem.getClass()) { - FixedBinaryNode otherDivRem = (FixedBinaryNode) fixedWithNextNode; - if (otherDivRem.x() == divRem.x() && otherDivRem.y() == divRem.y() && operand(otherDivRem) == null) { - Value[] results = emitIntegerDivRem(operand(divRem.x()), operand(divRem.y()), (DeoptimizingNode) valueNode); - if (divRem instanceof IntegerDivNode) { - setResult(divRem, results[0]); - setResult(otherDivRem, results[1]); - } else { - setResult(divRem, results[1]); - setResult(otherDivRem, results[0]); - } - return true; - } - } - node = fixedWithNextNode.next(); - } - } - return false; - } - private void emitDivRem(AMD64Arithmetic op, Value a, Value b, LIRFrameState state) { AllocatableValue rax = AMD64.rax.asValue(a.getPlatformKind()); emitMove(rax, a); @@ -959,7 +919,7 @@ } @Override - protected void emitReturn(Value input) { + public void emitReturn(Value input) { append(new ReturnOp(input)); } @@ -975,19 +935,4 @@ append(new TableSwitchOp(lowKey, defaultTarget, targets, key, newVariable(target().wordKind), newVariable(key.getPlatformKind()))); } - @Override - public void visitBreakpointNode(BreakpointNode node) { - JavaType[] sig = new JavaType[node.arguments().size()]; - for (int i = 0; i < sig.length; i++) { - sig[i] = node.arguments().get(i).stamp().javaType(getMetaAccess()); - } - - Value[] parameters = visitInvokeArguments(res.getFrameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, sig, target(), false), node.arguments()); - append(new AMD64BreakpointOp(parameters)); - } - - @Override - public void visitInfopointNode(InfopointNode i) { - append(new InfopointOp(stateFor(i.getState()), i.reason)); - } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRGenerator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRGenerator.java Wed Mar 26 11:49:07 2014 +0100 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.graal.compiler.amd64; + +import com.oracle.graal.amd64.*; +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.gen.*; +import com.oracle.graal.lir.*; +import com.oracle.graal.lir.amd64.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.calc.*; + +public abstract class AMD64NodeLIRGenerator extends NodeLIRGenerator { + + public AMD64NodeLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult res, LIRGenerator gen) { + super(graph, cc, res, gen); + } + + @Override + protected void emitIndirectCall(IndirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { + AllocatableValue targetAddress = AMD64.rax.asValue(); + gen.emitMove(targetAddress, operand(callTarget.computedAddress())); + append(new AMD64Call.IndirectCallOp(callTarget.target(), result, parameters, temps, targetAddress, callState)); + } + + @Override + public void emitNullCheck(ValueNode v, DeoptimizingNode deopt) { + assert v.getKind() == Kind.Object : v + " - " + v.stamp() + " @ " + deopt; + append(new AMD64Move.NullCheckOp(gen.load(operand(v)), state(deopt))); + } + + @Override + protected boolean peephole(ValueNode valueNode) { + if ((valueNode instanceof IntegerDivNode) || (valueNode instanceof IntegerRemNode)) { + FixedBinaryNode divRem = (FixedBinaryNode) valueNode; + FixedNode node = divRem.next(); + while (node instanceof FixedWithNextNode) { + FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) node; + if (((fixedWithNextNode instanceof IntegerDivNode) || (fixedWithNextNode instanceof IntegerRemNode)) && fixedWithNextNode.getClass() != divRem.getClass()) { + FixedBinaryNode otherDivRem = (FixedBinaryNode) fixedWithNextNode; + if (otherDivRem.x() == divRem.x() && otherDivRem.y() == divRem.y() && operand(otherDivRem) == null) { + Value[] results = ((AMD64LIRGenerator) gen).emitIntegerDivRem(operand(divRem.x()), operand(divRem.y()), (DeoptimizingNode) valueNode); + if (divRem instanceof IntegerDivNode) { + setResult(divRem, results[0]); + setResult(otherDivRem, results[1]); + } else { + setResult(divRem, results[1]); + setResult(otherDivRem, results[0]); + } + return true; + } + } + node = fixedWithNextNode.next(); + } + } + return false; + } + + @Override + public void visitBreakpointNode(BreakpointNode node) { + JavaType[] sig = new JavaType[node.arguments().size()]; + for (int i = 0; i < sig.length; i++) { + sig[i] = node.arguments().get(i).stamp().javaType(gen.getMetaAccess()); + } + + Value[] parameters = visitInvokeArguments(res.getFrameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, sig, gen.target(), false), node.arguments()); + append(new AMD64BreakpointOp(parameters)); + } + + @Override + public void visitInfopointNode(InfopointNode i) { + append(new InfopointOp(stateFor(i.getState()), i.reason)); + } +} diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Wed Mar 26 11:49:07 2014 +0100 @@ -205,14 +205,14 @@ } - private static void emitBlock(LIRGenerator lirGen, LIRGenerationResult lirGenRes, Block b, StructuredGraph graph, BlockMap> blockMap) { + private static void emitBlock(NodeLIRGenerator nodeLirGen, LIRGenerationResult lirGenRes, Block b, StructuredGraph graph, BlockMap> blockMap) { if (lirGenRes.getLIR().getLIRforBlock(b) == null) { for (Block pred : b.getPredecessors()) { if (!b.isLoopHeader() || !pred.isLoopEnd()) { - emitBlock(lirGen, lirGenRes, pred, graph, blockMap); + emitBlock(nodeLirGen, lirGenRes, pred, graph, blockMap); } } - lirGen.doBlock(b, graph, blockMap); + nodeLirGen.doBlock(b, graph, blockMap); } } @@ -244,10 +244,11 @@ FrameMap frameMap = backend.newFrameMap(); LIRGenerationResult lirGenRes = backend.newLIRGenerationResult(lir, frameMap, stub); LIRGenerator lirGen = backend.newLIRGenerator(graph, cc, lirGenRes); + NodeLIRGenerator nodeLirGen = backend.newNodeLIRGenerator(graph, cc, lirGenRes, lirGen); try (Scope s = Debug.scope("LIRGen", lirGen)) { for (Block b : linearScanOrder) { - emitBlock(lirGen, lirGenRes, b, graph, schedule.getBlockToNodesMap()); + emitBlock(nodeLirGen, lirGenRes, b, graph, schedule.getBlockToNodesMap()); } lirGen.beforeRegisterAllocation(); @@ -256,7 +257,7 @@ throw Debug.handle(e); } - try (Scope s = Debug.scope("Allocator", lirGen)) { + try (Scope s = Debug.scope("Allocator", nodeLirGen)) { if (backend.shouldAllocateRegisters()) { new LinearScan(target, lir, frameMap).allocate(); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java Wed Mar 26 11:49:07 2014 +0100 @@ -880,9 +880,9 @@ indent.outdent(); } - private static LIRGenerator getLIRGeneratorFromDebugContext() { + private static NodeLIRGenerator getNodeLIRGeneratorFromDebugContext() { if (Debug.isEnabled()) { - LIRGenerator lirGen = Debug.contextLookup(LIRGenerator.class); + NodeLIRGenerator lirGen = Debug.contextLookup(NodeLIRGenerator.class); assert lirGen != null; return lirGen; } @@ -890,7 +890,7 @@ } private static ValueNode getValueForOperandFromDebugContext(Value value) { - LIRGenerator gen = getLIRGeneratorFromDebugContext(); + NodeLIRGenerator gen = getNodeLIRGeneratorFromDebugContext(); if (gen != null) { return gen.valueForOperand(value); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Wed Mar 26 11:49:07 2014 +0100 @@ -26,39 +26,31 @@ import static com.oracle.graal.api.meta.Value.*; import static com.oracle.graal.lir.LIR.*; import static com.oracle.graal.lir.LIRValueUtil.*; -import static com.oracle.graal.nodes.ConstantNode.*; import static com.oracle.graal.phases.GraalOptions.*; -import java.lang.reflect.*; import java.util.*; -import java.util.Map.Entry; import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.*; -import com.oracle.graal.compiler.target.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.BlockEndOp; -import com.oracle.graal.lir.StandardOp.JumpOp; import com.oracle.graal.lir.StandardOp.LabelOp; import com.oracle.graal.lir.StandardOp.NoOp; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.PhiNode.PhiType; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.cfg.*; -import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; -import com.oracle.graal.nodes.virtual.*; import com.oracle.graal.options.*; import com.oracle.graal.phases.util.*; /** * This class traverses the HIR instructions and generates LIR instructions from them. */ -public abstract class LIRGenerator implements NodeBasedLIRGeneratorTool, LIRTypeTool { +public abstract class LIRGenerator implements ArithmeticLIRGenerator, LIRGeneratorTool, LIRTypeTool { public static class Options { // @formatter:off @@ -101,12 +93,12 @@ * The block that does or will contain {@link #op}. This is initially the block where the * first usage of the constant is seen during LIR generation. */ - private Block block; + Block block; /** * The variable into which the constant is loaded. */ - private final Variable variable; + final Variable variable; public LoadConstant(Variable variable, Block block, int index, LIRInstruction op) { this.variable = variable; @@ -148,7 +140,7 @@ } } - private Map constantLoads; + Map constantLoads; private ValueNode currentInstruction; private ValueNode lastInstructionPrinted; // Debugging only @@ -222,70 +214,6 @@ } /** - * Returns the operand that has been previously initialized by - * {@link #setResult(ValueNode, Value)} with the result of an instruction. - * - * @param node A node that produces a result value. - */ - @Override - public Value operand(ValueNode node) { - if (nodeOperands == null) { - return null; - } - Value operand = nodeOperands.get(node); - if (operand == null) { - return getConstantOperand(node); - } - return operand; - } - - private Value getConstantOperand(ValueNode node) { - if (!ConstantNodeRecordsUsages) { - Constant value = node.asConstant(); - if (value != null) { - if (canInlineConstant(value)) { - return setResult(node, value); - } else { - Variable loadedValue; - if (constantLoads == null) { - constantLoads = new HashMap<>(); - } - LoadConstant load = constantLoads.get(value); - assert currentBlock instanceof Block; - if (load == null) { - int index = res.getLIR().getLIRforBlock(currentBlock).size(); - loadedValue = emitMove(value); - LIRInstruction op = res.getLIR().getLIRforBlock(currentBlock).get(index); - constantLoads.put(value, new LoadConstant(loadedValue, (Block) currentBlock, index, op)); - } else { - Block dominator = ControlFlowGraph.commonDominator(load.block, (Block) currentBlock); - loadedValue = load.variable; - if (dominator != load.block) { - load.unpin(res.getLIR()); - } else { - assert load.block != currentBlock || load.index < res.getLIR().getLIRforBlock(currentBlock).size(); - } - load.block = dominator; - } - return loadedValue; - } - } - } else { - // Constant is loaded by ConstantNode.generate() - } - return null; - } - - public ValueNode valueForOperand(Value value) { - for (Entry entry : getNodeOperands().entries()) { - if (entry.getValue().equals(value)) { - return (ValueNode) entry.getKey(); - } - } - return null; - } - - /** * Creates a new {@linkplain Variable variable}. * * @param platformKind The kind of the new variable. @@ -302,17 +230,6 @@ } @Override - public Value setResult(ValueNode x, Value operand) { - assert (!isRegister(operand) || !attributes(asRegister(operand)).isAllocatable()); - assert nodeOperands == null || nodeOperands.get(x) == null : "operand cannot be set twice"; - assert operand != null && isLegal(operand) : "operand must be legal"; - assert operand.getKind().getStackKind() == x.getKind() || x.getKind() == Kind.Illegal : operand.getKind().getStackKind() + " must match " + x.getKind(); - assert !(x instanceof VirtualObjectNode); - nodeOperands.set(x, operand); - return operand; - } - - @Override public abstract Variable emitMove(Value input); public AllocatableValue asAllocatable(Value value) { @@ -439,302 +356,14 @@ } } - /** - * For Baseline compilation - */ - - public > void doBlock(T block, ResolvedJavaMethod method, BytecodeParser parser) { - doBlockStart(block); - - if (block == res.getLIR().getControlFlowGraph().getStartBlock()) { - assert block.getPredecessorCount() == 0; - emitPrologue(method, parser); - } else { - assert block.getPredecessorCount() > 0; - } - parser.processBlock(block); - - doBlockEnd(block); - } - - public void doBlock(Block block, StructuredGraph graph, BlockMap> blockMap) { - doBlockStart(block); - - if (block == res.getLIR().getControlFlowGraph().getStartBlock()) { - assert block.getPredecessorCount() == 0; - emitPrologue(graph); - } else { - assert block.getPredecessorCount() > 0; - } - - List nodes = blockMap.get(block); - for (int i = 0; i < nodes.size(); i++) { - Node instr = nodes.get(i); - if (traceLevel >= 3) { - TTY.println("LIRGen for " + instr); - } - if (!ConstantNodeRecordsUsages && instr instanceof ConstantNode) { - // Loading of constants is done lazily by operand() - } else if (instr instanceof ValueNode) { - ValueNode valueNode = (ValueNode) instr; - if (operand(valueNode) == null) { - if (!peephole(valueNode)) { - try { - doRoot((ValueNode) instr); - } catch (GraalInternalError e) { - throw e.addContext(instr); - } catch (Throwable e) { - throw new GraalInternalError(e).addContext(instr); - } - } - } else { - // There can be cases in which the result of an instruction is already set - // before by other instructions. - } - } - } - - if (!hasBlockEnd(block)) { - NodeClassIterable successors = block.getEndNode().successors(); - assert successors.count() == block.getSuccessorCount(); - if (block.getSuccessorCount() != 1) { - /* - * If we have more than one successor, we cannot just use the first one. Since - * successors are unordered, this would be a random choice. - */ - throw new GraalInternalError("Block without BlockEndOp: " + block.getEndNode()); - } - emitJump(getLIRBlock((FixedNode) successors.first())); - } - - assert verifyBlock(res.getLIR(), block); - doBlockEnd(block); - } - - protected abstract boolean peephole(ValueNode valueNode); - - private boolean hasBlockEnd(Block block) { - List ops = res.getLIR().getLIRforBlock(block); - if (ops.size() == 0) { - return false; - } - return ops.get(ops.size() - 1) instanceof BlockEndOp; - } - - private void doRoot(ValueNode instr) { - if (traceLevel >= 2) { - TTY.println("Emitting LIR for instruction " + instr); - } - currentInstruction = instr; - - Debug.log("Visiting %s", instr); - emitNode(instr); - Debug.log("Operand for %s = %s", instr, operand(instr)); - } - - protected void emitNode(ValueNode node) { - if (Debug.isLogEnabled() && node.stamp() instanceof IllegalStamp) { - Debug.log("This node has invalid type, we are emitting dead code(?): %s", node); - } - if (node instanceof LIRGenLowerable) { - ((LIRGenLowerable) node).generate(this); - } else if (node instanceof LIRGenResLowerable) { - ((LIRGenResLowerable) node).generate(this, res); - } else if (node instanceof LIRLowerable) { - ((LIRLowerable) node).generate(this); - } else if (node instanceof ArithmeticLIRLowerable) { - ((ArithmeticLIRLowerable) node).generate(this); - } else { - throw GraalInternalError.shouldNotReachHere("node is not LIRLowerable: " + node); - } - } - - protected void emitPrologue(StructuredGraph graph) { - CallingConvention incomingArguments = getCallingConvention(); - - Value[] params = new Value[incomingArguments.getArgumentCount()]; - for (int i = 0; i < params.length; i++) { - params[i] = toStackKind(incomingArguments.getArgument(i)); - if (ValueUtil.isStackSlot(params[i])) { - StackSlot slot = ValueUtil.asStackSlot(params[i]); - if (slot.isInCallerFrame() && !res.getLIR().hasArgInCallerFrame()) { - res.getLIR().setHasArgInCallerFrame(); - } - } - } - - emitIncomingValues(params); - - for (ParameterNode param : graph.getNodes(ParameterNode.class)) { - Value paramValue = params[param.index()]; - assert paramValue.getKind() == param.getKind().getStackKind(); - setResult(param, emitMove(paramValue)); - } - } - - protected > void emitPrologue(ResolvedJavaMethod method, BytecodeParser parser) { - CallingConvention incomingArguments = getCallingConvention(); - - Value[] params = new Value[incomingArguments.getArgumentCount()]; - for (int i = 0; i < params.length; i++) { - params[i] = toStackKind(incomingArguments.getArgument(i)); - if (ValueUtil.isStackSlot(params[i])) { - StackSlot slot = ValueUtil.asStackSlot(params[i]); - if (slot.isInCallerFrame() && !res.getLIR().hasArgInCallerFrame()) { - res.getLIR().setHasArgInCallerFrame(); - } - } - } - - emitIncomingValues(params); - - Signature sig = method.getSignature(); - boolean isStatic = Modifier.isStatic(method.getModifiers()); - for (int i = 0; i < sig.getParameterCount(!isStatic); i++) { - Value paramValue = params[i]; - assert paramValue.getKind() == sig.getParameterKind(i).getStackKind(); - // TODO setResult(param, emitMove(paramValue)); - parser.setParameter(i, emitMove(paramValue)); - } - - // return arguments; - } - public void emitIncomingValues(Value[] params) { ((LabelOp) res.getLIR().getLIRforBlock(currentBlock).get(0)).setIncomingValues(params); } - @Override - public void visitReturn(ReturnNode x) { - AllocatableValue operand = ILLEGAL; - if (x.result() != null) { - operand = resultOperandFor(x.result().getKind()); - emitMove(operand, operand(x.result())); - } - emitReturn(operand); - } - - @Override - public void visitReturn(Value x) { - AllocatableValue operand = ILLEGAL; - if (x != null) { - operand = resultOperandFor(x.getKind()); - emitMove(operand, x); - } - emitReturn(operand); - } - - protected abstract void emitReturn(Value input); - - @Override - public void visitMerge(MergeNode x) { - } - - @Override - public void visitEndNode(AbstractEndNode end) { - moveToPhi(end.merge(), end); - } - - /** - * Runtime specific classes can override this to insert a safepoint at the end of a loop. - */ - @Override - public void visitLoopEnd(LoopEndNode x) { - } - - private void moveToPhi(MergeNode merge, AbstractEndNode pred) { - if (traceLevel >= 1) { - TTY.println("MOVE TO PHI from " + pred + " to " + merge); - } - PhiResolver resolver = new PhiResolver(this); - for (PhiNode phi : merge.phis()) { - if (phi.type() == PhiType.Value) { - ValueNode curVal = phi.valueAt(pred); - resolver.move(operandForPhi(phi), operand(curVal)); - } - } - resolver.dispose(); - - append(new JumpOp(getLIRBlock(merge))); - } - protected PlatformKind getPhiKind(PhiNode phi) { return phi.getKind(); } - private Value operandForPhi(PhiNode phi) { - assert phi.type() == PhiType.Value : "wrong phi type: " + phi; - Value result = operand(phi); - if (result == null) { - // allocate a variable for this phi - Variable newOperand = newVariable(getPhiKind(phi)); - setResult(phi, newOperand); - return newOperand; - } else { - return result; - } - } - - @Override - public void emitIf(IfNode x) { - emitBranch(x.condition(), getLIRBlock(x.trueSuccessor()), getLIRBlock(x.falseSuccessor()), x.probability(x.trueSuccessor())); - } - - public void emitBranch(LogicNode node, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { - if (node instanceof IsNullNode) { - emitNullCheckBranch((IsNullNode) node, trueSuccessor, falseSuccessor, trueSuccessorProbability); - } else if (node instanceof CompareNode) { - emitCompareBranch((CompareNode) node, trueSuccessor, falseSuccessor, trueSuccessorProbability); - } else if (node instanceof LogicConstantNode) { - emitConstantBranch(((LogicConstantNode) node).getValue(), trueSuccessor, falseSuccessor); - } else if (node instanceof IntegerTestNode) { - emitIntegerTestBranch((IntegerTestNode) node, trueSuccessor, falseSuccessor, trueSuccessorProbability); - } else { - throw GraalInternalError.unimplemented(node.toString()); - } - } - - private void emitNullCheckBranch(IsNullNode node, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { - emitCompareBranch(operand(node.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueSuccessor, falseSuccessor, trueSuccessorProbability); - } - - public void emitCompareBranch(CompareNode compare, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { - emitCompareBranch(operand(compare.x()), operand(compare.y()), compare.condition(), compare.unorderedIsTrue(), trueSuccessor, falseSuccessor, trueSuccessorProbability); - } - - public void emitIntegerTestBranch(IntegerTestNode test, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { - emitIntegerTestBranch(operand(test.x()), operand(test.y()), trueSuccessor, falseSuccessor, trueSuccessorProbability); - } - - public void emitConstantBranch(boolean value, LabelRef trueSuccessorBlock, LabelRef falseSuccessorBlock) { - LabelRef block = value ? trueSuccessorBlock : falseSuccessorBlock; - emitJump(block); - } - - @Override - public void emitConditional(ConditionalNode conditional) { - Value tVal = operand(conditional.trueValue()); - Value fVal = operand(conditional.falseValue()); - setResult(conditional, emitConditional(conditional.condition(), tVal, fVal)); - } - - public Variable emitConditional(LogicNode node, Value trueValue, Value falseValue) { - if (node instanceof IsNullNode) { - IsNullNode isNullNode = (IsNullNode) node; - return emitConditionalMove(operand(isNullNode.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueValue, falseValue); - } else if (node instanceof CompareNode) { - CompareNode compare = (CompareNode) node; - return emitConditionalMove(operand(compare.x()), operand(compare.y()), compare.condition(), compare.unorderedIsTrue(), trueValue, falseValue); - } else if (node instanceof LogicConstantNode) { - return emitMove(((LogicConstantNode) node).getValue() ? trueValue : falseValue); - } else if (node instanceof IntegerTestNode) { - IntegerTestNode test = (IntegerTestNode) node; - return emitIntegerTestMove(operand(test.x()), operand(test.y()), trueValue, falseValue); - } else { - throw GraalInternalError.unimplemented(node.toString()); - } - } - public abstract void emitJump(LabelRef label); public abstract void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability); @@ -747,42 +376,6 @@ public abstract Variable emitIntegerTestMove(Value leftVal, Value right, Value trueValue, Value falseValue); - @Override - public void emitInvoke(Invoke x) { - LoweredCallTargetNode callTarget = (LoweredCallTargetNode) x.callTarget(); - CallingConvention invokeCc = res.getFrameMap().registerConfig.getCallingConvention(callTarget.callType(), x.asNode().stamp().javaType(getMetaAccess()), callTarget.signature(), target(), false); - res.getFrameMap().callsMethod(invokeCc); - - Value[] parameters = visitInvokeArguments(invokeCc, callTarget.arguments()); - - LabelRef exceptionEdge = null; - if (x instanceof InvokeWithExceptionNode) { - exceptionEdge = getLIRBlock(((InvokeWithExceptionNode) x).exceptionEdge()); - } - LIRFrameState callState = stateWithExceptionEdge(x, exceptionEdge); - - Value result = invokeCc.getReturn(); - if (callTarget instanceof DirectCallTargetNode) { - emitDirectCall((DirectCallTargetNode) callTarget, result, parameters, AllocatableValue.NONE, callState); - } else if (callTarget instanceof IndirectCallTargetNode) { - emitIndirectCall((IndirectCallTargetNode) callTarget, result, parameters, AllocatableValue.NONE, callState); - } else { - throw GraalInternalError.shouldNotReachHere(); - } - - if (isLegal(result)) { - setResult(x.asNode(), emitMove(result)); - } - - if (x instanceof InvokeWithExceptionNode) { - emitJump(getLIRBlock(((InvokeWithExceptionNode) x).next())); - } - } - - protected abstract void emitDirectCall(DirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState); - - protected abstract void emitIndirectCall(IndirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState); - protected abstract void emitForeignCall(ForeignCallLinkage linkage, Value result, Value[] arguments, Value[] temps, LIRFrameState info); protected static AllocatableValue toStackKind(AllocatableValue value) { @@ -800,23 +393,6 @@ return value; } - public Value[] visitInvokeArguments(CallingConvention invokeCc, Collection arguments) { - // for each argument, load it into the correct location - Value[] result = new Value[arguments.size()]; - int j = 0; - for (ValueNode arg : arguments) { - if (arg != null) { - AllocatableValue operand = toStackKind(invokeCc.getArgument(j)); - emitMove(operand, operand(arg)); - result[j] = operand; - j++; - } else { - throw GraalInternalError.shouldNotReachHere("I thought we no longer have null entries for two-slot types..."); - } - } - return result; - } - @Override public Variable emitForeignCall(ForeignCallLinkage linkage, DeoptimizingNode info, Value... args) { LIRFrameState state = null; @@ -850,46 +426,6 @@ } } - /** - * This method tries to create a switch implementation that is optimal for the given switch. It - * will either generate a sequential if/then/else cascade, a set of range tests or a table - * switch. - * - * If the given switch does not contain int keys, it will always create a sequential - * implementation. - */ - @Override - public void emitSwitch(SwitchNode x) { - assert x.defaultSuccessor() != null; - LabelRef defaultTarget = getLIRBlock(x.defaultSuccessor()); - int keyCount = x.keyCount(); - if (keyCount == 0) { - emitJump(defaultTarget); - } else { - Variable value = load(operand(x.value())); - if (keyCount == 1) { - assert defaultTarget != null; - double probability = x.probability(x.keySuccessor(0)); - emitCompareBranch(load(operand(x.value())), x.keyAt(0), Condition.EQ, false, getLIRBlock(x.keySuccessor(0)), defaultTarget, probability); - } else { - LabelRef[] keyTargets = new LabelRef[keyCount]; - Constant[] keyConstants = new Constant[keyCount]; - double[] keyProbabilities = new double[keyCount]; - for (int i = 0; i < keyCount; i++) { - keyTargets[i] = getLIRBlock(x.keySuccessor(i)); - keyConstants[i] = x.keyAt(i); - keyProbabilities[i] = x.keyProbability(i); - } - if (value.getKind() != Kind.Int || !x.isSorted()) { - // hopefully only a few entries - emitStrategySwitch(new SwitchStrategy.SequentialStrategy(keyProbabilities, keyConstants), value, keyTargets, defaultTarget); - } else { - emitStrategySwitch(keyConstants, keyProbabilities, keyTargets, defaultTarget, value); - } - } - } - } - protected void emitStrategySwitch(Constant[] keyConstants, double[] keyProbabilities, LabelRef[] keyTargets, LabelRef defaultTarget, Variable value) { int keyCount = keyConstants.length; SwitchStrategy strategy = SwitchStrategy.getBestStrategy(keyProbabilities, keyConstants, keyTargets); diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRGenerator.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRGenerator.java Wed Mar 26 11:49:07 2014 +0100 @@ -26,7 +26,6 @@ import static com.oracle.graal.api.meta.Value.*; import static com.oracle.graal.lir.LIR.*; import static com.oracle.graal.nodes.ConstantNode.*; -import static com.oracle.graal.phases.GraalOptions.*; import java.lang.reflect.*; import java.util.*; @@ -35,6 +34,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.*; +import com.oracle.graal.compiler.gen.LIRGenerator.LoadConstant; import com.oracle.graal.compiler.target.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; @@ -42,7 +42,6 @@ import com.oracle.graal.lir.StandardOp.BlockEndOp; import com.oracle.graal.lir.StandardOp.JumpOp; import com.oracle.graal.lir.StandardOp.LabelOp; -import com.oracle.graal.lir.StandardOp.NoOp; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.PhiNode.PhiType; import com.oracle.graal.nodes.calc.*; @@ -55,7 +54,7 @@ /** * This class traverses the HIR instructions and generates LIR instructions from them. */ -public abstract class NodeLIRGenerator implements NodeMappableLIRGenerator, NodeLIRGeneratorTool, LIRTypeTool, BaselineLIRGenerator { +public abstract class NodeLIRGenerator implements NodeMappableLIRGenerator, NodeLIRGeneratorTool { public static class Options { // @formatter:off @@ -75,108 +74,18 @@ private final int traceLevel; private final boolean printIRWithLIR; - private final LIRGenerator gen; - - /** - * Handle for an operation that loads a constant into a variable. The operation starts in the - * first block where the constant is used but will eventually be - * {@linkplain NodeLIRGenerator#insertConstantLoads() moved} to a block dominating all usages of - * the constant. - */ - public static class LoadConstant implements Comparable { - /** - * The index of {@link #op} within {@link #block}'s instruction list or -1 if {@code op} is - * to be moved to a dominator block. - */ - int index; - - /** - * The operation that loads the constant. - */ - private final LIRInstruction op; - - /** - * The block that does or will contain {@link #op}. This is initially the block where the - * first usage of the constant is seen during LIR generation. - */ - private Block block; - - /** - * The variable into which the constant is loaded. - */ - private final Variable variable; - - public LoadConstant(Variable variable, Block block, int index, LIRInstruction op) { - this.variable = variable; - this.block = block; - this.index = index; - this.op = op; - } - - /** - * Sorts {@link LoadConstant} objects according to their enclosing blocks. This is used to - * group loads per block in {@link NodeLIRGenerator#insertConstantLoads()}. - */ - public int compareTo(LoadConstant o) { - if (block.getId() < o.block.getId()) { - return -1; - } - if (block.getId() > o.block.getId()) { - return 1; - } - return 0; - } - - @Override - public String toString() { - return block + "#" + op; - } - - /** - * Removes the {@link #op} from its original location if it is still at that location. - */ - public void unpin(LIR lir) { - if (index >= 0) { - // Replace the move with a filler op so that the operation - // list does not need to be adjusted. - List instructions = lir.getLIRforBlock(block); - instructions.set(index, new NoOp(null, -1)); - index = -1; - } - } - } - - private Map constantLoads; + protected final LIRGenerator gen; private ValueNode currentInstruction; private ValueNode lastInstructionPrinted; // Debugging only protected LIRGenerationResult res; - /** - * Checks whether the supplied constant can be used without loading it into a register for store - * operations, i.e., on the right hand side of a memory access. - * - * @param c The constant to check. - * @return True if the constant can be used directly, false if the constant needs to be in a - * register. - */ - public abstract boolean canStoreConstant(Constant c, boolean isCompressed); - - public NodeLIRGenerator(CallingConvention cc, LIRGenerationResult res, LIRGenerator gen) { - this(null, cc, res, gen); - } - public NodeLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult res, LIRGenerator gen) { this.res = res; this.cc = cc; - if (graph != null) { - this.nodeOperands = graph.createNodeMap(); - this.debugInfoBuilder = createDebugInfoBuilder(nodeOperands); - } else { - this.nodeOperands = null; - this.debugInfoBuilder = null; - } + this.nodeOperands = graph.createNodeMap(); + this.debugInfoBuilder = createDebugInfoBuilder(nodeOperands); this.gen = gen; this.traceLevel = LIRGenerator.Options.TraceLIRGeneratorLevel.getValue(); this.printIRWithLIR = LIRGenerator.Options.PrintIRWithLIR.getValue(); @@ -213,16 +122,16 @@ return setResult(node, value); } else { Variable loadedValue; - if (constantLoads == null) { - constantLoads = new HashMap<>(); + if (gen.constantLoads == null) { + gen.constantLoads = new HashMap<>(); } - LoadConstant load = constantLoads.get(value); + LoadConstant load = gen.constantLoads.get(value); assert currentBlock instanceof Block; if (load == null) { int index = res.getLIR().getLIRforBlock(currentBlock).size(); loadedValue = gen.emitMove(value); LIRInstruction op = res.getLIR().getLIRforBlock(currentBlock).get(index); - constantLoads.put(value, new LoadConstant(loadedValue, (Block) currentBlock, index, op)); + gen.constantLoads.put(value, new LoadConstant(loadedValue, (Block) currentBlock, index, op)); } else { Block dominator = ControlFlowGraph.commonDominator(load.block, (Block) currentBlock); loadedValue = load.variable; @@ -429,7 +338,7 @@ */ throw new GraalInternalError("Block without BlockEndOp: " + block.getEndNode()); } - emitJump(getLIRBlock((FixedNode) successors.first())); + gen.emitJump(getLIRBlock((FixedNode) successors.first())); } assert verifyBlock(res.getLIR(), block); @@ -462,13 +371,13 @@ Debug.log("This node has invalid type, we are emitting dead code(?): %s", node); } if (node instanceof LIRGenLowerable) { - ((LIRGenLowerable) node).generate(gen); + ((LIRGenLowerable) node).generate(this); } else if (node instanceof LIRGenResLowerable) { - ((LIRGenResLowerable) node).generate(gen, res); + ((LIRGenResLowerable) node).generate(this, res); } else if (node instanceof LIRLowerable) { - ((LIRLowerable) node).generate(gen); + ((LIRLowerable) node).generate(this); } else if (node instanceof ArithmeticLIRLowerable) { - ((ArithmeticLIRLowerable) node).generate(gen); + ((ArithmeticLIRLowerable) node).generate(this); } else { throw GraalInternalError.shouldNotReachHere("node is not LIRLowerable: " + node); } @@ -536,22 +445,10 @@ operand = resultOperandFor(x.result().getKind()); gen.emitMove(operand, operand(x.result())); } - emitReturn(operand); + gen.emitReturn(operand); } @Override - public void visitReturn(Value x) { - AllocatableValue operand = ILLEGAL; - if (x != null) { - operand = resultOperandFor(x.getKind()); - gen.emitMove(operand, x); - } - emitReturn(operand); - } - - protected abstract void emitReturn(Value input); - - @Override public void visitMerge(MergeNode x) { } @@ -620,20 +517,20 @@ } private void emitNullCheckBranch(IsNullNode node, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { - emitCompareBranch(operand(node.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueSuccessor, falseSuccessor, trueSuccessorProbability); + gen.emitCompareBranch(operand(node.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueSuccessor, falseSuccessor, trueSuccessorProbability); } public void emitCompareBranch(CompareNode compare, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { - emitCompareBranch(operand(compare.x()), operand(compare.y()), compare.condition(), compare.unorderedIsTrue(), trueSuccessor, falseSuccessor, trueSuccessorProbability); + gen.emitCompareBranch(operand(compare.x()), operand(compare.y()), compare.condition(), compare.unorderedIsTrue(), trueSuccessor, falseSuccessor, trueSuccessorProbability); } public void emitIntegerTestBranch(IntegerTestNode test, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) { - emitIntegerTestBranch(operand(test.x()), operand(test.y()), trueSuccessor, falseSuccessor, trueSuccessorProbability); + gen.emitIntegerTestBranch(operand(test.x()), operand(test.y()), trueSuccessor, falseSuccessor, trueSuccessorProbability); } public void emitConstantBranch(boolean value, LabelRef trueSuccessorBlock, LabelRef falseSuccessorBlock) { LabelRef block = value ? trueSuccessorBlock : falseSuccessorBlock; - emitJump(block); + gen.emitJump(block); } @Override @@ -646,31 +543,37 @@ public Variable emitConditional(LogicNode node, Value trueValue, Value falseValue) { if (node instanceof IsNullNode) { IsNullNode isNullNode = (IsNullNode) node; - return emitConditionalMove(operand(isNullNode.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueValue, falseValue); + return gen.emitConditionalMove(operand(isNullNode.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueValue, falseValue); } else if (node instanceof CompareNode) { CompareNode compare = (CompareNode) node; - return emitConditionalMove(operand(compare.x()), operand(compare.y()), compare.condition(), compare.unorderedIsTrue(), trueValue, falseValue); + return gen.emitConditionalMove(operand(compare.x()), operand(compare.y()), compare.condition(), compare.unorderedIsTrue(), trueValue, falseValue); } else if (node instanceof LogicConstantNode) { return gen.emitMove(((LogicConstantNode) node).getValue() ? trueValue : falseValue); } else if (node instanceof IntegerTestNode) { IntegerTestNode test = (IntegerTestNode) node; - return emitIntegerTestMove(operand(test.x()), operand(test.y()), trueValue, falseValue); + return gen.emitIntegerTestMove(operand(test.x()), operand(test.y()), trueValue, falseValue); } else { throw GraalInternalError.unimplemented(node.toString()); } } - public abstract void emitJump(LabelRef label); - - public abstract void emitCompareBranch(Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double trueDestinationProbability); - - public abstract void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, double overflowProbability); - - public abstract void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination, double trueSuccessorProbability); - - public abstract Variable emitConditionalMove(Value leftVal, Value right, Condition cond, boolean unorderedIsTrue, Value trueValue, Value falseValue); - - public abstract Variable emitIntegerTestMove(Value leftVal, Value right, Value trueValue, Value falseValue); +// public abstract void emitJump(LabelRef label); +// +// public abstract void emitCompareBranch(Value left, Value right, Condition cond, boolean +// unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination, double +// trueDestinationProbability); +// +// public abstract void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, double +// overflowProbability); +// +// public abstract void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, +// LabelRef falseDestination, double trueSuccessorProbability); +// +// public abstract Variable emitConditionalMove(Value leftVal, Value right, Condition cond, boolean +// unorderedIsTrue, Value trueValue, Value falseValue); +// +// public abstract Variable emitIntegerTestMove(Value leftVal, Value right, Value trueValue, Value +// falseValue); @Override public void emitInvoke(Invoke x) { @@ -701,7 +604,7 @@ } if (x instanceof InvokeWithExceptionNode) { - emitJump(getLIRBlock(((InvokeWithExceptionNode) x).next())); + gen.emitJump(getLIRBlock(((InvokeWithExceptionNode) x).next())); } } @@ -709,8 +612,6 @@ protected abstract void emitIndirectCall(IndirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState); - protected abstract void emitForeignCall(ForeignCallLinkage linkage, Value result, Value[] arguments, Value[] temps, LIRFrameState info); - protected static AllocatableValue toStackKind(AllocatableValue value) { if (value.getKind().getStackKind() != value.getKind()) { // We only have stack-kinds in the LIR, so convert the operand kind for values from the @@ -726,6 +627,7 @@ return value; } + @Override public Value[] visitInvokeArguments(CallingConvention invokeCc, Collection arguments) { // for each argument, load it into the correct location Value[] result = new Value[arguments.size()]; @@ -743,39 +645,6 @@ return result; } - @Override - public Variable emitForeignCall(ForeignCallLinkage linkage, DeoptimizingNode info, Value... args) { - LIRFrameState state = null; - if (linkage.canDeoptimize()) { - if (info != null) { - state = stateFor(info.getDeoptimizationState()); - } else { - assert needOnlyOopMaps(); - state = new LIRFrameState(null, null, null); - } - } - - // move the arguments into the correct location - CallingConvention linkageCc = linkage.getOutgoingCallingConvention(); - res.getFrameMap().callsMethod(linkageCc); - assert linkageCc.getArgumentCount() == args.length : "argument count mismatch"; - Value[] argLocations = new Value[args.length]; - for (int i = 0; i < args.length; i++) { - Value arg = args[i]; - AllocatableValue loc = linkageCc.getArgument(i); - gen.emitMove(loc, arg); - argLocations[i] = loc; - } - res.setForeignCall(true); - emitForeignCall(linkage, linkageCc.getReturn(), argLocations, linkage.getTemporaries(), state); - - if (isLegal(linkageCc.getReturn())) { - return gen.emitMove(linkageCc.getReturn()); - } else { - return null; - } - } - /** * This method tries to create a switch implementation that is optimal for the given switch. It * will either generate a sequential if/then/else cascade, a set of range tests or a table @@ -790,13 +659,13 @@ LabelRef defaultTarget = getLIRBlock(x.defaultSuccessor()); int keyCount = x.keyCount(); if (keyCount == 0) { - emitJump(defaultTarget); + gen.emitJump(defaultTarget); } else { Variable value = gen.load(operand(x.value())); if (keyCount == 1) { assert defaultTarget != null; double probability = x.probability(x.keySuccessor(0)); - emitCompareBranch(gen.load(operand(x.value())), x.keyAt(0), Condition.EQ, false, getLIRBlock(x.keySuccessor(0)), defaultTarget, probability); + gen.emitCompareBranch(gen.load(operand(x.value())), x.keyAt(0), Condition.EQ, false, getLIRBlock(x.keySuccessor(0)), defaultTarget, probability); } else { LabelRef[] keyTargets = new LabelRef[keyCount]; Constant[] keyConstants = new Constant[keyCount]; @@ -808,45 +677,14 @@ } if (value.getKind() != Kind.Int || !x.isSorted()) { // hopefully only a few entries - emitStrategySwitch(new SwitchStrategy.SequentialStrategy(keyProbabilities, keyConstants), value, keyTargets, defaultTarget); + gen.emitStrategySwitch(new SwitchStrategy.SequentialStrategy(keyProbabilities, keyConstants), value, keyTargets, defaultTarget); } else { - emitStrategySwitch(keyConstants, keyProbabilities, keyTargets, defaultTarget, value); + gen.emitStrategySwitch(keyConstants, keyProbabilities, keyTargets, defaultTarget, value); } } } } - protected void emitStrategySwitch(Constant[] keyConstants, double[] keyProbabilities, LabelRef[] keyTargets, LabelRef defaultTarget, Variable value) { - int keyCount = keyConstants.length; - SwitchStrategy strategy = SwitchStrategy.getBestStrategy(keyProbabilities, keyConstants, keyTargets); - long valueRange = keyConstants[keyCount - 1].asLong() - keyConstants[0].asLong() + 1; - double tableSwitchDensity = keyCount / (double) valueRange; - /* - * This heuristic tries to find a compromise between the effort for the best switch strategy - * and the density of a tableswitch. If the effort for the strategy is at least 4, then a - * tableswitch is preferred if better than a certain value that starts at 0.5 and lowers - * gradually with additional effort. - */ - if (strategy.getAverageEffort() < 4 || tableSwitchDensity < (1 / Math.sqrt(strategy.getAverageEffort()))) { - emitStrategySwitch(strategy, value, keyTargets, defaultTarget); - } else { - int minValue = keyConstants[0].asInt(); - assert valueRange < Integer.MAX_VALUE; - LabelRef[] targets = new LabelRef[(int) valueRange]; - for (int i = 0; i < valueRange; i++) { - targets[i] = defaultTarget; - } - for (int i = 0; i < keyCount; i++) { - targets[keyConstants[i].asInt() - minValue] = keyTargets[i]; - } - emitTableSwitch(minValue, defaultTarget, targets, value); - } - } - - protected abstract void emitStrategySwitch(SwitchStrategy strategy, Variable key, LabelRef[] keyTargets, LabelRef defaultTarget); - - protected abstract void emitTableSwitch(int lowKey, LabelRef defaultTarget, LabelRef[] targets, Value key); - public final NodeMap getNodeOperands() { assert nodeOperands != null; return nodeOperands; @@ -861,148 +699,36 @@ return debugInfoBuilder; } - /** - * Moves deferred {@linkplain LoadConstant loads} of constants into blocks dominating all usages - * of the constant. Any operations inserted into a block are guaranteed to be immediately prior - * to the first control flow instruction near the end of the block. - */ - private void insertConstantLoads() { - if (constantLoads != null) { - // Remove loads where all usages are in the same block. - for (Iterator> iter = constantLoads.entrySet().iterator(); iter.hasNext();) { - LoadConstant lc = iter.next().getValue(); - - // Move loads of constant outside of loops - if (OptScheduleOutOfLoops.getValue()) { - Block outOfLoopDominator = lc.block; - while (outOfLoopDominator.getLoop() != null) { - outOfLoopDominator = outOfLoopDominator.getDominator(); - } - if (outOfLoopDominator != lc.block) { - lc.unpin(res.getLIR()); - lc.block = outOfLoopDominator; - } - } - - if (lc.index != -1) { - assert res.getLIR().getLIRforBlock(lc.block).get(lc.index) == lc.op; - iter.remove(); - } - } - if (constantLoads.isEmpty()) { - return; - } - - // Sorting groups the loads per block. - LoadConstant[] groupedByBlock = constantLoads.values().toArray(new LoadConstant[constantLoads.size()]); - Arrays.sort(groupedByBlock); + public void emitOverflowCheckBranch(AbstractBeginNode overflowSuccessor, AbstractBeginNode next, double probability) { + gen.emitOverflowCheckBranch(getLIRBlock(overflowSuccessor), getLIRBlock(next), probability); + } - int groupBegin = 0; - while (true) { - int groupEnd = groupBegin + 1; - Block block = groupedByBlock[groupBegin].block; - while (groupEnd < groupedByBlock.length && groupedByBlock[groupEnd].block == block) { - groupEnd++; - } - int groupSize = groupEnd - groupBegin; + public void emitArrayEquals(Kind kind, Variable result, Value array1, Value array2, Value length) { + gen.emitArrayEquals(kind, result, array1, array2, length); + } - List ops = res.getLIR().getLIRforBlock(block); - int lastIndex = ops.size() - 1; - assert ops.get(lastIndex) instanceof BlockEndOp; - int insertionIndex = lastIndex; - for (int i = Math.max(0, lastIndex - MAX_EXCEPTION_EDGE_OP_DISTANCE_FROM_END); i < lastIndex; i++) { - if (getExceptionEdge(ops.get(i)) != null) { - insertionIndex = i; - break; - } - } + public Variable newVariable(Kind i) { + return gen.newVariable(i); + } - if (groupSize == 1) { - ops.add(insertionIndex, groupedByBlock[groupBegin].op); - } else { - assert groupSize > 1; - List moves = new ArrayList<>(groupSize); - for (int i = groupBegin; i < groupEnd; i++) { - moves.add(groupedByBlock[i].op); - } - ops.addAll(insertionIndex, moves); - } - - if (groupEnd == groupedByBlock.length) { - break; - } - groupBegin = groupEnd; - } - constantLoads = null; - } + public void emitBitCount(Variable result, Value operand) { + gen.emitBitCount(result, operand); } - /** - * Gets a garbage value for a given kind. - */ - protected Constant zapValueForKind(PlatformKind kind) { - long dead = 0xDEADDEADDEADDEADL; - switch ((Kind) kind) { - case Boolean: - return Constant.FALSE; - case Byte: - return Constant.forByte((byte) dead); - case Char: - return Constant.forChar((char) dead); - case Short: - return Constant.forShort((short) dead); - case Int: - return Constant.forInt((int) dead); - case Double: - return Constant.forDouble(Double.longBitsToDouble(dead)); - case Float: - return Constant.forFloat(Float.intBitsToFloat((int) dead)); - case Long: - return Constant.forLong(dead); - case Object: - return Constant.NULL_OBJECT; - default: - throw new IllegalArgumentException(kind.toString()); - } + public void emitBitScanForward(Variable result, Value operand) { + gen.emitBitScanForward(result, operand); + } + + public void emitBitScanReverse(Variable result, Value operand) { + gen.emitBitScanReverse(result, operand); } - /** - * Default implementation: Return the Java stack kind for each stamp. - */ - public PlatformKind getPlatformKind(Stamp stamp) { - return stamp.getPlatformKind(this); - } - - public PlatformKind getIntegerKind(int bits, boolean unsigned) { - if (bits > 32) { - return Kind.Long; - } else { - return Kind.Int; - } + @Override + public LIRGenerator getLIRGeneratorTool() { + return gen; } - public PlatformKind getFloatingKind(int bits) { - switch (bits) { - case 32: - return Kind.Float; - case 64: - return Kind.Double; - default: - throw GraalInternalError.shouldNotReachHere(); - } + public LIRGenerator getLIRGenerator() { + return gen; } - - public PlatformKind getObjectKind() { - return Kind.Object; - } - - public abstract void emitBitCount(Variable result, Value operand); - - public abstract void emitBitScanForward(Variable result, Value operand); - - public abstract void emitBitScanReverse(Variable result, Value operand); - - public abstract void emitByteSwap(Variable result, Value operand); - - public abstract void emitArrayEquals(Kind kind, Variable result, Value array1, Value array2, Value length); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Wed Mar 26 11:49:07 2014 +0100 @@ -69,6 +69,8 @@ public abstract LIRGenerationResult newLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub); + public abstract NodeLIRGenerator newNodeLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult lirGenRes, LIRGenerator lirGen); + /** * Creates the assembler used to emit the machine code. */ diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/LIRGenLowerable.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/LIRGenLowerable.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/LIRGenLowerable.java Wed Mar 26 11:49:07 2014 +0100 @@ -32,5 +32,5 @@ */ public interface LIRGenLowerable { - void generate(LIRGenerator generator); + void generate(NodeLIRGenerator generator); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/LIRGenResLowerable.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/LIRGenResLowerable.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/LIRGenResLowerable.java Wed Mar 26 11:49:07 2014 +0100 @@ -32,5 +32,5 @@ */ public interface LIRGenResLowerable { - void generate(LIRGenerator generator, LIRGenerationResult genRes); + void generate(NodeLIRGeneratorTool generator, LIRGenerationResult genRes); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Wed Mar 26 11:49:07 2014 +0100 @@ -81,6 +81,11 @@ return new AMD64HotSpotLIRGenerationResult(lir, frameMap, stub); } + @Override + public NodeLIRGenerator newNodeLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult lirGenRes, LIRGenerator lirGen) { + return new AMD64HotSpotNodeLIRGenerator(graph, cc, lirGenRes, lirGen); + } + /** * Emits code to do stack overflow checking. * @@ -323,4 +328,5 @@ }; return new HotSpotNativeFunctionInterface(getProviders(), factory, this, config.dllLoad, config.dllLookup, config.rtldDefault); } + } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Wed Mar 26 11:49:07 2014 +0100 @@ -24,52 +24,39 @@ import static com.oracle.graal.amd64.AMD64.*; import static com.oracle.graal.api.code.ValueUtil.*; -import static com.oracle.graal.hotspot.HotSpotBackend.*; import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; -import java.lang.reflect.*; import java.util.*; import com.oracle.graal.amd64.*; import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.asm.*; -import com.oracle.graal.asm.amd64.AMD64Address.Scale; import com.oracle.graal.compiler.amd64.*; import com.oracle.graal.compiler.gen.*; -import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.HotSpotVMConfig.CompressEncoding; -import com.oracle.graal.hotspot.amd64.AMD64HotSpotMove.CompareAndSwapCompressedOp; import com.oracle.graal.hotspot.amd64.AMD64HotSpotMove.LoadCompressedPointer; import com.oracle.graal.hotspot.amd64.AMD64HotSpotMove.StoreCompressedConstantOp; import com.oracle.graal.hotspot.amd64.AMD64HotSpotMove.StoreCompressedPointer; import com.oracle.graal.hotspot.meta.*; -import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.hotspot.stubs.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.NoOp; import com.oracle.graal.lir.amd64.*; -import com.oracle.graal.lir.amd64.AMD64ControlFlow.CondMoveOp; -import com.oracle.graal.lir.amd64.AMD64Move.CompareAndSwapOp; import com.oracle.graal.lir.amd64.AMD64Move.LoadOp; import com.oracle.graal.lir.amd64.AMD64Move.MoveFromRegOp; import com.oracle.graal.lir.amd64.AMD64Move.StoreConstantOp; import com.oracle.graal.lir.amd64.AMD64Move.StoreOp; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.calc.*; -import com.oracle.graal.nodes.cfg.*; import com.oracle.graal.nodes.extended.*; -import com.oracle.graal.nodes.java.*; -import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; /** * LIR generator specialized for AMD64 HotSpot. */ public class AMD64HotSpotLIRGenerator extends AMD64LIRGenerator implements HotSpotLIRGenerator { - private final HotSpotVMConfig config; + final HotSpotVMConfig config; protected AMD64HotSpotLIRGenerator(StructuredGraph graph, HotSpotProviders providers, HotSpotVMConfig config, CallingConvention cc, LIRGenerationResult lirGenRes) { super(graph, providers, cc, lirGenRes); @@ -119,7 +106,7 @@ } } - private SaveRbp saveRbp; + SaveRbp saveRbp; /** * List of epilogue operations that need to restore RBP. @@ -145,67 +132,6 @@ return ((HotSpotDebugInfoBuilder) getDebugInfoBuilder()).lockStack().makeLockSlot(lockDepth); } - @Override - protected void emitPrologue(StructuredGraph graph) { - - CallingConvention incomingArguments = getCallingConvention(); - - Value[] params = new Value[incomingArguments.getArgumentCount() + 1]; - for (int i = 0; i < params.length - 1; i++) { - params[i] = toStackKind(incomingArguments.getArgument(i)); - if (isStackSlot(params[i])) { - StackSlot slot = ValueUtil.asStackSlot(params[i]); - if (slot.isInCallerFrame() && !res.getLIR().hasArgInCallerFrame()) { - res.getLIR().setHasArgInCallerFrame(); - } - } - } - params[params.length - 1] = rbp.asValue(Kind.Long); - - emitIncomingValues(params); - - saveRbp = new SaveRbp(new NoOp(currentBlock, res.getLIR().getLIRforBlock(currentBlock).size())); - append(saveRbp.placeholder); - - for (ParameterNode param : graph.getNodes(ParameterNode.class)) { - Value paramValue = params[param.index()]; - assert paramValue.getKind() == param.getKind().getStackKind(); - setResult(param, emitMove(paramValue)); - } - } - - @Override - protected > void emitPrologue(ResolvedJavaMethod method, BytecodeParser parser) { - - CallingConvention incomingArguments = getCallingConvention(); - - Value[] params = new Value[incomingArguments.getArgumentCount() + 1]; - for (int i = 0; i < params.length - 1; i++) { - params[i] = toStackKind(incomingArguments.getArgument(i)); - if (isStackSlot(params[i])) { - StackSlot slot = ValueUtil.asStackSlot(params[i]); - if (slot.isInCallerFrame() && !res.getLIR().hasArgInCallerFrame()) { - res.getLIR().setHasArgInCallerFrame(); - } - } - } - params[params.length - 1] = rbp.asValue(Kind.Long); - - emitIncomingValues(params); - - saveRbp = new SaveRbp(new NoOp(currentBlock, res.getLIR().getLIRforBlock(currentBlock).size())); - append(saveRbp.placeholder); - - Signature sig = method.getSignature(); - boolean isStatic = Modifier.isStatic(method.getModifiers()); - - for (int i = 0; i < sig.getParameterCount(!isStatic); i++) { - Value paramValue = params[i]; - assert paramValue.getKind() == sig.getParameterKind(i).getStackKind(); - parser.setParameter(i, emitMove(paramValue)); - } - } - private Register findPollOnReturnScratchRegister() { RegisterConfig regConfig = getProviders().getCodeCache().getRegisterConfig(); for (Register r : regConfig.getAllocatableRegisters(Kind.Long)) { @@ -219,7 +145,7 @@ private Register pollOnReturnScratchRegister; @Override - protected void emitReturn(Value input) { + public void emitReturn(Value input) { if (pollOnReturnScratchRegister == null) { pollOnReturnScratchRegister = findPollOnReturnScratchRegister(); } @@ -323,41 +249,6 @@ } @Override - public void visitSafepointNode(SafepointNode i) { - LIRFrameState info = state(i); - append(new AMD64HotSpotSafepointOp(info, config, this)); - } - - @SuppressWarnings("hiding") - @Override - public void visitDirectCompareAndSwap(DirectCompareAndSwapNode x) { - Kind kind = x.newValue().getKind(); - assert kind == x.expectedValue().getKind(); - - Value expected = loadNonConst(operand(x.expectedValue())); - Variable newVal = load(operand(x.newValue())); - - int disp = 0; - AMD64AddressValue address; - Value index = operand(x.offset()); - if (ValueUtil.isConstant(index) && NumUtil.isInt(ValueUtil.asConstant(index).asLong() + disp)) { - assert !getCodeCache().needsDataPatch(asConstant(index)); - disp += (int) ValueUtil.asConstant(index).asLong(); - address = new AMD64AddressValue(kind, load(operand(x.object())), disp); - } else { - address = new AMD64AddressValue(kind, load(operand(x.object())), load(index), Scale.Times1, disp); - } - - RegisterValue rax = AMD64.rax.asValue(kind); - emitMove(rax, expected); - append(new CompareAndSwapOp(rax, address, rax, newVal)); - - Variable result = newVariable(x.getKind()); - emitMove(result, rax); - setResult(x, result); - } - - @Override public void emitTailcall(Value[] args, Value address) { append(new AMD64TailcallOp(args, address)); } @@ -381,33 +272,6 @@ } @Override - protected void emitDirectCall(DirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { - InvokeKind invokeKind = ((HotSpotDirectCallTargetNode) callTarget).invokeKind(); - if (invokeKind == InvokeKind.Interface || invokeKind == InvokeKind.Virtual) { - append(new AMD64HotspotDirectVirtualCallOp(callTarget.target(), result, parameters, temps, callState, invokeKind)); - } else { - assert invokeKind == InvokeKind.Static || invokeKind == InvokeKind.Special; - HotSpotResolvedJavaMethod resolvedMethod = (HotSpotResolvedJavaMethod) callTarget.target(); - assert !Modifier.isAbstract(resolvedMethod.getModifiers()) : "Cannot make direct call to abstract method."; - Constant metaspaceMethod = resolvedMethod.getMetaspaceMethodConstant(); - append(new AMD64HotspotDirectStaticCallOp(callTarget.target(), result, parameters, temps, callState, invokeKind, metaspaceMethod)); - } - } - - @Override - protected void emitIndirectCall(IndirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { - if (callTarget instanceof HotSpotIndirectCallTargetNode) { - AllocatableValue metaspaceMethod = AMD64.rbx.asValue(); - emitMove(metaspaceMethod, operand(((HotSpotIndirectCallTargetNode) callTarget).metaspaceMethod())); - AllocatableValue targetAddress = AMD64.rax.asValue(); - emitMove(targetAddress, operand(callTarget.computedAddress())); - append(new AMD64IndirectCallOp(callTarget.target(), result, parameters, temps, metaspaceMethod, targetAddress, callState)); - } else { - super.emitIndirectCall(callTarget, result, parameters, temps, callState); - } - } - - @Override public void emitUnwind(Value exception) { ForeignCallLinkage linkage = getForeignCalls().lookupForeignCall(HotSpotBackend.UNWIND_EXCEPTION_TO_CALLER); CallingConvention outgoingCc = linkage.getOutgoingCallingConvention(); @@ -442,26 +306,6 @@ } @Override - public void emitPatchReturnAddress(ValueNode address) { - append(new AMD64HotSpotPatchReturnAddressOp(load(operand(address)))); - } - - @Override - public void emitJumpToExceptionHandlerInCaller(ValueNode handlerInCallerPc, ValueNode exception, ValueNode exceptionPc) { - Variable handler = load(operand(handlerInCallerPc)); - ForeignCallLinkage linkage = getForeignCalls().lookupForeignCall(EXCEPTION_HANDLER_IN_CALLER); - CallingConvention outgoingCc = linkage.getOutgoingCallingConvention(); - assert outgoingCc.getArgumentCount() == 2; - RegisterValue exceptionFixed = (RegisterValue) outgoingCc.getArgument(0); - RegisterValue exceptionPcFixed = (RegisterValue) outgoingCc.getArgument(1); - emitMove(exceptionFixed, operand(exception)); - emitMove(exceptionPcFixed, operand(exceptionPc)); - Register thread = getProviders().getRegisters().getThreadRegister(); - AMD64HotSpotJumpToExceptionHandlerInCallerOp op = new AMD64HotSpotJumpToExceptionHandlerInCallerOp(handler, exceptionFixed, exceptionPcFixed, config.threadIsMethodHandleReturnOffset, thread); - append(op); - } - - @Override public void beforeRegisterAllocation() { super.beforeRegisterAllocation(); boolean hasDebugInfo = res.getLIR().hasDebugInfo(); @@ -575,38 +419,4 @@ } } - @Override - public void visitCompareAndSwap(LoweredCompareAndSwapNode node, Value address) { - Kind kind = node.getNewValue().getKind(); - assert kind == node.getExpectedValue().getKind(); - Value expected = loadNonConst(operand(node.getExpectedValue())); - Variable newValue = load(operand(node.getNewValue())); - AMD64AddressValue addressValue = asAddressValue(address); - RegisterValue raxRes = AMD64.rax.asValue(kind); - emitMove(raxRes, expected); - if (config.useCompressedOops && node.isCompressible()) { - Variable scratch = newVariable(Kind.Long); - Register heapBaseReg = getProviders().getRegisters().getHeapBaseRegister(); - append(new CompareAndSwapCompressedOp(raxRes, addressValue, raxRes, newValue, scratch, config.getOopEncoding(), heapBaseReg)); - } else { - append(new CompareAndSwapOp(raxRes, addressValue, raxRes, newValue)); - } - Variable result = newVariable(node.getKind()); - append(new CondMoveOp(result, Condition.EQ, load(Constant.TRUE), Constant.FALSE)); - setResult(node, result); - } - - @Override - public void visitInfopointNode(InfopointNode i) { - if (i.getState() != null && i.getState().bci == FrameState.AFTER_BCI) { - Debug.log("Ignoring InfopointNode for AFTER_BCI"); - } else { - super.visitInfopointNode(i); - } - } - - public void emitPrefetchAllocate(ValueNode address, ValueNode distance) { - AMD64AddressValue addr = emitAddress(operand(address), 0, loadNonConst(operand(distance)), 1); - append(new AMD64PrefetchOp(addr, config.allocatePrefetchInstr)); - } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRGenerator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRGenerator.java Wed Mar 26 11:49:07 2014 +0100 @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.hotspot.amd64; + +import static com.oracle.graal.amd64.AMD64.*; +import static com.oracle.graal.api.code.ValueUtil.*; +import static com.oracle.graal.hotspot.HotSpotBackend.*; + +import java.lang.reflect.*; + +import com.oracle.graal.amd64.*; +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.asm.*; +import com.oracle.graal.asm.amd64.AMD64Address.Scale; +import com.oracle.graal.compiler.amd64.*; +import com.oracle.graal.compiler.gen.*; +import com.oracle.graal.debug.*; +import com.oracle.graal.hotspot.*; +import com.oracle.graal.hotspot.amd64.AMD64HotSpotLIRGenerator.SaveRbp; +import com.oracle.graal.hotspot.amd64.AMD64HotSpotMove.CompareAndSwapCompressedOp; +import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.*; +import com.oracle.graal.lir.*; +import com.oracle.graal.lir.StandardOp.NoOp; +import com.oracle.graal.lir.amd64.*; +import com.oracle.graal.lir.amd64.AMD64ControlFlow.CondMoveOp; +import com.oracle.graal.lir.amd64.AMD64Move.CompareAndSwapOp; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; + +/** + * LIR generator specialized for AMD64 HotSpot. + */ +public class AMD64HotSpotNodeLIRGenerator extends AMD64NodeLIRGenerator implements HotSpotNodeLIRGenerator { + + public AMD64HotSpotNodeLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult res, LIRGenerator gen) { + super(graph, cc, res, gen); + } + + private AMD64HotSpotLIRGenerator getGen() { + return (AMD64HotSpotLIRGenerator) gen; + } + + private SaveRbp getSaveRbp() { + return getGen().saveRbp; + } + + private void setSaveRbp(SaveRbp saveRbp) { + getGen().saveRbp = saveRbp; + } + + @Override + protected void emitPrologue(StructuredGraph graph) { + + CallingConvention incomingArguments = getCallingConvention(); + + Value[] params = new Value[incomingArguments.getArgumentCount() + 1]; + for (int i = 0; i < params.length - 1; i++) { + params[i] = toStackKind(incomingArguments.getArgument(i)); + if (isStackSlot(params[i])) { + StackSlot slot = ValueUtil.asStackSlot(params[i]); + if (slot.isInCallerFrame() && !res.getLIR().hasArgInCallerFrame()) { + res.getLIR().setHasArgInCallerFrame(); + } + } + } + params[params.length - 1] = rbp.asValue(Kind.Long); + + emitIncomingValues(params); + + setSaveRbp(((AMD64HotSpotLIRGenerator) gen).new SaveRbp(new NoOp(currentBlock, res.getLIR().getLIRforBlock(currentBlock).size()))); + append(getSaveRbp().placeholder); + + for (ParameterNode param : graph.getNodes(ParameterNode.class)) { + Value paramValue = params[param.index()]; + assert paramValue.getKind() == param.getKind().getStackKind(); + setResult(param, gen.emitMove(paramValue)); + } + } + + @Override + public void visitSafepointNode(SafepointNode i) { + LIRFrameState info = state(i); + append(new AMD64HotSpotSafepointOp(info, getGen().config, this)); + } + + @Override + protected void emitDirectCall(DirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { + InvokeKind invokeKind = ((HotSpotDirectCallTargetNode) callTarget).invokeKind(); + if (invokeKind == InvokeKind.Interface || invokeKind == InvokeKind.Virtual) { + append(new AMD64HotspotDirectVirtualCallOp(callTarget.target(), result, parameters, temps, callState, invokeKind)); + } else { + assert invokeKind == InvokeKind.Static || invokeKind == InvokeKind.Special; + HotSpotResolvedJavaMethod resolvedMethod = (HotSpotResolvedJavaMethod) callTarget.target(); + assert !Modifier.isAbstract(resolvedMethod.getModifiers()) : "Cannot make direct call to abstract method."; + Constant metaspaceMethod = resolvedMethod.getMetaspaceMethodConstant(); + append(new AMD64HotspotDirectStaticCallOp(callTarget.target(), result, parameters, temps, callState, invokeKind, metaspaceMethod)); + } + } + + @Override + protected void emitIndirectCall(IndirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { + if (callTarget instanceof HotSpotIndirectCallTargetNode) { + AllocatableValue metaspaceMethod = AMD64.rbx.asValue(); + gen.emitMove(metaspaceMethod, operand(((HotSpotIndirectCallTargetNode) callTarget).metaspaceMethod())); + AllocatableValue targetAddress = AMD64.rax.asValue(); + gen.emitMove(targetAddress, operand(callTarget.computedAddress())); + append(new AMD64IndirectCallOp(callTarget.target(), result, parameters, temps, metaspaceMethod, targetAddress, callState)); + } else { + super.emitIndirectCall(callTarget, result, parameters, temps, callState); + } + } + + @Override + public void emitPatchReturnAddress(ValueNode address) { + append(new AMD64HotSpotPatchReturnAddressOp(gen.load(operand(address)))); + } + + @Override + public void emitJumpToExceptionHandlerInCaller(ValueNode handlerInCallerPc, ValueNode exception, ValueNode exceptionPc) { + Variable handler = gen.load(operand(handlerInCallerPc)); + ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(EXCEPTION_HANDLER_IN_CALLER); + CallingConvention outgoingCc = linkage.getOutgoingCallingConvention(); + assert outgoingCc.getArgumentCount() == 2; + RegisterValue exceptionFixed = (RegisterValue) outgoingCc.getArgument(0); + RegisterValue exceptionPcFixed = (RegisterValue) outgoingCc.getArgument(1); + gen.emitMove(exceptionFixed, operand(exception)); + gen.emitMove(exceptionPcFixed, operand(exceptionPc)); + Register thread = getGen().getProviders().getRegisters().getThreadRegister(); + AMD64HotSpotJumpToExceptionHandlerInCallerOp op = new AMD64HotSpotJumpToExceptionHandlerInCallerOp(handler, exceptionFixed, exceptionPcFixed, getGen().config.threadIsMethodHandleReturnOffset, + thread); + append(op); + } + + @Override + public void visitInfopointNode(InfopointNode i) { + if (i.getState() != null && i.getState().bci == FrameState.AFTER_BCI) { + Debug.log("Ignoring InfopointNode for AFTER_BCI"); + } else { + super.visitInfopointNode(i); + } + } + + public void emitPrefetchAllocate(ValueNode address, ValueNode distance) { + AMD64AddressValue addr = getGen().emitAddress(operand(address), 0, gen.loadNonConst(operand(distance)), 1); + append(new AMD64PrefetchOp(addr, getGen().config.allocatePrefetchInstr)); + } + + @Override + public void visitDirectCompareAndSwap(DirectCompareAndSwapNode x) { + Kind kind = x.newValue().getKind(); + assert kind == x.expectedValue().getKind(); + + Value expected = gen.loadNonConst(operand(x.expectedValue())); + Variable newVal = gen.load(operand(x.newValue())); + + int disp = 0; + AMD64AddressValue address; + Value index = operand(x.offset()); + if (ValueUtil.isConstant(index) && NumUtil.isInt(ValueUtil.asConstant(index).asLong() + disp)) { + assert !gen.getCodeCache().needsDataPatch(asConstant(index)); + disp += (int) ValueUtil.asConstant(index).asLong(); + address = new AMD64AddressValue(kind, gen.load(operand(x.object())), disp); + } else { + address = new AMD64AddressValue(kind, gen.load(operand(x.object())), gen.load(index), Scale.Times1, disp); + } + + RegisterValue rax_local = AMD64.rax.asValue(kind); + gen.emitMove(rax_local, expected); + append(new CompareAndSwapOp(rax_local, address, rax_local, newVal)); + + Variable result = newVariable(x.getKind()); + gen.emitMove(result, rax_local); + setResult(x, result); + } + + @Override + public void visitCompareAndSwap(LoweredCompareAndSwapNode node, Value address) { + Kind kind = node.getNewValue().getKind(); + assert kind == node.getExpectedValue().getKind(); + Value expected = gen.loadNonConst(operand(node.getExpectedValue())); + Variable newValue = gen.load(operand(node.getNewValue())); + AMD64AddressValue addressValue = getGen().asAddressValue(address); + RegisterValue raxRes = AMD64.rax.asValue(kind); + gen.emitMove(raxRes, expected); + if (getGen().config.useCompressedOops && node.isCompressible()) { + Variable scratch = newVariable(Kind.Long); + Register heapBaseReg = getGen().getProviders().getRegisters().getHeapBaseRegister(); + append(new CompareAndSwapCompressedOp(raxRes, addressValue, raxRes, newValue, scratch, getGen().config.getOopEncoding(), heapBaseReg)); + } else { + append(new CompareAndSwapOp(raxRes, addressValue, raxRes, newValue)); + } + Variable result = newVariable(node.getKind()); + append(new CondMoveOp(result, Condition.EQ, gen.load(Constant.TRUE), Constant.FALSE)); + setResult(node, result); + } + +} diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotSafepointOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotSafepointOp.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotSafepointOp.java Wed Mar 26 11:49:07 2014 +0100 @@ -47,11 +47,11 @@ private final HotSpotVMConfig config; - public AMD64HotSpotSafepointOp(LIRFrameState state, HotSpotVMConfig config, NodeBasedLIRGeneratorTool tool) { + public AMD64HotSpotSafepointOp(LIRFrameState state, HotSpotVMConfig config, NodeLIRGeneratorTool tool) { this.state = state; this.config = config; if (isPollingPageFar(config) || ImmutableCode.getValue()) { - temp = tool.newVariable(tool.target().wordKind); + temp = tool.getLIRGeneratorTool().newVariable(tool.getLIRGeneratorTool().target().wordKind); } else { // Don't waste a register if it's unneeded temp = Value.ILLEGAL; diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64RawNativeCallNode.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64RawNativeCallNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64RawNativeCallNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -44,19 +44,20 @@ } @Override - public void generate(LIRGenerator generator) { - AMD64LIRGenerator gen = (AMD64LIRGenerator) generator; + public void generate(NodeLIRGenerator generator) { + AMD64NodeLIRGenerator gen = (AMD64NodeLIRGenerator) generator; Value[] parameter = new Value[args.count()]; JavaType[] parameterTypes = new JavaType[args.count()]; for (int i = 0; i < args.count(); i++) { parameter[i] = generator.operand(args.get(i)); - parameterTypes[i] = args.get(i).stamp().javaType(gen.getMetaAccess()); + parameterTypes[i] = args.get(i).stamp().javaType(gen.getLIRGeneratorTool().getMetaAccess()); } - ResolvedJavaType returnType = stamp().javaType(gen.getMetaAccess()); - CallingConvention cc = generator.getCodeCache().getRegisterConfig().getCallingConvention(Type.NativeCall, returnType, parameterTypes, generator.target(), false); - gen.emitCCall(functionPointer.asLong(), cc, parameter, countFloatingTypeArguments(args)); + ResolvedJavaType returnType = stamp().javaType(gen.getLIRGeneratorTool().getMetaAccess()); + CallingConvention cc = generator.getLIRGeneratorTool().getCodeCache().getRegisterConfig().getCallingConvention(Type.NativeCall, returnType, parameterTypes, + generator.getLIRGeneratorTool().target(), false); + ((AMD64LIRGenerator) gen.getLIRGeneratorTool()).emitCCall(functionPointer.asLong(), cc, parameter, countFloatingTypeArguments(args)); if (this.getKind() != Kind.Void) { - generator.setResult(this, gen.emitMove(cc.getReturn())); + generator.setResult(this, gen.getLIRGeneratorTool().emitMove(cc.getReturn())); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotLIRGenerator.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotLIRGenerator.java Wed Mar 26 11:49:07 2014 +0100 @@ -26,13 +26,11 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.hotspot.meta.*; -import com.oracle.graal.hotspot.nodes.*; -import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; /** * This interface defines the contract a HotSpot backend LIR generator needs to fulfill in addition - * to abstract methods from {@link LIRGenerator} and {@link NodeBasedLIRGeneratorTool}. + * to abstract methods from {@link LIRGenerator} and {@link NodeLIRGeneratorTool}. */ public interface HotSpotLIRGenerator { @@ -46,14 +44,6 @@ void emitDeoptimizeCaller(DeoptimizationAction action, DeoptimizationReason reason); - void emitPatchReturnAddress(ValueNode address); - - void emitJumpToExceptionHandlerInCaller(ValueNode handlerInCallerPc, ValueNode exception, ValueNode exceptionPc); - - void emitPrefetchAllocate(ValueNode address, ValueNode distance); - - void visitDirectCompareAndSwap(DirectCompareAndSwapNode x); - /** * Gets a stack slot for a lock at a given lock nesting depth. */ diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotNodeLIRGenerator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotNodeLIRGenerator.java Wed Mar 26 11:49:07 2014 +0100 @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.hotspot; + +import com.oracle.graal.compiler.gen.*; +import com.oracle.graal.hotspot.nodes.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; + +/** + * This interface defines the contract a HotSpot backend LIR generator needs to fulfill in addition + * to abstract methods from {@link LIRGenerator} and {@link NodeLIRGeneratorTool}. + */ +public interface HotSpotNodeLIRGenerator { + + void emitPatchReturnAddress(ValueNode address); + + void emitJumpToExceptionHandlerInCaller(ValueNode handlerInCallerPc, ValueNode exception, ValueNode exceptionPc); + + void emitPrefetchAllocate(ValueNode address, ValueNode distance); + + void visitDirectCompareAndSwap(DirectCompareAndSwapNode x); + +} diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/AllocaNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/AllocaNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/AllocaNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -30,6 +30,7 @@ import com.oracle.graal.compiler.target.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; /** @@ -57,9 +58,9 @@ } @Override - public void generate(LIRGenerator gen, LIRGenerationResult res) { + public void generate(NodeLIRGeneratorTool gen, LIRGenerationResult res) { StackSlot array = res.getFrameMap().allocateStackSlots(slots, objects, null); - Value result = gen.emitAddress(array); + Value result = gen.getLIRGeneratorTool().emitAddress(array); gen.setResult(this, result); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -57,11 +57,11 @@ } @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGenerator gen) { assert lockDepth != -1; HotSpotLIRGenerator hsGen = (HotSpotLIRGenerator) gen; StackSlot slot = hsGen.getLockSlot(lockDepth); - Value result = gen.emitAddress(slot); + Value result = gen.getLIRGeneratorTool().emitAddress(slot); gen.setResult(this, result); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentJavaThreadNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentJavaThreadNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentJavaThreadNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -41,7 +41,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { Register rawThread = ((HotSpotLIRGenerator) gen).getProviders().getRegisters().getThreadRegister(); gen.setResult(this, rawThread.asValue(this.getKind())); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentLockNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentLockNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CurrentLockNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -24,16 +24,15 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.gen.*; -import com.oracle.graal.compiler.target.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.word.*; /** * Intrinsic for getting the lock in the current {@linkplain BeginLockScopeNode lock scope}. */ -public final class CurrentLockNode extends FixedWithNextNode implements LIRGenLowerable { +public final class CurrentLockNode extends FixedWithNextNode implements LIRLowerable { private int lockDepth; @@ -43,12 +42,12 @@ } @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGeneratorTool gen) { assert lockDepth != -1; HotSpotLIRGenerator hsGen = (HotSpotLIRGenerator) gen; StackSlot slot = hsGen.getLockSlot(lockDepth); // The register allocator cannot handle stack -> register moves so we use an LEA here - Value result = gen.emitMove(gen.emitAddress(slot)); + Value result = gen.getLIRGeneratorTool().emitMove(gen.getLIRGeneratorTool().emitAddress(slot)); gen.setResult(this, result); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DeoptimizeCallerNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DeoptimizeCallerNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DeoptimizeCallerNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -45,7 +45,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { ((HotSpotLIRGenerator) gen).emitDeoptimizeCaller(action, reason); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DimensionsNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DimensionsNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DimensionsNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -31,6 +31,7 @@ import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.target.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.word.*; /** @@ -47,12 +48,12 @@ } @Override - public void generate(LIRGenerator gen, LIRGenerationResult res) { + public void generate(NodeLIRGeneratorTool gen, LIRGenerationResult res) { int size = rank * 4; - int wordSize = gen.target().wordSize; + int wordSize = gen.getLIRGeneratorTool().target().wordSize; int slots = roundUp(size, wordSize) / wordSize; StackSlot array = res.getFrameMap().allocateStackSlots(slots, new BitSet(0), null); - Value result = gen.emitAddress(array); + Value result = gen.getLIRGeneratorTool().emitAddress(array); gen.setResult(this, result); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -77,8 +77,8 @@ } @Override - public void generate(LIRGenerator gen) { - ((HotSpotLIRGenerator) gen).visitDirectCompareAndSwap(this); + public void generate(NodeLIRGenerator gen) { + ((HotSpotNodeLIRGenerator) gen).visitDirectCompareAndSwap(this); } /** diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -23,17 +23,16 @@ package com.oracle.graal.hotspot.nodes; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.gen.*; -import com.oracle.graal.compiler.target.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; /** * Intrinsic for closing a {@linkplain BeginLockScopeNode scope} binding a stack-based lock with an * object. */ -public final class EndLockScopeNode extends AbstractMemoryCheckpoint implements LIRGenLowerable, MonitorExit, MemoryCheckpoint.Single { +public final class EndLockScopeNode extends AbstractMemoryCheckpoint implements LIRLowerable, MonitorExit, MemoryCheckpoint.Single { public EndLockScopeNode() { super(StampFactory.forVoid()); @@ -50,7 +49,7 @@ } @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGeneratorTool gen) { } @NodeIntrinsic diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/GetObjectAddressNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/GetObjectAddressNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/GetObjectAddressNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -45,9 +45,9 @@ public static native long get(Object array); @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - AllocatableValue obj = gen.newVariable(gen.target().wordKind); - gen.emitMove(obj, gen.operand(object)); + public void generate(NodeLIRGeneratorTool gen) { + AllocatableValue obj = gen.getLIRGeneratorTool().newVariable(gen.getLIRGeneratorTool().target().wordKind); + gen.getLIRGeneratorTool().emitMove(obj, gen.operand(object)); gen.setResult(this, obj); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/JumpToExceptionHandlerInCallerNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/JumpToExceptionHandlerInCallerNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/JumpToExceptionHandlerInCallerNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -46,8 +46,8 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - ((HotSpotLIRGenerator) gen).emitJumpToExceptionHandlerInCaller(handlerInCallerPc, exception, exceptionPc); + public void generate(NodeLIRGeneratorTool gen) { + ((HotSpotNodeLIRGenerator) gen).emitJumpToExceptionHandlerInCaller(handlerInCallerPc, exception, exceptionPc); } @NodeIntrinsic diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/MonitorCounterNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/MonitorCounterNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/MonitorCounterNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -29,6 +29,7 @@ import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.target.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.word.*; /** @@ -41,10 +42,10 @@ } @Override - public void generate(LIRGenerator gen, LIRGenerationResult res) { + public void generate(NodeLIRGeneratorTool gen, LIRGenerationResult res) { assert graph().getNodes().filter(MonitorCounterNode.class).count() == 1 : "monitor counters not canonicalized to single instance"; StackSlot counter = res.getFrameMap().allocateStackSlots(1, new BitSet(0), null); - Value result = gen.emitAddress(counter); + Value result = gen.getLIRGeneratorTool().emitAddress(counter); gen.setResult(this, result); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/MonitorExitStubCall.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/MonitorExitStubCall.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/MonitorExitStubCall.java Wed Mar 26 11:49:07 2014 +0100 @@ -47,12 +47,12 @@ } @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGenerator gen) { assert lockDepth != -1; HotSpotLIRGenerator hsGen = (HotSpotLIRGenerator) gen; StackSlot slot = hsGen.getLockSlot(lockDepth); - ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(MonitorExitStubCall.MONITOREXIT); - gen.emitForeignCall(linkage, this, gen.operand(object), gen.emitAddress(slot)); + ForeignCallLinkage linkage = gen.getLIRGeneratorTool().getForeignCalls().lookupForeignCall(MonitorExitStubCall.MONITOREXIT); + gen.getLIRGeneratorTool().emitForeignCall(linkage, this, gen.operand(object), gen.getLIRGeneratorTool().emitAddress(slot)); } @NodeIntrinsic diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewArrayStubCall.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewArrayStubCall.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewArrayStubCall.java Wed Mar 26 11:49:07 2014 +0100 @@ -61,9 +61,9 @@ } @Override - public void generate(LIRGenerator gen) { - ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(NEW_ARRAY); - Variable result = gen.emitForeignCall(linkage, this, gen.operand(hub), gen.operand(length)); + public void generate(NodeLIRGenerator gen) { + ForeignCallLinkage linkage = gen.getLIRGeneratorTool().getForeignCalls().lookupForeignCall(NEW_ARRAY); + Variable result = gen.getLIRGenerator().emitForeignCall(linkage, this, gen.operand(hub), gen.operand(length)); gen.setResult(this, result); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewInstanceStubCall.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewInstanceStubCall.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewInstanceStubCall.java Wed Mar 26 11:49:07 2014 +0100 @@ -24,19 +24,17 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.gen.*; -import com.oracle.graal.compiler.target.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.stubs.*; -import com.oracle.graal.lir.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.word.*; /** * A call to the {@link NewInstanceStub}. */ -public class NewInstanceStubCall extends DeoptimizingStubCall implements LIRGenLowerable { +public class NewInstanceStubCall extends DeoptimizingStubCall implements LIRLowerable { private static final Stamp defaultStamp = StampFactory.objectNonNull(); @@ -59,9 +57,9 @@ } @Override - public void generate(LIRGenerator gen) { - ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(NEW_INSTANCE); - Variable result = gen.emitForeignCall(linkage, this, gen.operand(hub)); + public void generate(NodeLIRGeneratorTool gen) { + ForeignCallLinkage linkage = gen.getLIRGeneratorTool().getForeignCalls().lookupForeignCall(NEW_INSTANCE); + Value result = gen.getLIRGeneratorTool().emitForeignCall(linkage, this, gen.operand(hub)); gen.setResult(this, result); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewMultiArrayStubCall.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewMultiArrayStubCall.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewMultiArrayStubCall.java Wed Mar 26 11:49:07 2014 +0100 @@ -61,7 +61,7 @@ } @Override - protected Value[] operands(NodeBasedLIRGeneratorTool gen) { + protected Value[] operands(NodeLIRGeneratorTool gen) { return new Value[]{gen.operand(hub), Constant.forInt(rank), gen.operand(dims)}; } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/PatchReturnAddressNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/PatchReturnAddressNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/PatchReturnAddressNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -41,8 +41,8 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - ((HotSpotLIRGenerator) gen).emitPatchReturnAddress(address); + public void generate(NodeLIRGeneratorTool gen) { + ((HotSpotNodeLIRGenerator) gen).emitPatchReturnAddress(address); } @NodeIntrinsic diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/PrefetchAllocateNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/PrefetchAllocateNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/PrefetchAllocateNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -42,8 +42,8 @@ } @Override - public void generate(LIRGenerator gen) { - ((HotSpotLIRGenerator) gen).emitPrefetchAllocate(address, distance); + public void generate(NodeLIRGenerator gen) { + ((HotSpotNodeLIRGenerator) gen).emitPrefetchAllocate(address, distance); } @NodeIntrinsic diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/StubForeignCallNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -57,7 +57,7 @@ return foreignCalls.getKilledLocations(descriptor); } - protected Value[] operands(NodeBasedLIRGeneratorTool gen) { + protected Value[] operands(NodeLIRGeneratorTool gen) { Value[] operands = new Value[arguments.size()]; for (int i = 0; i < operands.length; i++) { operands[i] = gen.operand(arguments.get(i)); @@ -66,11 +66,11 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { assert graph().start() instanceof StubStartNode; - ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(descriptor); + ForeignCallLinkage linkage = gen.getLIRGeneratorTool().getForeignCalls().lookupForeignCall(descriptor); Value[] operands = operands(gen); - Value result = gen.emitForeignCall(linkage, null, operands); + Value result = gen.getLIRGeneratorTool().emitForeignCall(linkage, null, operands); if (result != null) { gen.setResult(this, result); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/TailcallNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -34,6 +34,7 @@ import com.oracle.graal.hotspot.*; import com.oracle.graal.java.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; /** @@ -57,20 +58,20 @@ this.frameState = frameState; } - public void generate(LIRGenerator gen, LIRGenerationResult res) { + public void generate(NodeLIRGeneratorTool gen, LIRGenerationResult res) { HotSpotVMConfig config = runtime().getConfig(); ResolvedJavaMethod method = frameState.method(); boolean isStatic = Modifier.isStatic(method.getModifiers()); JavaType[] signature = MetaUtil.signatureToTypes(method.getSignature(), isStatic ? null : method.getDeclaringClass()); - CallingConvention cc = res.getFrameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, signature, gen.target(), false); + CallingConvention cc = res.getFrameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, signature, gen.getLIRGeneratorTool().target(), false); List parameters = new ArrayList<>(); for (int i = 0, slot = 0; i < cc.getArgumentCount(); i++, slot += HIRFrameStateBuilder.stackSlots(frameState.localAt(slot).getKind())) { parameters.add(frameState.localAt(slot)); } Value[] args = gen.visitInvokeArguments(cc, parameters); - Value address = gen.emitAddress(gen.operand(target), config.nmethodEntryOffset, Value.ILLEGAL, 0); - Value entry = gen.emitLoad(Kind.Long, address, null); + Value address = gen.getLIRGeneratorTool().emitAddress(gen.operand(target), config.nmethodEntryOffset, Value.ILLEGAL, 0); + Value entry = gen.getLIRGeneratorTool().emitLoad(Kind.Long, address, null); HotSpotLIRGenerator hsgen = (HotSpotLIRGenerator) gen; hsgen.emitTailcall(args, entry); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/VMErrorNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -24,9 +24,8 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.gen.*; -import com.oracle.graal.compiler.target.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.replacements.*; @@ -34,7 +33,7 @@ * Causes the VM to exit with a description of the current Java location and an optional * {@linkplain Log#printf(String, long) formatted} error message specified. */ -public final class VMErrorNode extends DeoptimizingStubCall implements LIRGenLowerable { +public final class VMErrorNode extends DeoptimizingStubCall implements LIRLowerable { private final String format; @Input private ValueNode value; @@ -47,7 +46,7 @@ } @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGeneratorTool gen) { String whereString = "in compiled code for " + graph(); // As these strings will end up embedded as oops in the code, they @@ -57,8 +56,8 @@ Constant whereArg = Constant.forObject(whereString.intern()); Constant formatArg = Constant.forObject(format.intern()); - ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(VMErrorNode.VM_ERROR); - gen.emitForeignCall(linkage, null, whereArg, formatArg, gen.operand(value)); + ForeignCallLinkage linkage = gen.getLIRGeneratorTool().getForeignCalls().lookupForeignCall(VMErrorNode.VM_ERROR); + gen.getLIRGeneratorTool().emitForeignCall(linkage, null, whereArg, formatArg, gen.operand(value)); } @NodeIntrinsic diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ArrayEqualsOp.java --- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ArrayEqualsOp.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64ArrayEqualsOp.java Wed Mar 26 11:49:07 2014 +0100 @@ -62,7 +62,7 @@ @Temp({REG}) protected Value vectorTemp1; @Temp({REG}) protected Value vectorTemp2; - public AMD64ArrayEqualsOp(NodeBasedLIRGeneratorTool tool, Kind kind, Value result, Value array1, Value array2, Value length) { + public AMD64ArrayEqualsOp(LIRGeneratorTool tool, Kind kind, Value result, Value array1, Value array2, Value length) { this.kind = kind; Class arrayClass = Array.newInstance(kind.toJavaClass(), 0).getClass(); diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java Wed Mar 26 11:49:07 2014 +0100 @@ -238,13 +238,13 @@ @Def({REG}) protected Value scratch2; @State protected LIRFrameState state; - public RemOp(SPARCArithmetic opcode, Value result, Value x, Value y, LIRFrameState state, NodeBasedLIRGeneratorTool gen) { + public RemOp(SPARCArithmetic opcode, Value result, Value x, Value y, LIRFrameState state, NodeLIRGeneratorTool gen) { this.opcode = opcode; this.result = result; this.x = x; this.y = y; - this.scratch1 = gen.newVariable(x.getKind()); - this.scratch2 = gen.newVariable(x.getKind()); + this.scratch1 = gen.getLIRGeneratorTool().newVariable(x.getKind()); + this.scratch2 = gen.getLIRGeneratorTool().newVariable(x.getKind()); this.state = state; } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCBitManipulationOp.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCBitManipulationOp.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCBitManipulationOp.java Wed Mar 26 11:49:07 2014 +0100 @@ -47,12 +47,12 @@ @Use({REG}) protected AllocatableValue input; @Def({REG}) protected Value scratch; - public SPARCBitManipulationOp(IntrinsicOpcode opcode, AllocatableValue result, AllocatableValue input, NodeBasedLIRGeneratorTool gen) { + public SPARCBitManipulationOp(IntrinsicOpcode opcode, AllocatableValue result, AllocatableValue input, NodeLIRGeneratorTool gen) { this.opcode = opcode; this.result = result; this.input = input; if (opcode == IntrinsicOpcode.IBSR || opcode == IntrinsicOpcode.LBSR) { - scratch = gen.newVariable(input.getKind()); + scratch = gen.getLIRGeneratorTool().newVariable(input.getKind()); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractBeginNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -128,7 +128,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { // nop } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractEndNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractEndNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractEndNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -35,7 +35,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.visitEndNode(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BreakpointNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BreakpointNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BreakpointNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -54,7 +54,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.visitBreakpointNode(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -54,7 +54,7 @@ public abstract String targetName(); @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { // nop } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -120,12 +120,12 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { assert ConstantNodeRecordsUsages : "LIR generator should generate constants per-usage"; - if (gen.canInlineConstant(value) || onlyUsedInVirtualState()) { + if (gen.getLIRGeneratorTool().canInlineConstant(value) || onlyUsedInVirtualState()) { gen.setResult(this, value); } else { - gen.setResult(this, gen.emitMove(value)); + gen.setResult(this, gen.getLIRGeneratorTool().emitMove(value)); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -62,8 +62,8 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - gen.emitDeoptimize(gen.getMetaAccess().encodeDeoptActionAndReason(action, reason, debugId), speculation, this); + public void generate(NodeLIRGeneratorTool gen) { + gen.getLIRGeneratorTool().emitDeoptimize(gen.getLIRGeneratorTool().getMetaAccess().encodeDeoptActionAndReason(action, reason, debugId), speculation, this); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DynamicDeoptimizeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DynamicDeoptimizeNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DynamicDeoptimizeNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -54,8 +54,8 @@ return getSpeculation(); } - public void generate(NodeBasedLIRGeneratorTool generator) { - generator.emitDeoptimize(generator.operand(actionAndReason), generator.operand(speculation), this); + public void generate(NodeLIRGeneratorTool generator) { + generator.getLIRGeneratorTool().emitDeoptimize(generator.operand(actionAndReason), generator.operand(speculation), this); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EntryMarkerNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EntryMarkerNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/EntryMarkerNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -38,7 +38,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { throw new GraalInternalError("OnStackReplacementNode should not survive"); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardedValueNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -53,7 +53,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { if (object.getKind() != Kind.Void && object.getKind() != Kind.Illegal) { generator.setResult(this, generator.operand(object)); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -126,7 +126,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.emitIf(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InfopointNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InfopointNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InfopointNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -41,7 +41,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { generator.visitInfopointNode(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -113,7 +113,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.emitInvoke(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -133,7 +133,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.emitInvoke(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConstantNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConstantNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LogicConstantNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -68,7 +68,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { // nothing to do } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopBeginNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -98,7 +98,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { // Nothing to emit, since this is node is used for structural purposes only. } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopEndNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -64,7 +64,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.visitLoopEnd(this); super.generate(gen); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryProxyNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryProxyNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MemoryProxyNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -42,7 +42,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -41,7 +41,7 @@ @Input(notDataflow = true) private final NodeInputList ends = new NodeInputList<>(this); @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.visitMerge(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -62,7 +62,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { if (object.getKind() != Kind.Void && object.getKind() != Kind.Illegal) { generator.setResult(this, generator.operand(object)); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ReturnNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ReturnNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ReturnNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -57,7 +57,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.visitReturn(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/SafepointNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -35,7 +35,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.visitSafepointNode(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/UnwindNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/UnwindNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/UnwindNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -49,7 +49,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - gen.emitUnwind(gen.operand(exception())); + public void generate(NodeLIRGeneratorTool gen) { + gen.getLIRGeneratorTool().emitUnwind(gen.operand(exception())); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -80,7 +80,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitAnd(gen.operand(x()), gen.operand(y()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitAnd(gen.operand(x()), gen.operand(y()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -74,7 +74,7 @@ public abstract boolean unorderedIsTrue(); @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { } private LogicNode optimizeConditional(Constant constant, ConditionalNode conditionalNode, ConstantReflectionProvider constantReflection, Condition cond) { diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -109,7 +109,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { generator.emitConditional(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -64,7 +64,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { + public void generate(NodeLIRGeneratorTool gen) { Value op1 = gen.operand(x()); Value op2 = gen.operand(y()); if (!y().isConstant() && !livesLonger(this, y(), gen)) { @@ -72,10 +72,10 @@ op1 = op2; op2 = op; } - gen.setResult(this, gen.emitAdd(op1, op2)); + gen.setResult(this, gen.getLIRGeneratorTool().emitAdd(op1, op2)); } - public static boolean livesLonger(ValueNode after, ValueNode value, NodeMappableArithmeticLIRGenerator gen) { + public static boolean livesLonger(ValueNode after, ValueNode value, NodeLIRGeneratorTool gen) { for (Node usage : value.usages()) { if (usage != after && usage instanceof ValueNode && gen.operand(((ValueNode) usage)) != null) { return true; diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -191,7 +191,7 @@ tool.getLowerer().lower(this, tool); } - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitFloatConvert(op, gen.operand(getInput()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitFloatConvert(op, gen.operand(getInput()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -56,7 +56,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitDiv(gen.operand(x()), gen.operand(y()), null)); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitDiv(gen.operand(x()), gen.operand(y()), null)); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -59,7 +59,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { + public void generate(NodeLIRGeneratorTool gen) { Value op1 = gen.operand(x()); Value op2 = gen.operand(y()); if (!y().isConstant() && !FloatAddNode.livesLonger(this, y(), gen)) { @@ -67,6 +67,6 @@ op1 = op2; op2 = op; } - gen.setResult(this, gen.emitMul(op1, op2)); + gen.setResult(this, gen.getLIRGeneratorTool().emitMul(op1, op2)); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatRemNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatRemNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatRemNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -56,7 +56,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitRem(gen.operand(x()), gen.operand(y()), null)); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitRem(gen.operand(x()), gen.operand(y()), null)); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -75,7 +75,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitSub(gen.operand(x()), gen.operand(y()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitSub(gen.operand(x()), gen.operand(y()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -91,7 +91,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { + public void generate(NodeLIRGeneratorTool gen) { Value op1 = gen.operand(x()); assert op1 != null : x() + ", this=" + this; Value op2 = gen.operand(y()); @@ -100,6 +100,6 @@ op1 = op2; op2 = op; } - gen.setResult(this, gen.emitAdd(op1, op2)); + gen.setResult(this, gen.getLIRGeneratorTool().emitAdd(op1, op2)); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -106,8 +106,8 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - gen.setResult(this, gen.emitDiv(gen.operand(x()), gen.operand(y()), this)); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitDiv(gen.operand(x()), gen.operand(y()), this)); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -74,7 +74,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { + public void generate(NodeLIRGeneratorTool gen) { Value op1 = gen.operand(x()); Value op2 = gen.operand(y()); if (!y().isConstant() && !FloatAddNode.livesLonger(this, y(), gen)) { @@ -82,6 +82,6 @@ op1 = op2; op2 = op; } - gen.setResult(this, gen.emitMul(op1, op2)); + gen.setResult(this, gen.getLIRGeneratorTool().emitMul(op1, op2)); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerRemNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerRemNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerRemNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -61,8 +61,8 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - gen.setResult(this, gen.emitRem(gen.operand(x()), gen.operand(y()), this)); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitRem(gen.operand(x()), gen.operand(y()), this)); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -114,7 +114,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitSub(gen.operand(x()), gen.operand(y()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitSub(gen.operand(x()), gen.operand(y()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -59,7 +59,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -50,7 +50,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { // Nothing to do. } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LeftShiftNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LeftShiftNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LeftShiftNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -98,7 +98,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitShl(gen.operand(x()), gen.operand(y()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitShl(gen.operand(x()), gen.operand(y()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NarrowNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -109,7 +109,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitNarrow(gen.operand(getInput()), getResultBits())); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitNarrow(gen.operand(getInput()), getResultBits())); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NegateNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NegateNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NegateNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -88,7 +88,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitNegate(gen.operand(x()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitNegate(gen.operand(x()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NotNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NotNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NotNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -73,7 +73,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitNot(gen.operand(x()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitNot(gen.operand(x()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -72,7 +72,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitOr(gen.operand(x()), gen.operand(y()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitOr(gen.operand(x()), gen.operand(y()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ReinterpretNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ReinterpretNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ReinterpretNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -101,9 +101,9 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - PlatformKind kind = gen.getPlatformKind(stamp()); - gen.setResult(this, gen.emitReinterpret(kind, gen.operand(value()))); + public void generate(NodeLIRGeneratorTool gen) { + PlatformKind kind = gen.getLIRGeneratorTool().getPlatformKind(stamp()); + gen.setResult(this, gen.getLIRGeneratorTool().emitReinterpret(kind, gen.operand(value()))); } public static ValueNode reinterpret(Kind toKind, ValueNode value) { diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/RightShiftNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/RightShiftNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/RightShiftNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -104,7 +104,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitShr(gen.operand(x()), gen.operand(y()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitShr(gen.operand(x()), gen.operand(y()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SignExtendNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -104,7 +104,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitSignExtend(gen.operand(getInput()), getInputBits(), getResultBits())); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitSignExtend(gen.operand(getInput()), getInputBits(), getResultBits())); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedDivNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedDivNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedDivNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -71,8 +71,8 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - gen.setResult(this, gen.emitUDiv(gen.operand(x()), gen.operand(y()), this)); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitUDiv(gen.operand(x()), gen.operand(y()), this)); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRemNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRemNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRemNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -70,8 +70,8 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - gen.setResult(this, gen.emitURem(gen.operand(x()), gen.operand(y()), this)); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitURem(gen.operand(x()), gen.operand(y()), this)); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRightShiftNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRightShiftNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRightShiftNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -98,7 +98,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitUShr(gen.operand(x()), gen.operand(y()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitUShr(gen.operand(x()), gen.operand(y()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -71,7 +71,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitXor(gen.operand(x()), gen.operand(y()))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitXor(gen.operand(x()), gen.operand(y()))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ZeroExtendNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -84,7 +84,7 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitZeroExtend(gen.operand(getInput()), getInputBits(), getResultBits())); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitZeroExtend(gen.operand(getInput()), getInputBits(), getResultBits())); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -107,7 +107,7 @@ } @Override - public Value generateAddress(NodeBasedLIRGeneratorTool gen, Value base) { + public Value generateAddress(NodeLIRGeneratorTool gen, Value base) { Value xAddr = getX().generateAddress(gen, base); return getY().generateAddress(gen, xAddr); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ComputeAddressNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ComputeAddressNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ComputeAddressNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -48,7 +48,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { Value addr = getLocation().generateAddress(gen, gen.operand(getObject())); gen.setResult(this, addr); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -65,7 +65,7 @@ } @Override - public Value generateAddress(NodeBasedLIRGeneratorTool gen, Value base) { - return gen.emitAddress(base, getDisplacement(), Value.ILLEGAL, 0); + public Value generateAddress(NodeLIRGeneratorTool gen, Value base) { + return gen.getLIRGeneratorTool().emitAddress(base, getDisplacement(), Value.ILLEGAL, 0); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedValueAnchorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedValueAnchorNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FixedValueAnchorNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -49,7 +49,7 @@ public static native T getObject(Object object); @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { generator.setResult(this, generator.operand(object)); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -60,9 +60,9 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { Value address = location().generateAddress(gen, gen.operand(object())); - gen.setResult(this, gen.emitLoad(location().getValueKind(), address, this)); + gen.setResult(this, gen.getLIRGeneratorTool().emitLoad(location().getValueKind(), address, this)); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ForeignCallNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -82,7 +82,7 @@ return foreignCalls.getKilledLocations(descriptor); } - protected Value[] operands(NodeBasedLIRGeneratorTool gen) { + protected Value[] operands(NodeLIRGeneratorTool gen) { Value[] operands = new Value[arguments.size()]; for (int i = 0; i < operands.length; i++) { operands[i] = gen.operand(arguments.get(i)); @@ -91,10 +91,10 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(descriptor); + public void generate(NodeLIRGeneratorTool gen) { + ForeignCallLinkage linkage = gen.getLIRGeneratorTool().getForeignCalls().lookupForeignCall(descriptor); Value[] operands = operands(gen); - Value result = gen.emitForeignCall(linkage, this, operands); + Value result = gen.getLIRGeneratorTool().emitForeignCall(linkage, this, operands); if (result != null) { gen.setResult(this, result); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -96,7 +96,7 @@ } @Override - public Value generateAddress(NodeBasedLIRGeneratorTool gen, Value base) { - return gen.emitAddress(base, displacement, gen.operand(getIndex()), getIndexScaling()); + public Value generateAddress(NodeLIRGeneratorTool gen, Value base) { + return gen.getLIRGeneratorTool().emitAddress(base, displacement, gen.operand(getIndex()), getIndexScaling()); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IntegerSwitchNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IntegerSwitchNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IntegerSwitchNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -101,7 +101,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.emitSwitch(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -56,9 +56,9 @@ public abstract LocationIdentity getLocationIdentity(); @Override - public final void generate(NodeBasedLIRGeneratorTool generator) { + public final void generate(NodeLIRGeneratorTool generator) { // nothing to do... } - public abstract Value generateAddress(NodeBasedLIRGeneratorTool gen, Value base); + public abstract Value generateAddress(NodeLIRGeneratorTool gen, Value base); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -56,8 +56,8 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { - generator.emitMembar(barriers); + public void generate(NodeLIRGeneratorTool generator) { + generator.getLIRGeneratorTool().emitMembar(barriers); } public MemoryCheckpoint asMemoryCheckpoint() { diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/NullCheckNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/NullCheckNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/NullCheckNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -40,7 +40,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { generator.emitNullCheck(object, this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -53,9 +53,9 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { Value address = location().generateAddress(gen, gen.operand(object())); - gen.setResult(this, gen.emitLoad(location().getValueKind(), address, this)); + gen.setResult(this, gen.getLIRGeneratorTool().emitLoad(location().getValueKind(), address, this)); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SnippetLocationNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SnippetLocationNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SnippetLocationNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -100,7 +100,7 @@ } @Override - public Value generateAddress(NodeBasedLIRGeneratorTool gen, Value base) { + public Value generateAddress(NodeLIRGeneratorTool gen, Value base) { throw new GraalInternalError("locationIdentity must be a constant so that this node can be canonicalized: " + locationIdentity); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -94,7 +94,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { assert getKind() == Kind.Object && object.getKind() == Kind.Object; /* * The LIR only cares about the kind of an operand, not the actual type of an object. So we diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -41,7 +41,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { // Nothing to emit, since this node is used for structural purposes only. } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -89,17 +89,17 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { Value address = location().generateAddress(gen, gen.operand(object())); // It's possible a constant was forced for other usages so inspect the value directly and // use a constant if it can be directly stored. Value v; - if (value().isConstant() && gen.canStoreConstant(value().asConstant(), isCompressible())) { + if (value().isConstant() && gen.getLIRGeneratorTool().canStoreConstant(value().asConstant(), isCompressible())) { v = value().asConstant(); } else { v = gen.operand(value()); } - gen.emitStore(location().getValueKind(), address, v, this); + gen.getLIRGeneratorTool().emitStore(location().getValueKind(), address, v, this); } @NodeIntrinsic diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredCompareAndSwapNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredCompareAndSwapNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoweredCompareAndSwapNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -72,7 +72,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.visitCompareAndSwap(this, location().generateAddress(gen, gen.operand(object()))); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorIdNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorIdNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorIdNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -49,7 +49,7 @@ this.lockDepth = lockDepth; } - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { // nothing to do } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -51,9 +51,9 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(REGISTER_FINALIZER); - gen.emitForeignCall(linkage, this, gen.operand(object())); + public void generate(NodeLIRGeneratorTool gen) { + ForeignCallLinkage linkage = gen.getLIRGeneratorTool().getForeignCalls().lookupForeignCall(REGISTER_FINALIZER); + gen.getLIRGeneratorTool().emitForeignCall(linkage, this, gen.operand(object())); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/SelfReplacingMethodCallTargetNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/SelfReplacingMethodCallTargetNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/SelfReplacingMethodCallTargetNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -29,7 +29,7 @@ import com.oracle.graal.graph.GraalInternalError; import com.oracle.graal.graph.NodeInputList; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.spi.NodeBasedLIRGeneratorTool; +import com.oracle.graal.nodes.spi.NodeLIRGeneratorTool; import com.oracle.graal.nodes.spi.Lowerable; import com.oracle.graal.nodes.spi.LoweringTool; @@ -78,7 +78,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { throw GraalInternalError.shouldNotReachHere("should have replaced itself"); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/TypeSwitchNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -92,7 +92,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { gen.emitSwitch(this); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/ArithmeticLIRLowerable.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/ArithmeticLIRLowerable.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/ArithmeticLIRLowerable.java Wed Mar 26 11:49:07 2014 +0100 @@ -26,5 +26,5 @@ public interface ArithmeticLIRLowerable extends ArithmeticOperation { - void generate(NodeMappableArithmeticLIRGenerator gen); + void generate(NodeLIRGeneratorTool gen); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Wed Mar 26 11:49:07 2014 +0100 @@ -24,8 +24,10 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.extended.*; -public interface LIRGeneratorTool { +public interface LIRGeneratorTool extends ArithmeticLIRGenerator { TargetDescription target(); @@ -35,6 +37,14 @@ ForeignCallsProvider getForeignCalls(); + Value emitLoad(Kind kind, Value address, Access access); + + void emitStore(Kind kind, Value address, Value input, Access access); + + void emitDeoptimize(Value actionAndReason, Value failedSpeculation, DeoptimizingNode deopting); + + Value emitForeignCall(ForeignCallLinkage linkage, DeoptimizingNode info, Value... args); + /** * Checks whether the supplied constant can be used without loading it into a register for most * operations, i.e., for commonly used arithmetic, logical, and comparison operations. @@ -68,4 +78,8 @@ * Overriding implementations of this method must call the overridden method. */ void beforeRegisterAllocation(); + + void emitIncomingValues(Value[] params); + + void emitReturn(Value input); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRLowerable.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRLowerable.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRLowerable.java Wed Mar 26 11:49:07 2014 +0100 @@ -24,5 +24,5 @@ public interface LIRLowerable { - void generate(NodeBasedLIRGeneratorTool generator); + void generate(NodeLIRGeneratorTool generator); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeBasedLIRGeneratorTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeBasedLIRGeneratorTool.java Tue Mar 25 17:23:20 2014 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.nodes.spi; - -public interface NodeBasedLIRGeneratorTool extends NodeMappableArithmeticLIRGenerator, NodeLIRGeneratorTool, LIRGeneratorTool { -} diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeLIRGeneratorTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeLIRGeneratorTool.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/NodeLIRGeneratorTool.java Wed Mar 26 11:49:07 2014 +0100 @@ -22,6 +22,8 @@ */ package com.oracle.graal.nodes.spi; +import java.util.*; + import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; @@ -29,20 +31,10 @@ import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; -public interface NodeLIRGeneratorTool { - - Value emitLoad(Kind kind, Value address, Access access); - - void emitStore(Kind kind, Value address, Value input, Access access); - - void emitMembar(int barriers); - - void emitDeoptimize(Value actionAndReason, Value failedSpeculation, DeoptimizingNode deopting); +public interface NodeLIRGeneratorTool extends NodeMappableLIRGenerator { void emitNullCheck(ValueNode v, DeoptimizingNode deopting); - Value emitForeignCall(ForeignCallLinkage linkage, DeoptimizingNode info, Value... args); - void emitIf(IfNode i); void emitConditional(ConditionalNode i); @@ -69,4 +61,10 @@ void visitBreakpointNode(BreakpointNode i); void visitInfopointNode(InfopointNode i); + + LIRGeneratorTool getLIRGeneratorTool(); + + void emitOverflowCheckBranch(AbstractBeginNode overflowSuccessor, AbstractBeginNode next, double probability); + + Value[] visitInvokeArguments(CallingConvention cc, Collection arguments); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -56,7 +56,7 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { // nothing to do... } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -91,7 +91,7 @@ public abstract ValueNode getMaterializedRepresentation(FixedNode fixed, ValueNode[] entries, LockState locks); @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { // nothing to do... } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64FloatConvertNode.java --- a/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64FloatConvertNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements.amd64/src/com/oracle/graal/replacements/amd64/AMD64FloatConvertNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -51,7 +51,7 @@ throw GraalInternalError.shouldNotReachHere(); } - public void generate(NodeMappableArithmeticLIRGenerator gen) { - gen.setResult(this, gen.emitFloatConvert(op, gen.operand(value))); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitFloatConvert(op, gen.operand(value))); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ArrayEqualsNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ArrayEqualsNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ArrayEqualsNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -131,7 +131,7 @@ public static native boolean equals(double[] array1, double[] array2, int length); @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGenerator gen) { Variable result = gen.newVariable(Kind.Int); gen.emitArrayEquals(kind, result, gen.operand(array1), gen.operand(array2), gen.operand(length)); gen.setResult(this, result); diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -65,7 +65,7 @@ } @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGenerator gen) { Variable result = gen.newVariable(Kind.Int); gen.emitBitCount(result, gen.operand(value)); gen.setResult(this, result); diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -72,7 +72,7 @@ } @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGenerator gen) { Variable result = gen.newVariable(Kind.Int); gen.emitBitScanForward(result, gen.operand(value)); gen.setResult(this, result); diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -79,7 +79,7 @@ } @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGenerator gen) { Variable result = gen.newVariable(Kind.Int); gen.emitBitScanReverse(result, gen.operand(value)); gen.setResult(this, result); diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectReadNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -46,8 +46,8 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { - gen.setResult(this, gen.emitLoad(readKind, gen.operand(address), null)); + public void generate(NodeLIRGeneratorTool gen) { + gen.setResult(this, gen.getLIRGeneratorTool().emitLoad(readKind, gen.operand(address), null)); } @SuppressWarnings("unchecked") diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectStoreNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectStoreNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/DirectStoreNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -48,9 +48,9 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool gen) { + public void generate(NodeLIRGeneratorTool gen) { Value v = gen.operand(value); - gen.emitStore(kind, gen.operand(address), v, null); + gen.getLIRGeneratorTool().emitStore(kind, gen.operand(address), v, null); } /* diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MathIntrinsicNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MathIntrinsicNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MathIntrinsicNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -55,30 +55,30 @@ } @Override - public void generate(NodeMappableArithmeticLIRGenerator gen) { + public void generate(NodeLIRGeneratorTool gen) { Value input = gen.operand(x()); Value result; switch (operation()) { case ABS: - result = gen.emitMathAbs(input); + result = gen.getLIRGeneratorTool().emitMathAbs(input); break; case SQRT: - result = gen.emitMathSqrt(input); + result = gen.getLIRGeneratorTool().emitMathSqrt(input); break; case LOG: - result = gen.emitMathLog(input, false); + result = gen.getLIRGeneratorTool().emitMathLog(input, false); break; case LOG10: - result = gen.emitMathLog(input, true); + result = gen.getLIRGeneratorTool().emitMathLog(input, true); break; case SIN: - result = gen.emitMathSin(input); + result = gen.getLIRGeneratorTool().emitMathSin(input); break; case COS: - result = gen.emitMathCos(input); + result = gen.getLIRGeneratorTool().emitMathCos(input); break; case TAN: - result = gen.emitMathTan(input); + result = gen.getLIRGeneratorTool().emitMathTan(input); break; default: throw GraalInternalError.shouldNotReachHere(); diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReadRegisterNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReadRegisterNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReadRegisterNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -24,17 +24,16 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.gen.*; -import com.oracle.graal.compiler.target.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; /** * Access the value of a specific register. */ @NodeInfo(nameTemplate = "ReadRegister %{p#register}") -public final class ReadRegisterNode extends FixedWithNextNode implements LIRGenLowerable { +public final class ReadRegisterNode extends FixedWithNextNode implements LIRLowerable { /** * The fixed register to access. @@ -75,13 +74,13 @@ } @Override - public void generate(LIRGenerator generator) { + public void generate(NodeLIRGeneratorTool generator) { Value result = register.asValue(getKind()); if (incoming) { - generator.emitIncomingValues(new Value[]{result}); + generator.getLIRGeneratorTool().emitIncomingValues(new Value[]{result}); } if (!directUse) { - result = generator.emitMove(result); + result = generator.getLIRGeneratorTool().emitMove(result); } generator.setResult(this, result); } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/ReverseBytesNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -66,9 +66,9 @@ } @Override - public void generate(LIRGenerator gen) { + public void generate(NodeLIRGenerator gen) { Variable result = gen.newVariable(value.getKind()); - gen.emitByteSwap(result, gen.operand(value)); + gen.getLIRGenerator().emitByteSwap(result, gen.operand(value)); gen.setResult(this, result); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/WriteRegisterNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/WriteRegisterNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/WriteRegisterNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -52,9 +52,9 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { Value val = generator.operand(value); - generator.emitMove(register.asValue(val.getKind()), val); + generator.getLIRGeneratorTool().emitMove(register.asValue(val.getKind()), val); } @Override diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerAddExactSplitNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerAddExactSplitNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerAddExactSplitNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -34,7 +34,7 @@ } @Override - protected Value generateArithmetic(NodeBasedLIRGeneratorTool gen) { - return gen.emitAdd(gen.operand(getX()), gen.operand(getY())); + protected Value generateArithmetic(NodeLIRGeneratorTool gen) { + return gen.getLIRGeneratorTool().emitAdd(gen.operand(getX()), gen.operand(getY())); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerExactArithmeticSplitNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerExactArithmeticSplitNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerExactArithmeticSplitNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -23,14 +23,12 @@ package com.oracle.graal.truffle.nodes.arithmetic; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.gen.*; -import com.oracle.graal.compiler.target.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; -public abstract class IntegerExactArithmeticSplitNode extends ControlSplitNode implements LIRGenLowerable { +public abstract class IntegerExactArithmeticSplitNode extends ControlSplitNode implements LIRLowerable { @Successor private AbstractBeginNode overflowSuccessor; @Successor private AbstractBeginNode next; @@ -72,12 +70,12 @@ } @Override - public void generate(LIRGenerator generator) { + public void generate(NodeLIRGeneratorTool generator) { generator.setResult(this, generateArithmetic(generator)); - generator.emitOverflowCheckBranch(generator.getLIRBlock(getOverflowSuccessor()), generator.getLIRBlock(getNext()), probability(getOverflowSuccessor())); + generator.emitOverflowCheckBranch(getOverflowSuccessor(), getNext(), probability(getOverflowSuccessor())); } - protected abstract Value generateArithmetic(NodeBasedLIRGeneratorTool generator); + protected abstract Value generateArithmetic(NodeLIRGeneratorTool generator); static void lower(LoweringTool tool, IntegerExactArithmeticNode node) { if (node.asNode().graph().getGuardsStage() == StructuredGraph.GuardsStage.FIXED_DEOPTS) { diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulExactSplitNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulExactSplitNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulExactSplitNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -34,7 +34,7 @@ } @Override - protected Value generateArithmetic(NodeBasedLIRGeneratorTool gen) { - return gen.emitMul(gen.operand(getX()), gen.operand(getY())); + protected Value generateArithmetic(NodeLIRGeneratorTool gen) { + return gen.getLIRGeneratorTool().emitMul(gen.operand(getX()), gen.operand(getY())); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerSubExactSplitNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerSubExactSplitNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerSubExactSplitNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -34,7 +34,7 @@ } @Override - protected Value generateArithmetic(NodeBasedLIRGeneratorTool gen) { - return gen.emitSub(gen.operand(getX()), gen.operand(getY())); + protected Value generateArithmetic(NodeLIRGeneratorTool gen) { + return gen.getLIRGeneratorTool().emitSub(gen.operand(getX()), gen.operand(getY())); } } diff -r f41429da9819 -r 47e4d2e01c6e graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/WordCastNode.java --- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/WordCastNode.java Tue Mar 25 17:23:20 2014 +0100 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/WordCastNode.java Wed Mar 26 11:49:07 2014 +0100 @@ -67,12 +67,12 @@ } @Override - public void generate(NodeBasedLIRGeneratorTool generator) { + public void generate(NodeLIRGeneratorTool generator) { assert getKind() != input.getKind(); - assert generator.target().getSizeInBytes(getKind()) == generator.target().getSizeInBytes(input.getKind()); + assert generator.getLIRGeneratorTool().target().getSizeInBytes(getKind()) == generator.getLIRGeneratorTool().target().getSizeInBytes(input.getKind()); - AllocatableValue result = generator.newVariable(getKind()); - generator.emitMove(result, generator.operand(input)); + AllocatableValue result = generator.getLIRGeneratorTool().newVariable(getKind()); + generator.getLIRGeneratorTool().emitMove(result, generator.operand(input)); generator.setResult(this, result); } }