148
149 @Test
150 @IR(applyIfCPUFeature = {"sse2", "true"},
151 applyIfPlatform = {"64-bit", "true"},
152 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
153 @IR(applyIfCPUFeature = {"asimd", "true"},
154 applyIf = {"MaxVectorSize", "16"}, // AD file requires vector_length = 16
155 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
156 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
157 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
158 public static int[] testc(int[] out) {
159 for (int i = 0; i < ITER; i++) {
160 out[i] += ((sArr1[2*i] * sArr2[2*i]) + (sArr1[2*i+1] * sArr2[2*i+1]));
161 }
162 return out;
163 }
164
165 @Test
166 @IR(applyIfCPUFeature = {"sse2", "true"},
167 applyIfPlatform = {"64-bit", "true"},
168 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
169 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
170 @IR(applyIfCPUFeature = {"asimd", "true"},
171 applyIfAnd = {"MaxVectorSize", "16", "UseCompactObjectHeaders", "false"}, // AD file requires vector_length = 16
172 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
173 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
174 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
175 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
176 public static int[] testd(int[] out) {
177 for (int i = 0; i < ITER-2; i+=2) {
178 // Unrolled, with the same structure.
179 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
180 out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+2]) + (sArr1[2*i+3] * sArr2[2*i+3]));
181 // Hand-unrolling can mess with AlignVector and UseCompactObjectHeaders.
182 // We need all addresses 8-byte aligned.
183 //
184 // out:
185 // adr = base + UNSAFE.ARRAY_INT_BASE_OFFSET + 8*iter
186 // = 16 (or 12 if UseCompactObjectHeaders=true)
187 // -> never aligned!
188 }
189 return out;
190 }
191
192 @Test
193 @IR(applyIfCPUFeature = {"sse2", "true"},
194 applyIfPlatform = {"64-bit", "true"},
195 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
196 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
197 @IR(applyIfCPUFeature = {"asimd", "true"},
198 applyIfAnd = {"MaxVectorSize", "16", "UseCompactObjectHeaders", "false" }, // AD file requires vector_length = 16
199 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
200 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
201 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
202 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
203 public static int[] teste(int[] out) {
204 for (int i = 0; i < ITER-2; i+=2) {
205 // Unrolled, with some swaps.
206 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
207 out[i+1] += ((sArr2[2*i+2] * sArr1[2*i+2]) + (sArr1[2*i+3] * sArr2[2*i+3])); // swap(1 2)
208 // Hand-unrolling can mess with AlignVector and UseCompactObjectHeaders.
209 // We need all addresses 8-byte aligned.
210 //
211 // out:
212 // adr = base + UNSAFE.ARRAY_INT_BASE_OFFSET + 8*iter
213 // = 16 (or 12 if UseCompactObjectHeaders=true)
214 // -> never aligned!
215 }
216 return out;
217 }
218
219 @Test
220 @IR(applyIfCPUFeature = {"sse2", "true"},
221 applyIfPlatform = {"64-bit", "true"},
222 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
223 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
224 @IR(applyIfCPUFeature = {"asimd", "true"},
225 applyIfAnd = {"MaxVectorSize", "16", "UseCompactObjectHeaders", "false" }, // AD file requires vector_length = 16
226 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
227 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
228 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
229 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
230 public static int[] testf(int[] out) {
231 for (int i = 0; i < ITER-2; i+=2) {
232 // Unrolled, with some swaps.
233 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
234 out[i+1] += ((sArr2[2*i+2] * sArr1[2*i+2]) + (sArr2[2*i+3] * sArr1[2*i+3])); // swap(1 2), swap(3 4)
235 // Hand-unrolling can mess with AlignVector and UseCompactObjectHeaders.
236 // We need all addresses 8-byte aligned.
237 //
238 // out:
239 // adr = base + UNSAFE.ARRAY_INT_BASE_OFFSET + 8*iter
240 // = 16 (or 12 if UseCompactObjectHeaders=true)
241 // -> never aligned!
242 }
243 return out;
244 }
245
246 @Test
247 @IR(applyIfCPUFeature = {"sse2", "true"},
248 applyIfPlatform = {"64-bit", "true"},
249 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
250 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
251 @IR(applyIfCPUFeature = {"asimd", "true"},
252 applyIfAnd = {"MaxVectorSize", "16", "UseCompactObjectHeaders", "false" }, // AD file requires vector_length = 16
253 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
254 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
255 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
256 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
257 public static int[] testg(int[] out) {
258 for (int i = 0; i < ITER-2; i+=2) {
259 // Unrolled, with some swaps.
260 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
261 out[i+1] += ((sArr1[2*i+3] * sArr2[2*i+3]) + (sArr1[2*i+2] * sArr2[2*i+2])); // swap(1 3), swap(2 4)
262 // Hand-unrolling can mess with AlignVector and UseCompactObjectHeaders.
263 // We need all addresses 8-byte aligned.
264 //
265 // out:
266 // adr = base + UNSAFE.ARRAY_INT_BASE_OFFSET + 8*iter
267 // = 16 (or 12 if UseCompactObjectHeaders=true)
268 // -> never aligned!
269 }
270 return out;
271 }
272
273 @Test
274 @IR(applyIfCPUFeature = {"sse2", "true"},
275 applyIfPlatform = {"64-bit", "true"},
276 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
277 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
278 @IR(applyIfCPUFeature = {"asimd", "true"},
279 applyIfAnd = {"MaxVectorSize", "16", "UseCompactObjectHeaders", "false" }, // AD file requires vector_length = 16
280 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
281 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
282 applyIfOr = { "UseCompactObjectHeaders", "false", "AlignVector", "false" },
283 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
284 public static int[] testh(int[] out) {
285 for (int i = 0; i < ITER-2; i+=2) {
286 // Unrolled, with some swaps.
287 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
288 out[i+1] += ((sArr2[2*i+3] * sArr1[2*i+3]) + (sArr2[2*i+2] * sArr1[2*i+2])); // swap(1 4), swap(2 3)
289 // Hand-unrolling can mess with AlignVector and UseCompactObjectHeaders.
290 // We need all addresses 8-byte aligned.
291 //
292 // out:
293 // adr = base + UNSAFE.ARRAY_INT_BASE_OFFSET + 8*iter
294 // = 16 (or 12 if UseCompactObjectHeaders=true)
295 // -> never aligned!
296 }
297 return out;
298 }
299
300 @Test
301 @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"},
302 applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
303 @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"})
304 public static int[] testi(int[] out) {
305 for (int i = 0; i < ITER-2; i+=2) {
306 // Unrolled, with some swaps that prevent vectorization.
307 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1])); // ok
308 out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+3]) + (sArr1[2*i+3] * sArr2[2*i+2])); // bad
309 }
310 return out;
311 }
312
313 @Test
314 @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"},
315 applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
|
148
149 @Test
150 @IR(applyIfCPUFeature = {"sse2", "true"},
151 applyIfPlatform = {"64-bit", "true"},
152 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
153 @IR(applyIfCPUFeature = {"asimd", "true"},
154 applyIf = {"MaxVectorSize", "16"}, // AD file requires vector_length = 16
155 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
156 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
157 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
158 public static int[] testc(int[] out) {
159 for (int i = 0; i < ITER; i++) {
160 out[i] += ((sArr1[2*i] * sArr2[2*i]) + (sArr1[2*i+1] * sArr2[2*i+1]));
161 }
162 return out;
163 }
164
165 @Test
166 @IR(applyIfCPUFeature = {"sse2", "true"},
167 applyIfPlatform = {"64-bit", "true"},
168 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
169 @IR(applyIfCPUFeature = {"asimd", "true"},
170 applyIf = {"MaxVectorSize", "16"}, // AD file requires vector_length = 16
171 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
172 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
173 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
174 public static int[] testd(int[] out) {
175 for (int i = 0; i < ITER-2; i+=2) {
176 // Unrolled, with the same structure.
177 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
178 out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+2]) + (sArr1[2*i+3] * sArr2[2*i+3]));
179 }
180 return out;
181 }
182
183 @Test
184 @IR(applyIfCPUFeature = {"sse2", "true"},
185 applyIfPlatform = {"64-bit", "true"},
186 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
187 @IR(applyIfCPUFeature = {"asimd", "true"},
188 applyIf = {"MaxVectorSize", "16"}, // AD file requires vector_length = 16
189 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
190 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
191 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
192 public static int[] teste(int[] out) {
193 for (int i = 0; i < ITER-2; i+=2) {
194 // Unrolled, with some swaps.
195 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
196 out[i+1] += ((sArr2[2*i+2] * sArr1[2*i+2]) + (sArr1[2*i+3] * sArr2[2*i+3])); // swap(1 2)
197 }
198 return out;
199 }
200
201 @Test
202 @IR(applyIfCPUFeature = {"sse2", "true"},
203 applyIfPlatform = {"64-bit", "true"},
204 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
205 @IR(applyIfCPUFeature = {"asimd", "true"},
206 applyIf = {"MaxVectorSize", "16"}, // AD file requires vector_length = 16
207 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
208 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
209 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
210 public static int[] testf(int[] out) {
211 for (int i = 0; i < ITER-2; i+=2) {
212 // Unrolled, with some swaps.
213 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
214 out[i+1] += ((sArr2[2*i+2] * sArr1[2*i+2]) + (sArr2[2*i+3] * sArr1[2*i+3])); // swap(1 2), swap(3 4)
215 }
216 return out;
217 }
218
219 @Test
220 @IR(applyIfCPUFeature = {"sse2", "true"},
221 applyIfPlatform = {"64-bit", "true"},
222 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
223 @IR(applyIfCPUFeature = {"asimd", "true"},
224 applyIf = {"MaxVectorSize", "16"}, // AD file requires vector_length = 16
225 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
226 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
227 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
228 public static int[] testg(int[] out) {
229 for (int i = 0; i < ITER-2; i+=2) {
230 // Unrolled, with some swaps.
231 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
232 out[i+1] += ((sArr1[2*i+3] * sArr2[2*i+3]) + (sArr1[2*i+2] * sArr2[2*i+2])); // swap(1 3), swap(2 4)
233 }
234 return out;
235 }
236
237 @Test
238 @IR(applyIfCPUFeature = {"sse2", "true"},
239 applyIfPlatform = {"64-bit", "true"},
240 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
241 @IR(applyIfCPUFeature = {"asimd", "true"},
242 applyIf = {"MaxVectorSize", "16"}, // AD file requires vector_length = 16
243 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI, "> 0"})
244 @IR(applyIfCPUFeature = {"avx512_vnni", "true"},
245 counts = {IRNode.MUL_ADD_S2I, "> 0", IRNode.MUL_ADD_VS2VI_VNNI, "> 0"})
246 public static int[] testh(int[] out) {
247 for (int i = 0; i < ITER-2; i+=2) {
248 // Unrolled, with some swaps.
249 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1]));
250 out[i+1] += ((sArr2[2*i+3] * sArr1[2*i+3]) + (sArr2[2*i+2] * sArr1[2*i+2])); // swap(1 4), swap(2 3)
251 }
252 return out;
253 }
254
255 @Test
256 @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"},
257 applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
258 @IR(counts = {IRNode.MUL_ADD_VS2VI, "= 0"})
259 public static int[] testi(int[] out) {
260 for (int i = 0; i < ITER-2; i+=2) {
261 // Unrolled, with some swaps that prevent vectorization.
262 out[i+0] += ((sArr1[2*i+0] * sArr2[2*i+0]) + (sArr1[2*i+1] * sArr2[2*i+1])); // ok
263 out[i+1] += ((sArr1[2*i+2] * sArr2[2*i+3]) + (sArr1[2*i+3] * sArr2[2*i+2])); // bad
264 }
265 return out;
266 }
267
268 @Test
269 @IR(counts = {IRNode.MUL_ADD_S2I, "> 0"},
270 applyIfCPUFeatureOr = {"sse2", "true", "asimd", "true"})
|