1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /**
18  * Functional tests for SIMD vectorization.
19  */
20 public class Main {
21 
22   static boolean[] a;
23 
24   //
25   // Arithmetic operations.
26   //
27 
28   /// CHECK-START: void Main.and(boolean) loop_optimization (before)
29   /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> outer_loop:none
30   /// CHECK-DAG: ArraySet loop:<<Loop>>      outer_loop:none
31   //
32   /// CHECK-START-{ARM,ARM64}: void Main.and(boolean) loop_optimization (after)
33   /// CHECK-DAG: VecLoad  loop:<<Loop:B\d+>> outer_loop:none
34   /// CHECK-DAG: VecAnd   loop:<<Loop>>      outer_loop:none
35   /// CHECK-DAG: VecStore loop:<<Loop>>      outer_loop:none
and(boolean x)36   static void and(boolean x) {
37     for (int i = 0; i < 128; i++)
38       a[i] &= x;  // NOTE: bitwise and, not the common &&
39   }
40 
41   /// CHECK-START: void Main.or(boolean) loop_optimization (before)
42   /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> outer_loop:none
43   /// CHECK-DAG: ArraySet loop:<<Loop>>      outer_loop:none
44   //
45   /// CHECK-START-{ARM,ARM64}: void Main.or(boolean) loop_optimization (after)
46   /// CHECK-DAG: VecLoad  loop:<<Loop:B\d+>> outer_loop:none
47   /// CHECK-DAG: VecOr    loop:<<Loop>>      outer_loop:none
48   /// CHECK-DAG: VecStore loop:<<Loop>>      outer_loop:none
or(boolean x)49   static void or(boolean x) {
50     for (int i = 0; i < 128; i++)
51       a[i] |= x;  // NOTE: bitwise or, not the common ||
52   }
53 
54   /// CHECK-START: void Main.xor(boolean) loop_optimization (before)
55   /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> outer_loop:none
56   /// CHECK-DAG: ArraySet loop:<<Loop>>      outer_loop:none
57   //
58   /// CHECK-START-{ARM,ARM64}: void Main.xor(boolean) loop_optimization (after)
59   /// CHECK-DAG: VecLoad  loop:<<Loop:B\d+>> outer_loop:none
60   /// CHECK-DAG: VecXor   loop:<<Loop>>      outer_loop:none
61   /// CHECK-DAG: VecStore loop:<<Loop>>      outer_loop:none
xor(boolean x)62   static void xor(boolean x) {
63     for (int i = 0; i < 128; i++)
64       a[i] ^= x;  // NOTE: bitwise xor
65   }
66 
67   /// CHECK-START: void Main.not() loop_optimization (before)
68   /// CHECK-DAG: ArrayGet loop:<<Loop:B\d+>> outer_loop:none
69   /// CHECK-DAG: ArraySet loop:<<Loop>>      outer_loop:none
70   //
71   /// CHECK-START-{ARM,ARM64}: void Main.not() loop_optimization (after)
72   /// CHECK-DAG: VecLoad  loop:<<Loop:B\d+>> outer_loop:none
73   /// CHECK-DAG: VecNot   loop:<<Loop>>      outer_loop:none
74   /// CHECK-DAG: VecStore loop:<<Loop>>      outer_loop:none
not()75   static void not() {
76     for (int i = 0; i < 128; i++)
77       a[i] = !a[i];
78   }
79 
80   //
81   // Test Driver.
82   //
83 
main(String[] args)84   public static void main(String[] args) {
85     // Set up.
86     a = new boolean[128];
87     for (int i = 0; i < 128; i++) {
88       a[i] = (i & 1) == 0;
89     }
90     // Arithmetic operations.
91     and(true);
92     for (int i = 0; i < 128; i++) {
93       expectEquals((i & 1) == 0, a[i], "and-true");
94     }
95     xor(true);
96     for (int i = 0; i < 128; i++) {
97       expectEquals((i & 1) != 0, a[i], "xor-true");
98     }
99     xor(false);
100     for (int i = 0; i < 128; i++) {
101       expectEquals((i & 1) != 0, a[i], "xor-false");
102     }
103     not();
104     for (int i = 0; i < 128; i++) {
105       expectEquals((i & 1) == 0, a[i], "not");
106     }
107     or(true);
108     for (int i = 0; i < 128; i++) {
109       expectEquals(true, a[i], "or-true");
110     }
111     and(false);
112     for (int i = 0; i < 128; i++) {
113       expectEquals(false, a[i], "and-false");
114     }
115     or(false);
116     for (int i = 0; i < 128; i++) {
117       expectEquals(false, a[i], "or-false");
118     }
119     // Done.
120     System.out.println("passed");
121   }
122 
expectEquals(boolean expected, boolean result, String action)123   private static void expectEquals(boolean expected, boolean result, String action) {
124     if (expected != result) {
125       throw new Error("Expected: " + expected + ", found: " + result + " for " + action);
126     }
127   }
128 }
129