blob: a08b1f09b48c9868682a2a7f641ea7f9d322bf7a [file] [log] [blame]
Artem Serove1811ed2017-04-27 16:50:47 +01001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17public class Main {
18
19 public static void assertIntEquals(int expected, int result) {
20 if (expected != result) {
21 throw new Error("Expected: " + expected + ", found: " + result);
22 }
23 }
24
25 /// CHECK-START-ARM64: void Main.checkIntCase(int[]) instruction_simplifier_arm64 (before)
26 /// CHECK-DAG: <<Array:l\d+>> ParameterValue
27 /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
Artem Serov2558abe2020-10-14 18:01:37 +010028 /// CHECK-IF: hasIsaFeature("sve")
29 //
30 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}]
31 // -------------- Loop
32 /// CHECK-DAG: <<Index:i\d+>> Phi
33 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
34 /// CHECK-DAG: If
35 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Index>>,<<LoopP>>]
36 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>]
37 /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Add>>,<<LoopP>>]
38 //
39 /// CHECK-ELSE:
40 //
41 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>]
42 // -------------- Loop
43 /// CHECK-DAG: <<Index:i\d+>> Phi
44 /// CHECK-DAG: If
45 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Index>>]
46 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>]
47 /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Add>>]
48 //
49 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +010050
51 /// CHECK-START-ARM64: void Main.checkIntCase(int[]) instruction_simplifier_arm64 (after)
52 /// CHECK-DAG: <<Array:l\d+>> ParameterValue
53 /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
Artem Serov2558abe2020-10-14 18:01:37 +010054 /// CHECK-IF: hasIsaFeature("sve")
55 //
56 // IntermediateAddressIndex is not supported for SVE.
57 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}]
58 // -------------- Loop
59 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
60 /// CHECK-DAG: <<Index:i\d+>> Phi
61 /// CHECK-DAG: If
Raphael Gault0700b692020-09-30 08:33:10 +000062 /// CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}]
63 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr1>>,<<Index>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +010064 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>]
Raphael Gault0700b692020-09-30 08:33:10 +000065 /// CHECK-DAG: <<IntAddr2:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}]
66 /// CHECK-DAG: VecStore [<<IntAddr2>>,<<Index>>,<<Add>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +010067 //
68 /// CHECK-ELSE:
69 //
70 /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
71 /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12
72 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>]
73 // -------------- Loop
74 /// CHECK-DAG: <<Index:i\d+>> Phi
75 /// CHECK-DAG: If
76 /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>]
77 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Address1>>]
78 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>]
79 /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>]
80 /// CHECK-DAG: VecStore [<<Array>>,<<Address2>>,<<Add>>]
81 //
82 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +010083
84 /// CHECK-START-ARM64: void Main.checkIntCase(int[]) GVN$after_arch (after)
85 /// CHECK-DAG: <<Array:l\d+>> ParameterValue
86 /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
Artem Serov2558abe2020-10-14 18:01:37 +010087 /// CHECK-IF: hasIsaFeature("sve")
88 //
89 // IntermediateAddressIndex is not supported for SVE.
90 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}]
91 // -------------- Loop
92 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
93 /// CHECK-DAG: <<Index:i\d+>> Phi
94 /// CHECK-DAG: If
Raphael Gault0700b692020-09-30 08:33:10 +000095 /// CHECK-DAG: <<IntAddr:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}]
96 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr>>,<<Index>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +010097 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>]
Raphael Gault0700b692020-09-30 08:33:10 +000098 /// CHECK-DAG: VecStore [<<IntAddr>>,<<Index>>,<<Add>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +010099 //
100 /// CHECK-ELSE:
101 //
102 /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12
103 /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
104 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>]
105 // -------------- Loop
106 /// CHECK-DAG: <<Index:i\d+>> Phi
107 /// CHECK-DAG: If
108 /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>]
109 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Address1>>]
110 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>]
111 /// CHECK-NOT: IntermediateAddress
112 /// CHECK-DAG: VecStore [<<Array>>,<<Address1>>,<<Add>>]
113 //
114 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100115
116 /// CHECK-START-ARM64: void Main.checkIntCase(int[]) disassembly (after)
Artem Serov2558abe2020-10-14 18:01:37 +0100117 /// CHECK-IF: hasIsaFeature("sve")
118 //
119 // IntermediateAddressIndex is not supported for SVE.
120 /// CHECK-NOT: IntermediateAddressIndex
Artem Serov2558abe2020-10-14 18:01:37 +0100121 //
122 /// CHECK-ELSE:
123 //
124 /// CHECK: IntermediateAddressIndex
125 /// CHECK-NEXT: add w{{[0-9]+}}, w{{[0-9]+}}, w{{[0-9]+}}, lsl #2
126 //
127 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100128 public static void checkIntCase(int[] a) {
129 for (int i = 0; i < 128; i++) {
130 a[i] += 5;
131 }
132 }
133
134 /// CHECK-START-ARM64: void Main.checkByteCase(byte[]) instruction_simplifier_arm64 (before)
135 /// CHECK-DAG: <<Array:l\d+>> ParameterValue
136 /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
Artem Serov2558abe2020-10-14 18:01:37 +0100137 /// CHECK-IF: hasIsaFeature("sve")
138 //
139 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}]
140 // -------------- Loop
141 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
142 /// CHECK-DAG: <<Index:i\d+>> Phi
143 /// CHECK-DAG: If
144 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Index>>,<<LoopP>>]
145 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>]
146 /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Add>>,<<LoopP>>]
147 //
148 /// CHECK-ELSE:
149 //
150 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>]
151 // -------------- Loop
152 /// CHECK-DAG: <<Index:i\d+>> Phi
153 /// CHECK-DAG: If
154 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Index>>]
155 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>]
156
157 //
158 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100159
160 /// CHECK-START-ARM64: void Main.checkByteCase(byte[]) instruction_simplifier_arm64 (after)
161 /// CHECK-DAG: <<Array:l\d+>> ParameterValue
162 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
163 /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
Artem Serov2558abe2020-10-14 18:01:37 +0100164 /// CHECK-IF: hasIsaFeature("sve")
165 //
166 // IntermediateAddressIndex is not supported for SVE.
167 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}]
168 // -------------- Loop
169 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
170 /// CHECK-DAG: <<Index:i\d+>> Phi
171 /// CHECK-DAG: If
Raphael Gault0700b692020-09-30 08:33:10 +0000172 /// CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}]
173 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr1>>,<<Index>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +0100174 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>]
Raphael Gault0700b692020-09-30 08:33:10 +0000175 /// CHECK-DAG: <<IntAddr2:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}]
176 /// CHECK-DAG: VecStore [<<IntAddr2>>,<<Index>>,<<Add>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +0100177 //
178 /// CHECK-ELSE:
179 //
180 /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12
181 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>]
182 // -------------- Loop
183 /// CHECK-DAG: <<Index:i\d+>> Phi
184 /// CHECK-DAG: If
185 /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const0>>]
186 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Address1>>]
187 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>]
188 /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const0>>]
189 /// CHECK-DAG: VecStore [<<Array>>,<<Address2>>,<<Add>>]
190 //
191 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100192
193 /// CHECK-START-ARM64: void Main.checkByteCase(byte[]) GVN$after_arch (after)
194 /// CHECK-DAG: <<Array:l\d+>> ParameterValue
195 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
196 /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
Artem Serov2558abe2020-10-14 18:01:37 +0100197 /// CHECK-IF: hasIsaFeature("sve")
198 //
199 // IntermediateAddressIndex is not supported for SVE.
200 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}]
201 // -------------- Loop
202 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
203 /// CHECK-DAG: <<Index:i\d+>> Phi
204 /// CHECK-DAG: If
Raphael Gault0700b692020-09-30 08:33:10 +0000205 /// CHECK-DAG: <<IntAddr:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}]
206 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr>>,<<Index>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +0100207 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>,<<LoopP>>]
Raphael Gault0700b692020-09-30 08:33:10 +0000208 /// CHECK-DAG: VecStore [<<IntAddr>>,<<Index>>,<<Add>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +0100209 //
210 /// CHECK-ELSE:
211 //
212 /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12
213 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>]
214 // -------------- Loop
215 /// CHECK-DAG: <<Index:i\d+>> Phi
216 /// CHECK-DAG: If
217 /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const0>>]
218 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array>>,<<Address1>>]
219 /// CHECK-DAG: <<Add:d\d+>> VecAdd [<<Load>>,<<Repl>>]
220 /// CHECK-NOT: IntermediateAddress
221 /// CHECK-DAG: VecStore [<<Array>>,<<Address1>>,<<Add>>]
222 //
223 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100224
225 /// CHECK-START-ARM64: void Main.checkByteCase(byte[]) disassembly (after)
Artem Serov2558abe2020-10-14 18:01:37 +0100226 /// CHECK-IF: hasIsaFeature("sve")
227 //
228 // IntermediateAddressIndex is not supported for SVE.
229 /// CHECK-NOT: IntermediateAddressIndex
Artem Serov2558abe2020-10-14 18:01:37 +0100230 //
231 /// CHECK-ELSE:
232 //
233 /// CHECK: IntermediateAddressIndex
234 /// CHECK-NEXT: add w{{[0-9]+}}, w{{[0-9]+}}, #0x{{[0-9a-fA-F]+}}
235 /// CHECK: VecLoad
236 /// CHECK-NEXT: ldr q{{[0-9]+}}, [x{{[0-9]+}}, x{{[0-9]+}}]
237 /// CHECK: VecStore
238 /// CHECK-NEXT: str q{{[0-9]+}}, [x{{[0-9]+}}, x{{[0-9]+}}]
239 //
240 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100241 public static void checkByteCase(byte[] a) {
242 for (int i = 0; i < 128; i++) {
243 a[i] += 5;
244 }
245 }
246
247 /// CHECK-START-ARM64: void Main.checkSingleAccess(int[]) instruction_simplifier_arm64 (before)
248 /// CHECK-DAG: <<Array:l\d+>> ParameterValue
249 /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
Artem Serov2558abe2020-10-14 18:01:37 +0100250 /// CHECK-IF: hasIsaFeature("sve")
251 //
252 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}]
253 // -------------- Loop
254 /// CHECK-DAG: <<Index:i\d+>> Phi
255 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
256 /// CHECK-DAG: If
257 /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Repl>>,<<LoopP>>]
258 //
259 /// CHECK-ELSE:
260 //
261 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>]
262 // -------------- Loop
263 /// CHECK-DAG: <<Index:i\d+>> Phi
264 /// CHECK-DAG: If
265 /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Repl>>]
266 //
267 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100268
269 /// CHECK-START-ARM64: void Main.checkSingleAccess(int[]) instruction_simplifier_arm64 (after)
270 /// CHECK-DAG: <<Array:l\d+>> ParameterValue
271 /// CHECK-DAG: <<Const0:i\d+>> IntConstant 0
272 /// CHECK-DAG: <<Const5:i\d+>> IntConstant 5
Artem Serov2558abe2020-10-14 18:01:37 +0100273 /// CHECK-IF: hasIsaFeature("sve")
274 //
275 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>,{{j\d+}}]
276 // -------------- Loop
277 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
278 /// CHECK-DAG: <<Index:i\d+>> Phi
279 /// CHECK-DAG: If
Raphael Gault0700b692020-09-30 08:33:10 +0000280 /// CHECK-DAG: <<IntAddr:i\d+>> IntermediateAddress [<<Array>>,{{i\d+}}]
281 /// CHECK-DAG: VecStore [<<IntAddr>>,<<Index>>,<<Repl>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +0100282 //
283 /// CHECK-ELSE:
284 //
285 /// CHECK-DAG: <<Repl:d\d+>> VecReplicateScalar [<<Const5>>]
286 // -------------- Loop
287 /// CHECK-DAG: <<Index:i\d+>> Phi
288 /// CHECK-DAG: If
289 /// CHECK-DAG: VecStore [<<Array>>,<<Index>>,<<Repl>>]
290 //
291 /// CHECK-FI:
292 //
Artem Serove1811ed2017-04-27 16:50:47 +0100293 /// CHECK-NOT: IntermediateAddress
294 public static void checkSingleAccess(int[] a) {
295 for (int i = 0; i < 128; i++) {
296 a[i] = 5;
297 }
298 }
299
300 /// CHECK-START-ARM64: void Main.checkInt2Float(int[], float[]) instruction_simplifier_arm64 (before)
301 /// CHECK-DAG: <<Array1:l\d+>> ParameterValue
302 /// CHECK-DAG: <<Array2:l\d+>> ParameterValue
303 // -------------- Loop
Artem Serov2558abe2020-10-14 18:01:37 +0100304 /// CHECK-IF: hasIsaFeature("sve")
305 //
306 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
307 /// CHECK-DAG: <<Index:i\d+>> Phi
308 /// CHECK-DAG: If
309 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array1>>,<<Index>>,<<LoopP>>]
310 /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>,<<LoopP>>]
311 /// CHECK-DAG: VecStore [<<Array2>>,<<Index>>,<<Cnv>>,<<LoopP>>]
312 //
313 /// CHECK-ELSE:
314 //
315 /// CHECK-DAG: <<Index:i\d+>> Phi
316 /// CHECK-DAG: If
317 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array1>>,<<Index>>]
318 /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>]
319 /// CHECK-DAG: VecStore [<<Array2>>,<<Index>>,<<Cnv>>]
320 //
321 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100322
323 /// CHECK-START-ARM64: void Main.checkInt2Float(int[], float[]) instruction_simplifier_arm64 (after)
324 /// CHECK-DAG: <<Array1:l\d+>> ParameterValue
325 /// CHECK-DAG: <<Array2:l\d+>> ParameterValue
Artem Serov2558abe2020-10-14 18:01:37 +0100326 /// CHECK-IF: hasIsaFeature("sve")
327 //
328 // IntermediateAddressIndex is not supported for SVE.
329 // -------------- Loop
330 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
331 /// CHECK-DAG: <<Index:i\d+>> Phi
332 /// CHECK-DAG: If
Raphael Gault0700b692020-09-30 08:33:10 +0000333 /// CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [<<Array1>>,{{i\d+}}]
334 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr1>>,<<Index>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +0100335 /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>,<<LoopP>>]
Raphael Gault0700b692020-09-30 08:33:10 +0000336 /// CHECK-DAG: <<IntAddr2:i\d+>> IntermediateAddress [<<Array2>>,{{i\d+}}]
337 /// CHECK-DAG: VecStore [<<IntAddr2>>,<<Index>>,<<Cnv>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +0100338 //
339 /// CHECK-ELSE:
340 //
341 /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12
342 /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
343 // -------------- Loop
344 /// CHECK-DAG: <<Index:i\d+>> Phi
345 /// CHECK-DAG: If
346 /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>]
347 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array1>>,<<Address1>>]
348 /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>]
349 /// CHECK-DAG: <<Address2:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>]
350 /// CHECK-DAG: VecStore [<<Array2>>,<<Address2>>,<<Cnv>>]
351 //
352 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100353
354 /// CHECK-START-ARM64: void Main.checkInt2Float(int[], float[]) GVN$after_arch (after)
355 /// CHECK-DAG: <<Array1:l\d+>> ParameterValue
356 /// CHECK-DAG: <<Array2:l\d+>> ParameterValue
Artem Serov2558abe2020-10-14 18:01:37 +0100357 /// CHECK-IF: hasIsaFeature("sve")
358 //
359 // IntermediateAddressIndex is not supported for SVE.
360 // -------------- Loop
361 /// CHECK-DAG: <<LoopP:j\d+>> VecPredWhile
362 /// CHECK-DAG: <<Index:i\d+>> Phi
363 /// CHECK-DAG: If
Raphael Gault0700b692020-09-30 08:33:10 +0000364 /// CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [<<Array1>>,{{i\d+}}]
365 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<IntAddr1>>,<<Index>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +0100366 /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>,<<LoopP>>]
Raphael Gault0700b692020-09-30 08:33:10 +0000367 /// CHECK-DAG: <<IntAddr2:i\d+>> IntermediateAddress [<<Array2>>,{{i\d+}}]
368 /// CHECK-DAG: VecStore [<<IntAddr2>>,<<Index>>,<<Cnv>>,<<LoopP>>]
Artem Serov2558abe2020-10-14 18:01:37 +0100369 //
370 /// CHECK-ELSE:
371 //
372 /// CHECK-DAG: <<DataOffset:i\d+>> IntConstant 12
373 /// CHECK-DAG: <<Const2:i\d+>> IntConstant 2
374 // -------------- Loop
375 /// CHECK-DAG: <<Index:i\d+>> Phi
376 /// CHECK-DAG: If
377 /// CHECK-DAG: <<Address1:i\d+>> IntermediateAddressIndex [<<Index>>,<<DataOffset>>,<<Const2>>]
378 /// CHECK-DAG: <<Load:d\d+>> VecLoad [<<Array1>>,<<Address1>>]
379 /// CHECK-DAG: <<Cnv:d\d+>> VecCnv [<<Load>>]
380 /// CHECK-NOT: IntermediateAddress
381 /// CHECK-DAG: VecStore [<<Array2>>,<<Address1>>,<<Cnv>>]
382 //
383 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100384
385 /// CHECK-START-ARM64: void Main.checkInt2Float(int[], float[]) disassembly (after)
Artem Serov2558abe2020-10-14 18:01:37 +0100386 /// CHECK-IF: hasIsaFeature("sve")
387 //
388 // IntermediateAddressIndex is not supported for SVE.
389 /// CHECK-NOT: IntermediateAddressIndex
Artem Serov2558abe2020-10-14 18:01:37 +0100390 //
391 /// CHECK-ELSE:
392 //
393 /// CHECK: IntermediateAddressIndex
394 /// CHECK-NEXT: add w{{[0-9]+}}, w{{[0-9]+}}, w{{[0-9]+}}, lsl #2
395 //
396 /// CHECK-FI:
Artem Serove1811ed2017-04-27 16:50:47 +0100397 public static void checkInt2Float(int[] a, float[] b) {
398 for (int i = 0; i < 128; i++) {
399 b[i] = (float) a[i];
400 }
401 }
402
403 public static final int ARRAY_SIZE = 1024;
404
405 public static int calcArraySum(int[] a, byte[] b, float[] c) {
406 int sum = 0;
407 for (int i = 0; i < 128; i++) {
408 sum += a[i] + b[i] + (int) c[i];
409 }
410 return sum;
411 }
412
413 public static void main(String[] args) {
414 byte[] ba = new byte[ARRAY_SIZE];
415 int[] ia = new int[ARRAY_SIZE];
416 float[] fa = new float[ARRAY_SIZE];
417
418 checkSingleAccess(ia);
419 checkIntCase(ia);
420 checkByteCase(ba);
421 checkInt2Float(ia, fa);
422
423 assertIntEquals(3200, calcArraySum(ia, ba, fa));
424 }
425}