# HG changeset patch # User Josef Eisl # Date 1395932108 -3600 # Node ID 6bde7deb5be120b092bb1920889c83f16ac2d7a2 # Parent f49e2f9cbdc3b3ee836f925e8c3780d7a37a9062 Adopt HSAILLIRGenerator. diff -r f49e2f9cbdc3 -r 6bde7deb5be1 graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java Thu Mar 27 15:06:22 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java Thu Mar 27 15:55:08 2014 +0100 @@ -26,6 +26,7 @@ import static com.oracle.graal.api.code.CodeUtil.*; import static com.oracle.graal.api.code.ValueUtil.*; import static com.oracle.graal.compiler.GraalCompiler.*; +import static com.oracle.graal.api.meta.LocationIdentity.*; import java.lang.reflect.*; import java.util.*; @@ -51,12 +52,17 @@ import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.bridge.CompilerToVM.CodeInstallResult; import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.*; import com.oracle.graal.hsail.*; import com.oracle.graal.java.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.asm.*; import com.oracle.graal.lir.hsail.*; +import com.oracle.graal.lir.hsail.HSAILControlFlow.DeoptimizeOp; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.StructuredGraph.GuardsStage; +import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.tiers.*; @@ -365,7 +371,7 @@ @Override public LIRGenerationResult newLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub) { - return new LIRGenerationResultBase(lir, frameMap); + return new HSAILHotSpotLIRGenerationResult(lir, frameMap); } @Override @@ -394,12 +400,12 @@ * a class to allow us to save lirGen. */ static class HSAILCompilationResultBuilder extends CompilationResultBuilder { - public HSAILHotSpotLIRGenerator lirGen; + public HSAILHotSpotLIRGenerationResult lirGenRes; public HSAILCompilationResultBuilder(CodeCacheProvider codeCache, ForeignCallsProvider foreignCalls, FrameMap frameMap, Assembler asm, FrameContext frameContext, - CompilationResult compilationResult, LIRGenerator lirGen) { + CompilationResult compilationResult, HSAILHotSpotLIRGenerationResult lirGenRes) { super(codeCache, foreignCalls, frameMap, asm, frameContext, compilationResult); - this.lirGen = (HSAILHotSpotLIRGenerator) lirGen; + this.lirGenRes = lirGenRes; } } @@ -414,7 +420,8 @@ Assembler masm = createAssembler(frameMap); HotSpotFrameContext frameContext = new HotSpotFrameContext(); // save lirGen for later use by setHostGraph - CompilationResultBuilder crb = new HSAILCompilationResultBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, frameContext, compilationResult, lirGen); + CompilationResultBuilder crb = new HSAILCompilationResultBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, frameContext, compilationResult, + (HSAILHotSpotLIRGenerationResult) lirGenRes); crb.setFrameSize(frameMap.frameSize()); return crb; } @@ -770,7 +777,140 @@ asm.emitString0("}; \n"); ExternalCompilationResult compilationResult = (ExternalCompilationResult) crb.compilationResult; - compilationResult.setHostGraph(((HSAILCompilationResultBuilder) crb).lirGen.prepareHostGraph()); + HSAILHotSpotLIRGenerationResult lirGenRes = ((HSAILCompilationResultBuilder) crb).lirGenRes; + compilationResult.setHostGraph(prepareHostGraph(method, lirGenRes.getDeopts(), getProviders(), getRuntime().getConfig())); + } + + private static StructuredGraph prepareHostGraph(ResolvedJavaMethod method, List deopts, HotSpotProviders providers, HotSpotVMConfig config) { + if (deopts.isEmpty()) { + return null; + } + StructuredGraph hostGraph = new StructuredGraph(method, -2); + ParameterNode deoptId = hostGraph.unique(new ParameterNode(0, StampFactory.intValue())); + ParameterNode hsailFrame = hostGraph.unique(new ParameterNode(1, StampFactory.forKind(providers.getCodeCache().getTarget().wordKind))); + ParameterNode reasonAndAction = hostGraph.unique(new ParameterNode(2, StampFactory.intValue())); + ParameterNode speculation = hostGraph.unique(new ParameterNode(3, StampFactory.object())); + AbstractBeginNode[] branches = new AbstractBeginNode[deopts.size() + 1]; + int[] keys = new int[deopts.size()]; + int[] keySuccessors = new int[deopts.size() + 1]; + double[] keyProbabilities = new double[deopts.size() + 1]; + int i = 0; + Collections.sort(deopts, new Comparator() { + public int compare(DeoptimizeOp o1, DeoptimizeOp o2) { + return o1.getCodeBufferPos() - o2.getCodeBufferPos(); + } + }); + for (DeoptimizeOp deopt : deopts) { + keySuccessors[i] = i; + keyProbabilities[i] = 1.0 / deopts.size(); + keys[i] = deopt.getCodeBufferPos(); + assert keys[i] >= 0; + branches[i] = createHostDeoptBranch(deopt, hsailFrame, reasonAndAction, speculation, providers, config); + + i++; + } + keyProbabilities[deopts.size()] = 0; // default + keySuccessors[deopts.size()] = deopts.size(); + branches[deopts.size()] = createHostCrashBranch(hostGraph, deoptId); + IntegerSwitchNode switchNode = hostGraph.add(new IntegerSwitchNode(deoptId, branches, keys, keyProbabilities, keySuccessors)); + StartNode start = hostGraph.start(); + start.setNext(switchNode); + /* + * printf.setNext(printf2); printf2.setNext(switchNode); + */ + hostGraph.setGuardsStage(GuardsStage.AFTER_FSA); + return hostGraph; + } + + private static AbstractBeginNode createHostCrashBranch(StructuredGraph hostGraph, ValueNode deoptId) { + VMErrorNode vmError = hostGraph.add(new VMErrorNode("Error in HSAIL deopt. DeoptId=%d", deoptId)); + // ConvertNode.convert(hostGraph, Kind.Long, deoptId))); + vmError.setNext(hostGraph.add(new ReturnNode(ConstantNode.defaultForKind(hostGraph.method().getSignature().getReturnKind(), hostGraph)))); + return BeginNode.begin(vmError); + } + + private static AbstractBeginNode createHostDeoptBranch(DeoptimizeOp deopt, ParameterNode hsailFrame, ValueNode reasonAndAction, ValueNode speculation, HotSpotProviders providers, + HotSpotVMConfig config) { + BeginNode branch = hsailFrame.graph().add(new BeginNode()); + DynamicDeoptimizeNode deoptimization = hsailFrame.graph().add(new DynamicDeoptimizeNode(reasonAndAction, speculation)); + deoptimization.setStateBefore(createFrameState(deopt.getFrameState().topFrame, hsailFrame, providers, config)); + branch.setNext(deoptimization); + return branch; + } + + private static FrameState createFrameState(BytecodeFrame lowLevelFrame, ParameterNode hsailFrame, HotSpotProviders providers, HotSpotVMConfig config) { + StructuredGraph hostGraph = hsailFrame.graph(); + ValueNode[] locals = new ValueNode[lowLevelFrame.numLocals]; + for (int i = 0; i < lowLevelFrame.numLocals; i++) { + locals[i] = getNodeForValueFromFrame(lowLevelFrame.getLocalValue(i), hsailFrame, hostGraph, providers, config); + } + List stack = new ArrayList<>(lowLevelFrame.numStack); + for (int i = 0; i < lowLevelFrame.numStack; i++) { + stack.add(getNodeForValueFromFrame(lowLevelFrame.getStackValue(i), hsailFrame, hostGraph, providers, config)); + } + ValueNode[] locks = new ValueNode[lowLevelFrame.numLocks]; + MonitorIdNode[] monitorIds = new MonitorIdNode[lowLevelFrame.numLocks]; + for (int i = 0; i < lowLevelFrame.numLocks; i++) { + HotSpotMonitorValue lockValue = (HotSpotMonitorValue) lowLevelFrame.getLockValue(i); + locks[i] = getNodeForValueFromFrame(lockValue, hsailFrame, hostGraph, providers, config); + monitorIds[i] = getMonitorIdForHotSpotMonitorValueFromFrame(lockValue, hsailFrame, hostGraph); + } + FrameState frameState = hostGraph.add(new FrameState(lowLevelFrame.getMethod(), lowLevelFrame.getBCI(), locals, stack, locks, monitorIds, lowLevelFrame.rethrowException, false)); + if (lowLevelFrame.caller() != null) { + frameState.setOuterFrameState(createFrameState(lowLevelFrame.caller(), hsailFrame, providers, config)); + } + return frameState; + } + + @SuppressWarnings({"unused"}) + private static MonitorIdNode getMonitorIdForHotSpotMonitorValueFromFrame(HotSpotMonitorValue lockValue, ParameterNode hsailFrame, StructuredGraph hsailGraph) { + if (lockValue.isEliminated()) { + return null; + } + throw GraalInternalError.unimplemented(); + } + + private static ValueNode getNodeForValueFromFrame(Value localValue, ParameterNode hsailFrame, StructuredGraph hostGraph, HotSpotProviders providers, HotSpotVMConfig config) { + ValueNode valueNode; + if (localValue instanceof Constant) { + valueNode = ConstantNode.forConstant((Constant) localValue, providers.getMetaAccess(), hostGraph); + } else if (localValue instanceof VirtualObject) { + throw GraalInternalError.unimplemented(); + } else if (localValue instanceof StackSlot) { + throw GraalInternalError.unimplemented(); + } else if (localValue instanceof HotSpotMonitorValue) { + HotSpotMonitorValue hotSpotMonitorValue = (HotSpotMonitorValue) localValue; + return getNodeForValueFromFrame(hotSpotMonitorValue.getOwner(), hsailFrame, hostGraph, providers, config); + } else if (localValue instanceof RegisterValue) { + RegisterValue registerValue = (RegisterValue) localValue; + int regNumber = registerValue.getRegister().number; + valueNode = getNodeForRegisterFromFrame(regNumber, localValue.getKind(), hsailFrame, hostGraph, providers, config); + } else if (Value.ILLEGAL.equals(localValue)) { + valueNode = null; + } else { + throw GraalInternalError.shouldNotReachHere(); + } + return valueNode; + } + + private static ValueNode getNodeForRegisterFromFrame(int regNumber, Kind valueKind, ParameterNode hsailFrame, StructuredGraph hostGraph, HotSpotProviders providers, HotSpotVMConfig config) { + ValueNode valueNode; + LocationNode location; + if (regNumber >= HSAIL.s0.number && regNumber <= HSAIL.s31.number) { + int intSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Int); + long offset = config.hsailFrameSaveAreaOffset + intSize * (regNumber - HSAIL.s0.number); + location = ConstantLocationNode.create(FINAL_LOCATION, valueKind, offset, hostGraph); + } else if (regNumber >= HSAIL.d0.number && regNumber <= HSAIL.d15.number) { + int longSize = providers.getCodeCache().getTarget().arch.getSizeInBytes(Kind.Long); + long offset = config.hsailFrameSaveAreaOffset + longSize * (regNumber - HSAIL.d0.number); + LocationNode numSRegsLocation = ConstantLocationNode.create(FINAL_LOCATION, Kind.Byte, config.hsailFrameNumSRegOffset, hostGraph); + ValueNode numSRegs = hostGraph.unique(new FloatingReadNode(hsailFrame, numSRegsLocation, null, StampFactory.forKind(Kind.Byte))); + location = IndexedLocationNode.create(FINAL_LOCATION, valueKind, offset, numSRegs, hostGraph, 4); + } else { + throw GraalInternalError.shouldNotReachHere("unknown hsail register: " + regNumber); + } + valueNode = hostGraph.unique(new FloatingReadNode(hsailFrame, location, null, StampFactory.forKind(valueKind))); + return valueNode; } } diff -r f49e2f9cbdc3 -r 6bde7deb5be1 graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerationResult.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerationResult.java Thu Mar 27 15:55:08 2014 +0100 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2014, 2014, 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.hsail; + +import java.util.*; + +import com.oracle.graal.compiler.gen.*; +import com.oracle.graal.lir.*; +import com.oracle.graal.lir.hsail.HSAILControlFlow.DeoptimizeOp; + +public class HSAILHotSpotLIRGenerationResult extends LIRGenerationResultBase { + + private List deopts = new ArrayList<>(); + + public HSAILHotSpotLIRGenerationResult(LIR lir, FrameMap frameMap) { + super(lir, frameMap); + } + + public List getDeopts() { + return deopts; + } + + public void addDeopt(DeoptimizeOp deopt) { + deopts.add(deopt); + } + +} diff -r f49e2f9cbdc3 -r 6bde7deb5be1 graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java Thu Mar 27 15:06:22 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java Thu Mar 27 15:55:08 2014 +0100 @@ -25,8 +25,6 @@ import static com.oracle.graal.api.code.ValueUtil.*; -import java.util.*; - import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.gen.*; @@ -55,8 +53,6 @@ */ public class HSAILHotSpotLIRGenerator extends HSAILLIRGenerator { - // TODO this should be removed - final List deopts = new ArrayList<>(); final HotSpotVMConfig config; public HSAILHotSpotLIRGenerator(Providers providers, HotSpotVMConfig config, CallingConvention cc, LIRGenerationResult lirGenRes) { @@ -178,7 +174,7 @@ */ private void emitDeoptimizeInner(Value actionAndReason, LIRFrameState lirFrameState, String emitName) { DeoptimizeOp deopt = new DeoptimizeOp(actionAndReason, lirFrameState, emitName, getMetaAccess()); - deopts.add(deopt); + ((HSAILHotSpotLIRGenerationResult) res).addDeopt(deopt); append(deopt); } diff -r f49e2f9cbdc3 -r 6bde7deb5be1 graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotNodeLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotNodeLIRGenerator.java Thu Mar 27 15:06:22 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotNodeLIRGenerator.java Thu Mar 27 15:55:08 2014 +0100 @@ -23,177 +23,30 @@ package com.oracle.graal.hotspot.hsail; -import static com.oracle.graal.api.meta.LocationIdentity.*; - -import java.util.*; - import sun.misc.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.hsail.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.HotSpotVMConfig.CompressEncoding; -import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.nodes.*; -import com.oracle.graal.hsail.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.hsail.*; import com.oracle.graal.lir.hsail.HSAILControlFlow.CondMoveOp; -import com.oracle.graal.lir.hsail.HSAILControlFlow.DeoptimizeOp; import com.oracle.graal.lir.hsail.HSAILMove.CompareAndSwapCompressedOp; import com.oracle.graal.lir.hsail.HSAILMove.CompareAndSwapOp; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.StructuredGraph.GuardsStage; import com.oracle.graal.nodes.calc.*; -import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.*; -import com.oracle.graal.nodes.type.*; /** * The HotSpot specific portion of the HSAIL LIR generator. */ public class HSAILHotSpotNodeLIRGenerator extends HSAILNodeLIRGenerator { - private List deopts = new ArrayList<>(); - private final ResolvedJavaMethod method; - - public HSAILHotSpotNodeLIRGenerator(StructuredGraph graph, LIRGenerationResult lirGenRes, HSAILHotSpotLIRGenerator lirGen) { + public HSAILHotSpotNodeLIRGenerator(StructuredGraph graph, LIRGenerationResult lirGenRes, LIRGenerator lirGen) { super(graph, lirGenRes, lirGen); - method = graph.method(); - deopts = lirGen.deopts; - } - - protected StructuredGraph prepareHostGraph() { - if (deopts.isEmpty()) { - return null; - } - StructuredGraph hostGraph = new StructuredGraph(method, -2); - ParameterNode deoptId = hostGraph.unique(new ParameterNode(0, StampFactory.intValue())); - ParameterNode hsailFrame = hostGraph.unique(new ParameterNode(1, StampFactory.forKind(gen.getProviders().getCodeCache().getTarget().wordKind))); - ParameterNode reasonAndAction = hostGraph.unique(new ParameterNode(2, StampFactory.intValue())); - ParameterNode speculation = hostGraph.unique(new ParameterNode(3, StampFactory.object())); - AbstractBeginNode[] branches = new AbstractBeginNode[deopts.size() + 1]; - int[] keys = new int[deopts.size()]; - int[] keySuccessors = new int[deopts.size() + 1]; - double[] keyProbabilities = new double[deopts.size() + 1]; - int i = 0; - Collections.sort(deopts, new Comparator() { - public int compare(DeoptimizeOp o1, DeoptimizeOp o2) { - return o1.getCodeBufferPos() - o2.getCodeBufferPos(); - } - }); - for (DeoptimizeOp deopt : deopts) { - keySuccessors[i] = i; - keyProbabilities[i] = 1.0 / deopts.size(); - keys[i] = deopt.getCodeBufferPos(); - assert keys[i] >= 0; - branches[i] = createHostDeoptBranch(deopt, hsailFrame, reasonAndAction, speculation); - - i++; - } - keyProbabilities[deopts.size()] = 0; // default - keySuccessors[deopts.size()] = deopts.size(); - branches[deopts.size()] = createHostCrashBranch(hostGraph, deoptId); - IntegerSwitchNode switchNode = hostGraph.add(new IntegerSwitchNode(deoptId, branches, keys, keyProbabilities, keySuccessors)); - StartNode start = hostGraph.start(); - start.setNext(switchNode); - /* - * printf.setNext(printf2); printf2.setNext(switchNode); - */ - hostGraph.setGuardsStage(GuardsStage.AFTER_FSA); - return hostGraph; - } - - private static AbstractBeginNode createHostCrashBranch(StructuredGraph hostGraph, ValueNode deoptId) { - VMErrorNode vmError = hostGraph.add(new VMErrorNode("Error in HSAIL deopt. DeoptId=%d", deoptId)); - // ConvertNode.convert(hostGraph, Kind.Long, deoptId))); - vmError.setNext(hostGraph.add(new ReturnNode(ConstantNode.defaultForKind(hostGraph.method().getSignature().getReturnKind(), hostGraph)))); - return BeginNode.begin(vmError); - } - - private AbstractBeginNode createHostDeoptBranch(DeoptimizeOp deopt, ParameterNode hsailFrame, ValueNode reasonAndAction, ValueNode speculation) { - BeginNode branch = hsailFrame.graph().add(new BeginNode()); - DynamicDeoptimizeNode deoptimization = hsailFrame.graph().add(new DynamicDeoptimizeNode(reasonAndAction, speculation)); - deoptimization.setStateBefore(createFrameState(deopt.getFrameState().topFrame, hsailFrame)); - branch.setNext(deoptimization); - return branch; - } - - private FrameState createFrameState(BytecodeFrame lowLevelFrame, ParameterNode hsailFrame) { - StructuredGraph hostGraph = hsailFrame.graph(); - ValueNode[] locals = new ValueNode[lowLevelFrame.numLocals]; - for (int i = 0; i < lowLevelFrame.numLocals; i++) { - locals[i] = getNodeForValueFromFrame(lowLevelFrame.getLocalValue(i), hsailFrame, hostGraph); - } - List stack = new ArrayList<>(lowLevelFrame.numStack); - for (int i = 0; i < lowLevelFrame.numStack; i++) { - stack.add(getNodeForValueFromFrame(lowLevelFrame.getStackValue(i), hsailFrame, hostGraph)); - } - ValueNode[] locks = new ValueNode[lowLevelFrame.numLocks]; - MonitorIdNode[] monitorIds = new MonitorIdNode[lowLevelFrame.numLocks]; - for (int i = 0; i < lowLevelFrame.numLocks; i++) { - HotSpotMonitorValue lockValue = (HotSpotMonitorValue) lowLevelFrame.getLockValue(i); - locks[i] = getNodeForValueFromFrame(lockValue, hsailFrame, hostGraph); - monitorIds[i] = getMonitorIdForHotSpotMonitorValueFromFrame(lockValue, hsailFrame, hostGraph); - } - FrameState frameState = hostGraph.add(new FrameState(lowLevelFrame.getMethod(), lowLevelFrame.getBCI(), locals, stack, locks, monitorIds, lowLevelFrame.rethrowException, false)); - if (lowLevelFrame.caller() != null) { - frameState.setOuterFrameState(createFrameState(lowLevelFrame.caller(), hsailFrame)); - } - return frameState; - } - - @SuppressWarnings({"unused", "static-method"}) - private MonitorIdNode getMonitorIdForHotSpotMonitorValueFromFrame(HotSpotMonitorValue lockValue, ParameterNode hsailFrame, StructuredGraph hsailGraph) { - if (lockValue.isEliminated()) { - return null; - } - throw GraalInternalError.unimplemented(); - } - - private ValueNode getNodeForValueFromFrame(Value localValue, ParameterNode hsailFrame, StructuredGraph hostGraph) { - ValueNode valueNode; - if (localValue instanceof Constant) { - valueNode = ConstantNode.forConstant((Constant) localValue, gen.getProviders().getMetaAccess(), hostGraph); - } else if (localValue instanceof VirtualObject) { - throw GraalInternalError.unimplemented(); - } else if (localValue instanceof StackSlot) { - throw GraalInternalError.unimplemented(); - } else if (localValue instanceof HotSpotMonitorValue) { - HotSpotMonitorValue hotSpotMonitorValue = (HotSpotMonitorValue) localValue; - return getNodeForValueFromFrame(hotSpotMonitorValue.getOwner(), hsailFrame, hostGraph); - } else if (localValue instanceof RegisterValue) { - RegisterValue registerValue = (RegisterValue) localValue; - int regNumber = registerValue.getRegister().number; - valueNode = getNodeForRegisterFromFrame(regNumber, localValue.getKind(), hsailFrame, hostGraph); - } else if (Value.ILLEGAL.equals(localValue)) { - valueNode = null; - } else { - throw GraalInternalError.shouldNotReachHere(); - } - return valueNode; - } - - private ValueNode getNodeForRegisterFromFrame(int regNumber, Kind valueKind, ParameterNode hsailFrame, StructuredGraph hostGraph) { - ValueNode valueNode; - LocationNode location; - if (regNumber >= HSAIL.s0.number && regNumber <= HSAIL.s31.number) { - int intSize = gen.getProviders().getCodeCache().getTarget().arch.getSizeInBytes(Kind.Int); - long offset = getGen().config.hsailFrameSaveAreaOffset + intSize * (regNumber - HSAIL.s0.number); - location = ConstantLocationNode.create(FINAL_LOCATION, valueKind, offset, hostGraph); - } else if (regNumber >= HSAIL.d0.number && regNumber <= HSAIL.d15.number) { - int longSize = gen.getProviders().getCodeCache().getTarget().arch.getSizeInBytes(Kind.Long); - long offset = getGen().config.hsailFrameSaveAreaOffset + longSize * (regNumber - HSAIL.d0.number); - LocationNode numSRegsLocation = ConstantLocationNode.create(FINAL_LOCATION, Kind.Byte, getGen().config.hsailFrameNumSRegOffset, hostGraph); - ValueNode numSRegs = hostGraph.unique(new FloatingReadNode(hsailFrame, numSRegsLocation, null, StampFactory.forKind(Kind.Byte))); - location = IndexedLocationNode.create(FINAL_LOCATION, valueKind, offset, numSRegs, hostGraph, 4); - } else { - throw GraalInternalError.shouldNotReachHere("unknown hsail register: " + regNumber); - } - valueNode = hostGraph.unique(new FloatingReadNode(hsailFrame, location, null, StampFactory.forKind(valueKind))); - return valueNode; } private HSAILHotSpotLIRGenerator getGen() {