001/*
002 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation.
008 *
009 * This code is distributed in the hope that it will be useful, but WITHOUT
010 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
011 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
012 * version 2 for more details (a copy is included in the LICENSE file that
013 * accompanied this code).
014 *
015 * You should have received a copy of the GNU General Public License version
016 * 2 along with this work; if not, write to the Free Software Foundation,
017 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
018 *
019 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
020 * or visit www.oracle.com if you need additional information or have any
021 * questions.
022 */
023package com.oracle.graal.hotspot.replacements.arraycopy;
024
025import jdk.internal.jvmci.code.*;
026import jdk.internal.jvmci.meta.*;
027import static jdk.internal.jvmci.meta.LocationIdentity.*;
028
029import com.oracle.graal.graph.*;
030import com.oracle.graal.nodeinfo.*;
031import com.oracle.graal.nodes.*;
032import com.oracle.graal.nodes.type.*;
033import com.oracle.graal.replacements.*;
034import com.oracle.graal.replacements.nodes.*;
035
036@NodeInfo
037public final class ArrayCopySlowPathNode extends BasicArrayCopyNode {
038
039    public static final NodeClass<ArrayCopySlowPathNode> TYPE = NodeClass.create(ArrayCopySlowPathNode.class);
040
041    private final SnippetTemplate.SnippetInfo snippet;
042
043    /**
044     * Extra context for the slow path snippet.
045     */
046    private final Object argument;
047
048    public ArrayCopySlowPathNode(ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, Kind elementKind, SnippetTemplate.SnippetInfo snippet, Object argument) {
049        super(TYPE, src, srcPos, dest, destPos, length, elementKind, BytecodeFrame.INVALID_FRAMESTATE_BCI);
050        assert StampTool.isPointerNonNull(src) && StampTool.isPointerNonNull(dest) : "must have been null checked";
051        this.snippet = snippet;
052        this.argument = argument;
053    }
054
055    @NodeIntrinsic
056    public static native void arraycopy(Object nonNullSrc, int srcPos, Object nonNullDest, int destPos, int length, @ConstantNodeParameter Kind elementKind,
057                    @ConstantNodeParameter SnippetTemplate.SnippetInfo snippet, @ConstantNodeParameter Object argument);
058
059    public SnippetTemplate.SnippetInfo getSnippet() {
060        return snippet;
061    }
062
063    public Object getArgument() {
064        return argument;
065    }
066
067    @Override
068    public LocationIdentity getLocationIdentity() {
069        if (elementKind != null) {
070            return NamedLocationIdentity.getArrayLocation(elementKind);
071        }
072        return any();
073    }
074
075    public void setBci(int bci) {
076        this.bci = bci;
077    }
078}