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