xref: /aosp_15_r20/art/test/684-checker-simd-dotprod/src/other/TestByte.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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: byte case.
21*795d594fSAndroid Build Coastguard Worker  */
22*795d594fSAndroid Build Coastguard Worker public class TestByte {
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker   public static final int ARRAY_SIZE = 1024;
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimple(byte[], byte[]) loop_optimization (before)
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
28*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
29*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
30*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>    Phi [<<Const1>>,{{i\d+}}]                             loop:<<Loop>>      outer_loop:none
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:b\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
32*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:b\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
33*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Mul:i\d+>>     Mul [<<Get1>>,<<Get2>>]                               loop:<<Loop>>      outer_loop:none
34*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi2>>,<<Mul>>]                                loop:<<Loop>>      outer_loop:none
35*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdSimple(byte[], byte[]) loop_optimization (after)
38*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
39*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
40*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
41*795d594fSAndroid Build Coastguard Worker   //
42*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>,{{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: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
48*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<Load1>>,<<Load2>>,<<LoopP>>] type:Int8   loop:<<Loop>>      outer_loop:none
49*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,{{i\d+}}]                                         loop:<<Loop>>      outer_loop:none
50*795d594fSAndroid Build Coastguard Worker   //
51*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>,{{j\d+}}]                                   loop:none
52*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>,{{j\d+}}]                          loop:none
53*795d594fSAndroid Build Coastguard Worker   //
54*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
55*795d594fSAndroid Build Coastguard Worker   //
56*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Const16:i\d+>> IntConstant 16                                        loop:none
57*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>]                            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: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
62*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<Load1>>,<<Load2>>] type:Int8   loop:<<Loop>>      outer_loop:none
63*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,<<Const16>>]                            loop:<<Loop>>      outer_loop:none
64*795d594fSAndroid Build Coastguard Worker   //
65*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>]                                  loop:none
66*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>]                         loop:none
67*795d594fSAndroid Build Coastguard Worker   //
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker 
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdSimple(byte[], byte[]) disassembly (after)
72*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecDotProd
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
74*795d594fSAndroid Build Coastguard Worker   ///               CHECK:        sdot z{{\d+}}.s, z{{\d+}}.b, z{{\d+}}.b
75*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELIF:   hasIsaFeature("dotprod")
76*795d594fSAndroid Build Coastguard Worker   ///               CHECK-NEXT:   sdot v{{\d+}}.4s, v{{\d+}}.16b, v{{\d+}}.16b
77*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
78*795d594fSAndroid Build Coastguard Worker   ///               CHECK-NOT:    sdot
79*795d594fSAndroid Build Coastguard Worker   ///               CHECK-NOT:    udot
80*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
testDotProdSimple(byte[] a, byte[] b)81*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimple(byte[] a, byte[] b) {
82*795d594fSAndroid Build Coastguard Worker     int s = 1;
83*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
84*795d594fSAndroid Build Coastguard Worker       int temp = a[i] * b[i];
85*795d594fSAndroid Build Coastguard Worker       s += temp;
86*795d594fSAndroid Build Coastguard Worker     }
87*795d594fSAndroid Build Coastguard Worker     return s - 1;
88*795d594fSAndroid Build Coastguard Worker   }
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdComplex(byte[], byte[]) loop_optimization (before)
91*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
92*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
93*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>    Phi [<<Const1>>,{{i\d+}}]                             loop:<<Loop>>      outer_loop:none
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:b\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
96*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddC1:i\d+>>   Add [<<Get1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
97*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<TypeC1:b\d+>>  TypeConversion [<<AddC1>>]                            loop:<<Loop>>      outer_loop:none
98*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:b\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
99*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddC2:i\d+>>   Add [<<Get2>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
100*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<TypeC2:b\d+>>  TypeConversion [<<AddC2>>]                            loop:<<Loop>>      outer_loop:none
101*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Mul:i\d+>>     Mul [<<TypeC1>>,<<TypeC2>>]                           loop:<<Loop>>      outer_loop:none
102*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi2>>,<<Mul>>]                                loop:<<Loop>>      outer_loop:none
103*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
104*795d594fSAndroid Build Coastguard Worker 
105*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdComplex(byte[], byte[]) loop_optimization (after)
106*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
107*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
109*795d594fSAndroid Build Coastguard Worker   //
110*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Repl:d\d+>>    VecReplicateScalar [<<Const1>>,{{j\d+}}]                        loop:none
111*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>,{{j\d+}}]                             loop:none
112*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                                       loop:<<Loop:B\d+>> outer_loop:none
113*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                          loop:<<Loop>>      outer_loop:none
114*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>   VecPredWhile [<<Phi1>>,{{i\d+}}]                                loop:<<Loop>>      outer_loop:none
115*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
116*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd1:d\d+>>   VecAdd [<<Load1>>,<<Repl>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
117*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
118*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd2:d\d+>>   VecAdd [<<Load2>>,<<Repl>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
119*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<VAdd1>>,<<VAdd2>>,<<LoopP>>] type:Int8   loop:<<Loop>>      outer_loop:none
120*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,{{i\d+}}]                                         loop:<<Loop>>      outer_loop:none
121*795d594fSAndroid Build Coastguard Worker   //
122*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>,{{j\d+}}]                                   loop:none
123*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>,{{j\d+}}]                          loop:none
124*795d594fSAndroid Build Coastguard Worker   //
125*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
126*795d594fSAndroid Build Coastguard Worker   //
127*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Const16:i\d+>> IntConstant 16                                        loop:none
128*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Repl:d\d+>>    VecReplicateScalar [<<Const1>>]                       loop:none
129*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>]                            loop:none
130*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
131*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                loop:<<Loop>>      outer_loop:none
132*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
133*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd1:d\d+>>   VecAdd [<<Load1>>,<<Repl>>]                           loop:<<Loop>>      outer_loop:none
134*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
135*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd2:d\d+>>   VecAdd [<<Load2>>,<<Repl>>]                           loop:<<Loop>>      outer_loop:none
136*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<VAdd1>>,<<VAdd2>>] type:Int8   loop:<<Loop>>      outer_loop:none
137*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,<<Const16>>]                            loop:<<Loop>>      outer_loop:none
138*795d594fSAndroid Build Coastguard Worker   //
139*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>]                                  loop:none
140*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>]                         loop:none
141*795d594fSAndroid Build Coastguard Worker   //
142*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
testDotProdComplex(byte[] a, byte[] b)143*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdComplex(byte[] a, byte[] b) {
144*795d594fSAndroid Build Coastguard Worker     int s = 1;
145*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
146*795d594fSAndroid Build Coastguard Worker       int temp = ((byte)(a[i] + 1)) * ((byte)(b[i] + 1));
147*795d594fSAndroid Build Coastguard Worker       s += temp;
148*795d594fSAndroid Build Coastguard Worker     }
149*795d594fSAndroid Build Coastguard Worker     return s - 1;
150*795d594fSAndroid Build Coastguard Worker   }
151*795d594fSAndroid Build Coastguard Worker 
152*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleUnsigned(byte[], byte[]) loop_optimization (before)
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
154*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
155*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>    Phi [<<Const1>>,{{i\d+}}]                             loop:<<Loop>>      outer_loop:none
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:a\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
158*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:a\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
159*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Mul:i\d+>>     Mul [<<Get1>>,<<Get2>>]                               loop:<<Loop>>      outer_loop:none
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi2>>,<<Mul>>]                                loop:<<Loop>>      outer_loop:none
161*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
162*795d594fSAndroid Build Coastguard Worker 
163*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdSimpleUnsigned(byte[], byte[]) loop_optimization (after)
164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
165*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
166*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
167*795d594fSAndroid Build Coastguard Worker   //
168*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>,{{j\d+}}]                             loop:none
169*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                                       loop:<<Loop:B\d+>> outer_loop:none
170*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                          loop:<<Loop>>      outer_loop:none
171*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>   VecPredWhile [<<Phi1>>,{{i\d+}}]                                loop:<<Loop>>      outer_loop:none
172*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
173*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
174*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<Load1>>,<<Load2>>,<<LoopP>>] type:Uint8  loop:<<Loop>>      outer_loop:none
175*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,{{i\d+}}]                                         loop:<<Loop>>      outer_loop:none
176*795d594fSAndroid Build Coastguard Worker   //
177*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>,{{j\d+}}]                                   loop:none
178*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>,{{j\d+}}]                          loop:none
179*795d594fSAndroid Build Coastguard Worker   //
180*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
181*795d594fSAndroid Build Coastguard Worker   //
182*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Const16:i\d+>> IntConstant 16                                        loop:none
183*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>]                            loop:none
184*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
185*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                loop:<<Loop>>      outer_loop:none
186*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
187*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
188*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<Load1>>,<<Load2>>] type:Uint8  loop:<<Loop>>      outer_loop:none
189*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,<<Const16>>]                            loop:<<Loop>>      outer_loop:none
190*795d594fSAndroid Build Coastguard Worker   //
191*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>]                                  loop:none
192*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>]                         loop:none
193*795d594fSAndroid Build Coastguard Worker   //
194*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
195*795d594fSAndroid Build Coastguard Worker 
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdSimpleUnsigned(byte[], byte[]) disassembly (after)
197*795d594fSAndroid Build Coastguard Worker   /// CHECK:        VecDotProd
198*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
199*795d594fSAndroid Build Coastguard Worker   ///               CHECK:        udot z{{\d+}}.s, z{{\d+}}.b, z{{\d+}}.b
200*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELIF:   hasIsaFeature("dotprod")
201*795d594fSAndroid Build Coastguard Worker   ///               CHECK-NEXT:   udot v{{\d+}}.4s, v{{\d+}}.16b, v{{\d+}}.16b
202*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
203*795d594fSAndroid Build Coastguard Worker   ///               CHECK-NOT:    sdot
204*795d594fSAndroid Build Coastguard Worker   ///               CHECK-NOT:    udot
205*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
testDotProdSimpleUnsigned(byte[] a, byte[] b)206*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleUnsigned(byte[] a, byte[] b) {
207*795d594fSAndroid Build Coastguard Worker     int s = 1;
208*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
209*795d594fSAndroid Build Coastguard Worker       int temp = (a[i] & 0xff) * (b[i] & 0xff);
210*795d594fSAndroid Build Coastguard Worker       s += temp;
211*795d594fSAndroid Build Coastguard Worker     }
212*795d594fSAndroid Build Coastguard Worker     return s - 1;
213*795d594fSAndroid Build Coastguard Worker   }
214*795d594fSAndroid Build Coastguard Worker 
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdComplexUnsigned(byte[], byte[]) loop_optimization (before)
216*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
217*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
218*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
219*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>    Phi [<<Const1>>,{{i\d+}}]                             loop:<<Loop>>      outer_loop:none
220*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:a\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
221*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddC:i\d+>>    Add [<<Get1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
222*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<TypeC1:a\d+>>  TypeConversion [<<AddC>>]                             loop:<<Loop>>      outer_loop:none
223*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:a\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
224*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddGets:i\d+>> Add [<<Get2>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
225*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<TypeC2:a\d+>>  TypeConversion [<<AddGets>>]                          loop:<<Loop>>      outer_loop:none
226*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Mul:i\d+>>     Mul [<<TypeC1>>,<<TypeC2>>]                           loop:<<Loop>>      outer_loop:none
227*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi2>>,<<Mul>>]                                loop:<<Loop>>      outer_loop:none
228*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
229*795d594fSAndroid Build Coastguard Worker 
230*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdComplexUnsigned(byte[], byte[]) loop_optimization (after)
231*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
232*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
233*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
234*795d594fSAndroid Build Coastguard Worker   //
235*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Repl:d\d+>>    VecReplicateScalar [<<Const1>>,{{j\d+}}]                        loop:none
236*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>,{{j\d+}}]                             loop:none
237*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                                       loop:<<Loop:B\d+>> outer_loop:none
238*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                          loop:<<Loop>>      outer_loop:none
239*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>   VecPredWhile [<<Phi1>>,{{i\d+}}]                                loop:<<Loop>>      outer_loop:none
240*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
241*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd1:d\d+>>   VecAdd [<<Load1>>,<<Repl>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
242*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
243*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd2:d\d+>>   VecAdd [<<Load2>>,<<Repl>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
244*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<VAdd1>>,<<VAdd2>>,<<LoopP>>] type:Uint8  loop:<<Loop>>      outer_loop:none
245*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,{{i\d+}}]                                         loop:<<Loop>>      outer_loop:none
246*795d594fSAndroid Build Coastguard Worker   //
247*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>,{{j\d+}}]                                   loop:none
248*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>,{{j\d+}}]                          loop:none
249*795d594fSAndroid Build Coastguard Worker   //
250*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
251*795d594fSAndroid Build Coastguard Worker   //
252*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Const16:i\d+>> IntConstant 16                                        loop:none
253*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Repl:d\d+>>    VecReplicateScalar [<<Const1>>]                       loop:none
254*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>]                            loop:none
255*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
256*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                loop:<<Loop>>      outer_loop:none
257*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
258*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd1:d\d+>>   VecAdd [<<Load1>>,<<Repl>>]                           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: <<VAdd2:d\d+>>   VecAdd [<<Load2>>,<<Repl>>]                           loop:<<Loop>>      outer_loop:none
261*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<VAdd1>>,<<VAdd2>>] type:Uint8  loop:<<Loop>>      outer_loop:none
262*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,<<Const16>>]                            loop:<<Loop>>      outer_loop:none
263*795d594fSAndroid Build Coastguard Worker   //
264*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>]                                  loop:none
265*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>]                         loop:none
266*795d594fSAndroid Build Coastguard Worker   //
267*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
testDotProdComplexUnsigned(byte[] a, byte[] b)268*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdComplexUnsigned(byte[] a, byte[] b) {
269*795d594fSAndroid Build Coastguard Worker     int s = 1;
270*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
271*795d594fSAndroid Build Coastguard Worker       int temp = (((a[i] & 0xff) + 1) & 0xff) * (((b[i] & 0xff) + 1) & 0xff);
272*795d594fSAndroid Build Coastguard Worker       s += temp;
273*795d594fSAndroid Build Coastguard Worker     }
274*795d594fSAndroid Build Coastguard Worker     return s - 1;
275*795d594fSAndroid Build Coastguard Worker   }
276*795d594fSAndroid Build Coastguard Worker 
277*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdComplexUnsignedCastToSigned(byte[], byte[]) loop_optimization (before)
278*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
279*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         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: <<Get1:a\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
283*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddC:i\d+>>    Add [<<Get1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
284*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<TypeC1:b\d+>>  TypeConversion [<<AddC>>]                             loop:<<Loop>>      outer_loop:none
285*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:a\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
286*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddGets:i\d+>> Add [<<Get2>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
287*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<TypeC2:b\d+>>  TypeConversion [<<AddGets>>]                          loop:<<Loop>>      outer_loop:none
288*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Mul:i\d+>>     Mul [<<TypeC1>>,<<TypeC2>>]                           loop:<<Loop>>      outer_loop:none
289*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi2>>,<<Mul>>]                                loop:<<Loop>>      outer_loop:none
290*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
291*795d594fSAndroid Build Coastguard Worker 
292*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdComplexUnsignedCastToSigned(byte[], byte[]) loop_optimization (after)
293*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
294*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
295*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
296*795d594fSAndroid Build Coastguard Worker   //
297*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Repl:d\d+>>    VecReplicateScalar [<<Const1>>,{{j\d+}}]                        loop:none
298*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>,{{j\d+}}]                             loop:none
299*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                                       loop:<<Loop:B\d+>> outer_loop:none
300*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                          loop:<<Loop>>      outer_loop:none
301*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>   VecPredWhile [<<Phi1>>,{{i\d+}}]                                loop:<<Loop>>      outer_loop:none
302*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
303*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd1:d\d+>>   VecAdd [<<Load1>>,<<Repl>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
304*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
305*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd2:d\d+>>   VecAdd [<<Load2>>,<<Repl>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
306*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<VAdd1>>,<<VAdd2>>,<<LoopP>>] type:Int8   loop:<<Loop>>      outer_loop:none
307*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,{{i\d+}}]                                         loop:<<Loop>>      outer_loop:none
308*795d594fSAndroid Build Coastguard Worker   //
309*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>,{{j\d+}}]                                   loop:none
310*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>,{{j\d+}}]                          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: <<Repl:d\d+>>    VecReplicateScalar [<<Const1>>]                       loop:none
316*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>]                            loop:none
317*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
318*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                loop:<<Loop>>      outer_loop:none
319*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
320*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd1:d\d+>>   VecAdd [<<Load1>>,<<Repl>>]                           loop:<<Loop>>      outer_loop:none
321*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
322*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd2:d\d+>>   VecAdd [<<Load2>>,<<Repl>>]                           loop:<<Loop>>      outer_loop:none
323*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<VAdd1>>,<<VAdd2>>] type:Int8   loop:<<Loop>>      outer_loop:none
324*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,<<Const16>>]                            loop:<<Loop>>      outer_loop:none
325*795d594fSAndroid Build Coastguard Worker   //
326*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>]                                  loop:none
327*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>]                         loop:none
328*795d594fSAndroid Build Coastguard Worker   //
329*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
testDotProdComplexUnsignedCastToSigned(byte[] a, byte[] b)330*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdComplexUnsignedCastToSigned(byte[] a, byte[] b) {
331*795d594fSAndroid Build Coastguard Worker     int s = 1;
332*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
333*795d594fSAndroid Build Coastguard Worker       int temp = ((byte)((a[i] & 0xff) + 1)) * ((byte)((b[i] & 0xff) + 1));
334*795d594fSAndroid Build Coastguard Worker       s += temp;
335*795d594fSAndroid Build Coastguard Worker     }
336*795d594fSAndroid Build Coastguard Worker     return s - 1;
337*795d594fSAndroid Build Coastguard Worker   }
338*795d594fSAndroid Build Coastguard Worker 
339*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdComplexSignedCastToUnsigned(byte[], byte[]) loop_optimization (before)
340*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
341*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
342*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
343*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>    Phi [<<Const1>>,{{i\d+}}]                             loop:<<Loop>>      outer_loop:none
344*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:b\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
345*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddC:i\d+>>    Add [<<Get1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
346*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<TypeC1:a\d+>>  TypeConversion [<<AddC>>]                             loop:<<Loop>>      outer_loop:none
347*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:b\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]                          loop:<<Loop>>      outer_loop:none
348*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<AddGets:i\d+>> Add [<<Get2>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
349*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<TypeC2:a\d+>>  TypeConversion [<<AddGets>>]                          loop:<<Loop>>      outer_loop:none
350*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Mul:i\d+>>     Mul [<<TypeC1>>,<<TypeC2>>]                           loop:<<Loop>>      outer_loop:none
351*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi2>>,<<Mul>>]                                loop:<<Loop>>      outer_loop:none
352*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  Add [<<Phi1>>,<<Const1>>]                             loop:<<Loop>>      outer_loop:none
353*795d594fSAndroid Build Coastguard Worker 
354*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdComplexSignedCastToUnsigned(byte[], byte[]) loop_optimization (after)
355*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const0:i\d+>>  IntConstant 0                                         loop:none
356*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Const1:i\d+>>  IntConstant 1                                         loop:none
357*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
358*795d594fSAndroid Build Coastguard Worker   //
359*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Repl:d\d+>>    VecReplicateScalar [<<Const1>>,{{j\d+}}]                        loop:none
360*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>,{{j\d+}}]                             loop:none
361*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                                       loop:<<Loop:B\d+>> outer_loop:none
362*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                          loop:<<Loop>>      outer_loop:none
363*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<LoopP:j\d+>>   VecPredWhile [<<Phi1>>,{{i\d+}}]                                loop:<<Loop>>      outer_loop:none
364*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
365*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd1:d\d+>>   VecAdd [<<Load1>>,<<Repl>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
366*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
367*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd2:d\d+>>   VecAdd [<<Load2>>,<<Repl>>,<<LoopP>>]                           loop:<<Loop>>      outer_loop:none
368*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<VAdd1>>,<<VAdd2>>,<<LoopP>>] type:Uint8  loop:<<Loop>>      outer_loop:none
369*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,{{i\d+}}]                                         loop:<<Loop>>      outer_loop:none
370*795d594fSAndroid Build Coastguard Worker   //
371*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>,{{j\d+}}]                                   loop:none
372*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>,{{j\d+}}]                          loop:none
373*795d594fSAndroid Build Coastguard Worker   //
374*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
375*795d594fSAndroid Build Coastguard Worker   //
376*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Const16:i\d+>> IntConstant 16                                        loop:none
377*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Repl:d\d+>>    VecReplicateScalar [<<Const1>>]                       loop:none
378*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>     VecSetScalars [<<Const1>>]                            loop:none
379*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>    Phi [<<Const0>>,{{i\d+}}]                             loop:<<Loop:B\d+>> outer_loop:none
380*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>    Phi [<<Set>>,{{d\d+}}]                                loop:<<Loop>>      outer_loop:none
381*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
382*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd1:d\d+>>   VecAdd [<<Load1>>,<<Repl>>]                           loop:<<Loop>>      outer_loop:none
383*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]                           loop:<<Loop>>      outer_loop:none
384*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<VAdd2:d\d+>>   VecAdd [<<Load2>>,<<Repl>>]                           loop:<<Loop>>      outer_loop:none
385*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecDotProd [<<Phi2>>,<<VAdd1>>,<<VAdd2>>] type:Uint8  loop:<<Loop>>      outer_loop:none
386*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  Add [<<Phi1>>,<<Const16>>]                            loop:<<Loop>>      outer_loop:none
387*795d594fSAndroid Build Coastguard Worker   //
388*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Reduce:d\d+>>  VecReduce [<<Phi2>>]                                  loop:none
389*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                  VecExtractScalar [<<Reduce>>]                         loop:none
390*795d594fSAndroid Build Coastguard Worker   //
391*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
testDotProdComplexSignedCastToUnsigned(byte[] a, byte[] b)392*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdComplexSignedCastToUnsigned(byte[] a, byte[] b) {
393*795d594fSAndroid Build Coastguard Worker     int s = 1;
394*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
395*795d594fSAndroid Build Coastguard Worker       int temp = ((a[i] + 1) & 0xff) * ((b[i] + 1) & 0xff);
396*795d594fSAndroid Build Coastguard Worker       s += temp;
397*795d594fSAndroid Build Coastguard Worker     }
398*795d594fSAndroid Build Coastguard Worker     return s - 1;
399*795d594fSAndroid Build Coastguard Worker   }
400*795d594fSAndroid Build Coastguard Worker 
401*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdSignedWidening(byte[], byte[]) loop_optimization (after)
402*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  VecDotProd type:Int8
testDotProdSignedWidening(byte[] a, byte[] b)403*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSignedWidening(byte[] a, byte[] b) {
404*795d594fSAndroid Build Coastguard Worker     int s = 1;
405*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
406*795d594fSAndroid Build Coastguard Worker       int temp = ((short)(a[i])) * ((short)(b[i]));
407*795d594fSAndroid Build Coastguard Worker       s += temp;
408*795d594fSAndroid Build Coastguard Worker     }
409*795d594fSAndroid Build Coastguard Worker     return s - 1;
410*795d594fSAndroid Build Coastguard Worker   }
411*795d594fSAndroid Build Coastguard Worker 
412*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdParamSigned(int, byte[]) loop_optimization (after)
413*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  VecDotProd type:Int8
testDotProdParamSigned(int x, byte[] b)414*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdParamSigned(int x, byte[] b) {
415*795d594fSAndroid Build Coastguard Worker     int s = 1;
416*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
417*795d594fSAndroid Build Coastguard Worker       int temp = (byte)(x) * b[i];
418*795d594fSAndroid Build Coastguard Worker       s += temp;
419*795d594fSAndroid Build Coastguard Worker     }
420*795d594fSAndroid Build Coastguard Worker     return s - 1;
421*795d594fSAndroid Build Coastguard Worker   }
422*795d594fSAndroid Build Coastguard Worker 
423*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int other.TestByte.testDotProdParamUnsigned(int, byte[]) loop_optimization (after)
424*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                  VecDotProd type:Uint8
testDotProdParamUnsigned(int x, byte[] b)425*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdParamUnsigned(int x, byte[] b) {
426*795d594fSAndroid Build Coastguard Worker     int s = 1;
427*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
428*795d594fSAndroid Build Coastguard Worker       int temp = (x & 0xff) * (b[i] & 0xff);
429*795d594fSAndroid Build Coastguard Worker       s += temp;
430*795d594fSAndroid Build Coastguard Worker     }
431*795d594fSAndroid Build Coastguard Worker     return s - 1;
432*795d594fSAndroid Build Coastguard Worker   }
433*795d594fSAndroid Build Coastguard Worker 
434*795d594fSAndroid Build Coastguard Worker   // No DOTPROD cases.
435*795d594fSAndroid Build Coastguard Worker 
436*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdIntParam(int, byte[]) loop_optimization (after)
437*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdIntParam(int x, byte[] b)438*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdIntParam(int x, byte[] b) {
439*795d594fSAndroid Build Coastguard Worker     int s = 1;
440*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
441*795d594fSAndroid Build Coastguard Worker       int temp = b[i] * (x);
442*795d594fSAndroid Build Coastguard Worker       s += temp;
443*795d594fSAndroid Build Coastguard Worker     }
444*795d594fSAndroid Build Coastguard Worker     return s - 1;
445*795d594fSAndroid Build Coastguard Worker   }
446*795d594fSAndroid Build Coastguard Worker 
447*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSignedToChar(byte[], byte[]) loop_optimization (after)
448*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSignedToChar(byte[] a, byte[] b)449*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSignedToChar(byte[] a, byte[] b) {
450*795d594fSAndroid Build Coastguard Worker     int s = 1;
451*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
452*795d594fSAndroid Build Coastguard Worker       int temp = ((char)(a[i])) * ((char)(b[i]));
453*795d594fSAndroid Build Coastguard Worker       s += temp;
454*795d594fSAndroid Build Coastguard Worker     }
455*795d594fSAndroid Build Coastguard Worker     return s - 1;
456*795d594fSAndroid Build Coastguard Worker   }
457*795d594fSAndroid Build Coastguard Worker 
458*795d594fSAndroid Build Coastguard Worker   // Cases when result of Mul is type-converted are not supported.
459*795d594fSAndroid Build Coastguard Worker 
460*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleCastToSignedByte(byte[], byte[]) loop_optimization (after)
461*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSimpleCastToSignedByte(byte[] a, byte[] b)462*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleCastToSignedByte(byte[] a, byte[] b) {
463*795d594fSAndroid Build Coastguard Worker     int s = 1;
464*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
465*795d594fSAndroid Build Coastguard Worker       byte temp = (byte)(a[i] * b[i]);
466*795d594fSAndroid Build Coastguard Worker       s += temp;
467*795d594fSAndroid Build Coastguard Worker     }
468*795d594fSAndroid Build Coastguard Worker     return s - 1;
469*795d594fSAndroid Build Coastguard Worker   }
470*795d594fSAndroid Build Coastguard Worker 
471*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleCastToUnsignedByte(byte[], byte[]) loop_optimization (after)
472*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSimpleCastToUnsignedByte(byte[] a, byte[] b)473*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleCastToUnsignedByte(byte[] a, byte[] b) {
474*795d594fSAndroid Build Coastguard Worker     int s = 1;
475*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
476*795d594fSAndroid Build Coastguard Worker       s += (a[i] * b[i]) & 0xff;
477*795d594fSAndroid Build Coastguard Worker     }
478*795d594fSAndroid Build Coastguard Worker     return s - 1;
479*795d594fSAndroid Build Coastguard Worker   }
480*795d594fSAndroid Build Coastguard Worker 
481*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleUnsignedCastToSignedByte(byte[], byte[]) loop_optimization (after)
482*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSimpleUnsignedCastToSignedByte(byte[] a, byte[] b)483*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleUnsignedCastToSignedByte(byte[] a, byte[] b) {
484*795d594fSAndroid Build Coastguard Worker     int s = 1;
485*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
486*795d594fSAndroid Build Coastguard Worker       byte temp = (byte)((a[i] & 0xff) * (b[i] & 0xff));
487*795d594fSAndroid Build Coastguard Worker       s += temp;
488*795d594fSAndroid Build Coastguard Worker     }
489*795d594fSAndroid Build Coastguard Worker     return s - 1;
490*795d594fSAndroid Build Coastguard Worker   }
491*795d594fSAndroid Build Coastguard Worker 
492*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleUnsignedCastToUnsignedByte(byte[], byte[]) loop_optimization (after)
493*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSimpleUnsignedCastToUnsignedByte(byte[] a, byte[] b)494*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleUnsignedCastToUnsignedByte(byte[] a, byte[] b) {
495*795d594fSAndroid Build Coastguard Worker     int s = 1;
496*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
497*795d594fSAndroid Build Coastguard Worker       s += ((a[i] & 0xff) * (b[i] & 0xff)) & 0xff;
498*795d594fSAndroid Build Coastguard Worker     }
499*795d594fSAndroid Build Coastguard Worker     return s - 1;
500*795d594fSAndroid Build Coastguard Worker   }
501*795d594fSAndroid Build Coastguard Worker 
502*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleCastToShort(byte[], byte[]) loop_optimization (after)
503*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSimpleCastToShort(byte[] a, byte[] b)504*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleCastToShort(byte[] a, byte[] b) {
505*795d594fSAndroid Build Coastguard Worker     int s = 1;
506*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
507*795d594fSAndroid Build Coastguard Worker       short temp = (short)(a[i] * b[i]);
508*795d594fSAndroid Build Coastguard Worker       s += temp;
509*795d594fSAndroid Build Coastguard Worker     }
510*795d594fSAndroid Build Coastguard Worker     return s - 1;
511*795d594fSAndroid Build Coastguard Worker   }
512*795d594fSAndroid Build Coastguard Worker 
513*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleCastToChar(byte[], byte[]) loop_optimization (after)
514*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSimpleCastToChar(byte[] a, byte[] b)515*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleCastToChar(byte[] a, byte[] b) {
516*795d594fSAndroid Build Coastguard Worker     int s = 1;
517*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
518*795d594fSAndroid Build Coastguard Worker       char temp = (char)(a[i] * b[i]);
519*795d594fSAndroid Build Coastguard Worker       s += temp;
520*795d594fSAndroid Build Coastguard Worker     }
521*795d594fSAndroid Build Coastguard Worker     return s - 1;
522*795d594fSAndroid Build Coastguard Worker   }
523*795d594fSAndroid Build Coastguard Worker 
524*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleUnsignedCastToShort(byte[], byte[]) loop_optimization (after)
525*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSimpleUnsignedCastToShort(byte[] a, byte[] b)526*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleUnsignedCastToShort(byte[] a, byte[] b) {
527*795d594fSAndroid Build Coastguard Worker     int s = 1;
528*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
529*795d594fSAndroid Build Coastguard Worker       short temp = (short)((a[i] & 0xff) * (b[i] & 0xff));
530*795d594fSAndroid Build Coastguard Worker       s += temp;
531*795d594fSAndroid Build Coastguard Worker     }
532*795d594fSAndroid Build Coastguard Worker     return s - 1;
533*795d594fSAndroid Build Coastguard Worker   }
534*795d594fSAndroid Build Coastguard Worker 
535*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleUnsignedCastToChar(byte[], byte[]) loop_optimization (after)
536*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSimpleUnsignedCastToChar(byte[] a, byte[] b)537*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleUnsignedCastToChar(byte[] a, byte[] b) {
538*795d594fSAndroid Build Coastguard Worker     int s = 1;
539*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
540*795d594fSAndroid Build Coastguard Worker       char temp = (char)((a[i] & 0xff) * (b[i] & 0xff));
541*795d594fSAndroid Build Coastguard Worker       s += temp;
542*795d594fSAndroid Build Coastguard Worker     }
543*795d594fSAndroid Build Coastguard Worker     return s - 1;
544*795d594fSAndroid Build Coastguard Worker   }
545*795d594fSAndroid Build Coastguard Worker 
546*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdSimpleUnsignedCastToLong(byte[], byte[]) loop_optimization (after)
547*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdSimpleUnsignedCastToLong(byte[] a, byte[] b)548*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdSimpleUnsignedCastToLong(byte[] a, byte[] b) {
549*795d594fSAndroid Build Coastguard Worker     int s = 1;
550*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
551*795d594fSAndroid Build Coastguard Worker       long temp = (long)((a[i] & 0xff) * (b[i] & 0xff));
552*795d594fSAndroid Build Coastguard Worker       s += temp;
553*795d594fSAndroid Build Coastguard Worker     }
554*795d594fSAndroid Build Coastguard Worker     return s - 1;
555*795d594fSAndroid Build Coastguard Worker   }
556*795d594fSAndroid Build Coastguard Worker 
557*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int other.TestByte.testDotProdUnsignedSigned(byte[], byte[]) loop_optimization (after)
558*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                  VecDotProd
testDotProdUnsignedSigned(byte[] a, byte[] b)559*795d594fSAndroid Build Coastguard Worker   public static final int testDotProdUnsignedSigned(byte[] a, byte[] b) {
560*795d594fSAndroid Build Coastguard Worker     int s = 1;
561*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < b.length; i++) {
562*795d594fSAndroid Build Coastguard Worker       int temp = (a[i] & 0xff) * b[i];
563*795d594fSAndroid Build Coastguard Worker       s += temp;
564*795d594fSAndroid Build Coastguard Worker     }
565*795d594fSAndroid Build Coastguard Worker     return s - 1;
566*795d594fSAndroid Build Coastguard Worker   }
567*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)568*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(int expected, int result) {
569*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
570*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
571*795d594fSAndroid Build Coastguard Worker     }
572*795d594fSAndroid Build Coastguard Worker   }
573*795d594fSAndroid Build Coastguard Worker 
testDotProd(byte[] b1, byte[] b2, int[] results)574*795d594fSAndroid Build Coastguard Worker   private static void testDotProd(byte[] b1, byte[] b2, int[] results) {
575*795d594fSAndroid Build Coastguard Worker     expectEquals(results[0], testDotProdSimple(b1, b2));
576*795d594fSAndroid Build Coastguard Worker     expectEquals(results[1], testDotProdComplex(b1, b2));
577*795d594fSAndroid Build Coastguard Worker     expectEquals(results[2], testDotProdSimpleUnsigned(b1, b2));
578*795d594fSAndroid Build Coastguard Worker     expectEquals(results[3], testDotProdComplexUnsigned(b1, b2));
579*795d594fSAndroid Build Coastguard Worker     expectEquals(results[4], testDotProdComplexUnsignedCastToSigned(b1, b2));
580*795d594fSAndroid Build Coastguard Worker     expectEquals(results[5], testDotProdComplexSignedCastToUnsigned(b1, b2));
581*795d594fSAndroid Build Coastguard Worker     expectEquals(results[6], testDotProdSignedWidening(b1, b2));
582*795d594fSAndroid Build Coastguard Worker     expectEquals(results[7], testDotProdParamSigned(-128, b2));
583*795d594fSAndroid Build Coastguard Worker     expectEquals(results[8], testDotProdParamUnsigned(-128, b2));
584*795d594fSAndroid Build Coastguard Worker     expectEquals(results[9], testDotProdIntParam(-128, b2));
585*795d594fSAndroid Build Coastguard Worker     expectEquals(results[10], testDotProdSignedToChar(b1, b2));
586*795d594fSAndroid Build Coastguard Worker     expectEquals(results[11], testDotProdSimpleCastToSignedByte(b1, b2));
587*795d594fSAndroid Build Coastguard Worker     expectEquals(results[12], testDotProdSimpleCastToUnsignedByte(b1, b2));
588*795d594fSAndroid Build Coastguard Worker     expectEquals(results[13], testDotProdSimpleUnsignedCastToSignedByte(b1, b2));
589*795d594fSAndroid Build Coastguard Worker     expectEquals(results[14], testDotProdSimpleUnsignedCastToUnsignedByte(b1, b2));
590*795d594fSAndroid Build Coastguard Worker     expectEquals(results[15], testDotProdSimpleCastToShort(b1, b2));
591*795d594fSAndroid Build Coastguard Worker     expectEquals(results[16], testDotProdSimpleCastToChar(b1, b2));
592*795d594fSAndroid Build Coastguard Worker     expectEquals(results[17], testDotProdSimpleUnsignedCastToShort(b1, b2));
593*795d594fSAndroid Build Coastguard Worker     expectEquals(results[18], testDotProdSimpleUnsignedCastToChar(b1, b2));
594*795d594fSAndroid Build Coastguard Worker     expectEquals(results[19], testDotProdSimpleUnsignedCastToLong(b1, b2));
595*795d594fSAndroid Build Coastguard Worker     expectEquals(results[20], testDotProdUnsignedSigned(b1, b2));
596*795d594fSAndroid Build Coastguard Worker   }
597*795d594fSAndroid Build Coastguard Worker 
run()598*795d594fSAndroid Build Coastguard Worker   public static void run() {
599*795d594fSAndroid Build Coastguard Worker     byte[] b1_1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127 };
600*795d594fSAndroid Build Coastguard Worker     byte[] b2_1 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127 };
601*795d594fSAndroid Build Coastguard Worker     int[] results_1 = { 64516, 65548, 64516, 65548, 65548, 65548, 64516, -65024, 65024, -65024,
602*795d594fSAndroid Build Coastguard Worker                         64516, 4, 4, 4, 4, 64516, 64516, 64516, 64516, 64516, 64516 };
603*795d594fSAndroid Build Coastguard Worker     testDotProd(b1_1, b2_1, results_1);
604*795d594fSAndroid Build Coastguard Worker 
605*795d594fSAndroid Build Coastguard Worker     byte[] b1_2 = { 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127 };
606*795d594fSAndroid Build Coastguard Worker     byte[] b2_2 = { 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127 };
607*795d594fSAndroid Build Coastguard Worker     int[] results_2 = { 80645, 81931, 80645, 81931, 81931, 81931, 80645, -81280, 81280, -81280,
608*795d594fSAndroid Build Coastguard Worker                         80645, 5, 5, 5, 5, 80645, 80645, 80645, 80645, 80645, 80645 };
609*795d594fSAndroid Build Coastguard Worker     testDotProd(b1_2, b2_2, results_2);
610*795d594fSAndroid Build Coastguard Worker 
611*795d594fSAndroid Build Coastguard Worker     byte[] b1_3 = { -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, -128 };
612*795d594fSAndroid Build Coastguard Worker     byte[] b2_3 = {  127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  127,  127,  127,  127 };
613*795d594fSAndroid Build Coastguard Worker     int[] results_3 = { -81280, 81291, 81280, 82571, 81291, 82571, -81280, -81280, 81280, -81280,
614*795d594fSAndroid Build Coastguard Worker                         41534080, -640, 640, -640, 640, -81280, 246400, 81280, 81280, 81280, 81280 };
615*795d594fSAndroid Build Coastguard Worker     testDotProd(b1_3, b2_3, results_3);
616*795d594fSAndroid Build Coastguard Worker 
617*795d594fSAndroid Build Coastguard Worker     byte[] b1_4 = { -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, -128 };
618*795d594fSAndroid Build Coastguard Worker     byte[] b2_4 = { -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, -128, -128 };
619*795d594fSAndroid Build Coastguard Worker     int[] results_4 = { 81920, 80656, 81920, 83216, 80656, 83216, 81920, 81920, 81920, 81920,
620*795d594fSAndroid Build Coastguard Worker                        -83804160, 0, 0, 0, 0, 81920, 81920, 81920, 81920, 81920, -81920 };
621*795d594fSAndroid Build Coastguard Worker     testDotProd(b1_4, b2_4, results_4);
622*795d594fSAndroid Build Coastguard Worker   }
623*795d594fSAndroid Build Coastguard Worker 
main(String[] args)624*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
625*795d594fSAndroid Build Coastguard Worker     run();
626*795d594fSAndroid Build Coastguard Worker   }
627*795d594fSAndroid Build Coastguard Worker }
628