1/*
2 * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/**
25 * @test
26 * @bug 8004867
27 * @summary VM crashing with assert "share/vm/opto/node.hpp:357 - assert(i < _max) failed: oob"
28 * @modules java.base/jdk.internal.misc
29 *
30 * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation
31 *    -XX:-OptimizeFill
32 *    compiler.c2.cr8004867.TestIntUnsafeOrdered
33 * @run main/othervm/timeout=300 -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:-TieredCompilation
34 *    -XX:+OptimizeFill
35 *    compiler.c2.cr8004867.TestIntUnsafeOrdered
36 */
37
38package compiler.c2.cr8004867;
39
40import jdk.internal.misc.Unsafe;
41
42import java.lang.reflect.Field;
43
44public class TestIntUnsafeOrdered {
45  private static final int ARRLEN = 97;
46  private static final int ITERS  = 11000;
47  private static final int OFFSET = 3;
48  private static final int SCALE = 2;
49  private static final int ALIGN_OFF = 8;
50  private static final int UNALIGN_OFF = 5;
51
52  private static final Unsafe unsafe = Unsafe.getUnsafe();
53  private static final int BASE;
54  static {
55    try {
56      BASE = unsafe.arrayBaseOffset(int[].class);
57    } catch (Exception e) {
58      InternalError err = new InternalError();
59      err.initCause(e);
60      throw err;
61    }
62  }
63
64  public static void main(String args[]) {
65    System.out.println("Testing Integer array unsafe ordered operations");
66    int errn = test(false);
67    if (errn > 0) {
68      System.err.println("FAILED: " + errn + " errors");
69      System.exit(97);
70    }
71    System.out.println("PASSED");
72  }
73
74  static int test(boolean test_only) {
75    int[] a1 = new int[ARRLEN];
76    int[] a2 = new int[ARRLEN];
77    // Initialize
78    for (int i=0; i<ARRLEN; i++) {
79      a1[i] = -1;
80      a2[i] = -1;
81    }
82    System.out.println("Warmup");
83    for (int i=0; i<ITERS; i++) {
84      test_ci(a1);
85      test_vi(a2, 123, -1);
86      test_cp(a1, a2);
87      test_2ci(a1, a2);
88      test_2vi(a1, a2, 123, 103);
89      test_ci_neg(a1, 123);
90      test_vi_neg(a2, 123, 103);
91      test_cp_neg(a1, a2);
92      test_2ci_neg(a1, a2);
93      test_2vi_neg(a1, a2, 123, 103);
94      test_ci_oppos(a1, 123);
95      test_vi_oppos(a2, 123, 103);
96      test_cp_oppos(a1, a2);
97      test_2ci_oppos(a1, a2);
98      test_2vi_oppos(a1, a2, 123, 103);
99      test_ci_off(a1, 123);
100      test_vi_off(a2, 123, 103);
101      test_cp_off(a1, a2);
102      test_2ci_off(a1, a2);
103      test_2vi_off(a1, a2, 123, 103);
104      test_ci_inv(a1, OFFSET, 123);
105      test_vi_inv(a2, 123, OFFSET, 103);
106      test_cp_inv(a1, a2, OFFSET);
107      test_2ci_inv(a1, a2, OFFSET);
108      test_2vi_inv(a1, a2, 123, 103, OFFSET);
109      test_ci_scl(a1, 123);
110      test_vi_scl(a2, 123, 103);
111      test_cp_scl(a1, a2);
112      test_2ci_scl(a1, a2);
113      test_2vi_scl(a1, a2, 123, 103);
114      test_cp_alndst(a1, a2);
115      test_cp_alnsrc(a1, a2);
116      test_2ci_aln(a1, a2);
117      test_2vi_aln(a1, a2, 123, 103);
118      test_cp_unalndst(a1, a2);
119      test_cp_unalnsrc(a1, a2);
120      test_2ci_unaln(a1, a2);
121      test_2vi_unaln(a1, a2, 123, 103);
122    }
123    // Initialize
124    for (int i=0; i<ARRLEN; i++) {
125      a1[i] = -1;
126      a2[i] = -1;
127    }
128    // Test and verify results
129    System.out.println("Verification");
130    int errn = 0;
131    {
132      test_ci(a1);
133      for (int i=0; i<ARRLEN; i++) {
134        errn += verify("test_ci: a1", i, a1[i], -123);
135      }
136      test_vi(a2, 123, -1);
137      for (int i=0; i<ARRLEN; i++) {
138        errn += verify("test_vi: a2", i, a2[i], 123);
139      }
140      test_cp(a1, a2);
141      for (int i=0; i<ARRLEN; i++) {
142        errn += verify("test_cp: a1", i, a1[i], 123);
143      }
144      test_2ci(a1, a2);
145      for (int i=0; i<ARRLEN; i++) {
146        errn += verify("test_2ci: a1", i, a1[i], -123);
147        errn += verify("test_2ci: a2", i, a2[i], -103);
148      }
149      test_2vi(a1, a2, 123, 103);
150      for (int i=0; i<ARRLEN; i++) {
151        errn += verify("test_2vi: a1", i, a1[i], 123);
152        errn += verify("test_2vi: a2", i, a2[i], 103);
153      }
154      // Reset for negative stride
155      for (int i=0; i<ARRLEN; i++) {
156        a1[i] = -1;
157        a2[i] = -1;
158      }
159      test_ci_neg(a1, -1);
160      for (int i=0; i<ARRLEN; i++) {
161        errn += verify("test_ci_neg: a1", i, a1[i], -123);
162      }
163      test_vi_neg(a2, 123, -1);
164      for (int i=0; i<ARRLEN; i++) {
165        errn += verify("test_vi_neg: a2", i, a2[i], 123);
166      }
167      test_cp_neg(a1, a2);
168      for (int i=0; i<ARRLEN; i++) {
169        errn += verify("test_cp_neg: a1", i, a1[i], 123);
170      }
171      test_2ci_neg(a1, a2);
172      for (int i=0; i<ARRLEN; i++) {
173        errn += verify("test_2ci_neg: a1", i, a1[i], -123);
174        errn += verify("test_2ci_neg: a2", i, a2[i], -103);
175      }
176      test_2vi_neg(a1, a2, 123, 103);
177      for (int i=0; i<ARRLEN; i++) {
178        errn += verify("test_2vi_neg: a1", i, a1[i], 123);
179        errn += verify("test_2vi_neg: a2", i, a2[i], 103);
180      }
181      // Reset for opposite stride
182      for (int i=0; i<ARRLEN; i++) {
183        a1[i] = -1;
184        a2[i] = -1;
185      }
186      test_ci_oppos(a1, -1);
187      for (int i=0; i<ARRLEN; i++) {
188        errn += verify("test_ci_oppos: a1", i, a1[i], -123);
189      }
190      test_vi_oppos(a2, 123, -1);
191      for (int i=0; i<ARRLEN; i++) {
192        errn += verify("test_vi_oppos: a2", i, a2[i], 123);
193      }
194      test_cp_oppos(a1, a2);
195      for (int i=0; i<ARRLEN; i++) {
196        errn += verify("test_cp_oppos: a1", i, a1[i], 123);
197      }
198      test_2ci_oppos(a1, a2);
199      for (int i=0; i<ARRLEN; i++) {
200        errn += verify("test_2ci_oppos: a1", i, a1[i], -123);
201        errn += verify("test_2ci_oppos: a2", i, a2[i], -103);
202      }
203      test_2vi_oppos(a1, a2, 123, 103);
204      for (int i=0; i<ARRLEN; i++) {
205        errn += verify("test_2vi_oppos: a1", i, a1[i], 123);
206        errn += verify("test_2vi_oppos: a2", i, a2[i], 103);
207      }
208      // Reset for indexing with offset
209      for (int i=0; i<ARRLEN; i++) {
210        a1[i] = -1;
211        a2[i] = -1;
212      }
213      test_ci_off(a1, -1);
214      for (int i=OFFSET; i<ARRLEN; i++) {
215        errn += verify("test_ci_off: a1", i, a1[i], -123);
216      }
217      test_vi_off(a2, 123, -1);
218      for (int i=OFFSET; i<ARRLEN; i++) {
219        errn += verify("test_vi_off: a2", i, a2[i], 123);
220      }
221      test_cp_off(a1, a2);
222      for (int i=OFFSET; i<ARRLEN; i++) {
223        errn += verify("test_cp_off: a1", i, a1[i], 123);
224      }
225      test_2ci_off(a1, a2);
226      for (int i=OFFSET; i<ARRLEN; i++) {
227        errn += verify("test_2ci_off: a1", i, a1[i], -123);
228        errn += verify("test_2ci_off: a2", i, a2[i], -103);
229      }
230      test_2vi_off(a1, a2, 123, 103);
231      for (int i=OFFSET; i<ARRLEN; i++) {
232        errn += verify("test_2vi_off: a1", i, a1[i], 123);
233        errn += verify("test_2vi_off: a2", i, a2[i], 103);
234      }
235      for (int i=0; i<OFFSET; i++) {
236        errn += verify("test_2vi_off: a1", i, a1[i], -1);
237        errn += verify("test_2vi_off: a2", i, a2[i], -1);
238      }
239      // Reset for indexing with invariant offset
240      for (int i=0; i<ARRLEN; i++) {
241        a1[i] = -1;
242        a2[i] = -1;
243      }
244      test_ci_inv(a1, OFFSET, -1);
245      for (int i=OFFSET; i<ARRLEN; i++) {
246        errn += verify("test_ci_inv: a1", i, a1[i], -123);
247      }
248      test_vi_inv(a2, 123, OFFSET, -1);
249      for (int i=OFFSET; i<ARRLEN; i++) {
250        errn += verify("test_vi_inv: a2", i, a2[i], 123);
251      }
252      test_cp_inv(a1, a2, OFFSET);
253      for (int i=OFFSET; i<ARRLEN; i++) {
254        errn += verify("test_cp_inv: a1", i, a1[i], 123);
255      }
256      test_2ci_inv(a1, a2, OFFSET);
257      for (int i=OFFSET; i<ARRLEN; i++) {
258        errn += verify("test_2ci_inv: a1", i, a1[i], -123);
259        errn += verify("test_2ci_inv: a2", i, a2[i], -103);
260      }
261      test_2vi_inv(a1, a2, 123, 103, OFFSET);
262      for (int i=OFFSET; i<ARRLEN; i++) {
263        errn += verify("test_2vi_inv: a1", i, a1[i], 123);
264        errn += verify("test_2vi_inv: a2", i, a2[i], 103);
265      }
266      for (int i=0; i<OFFSET; i++) {
267        errn += verify("test_2vi_inv: a1", i, a1[i], -1);
268        errn += verify("test_2vi_inv: a2", i, a2[i], -1);
269      }
270      // Reset for indexing with scale
271      for (int i=0; i<ARRLEN; i++) {
272        a1[i] = -1;
273        a2[i] = -1;
274      }
275      test_ci_scl(a1, -1);
276      for (int i=0; i<ARRLEN; i++) {
277        int val = (i%SCALE != 0) ? -1 : -123;
278        errn += verify("test_ci_scl: a1", i, a1[i], val);
279      }
280      test_vi_scl(a2, 123, -1);
281      for (int i=0; i<ARRLEN; i++) {
282        int val = (i%SCALE != 0) ? -1 : 123;
283        errn += verify("test_vi_scl: a2", i, a2[i], val);
284      }
285      test_cp_scl(a1, a2);
286      for (int i=0; i<ARRLEN; i++) {
287        int val = (i%SCALE != 0) ? -1 : 123;
288        errn += verify("test_cp_scl: a1", i, a1[i], val);
289      }
290      test_2ci_scl(a1, a2);
291      for (int i=0; i<ARRLEN; i++) {
292        if (i%SCALE != 0) {
293          errn += verify("test_2ci_scl: a1", i, a1[i], -1);
294        } else if (i*SCALE < ARRLEN) {
295          errn += verify("test_2ci_scl: a1", i*SCALE, a1[i*SCALE], -123);
296        }
297        if (i%SCALE != 0) {
298          errn += verify("test_2ci_scl: a2", i, a2[i], -1);
299        } else if (i*SCALE < ARRLEN) {
300          errn += verify("test_2ci_scl: a2", i*SCALE, a2[i*SCALE], -103);
301        }
302      }
303      test_2vi_scl(a1, a2, 123, 103);
304      for (int i=0; i<ARRLEN; i++) {
305        if (i%SCALE != 0) {
306          errn += verify("test_2vi_scl: a1", i, a1[i], -1);
307        } else if (i*SCALE < ARRLEN) {
308          errn += verify("test_2vi_scl: a1", i*SCALE, a1[i*SCALE], 123);
309        }
310        if (i%SCALE != 0) {
311          errn += verify("test_2vi_scl: a2", i, a2[i], -1);
312        } else if (i*SCALE < ARRLEN) {
313          errn += verify("test_2vi_scl: a2", i*SCALE, a2[i*SCALE], 103);
314        }
315      }
316      // Reset for 2 arrays with relative aligned offset
317      for (int i=0; i<ARRLEN; i++) {
318        a1[i] = -1;
319        a2[i] = -1;
320      }
321      test_vi(a2, 123, -1);
322      test_cp_alndst(a1, a2);
323      for (int i=0; i<ALIGN_OFF; i++) {
324        errn += verify("test_cp_alndst: a1", i, a1[i], -1);
325      }
326      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
327        errn += verify("test_cp_alndst: a1", i, a1[i], 123);
328      }
329      for (int i=0; i<ALIGN_OFF; i++) {
330        a1[i] = 123;
331      }
332      test_vi(a2, -123, 123);
333      test_cp_alnsrc(a1, a2);
334      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
335        errn += verify("test_cp_alnsrc: a1", i, a1[i], -123);
336      }
337      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
338        errn += verify("test_cp_alnsrc: a1", i, a1[i], 123);
339      }
340      for (int i=0; i<ARRLEN; i++) {
341        a1[i] = -1;
342        a2[i] = -1;
343      }
344      test_2ci_aln(a1, a2);
345      for (int i=0; i<ALIGN_OFF; i++) {
346        errn += verify("test_2ci_aln: a1", i, a1[i], -1);
347      }
348      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
349        errn += verify("test_2ci_aln: a1", i, a1[i], -123);
350      }
351      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
352        errn += verify("test_2ci_aln: a2", i, a2[i], -103);
353      }
354      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
355        errn += verify("test_2ci_aln: a2", i, a2[i], -1);
356      }
357      for (int i=0; i<ARRLEN; i++) {
358        a1[i] = -1;
359        a2[i] = -1;
360      }
361      test_2vi_aln(a1, a2, 123, 103);
362      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
363        errn += verify("test_2vi_aln: a1", i, a1[i], 123);
364      }
365      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
366        errn += verify("test_2vi_aln: a1", i, a1[i], -1);
367      }
368      for (int i=0; i<ALIGN_OFF; i++) {
369        errn += verify("test_2vi_aln: a2", i, a2[i], -1);
370      }
371      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
372        errn += verify("test_2vi_aln: a2", i, a2[i], 103);
373      }
374
375      // Reset for 2 arrays with relative unaligned offset
376      for (int i=0; i<ARRLEN; i++) {
377        a1[i] = -1;
378        a2[i] = -1;
379      }
380      test_vi(a2, 123, -1);
381      test_cp_unalndst(a1, a2);
382      for (int i=0; i<UNALIGN_OFF; i++) {
383        errn += verify("test_cp_unalndst: a1", i, a1[i], -1);
384      }
385      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
386        errn += verify("test_cp_unalndst: a1", i, a1[i], 123);
387      }
388      test_vi(a2, -123, 123);
389      test_cp_unalnsrc(a1, a2);
390      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
391        errn += verify("test_cp_unalnsrc: a1", i, a1[i], -123);
392      }
393      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
394        errn += verify("test_cp_unalnsrc: a1", i, a1[i], 123);
395      }
396      for (int i=0; i<ARRLEN; i++) {
397        a1[i] = -1;
398        a2[i] = -1;
399      }
400      test_2ci_unaln(a1, a2);
401      for (int i=0; i<UNALIGN_OFF; i++) {
402        errn += verify("test_2ci_unaln: a1", i, a1[i], -1);
403      }
404      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
405        errn += verify("test_2ci_unaln: a1", i, a1[i], -123);
406      }
407      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
408        errn += verify("test_2ci_unaln: a2", i, a2[i], -103);
409      }
410      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
411        errn += verify("test_2ci_unaln: a2", i, a2[i], -1);
412      }
413      for (int i=0; i<ARRLEN; i++) {
414        a1[i] = -1;
415        a2[i] = -1;
416      }
417      test_2vi_unaln(a1, a2, 123, 103);
418      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
419        errn += verify("test_2vi_unaln: a1", i, a1[i], 123);
420      }
421      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
422        errn += verify("test_2vi_unaln: a1", i, a1[i], -1);
423      }
424      for (int i=0; i<UNALIGN_OFF; i++) {
425        errn += verify("test_2vi_unaln: a2", i, a2[i], -1);
426      }
427      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
428        errn += verify("test_2vi_unaln: a2", i, a2[i], 103);
429      }
430
431      // Reset for aligned overlap initialization
432      for (int i=0; i<ALIGN_OFF; i++) {
433        a1[i] = i;
434      }
435      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
436        a1[i] = -1;
437      }
438      test_cp_alndst(a1, a1);
439      for (int i=0; i<ARRLEN; i++) {
440        int v = i%ALIGN_OFF;
441        errn += verify("test_cp_alndst_overlap: a1", i, a1[i], v);
442      }
443      for (int i=0; i<ALIGN_OFF; i++) {
444        a1[i+ALIGN_OFF] = -1;
445      }
446      test_cp_alnsrc(a1, a1);
447      for (int i=0; i<ALIGN_OFF; i++) {
448        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], -1);
449      }
450      for (int i=ALIGN_OFF; i<ARRLEN; i++) {
451        int v = i%ALIGN_OFF;
452        errn += verify("test_cp_alnsrc_overlap: a1", i, a1[i], v);
453      }
454      for (int i=0; i<ARRLEN; i++) {
455        a1[i] = -1;
456      }
457      test_2ci_aln(a1, a1);
458      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
459        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -103);
460      }
461      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
462        errn += verify("test_2ci_aln_overlap: a1", i, a1[i], -123);
463      }
464      for (int i=0; i<ARRLEN; i++) {
465        a1[i] = -1;
466      }
467      test_2vi_aln(a1, a1, 123, 103);
468      for (int i=0; i<ARRLEN-ALIGN_OFF; i++) {
469        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 123);
470      }
471      for (int i=ARRLEN-ALIGN_OFF; i<ARRLEN; i++) {
472        errn += verify("test_2vi_aln_overlap: a1", i, a1[i], 103);
473      }
474
475      // Reset for unaligned overlap initialization
476      for (int i=0; i<UNALIGN_OFF; i++) {
477        a1[i] = i;
478      }
479      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
480        a1[i] = -1;
481      }
482      test_cp_unalndst(a1, a1);
483      for (int i=0; i<ARRLEN; i++) {
484        int v = i%UNALIGN_OFF;
485        errn += verify("test_cp_unalndst_overlap: a1", i, a1[i], v);
486      }
487      for (int i=0; i<UNALIGN_OFF; i++) {
488        a1[i+UNALIGN_OFF] = -1;
489      }
490      test_cp_unalnsrc(a1, a1);
491      for (int i=0; i<UNALIGN_OFF; i++) {
492        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], -1);
493      }
494      for (int i=UNALIGN_OFF; i<ARRLEN; i++) {
495        int v = i%UNALIGN_OFF;
496        errn += verify("test_cp_unalnsrc_overlap: a1", i, a1[i], v);
497      }
498      for (int i=0; i<ARRLEN; i++) {
499        a1[i] = -1;
500      }
501      test_2ci_unaln(a1, a1);
502      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
503        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -103);
504      }
505      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
506        errn += verify("test_2ci_unaln_overlap: a1", i, a1[i], -123);
507      }
508      for (int i=0; i<ARRLEN; i++) {
509        a1[i] = -1;
510      }
511      test_2vi_unaln(a1, a1, 123, 103);
512      for (int i=0; i<ARRLEN-UNALIGN_OFF; i++) {
513        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 123);
514      }
515      for (int i=ARRLEN-UNALIGN_OFF; i<ARRLEN; i++) {
516        errn += verify("test_2vi_unaln_overlap: a1", i, a1[i], 103);
517      }
518
519    }
520
521    if (errn > 0 || test_only)
522      return errn;
523
524    // Initialize
525    for (int i=0; i<ARRLEN; i++) {
526      a1[i] = -1;
527      a2[i] = -1;
528    }
529    System.out.println("Time");
530    long start, end;
531    start = System.currentTimeMillis();
532    for (int i=0; i<ITERS; i++) {
533      test_ci(a1);
534    }
535    end = System.currentTimeMillis();
536    System.out.println("test_ci: " + (end - start));
537    start = System.currentTimeMillis();
538    for (int i=0; i<ITERS; i++) {
539      test_vi(a2, 123, -1);
540    }
541    end = System.currentTimeMillis();
542    System.out.println("test_vi: " + (end - start));
543    start = System.currentTimeMillis();
544    for (int i=0; i<ITERS; i++) {
545      test_cp(a1, a2);
546    }
547    end = System.currentTimeMillis();
548    System.out.println("test_cp: " + (end - start));
549    start = System.currentTimeMillis();
550    for (int i=0; i<ITERS; i++) {
551      test_2ci(a1, a2);
552    }
553    end = System.currentTimeMillis();
554    System.out.println("test_2ci: " + (end - start));
555    start = System.currentTimeMillis();
556    for (int i=0; i<ITERS; i++) {
557      test_2vi(a1, a2, 123, 103);
558    }
559    end = System.currentTimeMillis();
560    System.out.println("test_2vi: " + (end - start));
561
562    start = System.currentTimeMillis();
563    for (int i=0; i<ITERS; i++) {
564      test_ci_neg(a1, 123);
565    }
566    end = System.currentTimeMillis();
567    System.out.println("test_ci_neg: " + (end - start));
568    start = System.currentTimeMillis();
569    for (int i=0; i<ITERS; i++) {
570      test_vi_neg(a2, 123, 103);
571    }
572    end = System.currentTimeMillis();
573    System.out.println("test_vi_neg: " + (end - start));
574    start = System.currentTimeMillis();
575    for (int i=0; i<ITERS; i++) {
576      test_cp_neg(a1, a2);
577    }
578    end = System.currentTimeMillis();
579    System.out.println("test_cp_neg: " + (end - start));
580    start = System.currentTimeMillis();
581    for (int i=0; i<ITERS; i++) {
582      test_2ci_neg(a1, a2);
583    }
584    end = System.currentTimeMillis();
585    System.out.println("test_2ci_neg: " + (end - start));
586    start = System.currentTimeMillis();
587    for (int i=0; i<ITERS; i++) {
588      test_2vi_neg(a1, a2, 123, 103);
589    }
590    end = System.currentTimeMillis();
591    System.out.println("test_2vi_neg: " + (end - start));
592
593    start = System.currentTimeMillis();
594    for (int i=0; i<ITERS; i++) {
595      test_ci_oppos(a1, 123);
596    }
597    end = System.currentTimeMillis();
598    System.out.println("test_ci_oppos: " + (end - start));
599    start = System.currentTimeMillis();
600    for (int i=0; i<ITERS; i++) {
601      test_vi_oppos(a2, 123, 103);
602    }
603    end = System.currentTimeMillis();
604    System.out.println("test_vi_oppos: " + (end - start));
605    start = System.currentTimeMillis();
606    for (int i=0; i<ITERS; i++) {
607      test_cp_oppos(a1, a2);
608    }
609    end = System.currentTimeMillis();
610    System.out.println("test_cp_oppos: " + (end - start));
611    start = System.currentTimeMillis();
612    for (int i=0; i<ITERS; i++) {
613      test_2ci_oppos(a1, a2);
614    }
615    end = System.currentTimeMillis();
616    System.out.println("test_2ci_oppos: " + (end - start));
617    start = System.currentTimeMillis();
618    for (int i=0; i<ITERS; i++) {
619      test_2vi_oppos(a1, a2, 123, 103);
620    }
621    end = System.currentTimeMillis();
622    System.out.println("test_2vi_oppos: " + (end - start));
623
624    start = System.currentTimeMillis();
625    for (int i=0; i<ITERS; i++) {
626      test_ci_off(a1, 123);
627    }
628    end = System.currentTimeMillis();
629    System.out.println("test_ci_off: " + (end - start));
630    start = System.currentTimeMillis();
631    for (int i=0; i<ITERS; i++) {
632      test_vi_off(a2, 123, 103);
633    }
634    end = System.currentTimeMillis();
635    System.out.println("test_vi_off: " + (end - start));
636    start = System.currentTimeMillis();
637    for (int i=0; i<ITERS; i++) {
638      test_cp_off(a1, a2);
639    }
640    end = System.currentTimeMillis();
641    System.out.println("test_cp_off: " + (end - start));
642    start = System.currentTimeMillis();
643    for (int i=0; i<ITERS; i++) {
644      test_2ci_off(a1, a2);
645    }
646    end = System.currentTimeMillis();
647    System.out.println("test_2ci_off: " + (end - start));
648    start = System.currentTimeMillis();
649    for (int i=0; i<ITERS; i++) {
650      test_2vi_off(a1, a2, 123, 103);
651    }
652    end = System.currentTimeMillis();
653    System.out.println("test_2vi_off: " + (end - start));
654
655    start = System.currentTimeMillis();
656    for (int i=0; i<ITERS; i++) {
657      test_ci_inv(a1, OFFSET, 123);
658    }
659    end = System.currentTimeMillis();
660    System.out.println("test_ci_inv: " + (end - start));
661    start = System.currentTimeMillis();
662    for (int i=0; i<ITERS; i++) {
663      test_vi_inv(a2, 123, OFFSET, 103);
664    }
665    end = System.currentTimeMillis();
666    System.out.println("test_vi_inv: " + (end - start));
667    start = System.currentTimeMillis();
668    for (int i=0; i<ITERS; i++) {
669      test_cp_inv(a1, a2, OFFSET);
670    }
671    end = System.currentTimeMillis();
672    System.out.println("test_cp_inv: " + (end - start));
673    start = System.currentTimeMillis();
674    for (int i=0; i<ITERS; i++) {
675      test_2ci_inv(a1, a2, OFFSET);
676    }
677    end = System.currentTimeMillis();
678    System.out.println("test_2ci_inv: " + (end - start));
679    start = System.currentTimeMillis();
680    for (int i=0; i<ITERS; i++) {
681      test_2vi_inv(a1, a2, 123, 103, OFFSET);
682    }
683    end = System.currentTimeMillis();
684    System.out.println("test_2vi_inv: " + (end - start));
685
686    start = System.currentTimeMillis();
687    for (int i=0; i<ITERS; i++) {
688      test_ci_scl(a1, 123);
689    }
690    end = System.currentTimeMillis();
691    System.out.println("test_ci_scl: " + (end - start));
692    start = System.currentTimeMillis();
693    for (int i=0; i<ITERS; i++) {
694      test_vi_scl(a2, 123, 103);
695    }
696    end = System.currentTimeMillis();
697    System.out.println("test_vi_scl: " + (end - start));
698    start = System.currentTimeMillis();
699    for (int i=0; i<ITERS; i++) {
700      test_cp_scl(a1, a2);
701    }
702    end = System.currentTimeMillis();
703    System.out.println("test_cp_scl: " + (end - start));
704    start = System.currentTimeMillis();
705    for (int i=0; i<ITERS; i++) {
706      test_2ci_scl(a1, a2);
707    }
708    end = System.currentTimeMillis();
709    System.out.println("test_2ci_scl: " + (end - start));
710    start = System.currentTimeMillis();
711    for (int i=0; i<ITERS; i++) {
712      test_2vi_scl(a1, a2, 123, 103);
713    }
714    end = System.currentTimeMillis();
715    System.out.println("test_2vi_scl: " + (end - start));
716
717    start = System.currentTimeMillis();
718    for (int i=0; i<ITERS; i++) {
719      test_cp_alndst(a1, a2);
720    }
721    end = System.currentTimeMillis();
722    System.out.println("test_cp_alndst: " + (end - start));
723    start = System.currentTimeMillis();
724    for (int i=0; i<ITERS; i++) {
725      test_cp_alnsrc(a1, a2);
726    }
727    end = System.currentTimeMillis();
728    System.out.println("test_cp_alnsrc: " + (end - start));
729    start = System.currentTimeMillis();
730    for (int i=0; i<ITERS; i++) {
731      test_2ci_aln(a1, a2);
732    }
733    end = System.currentTimeMillis();
734    System.out.println("test_2ci_aln: " + (end - start));
735    start = System.currentTimeMillis();
736    for (int i=0; i<ITERS; i++) {
737      test_2vi_aln(a1, a2, 123, 103);
738    }
739    end = System.currentTimeMillis();
740    System.out.println("test_2vi_aln: " + (end - start));
741
742    start = System.currentTimeMillis();
743    for (int i=0; i<ITERS; i++) {
744      test_cp_unalndst(a1, a2);
745    }
746    end = System.currentTimeMillis();
747    System.out.println("test_cp_unalndst: " + (end - start));
748    start = System.currentTimeMillis();
749    for (int i=0; i<ITERS; i++) {
750      test_cp_unalnsrc(a1, a2);
751    }
752    end = System.currentTimeMillis();
753    System.out.println("test_cp_unalnsrc: " + (end - start));
754    start = System.currentTimeMillis();
755    for (int i=0; i<ITERS; i++) {
756      test_2ci_unaln(a1, a2);
757    }
758    end = System.currentTimeMillis();
759    System.out.println("test_2ci_unaln: " + (end - start));
760    start = System.currentTimeMillis();
761    for (int i=0; i<ITERS; i++) {
762      test_2vi_unaln(a1, a2, 123, 103);
763    }
764    end = System.currentTimeMillis();
765    System.out.println("test_2vi_unaln: " + (end - start));
766
767    return errn;
768  }
769
770  private final static long byte_offset(int i) {
771    return ((long)i << 2) + BASE;
772  }
773
774  static void test_ci(int[] a) {
775    for (int i = 0; i < ARRLEN; i+=1) {
776      unsafe.putIntRelease(a, byte_offset(i), -123);
777    }
778  }
779  static void test_vi(int[] a, int b, int old) {
780    for (int i = 0; i < ARRLEN; i+=1) {
781      unsafe.putIntRelease(a, byte_offset(i), b);
782    }
783  }
784  static void test_cp(int[] a, int[] b) {
785    for (int i = 0; i < ARRLEN; i+=1) {
786      unsafe.putIntRelease(a, byte_offset(i), b[i]);
787    }
788  }
789  static void test_2ci(int[] a, int[] b) {
790    for (int i = 0; i < ARRLEN; i+=1) {
791      unsafe.putIntRelease(a, byte_offset(i), -123);
792      unsafe.putIntRelease(b, byte_offset(i), -103);
793    }
794  }
795  static void test_2vi(int[] a, int[] b, int c, int d) {
796    for (int i = 0; i < ARRLEN; i+=1) {
797      unsafe.putIntRelease(a, byte_offset(i), c);
798      unsafe.putIntRelease(b, byte_offset(i), d);
799    }
800  }
801  static void test_ci_neg(int[] a, int old) {
802    for (int i = ARRLEN-1; i >= 0; i-=1) {
803      unsafe.putIntRelease(a, byte_offset(i), -123);
804    }
805  }
806  static void test_vi_neg(int[] a, int b, int old) {
807    for (int i = ARRLEN-1; i >= 0; i-=1) {
808      unsafe.putIntRelease(a, byte_offset(i), b);
809    }
810  }
811  static void test_cp_neg(int[] a, int[] b) {
812    for (int i = ARRLEN-1; i >= 0; i-=1) {
813      unsafe.putIntRelease(a, byte_offset(i), b[i]);
814    }
815  }
816  static void test_2ci_neg(int[] a, int[] b) {
817    for (int i = ARRLEN-1; i >= 0; i-=1) {
818      unsafe.putIntRelease(a, byte_offset(i), -123);
819      unsafe.putIntRelease(b, byte_offset(i), -103);
820    }
821  }
822  static void test_2vi_neg(int[] a, int[] b, int c, int d) {
823    for (int i = ARRLEN-1; i >= 0; i-=1) {
824      unsafe.putIntRelease(a, byte_offset(i), c);
825      unsafe.putIntRelease(b, byte_offset(i), d);
826    }
827  }
828  static void test_ci_oppos(int[] a, int old) {
829    int limit = ARRLEN-1;
830    for (int i = 0; i < ARRLEN; i+=1) {
831      unsafe.putIntRelease(a, byte_offset(limit-i), -123);
832    }
833  }
834  static void test_vi_oppos(int[] a, int b, int old) {
835    int limit = ARRLEN-1;
836    for (int i = limit; i >= 0; i-=1) {
837      unsafe.putIntRelease(a, byte_offset(limit-i), b);
838    }
839  }
840  static void test_cp_oppos(int[] a, int[] b) {
841    int limit = ARRLEN-1;
842    for (int i = 0; i < ARRLEN; i+=1) {
843      unsafe.putIntRelease(a, byte_offset(i), b[limit-i]);
844    }
845  }
846  static void test_2ci_oppos(int[] a, int[] b) {
847    int limit = ARRLEN-1;
848    for (int i = 0; i < ARRLEN; i+=1) {
849      unsafe.putIntRelease(a, byte_offset(limit-i), -123);
850      unsafe.putIntRelease(b, byte_offset(i), -103);
851    }
852  }
853  static void test_2vi_oppos(int[] a, int[] b, int c, int d) {
854    int limit = ARRLEN-1;
855    for (int i = limit; i >= 0; i-=1) {
856      unsafe.putIntRelease(a, byte_offset(i), c);
857      unsafe.putIntRelease(b, byte_offset(limit-i), d);
858    }
859  }
860  static void test_ci_off(int[] a, int old) {
861    for (int i = 0; i < ARRLEN-OFFSET; i+=1) {
862      unsafe.putIntRelease(a, byte_offset(i+OFFSET), -123);
863    }
864  }
865  static void test_vi_off(int[] a, int b, int old) {
866    for (int i = 0; i < ARRLEN-OFFSET; i+=1) {
867      unsafe.putIntRelease(a, byte_offset(i+OFFSET), b);
868    }
869  }
870  static void test_cp_off(int[] a, int[] b) {
871    for (int i = 0; i < ARRLEN-OFFSET; i+=1) {
872      unsafe.putIntRelease(a, byte_offset(i+OFFSET), b[i+OFFSET]);
873    }
874  }
875  static void test_2ci_off(int[] a, int[] b) {
876    for (int i = 0; i < ARRLEN-OFFSET; i+=1) {
877      unsafe.putIntRelease(a, byte_offset(i+OFFSET), -123);
878      unsafe.putIntRelease(b, byte_offset(i+OFFSET), -103);
879    }
880  }
881  static void test_2vi_off(int[] a, int[] b, int c, int d) {
882    for (int i = 0; i < ARRLEN-OFFSET; i+=1) {
883      unsafe.putIntRelease(a, byte_offset(i+OFFSET), c);
884      unsafe.putIntRelease(b, byte_offset(i+OFFSET), d);
885    }
886  }
887  static void test_ci_inv(int[] a, int k, int old) {
888    for (int i = 0; i < ARRLEN-k; i+=1) {
889      unsafe.putIntRelease(a, byte_offset(i+k), -123);
890    }
891  }
892  static void test_vi_inv(int[] a, int b, int k, int old) {
893    for (int i = 0; i < ARRLEN-k; i+=1) {
894      unsafe.putIntRelease(a, byte_offset(i+k), b);
895    }
896  }
897  static void test_cp_inv(int[] a, int[] b, int k) {
898    for (int i = 0; i < ARRLEN-k; i+=1) {
899      unsafe.putIntRelease(a, byte_offset(i+k), b[i+k]);
900    }
901  }
902  static void test_2ci_inv(int[] a, int[] b, int k) {
903    for (int i = 0; i < ARRLEN-k; i+=1) {
904      unsafe.putIntRelease(a, byte_offset(i+k), -123);
905      unsafe.putIntRelease(b, byte_offset(i+k), -103);
906    }
907  }
908  static void test_2vi_inv(int[] a, int[] b, int c, int d, int k) {
909    for (int i = 0; i < ARRLEN-k; i+=1) {
910      unsafe.putIntRelease(a, byte_offset(i+k), c);
911      unsafe.putIntRelease(b, byte_offset(i+k), d);
912    }
913  }
914  static void test_ci_scl(int[] a, int old) {
915    for (int i = 0; i*SCALE < ARRLEN; i+=1) {
916      unsafe.putIntRelease(a, byte_offset(i*SCALE), -123);
917    }
918  }
919  static void test_vi_scl(int[] a, int b, int old) {
920    for (int i = 0; i*SCALE < ARRLEN; i+=1) {
921      unsafe.putIntRelease(a, byte_offset(i*SCALE), b);
922    }
923  }
924  static void test_cp_scl(int[] a, int[] b) {
925    for (int i = 0; i*SCALE < ARRLEN; i+=1) {
926      unsafe.putIntRelease(a, byte_offset(i*SCALE), b[i*SCALE]);
927    }
928  }
929  static void test_2ci_scl(int[] a, int[] b) {
930    for (int i = 0; i*SCALE < ARRLEN; i+=1) {
931      unsafe.putIntRelease(a, byte_offset(i*SCALE), -123);
932      unsafe.putIntRelease(b, byte_offset(i*SCALE), -103);
933    }
934  }
935  static void test_2vi_scl(int[] a, int[] b, int c, int d) {
936    for (int i = 0; i*SCALE < ARRLEN; i+=1) {
937      unsafe.putIntRelease(a, byte_offset(i*SCALE), c);
938      unsafe.putIntRelease(b, byte_offset(i*SCALE), d);
939    }
940  }
941  static void test_cp_alndst(int[] a, int[] b) {
942    for (int i = 0; i < ARRLEN-ALIGN_OFF; i+=1) {
943      unsafe.putIntRelease(a, byte_offset(i+ALIGN_OFF), b[i]);
944    }
945  }
946  static void test_cp_alnsrc(int[] a, int[] b) {
947    for (int i = 0; i < ARRLEN-ALIGN_OFF; i+=1) {
948      unsafe.putIntRelease(a, byte_offset(i), b[i+ALIGN_OFF]);
949    }
950  }
951  static void test_2ci_aln(int[] a, int[] b) {
952    for (int i = 0; i < ARRLEN-ALIGN_OFF; i+=1) {
953      unsafe.putIntRelease(a, byte_offset(i+ALIGN_OFF), -123);
954      unsafe.putIntRelease(b, byte_offset(i), -103);
955    }
956  }
957  static void test_2vi_aln(int[] a, int[] b, int c, int d) {
958    for (int i = 0; i < ARRLEN-ALIGN_OFF; i+=1) {
959      unsafe.putIntRelease(a, byte_offset(i), c);
960      unsafe.putIntRelease(b, byte_offset(i+ALIGN_OFF), d);
961    }
962  }
963  static void test_cp_unalndst(int[] a, int[] b) {
964    for (int i = 0; i < ARRLEN-UNALIGN_OFF; i+=1) {
965      unsafe.putIntRelease(a, byte_offset(i+UNALIGN_OFF), b[i]);
966    }
967  }
968  static void test_cp_unalnsrc(int[] a, int[] b) {
969    for (int i = 0; i < ARRLEN-UNALIGN_OFF; i+=1) {
970      unsafe.putIntRelease(a, byte_offset(i), b[i+UNALIGN_OFF]);
971    }
972  }
973  static void test_2ci_unaln(int[] a, int[] b) {
974    for (int i = 0; i < ARRLEN-UNALIGN_OFF; i+=1) {
975      unsafe.putIntRelease(a, byte_offset(i+UNALIGN_OFF), -123);
976      unsafe.putIntRelease(b, byte_offset(i), -103);
977    }
978  }
979  static void test_2vi_unaln(int[] a, int[] b, int c, int d) {
980    for (int i = 0; i < ARRLEN-UNALIGN_OFF; i+=1) {
981      unsafe.putIntRelease(a, byte_offset(i), c);
982      unsafe.putIntRelease(b, byte_offset(i+UNALIGN_OFF), d);
983    }
984  }
985
986  static int verify(String text, int i, int elem, int val) {
987    if (elem != val) {
988      System.err.println(text + "[" + i + "] = " + elem + " != " + val);
989      return 1;
990    }
991    return 0;
992  }
993}
994