1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2018 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 package other; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker /** 20*795d594fSAndroid Build Coastguard Worker * Tests for dot product idiom vectorization. 21*795d594fSAndroid Build Coastguard Worker */ 22*795d594fSAndroid Build Coastguard Worker public class TestVarious { 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdConstRight(byte[]) loop_optimization (before) 25*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 26*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 27*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const89:i\d+>> IntConstant 89 loop:none 28*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 29*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Const1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 30*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:b\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 31*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul:i\d+>> Mul [<<Get1>>,<<Const89>>] loop:<<Loop>> outer_loop:none 32*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Mul>>] loop:<<Loop>> outer_loop:none 33*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const1>>] loop:<<Loop>> outer_loop:none 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM64}: int other.TestVarious.testDotProdConstRight(byte[]) loop_optimization (after) 36*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 37*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 38*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const89:i\d+>> IntConstant 89 loop:none 39*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 40*795d594fSAndroid Build Coastguard Worker // 41*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<Const1>>,{{j\d+}}] loop:none 42*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const89>>,{{j\d+}}] loop:none 43*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 44*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 45*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 46*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 47*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Repl>>,<<LoopP>>] type:Int8 loop:<<Loop>> outer_loop:none 48*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 49*795d594fSAndroid Build Coastguard Worker // 50*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Reduce:d\d+>> VecReduce [<<Phi2>>,{{j\d+}}] loop:none 51*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecExtractScalar [<<Reduce>>,{{j\d+}}] loop:none 52*795d594fSAndroid Build Coastguard Worker // 53*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 54*795d594fSAndroid Build Coastguard Worker // 55*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const16:i\d+>> IntConstant 16 loop:none 56*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<Const1>>] loop:none 57*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const89>>] loop:none 58*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 59*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 60*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 61*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Repl>>] type:Int8 loop:<<Loop>> outer_loop:none 62*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const16>>] loop:<<Loop>> outer_loop:none 63*795d594fSAndroid Build Coastguard Worker // 64*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Reduce:d\d+>> VecReduce [<<Phi2>>] loop:none 65*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecExtractScalar [<<Reduce>>] loop:none 66*795d594fSAndroid Build Coastguard Worker // 67*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: testDotProdConstRight(byte[] b)68*795d594fSAndroid Build Coastguard Worker public static final int testDotProdConstRight(byte[] b) { 69*795d594fSAndroid Build Coastguard Worker int s = 1; 70*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 71*795d594fSAndroid Build Coastguard Worker int temp = b[i] * 89; 72*795d594fSAndroid Build Coastguard Worker s += temp; 73*795d594fSAndroid Build Coastguard Worker } 74*795d594fSAndroid Build Coastguard Worker return s; 75*795d594fSAndroid Build Coastguard Worker } 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdConstLeft(byte[]) loop_optimization (before) 78*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 79*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 80*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const89:i\d+>> IntConstant 89 loop:none 81*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 82*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Const1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 83*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:a\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 84*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul:i\d+>> Mul [<<Get1>>,<<Const89>>] loop:<<Loop>> outer_loop:none 85*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Mul>>] loop:<<Loop>> outer_loop:none 86*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const1>>] loop:<<Loop>> outer_loop:none 87*795d594fSAndroid Build Coastguard Worker 88*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM64}: int other.TestVarious.testDotProdConstLeft(byte[]) loop_optimization (after) 89*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 90*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 91*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const89:i\d+>> IntConstant 89 loop:none 92*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 93*795d594fSAndroid Build Coastguard Worker // 94*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<Const1>>,{{j\d+}}] loop:none 95*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const89>>,{{j\d+}}] loop:none 96*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 97*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 98*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 99*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 100*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Repl>>,<<LoopP>>] type:Uint8 loop:<<Loop>> outer_loop:none 101*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 102*795d594fSAndroid Build Coastguard Worker // 103*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Reduce:d\d+>> VecReduce [<<Phi2>>,{{j\d+}}] loop:none 104*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecExtractScalar [<<Reduce>>,{{j\d+}}] loop:none 105*795d594fSAndroid Build Coastguard Worker // 106*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 107*795d594fSAndroid Build Coastguard Worker // 108*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const16:i\d+>> IntConstant 16 loop:none 109*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<Const1>>] loop:none 110*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const89>>] loop:none 111*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 112*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 113*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 114*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Repl>>] type:Uint8 loop:<<Loop>> outer_loop:none 115*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const16>>] loop:<<Loop>> outer_loop:none 116*795d594fSAndroid Build Coastguard Worker // 117*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Reduce:d\d+>> VecReduce [<<Phi2>>] loop:none 118*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecExtractScalar [<<Reduce>>] loop:none 119*795d594fSAndroid Build Coastguard Worker // 120*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: testDotProdConstLeft(byte[] b)121*795d594fSAndroid Build Coastguard Worker public static final int testDotProdConstLeft(byte[] b) { 122*795d594fSAndroid Build Coastguard Worker int s = 1; 123*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 124*795d594fSAndroid Build Coastguard Worker int temp = 89 * (b[i] & 0xff); 125*795d594fSAndroid Build Coastguard Worker s += temp; 126*795d594fSAndroid Build Coastguard Worker } 127*795d594fSAndroid Build Coastguard Worker return s; 128*795d594fSAndroid Build Coastguard Worker } 129*795d594fSAndroid Build Coastguard Worker 130*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdLoopInvariantConvRight(byte[], int) loop_optimization (before) 131*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Param:i\d+>> ParameterValue loop:none 132*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 133*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 134*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ConstL:i\d+>> IntConstant 129 loop:none 135*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddP:i\d+>> Add [<<Param>>,<<ConstL>>] loop:none 136*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<TypeCnv:b\d+>> TypeConversion [<<AddP>>] loop:none 137*795d594fSAndroid Build Coastguard Worker // 138*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 139*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Const1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 140*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:b\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 141*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul:i\d+>> Mul [<<Get1>>,<<TypeCnv>>] loop:<<Loop>> outer_loop:none 142*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Mul>>] loop:<<Loop>> outer_loop:none 143*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const1>>] loop:<<Loop>> outer_loop:none 144*795d594fSAndroid Build Coastguard Worker 145*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM64}: int other.TestVarious.testDotProdLoopInvariantConvRight(byte[], int) loop_optimization (after) 146*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Param:i\d+>> ParameterValue loop:none 147*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 148*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 149*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<ConstL:i\d+>> IntConstant 129 loop:none 150*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<AddP:i\d+>> Add [<<Param>>,<<ConstL>>] loop:none 151*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<TypeCnv:b\d+>> TypeConversion [<<AddP>>] loop:none 152*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 153*795d594fSAndroid Build Coastguard Worker // 154*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<Const1>>,{{j\d+}}] loop:none 155*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<TypeCnv>>,{{j\d+}}] loop:none 156*795d594fSAndroid Build Coastguard Worker // 157*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 158*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 159*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 160*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 161*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Repl>>,<<LoopP>>] type:Int8 loop:<<Loop>> outer_loop:none 162*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 163*795d594fSAndroid Build Coastguard Worker // 164*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Reduce:d\d+>> VecReduce [<<Phi2>>,{{j\d+}}] loop:none 165*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecExtractScalar [<<Reduce>>,{{j\d+}}] loop:none 166*795d594fSAndroid Build Coastguard Worker // 167*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 168*795d594fSAndroid Build Coastguard Worker // 169*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const16:i\d+>> IntConstant 16 loop:none 170*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<Const1>>] loop:none 171*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<TypeCnv>>] loop:none 172*795d594fSAndroid Build Coastguard Worker // 173*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 174*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 175*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 176*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Repl>>] type:Int8 loop:<<Loop>> outer_loop:none 177*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const16>>] loop:<<Loop>> outer_loop:none 178*795d594fSAndroid Build Coastguard Worker // 179*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Reduce:d\d+>> VecReduce [<<Phi2>>] loop:none 180*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecExtractScalar [<<Reduce>>] loop:none 181*795d594fSAndroid Build Coastguard Worker // 182*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: testDotProdLoopInvariantConvRight(byte[] b, int param)183*795d594fSAndroid Build Coastguard Worker public static final int testDotProdLoopInvariantConvRight(byte[] b, int param) { 184*795d594fSAndroid Build Coastguard Worker int s = 1; 185*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 186*795d594fSAndroid Build Coastguard Worker int temp = b[i] * ((byte)(param + 129)); 187*795d594fSAndroid Build Coastguard Worker s += temp; 188*795d594fSAndroid Build Coastguard Worker } 189*795d594fSAndroid Build Coastguard Worker return s; 190*795d594fSAndroid Build Coastguard Worker } 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdByteToChar(char[], char[]) loop_optimization (after) 193*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecDotProd testDotProdByteToChar(char[] a, char[] b)194*795d594fSAndroid Build Coastguard Worker public static final int testDotProdByteToChar(char[] a, char[] b) { 195*795d594fSAndroid Build Coastguard Worker int s = 1; 196*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 197*795d594fSAndroid Build Coastguard Worker int temp = ((char)((byte)(a[i] + 129))) * b[i]; 198*795d594fSAndroid Build Coastguard Worker s += temp; 199*795d594fSAndroid Build Coastguard Worker } 200*795d594fSAndroid Build Coastguard Worker return s; 201*795d594fSAndroid Build Coastguard Worker } 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdMixedSize(byte[], short[]) loop_optimization (after) 204*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecDotProd testDotProdMixedSize(byte[] a, short[] b)205*795d594fSAndroid Build Coastguard Worker public static final int testDotProdMixedSize(byte[] a, short[] b) { 206*795d594fSAndroid Build Coastguard Worker int s = 1; 207*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 208*795d594fSAndroid Build Coastguard Worker int temp = a[i] * b[i]; 209*795d594fSAndroid Build Coastguard Worker s += temp; 210*795d594fSAndroid Build Coastguard Worker } 211*795d594fSAndroid Build Coastguard Worker return s; 212*795d594fSAndroid Build Coastguard Worker } 213*795d594fSAndroid Build Coastguard Worker 214*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdMixedSizeAndSign(byte[], char[]) loop_optimization (after) 215*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecDotProd testDotProdMixedSizeAndSign(byte[] a, char[] b)216*795d594fSAndroid Build Coastguard Worker public static final int testDotProdMixedSizeAndSign(byte[] a, char[] b) { 217*795d594fSAndroid Build Coastguard Worker int s = 1; 218*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 219*795d594fSAndroid Build Coastguard Worker int temp = a[i] * b[i]; 220*795d594fSAndroid Build Coastguard Worker s += temp; 221*795d594fSAndroid Build Coastguard Worker } 222*795d594fSAndroid Build Coastguard Worker return s; 223*795d594fSAndroid Build Coastguard Worker } 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdInt32(int[], int[]) loop_optimization (before) 226*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 227*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 228*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 229*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Const1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 230*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:i\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 231*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:i\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 232*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul:i\d+>> Mul [<<Get1>>,<<Get2>>] loop:<<Loop>> outer_loop:none 233*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Mul>>] loop:<<Loop>> outer_loop:none 234*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const1>>] loop:<<Loop>> outer_loop:none 235*795d594fSAndroid Build Coastguard Worker 236*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM64}: int other.TestVarious.testDotProdInt32(int[], int[]) loop_optimization (after) 237*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 238*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 239*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 240*795d594fSAndroid Build Coastguard Worker // 241*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<Const1>>,{{j\d+}}] loop:none 242*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 243*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 244*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 245*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 246*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 247*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul:d\d+>> VecMul [<<Load1>>,<<Load2>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 248*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi2>>,<<Mul>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 249*795d594fSAndroid Build Coastguard Worker // 250*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Reduce:d\d+>> VecReduce [<<Phi2>>,{{j\d+}}] loop:none 251*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecExtractScalar [<<Reduce>>,{{j\d+}}] loop:none 252*795d594fSAndroid Build Coastguard Worker // 253*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 254*795d594fSAndroid Build Coastguard Worker // 255*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set:d\d+>> VecSetScalars [<<Const1>>] loop:none 256*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 257*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 258*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 259*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 260*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul:d\d+>> VecMul [<<Load1>>,<<Load2>>] loop:<<Loop>> outer_loop:none 261*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAdd [<<Phi2>>,<<Mul>>] loop:<<Loop>> outer_loop:none 262*795d594fSAndroid Build Coastguard Worker // 263*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Reduce:d\d+>> VecReduce [<<Phi2>>] loop:none 264*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecExtractScalar [<<Reduce>>] loop:none 265*795d594fSAndroid Build Coastguard Worker // 266*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: testDotProdInt32(int[] a, int[] b)267*795d594fSAndroid Build Coastguard Worker public static final int testDotProdInt32(int[] a, int[] b) { 268*795d594fSAndroid Build Coastguard Worker int s = 1; 269*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 270*795d594fSAndroid Build Coastguard Worker int temp = a[i] * b[i]; 271*795d594fSAndroid Build Coastguard Worker s += temp; 272*795d594fSAndroid Build Coastguard Worker } 273*795d594fSAndroid Build Coastguard Worker return s; 274*795d594fSAndroid Build Coastguard Worker } 275*795d594fSAndroid Build Coastguard Worker 276*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdBothSignedUnsigned1(byte[], byte[]) loop_optimization (before) 277*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 278*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 279*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 loop:none 280*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 281*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Const1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 282*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:i\d+>> Phi [<<Const2>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 283*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:b\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 284*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:b\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 285*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul1:i\d+>> Mul [<<Get1>>,<<Get2>>] loop:<<Loop>> outer_loop:none 286*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Mul1>>] loop:<<Loop>> outer_loop:none 287*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<TypeC1:a\d+>> TypeConversion [<<Get1>>] loop:<<Loop>> outer_loop:none 288*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<TypeC2:a\d+>> TypeConversion [<<Get2>>] loop:<<Loop>> outer_loop:none 289*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul2:i\d+>> Mul [<<TypeC1>>,<<TypeC2>>] loop:<<Loop>> outer_loop:none 290*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi3>>,<<Mul2>>] loop:<<Loop>> outer_loop:none 291*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const1>>] loop:<<Loop>> outer_loop:none 292*795d594fSAndroid Build Coastguard Worker 293*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM64}: int other.TestVarious.testDotProdBothSignedUnsigned1(byte[], byte[]) loop_optimization (after) 294*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 295*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 296*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 loop:none 297*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 298*795d594fSAndroid Build Coastguard Worker // 299*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [<<Const1>>,{{j\d+}}] loop:none 300*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [<<Const2>>,{{j\d+}}] loop:none 301*795d594fSAndroid Build Coastguard Worker // 302*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 303*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 304*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 305*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 306*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 307*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 308*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Load2>>,<<LoopP>>] type:Int8 loop:<<Loop>> outer_loop:none 309*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi3>>,<<Load1>>,<<Load2>>,<<LoopP>>] type:Uint8 loop:<<Loop>> outer_loop:none 310*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 311*795d594fSAndroid Build Coastguard Worker // 312*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 313*795d594fSAndroid Build Coastguard Worker // 314*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const16:i\d+>> IntConstant 16 loop:none 315*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [<<Const1>>] loop:none 316*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [<<Const2>>] loop:none 317*795d594fSAndroid Build Coastguard Worker // 318*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 319*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 320*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 321*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 322*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 323*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Load2>>] type:Int8 loop:<<Loop>> outer_loop:none 324*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi3>>,<<Load1>>,<<Load2>>] type:Uint8 loop:<<Loop>> outer_loop:none 325*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const16>>] loop:<<Loop>> outer_loop:none 326*795d594fSAndroid Build Coastguard Worker // 327*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: testDotProdBothSignedUnsigned1(byte[] a, byte[] b)328*795d594fSAndroid Build Coastguard Worker public static final int testDotProdBothSignedUnsigned1(byte[] a, byte[] b) { 329*795d594fSAndroid Build Coastguard Worker int s1 = 1; 330*795d594fSAndroid Build Coastguard Worker int s2 = 2; 331*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 332*795d594fSAndroid Build Coastguard Worker byte a_val = a[i]; 333*795d594fSAndroid Build Coastguard Worker byte b_val = b[i]; 334*795d594fSAndroid Build Coastguard Worker s1 += a_val * b_val; 335*795d594fSAndroid Build Coastguard Worker s2 += (a_val & 0xff) * (b_val & 0xff); 336*795d594fSAndroid Build Coastguard Worker } 337*795d594fSAndroid Build Coastguard Worker return s1 + s2; 338*795d594fSAndroid Build Coastguard Worker } 339*795d594fSAndroid Build Coastguard Worker 340*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdBothSignedUnsigned2(byte[], byte[]) loop_optimization (before) 341*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 342*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 343*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 loop:none 344*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const42:i\d+>> IntConstant 42 loop:none 345*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 346*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Const1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 347*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:i\d+>> Phi [<<Const2>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 348*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:b\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 349*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:a\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 350*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<TypeC1:a\d+>> TypeConversion [<<Get1>>] loop:<<Loop>> outer_loop:none 351*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul1:i\d+>> Mul [<<Get2>>,<<TypeC1>>] loop:<<Loop>> outer_loop:none 352*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi3>>,<<Mul1>>] loop:<<Loop>> outer_loop:none 353*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul2:i\d+>> Mul [<<Get1>>,<<Const42>>] loop:<<Loop>> outer_loop:none 354*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Mul2>>] loop:<<Loop>> outer_loop:none 355*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const1>>] loop:<<Loop>> outer_loop:none 356*795d594fSAndroid Build Coastguard Worker 357*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM64}: int other.TestVarious.testDotProdBothSignedUnsigned2(byte[], byte[]) loop_optimization (after) 358*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 359*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 360*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 loop:none 361*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const42:i\d+>> IntConstant 42 loop:none 362*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 363*795d594fSAndroid Build Coastguard Worker // 364*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const42>>,{{j\d+}}] loop:none 365*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [<<Const1>>,{{j\d+}}] loop:none 366*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [<<Const2>>,{{j\d+}}] loop:none 367*795d594fSAndroid Build Coastguard Worker // 368*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 369*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 370*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 371*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 372*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 373*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 374*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi3>>,<<Load2>>,<<Load1>>,<<LoopP>>] type:Uint8 loop:<<Loop>> outer_loop:none 375*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Repl>>,<<LoopP>>] type:Int8 loop:<<Loop>> outer_loop:none 376*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 377*795d594fSAndroid Build Coastguard Worker // 378*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 379*795d594fSAndroid Build Coastguard Worker // 380*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const16:i\d+>> IntConstant 16 loop:none 381*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const42>>] loop:none 382*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [<<Const1>>] loop:none 383*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [<<Const2>>] loop:none 384*795d594fSAndroid Build Coastguard Worker // 385*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 386*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 387*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 388*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 389*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 390*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi3>>,<<Load2>>,<<Load1>>] type:Uint8 loop:<<Loop>> outer_loop:none 391*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Repl>>] type:Int8 loop:<<Loop>> outer_loop:none 392*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const16>>] loop:<<Loop>> outer_loop:none 393*795d594fSAndroid Build Coastguard Worker // 394*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: testDotProdBothSignedUnsigned2(byte[] a, byte[] b)395*795d594fSAndroid Build Coastguard Worker public static final int testDotProdBothSignedUnsigned2(byte[] a, byte[] b) { 396*795d594fSAndroid Build Coastguard Worker int s1 = 1; 397*795d594fSAndroid Build Coastguard Worker int s2 = 2; 398*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 399*795d594fSAndroid Build Coastguard Worker byte a_val = a[i]; 400*795d594fSAndroid Build Coastguard Worker byte b_val = b[i]; 401*795d594fSAndroid Build Coastguard Worker s2 += (a_val & 0xff) * (b_val & 0xff); 402*795d594fSAndroid Build Coastguard Worker s1 += a_val * 42; 403*795d594fSAndroid Build Coastguard Worker } 404*795d594fSAndroid Build Coastguard Worker return s1 + s2; 405*795d594fSAndroid Build Coastguard Worker } 406*795d594fSAndroid Build Coastguard Worker 407*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdBothSignedUnsignedDoubleLoad(byte[], byte[]) loop_optimization (before) 408*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 409*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 410*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 loop:none 411*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 412*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Const1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 413*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:i\d+>> Phi [<<Const2>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 414*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<GetB1:b\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 415*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<GetB2:b\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 416*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul1:i\d+>> Mul [<<GetB1>>,<<GetB2>>] loop:<<Loop>> outer_loop:none 417*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Mul1>>] loop:<<Loop>> outer_loop:none 418*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<GetA1:a\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 419*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<GetA2:a\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 420*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul2:i\d+>> Mul [<<GetA1>>,<<GetA2>>] loop:<<Loop>> outer_loop:none 421*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi3>>,<<Mul2>>] loop:<<Loop>> outer_loop:none 422*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const1>>] loop:<<Loop>> outer_loop:none 423*795d594fSAndroid Build Coastguard Worker 424*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM64}: int other.TestVarious.testDotProdBothSignedUnsignedDoubleLoad(byte[], byte[]) loop_optimization (after) 425*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 426*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 427*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 loop:none 428*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 429*795d594fSAndroid Build Coastguard Worker // 430*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [<<Const1>>,{{j\d+}}] loop:none 431*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [<<Const2>>,{{j\d+}}] loop:none 432*795d594fSAndroid Build Coastguard Worker // 433*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 434*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 435*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 436*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 437*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 438*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 439*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Load2>>,<<LoopP>>] type:Int8 loop:<<Loop>> outer_loop:none 440*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load3:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 441*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load4:d\d+>> VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>] loop:<<Loop>> outer_loop:none 442*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi3>>,<<Load3>>,<<Load4>>,<<LoopP>>] type:Uint8 loop:<<Loop>> outer_loop:none 443*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 444*795d594fSAndroid Build Coastguard Worker // 445*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 446*795d594fSAndroid Build Coastguard Worker // 447*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const16:i\d+>> IntConstant 16 loop:none 448*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [<<Const1>>] loop:none 449*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [<<Const2>>] loop:none 450*795d594fSAndroid Build Coastguard Worker // 451*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 452*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 453*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 454*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 455*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 456*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Load2>>] type:Int8 loop:<<Loop>> outer_loop:none 457*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load3:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 458*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load4:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 459*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi3>>,<<Load3>>,<<Load4>>] type:Uint8 loop:<<Loop>> outer_loop:none 460*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const16>>] loop:<<Loop>> outer_loop:none 461*795d594fSAndroid Build Coastguard Worker // 462*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: testDotProdBothSignedUnsignedDoubleLoad(byte[] a, byte[] b)463*795d594fSAndroid Build Coastguard Worker public static final int testDotProdBothSignedUnsignedDoubleLoad(byte[] a, byte[] b) { 464*795d594fSAndroid Build Coastguard Worker int s1 = 1; 465*795d594fSAndroid Build Coastguard Worker int s2 = 2; 466*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 467*795d594fSAndroid Build Coastguard Worker s1 += a[i] * b[i]; 468*795d594fSAndroid Build Coastguard Worker s2 += (a[i] & 0xff) * (b[i] & 0xff); 469*795d594fSAndroid Build Coastguard Worker } 470*795d594fSAndroid Build Coastguard Worker return s1 + s2; 471*795d594fSAndroid Build Coastguard Worker } 472*795d594fSAndroid Build Coastguard Worker 473*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int other.TestVarious.testDotProdBothSignedUnsignedChar(char[], char[]) loop_optimization (before) 474*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 475*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 476*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 loop:none 477*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 478*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:i\d+>> Phi [<<Const1>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 479*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:i\d+>> Phi [<<Const2>>,{{i\d+}}] loop:<<Loop>> outer_loop:none 480*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get1:c\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 481*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Get2:c\d+>> ArrayGet [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 482*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<TypeS1:s\d+>> TypeConversion [<<Get1>>] loop:<<Loop>> outer_loop:none 483*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<TypeS2:s\d+>> TypeConversion [<<Get2>>] loop:<<Loop>> outer_loop:none 484*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul1:i\d+>> Mul [<<TypeS1>>,<<TypeS2>>] loop:<<Loop>> outer_loop:none 485*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi3>>,<<Mul1>>] loop:<<Loop>> outer_loop:none 486*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Mul2:i\d+>> Mul [<<Get1>>,<<Get2>>] loop:<<Loop>> outer_loop:none 487*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi2>>,<<Mul2>>] loop:<<Loop>> outer_loop:none 488*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const1>>] loop:<<Loop>> outer_loop:none 489*795d594fSAndroid Build Coastguard Worker 490*795d594fSAndroid Build Coastguard Worker /// CHECK-START-{ARM64}: int other.TestVarious.testDotProdBothSignedUnsignedChar(char[], char[]) loop_optimization (after) 491*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0 loop:none 492*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const1:i\d+>> IntConstant 1 loop:none 493*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2 loop:none 494*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 495*795d594fSAndroid Build Coastguard Worker // 496*795d594fSAndroid Build Coastguard Worker // 16-bit DotProd is not supported for SVE. 497*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecDotProd 498*795d594fSAndroid Build Coastguard Worker // 499*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 500*795d594fSAndroid Build Coastguard Worker // 501*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Const8:i\d+>> IntConstant 8 loop:none 502*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set1:d\d+>> VecSetScalars [<<Const1>>] loop:none 503*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Set2:d\d+>> VecSetScalars [<<Const2>>] loop:none 504*795d594fSAndroid Build Coastguard Worker // 505*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi1:i\d+>> Phi [<<Const0>>,{{i\d+}}] loop:<<Loop:B\d+>> outer_loop:none 506*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi2:d\d+>> Phi [<<Set1>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 507*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi3:d\d+>> Phi [<<Set2>>,{{d\d+}}] loop:<<Loop>> outer_loop:none 508*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load1:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 509*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Load2:d\d+>> VecLoad [{{l\d+}},<<Phi1>>] loop:<<Loop>> outer_loop:none 510*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi3>>,<<Load1>>,<<Load2>>] type:Int16 loop:<<Loop>> outer_loop:none 511*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecDotProd [<<Phi2>>,<<Load1>>,<<Load2>>] type:Uint16 loop:<<Loop>> outer_loop:none 512*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Add [<<Phi1>>,<<Const8>>] loop:<<Loop>> outer_loop:none 513*795d594fSAndroid Build Coastguard Worker // 514*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: testDotProdBothSignedUnsignedChar(char[] a, char[] b)515*795d594fSAndroid Build Coastguard Worker public static final int testDotProdBothSignedUnsignedChar(char[] a, char[] b) { 516*795d594fSAndroid Build Coastguard Worker int s1 = 1; 517*795d594fSAndroid Build Coastguard Worker int s2 = 2; 518*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < b.length; i++) { 519*795d594fSAndroid Build Coastguard Worker char a_val = a[i]; 520*795d594fSAndroid Build Coastguard Worker char b_val = b[i]; 521*795d594fSAndroid Build Coastguard Worker s2 += ((short)a_val) * ((short)b_val); 522*795d594fSAndroid Build Coastguard Worker s1 += a_val * b_val; 523*795d594fSAndroid Build Coastguard Worker } 524*795d594fSAndroid Build Coastguard Worker return s1 + s2; 525*795d594fSAndroid Build Coastguard Worker } 526*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)527*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 528*795d594fSAndroid Build Coastguard Worker if (expected != result) { 529*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 530*795d594fSAndroid Build Coastguard Worker } 531*795d594fSAndroid Build Coastguard Worker } 532*795d594fSAndroid Build Coastguard Worker run()533*795d594fSAndroid Build Coastguard Worker public static void run() { 534*795d594fSAndroid Build Coastguard Worker final short MAX_S = Short.MAX_VALUE; 535*795d594fSAndroid Build Coastguard Worker final short MIN_S = Short.MAX_VALUE; 536*795d594fSAndroid Build Coastguard Worker 537*795d594fSAndroid Build Coastguard Worker byte[] b1 = { -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, -128 }; 538*795d594fSAndroid Build Coastguard Worker byte[] b2 = { 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127 }; 539*795d594fSAndroid Build Coastguard Worker 540*795d594fSAndroid Build Coastguard Worker char[] c1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MIN_S, MIN_S }; 541*795d594fSAndroid Build Coastguard Worker char[] c2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MIN_S, MIN_S }; 542*795d594fSAndroid Build Coastguard Worker 543*795d594fSAndroid Build Coastguard Worker int[] i1 = { -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, -128 }; 544*795d594fSAndroid Build Coastguard Worker int[] i2 = { 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127 }; 545*795d594fSAndroid Build Coastguard Worker 546*795d594fSAndroid Build Coastguard Worker short[] s1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MIN_S, MIN_S }; 547*795d594fSAndroid Build Coastguard Worker 548*795d594fSAndroid Build Coastguard Worker expectEquals(56516, testDotProdConstRight(b2)); 549*795d594fSAndroid Build Coastguard Worker expectEquals(56516, testDotProdConstLeft(b2)); 550*795d594fSAndroid Build Coastguard Worker expectEquals(1271, testDotProdLoopInvariantConvRight(b2, 129)); 551*795d594fSAndroid Build Coastguard Worker expectEquals(-8519423, testDotProdByteToChar(c1, c2)); 552*795d594fSAndroid Build Coastguard Worker expectEquals(-8388351, testDotProdMixedSize(b1, s1)); 553*795d594fSAndroid Build Coastguard Worker expectEquals(-8388351, testDotProdMixedSizeAndSign(b1, c2)); 554*795d594fSAndroid Build Coastguard Worker expectEquals(-81279, testDotProdInt32(i1, i2)); 555*795d594fSAndroid Build Coastguard Worker expectEquals(3, testDotProdBothSignedUnsigned1(b1, b2)); 556*795d594fSAndroid Build Coastguard Worker expectEquals(54403, testDotProdBothSignedUnsigned2(b1, b2)); 557*795d594fSAndroid Build Coastguard Worker expectEquals(3, testDotProdBothSignedUnsignedDoubleLoad(b1, b2)); 558*795d594fSAndroid Build Coastguard Worker expectEquals(-262137, testDotProdBothSignedUnsignedChar(c1, c2)); 559*795d594fSAndroid Build Coastguard Worker } 560*795d594fSAndroid Build Coastguard Worker main(String[] args)561*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 562*795d594fSAndroid Build Coastguard Worker run(); 563*795d594fSAndroid Build Coastguard Worker } 564*795d594fSAndroid Build Coastguard Worker } 565