blob: 7dbfcda736684d20cf5a45e33a53c10dc7022567 [file] [log] [blame]
Aart Bikb79f4ac2017-07-10 10:10:37 -07001/*
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#include "base/arena_allocator.h"
18#include "nodes.h"
19#include "optimizing_unit_test.h"
20
21namespace art {
22
23/**
24 * Fixture class for testing vector nodes.
25 */
26class NodesVectorTest : public CommonCompilerTest {
27 public:
28 NodesVectorTest()
29 : pool_(),
30 allocator_(&pool_),
31 graph_(CreateGraph(&allocator_)) {
32 BuildGraph();
33 }
34
35 ~NodesVectorTest() { }
36
37 void BuildGraph() {
38 graph_->SetNumberOfVRegs(1);
39 entry_block_ = new (&allocator_) HBasicBlock(graph_);
40 exit_block_ = new (&allocator_) HBasicBlock(graph_);
41 graph_->AddBlock(entry_block_);
42 graph_->AddBlock(exit_block_);
43 graph_->SetEntryBlock(entry_block_);
44 graph_->SetExitBlock(exit_block_);
45 parameter_ = new (&allocator_) HParameterValue(graph_->GetDexFile(),
46 dex::TypeIndex(0),
47 0,
Vladimir Marko0ebe0d82017-09-21 22:50:39 +010048 DataType::Type::kInt32);
Aart Bikb79f4ac2017-07-10 10:10:37 -070049 entry_block_->AddInstruction(parameter_);
Vladimir Markod5d2f2c2017-09-26 12:37:26 +010050 int8_parameter_ = new (&allocator_) HParameterValue(graph_->GetDexFile(),
51 dex::TypeIndex(1),
52 0,
53 DataType::Type::kInt8);
54 entry_block_->AddInstruction(int8_parameter_);
55 int16_parameter_ = new (&allocator_) HParameterValue(graph_->GetDexFile(),
56 dex::TypeIndex(2),
57 0,
58 DataType::Type::kInt16);
59 entry_block_->AddInstruction(int16_parameter_);
Aart Bikb79f4ac2017-07-10 10:10:37 -070060 }
61
62 // General building fields.
63 ArenaPool pool_;
64 ArenaAllocator allocator_;
65 HGraph* graph_;
66
67 HBasicBlock* entry_block_;
68 HBasicBlock* exit_block_;
69
70 HInstruction* parameter_;
Vladimir Markod5d2f2c2017-09-26 12:37:26 +010071 HInstruction* int8_parameter_;
72 HInstruction* int16_parameter_;
Aart Bikb79f4ac2017-07-10 10:10:37 -070073};
74
75//
76// The actual vector nodes tests.
77//
78
79TEST(NodesVector, Alignment) {
80 EXPECT_TRUE(Alignment(1, 0).IsAlignedAt(1));
81 EXPECT_FALSE(Alignment(1, 0).IsAlignedAt(2));
82
83 EXPECT_TRUE(Alignment(2, 0).IsAlignedAt(1));
84 EXPECT_TRUE(Alignment(2, 1).IsAlignedAt(1));
85 EXPECT_TRUE(Alignment(2, 0).IsAlignedAt(2));
86 EXPECT_FALSE(Alignment(2, 1).IsAlignedAt(2));
87 EXPECT_FALSE(Alignment(2, 0).IsAlignedAt(4));
88 EXPECT_FALSE(Alignment(2, 1).IsAlignedAt(4));
89
90 EXPECT_TRUE(Alignment(4, 0).IsAlignedAt(1));
91 EXPECT_TRUE(Alignment(4, 2).IsAlignedAt(1));
92 EXPECT_TRUE(Alignment(4, 0).IsAlignedAt(2));
93 EXPECT_TRUE(Alignment(4, 2).IsAlignedAt(2));
94 EXPECT_TRUE(Alignment(4, 0).IsAlignedAt(4));
95 EXPECT_FALSE(Alignment(4, 2).IsAlignedAt(4));
96 EXPECT_FALSE(Alignment(4, 0).IsAlignedAt(8));
97 EXPECT_FALSE(Alignment(4, 2).IsAlignedAt(8));
98
99 EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(1));
100 EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(2));
101 EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(4));
102 EXPECT_TRUE(Alignment(16, 8).IsAlignedAt(8));
103 EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(16));
104 EXPECT_FALSE(Alignment(16, 1).IsAlignedAt(16));
105 EXPECT_FALSE(Alignment(16, 7).IsAlignedAt(16));
106 EXPECT_FALSE(Alignment(16, 0).IsAlignedAt(32));
107}
108
109TEST(NodesVector, AlignmentEQ) {
110 EXPECT_TRUE(Alignment(2, 0) == Alignment(2, 0));
111 EXPECT_TRUE(Alignment(2, 1) == Alignment(2, 1));
112 EXPECT_TRUE(Alignment(4, 0) == Alignment(4, 0));
113 EXPECT_TRUE(Alignment(4, 2) == Alignment(4, 2));
114
115 EXPECT_FALSE(Alignment(4, 0) == Alignment(2, 0));
116 EXPECT_FALSE(Alignment(4, 0) == Alignment(4, 1));
117 EXPECT_FALSE(Alignment(4, 0) == Alignment(8, 0));
118}
119
120TEST(NodesVector, AlignmentString) {
121 EXPECT_STREQ("ALIGN(1,0)", Alignment(1, 0).ToString().c_str());
122
123 EXPECT_STREQ("ALIGN(2,0)", Alignment(2, 0).ToString().c_str());
124 EXPECT_STREQ("ALIGN(2,1)", Alignment(2, 1).ToString().c_str());
125
126 EXPECT_STREQ("ALIGN(16,0)", Alignment(16, 0).ToString().c_str());
127 EXPECT_STREQ("ALIGN(16,1)", Alignment(16, 1).ToString().c_str());
128 EXPECT_STREQ("ALIGN(16,8)", Alignment(16, 8).ToString().c_str());
129 EXPECT_STREQ("ALIGN(16,9)", Alignment(16, 9).ToString().c_str());
130}
131
132TEST_F(NodesVectorTest, VectorOperationProperties) {
133 HVecOperation* v0 = new (&allocator_)
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100134 HVecReplicateScalar(&allocator_, parameter_, DataType::Type::kInt32, 4);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700135 HVecOperation* v1 = new (&allocator_)
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100136 HVecReplicateScalar(&allocator_, parameter_, DataType::Type::kInt32, 4);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700137 HVecOperation* v2 = new (&allocator_)
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100138 HVecReplicateScalar(&allocator_, parameter_, DataType::Type::kInt32, 2);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700139 HVecOperation* v3 = new (&allocator_)
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100140 HVecReplicateScalar(&allocator_, parameter_, DataType::Type::kInt16, 4);
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100141 HVecOperation* v4 = new (&allocator_) HVecStore(
142 &allocator_,
143 parameter_,
144 parameter_,
145 v0,
146 DataType::Type::kInt32,
147 SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
148 4);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700149
150 EXPECT_TRUE(v0->Equals(v0));
151 EXPECT_TRUE(v1->Equals(v1));
152 EXPECT_TRUE(v2->Equals(v2));
153 EXPECT_TRUE(v3->Equals(v3));
154 EXPECT_TRUE(v4->Equals(v4));
155
156 EXPECT_TRUE(v0->Equals(v1));
157 EXPECT_FALSE(v0->Equals(v2)); // different vector lengths
158 EXPECT_FALSE(v0->Equals(v3)); // different packed types
159 EXPECT_FALSE(v0->Equals(v4)); // different kinds
160
161 EXPECT_TRUE(v1->Equals(v0)); // switch operands
162 EXPECT_FALSE(v4->Equals(v0));
163
164 EXPECT_EQ(4u, v0->GetVectorLength());
165 EXPECT_EQ(4u, v1->GetVectorLength());
166 EXPECT_EQ(2u, v2->GetVectorLength());
167 EXPECT_EQ(4u, v3->GetVectorLength());
168 EXPECT_EQ(4u, v4->GetVectorLength());
169
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100170 EXPECT_EQ(DataType::Type::kFloat64, v0->GetType());
171 EXPECT_EQ(DataType::Type::kFloat64, v1->GetType());
172 EXPECT_EQ(DataType::Type::kFloat64, v2->GetType());
173 EXPECT_EQ(DataType::Type::kFloat64, v3->GetType());
174 EXPECT_EQ(DataType::Type::kFloat64, v4->GetType());
Aart Bikb79f4ac2017-07-10 10:10:37 -0700175
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100176 EXPECT_EQ(DataType::Type::kInt32, v0->GetPackedType());
177 EXPECT_EQ(DataType::Type::kInt32, v1->GetPackedType());
178 EXPECT_EQ(DataType::Type::kInt32, v2->GetPackedType());
179 EXPECT_EQ(DataType::Type::kInt16, v3->GetPackedType());
180 EXPECT_EQ(DataType::Type::kInt32, v4->GetPackedType());
Aart Bikb79f4ac2017-07-10 10:10:37 -0700181
182 EXPECT_EQ(16u, v0->GetVectorNumberOfBytes());
183 EXPECT_EQ(16u, v1->GetVectorNumberOfBytes());
184 EXPECT_EQ(8u, v2->GetVectorNumberOfBytes());
185 EXPECT_EQ(8u, v3->GetVectorNumberOfBytes());
186 EXPECT_EQ(16u, v4->GetVectorNumberOfBytes());
187
188 EXPECT_FALSE(v0->CanBeMoved());
189 EXPECT_FALSE(v1->CanBeMoved());
190 EXPECT_FALSE(v2->CanBeMoved());
191 EXPECT_FALSE(v3->CanBeMoved());
192 EXPECT_FALSE(v4->CanBeMoved());
193}
194
195TEST_F(NodesVectorTest, VectorAlignmentAndStringCharAtMatterOnLoad) {
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100196 HVecLoad* v0 = new (&allocator_) HVecLoad(&allocator_,
197 parameter_,
198 parameter_,
199 DataType::Type::kInt32,
200 SideEffects::ArrayReadOfType(DataType::Type::kInt32),
201 4,
202 /*is_string_char_at*/ false);
203 HVecLoad* v1 = new (&allocator_) HVecLoad(&allocator_,
204 parameter_,
205 parameter_,
206 DataType::Type::kInt32,
207 SideEffects::ArrayReadOfType(DataType::Type::kInt32),
208 4,
209 /*is_string_char_at*/ false);
210 HVecLoad* v2 = new (&allocator_) HVecLoad(&allocator_,
211 parameter_,
212 parameter_,
213 DataType::Type::kInt32,
214 SideEffects::ArrayReadOfType(DataType::Type::kInt32),
215 4,
216 /*is_string_char_at*/ true);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700217
218 EXPECT_TRUE(v0->CanBeMoved());
219 EXPECT_TRUE(v1->CanBeMoved());
220 EXPECT_TRUE(v2->CanBeMoved());
221
222 EXPECT_FALSE(v0->IsStringCharAt());
223 EXPECT_FALSE(v1->IsStringCharAt());
224 EXPECT_TRUE(v2->IsStringCharAt());
225
226 EXPECT_TRUE(v0->Equals(v0));
227 EXPECT_TRUE(v1->Equals(v1));
228 EXPECT_TRUE(v2->Equals(v2));
229
230 EXPECT_TRUE(v0->Equals(v1));
231 EXPECT_FALSE(v0->Equals(v2));
232
233 EXPECT_TRUE(v0->GetAlignment() == Alignment(4, 0));
234 EXPECT_TRUE(v1->GetAlignment() == Alignment(4, 0));
235 EXPECT_TRUE(v2->GetAlignment() == Alignment(4, 0));
236
237 v1->SetAlignment(Alignment(8, 0));
238
239 EXPECT_TRUE(v1->GetAlignment() == Alignment(8, 0));
240
241 EXPECT_FALSE(v0->Equals(v1)); // no longer equal
242}
243
244TEST_F(NodesVectorTest, VectorSignMattersOnMin) {
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100245 HVecOperation* p0 = new (&allocator_)
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100246 HVecReplicateScalar(&allocator_, parameter_, DataType::Type::kInt32, 4);
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100247 HVecOperation* p1 = new (&allocator_)
248 HVecReplicateScalar(&allocator_, int8_parameter_, DataType::Type::kInt8, 4);
249 HVecOperation* p2 = new (&allocator_)
250 HVecReplicateScalar(&allocator_, int16_parameter_, DataType::Type::kInt16, 4);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700251
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100252 HVecMin* v0 = new (&allocator_) HVecMin(
253 &allocator_, p0, p0, DataType::Type::kInt32, 4, /*is_unsigned*/ true);
254 HVecMin* v1 = new (&allocator_) HVecMin(
255 &allocator_, p0, p0, DataType::Type::kInt32, 4, /*is_unsigned*/ false);
256 HVecMin* v2 = new (&allocator_) HVecMin(
257 &allocator_, p0, p0, DataType::Type::kInt32, 2, /*is_unsigned*/ true);
258 HVecMin* v3 = new (&allocator_) HVecMin(&allocator_, p1, p1, DataType::Type::kUint8, 16);
259 HVecMin* v4 = new (&allocator_) HVecMin(&allocator_, p1, p1, DataType::Type::kInt8, 16);
260 HVecMin* v5 = new (&allocator_) HVecMin(&allocator_, p2, p2, DataType::Type::kUint16, 8);
261 HVecMin* v6 = new (&allocator_) HVecMin(&allocator_, p2, p2, DataType::Type::kInt16, 8);
262 HVecMin* min_insns[] = { v0, v1, v2, v3, v4, v5, v6 };
Aart Bikb79f4ac2017-07-10 10:10:37 -0700263
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100264 EXPECT_FALSE(p0->CanBeMoved());
265 EXPECT_FALSE(p1->CanBeMoved());
266 EXPECT_FALSE(p2->CanBeMoved());
Aart Bikb79f4ac2017-07-10 10:10:37 -0700267
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100268 for (HVecMin* min_insn : min_insns) {
269 EXPECT_TRUE(min_insn->CanBeMoved());
270 }
Aart Bikb79f4ac2017-07-10 10:10:37 -0700271
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100272 // Deprecated; IsUnsigned() should be removed with the introduction of Uint32 and Uint64.
273 EXPECT_TRUE(v0->IsUnsigned());
274 EXPECT_FALSE(v1->IsUnsigned());
275 EXPECT_TRUE(v2->IsUnsigned());
Aart Bikb79f4ac2017-07-10 10:10:37 -0700276
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100277 for (HVecMin* min_insn1 : min_insns) {
278 for (HVecMin* min_insn2 : min_insns) {
279 EXPECT_EQ(min_insn1 == min_insn2, min_insn1->Equals(min_insn2));
280 }
281 }
Aart Bikb79f4ac2017-07-10 10:10:37 -0700282}
283
284TEST_F(NodesVectorTest, VectorSignMattersOnMax) {
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100285 HVecOperation* p0 = new (&allocator_)
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100286 HVecReplicateScalar(&allocator_, parameter_, DataType::Type::kInt32, 4);
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100287 HVecOperation* p1 = new (&allocator_)
288 HVecReplicateScalar(&allocator_, int8_parameter_, DataType::Type::kInt8, 4);
289 HVecOperation* p2 = new (&allocator_)
290 HVecReplicateScalar(&allocator_, int16_parameter_, DataType::Type::kInt16, 4);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700291
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100292 HVecMax* v0 = new (&allocator_) HVecMax(
293 &allocator_, p0, p0, DataType::Type::kInt32, 4, /*is_unsigned*/ true);
294 HVecMax* v1 = new (&allocator_) HVecMax(
295 &allocator_, p0, p0, DataType::Type::kInt32, 4, /*is_unsigned*/ false);
296 HVecMax* v2 = new (&allocator_) HVecMax(
297 &allocator_, p0, p0, DataType::Type::kInt32, 2, /*is_unsigned*/ true);
298 HVecMax* v3 = new (&allocator_) HVecMax(&allocator_, p1, p1, DataType::Type::kUint8, 16);
299 HVecMax* v4 = new (&allocator_) HVecMax(&allocator_, p1, p1, DataType::Type::kInt8, 16);
300 HVecMax* v5 = new (&allocator_) HVecMax(&allocator_, p2, p2, DataType::Type::kUint16, 8);
301 HVecMax* v6 = new (&allocator_) HVecMax(&allocator_, p2, p2, DataType::Type::kInt16, 8);
302 HVecMax* max_insns[] = { v0, v1, v2, v3, v4, v5, v6 };
Aart Bikb79f4ac2017-07-10 10:10:37 -0700303
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100304 EXPECT_FALSE(p0->CanBeMoved());
305 EXPECT_FALSE(p1->CanBeMoved());
306 EXPECT_FALSE(p2->CanBeMoved());
Aart Bikb79f4ac2017-07-10 10:10:37 -0700307
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100308 for (HVecMax* max_insn : max_insns) {
309 EXPECT_TRUE(max_insn->CanBeMoved());
310 }
Aart Bikb79f4ac2017-07-10 10:10:37 -0700311
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100312 // Deprecated; IsUnsigned() should be removed with the introduction of Uint32 and Uint64.
313 EXPECT_TRUE(v0->IsUnsigned());
314 EXPECT_FALSE(v1->IsUnsigned());
315 EXPECT_TRUE(v2->IsUnsigned());
Aart Bikb79f4ac2017-07-10 10:10:37 -0700316
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100317 for (HVecMax* max_insn1 : max_insns) {
318 for (HVecMax* max_insn2 : max_insns) {
319 EXPECT_EQ(max_insn1 == max_insn2, max_insn1->Equals(max_insn2));
320 }
321 }
Aart Bikb79f4ac2017-07-10 10:10:37 -0700322}
323
324TEST_F(NodesVectorTest, VectorAttributesMatterOnHalvingAdd) {
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100325 HVecOperation* p0 = new (&allocator_)
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100326 HVecReplicateScalar(&allocator_, parameter_, DataType::Type::kInt32, 4);
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100327 HVecOperation* p1 = new (&allocator_)
328 HVecReplicateScalar(&allocator_, int8_parameter_, DataType::Type::kInt8, 4);
329 HVecOperation* p2 = new (&allocator_)
330 HVecReplicateScalar(&allocator_, int16_parameter_, DataType::Type::kInt16, 4);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700331
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100332 HVecHalvingAdd* v0 = new (&allocator_) HVecHalvingAdd(
333 &allocator_, p0, p0, DataType::Type::kInt32, 4, /*is_rounded*/ true, /*is_unsigned*/ true);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700334 HVecHalvingAdd* v1 = new (&allocator_) HVecHalvingAdd(
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100335 &allocator_, p0, p0, DataType::Type::kInt32, 4, /*is_rounded*/ false, /*is_unsigned*/ true);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700336 HVecHalvingAdd* v2 = new (&allocator_) HVecHalvingAdd(
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100337 &allocator_, p0, p0, DataType::Type::kInt32, 4, /*is_rounded*/ true, /*is_unsigned*/ false);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700338 HVecHalvingAdd* v3 = new (&allocator_) HVecHalvingAdd(
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100339 &allocator_, p0, p0, DataType::Type::kInt32, 4, /*is_rounded*/ false, /*is_unsigned*/ false);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700340 HVecHalvingAdd* v4 = new (&allocator_) HVecHalvingAdd(
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100341 &allocator_, p0, p0, DataType::Type::kInt32, 2, /*is_rounded*/ true, /*is_unsigned*/ true);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700342 HVecHalvingAdd* v5 = new (&allocator_) HVecHalvingAdd(
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100343 &allocator_, p1, p1, DataType::Type::kUint8, 16, /*is_rounded*/ true);
344 HVecHalvingAdd* v6 = new (&allocator_) HVecHalvingAdd(
345 &allocator_, p1, p1, DataType::Type::kUint8, 16, /*is_rounded*/ false);
346 HVecHalvingAdd* v7 = new (&allocator_) HVecHalvingAdd(
347 &allocator_, p1, p1, DataType::Type::kInt8, 16, /*is_rounded*/ true);
348 HVecHalvingAdd* v8 = new (&allocator_) HVecHalvingAdd(
349 &allocator_, p1, p1, DataType::Type::kInt8, 16, /*is_rounded*/ false);
350 HVecHalvingAdd* v9 = new (&allocator_) HVecHalvingAdd(
351 &allocator_, p2, p2, DataType::Type::kUint16, 8, /*is_rounded*/ true);
352 HVecHalvingAdd* v10 = new (&allocator_) HVecHalvingAdd(
353 &allocator_, p2, p2, DataType::Type::kUint16, 8, /*is_rounded*/ false);
354 HVecHalvingAdd* v11 = new (&allocator_) HVecHalvingAdd(
355 &allocator_, p2, p2, DataType::Type::kInt16, 2, /*is_rounded*/ true);
356 HVecHalvingAdd* v12 = new (&allocator_) HVecHalvingAdd(
357 &allocator_, p2, p2, DataType::Type::kInt16, 2, /*is_rounded*/ false);
358 HVecHalvingAdd* hadd_insns[] = { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12 };
Aart Bikb79f4ac2017-07-10 10:10:37 -0700359
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100360 EXPECT_FALSE(p0->CanBeMoved());
361 EXPECT_FALSE(p1->CanBeMoved());
362 EXPECT_FALSE(p2->CanBeMoved());
Aart Bikb79f4ac2017-07-10 10:10:37 -0700363
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100364 for (HVecHalvingAdd* hadd_insn : hadd_insns) {
365 EXPECT_TRUE(hadd_insn->CanBeMoved());
366 }
Aart Bikb79f4ac2017-07-10 10:10:37 -0700367
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100368 // Deprecated; IsUnsigned() should be removed with the introduction of Uint32 and Uint64.
369 EXPECT_TRUE(v0->IsUnsigned());
370 EXPECT_TRUE(v1->IsUnsigned());
371 EXPECT_TRUE(!v2->IsUnsigned());
372 EXPECT_TRUE(!v3->IsUnsigned());
373 EXPECT_TRUE(v4->IsUnsigned());
Aart Bikb79f4ac2017-07-10 10:10:37 -0700374
Vladimir Markod5d2f2c2017-09-26 12:37:26 +0100375 EXPECT_TRUE(v0->IsRounded());
376 EXPECT_TRUE(!v1->IsRounded());
377 EXPECT_TRUE(v2->IsRounded());
378 EXPECT_TRUE(!v3->IsRounded());
379 EXPECT_TRUE(v4->IsRounded());
380 EXPECT_TRUE(v5->IsRounded());
381 EXPECT_TRUE(!v6->IsRounded());
382 EXPECT_TRUE(v7->IsRounded());
383 EXPECT_TRUE(!v8->IsRounded());
384 EXPECT_TRUE(v9->IsRounded());
385 EXPECT_TRUE(!v10->IsRounded());
386 EXPECT_TRUE(v11->IsRounded());
387 EXPECT_TRUE(!v12->IsRounded());
388
389 for (HVecHalvingAdd* hadd_insn1 : hadd_insns) {
390 for (HVecHalvingAdd* hadd_insn2 : hadd_insns) {
391 EXPECT_EQ(hadd_insn1 == hadd_insn2, hadd_insn1->Equals(hadd_insn2));
392 }
393 }
Aart Bikb79f4ac2017-07-10 10:10:37 -0700394}
395
396TEST_F(NodesVectorTest, VectorOperationMattersOnMultiplyAccumulate) {
397 HVecOperation* v0 = new (&allocator_)
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100398 HVecReplicateScalar(&allocator_, parameter_, DataType::Type::kInt32, 4);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700399
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100400 HVecMultiplyAccumulate* v1 = new (&allocator_) HVecMultiplyAccumulate(
401 &allocator_, HInstruction::kAdd, v0, v0, v0, DataType::Type::kInt32, 4);
402 HVecMultiplyAccumulate* v2 = new (&allocator_) HVecMultiplyAccumulate(
403 &allocator_, HInstruction::kSub, v0, v0, v0, DataType::Type::kInt32, 4);
404 HVecMultiplyAccumulate* v3 = new (&allocator_) HVecMultiplyAccumulate(
405 &allocator_, HInstruction::kAdd, v0, v0, v0, DataType::Type::kInt32, 2);
Aart Bikb79f4ac2017-07-10 10:10:37 -0700406
407 EXPECT_FALSE(v0->CanBeMoved());
408 EXPECT_TRUE(v1->CanBeMoved());
409 EXPECT_TRUE(v2->CanBeMoved());
410 EXPECT_TRUE(v3->CanBeMoved());
411
412 EXPECT_EQ(HInstruction::kAdd, v1->GetOpKind());
413 EXPECT_EQ(HInstruction::kSub, v2->GetOpKind());
414 EXPECT_EQ(HInstruction::kAdd, v3->GetOpKind());
415
416 EXPECT_TRUE(v1->Equals(v1));
417 EXPECT_TRUE(v2->Equals(v2));
418 EXPECT_TRUE(v3->Equals(v3));
419
420 EXPECT_FALSE(v1->Equals(v2)); // different operators
421 EXPECT_FALSE(v1->Equals(v3)); // different vector lengths
422}
423
Aart Bik0148de42017-09-05 09:25:01 -0700424TEST_F(NodesVectorTest, VectorKindMattersOnReduce) {
425 HVecOperation* v0 = new (&allocator_)
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100426 HVecReplicateScalar(&allocator_, parameter_, DataType::Type::kInt32, 4);
Aart Bik0148de42017-09-05 09:25:01 -0700427
428 HVecReduce* v1 = new (&allocator_) HVecReduce(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100429 &allocator_, v0, DataType::Type::kInt32, 4, HVecReduce::kSum);
Aart Bik0148de42017-09-05 09:25:01 -0700430 HVecReduce* v2 = new (&allocator_) HVecReduce(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100431 &allocator_, v0, DataType::Type::kInt32, 4, HVecReduce::kMin);
Aart Bik0148de42017-09-05 09:25:01 -0700432 HVecReduce* v3 = new (&allocator_) HVecReduce(
Vladimir Marko0ebe0d82017-09-21 22:50:39 +0100433 &allocator_, v0, DataType::Type::kInt32, 4, HVecReduce::kMax);
Aart Bik0148de42017-09-05 09:25:01 -0700434
435 EXPECT_FALSE(v0->CanBeMoved());
436 EXPECT_TRUE(v1->CanBeMoved());
437 EXPECT_TRUE(v2->CanBeMoved());
438 EXPECT_TRUE(v3->CanBeMoved());
439
440 EXPECT_EQ(HVecReduce::kSum, v1->GetKind());
441 EXPECT_EQ(HVecReduce::kMin, v2->GetKind());
442 EXPECT_EQ(HVecReduce::kMax, v3->GetKind());
443
444 EXPECT_TRUE(v1->Equals(v1));
445 EXPECT_TRUE(v2->Equals(v2));
446 EXPECT_TRUE(v3->Equals(v3));
447
448 EXPECT_FALSE(v1->Equals(v2)); // different kinds
449 EXPECT_FALSE(v1->Equals(v3));
450}
451
Aart Bikb79f4ac2017-07-10 10:10:37 -0700452} // namespace art