# HG changeset patch # User Thomas Wuerthinger # Date 1325600255 -3600 # Node ID 6cb97f6488595c51b07283062040bef029e7b7fa # Parent bfae65ae6c1e2760da2162c601493e08141240f5 Removed tail call node and opcode (=> must be moved to the truffle project). diff -r bfae65ae6c1e -r 6cb97f648859 graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/nodes/TailcallNode.java --- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/nodes/TailcallNode.java Tue Jan 03 15:16:05 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2011, 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.max.graal.hotspot.nodes; - - import static com.sun.cri.ci.CiCallingConvention.Type.*; - -import java.lang.reflect.*; -import java.util.*; - -import com.oracle.max.graal.compiler.gen.*; -import com.oracle.max.graal.hotspot.*; -import com.oracle.max.graal.hotspot.target.amd64.*; -import com.oracle.max.graal.nodes.*; -import com.oracle.max.graal.nodes.spi.*; -import com.oracle.max.graal.nodes.type.*; -import com.sun.cri.ci.*; -import com.sun.cri.ri.*; - -/** - * Performs a tail call to the specified target compiled method, with the parameter taken from the supplied FrameState. - */ -public class TailcallNode extends FixedWithNextNode implements LIRLowerable { - - @Input private final FrameState frameState; - @Input private final ValueNode target; - - /** - * Creates a TailcallNode. - * @param target points to the start of an nmethod - * @param frameState the parameters will be taken from this FrameState - */ - public TailcallNode(ValueNode target, FrameState frameState) { - super(StampFactory.illegal()); - this.target = target; - this.frameState = frameState; - } - - @Override - public void generate(LIRGeneratorTool generator) { - LIRGenerator gen = (LIRGenerator) generator; - HotSpotVMConfig config = CompilerImpl.getInstance().getConfig(); - RiResolvedMethod method = frameState.method(); - boolean isStatic = Modifier.isStatic(method.accessFlags()); - - - CiKind[] signature = CiUtil.signatureToKinds(method.signature(), isStatic ? null : method.holder().kind(true)); - CiCallingConvention cc = gen.compilation.registerConfig.getCallingConvention(JavaCall, signature, gen.compilation.compiler.target, false); - gen.compilation.frameMap().callsMethod(cc, JavaCall); - List parameters = new ArrayList<>(); - for (int i = 0; i < cc.locations.length; i++) { - parameters.add(frameState.localAt(i)); - } - List argList = gen.visitInvokeArguments(cc, parameters, null); - - CiVariable entry = gen.emitLoad(new CiAddress(CiKind.Long, gen.operand(target), config.nmethodEntryOffset), CiKind.Long, false); - - gen.append(AMD64TailcallOpcode.TAILCALL.create(argList, entry, cc.locations)); - } -} diff -r bfae65ae6c1e -r 6cb97f648859 graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/target/amd64/AMD64TailcallOpcode.java --- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/target/amd64/AMD64TailcallOpcode.java Tue Jan 03 15:16:05 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +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.max.graal.hotspot.target.amd64; - -import static com.sun.cri.ci.CiValueUtil.*; - -import java.util.*; - -import com.oracle.max.asm.target.amd64.AMD64MacroAssembler; -import com.oracle.max.graal.compiler.asm.TargetMethodAssembler; -import com.oracle.max.graal.compiler.lir.LIRInstruction; -import com.oracle.max.graal.compiler.lir.LIROpcode; -import com.oracle.max.graal.compiler.target.amd64.AMD64LIRInstruction; -import com.oracle.max.graal.compiler.util.Util; -import com.sun.cri.ci.*; - -/** - * Performs a hard-coded tail call to the specified target, which normally should be an RiCompiledCode instance. - */ -public enum AMD64TailcallOpcode implements LIROpcode { - TAILCALL; - - public LIRInstruction create(List parameters, CiValue target, CiValue[] callingConvention) { - CiValue[] inputs = new CiValue[parameters.size() + 1]; - parameters.toArray(inputs); - inputs[parameters.size()] = target; - CiValue[] temps = callingConvention.clone(); - assert inputs.length == temps.length + 1; - - return new AMD64LIRInstruction(this, CiValue.IllegalValue, null, inputs, LIRInstruction.NO_OPERANDS, temps) { - @Override - public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { - emit(tasm, masm, inputs, temps); - } - }; - } - - private void emit(TargetMethodAssembler tasm, AMD64MacroAssembler masm, CiValue[] inputs, CiValue[] temps) { - switch (this) { - case TAILCALL: { - // move all parameters to the correct positions, according to the calling convention - // TODO: These moves should not be part of the TAILCALL opcode, but emitted as separate MOVE instructions before. - for (int i = 0; i < inputs.length - 1; i++) { - assert inputs[i].kind == CiKind.Object || inputs[i].kind == CiKind.Int || inputs[i].kind == CiKind.Long : "only Object, int and long supported for now"; - assert isRegister(temps[i]) : "too many parameters"; - if (isRegister(inputs[i])) { - masm.movq(asRegister(temps[i]), asRegister(inputs[i])); - } else { - masm.movq(asRegister(temps[i]), tasm.asAddress(inputs[i])); - } - } - // destroy the current frame (now the return address is the top of stack) - masm.leave(); - - // jump to the target method - masm.jmp(asRegister(inputs[inputs.length - 1])); - masm.ensureUniquePC(); - break; - } - default: throw Util.shouldNotReachHere(); - } - } -}