@@ -41,7 +41,6 @@ public class TestMulAddS2I {
41
41
42
42
static short [] sArr1 = new short [RANGE ];
43
43
static short [] sArr2 = new short [RANGE ];
44
- static int [] ioutArr = new int [RANGE ];
45
44
static final int [] GOLDEN_A ;
46
45
static final int [] GOLDEN_B ;
47
46
static final int [] GOLDEN_C ;
@@ -50,6 +49,10 @@ public class TestMulAddS2I {
50
49
static final int [] GOLDEN_F ;
51
50
static final int [] GOLDEN_G ;
52
51
static final int [] GOLDEN_H ;
52
+ static final int [] GOLDEN_I ;
53
+ static final int [] GOLDEN_J ;
54
+ static final int [] GOLDEN_K ;
55
+ static final int [] GOLDEN_L ;
53
56
54
57
static {
55
58
for (int i = 0 ; i < RANGE ; i ++) {
@@ -58,12 +61,16 @@ public class TestMulAddS2I {
58
61
}
59
62
GOLDEN_A = testa ();
60
63
GOLDEN_B = testb ();
61
- GOLDEN_C = testc ();
62
- GOLDEN_D = testd ();
63
- GOLDEN_E = teste ();
64
- GOLDEN_F = testf ();
65
- GOLDEN_G = testg ();
66
- GOLDEN_H = testh ();
64
+ GOLDEN_C = testc (new int [ITER ]);
65
+ GOLDEN_D = testd (new int [ITER ]);
66
+ GOLDEN_E = teste (new int [ITER ]);
67
+ GOLDEN_F = testf (new int [ITER ]);
68
+ GOLDEN_G = testg (new int [ITER ]);
69
+ GOLDEN_H = testh (new int [ITER ]);
70
+ GOLDEN_I = testi (new int [ITER ]);
71
+ GOLDEN_J = testj (new int [ITER ]);
72
+ GOLDEN_K = testk (new int [ITER ]);
73
+ GOLDEN_L = testl (new int [ITER ]);
67
74
}
68
75
69
76
@@ -72,17 +79,22 @@ public static void main(String[] args) {
72
79
TestFramework .runWithFlags ("-XX:-AlignVector" );
73
80
}
74
81
75
- @ Run (test = {"testa" , "testb" , "testc" , "testd" , "teste" , "testf" , "testg" , "testh" })
82
+ @ Run (test = {"testa" , "testb" , "testc" , "testd" , "teste" , "testf" , "testg" , "testh" ,
83
+ "testi" , "testj" , "testk" , "testl" })
76
84
@ Warmup (0 )
77
85
public static void run () {
78
86
compare (testa (), GOLDEN_A , "testa" );
79
87
compare (testb (), GOLDEN_B , "testb" );
80
- compare (testc (), GOLDEN_C , "testc" );
81
- compare (testd (), GOLDEN_D , "testd" );
82
- compare (teste (), GOLDEN_E , "teste" );
83
- compare (testf (), GOLDEN_F , "testf" );
84
- compare (testg (), GOLDEN_G , "testg" );
85
- compare (testh (), GOLDEN_H , "testh" );
88
+ compare (testc (new int [ITER ]), GOLDEN_C , "testc" );
89
+ compare (testd (new int [ITER ]), GOLDEN_D , "testd" );
90
+ compare (teste (new int [ITER ]), GOLDEN_E , "teste" );
91
+ compare (testf (new int [ITER ]), GOLDEN_F , "testf" );
92
+ compare (testg (new int [ITER ]), GOLDEN_G , "testg" );
93
+ compare (testh (new int [ITER ]), GOLDEN_H , "testh" );
94
+ compare (testi (new int [ITER ]), GOLDEN_I , "testi" );
95
+ compare (testj (new int [ITER ]), GOLDEN_J , "testj" );
96
+ compare (testk (new int [ITER ]), GOLDEN_K , "testk" );
97
+ compare (testl (new int [ITER ]), GOLDEN_L , "testl" );
86
98
}
87
99
88
100
public static void compare (int [] out , int [] golden , String name ) {
@@ -138,8 +150,7 @@ public static int[] testb() {
138
150
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI , "> 0" })
139
151
@ IR (applyIfCPUFeature = {"avx512_vnni" , "true" },
140
152
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI_VNNI , "> 0" })
141
- public static int [] testc () {
142
- int [] out = new int [ITER ];
153
+ public static int [] testc (int [] out ) {
143
154
for (int i = 0 ; i < ITER ; i ++) {
144
155
out [i ] += ((sArr1 [2 *i ] * sArr2 [2 *i ]) + (sArr1 [2 *i +1 ] * sArr2 [2 *i +1 ]));
145
156
}
@@ -155,8 +166,7 @@ public static int[] testc() {
155
166
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI , "> 0" })
156
167
@ IR (applyIfCPUFeature = {"avx512_vnni" , "true" },
157
168
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI_VNNI , "> 0" })
158
- public static int [] testd () {
159
- int [] out = ioutArr ;
169
+ public static int [] testd (int [] out ) {
160
170
for (int i = 0 ; i < ITER -2 ; i +=2 ) {
161
171
// Unrolled, with the same structure.
162
172
out [i +0 ] += ((sArr1 [2 *i +0 ] * sArr2 [2 *i +0 ]) + (sArr1 [2 *i +1 ] * sArr2 [2 *i +1 ]));
@@ -174,8 +184,7 @@ public static int[] testd() {
174
184
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI , "> 0" })
175
185
@ IR (applyIfCPUFeature = {"avx512_vnni" , "true" },
176
186
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI_VNNI , "> 0" })
177
- public static int [] teste () {
178
- int [] out = ioutArr ;
187
+ public static int [] teste (int [] out ) {
179
188
for (int i = 0 ; i < ITER -2 ; i +=2 ) {
180
189
// Unrolled, with some swaps.
181
190
out [i +0 ] += ((sArr1 [2 *i +0 ] * sArr2 [2 *i +0 ]) + (sArr1 [2 *i +1 ] * sArr2 [2 *i +1 ]));
@@ -193,8 +202,7 @@ public static int[] teste() {
193
202
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI , "> 0" })
194
203
@ IR (applyIfCPUFeature = {"avx512_vnni" , "true" },
195
204
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI_VNNI , "> 0" })
196
- public static int [] testf () {
197
- int [] out = ioutArr ;
205
+ public static int [] testf (int [] out ) {
198
206
for (int i = 0 ; i < ITER -2 ; i +=2 ) {
199
207
// Unrolled, with some swaps.
200
208
out [i +0 ] += ((sArr1 [2 *i +0 ] * sArr2 [2 *i +0 ]) + (sArr1 [2 *i +1 ] * sArr2 [2 *i +1 ]));
@@ -212,8 +220,7 @@ public static int[] testf() {
212
220
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI , "> 0" })
213
221
@ IR (applyIfCPUFeature = {"avx512_vnni" , "true" },
214
222
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI_VNNI , "> 0" })
215
- public static int [] testg () {
216
- int [] out = ioutArr ;
223
+ public static int [] testg (int [] out ) {
217
224
for (int i = 0 ; i < ITER -2 ; i +=2 ) {
218
225
// Unrolled, with some swaps.
219
226
out [i +0 ] += ((sArr1 [2 *i +0 ] * sArr2 [2 *i +0 ]) + (sArr1 [2 *i +1 ] * sArr2 [2 *i +1 ]));
@@ -231,13 +238,65 @@ public static int[] testg() {
231
238
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI , "> 0" })
232
239
@ IR (applyIfCPUFeature = {"avx512_vnni" , "true" },
233
240
counts = {IRNode .MUL_ADD_S2I , "> 0" , IRNode .MUL_ADD_VS2VI_VNNI , "> 0" })
234
- public static int [] testh () {
235
- int [] out = ioutArr ;
241
+ public static int [] testh (int [] out ) {
236
242
for (int i = 0 ; i < ITER -2 ; i +=2 ) {
237
243
// Unrolled, with some swaps.
238
244
out [i +0 ] += ((sArr1 [2 *i +0 ] * sArr2 [2 *i +0 ]) + (sArr1 [2 *i +1 ] * sArr2 [2 *i +1 ]));
239
245
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)
240
246
}
241
247
return out ;
242
248
}
249
+
250
+ @ Test
251
+ @ IR (counts = {IRNode .MUL_ADD_S2I , "> 0" },
252
+ applyIfCPUFeatureOr = {"sse2" , "true" , "asimd" , "true" })
253
+ @ IR (counts = {IRNode .MUL_ADD_VS2VI , "= 0" })
254
+ public static int [] testi (int [] out ) {
255
+ for (int i = 0 ; i < ITER -2 ; i +=2 ) {
256
+ // Unrolled, with some swaps that prevent vectorization.
257
+ out [i +0 ] += ((sArr1 [2 *i +0 ] * sArr2 [2 *i +0 ]) + (sArr1 [2 *i +1 ] * sArr2 [2 *i +1 ])); // ok
258
+ out [i +1 ] += ((sArr1 [2 *i +2 ] * sArr2 [2 *i +3 ]) + (sArr1 [2 *i +3 ] * sArr2 [2 *i +2 ])); // bad
259
+ }
260
+ return out ;
261
+ }
262
+
263
+ @ Test
264
+ @ IR (counts = {IRNode .MUL_ADD_S2I , "> 0" },
265
+ applyIfCPUFeatureOr = {"sse2" , "true" , "asimd" , "true" })
266
+ @ IR (counts = {IRNode .MUL_ADD_VS2VI , "= 0" })
267
+ public static int [] testj (int [] out ) {
268
+ for (int i = 0 ; i < ITER -2 ; i +=2 ) {
269
+ // Unrolled, with some swaps that prevent vectorization.
270
+ out [i +0 ] += ((sArr1 [2 *i +0 ] * sArr2 [2 *i +1 ]) + (sArr1 [2 *i +1 ] * sArr2 [2 *i +0 ])); // bad
271
+ out [i +1 ] += ((sArr1 [2 *i +2 ] * sArr2 [2 *i +3 ]) + (sArr1 [2 *i +3 ] * sArr2 [2 *i +2 ])); // bad
272
+ }
273
+ return out ;
274
+ }
275
+
276
+ @ Test
277
+ @ IR (counts = {IRNode .MUL_ADD_S2I , "> 0" },
278
+ applyIfCPUFeatureOr = {"sse2" , "true" , "asimd" , "true" })
279
+ @ IR (counts = {IRNode .MUL_ADD_VS2VI , "= 0" })
280
+ public static int [] testk (int [] out ) {
281
+ for (int i = 0 ; i < ITER -2 ; i +=2 ) {
282
+ // Unrolled, with some swaps that prevent vectorization.
283
+ out [i +0 ] += ((sArr1 [2 *i +0 ] * sArr2 [2 *i +1 ]) + (sArr1 [2 *i +1 ] * sArr2 [2 *i +0 ])); // bad
284
+ out [i +1 ] += ((sArr1 [2 *i +2 ] * sArr2 [2 *i +2 ]) + (sArr1 [2 *i +3 ] * sArr2 [2 *i +3 ])); // ok
285
+ }
286
+ return out ;
287
+ }
288
+
289
+ @ Test
290
+ @ IR (counts = {IRNode .MUL_ADD_S2I , "> 0" },
291
+ applyIfCPUFeatureOr = {"sse2" , "true" , "asimd" , "true" })
292
+ @ IR (counts = {IRNode .MUL_ADD_VS2VI , "= 0" })
293
+ public static int [] testl (int [] out ) {
294
+ for (int i = 0 ; i < ITER -2 ; i +=2 ) {
295
+ // Unrolled, with some swaps that prevent vectorization.
296
+ out [i +0 ] += ((sArr1 [2 *i +1 ] * sArr2 [2 *i +1 ]) + (sArr1 [2 *i +0 ] * sArr2 [2 *i +0 ])); // ok
297
+ out [i +1 ] += ((sArr1 [2 *i +2 ] * sArr2 [2 *i +3 ]) + (sArr1 [2 *i +3 ] * sArr2 [2 *i +2 ])); // bad
298
+ }
299
+ return out ;
300
+ }
301
+
243
302
}
0 commit comments