src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java
author dlong
Thu, 14 Nov 2019 12:21:00 -0800
changeset 59095 03fbcd06b4c0
parent 54328 37648a9c4a6a
permissions -rw-r--r--
8233841: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     1
/*
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     4
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     8
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    13
 * accompanied this code).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    14
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    18
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    21
 * questions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    22
 */
50858
2d3e99a72541 8205824: Update Graal
never
parents: 48190
diff changeset
    23
2d3e99a72541 8205824: Update Graal
never
parents: 48190
diff changeset
    24
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    25
package org.graalvm.compiler.hotspot.amd64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    27
import static jdk.vm.ci.amd64.AMD64.rbp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    28
import static jdk.vm.ci.code.ValueUtil.isStackSlot;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46344
diff changeset
    29
import static org.graalvm.compiler.hotspot.HotSpotBackend.EXCEPTION_HANDLER_IN_CALLER;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    30
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    31
import org.graalvm.compiler.api.replacements.Snippet;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    32
import org.graalvm.compiler.core.amd64.AMD64NodeLIRBuilder;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    33
import org.graalvm.compiler.core.amd64.AMD64NodeMatchRules;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    34
import org.graalvm.compiler.core.common.LIRKind;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    35
import org.graalvm.compiler.core.common.spi.ForeignCallDescriptor;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    36
import org.graalvm.compiler.core.common.spi.ForeignCallLinkage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    37
import org.graalvm.compiler.core.gen.DebugInfoBuilder;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    38
import org.graalvm.compiler.hotspot.HotSpotDebugInfoBuilder;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    40
import org.graalvm.compiler.hotspot.HotSpotLockStack;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    41
import org.graalvm.compiler.hotspot.HotSpotNodeLIRBuilder;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import org.graalvm.compiler.hotspot.nodes.HotSpotDirectCallTargetNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
import org.graalvm.compiler.hotspot.nodes.HotSpotIndirectCallTargetNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
import org.graalvm.compiler.lir.LIRFrameState;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    45
import org.graalvm.compiler.lir.Variable;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
import org.graalvm.compiler.lir.amd64.AMD64BreakpointOp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import org.graalvm.compiler.nodes.BreakpointNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    49
import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
import org.graalvm.compiler.nodes.DirectCallTargetNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
import org.graalvm.compiler.nodes.FullInfopointNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    52
import org.graalvm.compiler.nodes.IndirectCallTargetNode;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 48172
diff changeset
    53
import org.graalvm.compiler.nodes.NodeView;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
import org.graalvm.compiler.nodes.ParameterNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    55
import org.graalvm.compiler.nodes.SafepointNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    56
import org.graalvm.compiler.nodes.StructuredGraph;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    57
import org.graalvm.compiler.nodes.ValueNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    58
import org.graalvm.compiler.nodes.spi.NodeValueMap;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    59
import org.graalvm.compiler.replacements.nodes.ArrayCompareToNode;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    60
import org.graalvm.compiler.replacements.nodes.ArrayEqualsNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    61
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    62
import jdk.vm.ci.amd64.AMD64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
import jdk.vm.ci.amd64.AMD64Kind;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
import jdk.vm.ci.code.BytecodeFrame;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    65
import jdk.vm.ci.code.CallingConvention;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
import jdk.vm.ci.code.Register;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
import jdk.vm.ci.code.RegisterValue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
import jdk.vm.ci.code.StackSlot;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
import jdk.vm.ci.code.ValueUtil;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    72
import jdk.vm.ci.meta.AllocatableValue;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    73
import jdk.vm.ci.meta.JavaKind;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    74
import jdk.vm.ci.meta.JavaType;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    75
import jdk.vm.ci.meta.ResolvedJavaMethod;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    76
import jdk.vm.ci.meta.Value;
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
    77
