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