src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64/src/org/graalvm/compiler/core/aarch64/AArch64NodeMatchRules.java
author dlong
Thu, 14 Nov 2019 12:21:00 -0800
changeset 59095 03fbcd06b4c0
parent 58877 aec7bf35d6f5
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
/*
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;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    41
import org.graalvm.compiler.lir.LIRFrameState;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    42
import org.graalvm.compiler.lir.LabelRef;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    43
import org.graalvm.compiler.lir.Variable;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    44
import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticOp;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    45
import org.graalvm.compiler.lir.aarch64.AArch64BitFieldOp;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    46
import org.graalvm.compiler.lir.aarch64.AArch64ControlFlow;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    48
import org.graalvm.compiler.nodes.ConstantNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    49
import org.graalvm.compiler.nodes.DeoptimizingNode;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
    50
import org.graalvm.compiler.nodes.FixedNode;
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
    51
import org.graalvm.compiler.nodes.IfNode;
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47216
diff changeset
    52
import org.graalvm.compiler.nodes.NodeView;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    53
import org.graalvm.compiler.nodes.ValueNode;
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    54
import org.graalvm.compiler.nodes.calc.AddNode;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    55
import org.graalvm.compiler.nodes.calc.AndNode;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    56
import org.graalvm.compiler.nodes.calc.BinaryNode;
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
    57
import org.graalvm.compiler.nodes.calc.IntegerLessThanNode;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    58
import org.graalvm.compiler.nodes.calc.LeftShiftNode;
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
    59
import org.graalvm.compiler.nodes.calc.MulNode;
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    60
import org.graalvm.compiler.nodes.calc.NarrowNode;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    61
import org.graalvm.compiler.nodes.calc.NegateNode;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    62
import org.graalvm.compiler.nodes.calc.NotNode;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    63
import org.graalvm.compiler.nodes.calc.OrNode;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    64
import org.graalvm.compiler.nodes.calc.RightShiftNode;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    65
import org.graalvm.compiler.nodes.calc.SubNode;
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    66
import org.graalvm.compiler.nodes.calc.UnaryNode;
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
    67
import org.graalvm.compiler.nodes.calc.UnsignedRightShiftNode;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    68
import org.graalvm.compiler.nodes.calc.XorNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
import org.graalvm.compiler.nodes.memory.Access;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
public class AArch64NodeMatchRules extends NodeMatchRules {
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    72
    private static final EconomicMap<Class<? extends BinaryNode>, AArch64ArithmeticOp> binaryOpMap;
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    73
    private static final EconomicMap<Class<? extends BinaryNode>, AArch64BitFieldOp.BitFieldOpCode> bitFieldOpMap;
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    74
    private static final EconomicMap<Class<? extends BinaryNode>, AArch64MacroAssembler.ShiftType> shiftTypeMap;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    75
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    76
    static {
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    77
        binaryOpMap = EconomicMap.create(Equivalence.IDENTITY, 9);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    78
        binaryOpMap.put(AddNode.class, AArch64ArithmeticOp.ADD);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    79
        binaryOpMap.put(SubNode.class, AArch64ArithmeticOp.SUB);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    80
        binaryOpMap.put(MulNode.class, AArch64ArithmeticOp.MUL);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    81
        binaryOpMap.put(AndNode.class, AArch64ArithmeticOp.AND);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    82
        binaryOpMap.put(OrNode.class, AArch64ArithmeticOp.OR);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    83
        binaryOpMap.put(XorNode.class, AArch64ArithmeticOp.XOR);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    84
        binaryOpMap.put(LeftShiftNode.class, AArch64ArithmeticOp.SHL);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    85
        binaryOpMap.put(RightShiftNode.class, AArch64ArithmeticOp.ASHR);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
    86
        binaryOpMap.put(UnsignedRightShiftNode.class, AArch64ArithmeticOp.LSHR);
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    87
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    88
        bitFieldOpMap = EconomicMap.create(Equivalence.IDENTITY, 2);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    89
        bitFieldOpMap.put(UnsignedRightShiftNode.class, AArch64BitFieldOp.BitFieldOpCode.UBFX);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    90
        bitFieldOpMap.put(LeftShiftNode.class, AArch64BitFieldOp.BitFieldOpCode.UBFIZ);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
    91
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    92
        shiftTypeMap = EconomicMap.create(Equivalence.IDENTITY, 3);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    93
        shiftTypeMap.put(LeftShiftNode.class, AArch64MacroAssembler.ShiftType.LSL);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    94
        shiftTypeMap.put(RightShiftNode.class, AArch64MacroAssembler.ShiftType.ASR);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    95
        shiftTypeMap.put(UnsignedRightShiftNode.class, AArch64MacroAssembler.ShiftType.LSR);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
    96
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    98
    public AArch64NodeMatchRules(LIRGeneratorTool gen) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
        super(gen);
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 LIRFrameState getState(Access access) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   103
        if (access instanceof DeoptimizingNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
            return state((DeoptimizingNode) access);
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
        return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   107
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   108
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   109
    protected AArch64Kind getMemoryKind(Access access) {
48190
25cfedf27edc 8192814: Update Graal
dlong
parents: 47216
diff changeset
   110
        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
   111
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   112
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   113
    private AllocatableValue moveSp(AllocatableValue value) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   114
        return getLIRGeneratorTool().moveSp(value);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   115
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   116
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   117
    private ComplexMatchResult emitBitField(AArch64BitFieldOp.BitFieldOpCode op, ValueNode value, int lsb, int width) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   118
        assert op != null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   119
        assert value.getStackKind().isNumericInteger();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   120
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   121
        return builder -> {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   122
            Value a = operand(value);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   123
            Variable result = gen.newVariable(LIRKind.combine(a));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   124
            AllocatableValue src = moveSp(gen.asAllocatable(a));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   125
            gen.append(new AArch64BitFieldOp(op, result, src, lsb, width));
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   126
            return result;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   127
        };
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   128
    }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   129
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   130
    private ComplexMatchResult emitBinaryShift(AArch64ArithmeticOp op, ValueNode value, BinaryNode shift,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   131
                    boolean isShiftNot) {
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   132
        AArch64MacroAssembler.ShiftType shiftType = shiftTypeMap.get(shift.getClass());
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   133
        assert shiftType != null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   134
        assert value.getStackKind().isNumericInteger();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   135
        assert shift.getX().getStackKind().isNumericInteger();
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   136
        assert shift.getY() instanceof ConstantNode;
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   137
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   138
        return builder -> {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   139
            Value a = operand(value);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   140
            Value b = operand(shift.getX());
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   141
            Variable result = gen.newVariable(LIRKind.combine(a, b));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   142
            AllocatableValue x = moveSp(gen.asAllocatable(a));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   143
            AllocatableValue y = moveSp(gen.asAllocatable(b));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   144
            int shiftAmount = shift.getY().asJavaConstant().asInt();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   145
            gen.append(new AArch64ArithmeticOp.BinaryShiftOp(op, result, x, y, shiftType, shiftAmount, isShiftNot));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   146
            return result;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   147
        };
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   148
    }
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   149
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   150
    private ComplexMatchResult emitBitTestAndBranch(FixedNode trueSuccessor, FixedNode falseSuccessor,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   151
                    ValueNode value, double trueProbability, int nbits) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   152
        return builder -> {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   153
            LabelRef trueDestination = getLIRBlock(trueSuccessor);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   154
            LabelRef falseDestination = getLIRBlock(falseSuccessor);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   155
            AllocatableValue src = moveSp(gen.asAllocatable(operand(value)));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   156
            gen.append(new AArch64ControlFlow.BitTestAndBranchOp(trueDestination, falseDestination, src,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   157
                            trueProbability, nbits));
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   158
            return null;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   159
        };
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   160
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   161
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   162
    private static boolean isNarrowingLongToInt(NarrowNode narrow) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   163
        return narrow.getInputBits() == 64 && narrow.getResultBits() == 32;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   164
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   165
55509
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   166
    @MatchRule("(And (UnsignedRightShift=shift a Constant=b) Constant=c)")
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   167
    @MatchRule("(LeftShift=shift (And a Constant=c) Constant=b)")
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   168
    public ComplexMatchResult unsignedBitField(BinaryNode shift, ValueNode a, ConstantNode b, ConstantNode c) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   169
        JavaKind srcKind = a.getStackKind();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   170
        assert srcKind.isNumericInteger();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   171
        AArch64BitFieldOp.BitFieldOpCode op = bitFieldOpMap.get(shift.getClass());
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   172
        assert op != null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   173
        int distance = b.asJavaConstant().asInt();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   174
        long mask = c.asJavaConstant().asLong();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   175
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   176
        // The Java(R) Language Specification CHAPTER 15.19 Shift Operators says:
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   177
        // "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
   178
        // lowest-order bits of the right-hand operand are used as the shift distance."
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   179
        distance = distance & (srcKind == JavaKind.Int ? 0x1f : 0x3f);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   180
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   181
        // Constraint 1: Mask plus one should be a power-of-2 integer.
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   182
        if (!CodeUtil.isPowerOf2(mask + 1)) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   183
            return null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   184
        }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   185
        int width = CodeUtil.log2(mask + 1);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   186
        int srcBits = srcKind.getBitCount();
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   187
        // 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
   188
        // operations can be done by a single shift instruction if the width is 31(63).
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   189
        if (width >= srcBits - 1) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   190
            return null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   191
        }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   192
        // 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
   193
        // for int(long) as the specification of AArch64 bit field instructions.
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   194
        if (width + distance > srcBits) {
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   195
            return null;
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   196
        }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   197
        return emitBitField(op, a, distance, width);
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   198
    }
d58442b8abc1 8225497: Update Graal
jwilhelm
parents: 54601
diff changeset
   199
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   200
    @MatchRule("(Add=binary a (LeftShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   201
    @MatchRule("(Add=binary a (RightShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   202
    @MatchRule("(Add=binary a (UnsignedRightShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   203
    @MatchRule("(Sub=binary a (LeftShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   204
    @MatchRule("(Sub=binary a (RightShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   205
    @MatchRule("(Sub=binary a (UnsignedRightShift=shift b Constant))")
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   206
    public ComplexMatchResult addSubShift(BinaryNode binary, ValueNode a, BinaryNode shift) {
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   207
        AArch64ArithmeticOp op = binaryOpMap.get(binary.getClass());
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   208
        assert op != null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   209
        return emitBinaryShift(op, a, shift, false);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   210
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   211
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   212
    @MatchRule("(And=binary a (LeftShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   213
    @MatchRule("(And=binary a (RightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   214
    @MatchRule("(And=binary a (UnsignedRightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   215
    @MatchRule("(Or=binary a (LeftShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   216
    @MatchRule("(Or=binary a (RightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   217
    @MatchRule("(Or=binary a (UnsignedRightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   218
    @MatchRule("(Xor=binary a (LeftShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   219
    @MatchRule("(Xor=binary a (RightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   220
    @MatchRule("(Xor=binary a (UnsignedRightShift=shift b Constant))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   221
    @MatchRule("(And=binary a (Not (LeftShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   222
    @MatchRule("(And=binary a (Not (RightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   223
    @MatchRule("(And=binary a (Not (UnsignedRightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   224
    @MatchRule("(Or=binary a (Not (LeftShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   225
    @MatchRule("(Or=binary a (Not (RightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   226
    @MatchRule("(Or=binary a (Not (UnsignedRightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   227
    @MatchRule("(Xor=binary a (Not (LeftShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   228
    @MatchRule("(Xor=binary a (Not (RightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   229
    @MatchRule("(Xor=binary a (Not (UnsignedRightShift=shift b Constant)))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   230
    public ComplexMatchResult logicShift(BinaryNode binary, ValueNode a, BinaryNode shift) {
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   231
        AArch64ArithmeticOp op = binaryOpMap.get(binary.getClass());
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   232
        assert op != null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   233
        ValueNode operand = binary.getX() == a ? binary.getY() : binary.getX();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   234
        boolean isShiftNot = operand instanceof NotNode;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   235
        return emitBinaryShift(op, a, shift, isShiftNot);
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   236
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   237
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   238
    @MatchRule("(Add=binary (Mul (SignExtend a) (SignExtend b)) c)")
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   239
    @MatchRule("(Sub=binary c (Mul (SignExtend a) (SignExtend b)))")
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   240
    public ComplexMatchResult signedMultiplyAddSubLong(BinaryNode binary, ValueNode a, ValueNode b, ValueNode c) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   241
        assert a.getStackKind() == JavaKind.Int && b.getStackKind() == JavaKind.Int && c.getStackKind() == JavaKind.Long;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   242
        if (binary instanceof AddNode) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   243
            return builder -> getArithmeticLIRGenerator().emitIntegerMAdd(operand(a), operand(b), operand(c), true);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   244
        }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   245
        return builder -> getArithmeticLIRGenerator().emitIntegerMSub(operand(a), operand(b), operand(c), true);
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   246
    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   247
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   248
    @MatchRule("(Negate (Mul=mul (SignExtend a) (SignExtend b)))")
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   249
    @MatchRule("(Mul=mul (Negate (SignExtend a)) (SignExtend b))")
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   250
    public ComplexMatchResult signedMultiplyNegLong(MulNode mul, ValueNode a, ValueNode b) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   251
        assert a.getStackKind() == JavaKind.Int && b.getStackKind() == JavaKind.Int;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   252
        LIRKind resultKind = LIRKind.fromJavaKind(gen.target().arch, mul.getStackKind());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   253
        return builder -> getArithmeticLIRGenerator().emitBinary(
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   254
                        resultKind, AArch64ArithmeticOp.SMNEGL, true, operand(a), operand(b));
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   255
    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   256
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   257
    @MatchRule("(Mul=mul (SignExtend a) (SignExtend b))")
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   258
    public ComplexMatchResult signedMultiplyLong(MulNode mul, ValueNode a, ValueNode b) {
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   259
        assert a.getStackKind() == JavaKind.Int && b.getStackKind() == JavaKind.Int;
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   260
        LIRKind resultKind = LIRKind.fromJavaKind(gen.target().arch, mul.getStackKind());
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   261
        return builder -> getArithmeticLIRGenerator().emitBinary(
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   262
                        resultKind, AArch64ArithmeticOp.SMULL, true, operand(a), operand(b));
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   263
    }
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   264
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   265
    @MatchRule("(Add=binary (Narrow=narrow a) (Narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   266
    @MatchRule("(Sub=binary (Narrow=narrow a) (Narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   267
    @MatchRule("(Mul=binary (Narrow=narrow a) (Narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   268
    @MatchRule("(And=binary (Narrow=narrow a) (Narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   269
    @MatchRule("(Or=binary (Narrow=narrow a) (Narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   270
    @MatchRule("(Xor=binary (Narrow=narrow a) (Narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   271
    @MatchRule("(LeftShift=binary (Narrow=narrow a) (Narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   272
    @MatchRule("(RightShift=binary (Narrow=narrow a) (Narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   273
    @MatchRule("(UnsignedRightShift=binary (Narrow=narrow a) (Narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   274
    @MatchRule("(Add=binary a (Narrow=narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   275
    @MatchRule("(Sub=binary a (Narrow=narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   276
    @MatchRule("(Mul=binary a (Narrow=narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   277
    @MatchRule("(And=binary a (Narrow=narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   278
    @MatchRule("(Or=binary a (Narrow=narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   279
    @MatchRule("(Xor=binary a (Narrow=narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   280
    @MatchRule("(LeftShift=binary a (Narrow=narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   281
    @MatchRule("(RightShift=binary a (Narrow=narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   282
    @MatchRule("(UnsignedRightShift=binary a (Narrow=narrow b))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   283
    @MatchRule("(Sub=binary (Narrow=narrow a) b)")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   284
    @MatchRule("(LeftShift=binary (Narrow=narrow a) b)")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   285
    @MatchRule("(RightShift=binary (Narrow=narrow a) b)")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   286
    @MatchRule("(UnsignedRightShift=binary (Narrow=narrow a) b)")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   287
    public ComplexMatchResult elideL2IForBinary(BinaryNode binary, NarrowNode narrow) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   288
        assert binary.getStackKind().isNumericInteger();
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   289
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   290
        ValueNode a = narrow;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   291
        ValueNode b = binary.getX() == narrow ? binary.getY() : binary.getX();
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   292
        boolean isL2Ia = isNarrowingLongToInt((NarrowNode) a);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   293
        boolean isL2Ib = (b instanceof NarrowNode) && isNarrowingLongToInt((NarrowNode) b);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   294
        if (!isL2Ia && !isL2Ib) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   295
            return null;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   296
        }
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   297
        // Get the value of L2I NarrowNode as the src value.
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   298
        ValueNode src1 = isL2Ia ? ((NarrowNode) a).getValue() : a;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   299
        ValueNode src2 = isL2Ib ? ((NarrowNode) b).getValue() : b;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   300
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   301
        AArch64ArithmeticOp op = binaryOpMap.get(binary.getClass());
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   302
        assert op != null;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   303
        boolean commutative = binary.getNodeClass().isCommutative();
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   304
        LIRKind resultKind = LIRKind.fromJavaKind(gen.target().arch, binary.getStackKind());
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   305
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   306
        // Must keep the right operator order for un-commutative binary operations.
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   307
        if (a == binary.getX()) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   308
            return builder -> getArithmeticLIRGenerator().emitBinary(
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   309
                            resultKind, op, commutative, operand(src1), operand(src2));
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   310
        }
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   311
        return builder -> getArithmeticLIRGenerator().emitBinary(
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   312
                        resultKind, op, commutative, operand(src2), operand(src1));
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   313
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   314
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   315
    @MatchRule("(Negate=unary (Narrow=narrow value))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   316
    @MatchRule("(Not=unary (Narrow=narrow value))")
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   317
    public ComplexMatchResult elideL2IForUnary(UnaryNode unary, NarrowNode narrow) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   318
        assert unary.getStackKind().isNumericInteger();
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   319
        if (!isNarrowingLongToInt(narrow)) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   320
            return null;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   321
        }
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   322
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   323
        AArch64ArithmeticOp op = unary instanceof NegateNode ? AArch64ArithmeticOp.NEG
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   324
                        : AArch64ArithmeticOp.NOT;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   325
        return builder -> {
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   326
            AllocatableValue input = gen.asAllocatable(operand(narrow.getValue()));
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   327
            LIRKind resultKind = LIRKind.fromJavaKind(gen.target().arch, unary.getStackKind());
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   328
            Variable result = gen.newVariable(resultKind);
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   329
            gen.append(new AArch64ArithmeticOp.UnaryOp(op, result, moveSp(input)));
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   330
            return result;
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   331
        };
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   332
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents: 58877
diff changeset
   333
52910
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   334
    @MatchRule("(Mul (Negate a) b)")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   335
    @MatchRule("(Negate (Mul a b))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   336
    public ComplexMatchResult multiplyNegate(ValueNode a, ValueNode b) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   337
        if (a.getStackKind().isNumericInteger() && b.getStackKind().isNumericInteger()) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   338
            return builder -> getArithmeticLIRGenerator().emitMNeg(operand(a), operand(b));
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   339
        }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   340
        return null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   341
    }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   342
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   343
    @MatchRule("(Add=binary (Mul a b) c)")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   344
    @MatchRule("(Sub=binary c (Mul a b))")
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   345
    public ComplexMatchResult multiplyAddSub(BinaryNode binary, ValueNode a, ValueNode b, ValueNode c) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   346
        JavaKind kindA = a.getStackKind();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   347
        JavaKind kindB = b.getStackKind();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   348
        JavaKind kindC = c.getStackKind();
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   349
        if (!kindA.isNumericInteger() || !kindB.isNumericInteger() || !kindC.isNumericInteger()) {
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   350
            return null;
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   351
        }
583fd71c47d6 8214023: Update Graal
dlong
parents: 52578
diff changeset
   352
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   353
        if (binary instanceof AddNode) {
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   354
            return builder -> getArithmeticLIRGenerator().emitIntegerMAdd(operand(a), operand(b), operand(c), false);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   355
        }
58877
aec7bf35d6f5 8233273: Update Graal
dlong
parents: 55509
diff changeset
   356
        return builder -> getArithmeticLIRGenerator().emitIntegerMSub(operand(a), operand(b), operand(c), false);
52578
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   357
    }
7dd81e82d083 8210777: Update Graal
dlong
parents: 50858
diff changeset
   358
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   359
    /**
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   360
     * ((x & (1 << n)) == 0) -> tbz/tbnz n label.
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   361
     */
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   362
    @MatchRule("(If (IntegerTest value Constant=a))")
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   363
    public ComplexMatchResult testBitAndBranch(IfNode root, ValueNode value, ConstantNode a) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   364
        if (value.getStackKind().isNumericInteger()) {
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   365
            long constant = a.asJavaConstant().asLong();
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   366
            if (Long.bitCount(constant) == 1) {
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   367
                return emitBitTestAndBranch(root.trueSuccessor(), root.falseSuccessor(), value,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   368
                                root.getTrueSuccessorProbability(), Long.numberOfTrailingZeros(constant));
54084
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   369
            }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   370
        }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   371
        return null;
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   372
    }