import org.graalvm.compiler.replacements.nodes.ArrayRegionEqualsNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    78
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    79
/**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    80
 * LIR generator specialized for AMD64 HotSpot.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
public class AMD64HotSpotNodeLIRBuilder extends AMD64NodeLIRBuilder implements HotSpotNodeLIRBuilder {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    84
    public AMD64HotSpotNodeLIRBuilder(StructuredGraph graph, LIRGeneratorTool gen, AMD64NodeMatchRules nodeMatchRules) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    85
        super(graph, gen, nodeMatchRules);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    86
        assert gen instanceof AMD64HotSpotLIRGenerator;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    87
        assert getDebugInfoBuilder() instanceof HotSpotDebugInfoBuilder;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    88
        ((AMD64HotSpotLIRGenerator) gen).setDebugInfoBuilder(((HotSpotDebugInfoBuilder) getDebugInfoBuilder()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
    private AMD64HotSpotLIRGenerator getGen() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
        return (AMD64HotSpotLIRGenerator) gen;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    94
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    95
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    96
    protected DebugInfoBuilder createDebugInfoBuilder(StructuredGraph graph, NodeValueMap nodeValueMap) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
        HotSpotLockStack lockStack = new HotSpotLockStack(gen.getResult().getFrameMapBuilder(), LIRKind.value(AMD64Kind.QWORD));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    98
        return new HotSpotDebugInfoBuilder(nodeValueMap, lockStack, (HotSpotLIRGenerator) gen);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   100
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   101
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   102
    protected void emitPrologue(StructuredGraph graph) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   103
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
        CallingConvention incomingArguments = gen.getResult().getCallingConvention();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   105
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   106
        Value[] params = new Value[incomingArguments.getArgumentCount() + 1];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   107
        for (int i = 0; i < params.length - 1; i++) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   108
            params[i] = incomingArguments.getArgument(i);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   109
            if (isStackSlot(params[i])) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   110
                StackSlot slot = ValueUtil.asStackSlot(params[i]);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   111
                if (slot.isInCallerFrame() && !gen.getResult().getLIR().hasArgInCallerFrame()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   112
                    gen.getResult().getLIR().setHasArgInCallerFrame();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   113
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   114
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   115
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   116
        params[params.length - 1] = rbp.asValue(LIRKind.value(AMD64Kind.QWORD));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   117
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   118
        gen.emitIncomingValues(params);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
        getGen().emitSaveRbp();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   122
        getGen().append(((HotSpotDebugInfoBuilder) getDebugInfoBuilder()).lockStack());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
        for (ParameterNode param : graph.getNodes(ParameterNode.TYPE)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   125
            Value paramValue = params[param.index()];
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 48172
diff changeset
   126
            assert paramValue.getValueKind().equals(getLIRGeneratorTool().getLIRKind(param.stamp(NodeView.DEFAULT))) : paramValue.getValueKind() + " != " + param.stamp(NodeView.DEFAULT);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   127
            setResult(param, gen.emitMove(paramValue));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   128
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   129
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   132
    public void visitSafepointNode(SafepointNode i) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   133
        LIRFrameState info = state(i);
48172
e26fc5201707 8191437: AOT doesn't work easily after thread local handshakes
dlong
parents: 47798
diff changeset
   134
        Register thread = getGen().getProviders().getRegisters().getThreadRegister();
e26fc5201707 8191437: AOT doesn't work easily after thread local handshakes
dlong
parents: 47798
diff changeset
   135
        append(new AMD64HotSpotSafepointOp(info, getGen().config, this, thread));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   138
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   139
    protected void emitDirectCall(DirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   140
        InvokeKind invokeKind = ((HotSpotDirectCallTargetNode) callTarget).invokeKind();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   141
        if (invokeKind.isIndirect()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   142
            append(new AMD64HotspotDirectVirtualCallOp(callTarget.targetMethod(), result, parameters, temps, callState, invokeKind, getGen().config));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   144
            assert invokeKind.isDirect();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   145
            HotSpotResolvedJavaMethod resolvedMethod = (HotSpotResolvedJavaMethod) callTarget.targetMethod();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   146
            assert resolvedMethod.isConcrete() : "Cannot make direct call to abstract method.";
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   147
            append(new AMD64HotSpotDirectStaticCallOp(callTarget.targetMethod(), result, parameters, temps, callState, invokeKind, getGen().config));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   148
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   149
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   150
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   151
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   152
    protected void emitIndirectCall(IndirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   153
        if (callTarget instanceof HotSpotIndirectCallTargetNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   154
            Value metaspaceMethodSrc = operand(((HotSpotIndirectCallTargetNode) callTarget).metaspaceMethod());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   155
            Value targetAddressSrc = operand(callTarget.computedAddress());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   156
            AllocatableValue metaspaceMethodDst = AMD64.rbx.asValue(metaspaceMethodSrc.getValueKind());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   157
            AllocatableValue targetAddressDst = AMD64.rax.asValue(targetAddressSrc.getValueKind());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   158
            gen.emitMove(metaspaceMethodDst, metaspaceMethodSrc);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   159
            gen.emitMove(targetAddressDst, targetAddressSrc);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   160
            append(new AMD64IndirectCallOp(callTarget.targetMethod(), result, parameters, temps, metaspaceMethodDst, targetAddressDst, callState, getGen().config));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   161
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   162
            super.emitIndirectCall(callTarget, result, parameters, temps, callState);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   163
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   164
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   165
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   166
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   167
    public void emitPatchReturnAddress(ValueNode address) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   168
        append(new AMD64HotSpotPatchReturnAddressOp(gen.load(operand(address))));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   169
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   170
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   171
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   172
    public void emitJumpToExceptionHandlerInCaller(ValueNode handlerInCallerPc, ValueNode exception, ValueNode exceptionPc) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   173
        Variable handler = gen.load(operand(handlerInCallerPc));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   174
        ForeignCallLinkage linkage = gen.getForeignCalls().lookupForeignCall(EXCEPTION_HANDLER_IN_CALLER);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   175
        CallingConvention outgoingCc = linkage.getOutgoingCallingConvention();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   176
        assert outgoingCc.getArgumentCount() == 2;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   177
        RegisterValue exceptionFixed = (RegisterValue) outgoingCc.getArgument(0);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   178
        RegisterValue exceptionPcFixed = (RegisterValue) outgoingCc.getArgument(1);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   179
        gen.emitMove(exceptionFixed, operand(exception));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   180
        gen.emitMove(exceptionPcFixed, operand(exceptionPc));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   181
        Register thread = getGen().getProviders().getRegisters().getThreadRegister();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   182
        AMD64HotSpotJumpToExceptionHandlerInCallerOp op = new AMD64HotSpotJumpToExceptionHandlerInCallerOp(handler, exceptionFixed, exceptionPcFixed, getGen().config.threadIsMethodHandleReturnOffset,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   183
                        thread);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   184
        append(op);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   185
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   186
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   187
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   188
    public void visitFullInfopointNode(FullInfopointNode i) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   189
        if (i.getState() != null && i.getState().bci == BytecodeFrame.AFTER_BCI) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46344
diff changeset
   190
            i.getDebug().log("Ignoring InfopointNode for AFTER_BCI");
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   191
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   192
            super.visitFullInfopointNode(i);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   193
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   194
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   195
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   196
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   197
    public void visitBreakpointNode(BreakpointNode node) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   198
        JavaType[] sig = new JavaType[node.arguments().size()];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   199
        for (int i = 0; i < sig.length; i++) {
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 48172
diff changeset
   200
            sig[i] = node.arguments().get(i).stamp(NodeView.DEFAULT).javaType(gen.getMetaAccess());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   201
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   202
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   203
        Value[] parameters = visitInvokeArguments(gen.getRegisterConfig().getCallingConvention(HotSpotCallingConventionType.JavaCall, null, sig, gen), node.arguments());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   204
        append(new AMD64BreakpointOp(parameters));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   205
    }
54328
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   206
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   207
    private ForeignCallLinkage lookupForeignCall(ForeignCallDescriptor descriptor) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   208
        return getGen().getForeignCalls().lookupForeignCall(descriptor);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   209
    }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   210
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   211
    @Override
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   212
    public ForeignCallLinkage lookupGraalStub(ValueNode valueNode) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   213
        ResolvedJavaMethod method = valueNode.graph().method();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   214
        if (method == null || method.getAnnotation(Snippet.class) != null) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   215
            // Emit assembly for snippet stubs
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   216
            return null;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   217
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   218
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   219
        if (valueNode instanceof ArrayEqualsNode) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   220
            ArrayEqualsNode arrayEqualsNode = (ArrayEqualsNode) valueNode;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   221
            JavaKind kind = arrayEqualsNode.getKind();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   222
            ValueNode length = arrayEqualsNode.getLength();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   223
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   224
            if (length.isConstant()) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   225
                int constantLength = length.asJavaConstant().asInt();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   226
                if (constantLength >= 0 && constantLength * kind.getByteCount() < 2 * getGen().getMaxVectorSize()) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   227
                    // Yield constant-length arrays comparison assembly
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   228
                    return null;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   229
                }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   230
            }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   231
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   232
            switch (kind) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   233
                case Boolean:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   234
                    return lookupForeignCall(AMD64ArrayEqualsStub.STUB_BOOLEAN_ARRAY_EQUALS);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   235
                case Byte:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   236
                    return lookupForeignCall(AMD64ArrayEqualsStub.STUB_BYTE_ARRAY_EQUALS);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   237
                case Char:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   238
                    return lookupForeignCall(AMD64ArrayEqualsStub.STUB_CHAR_ARRAY_EQUALS);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   239
                case Short:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   240
                    return lookupForeignCall(AMD64ArrayEqualsStub.STUB_SHORT_ARRAY_EQUALS);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   241
                case Int:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   242
                    return lookupForeignCall(AMD64ArrayEqualsStub.STUB_INT_ARRAY_EQUALS);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   243
                case Long:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   244
                    return lookupForeignCall(AMD64ArrayEqualsStub.STUB_LONG_ARRAY_EQUALS);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   245
                case Float:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   246
                    return lookupForeignCall(AMD64ArrayEqualsStub.STUB_FLOAT_ARRAY_EQUALS);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   247
                case Double:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   248
                    return lookupForeignCall(AMD64ArrayEqualsStub.STUB_DOUBLE_ARRAY_EQUALS);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   249
                default:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   250
                    return null;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   251
            }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   252
        } else if (valueNode instanceof ArrayCompareToNode) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   253
            ArrayCompareToNode arrayCompareToNode = (ArrayCompareToNode) valueNode;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   254
            JavaKind kind1 = arrayCompareToNode.getKind1();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   255
            JavaKind kind2 = arrayCompareToNode.getKind2();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   256
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   257
            if (kind1 == JavaKind.Byte) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   258
                if (kind2 == JavaKind.Byte) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   259
                    return lookupForeignCall(AMD64ArrayCompareToStub.STUB_BYTE_ARRAY_COMPARE_TO_BYTE_ARRAY);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   260
                } else if (kind2 == JavaKind.Char) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   261
                    return lookupForeignCall(AMD64ArrayCompareToStub.STUB_BYTE_ARRAY_COMPARE_TO_CHAR_ARRAY);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   262
                }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   263
            } else if (kind1 == JavaKind.Char) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   264
                if (kind2 == JavaKind.Byte) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   265
                    return lookupForeignCall(AMD64ArrayCompareToStub.STUB_CHAR_ARRAY_COMPARE_TO_BYTE_ARRAY);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   266
                } else if (kind2 == JavaKind.Char) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   267
                    return lookupForeignCall(AMD64ArrayCompareToStub.STUB_CHAR_ARRAY_COMPARE_TO_CHAR_ARRAY);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   268
                }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   269
            }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   270
        } else if (valueNode instanceof ArrayRegionEqualsNode) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   271
            ArrayRegionEqualsNode arrayRegionEqualsNode = (ArrayRegionEqualsNode) valueNode;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   272
            JavaKind kind1 = arrayRegionEqualsNode.getKind1();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   273
            JavaKind kind2 = arrayRegionEqualsNode.getKind2();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   274
            ValueNode length = arrayRegionEqualsNode.getLength();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   275
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   276
            if (length.isConstant()) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   277
                int constantLength = length.asJavaConstant().asInt();
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   278
                if (constantLength >= 0 && constantLength * (Math.max(kind1.getByteCount(), kind2.getByteCount())) < 2 * getGen().getMaxVectorSize()) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   279
                    // Yield constant-length arrays comparison assembly
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   280
                    return null;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   281
                }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   282
            }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   283
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   284
            if (kind1 == kind2) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   285
                switch (kind1) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   286
                    case Byte:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   287
                        return lookupForeignCall(AMD64ArrayEqualsStub.STUB_BYTE_ARRAY_EQUALS_DIRECT);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   288
                    case Char:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   289
                        return lookupForeignCall(AMD64ArrayEqualsStub.STUB_CHAR_ARRAY_EQUALS_DIRECT);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   290
                    default:
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   291
                        return null;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   292
                }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   293
            } else if (kind1 == JavaKind.Char && kind2 == JavaKind.Byte) {
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   294
                return lookupForeignCall(AMD64ArrayEqualsStub.STUB_CHAR_ARRAY_EQUALS_BYTE_ARRAY);
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   295
            }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   296
        }
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   297
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   298
        return null;
37648a9c4a6a 8221341: Update Graal
jwilhelm
parents: 52910
diff changeset
   299
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   300
}