src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeMatchRules.java
author jwilhelm
Thu, 27 Jun 2019 03:33:44 +0200
changeset 55509 d58442b8abc1
parent 54601 c40b2a190173
child 58877 aec7bf35d6f5
permissions -rw-r--r--
8225497: 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
/*
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
     2
 * Copyright (c) 2015, 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
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    23
50858
2d3e99a72541 8205824: Update Graal
never
parents: 48190
diff changeset
    24
2d3e99a72541 8205824: Update Graal
never
parents: 48190
diff changeset
    25
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
package org.graalvm.compiler.core.aarch64;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    27
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
    28
import jdk.vm.ci.aarch64.AArch64Kind;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    29
import jdk.vm.ci.code.CodeUtil;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    30
import jdk.vm.ci.meta.AllocatableValue;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    31
import jdk.vm.ci.meta.JavaKind;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    32
import jdk.vm.ci.meta.Value;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    33
import jdk.internal.vm.compiler.collections.EconomicMap;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    34
import jdk.internal.vm.compiler.collections.Equivalence;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    35
import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    36
import org.graalvm.compiler.core.common.LIRKind;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
    37
import org.graalvm.compiler.core.common.calc.CanonicalCondition;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    38
import org.graalvm.compiler.core.gen.NodeMatchRules;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    39
import org.graalvm.compiler.core.match.ComplexMatchResult;
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    40
import org.graalvm.compiler.core.match.MatchRule;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    41
import org.graalvm.compiler.graph.Node;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import org.graalvm.compiler.lir.LIRFrameState;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    43
import org.graalvm.compiler.lir.LabelRef;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    44
import org.graalvm.compiler.lir.Variable;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    45
import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticOp;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    46
import org.graalvm.compiler.lir.aarch64.AArch64BitFieldOp;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    47
import org.graalvm.compiler.lir.aarch64.AArch64ControlFlow;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    49
import org.graalvm.compiler.nodes.ConstantNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
import org.graalvm.compiler.nodes.DeoptimizingNode;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
    51
import org.graalvm.compiler.nodes.FixedNode;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    52
import org.graalvm.compiler.nodes.IfNode;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47216
diff changeset
    53
import org.graalvm.compiler.nodes.NodeView;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    54
import org.graalvm.compiler.nodes.ValueNode;
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    55
import org.graalvm.compiler.nodes.calc.AddNode;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    56
import org.graalvm.compiler.nodes.calc.AndNode;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    57
import org.graalvm.compiler.nodes.calc.BinaryNode;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
    58
import org.graalvm.compiler.nodes.calc.IntegerLessThanNode;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    59
import org.graalvm.compiler.nodes.calc.LeftShiftNode;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    60
import org.graalvm.compiler.nodes.calc.NotNode;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    61
import org.graalvm.compiler.nodes.calc.OrNode;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    62
import org.graalvm.compiler.nodes.calc.RightShiftNode;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    63
import org.graalvm.compiler.nodes.calc.SubNode;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    64
import org.graalvm.compiler.nodes.calc.UnsignedRightShiftNode;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    65
import org.graalvm.compiler.nodes.calc.XorNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
import org.graalvm.compiler.nodes.memory.Access;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
public class AArch64NodeMatchRules extends NodeMatchRules {
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    69
    private static final EconomicMap<Class<? extends Node>, AArch64ArithmeticOp> nodeOpMap;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    70
    private static final EconomicMap<Class<? extends BinaryNode>, AArch64BitFieldOp.BitFieldOpCode> bitFieldOpMap;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    71
    private static final EconomicMap<Class<? extends BinaryNode>, AArch64MacroAssembler.ShiftType> shiftTypeMap;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    72
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    73
    static {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    74
        nodeOpMap = EconomicMap.create(Equivalence.IDENTITY, 5);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    75
        nodeOpMap.put(AddNode.class, AArch64ArithmeticOp.ADD);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    76
        nodeOpMap.put(SubNode.class, AArch64ArithmeticOp.SUB);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    77
        nodeOpMap.put(AndNode.class, AArch64ArithmeticOp.AND);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    78
        nodeOpMap.put(OrNode.class, AArch64ArithmeticOp.OR);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    79
        nodeOpMap.put(XorNode.class, AArch64ArithmeticOp.XOR);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    80
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    81
        bitFieldOpMap = EconomicMap.create(Equivalence.IDENTITY, 2);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    82
        bitFieldOpMap.put(UnsignedRightShiftNode.class, AArch64BitFieldOp.BitFieldOpCode.UBFX);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    83
        bitFieldOpMap.put(LeftShiftNode.class, AArch64BitFieldOp.BitFieldOpCode.UBFIZ);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    84
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    85
        shiftTypeMap = EconomicMap.create(Equivalence.IDENTITY, 3);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    86
        shiftTypeMap.put(LeftShiftNode.class, AArch64MacroAssembler.ShiftType.LSL);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    87
        shiftTypeMap.put(RightShiftNode.class, AArch64MacroAssembler.ShiftType.ASR);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    88
        shiftTypeMap.put(UnsignedRightShiftNode.class, AArch64MacroAssembler.ShiftType.LSR);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    89
    }
43972
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
    public AArch64NodeMatchRules(LIRGeneratorTool gen) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
        super(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
    protected LIRFrameState getState(Access access) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    96
        if (access instanceof DeoptimizingNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
            return state((DeoptimizingNode) access);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    98
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
        return null;
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   102
    protected AArch64Kind getMemoryKind(Access access) {
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47216
diff changeset
   103
        return (AArch64Kind) gen.getLIRKind(access.asNode().stamp(NodeView.DEFAULT)).getPlatformKind();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   105
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   106
    private AllocatableValue moveSp(AllocatableValue value) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   107
        return getLIRGeneratorTool().moveSp(value);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   108
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   109
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   110
    private ComplexMatchResult emitBitField(AArch64BitFieldOp.BitFieldOpCode op, ValueNode value, int lsb, int width) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   111
        assert op != null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   112
        assert value.getStackKind().isNumericInteger();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   113
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   114
        return builder -> {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   115
            Value a = operand(value);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   116
            Variable result = gen.newVariable(LIRKind.combine(a));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   117
            AllocatableValue src = moveSp(gen.asAllocatable(a));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   118
            gen.append(new AArch64BitFieldOp(op, result, src, lsb, width));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   119
            return result;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   120
        };
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   121
    }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   122
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   123
    private ComplexMatchResult emitBinaryShift(AArch64ArithmeticOp op, ValueNode value, BinaryNode shift,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   124
                    boolean isShiftNot) {
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   125
        AArch64MacroAssembler.ShiftType shiftType = shiftTypeMap.get(shift.getClass());
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   126
        assert shiftType != null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   127
        assert value.getStackKind().isNumericInteger();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   128
        assert shift.getX().getStackKind().isNumericInteger();
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   129
        assert shift.getY() instanceof ConstantNode;
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   130
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   131
        return builder -> {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   132
            Value a = operand(value);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   133
            Value b = operand(shift.getX());
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   134
            Variable result = gen.newVariable(LIRKind.combine(a, b));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   135
            AllocatableValue x = moveSp(gen.asAllocatable(a));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   136
            AllocatableValue y = moveSp(gen.asAllocatable(b));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   137
            int shiftAmount = shift.getY().asJavaConstant().asInt();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   138
            gen.append(new AArch64ArithmeticOp.BinaryShiftOp(op, result, x, y, shiftType, shiftAmount, isShiftNot));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   139
            return result;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   140
        };
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   141
    }
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   142
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   143
    private ComplexMatchResult emitBitTestAndBranch(FixedNode trueSuccessor, FixedNode falseSuccessor,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   144
                    ValueNode value, double trueProbability, int nbits) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   145
        return builder -> {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   146
            LabelRef trueDestination = getLIRBlock(trueSuccessor);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   147
            LabelRef falseDestination = getLIRBlock(falseSuccessor);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   148
            AllocatableValue src = moveSp(gen.asAllocatable(operand(value)));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   149
            gen.append(new AArch64ControlFlow.BitTestAndBranchOp(trueDestination, falseDestination, src,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   150
                            trueProbability, nbits));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   151
            return null;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   152
        };
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   153
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   154
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   155
    @MatchRule("(And (UnsignedRightShift=shift a Constant=b) Constant=c)")
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   156
    @MatchRule("(LeftShift=shift (And a Constant=c) Constant=b)")
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   157
    public ComplexMatchResult unsignedBitField(BinaryNode shift, ValueNode a, ConstantNode b, ConstantNode c) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   158
        JavaKind srcKind = a.getStackKind();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   159
        assert srcKind.isNumericInteger();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   160
        AArch64BitFieldOp.BitFieldOpCode op = bitFieldOpMap.get(shift.getClass());
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   161
        assert op != null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   162
        int distance = b.asJavaConstant().asInt();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   163
        long mask = c.asJavaConstant().asLong();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   164
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   165
        // The Java(R) Language Specification CHAPTER 15.19 Shift Operators says:
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   166
        // "If the promoted type of the left-hand operand is int(long), then only the five(six)
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   167
        // lowest-order bits of the right-hand operand are used as the shift distance."
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   168
        distance = distance & (srcKind == JavaKind.Int ? 0x1f : 0x3f);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   169
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   170
        // Constraint 1: Mask plus one should be a power-of-2 integer.
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   171
        if (!CodeUtil.isPowerOf2(mask + 1)) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   172
            return null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   173
        }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   174
        int width = CodeUtil.log2(mask + 1);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   175
        int srcBits = srcKind.getBitCount();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   176
        // Constraint 2: Bit field width is less than 31(63) for int(long) as any bit field move
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   177
        // operations can be done by a single shift instruction if the width is 31(63).
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   178
        if (width >= srcBits - 1) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   179
            return null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   180
        }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   181
        // Constraint 3: Sum of bit field width and the shift distance is less or equal to 32(64)
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   182
        // for int(long) as the specification of AArch64 bit field instructions.
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   183
        if (width + distance > srcBits) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   184
            return null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   185
        }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   186
        return emitBitField(op, a, distance, width);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   187
    }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   188
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   189
    @MatchRule("(Add=binary a (LeftShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   190
    @MatchRule("(Add=binary a (RightShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   191
    @MatchRule("(Add=binary a (UnsignedRightShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   192
    @MatchRule("(Sub=binary a (LeftShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   193
    @MatchRule("(Sub=binary a (RightShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   194
    @MatchRule("(Sub=binary a (UnsignedRightShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   195
    public ComplexMatchResult addSubShift(BinaryNode binary, ValueNode a, BinaryNode shift) {
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   196
        AArch64ArithmeticOp op = nodeOpMap.get(binary.getClass());
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   197
        assert op != null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   198
        return emitBinaryShift(op, a, shift, false);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   199
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   200
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   201
    @MatchRule("(And=binary a (LeftShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   202
    @MatchRule("(And=binary a (RightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   203
    @MatchRule("(And=binary a (UnsignedRightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   204
    @MatchRule("(Or=binary a (LeftShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   205
    @MatchRule("(Or=binary a (RightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   206
    @MatchRule("(Or=binary a (UnsignedRightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   207
    @MatchRule("(Xor=binary a (LeftShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   208
    @MatchRule("(Xor=binary a (RightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   209
    @MatchRule("(Xor=binary a (UnsignedRightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   210
    @MatchRule("(And=binary a (Not (LeftShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   211
    @MatchRule("(And=binary a (Not (RightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   212
    @MatchRule("(And=binary a (Not (UnsignedRightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   213
    @MatchRule("(Or=binary a (Not (LeftShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   214
    @MatchRule("(Or=binary a (Not (RightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   215
    @MatchRule("(Or=binary a (Not (UnsignedRightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   216
    @MatchRule("(Xor=binary a (Not (LeftShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   217
    @MatchRule("(Xor=binary a (Not (RightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   218
    @MatchRule("(Xor=binary a (Not (UnsignedRightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   219
    public ComplexMatchResult logicShift(BinaryNode binary, ValueNode a, BinaryNode shift) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   220
        AArch64ArithmeticOp op = nodeOpMap.get(binary.getClass());
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   221
        assert op != null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   222
        ValueNode operand = binary.getX() == a ? binary.getY() : binary.getX();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   223
        boolean isShiftNot = operand instanceof NotNode;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   224
        return emitBinaryShift(op, a, shift, isShiftNot);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   225
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   226
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   227
    @MatchRule("(Mul (Negate a) b)")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   228
    @MatchRule("(Negate (Mul a b))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   229
    public ComplexMatchResult multiplyNegate(ValueNode a, ValueNode b) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   230
        if (a.getStackKind().isNumericInteger() && b.getStackKind().isNumericInteger()) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   231
            return builder -> getArithmeticLIRGenerator().emitMNeg(operand(a), operand(b));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   232
        }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   233
        return null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   234
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   235
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   236
    @MatchRule("(Add=binary (Mul a b) c)")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   237
    @MatchRule("(Sub=binary c (Mul a b))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   238
    public ComplexMatchResult multiplyAddSub(BinaryNode binary, ValueNode a, ValueNode b, ValueNode c) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   239
        JavaKind kindA = a.getStackKind();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   240
        JavaKind kindB = b.getStackKind();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   241
        JavaKind kindC = c.getStackKind();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   242
        if (!kindA.isNumericInteger() || !kindB.isNumericInteger() || !kindC.isNumericInteger()) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   243
            return null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   244
        }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   245
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   246
        if (binary instanceof AddNode) {
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   247
            return builder -> getArithmeticLIRGenerator().emitMAdd(operand(a), operand(b), operand(c));
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   248
        }
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   249
        return builder -> getArithmeticLIRGenerator().emitMSub(operand(a), operand(b), operand(c));
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   250
    }
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   251
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   252
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   253
     * ((x & (1 << n)) == 0) -> tbz/tbnz n label.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   254
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   255
    @MatchRule("(If (IntegerTest value Constant=a))")
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   256
    public ComplexMatchResult testBitAndBranch(IfNode root, ValueNode value, ConstantNode a) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   257
        if (value.getStackKind().isNumericInteger()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   258
            long constant = a.asJavaConstant().asLong();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   259
            if (Long.bitCount(constant) == 1) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   260
                return emitBitTestAndBranch(root.trueSuccessor(), root.falseSuccessor(), value,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   261
                                root.getTrueSuccessorProbability(), Long.numberOfTrailingZeros(constant));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   262
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   263
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   264
        return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   265
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   266
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   267
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   268
     * if x < 0 <=> tbz x, sizeOfBits(x) - 1, label.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   269
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   270
    @MatchRule("(If (IntegerLessThan=lessNode x Constant=y))")
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   271
    public ComplexMatchResult checkNegativeAndBranch(IfNode root, IntegerLessThanNode lessNode, ValueNode x, ConstantNode y) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   272
        JavaKind xKind = x.getStackKind();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   273
        assert xKind.isNumericInteger();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   274
        if (y.isJavaConstant() && (0 == y.asJavaConstant().asLong()) && lessNode.condition().equals(CanonicalCondition.LT)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   275
            return emitBitTestAndBranch(root.falseSuccessor(), root.trueSuccessor(), x,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   276
                            1.0 - root.getTrueSuccessorProbability(), xKind.getBitCount() - 1);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   277
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   278
        return null;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   279
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   280
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   281
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   282
    public AArch64LIRGenerator getLIRGeneratorTool() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   283
        return (AArch64LIRGenerator) gen;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   284
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   285
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   286
    protected AArch64ArithmeticLIRGenerator getArithmeticLIRGenerator() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   287
        return (AArch64ArithmeticLIRGenerator) getLIRGeneratorTool().getArithmetic();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   288
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   289
}