src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.aarch64.test/src/org/graalvm/compiler/core/aarch64/test/AArch64ElideL2ITest.java
author dlong
Thu, 14 Nov 2019 12:21:00 -0800
changeset 59095 03fbcd06b4c0
permissions -rw-r--r--
8233841: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59095
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
     1
/*
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
     3
 * Copyright (c) 2019, Arm Limited. All rights reserved.
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
     5
 *
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
     8
 * published by the Free Software Foundation.
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
     9
 *
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    14
 * accompanied this code).
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    15
 *
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    19
 *
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    22
 * questions.
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    23
 */
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    24
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    25
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    26
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    27
package org.graalvm.compiler.core.aarch64.test;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    28
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    29
import org.graalvm.compiler.lir.LIRInstruction;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    30
import org.graalvm.compiler.lir.aarch64.AArch64ArithmeticOp.BinaryConstOp;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    31
import org.junit.Test;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    32
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    33
import java.util.function.Predicate;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    34
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    35
public class AArch64ElideL2ITest extends AArch64MatchRuleTest {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    36
    private static final Predicate<LIRInstruction> predicate = op -> {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    37
        if (op instanceof BinaryConstOp && op.name().toUpperCase().equals("AND")) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    38
            return true;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    39
        }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    40
        return false;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    41
    };
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    42
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    43
    public int addWithSingleL2I(long m) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    44
        return (int) m + 100;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    45
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    46
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    47
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    48
    public void testAddWithSingleL2I() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    49
        test("addWithSingleL2I", 5L);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    50
        checkLIR("addWithSingleL2I", predicate, 0);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    51
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    52
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    53
    public int addWithTwoL2I(long m, long n) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    54
        return (int) m + (int) n;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    55
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    56
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    57
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    58
    public void testAddWithTwoL2I() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    59
        test("addWithTwoL2I", 5L, 0x1FFFFFFFFL);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    60
        checkLIR("addWithTwoL2I", predicate, 0);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    61
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    62
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    63
    public int addWithTwoNarrow(long m, long n) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    64
        return (int) m + (short) n;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    65
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    66
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    67
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    68
    public void testAddWithTwoNarrow() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    69
        test("addWithTwoNarrow", 0x80000000L, 6L);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    70
        checkLIR("addWithTwoNarrow", predicate, 1);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    71
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    72
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    73
    public int subSingleL2I(int m, long n) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    74
        return m - (int) n;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    75
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    76
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    77
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    78
    public void testSubSingleL2I() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    79
        test("subSingleL2I", 13, 40L);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    80
        checkLIR("subSingleL2I", predicate, 0);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    81
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    82
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    83
    public int shiftWithSingleL2I(long m) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    84
        return ((int) m) >> 5;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    85
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    86
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    87
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    88
    public void testShiftWithSingleL2I() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    89
        test("shiftWithSingleL2I", 234L);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    90
        checkLIR("shiftWithSingleL2I", predicate, 0);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    91
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    92
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    93
    public int shiftWithTwoL2I(long m, long n) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    94
        return (int) m << (int) n;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    95
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    96
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    97
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    98
    public void testShiftWithTwoL2I() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
    99
        test("shiftWithTwoL2I", 234L, 3L);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   100
        checkLIR("shiftWithTwoL2I", predicate, 0);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   101
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   102
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   103
    public long shiftLongWithL2I(long a, int m) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   104
        return a + ((m & 0xFFFFFFFFL) << (int) a);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   105
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   106
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   107
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   108
    public void testShiftLongWithL2I() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   109
        test("shiftLongWithL2I", 0xFFFFFFFFL, 123);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   110
        checkLIR("shiftLongWithL2I", predicate, 1);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   111
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   112
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   113
    public int logicWithTwoL2I(long m, long n) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   114
        return (int) m | (int) n;
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   115
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   116
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   117
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   118
    public void testLogicWithTwoL2I() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   119
        test("logicWithTwoL2I", 234L, 3L);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   120
        checkLIR("logicWithTwoL2I", predicate, 0);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   121
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   122
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   123
    public int negateL2I(long m) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   124
        return -((int) m);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   125
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   126
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   127
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   128
    public void testNegateL2I() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   129
        test("negateL2I", 0xFFFFFFFFL);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   130
        checkLIR("negateL2I", predicate, 0);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   131
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   132
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   133
    public int notL2I(long m) {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   134
        return ~((int) m);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   135
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   136
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   137
    @Test
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   138
    public void testNotL2I() {
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   139
        test("notL2I", 0xFFFFFFFFL);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   140
        checkLIR("notL2I", predicate, 0);
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   141
    }
03fbcd06b4c0 8233841: Update Graal
dlong
parents:
diff changeset
   142
}