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