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 ABS vectorization. 19*795d594fSAndroid Build Coastguard Worker */ 20*795d594fSAndroid Build Coastguard Worker public class Main { 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker private final static boolean isDalvik = 23*795d594fSAndroid Build Coastguard Worker System.getProperty("java.vm.name").equals("Dalvik"); 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker private static final int SPQUIET = 1 << 22; 26*795d594fSAndroid Build Coastguard Worker private static final long DPQUIET = 1L << 51; 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.doitByte(byte[]) loop_optimization (before) 29*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none 30*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none 31*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none 32*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none 33*795d594fSAndroid Build Coastguard Worker // 34*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.doitByte(byte[]) loop_optimization (after) 35*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 36*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 37*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 38*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 39*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 40*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 41*795d594fSAndroid Build Coastguard Worker // 42*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 43*795d594fSAndroid Build Coastguard Worker // 44*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.doitByte(byte[]) loop_optimization (after) 45*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 46*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 47*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 48*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 49*795d594fSAndroid Build Coastguard Worker // 50*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none 51*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 52*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs 53*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArraySet 54*795d594fSAndroid Build Coastguard Worker // 55*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 56*795d594fSAndroid Build Coastguard Worker // 57*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 58*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 59*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 60*795d594fSAndroid Build Coastguard Worker // 61*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 62*795d594fSAndroid Build Coastguard Worker // 63*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: 64*795d594fSAndroid Build Coastguard Worker // doitByte(byte[] x)65*795d594fSAndroid Build Coastguard Worker private static void doitByte(byte[] x) { 66*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 67*795d594fSAndroid Build Coastguard Worker x[i] = (byte) Math.abs(x[i]); 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker } 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.doitChar(char[]) loop_optimization (before) 72*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs 73*795d594fSAndroid Build Coastguard Worker // 74*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.doitChar(char[]) loop_optimization (after) 75*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: VecAbs doitChar(char[] x)76*795d594fSAndroid Build Coastguard Worker private static void doitChar(char[] x) { 77*795d594fSAndroid Build Coastguard Worker // Basically a nop due to zero extension. 78*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 79*795d594fSAndroid Build Coastguard Worker x[i] = (char) Math.abs(x[i]); 80*795d594fSAndroid Build Coastguard Worker } 81*795d594fSAndroid Build Coastguard Worker } 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.doitShort(short[]) loop_optimization (before) 84*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none 85*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none 86*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none 87*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none 88*795d594fSAndroid Build Coastguard Worker // 89*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.doitShort(short[]) loop_optimization (after) 90*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 91*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 92*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 93*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 94*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 95*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 96*795d594fSAndroid Build Coastguard Worker // 97*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 98*795d594fSAndroid Build Coastguard Worker // 99*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.doitShort(short[]) loop_optimization (after) 100*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 101*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 102*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 103*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 104*795d594fSAndroid Build Coastguard Worker // 105*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none 106*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 107*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs 108*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArraySet 109*795d594fSAndroid Build Coastguard Worker // 110*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 111*795d594fSAndroid Build Coastguard Worker // 112*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 113*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 114*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 115*795d594fSAndroid Build Coastguard Worker // 116*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 117*795d594fSAndroid Build Coastguard Worker // 118*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: doitShort(short[] x)119*795d594fSAndroid Build Coastguard Worker private static void doitShort(short[] x) { 120*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 121*795d594fSAndroid Build Coastguard Worker x[i] = (short) Math.abs(x[i]); 122*795d594fSAndroid Build Coastguard Worker } 123*795d594fSAndroid Build Coastguard Worker } 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.doitCastChar(char[]) loop_optimization (before) 126*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none 127*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none 128*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none 129*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none 130*795d594fSAndroid Build Coastguard Worker // 131*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.doitCastChar(char[]) loop_optimization (after) 132*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 133*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 134*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 135*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 136*795d594fSAndroid Build Coastguard Worker // 137*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none 138*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 139*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs 140*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArraySet 141*795d594fSAndroid Build Coastguard Worker // 142*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 143*795d594fSAndroid Build Coastguard Worker // 144*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 145*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 146*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 147*795d594fSAndroid Build Coastguard Worker // 148*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 149*795d594fSAndroid Build Coastguard Worker // 150*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: doitCastChar(char[] x)151*795d594fSAndroid Build Coastguard Worker private static void doitCastChar(char[] x) { 152*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 153*795d594fSAndroid Build Coastguard Worker x[i] = (char) Math.abs((short) x[i]); 154*795d594fSAndroid Build Coastguard Worker } 155*795d594fSAndroid Build Coastguard Worker } 156*795d594fSAndroid Build Coastguard Worker 157*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.doitInt(int[]) loop_optimization (before) 158*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none 159*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none 160*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none 161*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none 162*795d594fSAndroid Build Coastguard Worker // 163*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM: void Main.doitInt(int[]) loop_optimization (after) 164*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 165*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 166*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 167*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 168*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 169*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 170*795d594fSAndroid Build Coastguard Worker // 171*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 172*795d594fSAndroid Build Coastguard Worker // 173*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.doitInt(int[]) loop_optimization (after) 174*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 175*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 176*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 177*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 178*795d594fSAndroid Build Coastguard Worker // 179*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none 180*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 181*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs 182*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArraySet 183*795d594fSAndroid Build Coastguard Worker // 184*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 185*795d594fSAndroid Build Coastguard Worker // 186*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 187*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 188*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 189*795d594fSAndroid Build Coastguard Worker // 190*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 191*795d594fSAndroid Build Coastguard Worker // 192*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: doitInt(int[] x)193*795d594fSAndroid Build Coastguard Worker private static void doitInt(int[] x) { 194*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 195*795d594fSAndroid Build Coastguard Worker x[i] = Math.abs(x[i]); 196*795d594fSAndroid Build Coastguard Worker } 197*795d594fSAndroid Build Coastguard Worker } 198*795d594fSAndroid Build Coastguard Worker 199*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.doitLong(long[]) loop_optimization (before) 200*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none 201*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none 202*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none 203*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none 204*795d594fSAndroid Build Coastguard Worker // 205*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.doitLong(long[]) loop_optimization (after) 206*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 207*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 208*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 209*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 210*795d594fSAndroid Build Coastguard Worker // 211*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none 212*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 213*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs 214*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArraySet 215*795d594fSAndroid Build Coastguard Worker // 216*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 217*795d594fSAndroid Build Coastguard Worker // 218*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 219*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 220*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 221*795d594fSAndroid Build Coastguard Worker // 222*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 223*795d594fSAndroid Build Coastguard Worker // 224*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: doitLong(long[] x)225*795d594fSAndroid Build Coastguard Worker private static void doitLong(long[] x) { 226*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 227*795d594fSAndroid Build Coastguard Worker x[i] = Math.abs(x[i]); 228*795d594fSAndroid Build Coastguard Worker } 229*795d594fSAndroid Build Coastguard Worker } 230*795d594fSAndroid Build Coastguard Worker 231*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.doitFloat(float[]) loop_optimization (before) 232*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none 233*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none 234*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none 235*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none 236*795d594fSAndroid Build Coastguard Worker // 237*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.doitFloat(float[]) loop_optimization (after) 238*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 239*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 240*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 241*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 242*795d594fSAndroid Build Coastguard Worker // 243*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none 244*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 245*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs 246*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArraySet 247*795d594fSAndroid Build Coastguard Worker // 248*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 249*795d594fSAndroid Build Coastguard Worker // 250*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 251*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 252*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 253*795d594fSAndroid Build Coastguard Worker // 254*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 255*795d594fSAndroid Build Coastguard Worker // 256*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: doitFloat(float[] x)257*795d594fSAndroid Build Coastguard Worker private static void doitFloat(float[] x) { 258*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 259*795d594fSAndroid Build Coastguard Worker x[i] = Math.abs(x[i]); 260*795d594fSAndroid Build Coastguard Worker } 261*795d594fSAndroid Build Coastguard Worker } 262*795d594fSAndroid Build Coastguard Worker 263*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.doitDouble(double[]) loop_optimization (before) 264*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none 265*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop>> outer_loop:none 266*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop>> outer_loop:none 267*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop>> outer_loop:none 268*795d594fSAndroid Build Coastguard Worker // 269*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: void Main.doitDouble(double[]) loop_optimization (after) 270*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecLoad loop:<<Loop1:B\d+>> outer_loop:none 271*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecAbs loop:<<Loop1>> outer_loop:none 272*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecStore loop:<<Loop1>> outer_loop:none 273*795d594fSAndroid Build Coastguard Worker /// CHECK-IF: hasIsaFeature("sve") and os.environ.get('ART_FORCE_TRY_PREDICATED_SIMD') == 'true' 274*795d594fSAndroid Build Coastguard Worker // 275*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: VecPredWhile loop:<<Loop1>> outer_loop:none 276*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArrayGet 277*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs 278*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ArraySet 279*795d594fSAndroid Build Coastguard Worker // 280*795d594fSAndroid Build Coastguard Worker /// CHECK-ELSE: 281*795d594fSAndroid Build Coastguard Worker // 282*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArrayGet loop:<<Loop2:B\d+>> outer_loop:none 283*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Abs loop:<<Loop2>> outer_loop:none 284*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: ArraySet loop:<<Loop2>> outer_loop:none 285*795d594fSAndroid Build Coastguard Worker // 286*795d594fSAndroid Build Coastguard Worker /// CHECK-EVAL: "<<Loop1>>" != "<<Loop2>>" 287*795d594fSAndroid Build Coastguard Worker // 288*795d594fSAndroid Build Coastguard Worker /// CHECK-FI: doitDouble(double[] x)289*795d594fSAndroid Build Coastguard Worker private static void doitDouble(double[] x) { 290*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < x.length; i++) { 291*795d594fSAndroid Build Coastguard Worker x[i] = Math.abs(x[i]); 292*795d594fSAndroid Build Coastguard Worker } 293*795d594fSAndroid Build Coastguard Worker } 294*795d594fSAndroid Build Coastguard Worker main(String[] args)295*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 296*795d594fSAndroid Build Coastguard Worker // Bytes, chars, shorts. 297*795d594fSAndroid Build Coastguard Worker byte[] xb = new byte[256]; 298*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 256; i++) { 299*795d594fSAndroid Build Coastguard Worker xb[i] = (byte) i; 300*795d594fSAndroid Build Coastguard Worker } 301*795d594fSAndroid Build Coastguard Worker doitByte(xb); 302*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 256; i++) { 303*795d594fSAndroid Build Coastguard Worker expectEquals32((byte) Math.abs((byte) i), xb[i]); 304*795d594fSAndroid Build Coastguard Worker } 305*795d594fSAndroid Build Coastguard Worker char[] xc = new char[1024 * 64]; 306*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 1024 * 64; i++) { 307*795d594fSAndroid Build Coastguard Worker xc[i] = (char) i; 308*795d594fSAndroid Build Coastguard Worker } 309*795d594fSAndroid Build Coastguard Worker doitChar(xc); 310*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 1024 * 64; i++) { 311*795d594fSAndroid Build Coastguard Worker expectEquals32((char) Math.abs((char) i), xc[i]); 312*795d594fSAndroid Build Coastguard Worker } 313*795d594fSAndroid Build Coastguard Worker short[] xs = new short[1024 * 64]; 314*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 1024 * 64; i++) { 315*795d594fSAndroid Build Coastguard Worker xs[i] = (short) i; 316*795d594fSAndroid Build Coastguard Worker } 317*795d594fSAndroid Build Coastguard Worker doitShort(xs); 318*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 1024 * 64; i++) { 319*795d594fSAndroid Build Coastguard Worker expectEquals32((short) Math.abs((short) i), xs[i]); 320*795d594fSAndroid Build Coastguard Worker } 321*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 1024 * 64; i++) { 322*795d594fSAndroid Build Coastguard Worker xc[i] = (char) i; 323*795d594fSAndroid Build Coastguard Worker } 324*795d594fSAndroid Build Coastguard Worker doitCastChar(xc); 325*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 1024 * 64; i++) { 326*795d594fSAndroid Build Coastguard Worker expectEquals32((char) Math.abs((short) i), xc[i]); 327*795d594fSAndroid Build Coastguard Worker } 328*795d594fSAndroid Build Coastguard Worker // Set up minint32, maxint32 and some others. 329*795d594fSAndroid Build Coastguard Worker int[] xi = new int[8]; 330*795d594fSAndroid Build Coastguard Worker xi[0] = 0x80000000; 331*795d594fSAndroid Build Coastguard Worker xi[1] = 0x7fffffff; 332*795d594fSAndroid Build Coastguard Worker xi[2] = 0x80000001; 333*795d594fSAndroid Build Coastguard Worker xi[3] = -13; 334*795d594fSAndroid Build Coastguard Worker xi[4] = -1; 335*795d594fSAndroid Build Coastguard Worker xi[5] = 0; 336*795d594fSAndroid Build Coastguard Worker xi[6] = 1; 337*795d594fSAndroid Build Coastguard Worker xi[7] = 999; 338*795d594fSAndroid Build Coastguard Worker doitInt(xi); 339*795d594fSAndroid Build Coastguard Worker expectEquals32(0x80000000, xi[0]); 340*795d594fSAndroid Build Coastguard Worker expectEquals32(0x7fffffff, xi[1]); 341*795d594fSAndroid Build Coastguard Worker expectEquals32(0x7fffffff, xi[2]); 342*795d594fSAndroid Build Coastguard Worker expectEquals32(13, xi[3]); 343*795d594fSAndroid Build Coastguard Worker expectEquals32(1, xi[4]); 344*795d594fSAndroid Build Coastguard Worker expectEquals32(0, xi[5]); 345*795d594fSAndroid Build Coastguard Worker expectEquals32(1, xi[6]); 346*795d594fSAndroid Build Coastguard Worker expectEquals32(999, xi[7]); 347*795d594fSAndroid Build Coastguard Worker 348*795d594fSAndroid Build Coastguard Worker // Set up minint64, maxint64 and some others. 349*795d594fSAndroid Build Coastguard Worker long[] xl = new long[8]; 350*795d594fSAndroid Build Coastguard Worker xl[0] = 0x8000000000000000L; 351*795d594fSAndroid Build Coastguard Worker xl[1] = 0x7fffffffffffffffL; 352*795d594fSAndroid Build Coastguard Worker xl[2] = 0x8000000000000001L; 353*795d594fSAndroid Build Coastguard Worker xl[3] = -13; 354*795d594fSAndroid Build Coastguard Worker xl[4] = -1; 355*795d594fSAndroid Build Coastguard Worker xl[5] = 0; 356*795d594fSAndroid Build Coastguard Worker xl[6] = 1; 357*795d594fSAndroid Build Coastguard Worker xl[7] = 999; 358*795d594fSAndroid Build Coastguard Worker doitLong(xl); 359*795d594fSAndroid Build Coastguard Worker expectEquals64(0x8000000000000000L, xl[0]); 360*795d594fSAndroid Build Coastguard Worker expectEquals64(0x7fffffffffffffffL, xl[1]); 361*795d594fSAndroid Build Coastguard Worker expectEquals64(0x7fffffffffffffffL, xl[2]); 362*795d594fSAndroid Build Coastguard Worker expectEquals64(13, xl[3]); 363*795d594fSAndroid Build Coastguard Worker expectEquals64(1, xl[4]); 364*795d594fSAndroid Build Coastguard Worker expectEquals64(0, xl[5]); 365*795d594fSAndroid Build Coastguard Worker expectEquals64(1, xl[6]); 366*795d594fSAndroid Build Coastguard Worker expectEquals64(999, xl[7]); 367*795d594fSAndroid Build Coastguard Worker 368*795d594fSAndroid Build Coastguard Worker // Set up float NaN and some others. 369*795d594fSAndroid Build Coastguard Worker float[] xf = new float[16]; 370*795d594fSAndroid Build Coastguard Worker xf[0] = Float.intBitsToFloat(0x7f800001); 371*795d594fSAndroid Build Coastguard Worker xf[1] = Float.intBitsToFloat(0x7fa00000); 372*795d594fSAndroid Build Coastguard Worker xf[2] = Float.intBitsToFloat(0x7fc00000); 373*795d594fSAndroid Build Coastguard Worker xf[3] = Float.intBitsToFloat(0x7fffffff); 374*795d594fSAndroid Build Coastguard Worker xf[4] = Float.intBitsToFloat(0xff800001); 375*795d594fSAndroid Build Coastguard Worker xf[5] = Float.intBitsToFloat(0xffa00000); 376*795d594fSAndroid Build Coastguard Worker xf[6] = Float.intBitsToFloat(0xffc00000); 377*795d594fSAndroid Build Coastguard Worker xf[7] = Float.intBitsToFloat(0xffffffff); 378*795d594fSAndroid Build Coastguard Worker xf[8] = Float.NEGATIVE_INFINITY; 379*795d594fSAndroid Build Coastguard Worker xf[9] = -99.2f; 380*795d594fSAndroid Build Coastguard Worker xf[10] = -1.0f; 381*795d594fSAndroid Build Coastguard Worker xf[11] = -0.0f; 382*795d594fSAndroid Build Coastguard Worker xf[12] = +0.0f; 383*795d594fSAndroid Build Coastguard Worker xf[13] = +1.0f; 384*795d594fSAndroid Build Coastguard Worker xf[14] = +99.2f; 385*795d594fSAndroid Build Coastguard Worker xf[15] = Float.POSITIVE_INFINITY; 386*795d594fSAndroid Build Coastguard Worker doitFloat(xf); 387*795d594fSAndroid Build Coastguard Worker expectEqualsNaN32(0x7f800001, Float.floatToRawIntBits(xf[0])); 388*795d594fSAndroid Build Coastguard Worker expectEqualsNaN32(0x7fa00000, Float.floatToRawIntBits(xf[1])); 389*795d594fSAndroid Build Coastguard Worker expectEqualsNaN32(0x7fc00000, Float.floatToRawIntBits(xf[2])); 390*795d594fSAndroid Build Coastguard Worker expectEqualsNaN32(0x7fffffff, Float.floatToRawIntBits(xf[3])); 391*795d594fSAndroid Build Coastguard Worker expectEqualsNaN32(0x7f800001, Float.floatToRawIntBits(xf[4])); 392*795d594fSAndroid Build Coastguard Worker expectEqualsNaN32(0x7fa00000, Float.floatToRawIntBits(xf[5])); 393*795d594fSAndroid Build Coastguard Worker expectEqualsNaN32(0x7fc00000, Float.floatToRawIntBits(xf[6])); 394*795d594fSAndroid Build Coastguard Worker expectEqualsNaN32(0x7fffffff, Float.floatToRawIntBits(xf[7])); 395*795d594fSAndroid Build Coastguard Worker expectEquals32( 396*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(Float.POSITIVE_INFINITY), 397*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(xf[8])); 398*795d594fSAndroid Build Coastguard Worker expectEquals32( 399*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(99.2f), 400*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(xf[9])); 401*795d594fSAndroid Build Coastguard Worker expectEquals32( 402*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(1.0f), 403*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(xf[10])); 404*795d594fSAndroid Build Coastguard Worker expectEquals32(0, Float.floatToRawIntBits(xf[11])); 405*795d594fSAndroid Build Coastguard Worker expectEquals32(0, Float.floatToRawIntBits(xf[12])); 406*795d594fSAndroid Build Coastguard Worker expectEquals32( 407*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(1.0f), 408*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(xf[13])); 409*795d594fSAndroid Build Coastguard Worker expectEquals32( 410*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(99.2f), 411*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(xf[14])); 412*795d594fSAndroid Build Coastguard Worker expectEquals32( 413*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(Float.POSITIVE_INFINITY), 414*795d594fSAndroid Build Coastguard Worker Float.floatToRawIntBits(xf[15])); 415*795d594fSAndroid Build Coastguard Worker 416*795d594fSAndroid Build Coastguard Worker // Set up double NaN and some others. 417*795d594fSAndroid Build Coastguard Worker double[] xd = new double[16]; 418*795d594fSAndroid Build Coastguard Worker xd[0] = Double.longBitsToDouble(0x7ff0000000000001L); 419*795d594fSAndroid Build Coastguard Worker xd[1] = Double.longBitsToDouble(0x7ff4000000000000L); 420*795d594fSAndroid Build Coastguard Worker xd[2] = Double.longBitsToDouble(0x7ff8000000000000L); 421*795d594fSAndroid Build Coastguard Worker xd[3] = Double.longBitsToDouble(0x7fffffffffffffffL); 422*795d594fSAndroid Build Coastguard Worker xd[4] = Double.longBitsToDouble(0xfff0000000000001L); 423*795d594fSAndroid Build Coastguard Worker xd[5] = Double.longBitsToDouble(0xfff4000000000000L); 424*795d594fSAndroid Build Coastguard Worker xd[6] = Double.longBitsToDouble(0xfff8000000000000L); 425*795d594fSAndroid Build Coastguard Worker xd[7] = Double.longBitsToDouble(0xffffffffffffffffL); 426*795d594fSAndroid Build Coastguard Worker xd[8] = Double.NEGATIVE_INFINITY; 427*795d594fSAndroid Build Coastguard Worker xd[9] = -99.2f; 428*795d594fSAndroid Build Coastguard Worker xd[10] = -1.0f; 429*795d594fSAndroid Build Coastguard Worker xd[11] = -0.0f; 430*795d594fSAndroid Build Coastguard Worker xd[12] = +0.0f; 431*795d594fSAndroid Build Coastguard Worker xd[13] = +1.0f; 432*795d594fSAndroid Build Coastguard Worker xd[14] = +99.2f; 433*795d594fSAndroid Build Coastguard Worker xd[15] = Double.POSITIVE_INFINITY; 434*795d594fSAndroid Build Coastguard Worker doitDouble(xd); 435*795d594fSAndroid Build Coastguard Worker expectEqualsNaN64(0x7ff0000000000001L, Double.doubleToRawLongBits(xd[0])); 436*795d594fSAndroid Build Coastguard Worker expectEqualsNaN64(0x7ff4000000000000L, Double.doubleToRawLongBits(xd[1])); 437*795d594fSAndroid Build Coastguard Worker expectEqualsNaN64(0x7ff8000000000000L, Double.doubleToRawLongBits(xd[2])); 438*795d594fSAndroid Build Coastguard Worker expectEqualsNaN64(0x7fffffffffffffffL, Double.doubleToRawLongBits(xd[3])); 439*795d594fSAndroid Build Coastguard Worker expectEqualsNaN64(0x7ff0000000000001L, Double.doubleToRawLongBits(xd[4])); 440*795d594fSAndroid Build Coastguard Worker expectEqualsNaN64(0x7ff4000000000000L, Double.doubleToRawLongBits(xd[5])); 441*795d594fSAndroid Build Coastguard Worker expectEqualsNaN64(0x7ff8000000000000L, Double.doubleToRawLongBits(xd[6])); 442*795d594fSAndroid Build Coastguard Worker expectEqualsNaN64(0x7fffffffffffffffL, Double.doubleToRawLongBits(xd[7])); 443*795d594fSAndroid Build Coastguard Worker expectEquals64( 444*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(Double.POSITIVE_INFINITY), 445*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(xd[8])); 446*795d594fSAndroid Build Coastguard Worker expectEquals64( 447*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(99.2f), 448*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(xd[9])); 449*795d594fSAndroid Build Coastguard Worker expectEquals64( 450*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(1.0f), 451*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(xd[10])); 452*795d594fSAndroid Build Coastguard Worker expectEquals64(0, Double.doubleToRawLongBits(xd[11])); 453*795d594fSAndroid Build Coastguard Worker expectEquals64(0, Double.doubleToRawLongBits(xd[12])); 454*795d594fSAndroid Build Coastguard Worker expectEquals64( 455*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(1.0f), 456*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(xd[13])); 457*795d594fSAndroid Build Coastguard Worker expectEquals64( 458*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(99.2f), 459*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(xd[14])); 460*795d594fSAndroid Build Coastguard Worker expectEquals64( 461*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(Double.POSITIVE_INFINITY), 462*795d594fSAndroid Build Coastguard Worker Double.doubleToRawLongBits(xd[15])); 463*795d594fSAndroid Build Coastguard Worker 464*795d594fSAndroid Build Coastguard Worker System.out.println("passed"); 465*795d594fSAndroid Build Coastguard Worker } 466*795d594fSAndroid Build Coastguard Worker expectEquals32(int expected, int result)467*795d594fSAndroid Build Coastguard Worker private static void expectEquals32(int expected, int result) { 468*795d594fSAndroid Build Coastguard Worker if (expected != result) { 469*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 470*795d594fSAndroid Build Coastguard Worker } 471*795d594fSAndroid Build Coastguard Worker } 472*795d594fSAndroid Build Coastguard Worker expectEquals64(long expected, long result)473*795d594fSAndroid Build Coastguard Worker private static void expectEquals64(long expected, long result) { 474*795d594fSAndroid Build Coastguard Worker if (expected != result) { 475*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 476*795d594fSAndroid Build Coastguard Worker } 477*795d594fSAndroid Build Coastguard Worker } 478*795d594fSAndroid Build Coastguard Worker 479*795d594fSAndroid Build Coastguard Worker // We allow that an expected NaN result has become quiet. expectEqualsNaN32(int expected, int result)480*795d594fSAndroid Build Coastguard Worker private static void expectEqualsNaN32(int expected, int result) { 481*795d594fSAndroid Build Coastguard Worker if (expected != result && (expected | SPQUIET) != result) { 482*795d594fSAndroid Build Coastguard Worker if (!isDalvik) { 483*795d594fSAndroid Build Coastguard Worker // If not on ART, relax the expected value more towards just 484*795d594fSAndroid Build Coastguard Worker // "spec compliance" and allow sign bit to remain set for NaN. 485*795d594fSAndroid Build Coastguard Worker if (expected == (result & Integer.MAX_VALUE)) { 486*795d594fSAndroid Build Coastguard Worker return; 487*795d594fSAndroid Build Coastguard Worker } 488*795d594fSAndroid Build Coastguard Worker } 489*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: 0x" + Integer.toHexString(expected) 490*795d594fSAndroid Build Coastguard Worker + ", found: 0x" + Integer.toHexString(result)); 491*795d594fSAndroid Build Coastguard Worker } 492*795d594fSAndroid Build Coastguard Worker } 493*795d594fSAndroid Build Coastguard Worker 494*795d594fSAndroid Build Coastguard Worker // We allow that an expected NaN result has become quiet. expectEqualsNaN64(long expected, long result)495*795d594fSAndroid Build Coastguard Worker private static void expectEqualsNaN64(long expected, long result) { 496*795d594fSAndroid Build Coastguard Worker if (expected != result && (expected | DPQUIET) != result) { 497*795d594fSAndroid Build Coastguard Worker if (!isDalvik) { 498*795d594fSAndroid Build Coastguard Worker // If not on ART, relax the expected value more towards just 499*795d594fSAndroid Build Coastguard Worker // "spec compliance" and allow sign bit to remain set for NaN. 500*795d594fSAndroid Build Coastguard Worker if (expected == (result & Long.MAX_VALUE)) { 501*795d594fSAndroid Build Coastguard Worker return; 502*795d594fSAndroid Build Coastguard Worker } 503*795d594fSAndroid Build Coastguard Worker } 504*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: 0x" + Long.toHexString(expected) 505*795d594fSAndroid Build Coastguard Worker + ", found: 0x" + Long.toHexString(result)); 506*795d594fSAndroid Build Coastguard Worker } 507*795d594fSAndroid Build Coastguard Worker } 508*795d594fSAndroid Build Coastguard Worker } 509