• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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: Phi      loop:<<Loop:B\d+>> outer_loop:none
30   /// CHECK-DAG: ArrayGet loop:<<Loop>>      outer_loop:none
31   /// CHECK-DAG: ArraySet loop:<<Loop>>      outer_loop:none
32   //
33   /// CHECK-START-ARM64: void Main.and(boolean) loop_optimization (after)
34   /// CHECK-DAG: Phi      loop:<<Loop:B\d+>> outer_loop:none
35   /// CHECK-DAG: VecLoad  loop:<<Loop>>      outer_loop:none
36   /// CHECK-DAG: VecAnd   loop:<<Loop>>      outer_loop:none
37   /// CHECK-DAG: VecStore loop:<<Loop>>      outer_loop:none
and(boolean x)38   static void and(boolean x) {
39     for (int i = 0; i < 128; i++)
40       a[i] &= x;  // NOTE: bitwise and, not the common &&
41   }
42 
43   /// CHECK-START: void Main.or(boolean) loop_optimization (before)
44   /// CHECK-DAG: Phi      loop:<<Loop:B\d+>> outer_loop:none
45   /// CHECK-DAG: ArrayGet loop:<<Loop>>      outer_loop:none
46   /// CHECK-DAG: ArraySet loop:<<Loop>>      outer_loop:none
47   //
48   /// CHECK-START-ARM64: void Main.or(boolean) loop_optimization (after)
49   /// CHECK-DAG: Phi      loop:<<Loop:B\d+>> outer_loop:none
50   /// CHECK-DAG: VecLoad  loop:<<Loop>>      outer_loop:none
51   /// CHECK-DAG: VecOr    loop:<<Loop>>      outer_loop:none
52   /// CHECK-DAG: VecStore loop:<<Loop>>      outer_loop:none
or(boolean x)53   static void or(boolean x) {
54     for (int i = 0; i < 128; i++)
55       a[i] |= x;  // NOTE: bitwise or, not the common ||
56   }
57 
58   /// CHECK-START: void Main.xor(boolean) loop_optimization (before)
59   /// CHECK-DAG: Phi      loop:<<Loop:B\d+>> outer_loop:none
60   /// CHECK-DAG: ArrayGet loop:<<Loop>>      outer_loop:none
61   /// CHECK-DAG: ArraySet loop:<<Loop>>      outer_loop:none
62   //
63   /// CHECK-START-ARM64: void Main.xor(boolean) loop_optimization (after)
64   /// CHECK-DAG: Phi      loop:<<Loop:B\d+>> outer_loop:none
65   /// CHECK-DAG: VecLoad  loop:<<Loop>>      outer_loop:none
66   /// CHECK-DAG: VecXor   loop:<<Loop>>      outer_loop:none
67   /// CHECK-DAG: VecStore loop:<<Loop>>      outer_loop:none
xor(boolean x)68   static void xor(boolean x) {
69     for (int i = 0; i < 128; i++)
70       a[i] ^= x;  // NOTE: bitwise xor
71   }
72 
73   /// CHECK-START: void Main.not() loop_optimization (before)
74   /// CHECK-DAG: Phi      loop:<<Loop:B\d+>> outer_loop:none
75   /// CHECK-DAG: ArrayGet loop:<<Loop>>      outer_loop:none
76   /// CHECK-DAG: ArraySet loop:<<Loop>>      outer_loop:none
77   //
78   /// CHECK-START-ARM64: void Main.not() loop_optimization (after)
79   /// CHECK-DAG: Phi      loop:<<Loop:B\d+>> outer_loop:none
80   /// CHECK-DAG: VecLoad  loop:<<Loop>>      outer_loop:none
81   /// CHECK-DAG: VecNot   loop:<<Loop>>      outer_loop:none
82   /// CHECK-DAG: VecStore loop:<<Loop>>      outer_loop:none
not()83   static void not() {
84     for (int i = 0; i < 128; i++)
85       a[i] = !a[i];
86   }
87 
88   //
89   // Test Driver.
90   //
91 
main(String[] args)92   public static void main(String[] args) {
93     // Set up.
94     a = new boolean[128];
95     for (int i = 0; i < 128; i++) {
96       a[i] = (i & 1) == 0;
97     }
98     // Arithmetic operations.
99     and(true);
100     for (int i = 0; i < 128; i++) {
101       expectEquals((i & 1) == 0, a[i], "and-true");
102     }
103     xor(true);
104     for (int i = 0; i < 128; i++) {
105       expectEquals((i & 1) != 0, a[i], "xor-true");
106     }
107     xor(false);
108     for (int i = 0; i < 128; i++) {
109       expectEquals((i & 1) != 0, a[i], "xor-false");
110     }
111     not();
112     for (int i = 0; i < 128; i++) {
113       expectEquals((i & 1) == 0, a[i], "not");
114     }
115     or(true);
116     for (int i = 0; i < 128; i++) {
117       expectEquals(true, a[i], "or-true");
118     }
119     and(false);
120     for (int i = 0; i < 128; i++) {
121       expectEquals(false, a[i], "and-false");
122     }
123     or(false);
124     for (int i = 0; i < 128; i++) {
125       expectEquals(false, a[i], "or-false");
126     }
127     // Done.
128     System.out.println("passed");
129   }
130 
expectEquals(boolean expected, boolean result, String action)131   private static void expectEquals(boolean expected, boolean result, String action) {
132     if (expected != result) {
133       throw new Error("Expected: " + expected + ", found: " + result + " for " + action);
134     }
135   }
136 }
137