1dbbac8f812a866b1b53f3007721f66038d208549Aart Bik/*
2dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * Copyright (C) 2017 The Android Open Source Project
3dbbac8f812a866b1b53f3007721f66038d208549Aart Bik *
4dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * Licensed under the Apache License, Version 2.0 (the "License");
5dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * you may not use this file except in compliance with the License.
6dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * You may obtain a copy of the License at
7dbbac8f812a866b1b53f3007721f66038d208549Aart Bik *
8dbbac8f812a866b1b53f3007721f66038d208549Aart Bik *      http://www.apache.org/licenses/LICENSE-2.0
9dbbac8f812a866b1b53f3007721f66038d208549Aart Bik *
10dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * Unless required by applicable law or agreed to in writing, software
11dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * distributed under the License is distributed on an "AS IS" BASIS,
12dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * See the License for the specific language governing permissions and
14dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * limitations under the License.
15dbbac8f812a866b1b53f3007721f66038d208549Aart Bik */
16dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
17dbbac8f812a866b1b53f3007721f66038d208549Aart Bik/**
18dbbac8f812a866b1b53f3007721f66038d208549Aart Bik * Tests for SAD (sum of absolute differences).
19dbbac8f812a866b1b53f3007721f66038d208549Aart Bik */
20dbbac8f812a866b1b53f3007721f66038d208549Aart Bikpublic class Main {
21dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
22dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  // TODO: lower precision still coming, b/64091002
23dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
24dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static short sadShort2Short(short[] s1, short[] s2) {
25dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int min_length = Math.min(s1.length, s2.length);
26dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    short sad = 0;
27dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    for (int i = 0; i < min_length; i++) {
28dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      sad += Math.abs(s1[i] - s2[i]);
29dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
30dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    return sad;
31dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
32dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
33dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static short sadShort2ShortAlt(short[] s1, short[] s2) {
34dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int min_length = Math.min(s1.length, s2.length);
35dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    short sad = 0;
36dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    for (int i = 0; i < min_length; i++) {
37dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      short s = s1[i];
38dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      short p = s2[i];
39dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      sad += s >= p ? s - p : p - s;
40dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
41dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    return sad;
42dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
43dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
44dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static short sadShort2ShortAlt2(short[] s1, short[] s2) {
45dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int min_length = Math.min(s1.length, s2.length);
46dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    short sad = 0;
47dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    for (int i = 0; i < min_length; i++) {
48dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      short s = s1[i];
49dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      short p = s2[i];
50dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      int x = s - p;
51dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      if (x < 0) x = -x;
52dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      sad += x;
53dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
54dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    return sad;
55dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
56dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
57dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-START: int Main.sadShort2Int(short[], short[]) loop_optimization (before)
58dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
59dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
60dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
61dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
62dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get1:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
63dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get2:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
64dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Get1>>,<<Get2>>]        loop:<<Loop>>      outer_loop:none
65dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Intrin:i\d+>> InvokeStaticOrDirect [<<Sub>>] intrinsic:MathAbsInt loop:<<Loop>> outer_loop:none
66dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
67dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
68dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  //
699cb7fe4daf872fd0cb312489af263ebc622033a8Aart Bik  /// CHECK-START-{ARM64,MIPS64}: int Main.sadShort2Int(short[], short[]) loop_optimization (after)
7038e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
7138e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
7238e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
7338e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
7438e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
7538e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
7638e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
7738e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load1>>,<<Load2>>] loop:<<Loop>> outer_loop:none
7838e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
79dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static int sadShort2Int(short[] s1, short[] s2) {
80dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int min_length = Math.min(s1.length, s2.length);
81dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int sad = 0;
82dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    for (int i = 0; i < min_length; i++) {
83dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      sad += Math.abs(s1[i] - s2[i]);
84dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
85dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    return sad;
86dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
87dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
88dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-START: int Main.sadShort2IntAlt(short[], short[]) loop_optimization (before)
89dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
90dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
91dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
92dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
93dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get1:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
94dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get2:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
95dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Get2>>,<<Get1>>]        loop:<<Loop>>      outer_loop:none
96dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Intrin:i\d+>> InvokeStaticOrDirect [<<Sub>>] intrinsic:MathAbsInt loop:<<Loop>> outer_loop:none
97dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
98dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
99dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  //
1009cb7fe4daf872fd0cb312489af263ebc622033a8Aart Bik  /// CHECK-START-{ARM64,MIPS64}: int Main.sadShort2IntAlt(short[], short[]) loop_optimization (after)
10138e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
10238e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
10338e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
10438e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
10538e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
10638e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
10738e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
10838e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load2>>,<<Load1>>] loop:<<Loop>> outer_loop:none
10938e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
110dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static int sadShort2IntAlt(short[] s1, short[] s2) {
111dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int min_length = Math.min(s1.length, s2.length);
112dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int sad = 0;
113dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    for (int i = 0; i < min_length; i++) {
114dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      short s = s1[i];
115dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      short p = s2[i];
116dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      sad += s >= p ? s - p : p - s;
117dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
118dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    return sad;
119dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
120dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
121dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-START: int Main.sadShort2IntAlt2(short[], short[]) loop_optimization (before)
122dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
123dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
124dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
125dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi2:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop>>      outer_loop:none
126dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get1:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
127dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get2:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
128dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Sub:i\d+>>    Sub [<<Get1>>,<<Get2>>]        loop:<<Loop>>      outer_loop:none
129dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Intrin:i\d+>> InvokeStaticOrDirect [<<Sub>>] intrinsic:MathAbsInt loop:<<Loop>> outer_loop:none
130dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
131dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
132dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  //
1339cb7fe4daf872fd0cb312489af263ebc622033a8Aart Bik  /// CHECK-START-{ARM64,MIPS64}: int Main.sadShort2IntAlt2(short[], short[]) loop_optimization (after)
13438e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
13538e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
13638e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<Cons0>>]      loop:none
13738e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
13838e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
13938e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
14038e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
14138e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load1>>,<<Load2>>] loop:<<Loop>> outer_loop:none
14238e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
143dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static int sadShort2IntAlt2(short[] s1, short[] s2) {
144dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int min_length = Math.min(s1.length, s2.length);
145dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int sad = 0;
146dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    for (int i = 0; i < min_length; i++) {
147dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      short s = s1[i];
148dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      short p = s2[i];
149dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      int x = s - p;
150dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      if (x < 0) x = -x;
151dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      sad += x;
152dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
153dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    return sad;
154dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
155dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
156dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-START: long Main.sadShort2Long(short[], short[]) loop_optimization (before)
157dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
158dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
159dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 0                 loop:none
160dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
161dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<ConsL>>,{{j\d+}}]       loop:<<Loop>>      outer_loop:none
162dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get1:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
163dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get2:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
164dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cnv1:j\d+>>   TypeConversion [<<Get1>>]      loop:<<Loop>>      outer_loop:none
165dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cnv2:j\d+>>   TypeConversion [<<Get2>>]      loop:<<Loop>>      outer_loop:none
166dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Sub:j\d+>>    Sub [<<Cnv1>>,<<Cnv2>>]        loop:<<Loop>>      outer_loop:none
167dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Intrin:j\d+>> InvokeStaticOrDirect [<<Sub>>] intrinsic:MathAbsLong loop:<<Loop>> outer_loop:none
168dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
169dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
170dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  //
1719cb7fe4daf872fd0cb312489af263ebc622033a8Aart Bik  /// CHECK-START-{ARM64,MIPS64}: long Main.sadShort2Long(short[], short[]) loop_optimization (after)
17238e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
17338e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
17438e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 0                 loop:none
17538e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<ConsL>>]      loop:none
17638e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
17738e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
17838e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
17938e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
18038e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load1>>,<<Load2>>] loop:<<Loop>> outer_loop:none
18138e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
182dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static long sadShort2Long(short[] s1, short[] s2) {
183dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int min_length = Math.min(s1.length, s2.length);
184dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    long sad = 0;
185dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    for (int i = 0; i < min_length; i++) {
186dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      long x = s1[i];
187dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      long y = s2[i];
188dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      sad += Math.abs(x - y);
189dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
190dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    return sad;
191dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
192dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
193dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-START: long Main.sadShort2LongAt1(short[], short[]) loop_optimization (before)
194dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
195dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cons1:i\d+>>  IntConstant 1                  loop:none
196dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 1                 loop:none
197dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
198dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Phi2:j\d+>>   Phi [<<ConsL>>,{{j\d+}}]       loop:<<Loop>>      outer_loop:none
199dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get1:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
200dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Get2:s\d+>>   ArrayGet [{{l\d+}},<<Phi1>>]   loop:<<Loop>>      outer_loop:none
201dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cnv1:j\d+>>   TypeConversion [<<Get1>>]      loop:<<Loop>>      outer_loop:none
202dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Cnv2:j\d+>>   TypeConversion [<<Get2>>]      loop:<<Loop>>      outer_loop:none
203dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Sub:j\d+>>    Sub [<<Cnv1>>,<<Cnv2>>]        loop:<<Loop>>      outer_loop:none
204dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Intrin:j\d+>> InvokeStaticOrDirect [<<Sub>>] intrinsic:MathAbsLong loop:<<Loop>> outer_loop:none
205dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi2>>,<<Intrin>>]      loop:<<Loop>>      outer_loop:none
206dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons1>>]       loop:<<Loop>>      outer_loop:none
207dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  //
2089cb7fe4daf872fd0cb312489af263ebc622033a8Aart Bik  /// CHECK-START-{ARM64,MIPS64}: long Main.sadShort2LongAt1(short[], short[]) loop_optimization (after)
20938e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons0:i\d+>>  IntConstant 0                  loop:none
21038e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Cons8:i\d+>>  IntConstant 8                  loop:none
21138e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<ConsL:j\d+>>  LongConstant 1                 loop:none
21238e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Set:d\d+>>    VecSetScalars [<<ConsL>>]      loop:none
21338e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi1:i\d+>>   Phi [<<Cons0>>,{{i\d+}}]       loop:<<Loop:B\d+>> outer_loop:none
21438e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Phi2:d\d+>>   Phi [<<Set>>,{{d\d+}}]         loop:<<Loop>>      outer_loop:none
21538e380b3c5139c0993495a7a0f040bfe8aa1e9e9Lena Djokic  /// CHECK-DAG: <<Load1:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
216dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<Load2:d\d+>>  VecLoad [{{l\d+}},<<Phi1>>]    loop:<<Loop>>      outer_loop:none
217dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG: <<SAD:d\d+>>    VecSADAccumulate [<<Phi2>>,<<Load1>>,<<Load2>>] loop:<<Loop>> outer_loop:none
218dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  /// CHECK-DAG:                 Add [<<Phi1>>,<<Cons8>>]       loop:<<Loop>>      outer_loop:none
219dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static long sadShort2LongAt1(short[] s1, short[] s2) {
220dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int min_length = Math.min(s1.length, s2.length);
221dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    long sad = 1;  // starts at 1
222dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    for (int i = 0; i < min_length; i++) {
223dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      long x = s1[i];
224dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      long y = s2[i];
225dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      sad += Math.abs(x - y);
226dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
227dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    return sad;
228dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
229dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
230dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  public static void main(String[] args) {
231dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    // Cross-test the two most extreme values individually.
232dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    short[] s1 = { 0, -32768, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
233dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    short[] s2 = { 0,  32767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
234dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(-1, sadShort2Short(s1, s2));
235dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(-1, sadShort2Short(s2, s1));
236dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(-1, sadShort2ShortAlt(s1, s2));
237dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(-1, sadShort2ShortAlt(s2, s1));
238dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(-1, sadShort2ShortAlt2(s1, s2));
239dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(-1, sadShort2ShortAlt2(s2, s1));
240dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65535, sadShort2Int(s1, s2));
241dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65535, sadShort2Int(s2, s1));
242dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65535, sadShort2IntAlt(s1, s2));
243dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65535, sadShort2IntAlt(s2, s1));
244dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65535, sadShort2IntAlt2(s1, s2));
245dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65535, sadShort2IntAlt2(s2, s1));
246dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65535L, sadShort2Long(s1, s2));
247dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65535L, sadShort2Long(s2, s1));
248dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65536L, sadShort2LongAt1(s1, s2));
249dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(65536L, sadShort2LongAt1(s2, s1));
250dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
251dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    // Use cross-values to test all cases.
252dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    short[] interesting = {
253dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      (short) 0x0000,
254dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      (short) 0x0001,
255dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      (short) 0x0002,
256dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      (short) 0x1234,
257dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      (short) 0x8000,
258dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      (short) 0x8001,
259dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      (short) 0x7fff,
260dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      (short) 0xffff
261dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    };
262dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int n = interesting.length;
263dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int m = n * n + 1;
264dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    s1 = new short[m];
265dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    s2 = new short[m];
266dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    int k = 0;
267dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    for (int i = 0; i < n; i++) {
268dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      for (int j = 0; j < n; j++) {
269dbbac8f812a866b1b53f3007721f66038d208549Aart Bik        s1[k] = interesting[i];
270dbbac8f812a866b1b53f3007721f66038d208549Aart Bik        s2[k] = interesting[j];
271dbbac8f812a866b1b53f3007721f66038d208549Aart Bik        k++;
272dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      }
273dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
274dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    s1[k] = 10;
275dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    s2[k] = 2;
276dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(-18932, sadShort2Short(s1, s2));
277dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(-18932, sadShort2ShortAlt(s1, s2));
278dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(-18932, sadShort2ShortAlt2(s1, s2));
279dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(1291788, sadShort2Int(s1, s2));
280dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(1291788, sadShort2IntAlt(s1, s2));
281dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(1291788, sadShort2IntAlt2(s1, s2));
282dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(1291788L, sadShort2Long(s1, s2));
283dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    expectEquals(1291789L, sadShort2LongAt1(s1, s2));
284dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
285dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    System.out.println("passed");
286dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
287dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
288dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static void expectEquals(int expected, int result) {
289dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    if (expected != result) {
290dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      throw new Error("Expected: " + expected + ", found: " + result);
291dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
292dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
293dbbac8f812a866b1b53f3007721f66038d208549Aart Bik
294dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  private static void expectEquals(long expected, long result) {
295dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    if (expected != result) {
296dbbac8f812a866b1b53f3007721f66038d208549Aart Bik      throw new Error("Expected: " + expected + ", found: " + result);
297dbbac8f812a866b1b53f3007721f66038d208549Aart Bik    }
298dbbac8f812a866b1b53f3007721f66038d208549Aart Bik  }
299dbbac8f812a866b1b53f3007721f66038d208549Aart Bik}
300