xref: /aosp_15_r20/art/test/660-checker-simd-sad/src/SimdSadShort3.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker /**
18*795d594fSAndroid Build Coastguard Worker  * Tests for SAD (sum of absolute differences).
19*795d594fSAndroid Build Coastguard Worker  *
20*795d594fSAndroid Build Coastguard Worker  * Some special cases: parameters, constants, invariants, cast computations.
21*795d594fSAndroid Build Coastguard Worker  */
22*795d594fSAndroid Build Coastguard Worker public class SimdSadShort3 {
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadShort3.sadShort2IntParamRight(short[], short) loop_optimization (before)
25*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:s\d+>>  ParameterValue                 loop:none
28*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
29*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
30*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:s\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Get>>,<<Param>>]        loop:<<Loop>>      outer_loop:none
32*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
33*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
34*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
35*795d594fSAndroid Build Coastguard Worker   //
36*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int SimdSadShort3.sadShort2IntParamRight(short[], short) loop_optimization (after)
37*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
38*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:s\d+>>  ParameterValue                 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   //      SAD idiom is not supported for SVE.
42*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
43*795d594fSAndroid Build Coastguard Worker   //
44*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
45*795d594fSAndroid Build Coastguard Worker   //
46*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
47*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>    VecReplicateScalar [<<Param>>] loop:none
48*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
49*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
50*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
51*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
52*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load>>,<<Rep>>] loop:<<Loop>> outer_loop:none
53*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
54*795d594fSAndroid Build Coastguard Worker   //
55*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadShort2IntParamRight(short[] s, short param)56*795d594fSAndroid Build Coastguard Worker   private static int sadShort2IntParamRight(short[] s, short param) {
57*795d594fSAndroid Build Coastguard Worker     int sad = 0;
58*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < s.length; i++) {
59*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(s[i] - param);
60*795d594fSAndroid Build Coastguard Worker     }
61*795d594fSAndroid Build Coastguard Worker     return sad;
62*795d594fSAndroid Build Coastguard Worker   }
63*795d594fSAndroid Build Coastguard Worker 
64*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadShort3.sadShort2IntParamLeft(short[], short) loop_optimization (before)
65*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
66*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
67*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:s\d+>>  ParameterValue                 loop:none
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:s\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Param>>,<<Get>>]        loop:<<Loop>>      outer_loop:none
72*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
74*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
75*795d594fSAndroid Build Coastguard Worker   //
76*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int SimdSadShort3.sadShort2IntParamLeft(short[], short) loop_optimization (after)
77*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
78*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Param:s\d+>>  ParameterValue                 loop:none
79*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
80*795d594fSAndroid Build Coastguard Worker   //
81*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
82*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
83*795d594fSAndroid Build Coastguard Worker   //
84*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
85*795d594fSAndroid Build Coastguard Worker   //
86*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
87*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>    VecReplicateScalar [<<Param>>] loop:none
88*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
89*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
90*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
91*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
92*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Rep>>,<<Load>>] loop:<<Loop>> outer_loop:none
93*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
94*795d594fSAndroid Build Coastguard Worker   //
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadShort2IntParamLeft(short[] s, short param)96*795d594fSAndroid Build Coastguard Worker   private static int sadShort2IntParamLeft(short[] s, short param) {
97*795d594fSAndroid Build Coastguard Worker     int sad = 0;
98*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < s.length; i++) {
99*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(param - s[i]);
100*795d594fSAndroid Build Coastguard Worker     }
101*795d594fSAndroid Build Coastguard Worker     return sad;
102*795d594fSAndroid Build Coastguard Worker   }
103*795d594fSAndroid Build Coastguard Worker 
104*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadShort3.sadShort2IntConstRight(short[]) loop_optimization (before)
105*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
106*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
107*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsI:i\d+>>  IntConstant -32767             loop:none
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
109*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
110*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:s\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
111*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>    Add [<<Get>>,<<ConsI>>]        loop:<<Loop>>      outer_loop:none
112*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Add>>]                  loop:<<Loop>>      outer_loop:none
113*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
114*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
115*795d594fSAndroid Build Coastguard Worker   //
116*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int SimdSadShort3.sadShort2IntConstRight(short[]) loop_optimization (after)
117*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
118*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsI:i\d+>>  IntConstant 32767              loop:none
119*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
120*795d594fSAndroid Build Coastguard Worker   //
121*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
122*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
123*795d594fSAndroid Build Coastguard Worker   //
124*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
125*795d594fSAndroid Build Coastguard Worker   //
126*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
127*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>    VecReplicateScalar [<<ConsI>>] loop:none
128*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
129*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
130*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
131*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
132*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load>>,<<Rep>>] loop:<<Loop>> outer_loop:none
133*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
134*795d594fSAndroid Build Coastguard Worker   //
135*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadShort2IntConstRight(short[] s)136*795d594fSAndroid Build Coastguard Worker   private static int sadShort2IntConstRight(short[] s) {
137*795d594fSAndroid Build Coastguard Worker     int sad = 0;
138*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < s.length; i++) {
139*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(s[i] - 32767);
140*795d594fSAndroid Build Coastguard Worker     }
141*795d594fSAndroid Build Coastguard Worker     return sad;
142*795d594fSAndroid Build Coastguard Worker   }
143*795d594fSAndroid Build Coastguard Worker 
144*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadShort3.sadShort2IntConstLeft(short[]) loop_optimization (before)
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsI:i\d+>>  IntConstant 32767              loop:none
148*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
150*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:s\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
151*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<ConsI>>,<<Get>>]        loop:<<Loop>>      outer_loop:none
152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
154*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
155*795d594fSAndroid Build Coastguard Worker   //
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int SimdSadShort3.sadShort2IntConstLeft(short[]) loop_optimization (after)
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
158*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsI:i\d+>>  IntConstant 32767              loop:none
159*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
160*795d594fSAndroid Build Coastguard Worker   //
161*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
162*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
163*795d594fSAndroid Build Coastguard Worker   //
164*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
165*795d594fSAndroid Build Coastguard Worker   //
166*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
167*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>    VecReplicateScalar [<<ConsI>>] loop:none
168*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
169*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{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: <<Load:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
172*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Rep>>,<<Load>>] loop:<<Loop>> outer_loop:none
173*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
174*795d594fSAndroid Build Coastguard Worker   //
175*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadShort2IntConstLeft(short[] s)176*795d594fSAndroid Build Coastguard Worker   private static int sadShort2IntConstLeft(short[] s) {
177*795d594fSAndroid Build Coastguard Worker     int sad = 0;
178*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < s.length; i++) {
179*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(32767 - s[i]);
180*795d594fSAndroid Build Coastguard Worker     }
181*795d594fSAndroid Build Coastguard Worker     return sad;
182*795d594fSAndroid Build Coastguard Worker   }
183*795d594fSAndroid Build Coastguard Worker 
184*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadShort3.sadShort2IntInvariantRight(short[], int) loop_optimization (before)
185*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
186*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
187*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:s\d+>>   TypeConversion [{{i\d+}}]      loop:none
188*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
189*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
190*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:s\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
191*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Get>>,<<Conv>>]         loop:<<Loop>>      outer_loop:none
192*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
193*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
194*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
195*795d594fSAndroid Build Coastguard Worker   //
196*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int SimdSadShort3.sadShort2IntInvariantRight(short[], int) loop_optimization (after)
197*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
198*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:s\d+>>   TypeConversion [{{i\d+}}]      loop:none
199*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
200*795d594fSAndroid Build Coastguard Worker   //
201*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
202*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
203*795d594fSAndroid Build Coastguard Worker   //
204*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
205*795d594fSAndroid Build Coastguard Worker   //
206*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
207*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>    VecReplicateScalar [<<Conv>>]  loop:none
208*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
209*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
210*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
211*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
212*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load>>,<<Rep>>] loop:<<Loop>> outer_loop:none
213*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
214*795d594fSAndroid Build Coastguard Worker   //
215*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadShort2IntInvariantRight(short[] s, int val)216*795d594fSAndroid Build Coastguard Worker   private static int sadShort2IntInvariantRight(short[] s, int val) {
217*795d594fSAndroid Build Coastguard Worker     int sad = 0;
218*795d594fSAndroid Build Coastguard Worker     short x = (short) (val + 1);
219*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < s.length; i++) {
220*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(s[i] - x);
221*795d594fSAndroid Build Coastguard Worker     }
222*795d594fSAndroid Build Coastguard Worker     return sad;
223*795d594fSAndroid Build Coastguard Worker   }
224*795d594fSAndroid Build Coastguard Worker 
225*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadShort3.sadShort2IntInvariantLeft(short[], int) loop_optimization (before)
226*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
227*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
228*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:s\d+>>   TypeConversion [{{i\d+}}]      loop:none
229*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
230*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
231*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:s\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
232*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Conv>>,<<Get>>]         loop:<<Loop>>      outer_loop:none
233*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
234*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
235*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
236*795d594fSAndroid Build Coastguard Worker   //
237*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int SimdSadShort3.sadShort2IntInvariantLeft(short[], int) loop_optimization (after)
238*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
239*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:s\d+>>   TypeConversion [{{i\d+}}]      loop:none
240*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
241*795d594fSAndroid Build Coastguard Worker   //
242*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
243*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
244*795d594fSAndroid Build Coastguard Worker   //
245*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
246*795d594fSAndroid Build Coastguard Worker   //
247*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
248*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>    VecReplicateScalar [<<Conv>>]  loop:none
249*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
250*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
251*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
252*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
253*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Rep>>,<<Load>>] loop:<<Loop>> outer_loop:none
254*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
255*795d594fSAndroid Build Coastguard Worker   //
256*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadShort2IntInvariantLeft(short[] s, int val)257*795d594fSAndroid Build Coastguard Worker   private static int sadShort2IntInvariantLeft(short[] s, int val) {
258*795d594fSAndroid Build Coastguard Worker     int sad = 0;
259*795d594fSAndroid Build Coastguard Worker     short x = (short) (val + 1);
260*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < s.length; i++) {
261*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(x - s[i]);
262*795d594fSAndroid Build Coastguard Worker     }
263*795d594fSAndroid Build Coastguard Worker     return sad;
264*795d594fSAndroid Build Coastguard Worker   }
265*795d594fSAndroid Build Coastguard Worker 
266*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadShort3.sadShort2IntCastExprRight(short[]) loop_optimization (before)
267*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
268*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
269*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsI:i\d+>>  IntConstant 110                loop:none
270*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
271*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
272*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:s\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
273*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>    [<<Get>>,<<ConsI>>]            loop:<<Loop>>      outer_loop:none
274*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:s\d+>>   TypeConversion [<<Add>>]       loop:<<Loop>>      outer_loop:none
275*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Get>>,<<Conv>>]         loop:<<Loop>>      outer_loop:none
276*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
277*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
278*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
279*795d594fSAndroid Build Coastguard Worker   //
280*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int SimdSadShort3.sadShort2IntCastExprRight(short[]) loop_optimization (after)
281*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
282*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsI:i\d+>>  IntConstant 110                loop:none
283*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
284*795d594fSAndroid Build Coastguard Worker   //
285*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
286*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
287*795d594fSAndroid Build Coastguard Worker   //
288*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
289*795d594fSAndroid Build Coastguard Worker   //
290*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
291*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>    VecReplicateScalar [<<ConsI>>] loop:none
292*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
293*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
294*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
295*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
296*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add:d\d+>>    VecAdd [<<Load>>,<<Rep>>]      loop:<<Loop>>      outer_loop:none
297*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load>>,<<Add>>] loop:<<Loop>> outer_loop:none
298*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
299*795d594fSAndroid Build Coastguard Worker   //
300*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadShort2IntCastExprRight(short[] s)301*795d594fSAndroid Build Coastguard Worker   private static int sadShort2IntCastExprRight(short[] s) {
302*795d594fSAndroid Build Coastguard Worker     int sad = 0;
303*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < s.length; i++) {
304*795d594fSAndroid Build Coastguard Worker       short x = (short) (s[i] + 110);  // narrower part sign extends
305*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(s[i] - x);
306*795d594fSAndroid Build Coastguard Worker     }
307*795d594fSAndroid Build Coastguard Worker     return sad;
308*795d594fSAndroid Build Coastguard Worker   }
309*795d594fSAndroid Build Coastguard Worker 
310*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadShort3.sadShort2IntCastExprLeft(short[]) loop_optimization (before)
311*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
312*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
313*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsI:i\d+>>  IntConstant 110                loop:none
314*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
315*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
316*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get:s\d+>>    ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
317*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Add:i\d+>>    [<<Get>>,<<ConsI>>]            loop:<<Loop>>      outer_loop:none
318*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Conv:s\d+>>   TypeConversion [<<Add>>]       loop:<<Loop>>      outer_loop:none
319*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Conv>>,<<Get>>]         loop:<<Loop>>      outer_loop:none
320*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
321*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
322*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
323*795d594fSAndroid Build Coastguard Worker   //
324*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: int SimdSadShort3.sadShort2IntCastExprLeft(short[]) loop_optimization (after)
325*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
326*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsI:i\d+>>  IntConstant 110                loop:none
327*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
328*795d594fSAndroid Build Coastguard Worker   //
329*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
330*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
331*795d594fSAndroid Build Coastguard Worker   //
332*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
333*795d594fSAndroid Build Coastguard Worker   //
334*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
335*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Rep:d\d+>>    VecReplicateScalar [<<ConsI>>] loop:none
336*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
337*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
338*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
339*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load:d\d+>>   VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
340*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Add:d\d+>>    VecAdd [<<Load>>,<<Rep>>]      loop:<<Loop>>      outer_loop:none
341*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Add>>,<<Load>>] loop:<<Loop>> outer_loop:none
342*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
343*795d594fSAndroid Build Coastguard Worker   //
344*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadShort2IntCastExprLeft(short[] s)345*795d594fSAndroid Build Coastguard Worker   private static int sadShort2IntCastExprLeft(short[] s) {
346*795d594fSAndroid Build Coastguard Worker     int sad = 0;
347*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < s.length; i++) {
348*795d594fSAndroid Build Coastguard Worker       short x = (short) (s[i] + 110);  // narrower part sign extends
349*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(x - s[i]);
350*795d594fSAndroid Build Coastguard Worker     }
351*795d594fSAndroid Build Coastguard Worker     return sad;
352*795d594fSAndroid Build Coastguard Worker   }
353*795d594fSAndroid Build Coastguard Worker 
main()354*795d594fSAndroid Build Coastguard Worker   public static void main() {
355*795d594fSAndroid Build Coastguard Worker     short[] interesting = {
356*795d594fSAndroid Build Coastguard Worker       (short) 0x0000,
357*795d594fSAndroid Build Coastguard Worker       (short) 0x0001,
358*795d594fSAndroid Build Coastguard Worker       (short) 0x0002,
359*795d594fSAndroid Build Coastguard Worker       (short) 0x0003,
360*795d594fSAndroid Build Coastguard Worker       (short) 0x0004,
361*795d594fSAndroid Build Coastguard Worker       (short) 0x1234,
362*795d594fSAndroid Build Coastguard Worker       (short) 0x8000,
363*795d594fSAndroid Build Coastguard Worker       (short) 0x8001,
364*795d594fSAndroid Build Coastguard Worker       (short) 0x8002,
365*795d594fSAndroid Build Coastguard Worker       (short) 0x8003,
366*795d594fSAndroid Build Coastguard Worker       (short) 0x8004,
367*795d594fSAndroid Build Coastguard Worker       (short) 0x8004,
368*795d594fSAndroid Build Coastguard Worker       (short) 0x7000,
369*795d594fSAndroid Build Coastguard Worker       (short) 0x7fff,
370*795d594fSAndroid Build Coastguard Worker       (short) 0xf000,
371*795d594fSAndroid Build Coastguard Worker       (short) 0xffff
372*795d594fSAndroid Build Coastguard Worker     };
373*795d594fSAndroid Build Coastguard Worker     short[] s = new short[64];
374*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 64; i++) {
375*795d594fSAndroid Build Coastguard Worker       s[i] = interesting[i % interesting.length];
376*795d594fSAndroid Build Coastguard Worker     }
377*795d594fSAndroid Build Coastguard Worker 
378*795d594fSAndroid Build Coastguard Worker     expectEquals(1067200, sadShort2IntParamRight(s, (short)-1));
379*795d594fSAndroid Build Coastguard Worker     expectEquals(1067200, sadShort2IntParamRight(s, (short) 0));
380*795d594fSAndroid Build Coastguard Worker     expectEquals(1067208, sadShort2IntParamRight(s, (short) 1));
381*795d594fSAndroid Build Coastguard Worker     expectEquals(1067224, sadShort2IntParamRight(s, (short) 2));
382*795d594fSAndroid Build Coastguard Worker     expectEquals(2635416, sadShort2IntParamRight(s, (short) 0x7fff));
383*795d594fSAndroid Build Coastguard Worker     expectEquals(1558824, sadShort2IntParamRight(s, (short) 0x8000));
384*795d594fSAndroid Build Coastguard Worker 
385*795d594fSAndroid Build Coastguard Worker     expectEquals(1067200, sadShort2IntParamLeft(s, (short)-1));
386*795d594fSAndroid Build Coastguard Worker     expectEquals(1067200, sadShort2IntParamLeft(s, (short) 0));
387*795d594fSAndroid Build Coastguard Worker     expectEquals(1067208, sadShort2IntParamLeft(s, (short) 1));
388*795d594fSAndroid Build Coastguard Worker     expectEquals(1067224, sadShort2IntParamLeft(s, (short) 2));
389*795d594fSAndroid Build Coastguard Worker     expectEquals(2635416, sadShort2IntParamLeft(s, (short) 0x7fff));
390*795d594fSAndroid Build Coastguard Worker     expectEquals(1558824, sadShort2IntParamLeft(s, (short) 0x8000));
391*795d594fSAndroid Build Coastguard Worker 
392*795d594fSAndroid Build Coastguard Worker     expectEquals(2635416, sadShort2IntConstRight(s));
393*795d594fSAndroid Build Coastguard Worker     expectEquals(2635416, sadShort2IntConstLeft(s));
394*795d594fSAndroid Build Coastguard Worker 
395*795d594fSAndroid Build Coastguard Worker     expectEquals(1067200, sadShort2IntInvariantRight(s, -2));
396*795d594fSAndroid Build Coastguard Worker     expectEquals(1067200, sadShort2IntInvariantRight(s, -1));
397*795d594fSAndroid Build Coastguard Worker     expectEquals(1067208, sadShort2IntInvariantRight(s, 0));
398*795d594fSAndroid Build Coastguard Worker     expectEquals(1067224, sadShort2IntInvariantRight(s, 1));
399*795d594fSAndroid Build Coastguard Worker     expectEquals(2635416, sadShort2IntInvariantRight(s, 0x7ffe));
400*795d594fSAndroid Build Coastguard Worker     expectEquals(1558824, sadShort2IntInvariantRight(s, 0x7fff));
401*795d594fSAndroid Build Coastguard Worker 
402*795d594fSAndroid Build Coastguard Worker     expectEquals(1067200, sadShort2IntInvariantLeft(s, -2));
403*795d594fSAndroid Build Coastguard Worker     expectEquals(1067200, sadShort2IntInvariantLeft(s, -1));
404*795d594fSAndroid Build Coastguard Worker     expectEquals(1067208, sadShort2IntInvariantLeft(s, 0));
405*795d594fSAndroid Build Coastguard Worker     expectEquals(1067224, sadShort2IntInvariantLeft(s, 1));
406*795d594fSAndroid Build Coastguard Worker     expectEquals(2635416, sadShort2IntInvariantLeft(s, 0x7ffe));
407*795d594fSAndroid Build Coastguard Worker     expectEquals(1558824, sadShort2IntInvariantLeft(s, 0x7fff));
408*795d594fSAndroid Build Coastguard Worker 
409*795d594fSAndroid Build Coastguard Worker     expectEquals(268304, sadShort2IntCastExprLeft(s));
410*795d594fSAndroid Build Coastguard Worker     expectEquals(268304, sadShort2IntCastExprRight(s));
411*795d594fSAndroid Build Coastguard Worker 
412*795d594fSAndroid Build Coastguard Worker     System.out.println("SimdSadShort3 passed");
413*795d594fSAndroid Build Coastguard Worker   }
414*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)415*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(int expected, int result) {
416*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
417*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
418*795d594fSAndroid Build Coastguard Worker     }
419*795d594fSAndroid Build Coastguard Worker   }
420*795d594fSAndroid Build Coastguard Worker 
expectEquals(long expected, long result)421*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(long expected, long result) {
422*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
423*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
424*795d594fSAndroid Build Coastguard Worker     }
425*795d594fSAndroid Build Coastguard Worker   }
426*795d594fSAndroid Build Coastguard Worker }
427