test/compiler/6340864/TestShortVect.java

Mon, 20 Aug 2012 09:07:21 -0700

author
kvn
date
Mon, 20 Aug 2012 09:07:21 -0700
changeset 4001
006050192a5a
child 4204
b2c669fd8114
permissions
-rw-r--r--

6340864: Implement vectorization optimizations in hotspot-server
Summary: Added asm encoding and mach nodes for vector arithmetic instructions on x86.
Reviewed-by: roland

     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  */
    25 /**
    26  * @test
    27  * @bug 6340864
    28  * @summary Implement vectorization optimizations in hotspot-server
    29  *
    30  * @run main/othervm/timeout=400 -Xbatch -Xmx64m TestShortVect
    31  */
    33 public class TestShortVect {
    34   private static final int ARRLEN = 997;
    35   private static final int ITERS  = 11000;
    36   private static final int ADD_INIT = Short.MAX_VALUE-500;
    37   private static final int BIT_MASK = 0xB731;
    38   private static final int VALUE = 7;
    39   private static final int SHIFT = 16;
    41   public static void main(String args[]) {
    42     System.out.println("Testing Short 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   }
    51   static int test() {
    52     short[] a0 = new short[ARRLEN];
    53     short[] a1 = new short[ARRLEN];
    54     short[] a2 = new short[ARRLEN];
    55     short[] a3 = new short[ARRLEN];
    56     short[] a4 = new short[ARRLEN];
    57      int[] p2 = new  int[ARRLEN/2];
    58     long[] p4 = new long[ARRLEN/4];
    59     // Initialize
    60     int gold_sum = 0;
    61     for (int i=0; i<ARRLEN; i++) {
    62       short val = (short)(ADD_INIT+i);
    63       gold_sum += val;
    64       a1[i] = val;
    65       a2[i] = (short)VALUE;
    66       a3[i] = (short)-VALUE;
    67       a4[i] = (short)BIT_MASK;
    68     }
    69     System.out.println("Warmup");
    70     for (int i=0; i<ITERS; i++) {
    71       test_sum(a1);
    72       test_addc(a0, a1);
    73       test_addv(a0, a1, (short)VALUE);
    74       test_adda(a0, a1, a2);
    75       test_subc(a0, a1);
    76       test_subv(a0, a1, (short)VALUE);
    77       test_suba(a0, a1, a2);
    78       test_mulc(a0, a1);
    79       test_mulv(a0, a1, (short)VALUE);
    80       test_mula(a0, a1, a2);
    81       test_divc(a0, a1);
    82       test_divv(a0, a1, (short)VALUE);
    83       test_diva(a0, a1, a2);
    84       test_mulc_n(a0, a1);
    85       test_mulv(a0, a1, (short)-VALUE);
    86       test_mula(a0, a1, a3);
    87       test_divc_n(a0, a1);
    88       test_divv(a0, a1, (short)-VALUE);
    89       test_diva(a0, a1, a3);
    90       test_andc(a0, a1);
    91       test_andv(a0, a1, (short)BIT_MASK);
    92       test_anda(a0, a1, a4);
    93       test_orc(a0, a1);
    94       test_orv(a0, a1, (short)BIT_MASK);
    95       test_ora(a0, a1, a4);
    96       test_xorc(a0, a1);
    97       test_xorv(a0, a1, (short)BIT_MASK);
    98       test_xora(a0, a1, a4);
    99       test_sllc(a0, a1);
   100       test_sllv(a0, a1, VALUE);
   101       test_srlc(a0, a1);
   102       test_srlv(a0, a1, VALUE);
   103       test_srac(a0, a1);
   104       test_srav(a0, a1, VALUE);
   105       test_sllc_n(a0, a1);
   106       test_sllv(a0, a1, -VALUE);
   107       test_srlc_n(a0, a1);
   108       test_srlv(a0, a1, -VALUE);
   109       test_srac_n(a0, a1);
   110       test_srav(a0, a1, -VALUE);
   111       test_sllc_o(a0, a1);
   112       test_sllv(a0, a1, SHIFT);
   113       test_srlc_o(a0, a1);
   114       test_srlv(a0, a1, SHIFT);
   115       test_srac_o(a0, a1);
   116       test_srav(a0, a1, SHIFT);
   117       test_sllc_on(a0, a1);
   118       test_sllv(a0, a1, -SHIFT);
   119       test_srlc_on(a0, a1);
   120       test_srlv(a0, a1, -SHIFT);
   121       test_srac_on(a0, a1);
   122       test_srav(a0, a1, -SHIFT);
   123       test_pack2(p2, a1);
   124       test_unpack2(a0, p2);
   125       test_pack2_swap(p2, a1);
   126       test_unpack2_swap(a0, p2);
   127       test_pack4(p4, a1);
   128       test_unpack4(a0, p4);
   129       test_pack4_swap(p4, a1);
   130       test_unpack4_swap(a0, p4);
   131     }
   132     // Test and verify results
   133     System.out.println("Verification");
   134     int errn = 0;
   135     {
   136       int sum = test_sum(a1);
   137       if (sum != gold_sum) {
   138         System.err.println("test_sum:  " + sum + " != " + gold_sum);
   139         errn++;
   140       }
   142       test_addc(a0, a1);
   143       for (int i=0; i<ARRLEN; i++) {
   144         errn += verify("test_addc: ", i, a0[i], (short)((short)(ADD_INIT+i)+VALUE));
   145       }
   146       test_addv(a0, a1, (short)VALUE);
   147       for (int i=0; i<ARRLEN; i++) {
   148         errn += verify("test_addv: ", i, a0[i], (short)((short)(ADD_INIT+i)+VALUE));
   149       }
   150       test_adda(a0, a1, a2);
   151       for (int i=0; i<ARRLEN; i++) {
   152         errn += verify("test_adda: ", i, a0[i], (short)((short)(ADD_INIT+i)+VALUE));
   153       }
   155       test_subc(a0, a1);
   156       for (int i=0; i<ARRLEN; i++) {
   157         errn += verify("test_subc: ", i, a0[i], (short)((short)(ADD_INIT+i)-VALUE));
   158       }
   159       test_subv(a0, a1, (short)VALUE);
   160       for (int i=0; i<ARRLEN; i++) {
   161         errn += verify("test_subv: ", i, a0[i], (short)((short)(ADD_INIT+i)-VALUE));
   162       }
   163       test_suba(a0, a1, a2);
   164       for (int i=0; i<ARRLEN; i++) {
   165         errn += verify("test_suba: ", i, a0[i], (short)((short)(ADD_INIT+i)-VALUE));
   166       }
   168       test_mulc(a0, a1);
   169       for (int i=0; i<ARRLEN; i++) {
   170         errn += verify("test_mulc: ", i, a0[i], (short)((short)(ADD_INIT+i)*VALUE));
   171       }
   172       test_mulv(a0, a1, (short)VALUE);
   173       for (int i=0; i<ARRLEN; i++) {
   174         errn += verify("test_mulv: ", i, a0[i], (short)((short)(ADD_INIT+i)*VALUE));
   175       }
   176       test_mula(a0, a1, a2);
   177       for (int i=0; i<ARRLEN; i++) {
   178         errn += verify("test_mula: ", i, a0[i], (short)((short)(ADD_INIT+i)*VALUE));
   179       }
   181       test_divc(a0, a1);
   182       for (int i=0; i<ARRLEN; i++) {
   183         errn += verify("test_divc: ", i, a0[i], (short)((short)(ADD_INIT+i)/VALUE));
   184       }
   185       test_divv(a0, a1, (short)VALUE);
   186       for (int i=0; i<ARRLEN; i++) {
   187         errn += verify("test_divv: ", i, a0[i], (short)((short)(ADD_INIT+i)/VALUE));
   188       }
   189       test_diva(a0, a1, a2);
   190       for (int i=0; i<ARRLEN; i++) {
   191         errn += verify("test_diva: ", i, a0[i], (short)((short)(ADD_INIT+i)/VALUE));
   192       }
   194       test_mulc_n(a0, a1);
   195       for (int i=0; i<ARRLEN; i++) {
   196         errn += verify("test_mulc_n: ", i, a0[i], (short)((short)(ADD_INIT+i)*(-VALUE)));
   197       }
   198       test_mulv(a0, a1, (short)-VALUE);
   199       for (int i=0; i<ARRLEN; i++) {
   200         errn += verify("test_mulv_n: ", i, a0[i], (short)((short)(ADD_INIT+i)*(-VALUE)));
   201       }
   202       test_mula(a0, a1, a3);
   203       for (int i=0; i<ARRLEN; i++) {
   204         errn += verify("test_mula_n: ", i, a0[i], (short)((short)(ADD_INIT+i)*(-VALUE)));
   205       }
   207       test_divc_n(a0, a1);
   208       for (int i=0; i<ARRLEN; i++) {
   209         errn += verify("test_divc_n: ", i, a0[i], (short)((short)(ADD_INIT+i)/(-VALUE)));
   210       }
   211       test_divv(a0, a1, (short)-VALUE);
   212       for (int i=0; i<ARRLEN; i++) {
   213         errn += verify("test_divv_n: ", i, a0[i], (short)((short)(ADD_INIT+i)/(-VALUE)));
   214       }
   215       test_diva(a0, a1, a3);
   216       for (int i=0; i<ARRLEN; i++) {
   217         errn += verify("test_diva_n: ", i, a0[i], (short)((short)(ADD_INIT+i)/(-VALUE)));
   218       }
   220       test_andc(a0, a1);
   221       for (int i=0; i<ARRLEN; i++) {
   222         errn += verify("test_andc: ", i, a0[i], (short)((short)(ADD_INIT+i)&BIT_MASK));
   223       }
   224       test_andv(a0, a1, (short)BIT_MASK);
   225       for (int i=0; i<ARRLEN; i++) {
   226         errn += verify("test_andv: ", i, a0[i], (short)((short)(ADD_INIT+i)&BIT_MASK));
   227       }
   228       test_anda(a0, a1, a4);
   229       for (int i=0; i<ARRLEN; i++) {
   230         errn += verify("test_anda: ", i, a0[i], (short)((short)(ADD_INIT+i)&BIT_MASK));
   231       }
   233       test_orc(a0, a1);
   234       for (int i=0; i<ARRLEN; i++) {
   235         errn += verify("test_orc: ", i, a0[i], (short)((short)(ADD_INIT+i)|BIT_MASK));
   236       }
   237       test_orv(a0, a1, (short)BIT_MASK);
   238       for (int i=0; i<ARRLEN; i++) {
   239         errn += verify("test_orv: ", i, a0[i], (short)((short)(ADD_INIT+i)|BIT_MASK));
   240       }
   241       test_ora(a0, a1, a4);
   242       for (int i=0; i<ARRLEN; i++) {
   243         errn += verify("test_ora: ", i, a0[i], (short)((short)(ADD_INIT+i)|BIT_MASK));
   244       }
   246       test_xorc(a0, a1);
   247       for (int i=0; i<ARRLEN; i++) {
   248         errn += verify("test_xorc: ", i, a0[i], (short)((short)(ADD_INIT+i)^BIT_MASK));
   249       }
   250       test_xorv(a0, a1, (short)BIT_MASK);
   251       for (int i=0; i<ARRLEN; i++) {
   252         errn += verify("test_xorv: ", i, a0[i], (short)((short)(ADD_INIT+i)^BIT_MASK));
   253       }
   254       test_xora(a0, a1, a4);
   255       for (int i=0; i<ARRLEN; i++) {
   256         errn += verify("test_xora: ", i, a0[i], (short)((short)(ADD_INIT+i)^BIT_MASK));
   257       }
   259       test_sllc(a0, a1);
   260       for (int i=0; i<ARRLEN; i++) {
   261         errn += verify("test_sllc: ", i, a0[i], (short)((short)(ADD_INIT+i)<<VALUE));
   262       }
   263       test_sllv(a0, a1, VALUE);
   264       for (int i=0; i<ARRLEN; i++) {
   265         errn += verify("test_sllv: ", i, a0[i], (short)((short)(ADD_INIT+i)<<VALUE));
   266       }
   268       test_srlc(a0, a1);
   269       for (int i=0; i<ARRLEN; i++) {
   270         errn += verify("test_srlc: ", i, a0[i], (short)((short)(ADD_INIT+i)>>>VALUE));
   271       }
   272       test_srlv(a0, a1, VALUE);
   273       for (int i=0; i<ARRLEN; i++) {
   274         errn += verify("test_srlv: ", i, a0[i], (short)((short)(ADD_INIT+i)>>>VALUE));
   275       }
   277       test_srac(a0, a1);
   278       for (int i=0; i<ARRLEN; i++) {
   279         errn += verify("test_srac: ", i, a0[i], (short)((short)(ADD_INIT+i)>>VALUE));
   280       }
   281       test_srav(a0, a1, VALUE);
   282       for (int i=0; i<ARRLEN; i++) {
   283         errn += verify("test_srav: ", i, a0[i], (short)((short)(ADD_INIT+i)>>VALUE));
   284       }
   286       test_sllc_n(a0, a1);
   287       for (int i=0; i<ARRLEN; i++) {
   288         errn += verify("test_sllc_n: ", i, a0[i], (short)((short)(ADD_INIT+i)<<(-VALUE)));
   289       }
   290       test_sllv(a0, a1, -VALUE);
   291       for (int i=0; i<ARRLEN; i++) {
   292         errn += verify("test_sllv_n: ", i, a0[i], (short)((short)(ADD_INIT+i)<<(-VALUE)));
   293       }
   295       test_srlc_n(a0, a1);
   296       for (int i=0; i<ARRLEN; i++) {
   297         errn += verify("test_srlc_n: ", i, a0[i], (short)((short)(ADD_INIT+i)>>>(-VALUE)));
   298       }
   299       test_srlv(a0, a1, -VALUE);
   300       for (int i=0; i<ARRLEN; i++) {
   301         errn += verify("test_srlv_n: ", i, a0[i], (short)((short)(ADD_INIT+i)>>>(-VALUE)));
   302       }
   304       test_srac_n(a0, a1);
   305       for (int i=0; i<ARRLEN; i++) {
   306         errn += verify("test_srac_n: ", i, a0[i], (short)((short)(ADD_INIT+i)>>(-VALUE)));
   307       }
   308       test_srav(a0, a1, -VALUE);
   309       for (int i=0; i<ARRLEN; i++) {
   310         errn += verify("test_srav_n: ", i, a0[i], (short)((short)(ADD_INIT+i)>>(-VALUE)));
   311       }
   313       test_sllc_o(a0, a1);
   314       for (int i=0; i<ARRLEN; i++) {
   315         errn += verify("test_sllc_o: ", i, a0[i], (short)((short)(ADD_INIT+i)<<SHIFT));
   316       }
   317       test_sllv(a0, a1, SHIFT);
   318       for (int i=0; i<ARRLEN; i++) {
   319         errn += verify("test_sllv_o: ", i, a0[i], (short)((short)(ADD_INIT+i)<<SHIFT));
   320       }
   322       test_srlc_o(a0, a1);
   323       for (int i=0; i<ARRLEN; i++) {
   324         errn += verify("test_srlc_o: ", i, a0[i], (short)((short)(ADD_INIT+i)>>>SHIFT));
   325       }
   326       test_srlv(a0, a1, SHIFT);
   327       for (int i=0; i<ARRLEN; i++) {
   328         errn += verify("test_srlv_o: ", i, a0[i], (short)((short)(ADD_INIT+i)>>>SHIFT));
   329       }
   331       test_srac_o(a0, a1);
   332       for (int i=0; i<ARRLEN; i++) {
   333         errn += verify("test_srac_o: ", i, a0[i], (short)((short)(ADD_INIT+i)>>SHIFT));
   334       }
   335       test_srav(a0, a1, SHIFT);
   336       for (int i=0; i<ARRLEN; i++) {
   337         errn += verify("test_srav_o: ", i, a0[i], (short)((short)(ADD_INIT+i)>>SHIFT));
   338       }
   340       test_sllc_on(a0, a1);
   341       for (int i=0; i<ARRLEN; i++) {
   342         errn += verify("test_sllc_on: ", i, a0[i], (short)((short)(ADD_INIT+i)<<(-SHIFT)));
   343       }
   344       test_sllv(a0, a1, -SHIFT);
   345       for (int i=0; i<ARRLEN; i++) {
   346         errn += verify("test_sllv_on: ", i, a0[i], (short)((short)(ADD_INIT+i)<<(-SHIFT)));
   347       }
   349       test_srlc_on(a0, a1);
   350       for (int i=0; i<ARRLEN; i++) {
   351         errn += verify("test_srlc_on: ", i, a0[i], (short)((short)(ADD_INIT+i)>>>(-SHIFT)));
   352       }
   353       test_srlv(a0, a1, -SHIFT);
   354       for (int i=0; i<ARRLEN; i++) {
   355         errn += verify("test_srlv_on: ", i, a0[i], (short)((short)(ADD_INIT+i)>>>(-SHIFT)));
   356       }
   358       test_srac_on(a0, a1);
   359       for (int i=0; i<ARRLEN; i++) {
   360         errn += verify("test_srac_on: ", i, a0[i], (short)((short)(ADD_INIT+i)>>(-SHIFT)));
   361       }
   362       test_srav(a0, a1, -SHIFT);
   363       for (int i=0; i<ARRLEN; i++) {
   364         errn += verify("test_srav_on: ", i, a0[i], (short)((short)(ADD_INIT+i)>>(-SHIFT)));
   365       }
   367       test_pack2(p2, a1);
   368       for (int i=0; i<ARRLEN/2; i++) {
   369         errn += verify("test_pack2: ", i, p2[i], ((int)(ADD_INIT+2*i) & 0xFFFF) | ((int)(ADD_INIT+2*i+1) << 16));
   370       }
   371       for (int i=0; i<ARRLEN; i++) {
   372         a0[i] = -1;
   373       }
   374       test_unpack2(a0, p2);
   375       for (int i=0; i<(ARRLEN&(-2)); i++) {
   376         errn += verify("test_unpack2: ", i, a0[i], (short)(ADD_INIT+i));
   377       }
   379       test_pack2_swap(p2, a1);
   380       for (int i=0; i<ARRLEN/2; i++) {
   381         errn += verify("test_pack2_swap: ", i, p2[i], ((int)(ADD_INIT+2*i+1) & 0xFFFF) | ((int)(ADD_INIT+2*i) << 16));
   382       }
   383       for (int i=0; i<ARRLEN; i++) {
   384         a0[i] = -1;
   385       }
   386       test_unpack2_swap(a0, p2);
   387       for (int i=0; i<(ARRLEN&(-2)); i++) {
   388         errn += verify("test_unpack2_swap: ", i, a0[i], (short)(ADD_INIT+i));
   389       }
   391       test_pack4(p4, a1);
   392       for (int i=0; i<ARRLEN/4; i++) {
   393         errn += verify("test_pack4: ", i, p4[i],  ((long)(ADD_INIT+4*i+0) & 0xFFFFl) |
   394                                                  (((long)(ADD_INIT+4*i+1) & 0xFFFFl) << 16)  |
   395                                                  (((long)(ADD_INIT+4*i+2) & 0xFFFFl) << 32)  |
   396                                                  (((long)(ADD_INIT+4*i+3) & 0xFFFFl) << 48));
   397       }
   398       for (int i=0; i<ARRLEN; i++) {
   399         a0[i] = -1;
   400       }
   401       test_unpack4(a0, p4);
   402       for (int i=0; i<(ARRLEN&(-4)); i++) {
   403         errn += verify("test_unpack4: ", i, a0[i], (short)(ADD_INIT+i));
   404       }
   406       test_pack4_swap(p4, a1);
   407       for (int i=0; i<ARRLEN/4; i++) {
   408         errn += verify("test_pack4_swap: ", i, p4[i],  ((long)(ADD_INIT+4*i+3) & 0xFFFFl) |
   409                                                       (((long)(ADD_INIT+4*i+2) & 0xFFFFl) << 16)  |
   410                                                       (((long)(ADD_INIT+4*i+1) & 0xFFFFl) << 32)  |
   411                                                       (((long)(ADD_INIT+4*i+0) & 0xFFFFl) << 48));
   412       }
   413       for (int i=0; i<ARRLEN; i++) {
   414         a0[i] = -1;
   415       }
   416       test_unpack4_swap(a0, p4);
   417       for (int i=0; i<(ARRLEN&(-4)); i++) {
   418         errn += verify("test_unpack4_swap: ", i, a0[i], (short)(ADD_INIT+i));
   419       }
   421     }
   423     if (errn > 0)
   424       return errn;
   426     System.out.println("Time");
   427     long start, end;
   429     start = System.currentTimeMillis();
   430     for (int i=0; i<ITERS; i++) {
   431       test_sum(a1);
   432     }
   433     end = System.currentTimeMillis();
   434     System.out.println("test_sum: " + (end - start));
   436     start = System.currentTimeMillis();
   437     for (int i=0; i<ITERS; i++) {
   438       test_addc(a0, a1);
   439     }
   440     end = System.currentTimeMillis();
   441     System.out.println("test_addc: " + (end - start));
   442     start = System.currentTimeMillis();
   443     for (int i=0; i<ITERS; i++) {
   444       test_addv(a0, a1, (short)VALUE);
   445     }
   446     end = System.currentTimeMillis();
   447     System.out.println("test_addv: " + (end - start));
   448     start = System.currentTimeMillis();
   449     for (int i=0; i<ITERS; i++) {
   450       test_adda(a0, a1, a2);
   451     }
   452     end = System.currentTimeMillis();
   453     System.out.println("test_adda: " + (end - start));
   455     start = System.currentTimeMillis();
   456     for (int i=0; i<ITERS; i++) {
   457       test_subc(a0, a1);
   458     }
   459     end = System.currentTimeMillis();
   460     System.out.println("test_subc: " + (end - start));
   461     start = System.currentTimeMillis();
   462     for (int i=0; i<ITERS; i++) {
   463       test_subv(a0, a1, (short)VALUE);
   464     }
   465     end = System.currentTimeMillis();
   466     System.out.println("test_subv: " + (end - start));
   467     start = System.currentTimeMillis();
   468     for (int i=0; i<ITERS; i++) {
   469       test_suba(a0, a1, a2);
   470     }
   471     end = System.currentTimeMillis();
   472     System.out.println("test_suba: " + (end - start));
   474     start = System.currentTimeMillis();
   475     for (int i=0; i<ITERS; i++) {
   476       test_mulc(a0, a1);
   477     }
   478     end = System.currentTimeMillis();
   479     System.out.println("test_mulc: " + (end - start));
   480     start = System.currentTimeMillis();
   481     for (int i=0; i<ITERS; i++) {
   482       test_mulv(a0, a1, (short)VALUE);
   483     }
   484     end = System.currentTimeMillis();
   485     System.out.println("test_mulv: " + (end - start));
   486     start = System.currentTimeMillis();
   487     for (int i=0; i<ITERS; i++) {
   488       test_mula(a0, a1, a2);
   489     }
   490     end = System.currentTimeMillis();
   491     System.out.println("test_mula: " + (end - start));
   493     start = System.currentTimeMillis();
   494     for (int i=0; i<ITERS; i++) {
   495       test_divc(a0, a1);
   496     }
   497     end = System.currentTimeMillis();
   498     System.out.println("test_divc: " + (end - start));
   499     start = System.currentTimeMillis();
   500     for (int i=0; i<ITERS; i++) {
   501       test_divv(a0, a1, (short)VALUE);
   502     }
   503     end = System.currentTimeMillis();
   504     System.out.println("test_divv: " + (end - start));
   505     start = System.currentTimeMillis();
   506     for (int i=0; i<ITERS; i++) {
   507       test_diva(a0, a1, a2);
   508     }
   509     end = System.currentTimeMillis();
   510     System.out.println("test_diva: " + (end - start));
   512     start = System.currentTimeMillis();
   513     for (int i=0; i<ITERS; i++) {
   514       test_mulc_n(a0, a1);
   515     }
   516     end = System.currentTimeMillis();
   517     System.out.println("test_mulc_n: " + (end - start));
   518     start = System.currentTimeMillis();
   519     for (int i=0; i<ITERS; i++) {
   520       test_mulv(a0, a1, (short)-VALUE);
   521     }
   522     end = System.currentTimeMillis();
   523     System.out.println("test_mulv_n: " + (end - start));
   524     start = System.currentTimeMillis();
   525     for (int i=0; i<ITERS; i++) {
   526       test_mula(a0, a1, a3);
   527     }
   528     end = System.currentTimeMillis();
   529     System.out.println("test_mula_n: " + (end - start));
   531     start = System.currentTimeMillis();
   532     for (int i=0; i<ITERS; i++) {
   533       test_divc_n(a0, a1);
   534     }
   535     end = System.currentTimeMillis();
   536     System.out.println("test_divc_n: " + (end - start));
   537     start = System.currentTimeMillis();
   538     for (int i=0; i<ITERS; i++) {
   539       test_divv(a0, a1, (short)-VALUE);
   540     }
   541     end = System.currentTimeMillis();
   542     System.out.println("test_divv_n: " + (end - start));
   543     start = System.currentTimeMillis();
   544     for (int i=0; i<ITERS; i++) {
   545       test_diva(a0, a1, a3);
   546     }
   547     end = System.currentTimeMillis();
   548     System.out.println("test_diva_n: " + (end - start));
   550     start = System.currentTimeMillis();
   551     for (int i=0; i<ITERS; i++) {
   552       test_andc(a0, a1);
   553     }
   554     end = System.currentTimeMillis();
   555     System.out.println("test_andc: " + (end - start));
   556     start = System.currentTimeMillis();
   557     for (int i=0; i<ITERS; i++) {
   558       test_andv(a0, a1, (short)BIT_MASK);
   559     }
   560     end = System.currentTimeMillis();
   561     System.out.println("test_andv: " + (end - start));
   562     start = System.currentTimeMillis();
   563     for (int i=0; i<ITERS; i++) {
   564       test_anda(a0, a1, a4);
   565     }
   566     end = System.currentTimeMillis();
   567     System.out.println("test_anda: " + (end - start));
   569     start = System.currentTimeMillis();
   570     for (int i=0; i<ITERS; i++) {
   571       test_orc(a0, a1);
   572     }
   573     end = System.currentTimeMillis();
   574     System.out.println("test_orc: " + (end - start));
   575     start = System.currentTimeMillis();
   576     for (int i=0; i<ITERS; i++) {
   577       test_orv(a0, a1, (short)BIT_MASK);
   578     }
   579     end = System.currentTimeMillis();
   580     System.out.println("test_orv: " + (end - start));
   581     start = System.currentTimeMillis();
   582     for (int i=0; i<ITERS; i++) {
   583       test_ora(a0, a1, a4);
   584     }
   585     end = System.currentTimeMillis();
   586     System.out.println("test_ora: " + (end - start));
   588     start = System.currentTimeMillis();
   589     for (int i=0; i<ITERS; i++) {
   590       test_xorc(a0, a1);
   591     }
   592     end = System.currentTimeMillis();
   593     System.out.println("test_xorc: " + (end - start));
   594     start = System.currentTimeMillis();
   595     for (int i=0; i<ITERS; i++) {
   596       test_xorv(a0, a1, (short)BIT_MASK);
   597     }
   598     end = System.currentTimeMillis();
   599     System.out.println("test_xorv: " + (end - start));
   600     start = System.currentTimeMillis();
   601     for (int i=0; i<ITERS; i++) {
   602       test_xora(a0, a1, a4);
   603     }
   604     end = System.currentTimeMillis();
   605     System.out.println("test_xora: " + (end - start));
   607     start = System.currentTimeMillis();
   608     for (int i=0; i<ITERS; i++) {
   609       test_sllc(a0, a1);
   610     }
   611     end = System.currentTimeMillis();
   612     System.out.println("test_sllc: " + (end - start));
   613     start = System.currentTimeMillis();
   614     for (int i=0; i<ITERS; i++) {
   615       test_sllv(a0, a1, VALUE);
   616     }
   617     end = System.currentTimeMillis();
   618     System.out.println("test_sllv: " + (end - start));
   620     start = System.currentTimeMillis();
   621     for (int i=0; i<ITERS; i++) {
   622       test_srlc(a0, a1);
   623     }
   624     end = System.currentTimeMillis();
   625     System.out.println("test_srlc: " + (end - start));
   626     start = System.currentTimeMillis();
   627     for (int i=0; i<ITERS; i++) {
   628       test_srlv(a0, a1, VALUE);
   629     }
   630     end = System.currentTimeMillis();
   631     System.out.println("test_srlv: " + (end - start));
   633     start = System.currentTimeMillis();
   634     for (int i=0; i<ITERS; i++) {
   635       test_srac(a0, a1);
   636     }
   637     end = System.currentTimeMillis();
   638     System.out.println("test_srac: " + (end - start));
   639     start = System.currentTimeMillis();
   640     for (int i=0; i<ITERS; i++) {
   641       test_srav(a0, a1, VALUE);
   642     }
   643     end = System.currentTimeMillis();
   644     System.out.println("test_srav: " + (end - start));
   646     start = System.currentTimeMillis();
   647     for (int i=0; i<ITERS; i++) {
   648       test_sllc_n(a0, a1);
   649     }
   650     end = System.currentTimeMillis();
   651     System.out.println("test_sllc_n: " + (end - start));
   652     start = System.currentTimeMillis();
   653     for (int i=0; i<ITERS; i++) {
   654       test_sllv(a0, a1, -VALUE);
   655     }
   656     end = System.currentTimeMillis();
   657     System.out.println("test_sllv_n: " + (end - start));
   659     start = System.currentTimeMillis();
   660     for (int i=0; i<ITERS; i++) {
   661       test_srlc_n(a0, a1);
   662     }
   663     end = System.currentTimeMillis();
   664     System.out.println("test_srlc_n: " + (end - start));
   665     start = System.currentTimeMillis();
   666     for (int i=0; i<ITERS; i++) {
   667       test_srlv(a0, a1, -VALUE);
   668     }
   669     end = System.currentTimeMillis();
   670     System.out.println("test_srlv_n: " + (end - start));
   672     start = System.currentTimeMillis();
   673     for (int i=0; i<ITERS; i++) {
   674       test_srac_n(a0, a1);
   675     }
   676     end = System.currentTimeMillis();
   677     System.out.println("test_srac_n: " + (end - start));
   678     start = System.currentTimeMillis();
   679     for (int i=0; i<ITERS; i++) {
   680       test_srav(a0, a1, -VALUE);
   681     }
   682     end = System.currentTimeMillis();
   683     System.out.println("test_srav_n: " + (end - start));
   685     start = System.currentTimeMillis();
   686     for (int i=0; i<ITERS; i++) {
   687       test_sllc_o(a0, a1);
   688     }
   689     end = System.currentTimeMillis();
   690     System.out.println("test_sllc_o: " + (end - start));
   691     start = System.currentTimeMillis();
   692     for (int i=0; i<ITERS; i++) {
   693       test_sllv(a0, a1, SHIFT);
   694     }
   695     end = System.currentTimeMillis();
   696     System.out.println("test_sllv_o: " + (end - start));
   698     start = System.currentTimeMillis();
   699     for (int i=0; i<ITERS; i++) {
   700       test_srlc_o(a0, a1);
   701     }
   702     end = System.currentTimeMillis();
   703     System.out.println("test_srlc_o: " + (end - start));
   704     start = System.currentTimeMillis();
   705     for (int i=0; i<ITERS; i++) {
   706       test_srlv(a0, a1, SHIFT);
   707     }
   708     end = System.currentTimeMillis();
   709     System.out.println("test_srlv_o: " + (end - start));
   711     start = System.currentTimeMillis();
   712     for (int i=0; i<ITERS; i++) {
   713       test_srac_o(a0, a1);
   714     }
   715     end = System.currentTimeMillis();
   716     System.out.println("test_srac_o: " + (end - start));
   717     start = System.currentTimeMillis();
   718     for (int i=0; i<ITERS; i++) {
   719       test_srav(a0, a1, SHIFT);
   720     }
   721     end = System.currentTimeMillis();
   722     System.out.println("test_srav_o: " + (end - start));
   724     start = System.currentTimeMillis();
   725     for (int i=0; i<ITERS; i++) {
   726       test_sllc_on(a0, a1);
   727     }
   728     end = System.currentTimeMillis();
   729     System.out.println("test_sllc_on: " + (end - start));
   730     start = System.currentTimeMillis();
   731     for (int i=0; i<ITERS; i++) {
   732       test_sllv(a0, a1, -SHIFT);
   733     }
   734     end = System.currentTimeMillis();
   735     System.out.println("test_sllv_on: " + (end - start));
   737     start = System.currentTimeMillis();
   738     for (int i=0; i<ITERS; i++) {
   739       test_srlc_on(a0, a1);
   740     }
   741     end = System.currentTimeMillis();
   742     System.out.println("test_srlc_on: " + (end - start));
   743     start = System.currentTimeMillis();
   744     for (int i=0; i<ITERS; i++) {
   745       test_srlv(a0, a1, -SHIFT);
   746     }
   747     end = System.currentTimeMillis();
   748     System.out.println("test_srlv_on: " + (end - start));
   750     start = System.currentTimeMillis();
   751     for (int i=0; i<ITERS; i++) {
   752       test_srac_on(a0, a1);
   753     }
   754     end = System.currentTimeMillis();
   755     System.out.println("test_srac_on: " + (end - start));
   756     start = System.currentTimeMillis();
   757     for (int i=0; i<ITERS; i++) {
   758       test_srav(a0, a1, -SHIFT);
   759     }
   760     end = System.currentTimeMillis();
   761     System.out.println("test_srav_on: " + (end - start));
   763     start = System.currentTimeMillis();
   764     for (int i=0; i<ITERS; i++) {
   765       test_pack2(p2, a1);
   766     }
   767     end = System.currentTimeMillis();
   768     System.out.println("test_pack2: " + (end - start));
   769     start = System.currentTimeMillis();
   770     for (int i=0; i<ITERS; i++) {
   771       test_unpack2(a0, p2);
   772     }
   773     end = System.currentTimeMillis();
   774     System.out.println("test_unpack2: " + (end - start));
   775     start = System.currentTimeMillis();
   776     for (int i=0; i<ITERS; i++) {
   777       test_pack2_swap(p2, a1);
   778     }
   779     end = System.currentTimeMillis();
   780     System.out.println("test_pack2_swap: " + (end - start));
   781     start = System.currentTimeMillis();
   782     for (int i=0; i<ITERS; i++) {
   783       test_unpack2_swap(a0, p2);
   784     }
   785     end = System.currentTimeMillis();
   786     System.out.println("test_unpack2_swap: " + (end - start));
   788     start = System.currentTimeMillis();
   789     for (int i=0; i<ITERS; i++) {
   790       test_pack4(p4, a1);
   791     }
   792     end = System.currentTimeMillis();
   793     System.out.println("test_pack4: " + (end - start));
   794     start = System.currentTimeMillis();
   795     for (int i=0; i<ITERS; i++) {
   796       test_unpack4(a0, p4);
   797     }
   798     end = System.currentTimeMillis();
   799     System.out.println("test_unpack4: " + (end - start));
   800     start = System.currentTimeMillis();
   801     for (int i=0; i<ITERS; i++) {
   802       test_pack4_swap(p4, a1);
   803     }
   804     end = System.currentTimeMillis();
   805     System.out.println("test_pack4_swap: " + (end - start));
   806     start = System.currentTimeMillis();
   807     for (int i=0; i<ITERS; i++) {
   808       test_unpack4_swap(a0, p4);
   809     }
   810     end = System.currentTimeMillis();
   811     System.out.println("test_unpack4_swap: " + (end - start));
   813     return errn;
   814   }
   816   static int test_sum(short[] a1) {
   817     int sum = 0;
   818     for (int i = 0; i < a1.length; i+=1) {
   819       sum += a1[i];
   820     }
   821     return sum;
   822   }
   824   static void test_addc(short[] a0, short[] a1) {
   825     for (int i = 0; i < a0.length; i+=1) {
   826       a0[i] = (short)(a1[i]+VALUE);
   827     }
   828   }
   829   static void test_addv(short[] a0, short[] a1, short b) {
   830     for (int i = 0; i < a0.length; i+=1) {
   831       a0[i] = (short)(a1[i]+b);
   832     }
   833   }
   834   static void test_adda(short[] a0, short[] a1, short[] a2) {
   835     for (int i = 0; i < a0.length; i+=1) {
   836       a0[i] = (short)(a1[i]+a2[i]);
   837     }
   838   }
   840   static void test_subc(short[] a0, short[] a1) {
   841     for (int i = 0; i < a0.length; i+=1) {
   842       a0[i] = (short)(a1[i]-VALUE);
   843     }
   844   }
   845   static void test_subv(short[] a0, short[] a1, short b) {
   846     for (int i = 0; i < a0.length; i+=1) {
   847       a0[i] = (short)(a1[i]-b);
   848     }
   849   }
   850   static void test_suba(short[] a0, short[] a1, short[] a2) {
   851     for (int i = 0; i < a0.length; i+=1) {
   852       a0[i] = (short)(a1[i]-a2[i]);
   853     }
   854   }
   856   static void test_mulc(short[] a0, short[] a1) {
   857     for (int i = 0; i < a0.length; i+=1) {
   858       a0[i] = (short)(a1[i]*VALUE);
   859     }
   860   }
   861   static void test_mulc_n(short[] a0, short[] a1) {
   862     for (int i = 0; i < a0.length; i+=1) {
   863       a0[i] = (short)(a1[i]*(-VALUE));
   864     }
   865   }
   866   static void test_mulv(short[] a0, short[] a1, short b) {
   867     for (int i = 0; i < a0.length; i+=1) {
   868       a0[i] = (short)(a1[i]*b);
   869     }
   870   }
   871   static void test_mula(short[] a0, short[] a1, short[] a2) {
   872     for (int i = 0; i < a0.length; i+=1) {
   873       a0[i] = (short)(a1[i]*a2[i]);
   874     }
   875   }
   877   static void test_divc(short[] a0, short[] a1) {
   878     for (int i = 0; i < a0.length; i+=1) {
   879       a0[i] = (short)(a1[i]/VALUE);
   880     }
   881   }
   882   static void test_divc_n(short[] a0, short[] a1) {
   883     for (int i = 0; i < a0.length; i+=1) {
   884       a0[i] = (short)(a1[i]/(-VALUE));
   885     }
   886   }
   887   static void test_divv(short[] a0, short[] a1, short b) {
   888     for (int i = 0; i < a0.length; i+=1) {
   889       a0[i] = (short)(a1[i]/b);
   890     }
   891   }
   892   static void test_diva(short[] a0, short[] a1, short[] a2) {
   893     for (int i = 0; i < a0.length; i+=1) {
   894       a0[i] = (short)(a1[i]/a2[i]);
   895     }
   896   }
   898   static void test_andc(short[] a0, short[] a1) {
   899     for (int i = 0; i < a0.length; i+=1) {
   900       a0[i] = (short)(a1[i]&BIT_MASK);
   901     }
   902   }
   903   static void test_andv(short[] a0, short[] a1, short b) {
   904     for (int i = 0; i < a0.length; i+=1) {
   905       a0[i] = (short)(a1[i]&b);
   906     }
   907   }
   908   static void test_anda(short[] a0, short[] a1, short[] a2) {
   909     for (int i = 0; i < a0.length; i+=1) {
   910       a0[i] = (short)(a1[i]&a2[i]);
   911     }
   912   }
   914   static void test_orc(short[] a0, short[] a1) {
   915     for (int i = 0; i < a0.length; i+=1) {
   916       a0[i] = (short)(a1[i]|BIT_MASK);
   917     }
   918   }
   919   static void test_orv(short[] a0, short[] a1, short b) {
   920     for (int i = 0; i < a0.length; i+=1) {
   921       a0[i] = (short)(a1[i]|b);
   922     }
   923   }
   924   static void test_ora(short[] a0, short[] a1, short[] a2) {
   925     for (int i = 0; i < a0.length; i+=1) {
   926       a0[i] = (short)(a1[i]|a2[i]);
   927     }
   928   }
   930   static void test_xorc(short[] a0, short[] a1) {
   931     for (int i = 0; i < a0.length; i+=1) {
   932       a0[i] = (short)(a1[i]^BIT_MASK);
   933     }
   934   }
   935   static void test_xorv(short[] a0, short[] a1, short b) {
   936     for (int i = 0; i < a0.length; i+=1) {
   937       a0[i] = (short)(a1[i]^b);
   938     }
   939   }
   940   static void test_xora(short[] a0, short[] a1, short[] a2) {
   941     for (int i = 0; i < a0.length; i+=1) {
   942       a0[i] = (short)(a1[i]^a2[i]);
   943     }
   944   }
   946   static void test_sllc(short[] a0, short[] a1) {
   947     for (int i = 0; i < a0.length; i+=1) {
   948       a0[i] = (short)(a1[i]<<VALUE);
   949     }
   950   }
   951   static void test_sllc_n(short[] a0, short[] a1) {
   952     for (int i = 0; i < a0.length; i+=1) {
   953       a0[i] = (short)(a1[i]<<(-VALUE));
   954     }
   955   }
   956   static void test_sllc_o(short[] a0, short[] a1) {
   957     for (int i = 0; i < a0.length; i+=1) {
   958       a0[i] = (short)(a1[i]<<SHIFT);
   959     }
   960   }
   961   static void test_sllc_on(short[] a0, short[] a1) {
   962     for (int i = 0; i < a0.length; i+=1) {
   963       a0[i] = (short)(a1[i]<<(-SHIFT));
   964     }
   965   }
   966   static void test_sllv(short[] a0, short[] a1, int b) {
   967     for (int i = 0; i < a0.length; i+=1) {
   968       a0[i] = (short)(a1[i]<<b);
   969     }
   970   }
   972   static void test_srlc(short[] a0, short[] a1) {
   973     for (int i = 0; i < a0.length; i+=1) {
   974       a0[i] = (short)(a1[i]>>>VALUE);
   975     }
   976   }
   977   static void test_srlc_n(short[] a0, short[] a1) {
   978     for (int i = 0; i < a0.length; i+=1) {
   979       a0[i] = (short)(a1[i]>>>(-VALUE));
   980     }
   981   }
   982   static void test_srlc_o(short[] a0, short[] a1) {
   983     for (int i = 0; i < a0.length; i+=1) {
   984       a0[i] = (short)(a1[i]>>>SHIFT);
   985     }
   986   }
   987   static void test_srlc_on(short[] a0, short[] a1) {
   988     for (int i = 0; i < a0.length; i+=1) {
   989       a0[i] = (short)(a1[i]>>>(-SHIFT));
   990     }
   991   }
   992   static void test_srlv(short[] a0, short[] a1, int b) {
   993     for (int i = 0; i < a0.length; i+=1) {
   994       a0[i] = (short)(a1[i]>>>b);
   995     }
   996   }
   998   static void test_srac(short[] a0, short[] a1) {
   999     for (int i = 0; i < a0.length; i+=1) {
  1000       a0[i] = (short)(a1[i]>>VALUE);
  1003   static void test_srac_n(short[] a0, short[] a1) {
  1004     for (int i = 0; i < a0.length; i+=1) {
  1005       a0[i] = (short)(a1[i]>>(-VALUE));
  1008   static void test_srac_o(short[] a0, short[] a1) {
  1009     for (int i = 0; i < a0.length; i+=1) {
  1010       a0[i] = (short)(a1[i]>>SHIFT);
  1013   static void test_srac_on(short[] a0, short[] a1) {
  1014     for (int i = 0; i < a0.length; i+=1) {
  1015       a0[i] = (short)(a1[i]>>(-SHIFT));
  1018   static void test_srav(short[] a0, short[] a1, int b) {
  1019     for (int i = 0; i < a0.length; i+=1) {
  1020       a0[i] = (short)(a1[i]>>b);
  1024   static void test_pack2(int[] p2, short[] a1) {
  1025     if (p2.length*2 > a1.length) return;
  1026     for (int i = 0; i < p2.length; i+=1) {
  1027       int l0 = (int)a1[i*2+0];
  1028       int l1 = (int)a1[i*2+1];
  1029       p2[i] = (l1 << 16) | (l0 & 0xFFFF);
  1032   static void test_unpack2(short[] a0, int[] p2) {
  1033     if (p2.length*2 > a0.length) return;
  1034     for (int i = 0; i < p2.length; i+=1) {
  1035       int l = p2[i];
  1036       a0[i*2+0] = (short)(l & 0xFFFF);
  1037       a0[i*2+1] = (short)(l >> 16);
  1040   static void test_pack2_swap(int[] p2, short[] a1) {
  1041     if (p2.length*2 > a1.length) return;
  1042     for (int i = 0; i < p2.length; i+=1) {
  1043       int l0 = (int)a1[i*2+0];
  1044       int l1 = (int)a1[i*2+1];
  1045       p2[i] = (l0 << 16) | (l1 & 0xFFFF);
  1048   static void test_unpack2_swap(short[] a0, int[] p2) {
  1049     if (p2.length*2 > a0.length) return;
  1050     for (int i = 0; i < p2.length; i+=1) {
  1051       int l = p2[i];
  1052       a0[i*2+0] = (short)(l >> 16);
  1053       a0[i*2+1] = (short)(l & 0xFFFF);
  1057   static void test_pack4(long[] p4, short[] a1) {
  1058     if (p4.length*4 > a1.length) return;
  1059     for (int i = 0; i < p4.length; i+=1) {
  1060       long l0 = (long)a1[i*4+0];
  1061       long l1 = (long)a1[i*4+1];
  1062       long l2 = (long)a1[i*4+2];
  1063       long l3 = (long)a1[i*4+3];
  1064       p4[i] = (l0 & 0xFFFFl) |
  1065              ((l1 & 0xFFFFl) << 16) |
  1066              ((l2 & 0xFFFFl) << 32) |
  1067              ((l3 & 0xFFFFl) << 48);
  1070   static void test_unpack4(short[] a0, long[] p4) {
  1071     if (p4.length*4 > a0.length) return;
  1072     for (int i = 0; i < p4.length; i+=1) {
  1073       long l = p4[i];
  1074       a0[i*4+0] = (short)(l & 0xFFFFl);
  1075       a0[i*4+1] = (short)(l >> 16);
  1076       a0[i*4+2] = (short)(l >> 32);
  1077       a0[i*4+3] = (short)(l >> 48);
  1080   static void test_pack4_swap(long[] p4, short[] a1) {
  1081     if (p4.length*4 > a1.length) return;
  1082     for (int i = 0; i < p4.length; i+=1) {
  1083       long l0 = (long)a1[i*4+0];
  1084       long l1 = (long)a1[i*4+1];
  1085       long l2 = (long)a1[i*4+2];
  1086       long l3 = (long)a1[i*4+3];
  1087       p4[i] = (l3 & 0xFFFFl) |
  1088              ((l2 & 0xFFFFl) << 16) |
  1089              ((l1 & 0xFFFFl) << 32) |
  1090              ((l0 & 0xFFFFl) << 48);
  1093   static void test_unpack4_swap(short[] a0, long[] p4) {
  1094     if (p4.length*4 > a0.length) return;
  1095     for (int i = 0; i < p4.length; i+=1) {
  1096       long l = p4[i];
  1097       a0[i*4+0] = (short)(l >> 48);
  1098       a0[i*4+1] = (short)(l >> 32);
  1099       a0[i*4+2] = (short)(l >> 16);
  1100       a0[i*4+3] = (short)(l & 0xFFFFl);
  1104   static int verify(String text, int i, short elem, short val) {
  1105     if (elem != val) {
  1106       System.err.println(text + "[" + i + "] = " + elem + " != " + val);
  1107       return 1;
  1109     return 0;
  1112   static int verify(String text, int i, int elem, int val) {
  1113     if (elem != val) {
  1114       System.err.println(text + "[" + i + "] = " + Integer.toHexString(elem) + " != " + Integer.toHexString(val));
  1115       return 1;
  1117     return 0;
  1120   static int verify(String text, int i, long elem, long val) {
  1121     if (elem != val) {
  1122       System.err.println(text + "[" + i + "] = " + Long.toHexString(elem) + " != " + Long.toHexString(val));
  1123       return 1;
  1125     return 0;

mercurial