84f10bbf993f 8218074: Update Graal
jwilhelm
parents: 52910
diff changeset
   373
54601
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   374
    /**
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   375
     * if x < 0 <=> tbz x, sizeOfBits(x) - 1, label.
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   376
     */
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   377
    @MatchRule("(If (IntegerLessThan=lessNode x Constant=y))")
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   378
    public ComplexMatchResult checkNegativeAndBranch(IfNode root, IntegerLessThanNode lessNode, ValueNode x, ConstantNode y) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   379
        JavaKind xKind = x.getStackKind();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   380
        assert xKind.isNumericInteger();
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   381
        if (y.isJavaConstant() && (0 == y.asJavaConstant().asLong()) && lessNode.condition().equals(CanonicalCondition.LT)) {
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   382
            return emitBitTestAndBranch(root.falseSuccessor(), root.trueSuccessor(), x,
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   383
                            1.0 - root.getTrueSuccessorProbability(), xKind.getBitCount() - 1);
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   384
        }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   385
        return null;
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   386
    }
c40b2a190173 8221598: Update Graal
jwilhelm
parents: 54084
diff changeset
   387
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   388
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   389
    public AArch64LIRGenerator getLIRGeneratorTool() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   390
        return (AArch64LIRGenerator) gen;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   391
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   392
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   393
    protected AArch64ArithmeticLIRGenerator getArithmeticLIRGenerator() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   394
        return (AArch64ArithmeticLIRGenerator) getLIRGeneratorTool().getArithmetic();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   395
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   396
}