xref: /aosp_15_r20/art/test/660-checker-simd-sad/src/SimdSadChar.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 public class SimdSadChar {
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker   // TODO: lower precision still coming, b/64091002
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker   // TODO: consider unsigned SAD too, b/64091002
25*795d594fSAndroid Build Coastguard Worker 
sadChar2Char(char[] s1, char[] s2)26*795d594fSAndroid Build Coastguard Worker   private static char sadChar2Char(char[] s1, char[] s2) {
27*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(s1.length, s2.length);
28*795d594fSAndroid Build Coastguard Worker     char sad = 0;
29*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
30*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(s1[i] - s2[i]);
31*795d594fSAndroid Build Coastguard Worker     }
32*795d594fSAndroid Build Coastguard Worker     return sad;
33*795d594fSAndroid Build Coastguard Worker   }
34*795d594fSAndroid Build Coastguard Worker 
sadChar2CharAlt(char[] s1, char[] s2)35*795d594fSAndroid Build Coastguard Worker   private static char sadChar2CharAlt(char[] s1, char[] s2) {
36*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(s1.length, s2.length);
37*795d594fSAndroid Build Coastguard Worker     char sad = 0;
38*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
39*795d594fSAndroid Build Coastguard Worker       char s = s1[i];
40*795d594fSAndroid Build Coastguard Worker       char p = s2[i];
41*795d594fSAndroid Build Coastguard Worker       sad += s >= p ? s - p : p - s;
42*795d594fSAndroid Build Coastguard Worker     }
43*795d594fSAndroid Build Coastguard Worker     return sad;
44*795d594fSAndroid Build Coastguard Worker   }
45*795d594fSAndroid Build Coastguard Worker 
sadChar2CharAlt2(char[] s1, char[] s2)46*795d594fSAndroid Build Coastguard Worker   private static char sadChar2CharAlt2(char[] s1, char[] s2) {
47*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(s1.length, s2.length);
48*795d594fSAndroid Build Coastguard Worker     char sad = 0;
49*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
50*795d594fSAndroid Build Coastguard Worker       char s = s1[i];
51*795d594fSAndroid Build Coastguard Worker       char p = s2[i];
52*795d594fSAndroid Build Coastguard Worker       int x = s - p;
53*795d594fSAndroid Build Coastguard Worker       if (x < 0) x = -x;
54*795d594fSAndroid Build Coastguard Worker       sad += x;
55*795d594fSAndroid Build Coastguard Worker     }
56*795d594fSAndroid Build Coastguard Worker     return sad;
57*795d594fSAndroid Build Coastguard Worker   }
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadChar.sadChar2Int(char[], char[]) loop_optimization (before)
60*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
61*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
62*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
63*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
64*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
65*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
66*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Get1>>,<<Get2>>]        loop:<<Loop>>      outer_loop:none
67*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
70*795d594fSAndroid Build Coastguard Worker   //
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadChar.sadChar2Int(char[], char[]) loop_optimization (after)
72*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: VecSADAccumulate
sadChar2Int(char[] s1, char[] s2)73*795d594fSAndroid Build Coastguard Worker   private static int sadChar2Int(char[] s1, char[] s2) {
74*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(s1.length, s2.length);
75*795d594fSAndroid Build Coastguard Worker     int sad = 0;
76*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
77*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(s1[i] - s2[i]);
78*795d594fSAndroid Build Coastguard Worker     }
79*795d594fSAndroid Build Coastguard Worker     return sad;
80*795d594fSAndroid Build Coastguard Worker   }
81*795d594fSAndroid Build Coastguard Worker 
82*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadChar.sadChar2IntAlt(char[], char[]) loop_optimization (before)
83*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
84*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
85*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
86*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
87*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
88*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
89*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Get2>>,<<Get1>>]        loop:<<Loop>>      outer_loop:none
90*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
91*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
92*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
93*795d594fSAndroid Build Coastguard Worker   //
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadChar.sadChar2IntAlt(char[], char[]) loop_optimization (after)
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: VecSADAccumulate
sadChar2IntAlt(char[] s1, char[] s2)96*795d594fSAndroid Build Coastguard Worker   private static int sadChar2IntAlt(char[] s1, char[] s2) {
97*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(s1.length, s2.length);
98*795d594fSAndroid Build Coastguard Worker     int sad = 0;
99*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
100*795d594fSAndroid Build Coastguard Worker       char s = s1[i];
101*795d594fSAndroid Build Coastguard Worker       char p = s2[i];
102*795d594fSAndroid Build Coastguard Worker       sad += s >= p ? s - p : p - s;
103*795d594fSAndroid Build Coastguard Worker     }
104*795d594fSAndroid Build Coastguard Worker     return sad;
105*795d594fSAndroid Build Coastguard Worker   }
106*795d594fSAndroid Build Coastguard Worker 
107*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadChar.sadChar2IntAlt2(char[], char[]) loop_optimization (before)
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
109*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
110*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
111*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
112*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
113*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
114*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Get1>>,<<Get2>>]        loop:<<Loop>>      outer_loop:none
115*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:i\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
116*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
117*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
118*795d594fSAndroid Build Coastguard Worker   //
119*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int SimdSadChar.sadChar2IntAlt2(char[], char[]) loop_optimization (after)
120*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: VecSADAccumulate
sadChar2IntAlt2(char[] s1, char[] s2)121*795d594fSAndroid Build Coastguard Worker   private static int sadChar2IntAlt2(char[] s1, char[] s2) {
122*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(s1.length, s2.length);
123*795d594fSAndroid Build Coastguard Worker     int sad = 0;
124*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
125*795d594fSAndroid Build Coastguard Worker       char s = s1[i];
126*795d594fSAndroid Build Coastguard Worker       char p = s2[i];
127*795d594fSAndroid Build Coastguard Worker       int x = s - p;
128*795d594fSAndroid Build Coastguard Worker       if (x < 0) x = -x;
129*795d594fSAndroid Build Coastguard Worker       sad += x;
130*795d594fSAndroid Build Coastguard Worker     }
131*795d594fSAndroid Build Coastguard Worker     return sad;
132*795d594fSAndroid Build Coastguard Worker   }
133*795d594fSAndroid Build Coastguard Worker 
134*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SimdSadChar.sadChar2Long(char[], char[]) loop_optimization (before)
135*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
136*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 0                 loop:none
138*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
139*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<ConsL>>,{{j\d+}}]       loop:<<Loop>>      outer_loop:none
140*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
142*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv1:j\d+>>   TypeConversion [<<Get1>>]      loop:<<Loop>>      outer_loop:none
143*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv2:j\d+>>   TypeConversion [<<Get2>>]      loop:<<Loop>>      outer_loop:none
144*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:j\d+>>    Sub [<<Cnv1>>,<<Cnv2>>]        loop:<<Loop>>      outer_loop:none
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:j\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
148*795d594fSAndroid Build Coastguard Worker   //
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SimdSadChar.sadChar2Long(char[], char[]) loop_optimization (after)
150*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: VecSADAccumulate
sadChar2Long(char[] s1, char[] s2)151*795d594fSAndroid Build Coastguard Worker   private static long sadChar2Long(char[] s1, char[] s2) {
152*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(s1.length, s2.length);
153*795d594fSAndroid Build Coastguard Worker     long sad = 0;
154*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
155*795d594fSAndroid Build Coastguard Worker       long x = s1[i];
156*795d594fSAndroid Build Coastguard Worker       long y = s2[i];
157*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(x - y);
158*795d594fSAndroid Build Coastguard Worker     }
159*795d594fSAndroid Build Coastguard Worker     return sad;
160*795d594fSAndroid Build Coastguard Worker   }
161*795d594fSAndroid Build Coastguard Worker 
162*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SimdSadChar.sadChar2LongAt1(char[], char[]) loop_optimization (before)
163*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
165*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 1                 loop:none
166*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
167*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<ConsL>>,{{j\d+}}]       loop:<<Loop>>      outer_loop:none
168*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
169*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:c\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
170*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv1:j\d+>>   TypeConversion [<<Get1>>]      loop:<<Loop>>      outer_loop:none
171*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cnv2:j\d+>>   TypeConversion [<<Get2>>]      loop:<<Loop>>      outer_loop:none
172*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:j\d+>>    Sub [<<Cnv1>>,<<Cnv2>>]        loop:<<Loop>>      outer_loop:none
173*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:j\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
174*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
175*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
176*795d594fSAndroid Build Coastguard Worker   //
177*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SimdSadChar.sadChar2LongAt1(char[], char[]) loop_optimization (after)
178*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: VecSADAccumulate
sadChar2LongAt1(char[] s1, char[] s2)179*795d594fSAndroid Build Coastguard Worker   private static long sadChar2LongAt1(char[] s1, char[] s2) {
180*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(s1.length, s2.length);
181*795d594fSAndroid Build Coastguard Worker     long sad = 1;  // starts at 1
182*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
183*795d594fSAndroid Build Coastguard Worker       long x = s1[i];
184*795d594fSAndroid Build Coastguard Worker       long y = s2[i];
185*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(x - y);
186*795d594fSAndroid Build Coastguard Worker     }
187*795d594fSAndroid Build Coastguard Worker     return sad;
188*795d594fSAndroid Build Coastguard Worker   }
189*795d594fSAndroid Build Coastguard Worker 
main()190*795d594fSAndroid Build Coastguard Worker   public static void main() {
191*795d594fSAndroid Build Coastguard Worker     // Cross-test the two most extreme values individually.
192*795d594fSAndroid Build Coastguard Worker     char[] s1 = { 0, 0x8000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
193*795d594fSAndroid Build Coastguard Worker     char[] s2 = { 0, 0x7fff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
194*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2Char(s1, s2));
195*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2Char(s2, s1));
196*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2CharAlt(s1, s2));
197*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2CharAlt(s2, s1));
198*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2CharAlt2(s1, s2));
199*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2CharAlt2(s2, s1));
200*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2Int(s1, s2));
201*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2Int(s2, s1));
202*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2IntAlt(s1, s2));
203*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2IntAlt(s2, s1));
204*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2IntAlt2(s1, s2));
205*795d594fSAndroid Build Coastguard Worker     expectEquals(1, sadChar2IntAlt2(s2, s1));
206*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, sadChar2Long(s1, s2));
207*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, sadChar2Long(s2, s1));
208*795d594fSAndroid Build Coastguard Worker     expectEquals(2L, sadChar2LongAt1(s1, s2));
209*795d594fSAndroid Build Coastguard Worker     expectEquals(2L, sadChar2LongAt1(s2, s1));
210*795d594fSAndroid Build Coastguard Worker 
211*795d594fSAndroid Build Coastguard Worker     // Use cross-values to test all cases.
212*795d594fSAndroid Build Coastguard Worker     char[] interesting = {
213*795d594fSAndroid Build Coastguard Worker       (char) 0x0000,
214*795d594fSAndroid Build Coastguard Worker       (char) 0x0001,
215*795d594fSAndroid Build Coastguard Worker       (char) 0x0002,
216*795d594fSAndroid Build Coastguard Worker       (char) 0x1234,
217*795d594fSAndroid Build Coastguard Worker       (char) 0x8000,
218*795d594fSAndroid Build Coastguard Worker       (char) 0x8001,
219*795d594fSAndroid Build Coastguard Worker       (char) 0x7fff,
220*795d594fSAndroid Build Coastguard Worker       (char) 0xffff
221*795d594fSAndroid Build Coastguard Worker     };
222*795d594fSAndroid Build Coastguard Worker     int n = interesting.length;
223*795d594fSAndroid Build Coastguard Worker     int m = n * n + 1;
224*795d594fSAndroid Build Coastguard Worker     s1 = new char[m];
225*795d594fSAndroid Build Coastguard Worker     s2 = new char[m];
226*795d594fSAndroid Build Coastguard Worker     int k = 0;
227*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; i++) {
228*795d594fSAndroid Build Coastguard Worker       for (int j = 0; j < n; j++) {
229*795d594fSAndroid Build Coastguard Worker         s1[k] = interesting[i];
230*795d594fSAndroid Build Coastguard Worker         s2[k] = interesting[j];
231*795d594fSAndroid Build Coastguard Worker         k++;
232*795d594fSAndroid Build Coastguard Worker       }
233*795d594fSAndroid Build Coastguard Worker     }
234*795d594fSAndroid Build Coastguard Worker     s1[k] = 10;
235*795d594fSAndroid Build Coastguard Worker     s2[k] = 2;
236*795d594fSAndroid Build Coastguard Worker     expectEquals(56196, sadChar2Char(s1, s2));
237*795d594fSAndroid Build Coastguard Worker     expectEquals(56196, sadChar2CharAlt(s1, s2));
238*795d594fSAndroid Build Coastguard Worker     expectEquals(56196, sadChar2CharAlt2(s1, s2));
239*795d594fSAndroid Build Coastguard Worker     expectEquals(1497988, sadChar2Int(s1, s2));
240*795d594fSAndroid Build Coastguard Worker     expectEquals(1497988, sadChar2IntAlt(s1, s2));
241*795d594fSAndroid Build Coastguard Worker     expectEquals(1497988, sadChar2IntAlt2(s1, s2));
242*795d594fSAndroid Build Coastguard Worker     expectEquals(1497988L, sadChar2Long(s1, s2));
243*795d594fSAndroid Build Coastguard Worker     expectEquals(1497989L, sadChar2LongAt1(s1, s2));
244*795d594fSAndroid Build Coastguard Worker 
245*795d594fSAndroid Build Coastguard Worker     System.out.println("SimdSadChar passed");
246*795d594fSAndroid Build Coastguard Worker   }
247*795d594fSAndroid Build Coastguard Worker 
expectEquals(int expected, int result)248*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(int expected, int result) {
249*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
250*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
251*795d594fSAndroid Build Coastguard Worker     }
252*795d594fSAndroid Build Coastguard Worker   }
253*795d594fSAndroid Build Coastguard Worker 
expectEquals(long expected, long result)254*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(long expected, long result) {
255*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
256*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
257*795d594fSAndroid Build Coastguard Worker     }
258*795d594fSAndroid Build Coastguard Worker   }
259*795d594fSAndroid Build Coastguard Worker }
260