xref: /aosp_15_r20/art/test/645-checker-abs-simd/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker /**
18*795d594fSAndroid Build Coastguard Worker  * Tests for 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