changeset 4191:6cb97f648859

Removed tail call node and opcode (=> must be moved to the truffle project).
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Tue, 03 Jan 2012 15:17:35 +0100
parents bfae65ae6c1e
children 432c40a691ce
files graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/nodes/TailcallNode.java graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/target/amd64/AMD64TailcallOpcode.java
diffstat 2 files changed, 0 insertions(+), 162 deletions(-) [+]
line wrap: on
line diff
--- 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<ValueNode> parameters = new ArrayList<>();
-        for (int i = 0; i < cc.locations.length; i++) {
-            parameters.add(frameState.localAt(i));
-        }
-        List<CiValue> 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));
-    }
-}
--- 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<CiValue> 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();
-        }
-    }
-}