xref: /aosp_15_r20/art/test/660-checker-simd-sad/src/SimdSadLong.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 SimdSadLong {
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SimdSadLong.sadLong2Long(long[], long[]) loop_optimization (before)
23*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
24*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
25*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 0                 loop:none
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<ConsL>>,{{j\d+}}]       loop:<<Loop>>      outer_loop:none
28*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:j\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
29*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:j\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
30*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:j\d+>>    Sub [<<Get1>>,<<Get2>>]        loop:<<Loop>>      outer_loop:none
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:j\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
32*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
33*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
34*795d594fSAndroid Build Coastguard Worker   //
35*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long SimdSadLong.sadLong2Long(long[], long[]) loop_optimization (after)
36*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
37*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 0                 loop:none
38*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
39*795d594fSAndroid Build Coastguard Worker   //
40*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
41*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
42*795d594fSAndroid Build Coastguard Worker   //
43*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
44*795d594fSAndroid Build Coastguard Worker   //
45*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons2:i\d+>>  IntConstant 2                  loop:none
46*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<ConsL>>]      loop:none
47*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
48*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
49*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
50*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
51*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load1>>,<<Load2>>] loop:<<Loop>> outer_loop:none
52*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons2>>]       loop:<<Loop>>      outer_loop:none
53*795d594fSAndroid Build Coastguard Worker   //
54*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadLong2Long(long[] x, long[] y)55*795d594fSAndroid Build Coastguard Worker   private static long sadLong2Long(long[] x, long[] y) {
56*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(x.length, y.length);
57*795d594fSAndroid Build Coastguard Worker     long sad = 0;
58*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
59*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(x[i] - y[i]);
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: long SimdSadLong.sadLong2LongAlt(long[], long[]) 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: <<ConsL:j\d+>>  LongConstant 0                      loop:none
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]            loop:<<Loop:B\d+>> outer_loop:none
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<ConsL>>,{{j\d+}}]            loop:<<Loop>>      outer_loop:none
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:j\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]        loop:<<Loop>>      outer_loop:none
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:j\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]        loop:<<Loop>>      outer_loop:none
72*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub1:j\d+>>   Sub [<<Get2>>,<<Get1>>]             loop:<<Loop>>      outer_loop:none
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub2:j\d+>>   Sub [<<Get1>>,<<Get2>>]             loop:<<Loop>>      outer_loop:none
74*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Select:j\d+>> Select [<<Sub2>>,<<Sub1>>,{{z\d+}}] loop:<<Loop>>      outer_loop:none
75*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Select>>]           loop:<<Loop>>      outer_loop:none
76*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]            loop:<<Loop>>      outer_loop:none
77*795d594fSAndroid Build Coastguard Worker   //
78*795d594fSAndroid Build Coastguard Worker   // No ABS? No SAD!
79*795d594fSAndroid Build Coastguard Worker   //
80*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SimdSadLong.sadLong2LongAlt(long[], long[]) loop_optimization (after)
81*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: VecSADAccumulate
sadLong2LongAlt(long[] x, long[] y)82*795d594fSAndroid Build Coastguard Worker   private static long sadLong2LongAlt(long[] x, long[] y) {
83*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(x.length, y.length);
84*795d594fSAndroid Build Coastguard Worker     long sad = 0;
85*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
86*795d594fSAndroid Build Coastguard Worker       long s = x[i];
87*795d594fSAndroid Build Coastguard Worker       long p = y[i];
88*795d594fSAndroid Build Coastguard Worker       sad += s >= p ? s - p : p - s;
89*795d594fSAndroid Build Coastguard Worker     }
90*795d594fSAndroid Build Coastguard Worker     return sad;
91*795d594fSAndroid Build Coastguard Worker   }
92*795d594fSAndroid Build Coastguard Worker 
93*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SimdSadLong.sadLong2LongAlt2(long[], long[]) loop_optimization (before)
94*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
95*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
96*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 0                 loop:none
97*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
98*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<ConsL>>,{{j\d+}}]       loop:<<Loop>>      outer_loop:none
99*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:j\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
100*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:j\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
101*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:j\d+>>    Sub [<<Get1>>,<<Get2>>]        loop:<<Loop>>      outer_loop:none
102*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:j\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
103*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
104*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
105*795d594fSAndroid Build Coastguard Worker   //
106*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long SimdSadLong.sadLong2LongAlt2(long[], long[]) loop_optimization (after)
107*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 0                 loop:none
109*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
110*795d594fSAndroid Build Coastguard Worker   //
111*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
112*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
113*795d594fSAndroid Build Coastguard Worker   //
114*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
115*795d594fSAndroid Build Coastguard Worker   //
116*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons2:i\d+>>  IntConstant 2                  loop:none
117*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<ConsL>>]      loop:none
118*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
119*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
120*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
121*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
122*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load1>>,<<Load2>>] loop:<<Loop>> outer_loop:none
123*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons2>>]       loop:<<Loop>>      outer_loop:none
124*795d594fSAndroid Build Coastguard Worker   //
125*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadLong2LongAlt2(long[] x, long[] y)126*795d594fSAndroid Build Coastguard Worker   private static long sadLong2LongAlt2(long[] x, long[] y) {
127*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(x.length, y.length);
128*795d594fSAndroid Build Coastguard Worker     long sad = 0;
129*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
130*795d594fSAndroid Build Coastguard Worker       long s = x[i];
131*795d594fSAndroid Build Coastguard Worker       long p = y[i];
132*795d594fSAndroid Build Coastguard Worker       long m = s - p;
133*795d594fSAndroid Build Coastguard Worker       if (m < 0) m = -m;
134*795d594fSAndroid Build Coastguard Worker       sad += m;
135*795d594fSAndroid Build Coastguard Worker     }
136*795d594fSAndroid Build Coastguard Worker     return sad;
137*795d594fSAndroid Build Coastguard Worker   }
138*795d594fSAndroid Build Coastguard Worker 
139*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SimdSadLong.sadLong2LongAt1(long[], long[]) loop_optimization (before)
140*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
142*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 1                 loop:none
143*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
144*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<ConsL>>,{{j\d+}}]       loop:<<Loop>>      outer_loop:none
145*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get1:j\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Get2:j\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Sub:j\d+>>    Sub [<<Get1>>,<<Get2>>]        loop:<<Loop>>      outer_loop:none
148*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:j\d+>> Abs [<<Sub>>]                  loop:<<Loop>>      outer_loop:none
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
150*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
151*795d594fSAndroid Build Coastguard Worker   //
152*795d594fSAndroid Build Coastguard Worker   /// CHECK-START-ARM64: long SimdSadLong.sadLong2LongAt1(long[], long[]) loop_optimization (after)
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
154*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 1                 loop:none
155*795d594fSAndroid Build Coastguard Worker   /// CHECK-IF:     hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true'
156*795d594fSAndroid Build Coastguard Worker   //
157*795d594fSAndroid Build Coastguard Worker   //      SAD idiom is not supported for SVE.
158*795d594fSAndroid Build Coastguard Worker   ///     CHECK-NOT: VecSADAccumulate
159*795d594fSAndroid Build Coastguard Worker   //
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-ELSE:
161*795d594fSAndroid Build Coastguard Worker   //
162*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Cons2:i\d+>>  IntConstant 2                  loop:none
163*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<ConsL>>]      loop:none
164*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
165*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
166*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
167*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
168*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load1>>,<<Load2>>] loop:<<Loop>> outer_loop:none
169*795d594fSAndroid Build Coastguard Worker   ///     CHECK-DAG:                 Add [<<Phi1>>,<<Cons2>>]       loop:<<Loop>>      outer_loop:none
170*795d594fSAndroid Build Coastguard Worker   //
171*795d594fSAndroid Build Coastguard Worker   /// CHECK-FI:
sadLong2LongAt1(long[] x, long[] y)172*795d594fSAndroid Build Coastguard Worker   private static long sadLong2LongAt1(long[] x, long[] y) {
173*795d594fSAndroid Build Coastguard Worker     int min_length = Math.min(x.length, y.length);
174*795d594fSAndroid Build Coastguard Worker     long sad = 1;  // starts at 1
175*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < min_length; i++) {
176*795d594fSAndroid Build Coastguard Worker       sad += Math.abs(x[i] - y[i]);
177*795d594fSAndroid Build Coastguard Worker     }
178*795d594fSAndroid Build Coastguard Worker     return sad;
179*795d594fSAndroid Build Coastguard Worker   }
180*795d594fSAndroid Build Coastguard Worker 
main()181*795d594fSAndroid Build Coastguard Worker   public static void main() {
182*795d594fSAndroid Build Coastguard Worker     // Cross-test the two most extreme values individually.
183*795d594fSAndroid Build Coastguard Worker     long[] x = { 0, Long.MIN_VALUE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
184*795d594fSAndroid Build Coastguard Worker     long[] y = { 0, Long.MAX_VALUE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
185*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, sadLong2Long(x, y));
186*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, sadLong2Long(y, x));
187*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, sadLong2LongAlt(x, y));
188*795d594fSAndroid Build Coastguard Worker     expectEquals(-1L, sadLong2LongAlt(y, x));
189*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, sadLong2LongAlt2(x, y));
190*795d594fSAndroid Build Coastguard Worker     expectEquals(1L, sadLong2LongAlt2(y, x));
191*795d594fSAndroid Build Coastguard Worker     expectEquals(2L, sadLong2LongAt1(x, y));
192*795d594fSAndroid Build Coastguard Worker     expectEquals(2L, sadLong2LongAt1(y, x));
193*795d594fSAndroid Build Coastguard Worker 
194*795d594fSAndroid Build Coastguard Worker     // Use cross-values for the interesting values.
195*795d594fSAndroid Build Coastguard Worker     long[] interesting = {
196*795d594fSAndroid Build Coastguard Worker       0x0000000000000000L, 0x0000000000000001L, 0x000000007fffffffL,
197*795d594fSAndroid Build Coastguard Worker       0x0000000080000000L, 0x0000000080000001L, 0x00000000ffffffffL,
198*795d594fSAndroid Build Coastguard Worker       0x0000000100000000L, 0x0000000100000001L, 0x000000017fffffffL,
199*795d594fSAndroid Build Coastguard Worker       0x0000000180000000L, 0x0000000180000001L, 0x00000001ffffffffL,
200*795d594fSAndroid Build Coastguard Worker       0x7fffffff00000000L, 0x7fffffff00000001L, 0x7fffffff7fffffffL,
201*795d594fSAndroid Build Coastguard Worker       0x7fffffff80000000L, 0x7fffffff80000001L, 0x7fffffffffffffffL,
202*795d594fSAndroid Build Coastguard Worker       0x8000000000000000L, 0x8000000000000001L, 0x800000007fffffffL,
203*795d594fSAndroid Build Coastguard Worker       0x8000000080000000L, 0x8000000080000001L, 0x80000000ffffffffL,
204*795d594fSAndroid Build Coastguard Worker       0x8000000100000000L, 0x8000000100000001L, 0x800000017fffffffL,
205*795d594fSAndroid Build Coastguard Worker       0x8000000180000000L, 0x8000000180000001L, 0x80000001ffffffffL,
206*795d594fSAndroid Build Coastguard Worker       0xffffffff00000000L, 0xffffffff00000001L, 0xffffffff7fffffffL,
207*795d594fSAndroid Build Coastguard Worker       0xffffffff80000000L, 0xffffffff80000001L, 0xffffffffffffffffL
208*795d594fSAndroid Build Coastguard Worker     };
209*795d594fSAndroid Build Coastguard Worker     int n = interesting.length;
210*795d594fSAndroid Build Coastguard Worker     int m = n * n + 1;
211*795d594fSAndroid Build Coastguard Worker     x = new long[m];
212*795d594fSAndroid Build Coastguard Worker     y = new long[m];
213*795d594fSAndroid Build Coastguard Worker     int k = 0;
214*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < n; i++) {
215*795d594fSAndroid Build Coastguard Worker       for (int j = 0; j < n; j++) {
216*795d594fSAndroid Build Coastguard Worker         x[k] = interesting[i];
217*795d594fSAndroid Build Coastguard Worker         y[k] = interesting[j];
218*795d594fSAndroid Build Coastguard Worker         k++;
219*795d594fSAndroid Build Coastguard Worker       }
220*795d594fSAndroid Build Coastguard Worker     }
221*795d594fSAndroid Build Coastguard Worker     x[k] = 10;
222*795d594fSAndroid Build Coastguard Worker     y[k] = 2;
223*795d594fSAndroid Build Coastguard Worker     expectEquals(8L, sadLong2Long(x, y));
224*795d594fSAndroid Build Coastguard Worker     expectEquals(-901943132200L, sadLong2LongAlt(x, y));
225*795d594fSAndroid Build Coastguard Worker     expectEquals(8L, sadLong2LongAlt2(x, y));
226*795d594fSAndroid Build Coastguard Worker     expectEquals(9L, sadLong2LongAt1(x, y));
227*795d594fSAndroid Build Coastguard Worker 
228*795d594fSAndroid Build Coastguard Worker     System.out.println("SimdSadLong passed");
229*795d594fSAndroid Build Coastguard Worker   }
230*795d594fSAndroid Build Coastguard Worker 
expectEquals(long expected, long result)231*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(long expected, long result) {
232*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
233*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
234*795d594fSAndroid Build Coastguard Worker     }
235*795d594fSAndroid Build Coastguard Worker   }
236*795d594fSAndroid Build Coastguard Worker }
237