1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker /** 18*795d594fSAndroid Build Coastguard Worker * Checker test for arm and arm64 simd optimizations. 19*795d594fSAndroid Build Coastguard Worker */ 20*795d594fSAndroid Build Coastguard Worker public class Main { 21*795d594fSAndroid Build Coastguard Worker static int[] arr; 22*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)23*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 24*795d594fSAndroid Build Coastguard Worker if (expected != result) { 25*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 26*795d594fSAndroid Build Coastguard Worker } 27*795d594fSAndroid Build Coastguard Worker } 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.encodableConstants(byte[], short[], char[], int[], long[], float[], double[]) disassembly (after) 30*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<C1:i\d+>> IntConstant 1 31*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<C2:i\d+>> IntConstant -128 32*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<C3:i\d+>> IntConstant 127 33*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<C4:i\d+>> IntConstant -219 34*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<C5:i\d+>> IntConstant 219 35*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<L6:j\d+>> LongConstant 219 36*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<F7:f\d+>> FloatConstant 2 37*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<F8:f\d+>> FloatConstant 14.34 38*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<D9:d\d+>> DoubleConstant 20 39*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<D10:d\d+>> DoubleConstant 0 40*795d594fSAndroid Build Coastguard Worker // 41*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 42*795d594fSAndroid Build Coastguard Worker // 43*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C1>>,{{j\d+}}] 44*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C2>>,{{j\d+}}] 45*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C3>>,{{j\d+}}] 46*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C4>>,{{j\d+}}] 47*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C5>>,{{j\d+}}] 48*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<L6>>,{{j\d+}}] 49*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<F7>>,{{j\d+}}] 50*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<F8>>,{{j\d+}}] 51*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<D9>>,{{j\d+}}] 52*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<D10>>,{{j\d+}}] 53*795d594fSAndroid Build Coastguard Worker // 54*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 55*795d594fSAndroid Build Coastguard Worker // 56*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C1>>] 57*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C2>>] 58*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C3>>] 59*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C4>>] 60*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<C5>>] 61*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<L6>>] 62*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<F7>>] 63*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<F8>>] 64*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<D9>>] 65*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecReplicateScalar [<<D10>>] 66*795d594fSAndroid Build Coastguard Worker // 67*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: encodableConstants(byte[] b, short[] s, char[] c, int[] a, long[] l, float[] f, double[] d)68*795d594fSAndroid Build Coastguard Worker private static void encodableConstants(byte[] b, short[] s, char[] c, int[] a, long[] l, float[] f, double[] d) { 69*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 70*795d594fSAndroid Build Coastguard Worker b[i] += 1; 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 73*795d594fSAndroid Build Coastguard Worker s[i] += -128; 74*795d594fSAndroid Build Coastguard Worker } 75*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 76*795d594fSAndroid Build Coastguard Worker c[i] += 127; 77*795d594fSAndroid Build Coastguard Worker } 78*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 79*795d594fSAndroid Build Coastguard Worker a[i] += -219; 80*795d594fSAndroid Build Coastguard Worker } 81*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 82*795d594fSAndroid Build Coastguard Worker a[i] += 219; 83*795d594fSAndroid Build Coastguard Worker } 84*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 85*795d594fSAndroid Build Coastguard Worker l[i] += 219; 86*795d594fSAndroid Build Coastguard Worker } 87*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 88*795d594fSAndroid Build Coastguard Worker f[i] += 2.0f; 89*795d594fSAndroid Build Coastguard Worker } 90*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 91*795d594fSAndroid Build Coastguard Worker f[i] += 14.34f; 92*795d594fSAndroid Build Coastguard Worker } 93*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 94*795d594fSAndroid Build Coastguard Worker d[i] += 20.0; 95*795d594fSAndroid Build Coastguard Worker } 96*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 97*795d594fSAndroid Build Coastguard Worker d[i] += 0.0; 98*795d594fSAndroid Build Coastguard Worker } 99*795d594fSAndroid Build Coastguard Worker } 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.SVEIntermediateAddress(int) loop_optimization (after) 102*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop:B\d+>> outer_loop:none 103*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd loop:<<Loop>> outer_loop:none 104*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop>> outer_loop:none 105*795d594fSAndroid Build Coastguard Worker // 106*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.SVEIntermediateAddress(int) instruction_simplifier_arm64 (after) 107*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 108*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [{{l\d+}},{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 109*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad [<<IntAddr1>>,{{i\d+}},{{j\d+}}] loop:<<Loop>> outer_loop:none 110*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd loop:<<Loop>> outer_loop:none 111*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr2:i\d+>> IntermediateAddress [{{l\d+}},{{i\d+}}] loop:<<Loop>> outer_loop:none 112*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<IntAddr2>>,{{i\d+}},{{d\d+}},{{j\d+}}] loop:<<Loop>> outer_loop:none 113*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 114*795d594fSAndroid Build Coastguard Worker // 115*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.SVEIntermediateAddress(int) GVN$after_arch (after) 116*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 117*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<IntAddr:i\d+>> IntermediateAddress [{{l\d+}},{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 118*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad [<<IntAddr>>,{{i\d+}},{{j\d+}}] loop:<<Loop>> outer_loop:none 119*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd loop:<<Loop>> outer_loop:none 120*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore [<<IntAddr>>,{{i\d+}},{{d\d+}},{{j\d+}}] loop:<<Loop>> outer_loop:none 121*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: SVEIntermediateAddress(int x)122*795d594fSAndroid Build Coastguard Worker static void SVEIntermediateAddress(int x) { 123*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 124*795d594fSAndroid Build Coastguard Worker arr[i] += x; 125*795d594fSAndroid Build Coastguard Worker } 126*795d594fSAndroid Build Coastguard Worker } 127*795d594fSAndroid Build Coastguard Worker sumArray(byte[] b, short[] s, char[] c, int[] a, long[] l, float[] f, double[] d)128*795d594fSAndroid Build Coastguard Worker private static int sumArray(byte[] b, short[] s, char[] c, int[] a, long[] l, float[] f, double[] d) { 129*795d594fSAndroid Build Coastguard Worker int sum = 0; 130*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 131*795d594fSAndroid Build Coastguard Worker sum += b[i] + s[i] + c[i] + a[i] + l[i] + f[i] + d[i]; 132*795d594fSAndroid Build Coastguard Worker } 133*795d594fSAndroid Build Coastguard Worker return sum; 134*795d594fSAndroid Build Coastguard Worker } 135*795d594fSAndroid Build Coastguard Worker 136*795d594fSAndroid Build Coastguard Worker public static final int ARRAY_SIZE = 128; 137*795d594fSAndroid Build Coastguard Worker checkEncodableConstants()138*795d594fSAndroid Build Coastguard Worker public static void checkEncodableConstants() { 139*795d594fSAndroid Build Coastguard Worker byte[] b = new byte[ARRAY_SIZE]; 140*795d594fSAndroid Build Coastguard Worker short[] s = new short[ARRAY_SIZE]; 141*795d594fSAndroid Build Coastguard Worker char[] c = new char[ARRAY_SIZE]; 142*795d594fSAndroid Build Coastguard Worker int[] a = new int[ARRAY_SIZE]; 143*795d594fSAndroid Build Coastguard Worker long[] l = new long[ARRAY_SIZE]; 144*795d594fSAndroid Build Coastguard Worker float[] f = new float[ARRAY_SIZE]; 145*795d594fSAndroid Build Coastguard Worker double[] d = new double[ARRAY_SIZE]; 146*795d594fSAndroid Build Coastguard Worker 147*795d594fSAndroid Build Coastguard Worker encodableConstants(b, s, c, a, l, f, d); 148*795d594fSAndroid Build Coastguard Worker expectEquals(32640, sumArray(b, s, c, a, l, f, d)); 149*795d594fSAndroid Build Coastguard Worker 150*795d594fSAndroid Build Coastguard Worker System.out.println("encodableConstants passed"); 151*795d594fSAndroid Build Coastguard Worker } 152*795d594fSAndroid Build Coastguard Worker checkSVEIntermediateAddress()153*795d594fSAndroid Build Coastguard Worker public static void checkSVEIntermediateAddress() { 154*795d594fSAndroid Build Coastguard Worker arr = new int[ARRAY_SIZE]; 155*795d594fSAndroid Build Coastguard Worker 156*795d594fSAndroid Build Coastguard Worker // Setup. 157*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 158*795d594fSAndroid Build Coastguard Worker arr[i] = i; 159*795d594fSAndroid Build Coastguard Worker } 160*795d594fSAndroid Build Coastguard Worker 161*795d594fSAndroid Build Coastguard Worker // Arithmetic operations. 162*795d594fSAndroid Build Coastguard Worker SVEIntermediateAddress(2); 163*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < ARRAY_SIZE; i++) { 164*795d594fSAndroid Build Coastguard Worker expectEquals(i + 2, arr[i]); 165*795d594fSAndroid Build Coastguard Worker } 166*795d594fSAndroid Build Coastguard Worker 167*795d594fSAndroid Build Coastguard Worker System.out.println("SVEIntermediateAddress passed"); 168*795d594fSAndroid Build Coastguard Worker } 169*795d594fSAndroid Build Coastguard Worker main(String[] args)170*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 171*795d594fSAndroid Build Coastguard Worker checkEncodableConstants(); 172*795d594fSAndroid Build Coastguard Worker checkSVEIntermediateAddress(); 173*795d594fSAndroid Build Coastguard Worker } 174*795d594fSAndroid Build Coastguard Worker } 175