xref: /aosp_15_r20/art/test/660-checker-sad/src/SadLong.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 SadLong {
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SadLong.sad1(long, long) instruction_simplifier$after_gvn (before)
23*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Select:j\d+>> Select
24*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Select>>]
25*795d594fSAndroid Build Coastguard Worker   //
26*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SadLong.sad1(long, long) instruction_simplifier$after_gvn (after)
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Select:j\d+>> Select
28*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Select>>]
29*795d594fSAndroid Build Coastguard Worker   //
30*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SadLong.sad1(long, long) instruction_simplifier$after_gvn (after)
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Abs
32*795d594fSAndroid Build Coastguard Worker   //
33*795d594fSAndroid Build Coastguard Worker   // NOTE: for direct 64-bit operands, this is not an ABS.
sad1(long x, long y)34*795d594fSAndroid Build Coastguard Worker   static long sad1(long x, long y) {
35*795d594fSAndroid Build Coastguard Worker     return x >= y ? x - y : y - x;
36*795d594fSAndroid Build Coastguard Worker   }
37*795d594fSAndroid Build Coastguard Worker 
38*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SadLong.sad2(long, long) instruction_simplifier$after_gvn (before)
39*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Select:j\d+>> Select
40*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Select>>]
41*795d594fSAndroid Build Coastguard Worker   //
42*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SadLong.sad2(long, long) instruction_simplifier$after_gvn (after)
43*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:j\d+>> Abs
44*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Intrin>>]
sad2(long x, long y)45*795d594fSAndroid Build Coastguard Worker   static long sad2(long x, long y) {
46*795d594fSAndroid Build Coastguard Worker     long diff = x - y;
47*795d594fSAndroid Build Coastguard Worker     if (diff < 0) diff = -diff;
48*795d594fSAndroid Build Coastguard Worker     return diff;
49*795d594fSAndroid Build Coastguard Worker   }
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SadLong.sad3(long, long) instruction_simplifier$after_gvn (before)
52*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Select:j\d+>> Select
53*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Select>>]
54*795d594fSAndroid Build Coastguard Worker   //
55*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SadLong.sad3(long, long) instruction_simplifier$after_gvn (after)
56*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:j\d+>> Abs
57*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Intrin>>]
sad3(long x, long y)58*795d594fSAndroid Build Coastguard Worker   static long sad3(long x, long y) {
59*795d594fSAndroid Build Coastguard Worker     long diff = x - y;
60*795d594fSAndroid Build Coastguard Worker     return diff >= 0 ? diff : -diff;
61*795d594fSAndroid Build Coastguard Worker   }
62*795d594fSAndroid Build Coastguard Worker 
63*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SadLong.sad3Alt(long, long) instruction_simplifier$after_gvn (before)
64*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Select:j\d+>> Select
65*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Select>>]
66*795d594fSAndroid Build Coastguard Worker   //
67*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: long SadLong.sad3Alt(long, long) instruction_simplifier$after_gvn (after)
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG: <<Intrin:j\d+>> Abs
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                 Return [<<Intrin>>]
sad3Alt(long x, long y)70*795d594fSAndroid Build Coastguard Worker   static long sad3Alt(long x, long y) {
71*795d594fSAndroid Build Coastguard Worker     long diff = x - y;
72*795d594fSAndroid Build Coastguard Worker     return 0 <= diff ? diff : -diff;
73*795d594fSAndroid Build Coastguard Worker   }
74*795d594fSAndroid Build Coastguard Worker 
main()75*795d594fSAndroid Build Coastguard Worker   public static void main() {
76*795d594fSAndroid Build Coastguard Worker     // Use cross-values for the interesting values.
77*795d594fSAndroid Build Coastguard Worker     long[] interesting = {
78*795d594fSAndroid Build Coastguard Worker       0x0000000000000000L, 0x0000000000000001L, 0x000000007fffffffL,
79*795d594fSAndroid Build Coastguard Worker       0x0000000080000000L, 0x0000000080000001L, 0x00000000ffffffffL,
80*795d594fSAndroid Build Coastguard Worker       0x0000000100000000L, 0x0000000100000001L, 0x000000017fffffffL,
81*795d594fSAndroid Build Coastguard Worker       0x0000000180000000L, 0x0000000180000001L, 0x00000001ffffffffL,
82*795d594fSAndroid Build Coastguard Worker       0x7fffffff00000000L, 0x7fffffff00000001L, 0x7fffffff7fffffffL,
83*795d594fSAndroid Build Coastguard Worker       0x7fffffff80000000L, 0x7fffffff80000001L, 0x7fffffffffffffffL,
84*795d594fSAndroid Build Coastguard Worker       0x8000000000000000L, 0x8000000000000001L, 0x800000007fffffffL,
85*795d594fSAndroid Build Coastguard Worker       0x8000000080000000L, 0x8000000080000001L, 0x80000000ffffffffL,
86*795d594fSAndroid Build Coastguard Worker       0x8000000100000000L, 0x8000000100000001L, 0x800000017fffffffL,
87*795d594fSAndroid Build Coastguard Worker       0x8000000180000000L, 0x8000000180000001L, 0x80000001ffffffffL,
88*795d594fSAndroid Build Coastguard Worker       0xffffffff00000000L, 0xffffffff00000001L, 0xffffffff7fffffffL,
89*795d594fSAndroid Build Coastguard Worker       0xffffffff80000000L, 0xffffffff80000001L, 0xffffffffffffffffL
90*795d594fSAndroid Build Coastguard Worker     };
91*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < interesting.length; i++) {
92*795d594fSAndroid Build Coastguard Worker       for (int j = 0; j < interesting.length; j++) {
93*795d594fSAndroid Build Coastguard Worker         long x = interesting[i];
94*795d594fSAndroid Build Coastguard Worker         long y = interesting[j];
95*795d594fSAndroid Build Coastguard Worker         long e1 = x >= y ? x - y : y - x;  // still select
96*795d594fSAndroid Build Coastguard Worker         expectEquals(e1, sad1(x, y));
97*795d594fSAndroid Build Coastguard Worker         long e2 = Math.abs(x - y);  // pure abs
98*795d594fSAndroid Build Coastguard Worker         expectEquals(e2, sad2(x, y));
99*795d594fSAndroid Build Coastguard Worker         expectEquals(e2, sad3(x, y));
100*795d594fSAndroid Build Coastguard Worker         expectEquals(e2, sad3Alt(x, y));
101*795d594fSAndroid Build Coastguard Worker       }
102*795d594fSAndroid Build Coastguard Worker     }
103*795d594fSAndroid Build Coastguard Worker     System.out.println("SadLong passed");
104*795d594fSAndroid Build Coastguard Worker   }
105*795d594fSAndroid Build Coastguard Worker 
expectEquals(long expected, long result)106*795d594fSAndroid Build Coastguard Worker   private static void expectEquals(long expected, long result) {
107*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
108*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
109*795d594fSAndroid Build Coastguard Worker     }
110*795d594fSAndroid Build Coastguard Worker   }
111*795d594fSAndroid Build Coastguard Worker }
112