blob: f8239faaf31e428a641abd16ce419738a7adbbea [file] [log] [blame]
Aart Bikf8f5a162017-02-06 15:35:29 -08001/*
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 */
20public 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
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
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
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
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
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
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}