OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits> | 5 #include <limits> |
6 | 6 |
7 #include "src/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
9 #include "src/compiler/change-lowering.h" | 9 #include "src/compiler/change-lowering.h" |
10 #include "src/compiler/control-builders.h" | 10 #include "src/compiler/control-builders.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 #include "test/cctest/compiler/graph-builder-tester.h" | 26 #include "test/cctest/compiler/graph-builder-tester.h" |
27 #include "test/cctest/compiler/value-helper.h" | 27 #include "test/cctest/compiler/value-helper.h" |
28 | 28 |
29 namespace v8 { | 29 namespace v8 { |
30 namespace internal { | 30 namespace internal { |
31 namespace compiler { | 31 namespace compiler { |
32 | 32 |
33 template <typename ReturnType> | 33 template <typename ReturnType> |
34 class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> { | 34 class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> { |
35 public: | 35 public: |
36 SimplifiedLoweringTester(MachineType p0 = kMachNone, | 36 SimplifiedLoweringTester(MachineType p0 = MachineType::None(), |
37 MachineType p1 = kMachNone) | 37 MachineType p1 = MachineType::None()) |
38 : GraphBuilderTester<ReturnType>(p0, p1), | 38 : GraphBuilderTester<ReturnType>(p0, p1), |
39 typer(this->isolate(), this->graph()), | 39 typer(this->isolate(), this->graph()), |
40 javascript(this->zone()), | 40 javascript(this->zone()), |
41 jsgraph(this->isolate(), this->graph(), this->common(), &javascript, | 41 jsgraph(this->isolate(), this->graph(), this->common(), &javascript, |
42 this->simplified(), this->machine()), | 42 this->simplified(), this->machine()), |
43 source_positions(jsgraph.graph()), | 43 source_positions(jsgraph.graph()), |
44 lowering(&jsgraph, this->zone(), &source_positions) {} | 44 lowering(&jsgraph, this->zone(), &source_positions) {} |
45 | 45 |
46 Typer typer; | 46 Typer typer; |
47 JSOperatorBuilder javascript; | 47 JSOperatorBuilder javascript; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 | 93 |
94 | 94 |
95 // TODO(titzer): factor these tests out to test-run-simplifiedops.cc. | 95 // TODO(titzer): factor these tests out to test-run-simplifiedops.cc. |
96 // TODO(titzer): test tagged representation for input to NumberToInt32. | 96 // TODO(titzer): test tagged representation for input to NumberToInt32. |
97 TEST(RunNumberToInt32_float64) { | 97 TEST(RunNumberToInt32_float64) { |
98 // TODO(titzer): explicit load/stores here are only because of representations | 98 // TODO(titzer): explicit load/stores here are only because of representations |
99 double input; | 99 double input; |
100 int32_t result; | 100 int32_t result; |
101 SimplifiedLoweringTester<Object*> t; | 101 SimplifiedLoweringTester<Object*> t; |
102 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), | 102 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), |
103 kMachFloat64}; | 103 MachineType::Float64()}; |
104 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); | 104 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); |
105 NodeProperties::SetType(loaded, Type::Number()); | 105 NodeProperties::SetType(loaded, Type::Number()); |
106 Node* convert = t.NumberToInt32(loaded); | 106 Node* convert = t.NumberToInt32(loaded); |
107 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Signed32(), | 107 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Signed32(), |
108 kMachInt32}; | 108 MachineType::Int32()}; |
109 t.StoreField(store, t.PointerConstant(&result), convert); | 109 t.StoreField(store, t.PointerConstant(&result), convert); |
110 t.Return(t.jsgraph.TrueConstant()); | 110 t.Return(t.jsgraph.TrueConstant()); |
111 t.LowerAllNodesAndLowerChanges(); | 111 t.LowerAllNodesAndLowerChanges(); |
112 t.GenerateCode(); | 112 t.GenerateCode(); |
113 | 113 |
114 FOR_FLOAT64_INPUTS(i) { | 114 FOR_FLOAT64_INPUTS(i) { |
115 input = *i; | 115 input = *i; |
116 int32_t expected = DoubleToInt32(*i); | 116 int32_t expected = DoubleToInt32(*i); |
117 t.Call(); | 117 t.Call(); |
118 CHECK_EQ(expected, result); | 118 CHECK_EQ(expected, result); |
119 } | 119 } |
120 } | 120 } |
121 | 121 |
122 | 122 |
123 // TODO(titzer): test tagged representation for input to NumberToUint32. | 123 // TODO(titzer): test tagged representation for input to NumberToUint32. |
124 TEST(RunNumberToUint32_float64) { | 124 TEST(RunNumberToUint32_float64) { |
125 // TODO(titzer): explicit load/stores here are only because of representations | 125 // TODO(titzer): explicit load/stores here are only because of representations |
126 double input; | 126 double input; |
127 uint32_t result; | 127 uint32_t result; |
128 SimplifiedLoweringTester<Object*> t; | 128 SimplifiedLoweringTester<Object*> t; |
129 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), | 129 FieldAccess load = {kUntaggedBase, 0, Handle<Name>(), Type::Number(), |
130 kMachFloat64}; | 130 MachineType::Float64()}; |
131 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); | 131 Node* loaded = t.LoadField(load, t.PointerConstant(&input)); |
132 NodeProperties::SetType(loaded, Type::Number()); | 132 NodeProperties::SetType(loaded, Type::Number()); |
133 Node* convert = t.NumberToUint32(loaded); | 133 Node* convert = t.NumberToUint32(loaded); |
134 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Unsigned32(), | 134 FieldAccess store = {kUntaggedBase, 0, Handle<Name>(), Type::Unsigned32(), |
135 kMachUint32}; | 135 MachineType::Uint32()}; |
136 t.StoreField(store, t.PointerConstant(&result), convert); | 136 t.StoreField(store, t.PointerConstant(&result), convert); |
137 t.Return(t.jsgraph.TrueConstant()); | 137 t.Return(t.jsgraph.TrueConstant()); |
138 t.LowerAllNodesAndLowerChanges(); | 138 t.LowerAllNodesAndLowerChanges(); |
139 t.GenerateCode(); | 139 t.GenerateCode(); |
140 | 140 |
141 FOR_FLOAT64_INPUTS(i) { | 141 FOR_FLOAT64_INPUTS(i) { |
142 input = *i; | 142 input = *i; |
143 uint32_t expected = DoubleToUint32(*i); | 143 uint32_t expected = DoubleToUint32(*i); |
144 t.Call(); | 144 t.Call(); |
145 CHECK_EQ(static_cast<int32_t>(expected), static_cast<int32_t>(result)); | 145 CHECK_EQ(static_cast<int32_t>(expected), static_cast<int32_t>(result)); |
146 } | 146 } |
147 } | 147 } |
148 | 148 |
149 | 149 |
150 // Create a simple JSObject with a unique map. | 150 // Create a simple JSObject with a unique map. |
151 static Handle<JSObject> TestObject() { | 151 static Handle<JSObject> TestObject() { |
152 static int index = 0; | 152 static int index = 0; |
153 char buffer[50]; | 153 char buffer[50]; |
154 v8::base::OS::SNPrintF(buffer, 50, "({'a_%d':1})", index++); | 154 v8::base::OS::SNPrintF(buffer, 50, "({'a_%d':1})", index++); |
155 return Handle<JSObject>::cast(v8::Utils::OpenHandle(*CompileRun(buffer))); | 155 return Handle<JSObject>::cast(v8::Utils::OpenHandle(*CompileRun(buffer))); |
156 } | 156 } |
157 | 157 |
158 | 158 |
159 TEST(RunLoadMap) { | 159 TEST(RunLoadMap) { |
160 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 160 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
161 FieldAccess access = AccessBuilder::ForMap(); | 161 FieldAccess access = AccessBuilder::ForMap(); |
162 Node* load = t.LoadField(access, t.Parameter(0)); | 162 Node* load = t.LoadField(access, t.Parameter(0)); |
163 t.Return(load); | 163 t.Return(load); |
164 | 164 |
165 t.LowerAllNodesAndLowerChanges(); | 165 t.LowerAllNodesAndLowerChanges(); |
166 t.GenerateCode(); | 166 t.GenerateCode(); |
167 | 167 |
168 Handle<JSObject> src = TestObject(); | 168 Handle<JSObject> src = TestObject(); |
169 Handle<Map> src_map(src->map()); | 169 Handle<Map> src_map(src->map()); |
170 Object* result = t.Call(*src); // TODO(titzer): raw pointers in call | 170 Object* result = t.Call(*src); // TODO(titzer): raw pointers in call |
171 CHECK_EQ(*src_map, result); | 171 CHECK_EQ(*src_map, result); |
172 } | 172 } |
173 | 173 |
174 | 174 |
175 TEST(RunStoreMap) { | 175 TEST(RunStoreMap) { |
176 SimplifiedLoweringTester<int32_t> t(kMachAnyTagged, kMachAnyTagged); | 176 SimplifiedLoweringTester<int32_t> t(MachineType::AnyTagged(), |
| 177 MachineType::AnyTagged()); |
177 FieldAccess access = AccessBuilder::ForMap(); | 178 FieldAccess access = AccessBuilder::ForMap(); |
178 t.StoreField(access, t.Parameter(1), t.Parameter(0)); | 179 t.StoreField(access, t.Parameter(1), t.Parameter(0)); |
179 t.Return(t.jsgraph.TrueConstant()); | 180 t.Return(t.jsgraph.TrueConstant()); |
180 | 181 |
181 t.LowerAllNodesAndLowerChanges(); | 182 t.LowerAllNodesAndLowerChanges(); |
182 t.GenerateCode(); | 183 t.GenerateCode(); |
183 | 184 |
184 Handle<JSObject> src = TestObject(); | 185 Handle<JSObject> src = TestObject(); |
185 Handle<Map> src_map(src->map()); | 186 Handle<Map> src_map(src->map()); |
186 Handle<JSObject> dst = TestObject(); | 187 Handle<JSObject> dst = TestObject(); |
187 CHECK(src->map() != dst->map()); | 188 CHECK(src->map() != dst->map()); |
188 t.Call(*src_map, *dst); // TODO(titzer): raw pointers in call | 189 t.Call(*src_map, *dst); // TODO(titzer): raw pointers in call |
189 CHECK(*src_map == dst->map()); | 190 CHECK(*src_map == dst->map()); |
190 } | 191 } |
191 | 192 |
192 | 193 |
193 TEST(RunLoadProperties) { | 194 TEST(RunLoadProperties) { |
194 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 195 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
195 FieldAccess access = AccessBuilder::ForJSObjectProperties(); | 196 FieldAccess access = AccessBuilder::ForJSObjectProperties(); |
196 Node* load = t.LoadField(access, t.Parameter(0)); | 197 Node* load = t.LoadField(access, t.Parameter(0)); |
197 t.Return(load); | 198 t.Return(load); |
198 | 199 |
199 t.LowerAllNodesAndLowerChanges(); | 200 t.LowerAllNodesAndLowerChanges(); |
200 t.GenerateCode(); | 201 t.GenerateCode(); |
201 | 202 |
202 Handle<JSObject> src = TestObject(); | 203 Handle<JSObject> src = TestObject(); |
203 Handle<FixedArray> src_props(src->properties()); | 204 Handle<FixedArray> src_props(src->properties()); |
204 Object* result = t.Call(*src); // TODO(titzer): raw pointers in call | 205 Object* result = t.Call(*src); // TODO(titzer): raw pointers in call |
205 CHECK_EQ(*src_props, result); | 206 CHECK_EQ(*src_props, result); |
206 } | 207 } |
207 | 208 |
208 | 209 |
209 TEST(RunLoadStoreMap) { | 210 TEST(RunLoadStoreMap) { |
210 SimplifiedLoweringTester<Object*> t(kMachAnyTagged, kMachAnyTagged); | 211 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged(), |
| 212 MachineType::AnyTagged()); |
211 FieldAccess access = AccessBuilder::ForMap(); | 213 FieldAccess access = AccessBuilder::ForMap(); |
212 Node* load = t.LoadField(access, t.Parameter(0)); | 214 Node* load = t.LoadField(access, t.Parameter(0)); |
213 t.StoreField(access, t.Parameter(1), load); | 215 t.StoreField(access, t.Parameter(1), load); |
214 t.Return(load); | 216 t.Return(load); |
215 | 217 |
216 t.LowerAllNodesAndLowerChanges(); | 218 t.LowerAllNodesAndLowerChanges(); |
217 t.GenerateCode(); | 219 t.GenerateCode(); |
218 | 220 |
219 Handle<JSObject> src = TestObject(); | 221 Handle<JSObject> src = TestObject(); |
220 Handle<Map> src_map(src->map()); | 222 Handle<Map> src_map(src->map()); |
221 Handle<JSObject> dst = TestObject(); | 223 Handle<JSObject> dst = TestObject(); |
222 CHECK(src->map() != dst->map()); | 224 CHECK(src->map() != dst->map()); |
223 Object* result = t.Call(*src, *dst); // TODO(titzer): raw pointers in call | 225 Object* result = t.Call(*src, *dst); // TODO(titzer): raw pointers in call |
224 CHECK(result->IsMap()); | 226 CHECK(result->IsMap()); |
225 CHECK_EQ(*src_map, result); | 227 CHECK_EQ(*src_map, result); |
226 CHECK(*src_map == dst->map()); | 228 CHECK(*src_map == dst->map()); |
227 } | 229 } |
228 | 230 |
229 | 231 |
230 TEST(RunLoadStoreFixedArrayIndex) { | 232 TEST(RunLoadStoreFixedArrayIndex) { |
231 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 233 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
232 ElementAccess access = AccessBuilder::ForFixedArrayElement(); | 234 ElementAccess access = AccessBuilder::ForFixedArrayElement(); |
233 Node* load = t.LoadElement(access, t.Parameter(0), t.Int32Constant(0)); | 235 Node* load = t.LoadElement(access, t.Parameter(0), t.Int32Constant(0)); |
234 t.StoreElement(access, t.Parameter(0), t.Int32Constant(1), load); | 236 t.StoreElement(access, t.Parameter(0), t.Int32Constant(1), load); |
235 t.Return(load); | 237 t.Return(load); |
236 | 238 |
237 t.LowerAllNodesAndLowerChanges(); | 239 t.LowerAllNodesAndLowerChanges(); |
238 t.GenerateCode(); | 240 t.GenerateCode(); |
239 | 241 |
240 Handle<FixedArray> array = t.factory()->NewFixedArray(2); | 242 Handle<FixedArray> array = t.factory()->NewFixedArray(2); |
241 Handle<JSObject> src = TestObject(); | 243 Handle<JSObject> src = TestObject(); |
242 Handle<JSObject> dst = TestObject(); | 244 Handle<JSObject> dst = TestObject(); |
243 array->set(0, *src); | 245 array->set(0, *src); |
244 array->set(1, *dst); | 246 array->set(1, *dst); |
245 Object* result = t.Call(*array); | 247 Object* result = t.Call(*array); |
246 CHECK_EQ(*src, result); | 248 CHECK_EQ(*src, result); |
247 CHECK_EQ(*src, array->get(0)); | 249 CHECK_EQ(*src, array->get(0)); |
248 CHECK_EQ(*src, array->get(1)); | 250 CHECK_EQ(*src, array->get(1)); |
249 } | 251 } |
250 | 252 |
251 | 253 |
252 TEST(RunLoadStoreArrayBuffer) { | 254 TEST(RunLoadStoreArrayBuffer) { |
253 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 255 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
254 const int index = 12; | 256 const int index = 12; |
255 const int array_length = 2 * index; | 257 const int array_length = 2 * index; |
256 ElementAccess buffer_access = | 258 ElementAccess buffer_access = |
257 AccessBuilder::ForTypedArrayElement(kExternalInt8Array, true); | 259 AccessBuilder::ForTypedArrayElement(kExternalInt8Array, true); |
258 Node* backing_store = t.LoadField( | 260 Node* backing_store = t.LoadField( |
259 AccessBuilder::ForJSArrayBufferBackingStore(), t.Parameter(0)); | 261 AccessBuilder::ForJSArrayBufferBackingStore(), t.Parameter(0)); |
260 Node* load = | 262 Node* load = |
261 t.LoadElement(buffer_access, backing_store, t.Int32Constant(index)); | 263 t.LoadElement(buffer_access, backing_store, t.Int32Constant(index)); |
262 t.StoreElement(buffer_access, backing_store, t.Int32Constant(index + 1), | 264 t.StoreElement(buffer_access, backing_store, t.Int32Constant(index + 1), |
263 load); | 265 load); |
(...skipping 19 matching lines...) Expand all Loading... |
283 } | 285 } |
284 } | 286 } |
285 | 287 |
286 | 288 |
287 TEST(RunLoadFieldFromUntaggedBase) { | 289 TEST(RunLoadFieldFromUntaggedBase) { |
288 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)}; | 290 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)}; |
289 | 291 |
290 for (size_t i = 0; i < arraysize(smis); i++) { | 292 for (size_t i = 0; i < arraysize(smis); i++) { |
291 int offset = static_cast<int>(i * sizeof(Smi*)); | 293 int offset = static_cast<int>(i * sizeof(Smi*)); |
292 FieldAccess access = {kUntaggedBase, offset, Handle<Name>(), | 294 FieldAccess access = {kUntaggedBase, offset, Handle<Name>(), |
293 Type::Integral32(), kMachAnyTagged}; | 295 Type::Integral32(), MachineType::AnyTagged()}; |
294 | 296 |
295 SimplifiedLoweringTester<Object*> t; | 297 SimplifiedLoweringTester<Object*> t; |
296 Node* load = t.LoadField(access, t.PointerConstant(smis)); | 298 Node* load = t.LoadField(access, t.PointerConstant(smis)); |
297 t.Return(load); | 299 t.Return(load); |
298 t.LowerAllNodesAndLowerChanges(); | 300 t.LowerAllNodesAndLowerChanges(); |
299 | 301 |
300 for (int j = -5; j <= 5; j++) { | 302 for (int j = -5; j <= 5; j++) { |
301 Smi* expected = Smi::FromInt(j); | 303 Smi* expected = Smi::FromInt(j); |
302 smis[i] = expected; | 304 smis[i] = expected; |
303 CHECK_EQ(expected, t.Call()); | 305 CHECK_EQ(expected, t.Call()); |
304 } | 306 } |
305 } | 307 } |
306 } | 308 } |
307 | 309 |
308 | 310 |
309 TEST(RunStoreFieldToUntaggedBase) { | 311 TEST(RunStoreFieldToUntaggedBase) { |
310 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)}; | 312 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3)}; |
311 | 313 |
312 for (size_t i = 0; i < arraysize(smis); i++) { | 314 for (size_t i = 0; i < arraysize(smis); i++) { |
313 int offset = static_cast<int>(i * sizeof(Smi*)); | 315 int offset = static_cast<int>(i * sizeof(Smi*)); |
314 FieldAccess access = {kUntaggedBase, offset, Handle<Name>(), | 316 FieldAccess access = {kUntaggedBase, offset, Handle<Name>(), |
315 Type::Integral32(), kMachAnyTagged}; | 317 Type::Integral32(), MachineType::AnyTagged()}; |
316 | 318 |
317 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 319 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
318 Node* p0 = t.Parameter(0); | 320 Node* p0 = t.Parameter(0); |
319 t.StoreField(access, t.PointerConstant(smis), p0); | 321 t.StoreField(access, t.PointerConstant(smis), p0); |
320 t.Return(p0); | 322 t.Return(p0); |
321 t.LowerAllNodesAndLowerChanges(); | 323 t.LowerAllNodesAndLowerChanges(); |
322 | 324 |
323 for (int j = -5; j <= 5; j++) { | 325 for (int j = -5; j <= 5; j++) { |
324 Smi* expected = Smi::FromInt(j); | 326 Smi* expected = Smi::FromInt(j); |
325 smis[i] = Smi::FromInt(-100); | 327 smis[i] = Smi::FromInt(-100); |
326 CHECK_EQ(expected, t.Call(expected)); | 328 CHECK_EQ(expected, t.Call(expected)); |
327 CHECK_EQ(expected, smis[i]); | 329 CHECK_EQ(expected, smis[i]); |
328 } | 330 } |
329 } | 331 } |
330 } | 332 } |
331 | 333 |
332 | 334 |
333 TEST(RunLoadElementFromUntaggedBase) { | 335 TEST(RunLoadElementFromUntaggedBase) { |
334 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3), | 336 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3), |
335 Smi::FromInt(4), Smi::FromInt(5)}; | 337 Smi::FromInt(4), Smi::FromInt(5)}; |
336 | 338 |
337 for (size_t i = 0; i < arraysize(smis); i++) { // for header sizes | 339 for (size_t i = 0; i < arraysize(smis); i++) { // for header sizes |
338 for (size_t j = 0; (i + j) < arraysize(smis); j++) { // for element index | 340 for (size_t j = 0; (i + j) < arraysize(smis); j++) { // for element index |
339 int offset = static_cast<int>(i * sizeof(Smi*)); | 341 int offset = static_cast<int>(i * sizeof(Smi*)); |
340 ElementAccess access = {kUntaggedBase, offset, Type::Integral32(), | 342 ElementAccess access = {kUntaggedBase, offset, Type::Integral32(), |
341 kMachAnyTagged}; | 343 MachineType::AnyTagged()}; |
342 | 344 |
343 SimplifiedLoweringTester<Object*> t; | 345 SimplifiedLoweringTester<Object*> t; |
344 Node* load = t.LoadElement(access, t.PointerConstant(smis), | 346 Node* load = t.LoadElement(access, t.PointerConstant(smis), |
345 t.Int32Constant(static_cast<int>(j))); | 347 t.Int32Constant(static_cast<int>(j))); |
346 t.Return(load); | 348 t.Return(load); |
347 t.LowerAllNodesAndLowerChanges(); | 349 t.LowerAllNodesAndLowerChanges(); |
348 | 350 |
349 for (int k = -5; k <= 5; k++) { | 351 for (int k = -5; k <= 5; k++) { |
350 Smi* expected = Smi::FromInt(k); | 352 Smi* expected = Smi::FromInt(k); |
351 smis[i + j] = expected; | 353 smis[i + j] = expected; |
352 CHECK_EQ(expected, t.Call()); | 354 CHECK_EQ(expected, t.Call()); |
353 } | 355 } |
354 } | 356 } |
355 } | 357 } |
356 } | 358 } |
357 | 359 |
358 | 360 |
359 TEST(RunStoreElementFromUntaggedBase) { | 361 TEST(RunStoreElementFromUntaggedBase) { |
360 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3), | 362 Smi* smis[] = {Smi::FromInt(1), Smi::FromInt(2), Smi::FromInt(3), |
361 Smi::FromInt(4), Smi::FromInt(5)}; | 363 Smi::FromInt(4), Smi::FromInt(5)}; |
362 | 364 |
363 for (size_t i = 0; i < arraysize(smis); i++) { // for header sizes | 365 for (size_t i = 0; i < arraysize(smis); i++) { // for header sizes |
364 for (size_t j = 0; (i + j) < arraysize(smis); j++) { // for element index | 366 for (size_t j = 0; (i + j) < arraysize(smis); j++) { // for element index |
365 int offset = static_cast<int>(i * sizeof(Smi*)); | 367 int offset = static_cast<int>(i * sizeof(Smi*)); |
366 ElementAccess access = {kUntaggedBase, offset, Type::Integral32(), | 368 ElementAccess access = {kUntaggedBase, offset, Type::Integral32(), |
367 kMachAnyTagged}; | 369 MachineType::AnyTagged()}; |
368 | 370 |
369 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 371 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
370 Node* p0 = t.Parameter(0); | 372 Node* p0 = t.Parameter(0); |
371 t.StoreElement(access, t.PointerConstant(smis), | 373 t.StoreElement(access, t.PointerConstant(smis), |
372 t.Int32Constant(static_cast<int>(j)), p0); | 374 t.Int32Constant(static_cast<int>(j)), p0); |
373 t.Return(p0); | 375 t.Return(p0); |
374 t.LowerAllNodesAndLowerChanges(); | 376 t.LowerAllNodesAndLowerChanges(); |
375 | 377 |
376 for (int k = -5; k <= 5; k++) { | 378 for (int k = -5; k <= 5; k++) { |
377 Smi* expected = Smi::FromInt(k); | 379 Smi* expected = Smi::FromInt(k); |
378 smis[i + j] = Smi::FromInt(-100); | 380 smis[i + j] = Smi::FromInt(-100); |
379 CHECK_EQ(expected, t.Call(expected)); | 381 CHECK_EQ(expected, t.Call(expected)); |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 CHECK_EQ(a.GetElement(i), b.GetElement(i)); | 587 CHECK_EQ(a.GetElement(i), b.GetElement(i)); |
586 } | 588 } |
587 } | 589 } |
588 } | 590 } |
589 } | 591 } |
590 | 592 |
591 | 593 |
592 TEST(RunAccessTests_uint8) { | 594 TEST(RunAccessTests_uint8) { |
593 uint8_t data[] = {0x07, 0x16, 0x25, 0x34, 0x43, 0x99, | 595 uint8_t data[] = {0x07, 0x16, 0x25, 0x34, 0x43, 0x99, |
594 0xab, 0x78, 0x89, 0x19, 0x2b, 0x38}; | 596 0xab, 0x78, 0x89, 0x19, 0x2b, 0x38}; |
595 RunAccessTest<uint8_t>(kMachInt8, data, arraysize(data)); | 597 RunAccessTest<uint8_t>(MachineType::Int8(), data, arraysize(data)); |
596 } | 598 } |
597 | 599 |
598 | 600 |
599 TEST(RunAccessTests_uint16) { | 601 TEST(RunAccessTests_uint16) { |
600 uint16_t data[] = {0x071a, 0x162b, 0x253c, 0x344d, 0x435e, 0x7777}; | 602 uint16_t data[] = {0x071a, 0x162b, 0x253c, 0x344d, 0x435e, 0x7777}; |
601 RunAccessTest<uint16_t>(kMachInt16, data, arraysize(data)); | 603 RunAccessTest<uint16_t>(MachineType::Int16(), data, arraysize(data)); |
602 } | 604 } |
603 | 605 |
604 | 606 |
605 TEST(RunAccessTests_int32) { | 607 TEST(RunAccessTests_int32) { |
606 int32_t data[] = {-211, 211, 628347, 2000000000, -2000000000, -1, -100000034}; | 608 int32_t data[] = {-211, 211, 628347, 2000000000, -2000000000, -1, -100000034}; |
607 RunAccessTest<int32_t>(kMachInt32, data, arraysize(data)); | 609 RunAccessTest<int32_t>(MachineType::Int32(), data, arraysize(data)); |
608 } | 610 } |
609 | 611 |
610 | 612 |
611 #define V8_2PART_INT64(a, b) (((static_cast<int64_t>(a) << 32) + 0x##b##u)) | 613 #define V8_2PART_INT64(a, b) (((static_cast<int64_t>(a) << 32) + 0x##b##u)) |
612 | 614 |
613 | 615 |
614 TEST(RunAccessTests_int64) { | 616 TEST(RunAccessTests_int64) { |
615 if (kPointerSize != 8) return; | 617 if (kPointerSize != 8) return; |
616 int64_t data[] = {V8_2PART_INT64(0x10111213, 14151617), | 618 int64_t data[] = {V8_2PART_INT64(0x10111213, 14151617), |
617 V8_2PART_INT64(0x20212223, 24252627), | 619 V8_2PART_INT64(0x20212223, 24252627), |
618 V8_2PART_INT64(0x30313233, 34353637), | 620 V8_2PART_INT64(0x30313233, 34353637), |
619 V8_2PART_INT64(0xa0a1a2a3, a4a5a6a7), | 621 V8_2PART_INT64(0xa0a1a2a3, a4a5a6a7), |
620 V8_2PART_INT64(0xf0f1f2f3, f4f5f6f7)}; | 622 V8_2PART_INT64(0xf0f1f2f3, f4f5f6f7)}; |
621 RunAccessTest<int64_t>(kMachInt64, data, arraysize(data)); | 623 RunAccessTest<int64_t>(MachineType::Int64(), data, arraysize(data)); |
622 } | 624 } |
623 | 625 |
624 | 626 |
625 TEST(RunAccessTests_float64) { | 627 TEST(RunAccessTests_float64) { |
626 double data[] = {1.25, -1.25, 2.75, 11.0, 11100.8}; | 628 double data[] = {1.25, -1.25, 2.75, 11.0, 11100.8}; |
627 RunAccessTest<double>(kMachFloat64, data, arraysize(data)); | 629 RunAccessTest<double>(MachineType::Float64(), data, arraysize(data)); |
628 } | 630 } |
629 | 631 |
630 | 632 |
631 TEST(RunAccessTests_Smi) { | 633 TEST(RunAccessTests_Smi) { |
632 Smi* data[] = {Smi::FromInt(-1), Smi::FromInt(-9), | 634 Smi* data[] = {Smi::FromInt(-1), Smi::FromInt(-9), |
633 Smi::FromInt(0), Smi::FromInt(666), | 635 Smi::FromInt(0), Smi::FromInt(666), |
634 Smi::FromInt(77777), Smi::FromInt(Smi::kMaxValue)}; | 636 Smi::FromInt(77777), Smi::FromInt(Smi::kMaxValue)}; |
635 RunAccessTest<Smi*>(kMachAnyTagged, data, arraysize(data)); | 637 RunAccessTest<Smi*>(MachineType::AnyTagged(), data, arraysize(data)); |
636 } | 638 } |
637 | 639 |
638 | 640 |
639 TEST(RunAllocate) { | 641 TEST(RunAllocate) { |
640 PretenureFlag flag[] = {NOT_TENURED, TENURED}; | 642 PretenureFlag flag[] = {NOT_TENURED, TENURED}; |
641 | 643 |
642 for (size_t i = 0; i < arraysize(flag); i++) { | 644 for (size_t i = 0; i < arraysize(flag); i++) { |
643 SimplifiedLoweringTester<HeapObject*> t; | 645 SimplifiedLoweringTester<HeapObject*> t; |
644 FieldAccess access = AccessBuilder::ForMap(); | 646 FieldAccess access = AccessBuilder::ForMap(); |
645 Node* size = t.jsgraph.Constant(HeapNumber::kSize); | 647 Node* size = t.jsgraph.Constant(HeapNumber::kSize); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
734 // Inserts the node as the return value of the graph. | 736 // Inserts the node as the return value of the graph. |
735 Node* Return(Node* node) { | 737 Node* Return(Node* node) { |
736 ret->ReplaceInput(0, node); | 738 ret->ReplaceInput(0, node); |
737 return node; | 739 return node; |
738 } | 740 } |
739 | 741 |
740 // Inserts the node as the effect input to the return of the graph. | 742 // Inserts the node as the effect input to the return of the graph. |
741 void Effect(Node* node) { ret->ReplaceInput(1, node); } | 743 void Effect(Node* node) { ret->ReplaceInput(1, node); } |
742 | 744 |
743 Node* ExampleWithOutput(MachineType type) { | 745 Node* ExampleWithOutput(MachineType type) { |
744 // TODO(titzer): use parameters with guaranteed representations. | 746 if (type.semantic() == MachineSemantic::kInt32) { |
745 if (type & kTypeInt32) { | |
746 return graph()->NewNode(machine()->Int32Add(), jsgraph.Int32Constant(1), | 747 return graph()->NewNode(machine()->Int32Add(), jsgraph.Int32Constant(1), |
747 jsgraph.Int32Constant(1)); | 748 jsgraph.Int32Constant(1)); |
748 } else if (type & kTypeUint32) { | 749 } else if (type.semantic() == MachineSemantic::kUint32) { |
749 return graph()->NewNode(machine()->Word32Shr(), jsgraph.Int32Constant(1), | 750 return graph()->NewNode(machine()->Word32Shr(), jsgraph.Int32Constant(1), |
750 jsgraph.Int32Constant(1)); | 751 jsgraph.Int32Constant(1)); |
751 } else if (type & kRepFloat64) { | 752 } else if (type.representation() == MachineRepresentation::kFloat64) { |
752 return graph()->NewNode(machine()->Float64Add(), | 753 return graph()->NewNode(machine()->Float64Add(), |
753 jsgraph.Float64Constant(1), | 754 jsgraph.Float64Constant(1), |
754 jsgraph.Float64Constant(1)); | 755 jsgraph.Float64Constant(1)); |
755 } else if (type & kRepBit) { | 756 } else if (type.representation() == MachineRepresentation::kBit) { |
756 return graph()->NewNode(machine()->Word32Equal(), | 757 return graph()->NewNode(machine()->Word32Equal(), |
757 jsgraph.Int32Constant(1), | 758 jsgraph.Int32Constant(1), |
758 jsgraph.Int32Constant(1)); | 759 jsgraph.Int32Constant(1)); |
759 } else if (type & kRepWord64) { | 760 } else if (type.representation() == MachineRepresentation::kWord64) { |
760 return graph()->NewNode(machine()->Int64Add(), Int64Constant(1), | 761 return graph()->NewNode(machine()->Int64Add(), Int64Constant(1), |
761 Int64Constant(1)); | 762 Int64Constant(1)); |
762 } else { | 763 } else { |
763 CHECK(type & kRepTagged); | 764 CHECK(type.representation() == MachineRepresentation::kTagged); |
764 return p0; | 765 return p0; |
765 } | 766 } |
766 } | 767 } |
767 | 768 |
768 Node* Use(Node* node, MachineType type) { | 769 Node* Use(Node* node, MachineType type) { |
769 if (type & kTypeInt32) { | 770 if (type.semantic() == MachineSemantic::kInt32) { |
770 return graph()->NewNode(machine()->Int32LessThan(), node, | 771 return graph()->NewNode(machine()->Int32LessThan(), node, |
771 jsgraph.Int32Constant(1)); | 772 jsgraph.Int32Constant(1)); |
772 } else if (type & kTypeUint32) { | 773 } else if (type.semantic() == MachineSemantic::kUint32) { |
773 return graph()->NewNode(machine()->Uint32LessThan(), node, | 774 return graph()->NewNode(machine()->Uint32LessThan(), node, |
774 jsgraph.Int32Constant(1)); | 775 jsgraph.Int32Constant(1)); |
775 } else if (type & kRepFloat64) { | 776 } else if (type.representation() == MachineRepresentation::kFloat64) { |
776 return graph()->NewNode(machine()->Float64Add(), node, | 777 return graph()->NewNode(machine()->Float64Add(), node, |
777 jsgraph.Float64Constant(1)); | 778 jsgraph.Float64Constant(1)); |
778 } else if (type & kRepWord64) { | 779 } else if (type.representation() == MachineRepresentation::kWord64) { |
779 return graph()->NewNode(machine()->Int64LessThan(), node, | 780 return graph()->NewNode(machine()->Int64LessThan(), node, |
780 Int64Constant(1)); | 781 Int64Constant(1)); |
781 } else if (type & kRepWord32) { | 782 } else if (type.representation() == MachineRepresentation::kWord32) { |
782 return graph()->NewNode(machine()->Word32Equal(), node, | 783 return graph()->NewNode(machine()->Word32Equal(), node, |
783 jsgraph.Int32Constant(1)); | 784 jsgraph.Int32Constant(1)); |
784 } else { | 785 } else { |
785 return graph()->NewNode(simplified()->ReferenceEqual(Type::Any()), node, | 786 return graph()->NewNode(simplified()->ReferenceEqual(Type::Any()), node, |
786 jsgraph.TrueConstant()); | 787 jsgraph.TrueConstant()); |
787 } | 788 } |
788 } | 789 } |
789 | 790 |
790 Node* Branch(Node* cond) { | 791 Node* Branch(Node* cond) { |
791 Node* br = graph()->NewNode(common()->Branch(), cond, start); | 792 Node* br = graph()->NewNode(common()->Branch(), cond, start); |
(...skipping 11 matching lines...) Expand all Loading... |
803 SimplifiedOperatorBuilder* simplified() { return &main_simplified_; } | 804 SimplifiedOperatorBuilder* simplified() { return &main_simplified_; } |
804 MachineOperatorBuilder* machine() { return &main_machine_; } | 805 MachineOperatorBuilder* machine() { return &main_machine_; } |
805 CommonOperatorBuilder* common() { return &main_common_; } | 806 CommonOperatorBuilder* common() { return &main_common_; } |
806 Graph* graph() { return main_graph_; } | 807 Graph* graph() { return main_graph_; } |
807 }; | 808 }; |
808 | 809 |
809 | 810 |
810 TEST(LowerBooleanNot_bit_bit) { | 811 TEST(LowerBooleanNot_bit_bit) { |
811 // BooleanNot(x: kRepBit) used as kRepBit | 812 // BooleanNot(x: kRepBit) used as kRepBit |
812 TestingGraph t(Type::Boolean()); | 813 TestingGraph t(Type::Boolean()); |
813 Node* b = t.ExampleWithOutput(kRepBit); | 814 Node* b = t.ExampleWithOutput(MachineType::Bool()); |
814 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b); | 815 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b); |
815 Node* use = t.Branch(inv); | 816 Node* use = t.Branch(inv); |
816 t.Lower(); | 817 t.Lower(); |
817 Node* cmp = use->InputAt(0); | 818 Node* cmp = use->InputAt(0); |
818 CHECK_EQ(t.machine()->Word32Equal()->opcode(), cmp->opcode()); | 819 CHECK_EQ(t.machine()->Word32Equal()->opcode(), cmp->opcode()); |
819 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1)); | 820 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1)); |
820 Node* f = t.jsgraph.Int32Constant(0); | 821 Node* f = t.jsgraph.Int32Constant(0); |
821 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); | 822 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); |
822 } | 823 } |
823 | 824 |
824 | 825 |
825 TEST(LowerBooleanNot_bit_tagged) { | 826 TEST(LowerBooleanNot_bit_tagged) { |
826 // BooleanNot(x: kRepBit) used as kRepTagged | 827 // BooleanNot(x: kRepBit) used as kRepTagged |
827 TestingGraph t(Type::Boolean()); | 828 TestingGraph t(Type::Boolean()); |
828 Node* b = t.ExampleWithOutput(kRepBit); | 829 Node* b = t.ExampleWithOutput(MachineType::Bool()); |
829 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b); | 830 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b); |
830 Node* use = t.Use(inv, kRepTagged); | 831 Node* use = t.Use(inv, MachineType::AnyTagged()); |
831 t.Return(use); | 832 t.Return(use); |
832 t.Lower(); | 833 t.Lower(); |
833 CHECK_EQ(IrOpcode::kChangeBitToBool, use->InputAt(0)->opcode()); | 834 CHECK_EQ(IrOpcode::kChangeBitToBool, use->InputAt(0)->opcode()); |
834 Node* cmp = use->InputAt(0)->InputAt(0); | 835 Node* cmp = use->InputAt(0)->InputAt(0); |
835 CHECK_EQ(t.machine()->Word32Equal()->opcode(), cmp->opcode()); | 836 CHECK_EQ(t.machine()->Word32Equal()->opcode(), cmp->opcode()); |
836 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1)); | 837 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1)); |
837 Node* f = t.jsgraph.Int32Constant(0); | 838 Node* f = t.jsgraph.Int32Constant(0); |
838 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); | 839 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); |
839 } | 840 } |
840 | 841 |
(...skipping 11 matching lines...) Expand all Loading... |
852 Node* f = t.jsgraph.FalseConstant(); | 853 Node* f = t.jsgraph.FalseConstant(); |
853 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); | 854 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); |
854 } | 855 } |
855 | 856 |
856 | 857 |
857 TEST(LowerBooleanNot_tagged_tagged) { | 858 TEST(LowerBooleanNot_tagged_tagged) { |
858 // BooleanNot(x: kRepTagged) used as kRepTagged | 859 // BooleanNot(x: kRepTagged) used as kRepTagged |
859 TestingGraph t(Type::Boolean()); | 860 TestingGraph t(Type::Boolean()); |
860 Node* b = t.p0; | 861 Node* b = t.p0; |
861 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b); | 862 Node* inv = t.graph()->NewNode(t.simplified()->BooleanNot(), b); |
862 Node* use = t.Use(inv, kRepTagged); | 863 Node* use = t.Use(inv, MachineType::AnyTagged()); |
863 t.Return(use); | 864 t.Return(use); |
864 t.Lower(); | 865 t.Lower(); |
865 CHECK_EQ(IrOpcode::kChangeBitToBool, use->InputAt(0)->opcode()); | 866 CHECK_EQ(IrOpcode::kChangeBitToBool, use->InputAt(0)->opcode()); |
866 Node* cmp = use->InputAt(0)->InputAt(0); | 867 Node* cmp = use->InputAt(0)->InputAt(0); |
867 CHECK_EQ(t.machine()->WordEqual()->opcode(), cmp->opcode()); | 868 CHECK_EQ(t.machine()->WordEqual()->opcode(), cmp->opcode()); |
868 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1)); | 869 CHECK(b == cmp->InputAt(0) || b == cmp->InputAt(1)); |
869 Node* f = t.jsgraph.FalseConstant(); | 870 Node* f = t.jsgraph.FalseConstant(); |
870 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); | 871 CHECK(f == cmp->InputAt(0) || f == cmp->InputAt(1)); |
871 } | 872 } |
872 | 873 |
873 | 874 |
874 TEST(LowerBooleanToNumber_bit_int32) { | 875 TEST(LowerBooleanToNumber_bit_int32) { |
875 // BooleanToNumber(x: kRepBit) used as kMachInt32 | 876 // BooleanToNumber(x: kRepBit) used as MachineType::Int32() |
876 TestingGraph t(Type::Boolean()); | 877 TestingGraph t(Type::Boolean()); |
877 Node* b = t.ExampleWithOutput(kRepBit); | 878 Node* b = t.ExampleWithOutput(MachineType::Bool()); |
878 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); | 879 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); |
879 Node* use = t.Use(cnv, kMachInt32); | 880 Node* use = t.Use(cnv, MachineType::Int32()); |
880 t.Return(use); | 881 t.Return(use); |
881 t.Lower(); | 882 t.Lower(); |
882 CHECK_EQ(b, use->InputAt(0)); | 883 CHECK_EQ(b, use->InputAt(0)); |
883 } | 884 } |
884 | 885 |
885 | 886 |
886 TEST(LowerBooleanToNumber_tagged_int32) { | 887 TEST(LowerBooleanToNumber_tagged_int32) { |
887 // BooleanToNumber(x: kRepTagged) used as kMachInt32 | 888 // BooleanToNumber(x: kRepTagged) used as MachineType::Int32() |
888 TestingGraph t(Type::Boolean()); | 889 TestingGraph t(Type::Boolean()); |
889 Node* b = t.p0; | 890 Node* b = t.p0; |
890 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); | 891 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); |
891 Node* use = t.Use(cnv, kMachInt32); | 892 Node* use = t.Use(cnv, MachineType::Int32()); |
892 t.Return(use); | 893 t.Return(use); |
893 t.Lower(); | 894 t.Lower(); |
894 CHECK_EQ(t.machine()->WordEqual()->opcode(), cnv->opcode()); | 895 CHECK_EQ(t.machine()->WordEqual()->opcode(), cnv->opcode()); |
895 CHECK(b == cnv->InputAt(0) || b == cnv->InputAt(1)); | 896 CHECK(b == cnv->InputAt(0) || b == cnv->InputAt(1)); |
896 Node* c = t.jsgraph.TrueConstant(); | 897 Node* c = t.jsgraph.TrueConstant(); |
897 CHECK(c == cnv->InputAt(0) || c == cnv->InputAt(1)); | 898 CHECK(c == cnv->InputAt(0) || c == cnv->InputAt(1)); |
898 } | 899 } |
899 | 900 |
900 | 901 |
901 TEST(LowerBooleanToNumber_bit_tagged) { | 902 TEST(LowerBooleanToNumber_bit_tagged) { |
902 // BooleanToNumber(x: kRepBit) used as kMachAnyTagged | 903 // BooleanToNumber(x: kRepBit) used as MachineType::AnyTagged() |
903 TestingGraph t(Type::Boolean()); | 904 TestingGraph t(Type::Boolean()); |
904 Node* b = t.ExampleWithOutput(kRepBit); | 905 Node* b = t.ExampleWithOutput(MachineType::Bool()); |
905 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); | 906 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); |
906 Node* use = t.Use(cnv, kMachAnyTagged); | 907 Node* use = t.Use(cnv, MachineType::AnyTagged()); |
907 t.Return(use); | 908 t.Return(use); |
908 t.Lower(); | 909 t.Lower(); |
909 CHECK_EQ(b, use->InputAt(0)->InputAt(0)); | 910 CHECK_EQ(b, use->InputAt(0)->InputAt(0)); |
910 CHECK_EQ(IrOpcode::kChangeInt32ToTagged, use->InputAt(0)->opcode()); | 911 CHECK_EQ(IrOpcode::kChangeInt32ToTagged, use->InputAt(0)->opcode()); |
911 } | 912 } |
912 | 913 |
913 | 914 |
914 TEST(LowerBooleanToNumber_tagged_tagged) { | 915 TEST(LowerBooleanToNumber_tagged_tagged) { |
915 // BooleanToNumber(x: kRepTagged) used as kMachAnyTagged | 916 // BooleanToNumber(x: kRepTagged) used as MachineType::AnyTagged() |
916 TestingGraph t(Type::Boolean()); | 917 TestingGraph t(Type::Boolean()); |
917 Node* b = t.p0; | 918 Node* b = t.p0; |
918 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); | 919 Node* cnv = t.graph()->NewNode(t.simplified()->BooleanToNumber(), b); |
919 Node* use = t.Use(cnv, kMachAnyTagged); | 920 Node* use = t.Use(cnv, MachineType::AnyTagged()); |
920 t.Return(use); | 921 t.Return(use); |
921 t.Lower(); | 922 t.Lower(); |
922 CHECK_EQ(cnv, use->InputAt(0)->InputAt(0)); | 923 CHECK_EQ(cnv, use->InputAt(0)->InputAt(0)); |
923 CHECK_EQ(IrOpcode::kChangeInt32ToTagged, use->InputAt(0)->opcode()); | 924 CHECK_EQ(IrOpcode::kChangeInt32ToTagged, use->InputAt(0)->opcode()); |
924 CHECK_EQ(t.machine()->WordEqual()->opcode(), cnv->opcode()); | 925 CHECK_EQ(t.machine()->WordEqual()->opcode(), cnv->opcode()); |
925 CHECK(b == cnv->InputAt(0) || b == cnv->InputAt(1)); | 926 CHECK(b == cnv->InputAt(0) || b == cnv->InputAt(1)); |
926 Node* c = t.jsgraph.TrueConstant(); | 927 Node* c = t.jsgraph.TrueConstant(); |
927 CHECK(c == cnv->InputAt(0) || c == cnv->InputAt(1)); | 928 CHECK(c == cnv->InputAt(0) || c == cnv->InputAt(1)); |
928 } | 929 } |
929 | 930 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1039 static void CheckChangeOf(IrOpcode::Value change, Node* of, Node* node) { | 1040 static void CheckChangeOf(IrOpcode::Value change, Node* of, Node* node) { |
1040 CHECK_EQ(change, node->opcode()); | 1041 CHECK_EQ(change, node->opcode()); |
1041 CHECK_EQ(of, node->InputAt(0)); | 1042 CHECK_EQ(of, node->InputAt(0)); |
1042 } | 1043 } |
1043 | 1044 |
1044 | 1045 |
1045 TEST(LowerNumberToInt32_to_ChangeTaggedToInt32) { | 1046 TEST(LowerNumberToInt32_to_ChangeTaggedToInt32) { |
1046 // NumberToInt32(x: kRepTagged | kTypeInt32) used as kRepWord32 | 1047 // NumberToInt32(x: kRepTagged | kTypeInt32) used as kRepWord32 |
1047 TestingGraph t(Type::Signed32()); | 1048 TestingGraph t(Type::Signed32()); |
1048 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), t.p0); | 1049 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), t.p0); |
1049 Node* use = t.Use(trunc, kTypeInt32); | 1050 Node* use = t.Use(trunc, MachineType::Int32()); |
1050 t.Return(use); | 1051 t.Return(use); |
1051 t.Lower(); | 1052 t.Lower(); |
1052 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p0, use->InputAt(0)); | 1053 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p0, use->InputAt(0)); |
1053 } | 1054 } |
1054 | 1055 |
1055 | 1056 |
1056 TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32) { | 1057 TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32) { |
1057 // NumberToInt32(x: kRepFloat64) used as kMachInt32 | 1058 // NumberToInt32(x: kRepFloat64) used as MachineType::Int32() |
1058 TestingGraph t(Type::Number()); | 1059 TestingGraph t(Type::Number()); |
1059 Node* p0 = t.ExampleWithOutput(kMachFloat64); | 1060 Node* p0 = t.ExampleWithOutput(MachineType::Float64()); |
1060 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), p0); | 1061 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), p0); |
1061 Node* use = t.Use(trunc, kMachInt32); | 1062 Node* use = t.Use(trunc, MachineType::Int32()); |
1062 t.Return(use); | 1063 t.Return(use); |
1063 t.Lower(); | 1064 t.Lower(); |
1064 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0)); | 1065 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0)); |
1065 } | 1066 } |
1066 | 1067 |
1067 | 1068 |
1068 TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32_with_change) { | 1069 TEST(LowerNumberToInt32_to_TruncateFloat64ToInt32_with_change) { |
1069 // NumberToInt32(x: kTypeNumber | kRepTagged) used as kMachInt32 | 1070 // NumberToInt32(x: kTypeNumber | kRepTagged) used as MachineType::Int32() |
1070 TestingGraph t(Type::Number()); | 1071 TestingGraph t(Type::Number()); |
1071 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), t.p0); | 1072 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToInt32(), t.p0); |
1072 Node* use = t.Use(trunc, kMachInt32); | 1073 Node* use = t.Use(trunc, MachineType::Int32()); |
1073 t.Return(use); | 1074 t.Return(use); |
1074 t.Lower(); | 1075 t.Lower(); |
1075 Node* node = use->InputAt(0); | 1076 Node* node = use->InputAt(0); |
1076 CHECK_EQ(IrOpcode::kTruncateFloat64ToInt32, node->opcode()); | 1077 CHECK_EQ(IrOpcode::kTruncateFloat64ToInt32, node->opcode()); |
1077 Node* of = node->InputAt(0); | 1078 Node* of = node->InputAt(0); |
1078 CHECK_EQ(IrOpcode::kChangeTaggedToFloat64, of->opcode()); | 1079 CHECK_EQ(IrOpcode::kChangeTaggedToFloat64, of->opcode()); |
1079 CHECK_EQ(t.p0, of->InputAt(0)); | 1080 CHECK_EQ(t.p0, of->InputAt(0)); |
1080 } | 1081 } |
1081 | 1082 |
1082 | 1083 |
1083 TEST(LowerNumberToUint32_to_ChangeTaggedToUint32) { | 1084 TEST(LowerNumberToUint32_to_ChangeTaggedToUint32) { |
1084 // NumberToUint32(x: kRepTagged | kTypeUint32) used as kRepWord32 | 1085 // NumberToUint32(x: kRepTagged | kTypeUint32) used as kRepWord32 |
1085 TestingGraph t(Type::Unsigned32()); | 1086 TestingGraph t(Type::Unsigned32()); |
1086 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), t.p0); | 1087 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), t.p0); |
1087 Node* use = t.Use(trunc, kTypeUint32); | 1088 Node* use = t.Use(trunc, MachineType::Uint32()); |
1088 t.Return(use); | 1089 t.Return(use); |
1089 t.Lower(); | 1090 t.Lower(); |
1090 CheckChangeOf(IrOpcode::kChangeTaggedToUint32, t.p0, use->InputAt(0)); | 1091 CheckChangeOf(IrOpcode::kChangeTaggedToUint32, t.p0, use->InputAt(0)); |
1091 } | 1092 } |
1092 | 1093 |
1093 | 1094 |
1094 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32) { | 1095 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32) { |
1095 // NumberToUint32(x: kRepFloat64) used as kMachUint32 | 1096 // NumberToUint32(x: kRepFloat64) used as MachineType::Uint32() |
1096 TestingGraph t(Type::Number()); | 1097 TestingGraph t(Type::Number()); |
1097 Node* p0 = t.ExampleWithOutput(kMachFloat64); | 1098 Node* p0 = t.ExampleWithOutput(MachineType::Float64()); |
1098 // TODO(titzer): run the typer here, or attach machine type to param. | 1099 // TODO(titzer): run the typer here, or attach machine type to param. |
1099 NodeProperties::SetType(p0, Type::Number()); | 1100 NodeProperties::SetType(p0, Type::Number()); |
1100 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), p0); | 1101 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), p0); |
1101 Node* use = t.Use(trunc, kMachUint32); | 1102 Node* use = t.Use(trunc, MachineType::Uint32()); |
1102 t.Return(use); | 1103 t.Return(use); |
1103 t.Lower(); | 1104 t.Lower(); |
1104 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0)); | 1105 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, p0, use->InputAt(0)); |
1105 } | 1106 } |
1106 | 1107 |
1107 | 1108 |
1108 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_with_change) { | 1109 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_with_change) { |
1109 // NumberToInt32(x: kTypeNumber | kRepTagged) used as kMachUint32 | 1110 // NumberToInt32(x: kTypeNumber | kRepTagged) used as MachineType::Uint32() |
1110 TestingGraph t(Type::Number()); | 1111 TestingGraph t(Type::Number()); |
1111 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), t.p0); | 1112 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), t.p0); |
1112 Node* use = t.Use(trunc, kMachUint32); | 1113 Node* use = t.Use(trunc, MachineType::Uint32()); |
1113 t.Return(use); | 1114 t.Return(use); |
1114 t.Lower(); | 1115 t.Lower(); |
1115 Node* node = use->InputAt(0); | 1116 Node* node = use->InputAt(0); |
1116 CHECK_EQ(IrOpcode::kTruncateFloat64ToInt32, node->opcode()); | 1117 CHECK_EQ(IrOpcode::kTruncateFloat64ToInt32, node->opcode()); |
1117 Node* of = node->InputAt(0); | 1118 Node* of = node->InputAt(0); |
1118 CHECK_EQ(IrOpcode::kChangeTaggedToFloat64, of->opcode()); | 1119 CHECK_EQ(IrOpcode::kChangeTaggedToFloat64, of->opcode()); |
1119 CHECK_EQ(t.p0, of->InputAt(0)); | 1120 CHECK_EQ(t.p0, of->InputAt(0)); |
1120 } | 1121 } |
1121 | 1122 |
1122 | 1123 |
1123 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_uint32) { | 1124 TEST(LowerNumberToUint32_to_TruncateFloat64ToInt32_uint32) { |
1124 // NumberToUint32(x: kRepFloat64) used as kRepWord32 | 1125 // NumberToUint32(x: kRepFloat64) used as kRepWord32 |
1125 TestingGraph t(Type::Unsigned32()); | 1126 TestingGraph t(Type::Unsigned32()); |
1126 Node* input = t.ExampleWithOutput(kMachFloat64); | 1127 Node* input = t.ExampleWithOutput(MachineType::Float64()); |
1127 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), input); | 1128 Node* trunc = t.graph()->NewNode(t.simplified()->NumberToUint32(), input); |
1128 Node* use = t.Use(trunc, kRepWord32); | 1129 Node* use = t.Use(trunc, MachineType::RepWord32()); |
1129 t.Return(use); | 1130 t.Return(use); |
1130 t.Lower(); | 1131 t.Lower(); |
1131 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, input, use->InputAt(0)); | 1132 CheckChangeOf(IrOpcode::kTruncateFloat64ToInt32, input, use->InputAt(0)); |
1132 } | 1133 } |
1133 | 1134 |
1134 | 1135 |
1135 TEST(LowerReferenceEqual_to_wordeq) { | 1136 TEST(LowerReferenceEqual_to_wordeq) { |
1136 TestingGraph t(Type::Any(), Type::Any()); | 1137 TestingGraph t(Type::Any(), Type::Any()); |
1137 IrOpcode::Value opcode = | 1138 IrOpcode::Value opcode = |
1138 static_cast<IrOpcode::Value>(t.machine()->WordEqual()->opcode()); | 1139 static_cast<IrOpcode::Value>(t.machine()->WordEqual()->opcode()); |
(...skipping 24 matching lines...) Expand all Loading... |
1163 NodeProperties::SetType(in, type); | 1164 NodeProperties::SetType(in, type); |
1164 Node* use = t.Use(in, to); | 1165 Node* use = t.Use(in, to); |
1165 t.Return(use); | 1166 t.Return(use); |
1166 t.Lower(); | 1167 t.Lower(); |
1167 CHECK_EQ(expected, use->InputAt(0)->opcode()); | 1168 CHECK_EQ(expected, use->InputAt(0)->opcode()); |
1168 CHECK_EQ(in, use->InputAt(0)->InputAt(0)); | 1169 CHECK_EQ(in, use->InputAt(0)->InputAt(0)); |
1169 } | 1170 } |
1170 | 1171 |
1171 | 1172 |
1172 TEST(InsertBasicChanges) { | 1173 TEST(InsertBasicChanges) { |
1173 CheckChangeInsertion(IrOpcode::kChangeFloat64ToInt32, kRepFloat64, kTypeInt32, | 1174 CheckChangeInsertion(IrOpcode::kChangeFloat64ToInt32, MachineType::Float64(), |
1174 Type::Signed32()); | 1175 MachineType::Int32(), Type::Signed32()); |
1175 CheckChangeInsertion(IrOpcode::kChangeFloat64ToUint32, kRepFloat64, | 1176 CheckChangeInsertion(IrOpcode::kChangeFloat64ToUint32, MachineType::Float64(), |
1176 kTypeUint32, Type::Unsigned32()); | 1177 MachineType::Uint32(), Type::Unsigned32()); |
1177 CheckChangeInsertion(IrOpcode::kTruncateFloat64ToInt32, kRepFloat64, | 1178 CheckChangeInsertion(IrOpcode::kTruncateFloat64ToInt32, |
1178 kTypeUint32, Type::Integral32()); | 1179 MachineType::Float64(), MachineType::Uint32(), |
1179 CheckChangeInsertion(IrOpcode::kChangeTaggedToInt32, kRepTagged, kTypeInt32, | 1180 Type::Integral32()); |
1180 Type::Signed32()); | 1181 CheckChangeInsertion(IrOpcode::kChangeTaggedToInt32, MachineType::AnyTagged(), |
1181 CheckChangeInsertion(IrOpcode::kChangeTaggedToUint32, kRepTagged, kTypeUint32, | 1182 MachineType::Int32(), Type::Signed32()); |
| 1183 CheckChangeInsertion(IrOpcode::kChangeTaggedToUint32, |
| 1184 MachineType::AnyTagged(), MachineType::Uint32(), |
1182 Type::Unsigned32()); | 1185 Type::Unsigned32()); |
1183 | 1186 |
1184 CheckChangeInsertion(IrOpcode::kChangeFloat64ToTagged, kRepFloat64, | 1187 CheckChangeInsertion(IrOpcode::kChangeFloat64ToTagged, MachineType::Float64(), |
1185 kRepTagged); | 1188 MachineType::AnyTagged()); |
1186 CheckChangeInsertion(IrOpcode::kChangeTaggedToFloat64, kRepTagged, | 1189 CheckChangeInsertion(IrOpcode::kChangeTaggedToFloat64, |
1187 kRepFloat64); | 1190 MachineType::AnyTagged(), MachineType::Float64()); |
1188 | 1191 |
1189 CheckChangeInsertion(IrOpcode::kChangeInt32ToFloat64, kTypeInt32, | 1192 CheckChangeInsertion(IrOpcode::kChangeInt32ToFloat64, MachineType::Int32(), |
1190 kRepFloat64); | 1193 MachineType::Float64()); |
1191 CheckChangeInsertion(IrOpcode::kChangeInt32ToTagged, kTypeInt32, kRepTagged); | 1194 CheckChangeInsertion(IrOpcode::kChangeInt32ToTagged, MachineType::Int32(), |
| 1195 MachineType::AnyTagged()); |
1192 | 1196 |
1193 CheckChangeInsertion(IrOpcode::kChangeUint32ToFloat64, kTypeUint32, | 1197 CheckChangeInsertion(IrOpcode::kChangeUint32ToFloat64, MachineType::Uint32(), |
1194 kRepFloat64); | 1198 MachineType::Float64()); |
1195 CheckChangeInsertion(IrOpcode::kChangeUint32ToTagged, kTypeUint32, | 1199 CheckChangeInsertion(IrOpcode::kChangeUint32ToTagged, MachineType::Uint32(), |
1196 kRepTagged); | 1200 MachineType::AnyTagged()); |
1197 } | 1201 } |
1198 | 1202 |
1199 | 1203 |
1200 static void CheckChangesAroundBinop(TestingGraph* t, const Operator* op, | 1204 static void CheckChangesAroundBinop(TestingGraph* t, const Operator* op, |
1201 IrOpcode::Value input_change, | 1205 IrOpcode::Value input_change, |
1202 IrOpcode::Value output_change) { | 1206 IrOpcode::Value output_change) { |
1203 Node* binop = | 1207 Node* binop = |
1204 op->ControlInputCount() == 0 | 1208 op->ControlInputCount() == 0 |
1205 ? t->graph()->NewNode(op, t->p0, t->p1) | 1209 ? t->graph()->NewNode(op, t->p0, t->p1) |
1206 : t->graph()->NewNode(op, t->p0, t->p1, t->graph()->start()); | 1210 : t->graph()->NewNode(op, t->p0, t->p1, t->graph()->start()); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1299 Node* index = load_or_store->InputAt(1); | 1303 Node* index = load_or_store->InputAt(1); |
1300 if (kPointerSize == 8) { | 1304 if (kPointerSize == 8) { |
1301 CHECK_EQ(IrOpcode::kChangeUint32ToUint64, index->opcode()); | 1305 CHECK_EQ(IrOpcode::kChangeUint32ToUint64, index->opcode()); |
1302 index = index->InputAt(0); | 1306 index = index->InputAt(0); |
1303 } | 1307 } |
1304 | 1308 |
1305 Int32BinopMatcher mindex(index); | 1309 Int32BinopMatcher mindex(index); |
1306 CHECK_EQ(IrOpcode::kInt32Add, mindex.node()->opcode()); | 1310 CHECK_EQ(IrOpcode::kInt32Add, mindex.node()->opcode()); |
1307 CHECK(mindex.right().Is(access.header_size - access.tag())); | 1311 CHECK(mindex.right().Is(access.header_size - access.tag())); |
1308 | 1312 |
1309 const int element_size_shift = ElementSizeLog2Of(access.machine_type); | 1313 const int element_size_shift = |
| 1314 ElementSizeLog2Of(access.machine_type.representation()); |
1310 if (element_size_shift) { | 1315 if (element_size_shift) { |
1311 Int32BinopMatcher shl(mindex.left().node()); | 1316 Int32BinopMatcher shl(mindex.left().node()); |
1312 CHECK_EQ(IrOpcode::kWord32Shl, shl.node()->opcode()); | 1317 CHECK_EQ(IrOpcode::kWord32Shl, shl.node()->opcode()); |
1313 CHECK(shl.right().Is(element_size_shift)); | 1318 CHECK(shl.right().Is(element_size_shift)); |
1314 return shl.left().node(); | 1319 return shl.left().node(); |
1315 } else { | 1320 } else { |
1316 return mindex.left().node(); | 1321 return mindex.left().node(); |
1317 } | 1322 } |
1318 } | 1323 } |
1319 | 1324 |
1320 | 1325 |
1321 const MachineType kMachineReps[] = {kMachInt8, kMachInt16, kMachInt32, | 1326 const MachineType kMachineReps[] = { |
1322 kMachUint32, kMachInt64, kMachFloat64, | 1327 MachineType::Int8(), MachineType::Int16(), MachineType::Int32(), |
1323 kMachAnyTagged}; | 1328 MachineType::Uint32(), MachineType::Int64(), MachineType::Float64(), |
| 1329 MachineType::AnyTagged()}; |
1324 | 1330 |
1325 } // namespace | 1331 } // namespace |
1326 | 1332 |
1327 | 1333 |
1328 TEST(LowerLoadField_to_load) { | 1334 TEST(LowerLoadField_to_load) { |
1329 TestingGraph t(Type::Any(), Type::Signed32()); | 1335 TestingGraph t(Type::Any(), Type::Signed32()); |
1330 | 1336 |
1331 for (size_t i = 0; i < arraysize(kMachineReps); i++) { | 1337 for (size_t i = 0; i < arraysize(kMachineReps); i++) { |
1332 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1338 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
1333 Handle<Name>::null(), Type::Any(), kMachineReps[i]}; | 1339 Handle<Name>::null(), Type::Any(), kMachineReps[i]}; |
1334 | 1340 |
1335 Node* load = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, | 1341 Node* load = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, |
1336 t.start, t.start); | 1342 t.start, t.start); |
1337 Node* use = t.Use(load, kMachineReps[i]); | 1343 Node* use = t.Use(load, kMachineReps[i]); |
1338 t.Return(use); | 1344 t.Return(use); |
1339 t.LowerAllNodesAndLowerChanges(); | 1345 t.LowerAllNodesAndLowerChanges(); |
1340 CHECK_EQ(IrOpcode::kLoad, load->opcode()); | 1346 CHECK_EQ(IrOpcode::kLoad, load->opcode()); |
1341 CHECK_EQ(t.p0, load->InputAt(0)); | 1347 CHECK_EQ(t.p0, load->InputAt(0)); |
1342 CheckFieldAccessArithmetic(access, load); | 1348 CheckFieldAccessArithmetic(access, load); |
1343 | 1349 |
1344 MachineType rep = OpParameter<MachineType>(load); | 1350 MachineType rep = LoadRepresentationOf(load->op()); |
1345 CHECK_EQ(kMachineReps[i], rep); | 1351 CHECK_EQ(kMachineReps[i], rep); |
1346 } | 1352 } |
1347 } | 1353 } |
1348 | 1354 |
1349 | 1355 |
1350 TEST(LowerStoreField_to_store) { | 1356 TEST(LowerStoreField_to_store) { |
1351 { | 1357 { |
1352 TestingGraph t(Type::Any(), Type::Signed32()); | 1358 TestingGraph t(Type::Any(), Type::Signed32()); |
1353 | 1359 |
1354 for (size_t i = 0; i < arraysize(kMachineReps); i++) { | 1360 for (size_t i = 0; i < arraysize(kMachineReps); i++) { |
1355 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1361 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
1356 Handle<Name>::null(), Type::Any(), kMachineReps[i]}; | 1362 Handle<Name>::null(), Type::Any(), kMachineReps[i]}; |
1357 | 1363 |
1358 | 1364 |
1359 Node* val = t.ExampleWithOutput(kMachineReps[i]); | 1365 Node* val = t.ExampleWithOutput(kMachineReps[i]); |
1360 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, | 1366 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, |
1361 val, t.start, t.start); | 1367 val, t.start, t.start); |
1362 t.Effect(store); | 1368 t.Effect(store); |
1363 t.LowerAllNodesAndLowerChanges(); | 1369 t.LowerAllNodesAndLowerChanges(); |
1364 CHECK_EQ(IrOpcode::kStore, store->opcode()); | 1370 CHECK_EQ(IrOpcode::kStore, store->opcode()); |
1365 CHECK_EQ(val, store->InputAt(2)); | 1371 CHECK_EQ(val, store->InputAt(2)); |
1366 CheckFieldAccessArithmetic(access, store); | 1372 CheckFieldAccessArithmetic(access, store); |
1367 | 1373 |
1368 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); | 1374 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); |
1369 if (kMachineReps[i] & kRepTagged) { | 1375 if (kMachineReps[i].representation() == MachineRepresentation::kTagged) { |
1370 CHECK_EQ(kFullWriteBarrier, rep.write_barrier_kind()); | 1376 CHECK_EQ(kFullWriteBarrier, rep.write_barrier_kind()); |
1371 } | 1377 } |
1372 CHECK_EQ(kMachineReps[i], rep.machine_type()); | 1378 CHECK_EQ(kMachineReps[i], rep.machine_type()); |
1373 } | 1379 } |
1374 } | 1380 } |
1375 { | 1381 { |
1376 HandleAndZoneScope scope; | 1382 HandleAndZoneScope scope; |
1377 Zone* z = scope.main_zone(); | 1383 Zone* z = scope.main_zone(); |
1378 TestingGraph t(Type::Any(), Type::Intersect(Type::SignedSmall(), | 1384 TestingGraph t(Type::Any(), Type::Intersect(Type::SignedSmall(), |
1379 Type::TaggedSigned(), z)); | 1385 Type::TaggedSigned(), z)); |
1380 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1386 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
1381 Handle<Name>::null(), Type::Any(), kMachAnyTagged}; | 1387 Handle<Name>::null(), Type::Any(), |
| 1388 MachineType::AnyTagged()}; |
1382 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, | 1389 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, |
1383 t.p1, t.start, t.start); | 1390 t.p1, t.start, t.start); |
1384 t.Effect(store); | 1391 t.Effect(store); |
1385 t.LowerAllNodesAndLowerChanges(); | 1392 t.LowerAllNodesAndLowerChanges(); |
1386 CHECK_EQ(IrOpcode::kStore, store->opcode()); | 1393 CHECK_EQ(IrOpcode::kStore, store->opcode()); |
1387 CHECK_EQ(t.p1, store->InputAt(2)); | 1394 CHECK_EQ(t.p1, store->InputAt(2)); |
1388 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); | 1395 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); |
1389 CHECK_EQ(kNoWriteBarrier, rep.write_barrier_kind()); | 1396 CHECK_EQ(kNoWriteBarrier, rep.write_barrier_kind()); |
1390 } | 1397 } |
1391 } | 1398 } |
1392 | 1399 |
1393 | 1400 |
1394 TEST(LowerLoadElement_to_load) { | 1401 TEST(LowerLoadElement_to_load) { |
1395 TestingGraph t(Type::Any(), Type::Signed32()); | 1402 TestingGraph t(Type::Any(), Type::Signed32()); |
1396 | 1403 |
1397 for (size_t i = 0; i < arraysize(kMachineReps); i++) { | 1404 for (size_t i = 0; i < arraysize(kMachineReps); i++) { |
1398 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1405 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
1399 Type::Any(), kMachineReps[i]}; | 1406 Type::Any(), kMachineReps[i]}; |
1400 | 1407 |
1401 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0, | 1408 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0, |
1402 t.p1, t.start, t.start); | 1409 t.p1, t.start, t.start); |
1403 Node* use = t.Use(load, kMachineReps[i]); | 1410 Node* use = t.Use(load, kMachineReps[i]); |
1404 t.Return(use); | 1411 t.Return(use); |
1405 t.LowerAllNodesAndLowerChanges(); | 1412 t.LowerAllNodesAndLowerChanges(); |
1406 CHECK_EQ(IrOpcode::kLoad, load->opcode()); | 1413 CHECK_EQ(IrOpcode::kLoad, load->opcode()); |
1407 CHECK_EQ(t.p0, load->InputAt(0)); | 1414 CHECK_EQ(t.p0, load->InputAt(0)); |
1408 CheckElementAccessArithmetic(access, load); | 1415 CheckElementAccessArithmetic(access, load); |
1409 | 1416 |
1410 MachineType rep = OpParameter<MachineType>(load); | 1417 MachineType rep = LoadRepresentationOf(load->op()); |
1411 CHECK_EQ(kMachineReps[i], rep); | 1418 CHECK_EQ(kMachineReps[i], rep); |
1412 } | 1419 } |
1413 } | 1420 } |
1414 | 1421 |
1415 | 1422 |
1416 TEST(LowerStoreElement_to_store) { | 1423 TEST(LowerStoreElement_to_store) { |
1417 { | 1424 { |
1418 TestingGraph t(Type::Any(), Type::Signed32()); | 1425 TestingGraph t(Type::Any(), Type::Signed32()); |
1419 | 1426 |
1420 for (size_t i = 0; i < arraysize(kMachineReps); i++) { | 1427 for (size_t i = 0; i < arraysize(kMachineReps); i++) { |
1421 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1428 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
1422 Type::Any(), kMachineReps[i]}; | 1429 Type::Any(), kMachineReps[i]}; |
1423 | 1430 |
1424 Node* val = t.ExampleWithOutput(kMachineReps[i]); | 1431 Node* val = t.ExampleWithOutput(kMachineReps[i]); |
1425 Node* store = t.graph()->NewNode(t.simplified()->StoreElement(access), | 1432 Node* store = t.graph()->NewNode(t.simplified()->StoreElement(access), |
1426 t.p0, t.p1, val, t.start, t.start); | 1433 t.p0, t.p1, val, t.start, t.start); |
1427 t.Effect(store); | 1434 t.Effect(store); |
1428 t.LowerAllNodesAndLowerChanges(); | 1435 t.LowerAllNodesAndLowerChanges(); |
1429 CHECK_EQ(IrOpcode::kStore, store->opcode()); | 1436 CHECK_EQ(IrOpcode::kStore, store->opcode()); |
1430 CHECK_EQ(val, store->InputAt(2)); | 1437 CHECK_EQ(val, store->InputAt(2)); |
1431 CheckElementAccessArithmetic(access, store); | 1438 CheckElementAccessArithmetic(access, store); |
1432 | 1439 |
1433 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); | 1440 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); |
1434 if (kMachineReps[i] & kRepTagged) { | 1441 if (kMachineReps[i].representation() == MachineRepresentation::kTagged) { |
1435 CHECK_EQ(kFullWriteBarrier, rep.write_barrier_kind()); | 1442 CHECK_EQ(kFullWriteBarrier, rep.write_barrier_kind()); |
1436 } | 1443 } |
1437 CHECK_EQ(kMachineReps[i], rep.machine_type()); | 1444 CHECK_EQ(kMachineReps[i], rep.machine_type()); |
1438 } | 1445 } |
1439 } | 1446 } |
1440 { | 1447 { |
1441 HandleAndZoneScope scope; | 1448 HandleAndZoneScope scope; |
1442 Zone* z = scope.main_zone(); | 1449 Zone* z = scope.main_zone(); |
1443 TestingGraph t( | 1450 TestingGraph t( |
1444 Type::Any(), Type::Signed32(), | 1451 Type::Any(), Type::Signed32(), |
1445 Type::Intersect(Type::SignedSmall(), Type::TaggedSigned(), z)); | 1452 Type::Intersect(Type::SignedSmall(), Type::TaggedSigned(), z)); |
1446 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1453 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
1447 Type::Any(), kMachAnyTagged}; | 1454 Type::Any(), MachineType::AnyTagged()}; |
1448 Node* store = t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, | 1455 Node* store = t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, |
1449 t.p1, t.p2, t.start, t.start); | 1456 t.p1, t.p2, t.start, t.start); |
1450 t.Effect(store); | 1457 t.Effect(store); |
1451 t.LowerAllNodesAndLowerChanges(); | 1458 t.LowerAllNodesAndLowerChanges(); |
1452 CHECK_EQ(IrOpcode::kStore, store->opcode()); | 1459 CHECK_EQ(IrOpcode::kStore, store->opcode()); |
1453 CHECK_EQ(t.p2, store->InputAt(2)); | 1460 CHECK_EQ(t.p2, store->InputAt(2)); |
1454 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); | 1461 StoreRepresentation rep = OpParameter<StoreRepresentation>(store); |
1455 CHECK_EQ(kNoWriteBarrier, rep.write_barrier_kind()); | 1462 CHECK_EQ(kNoWriteBarrier, rep.write_barrier_kind()); |
1456 } | 1463 } |
1457 } | 1464 } |
1458 | 1465 |
1459 | 1466 |
1460 TEST(InsertChangeForLoadElementIndex) { | 1467 TEST(InsertChangeForLoadElementIndex) { |
1461 // LoadElement(obj: Tagged, index: kTypeInt32 | kRepTagged, length) => | 1468 // LoadElement(obj: Tagged, index: kTypeInt32 | kRepTagged, length) => |
1462 // Load(obj, Int32Add(Int32Mul(ChangeTaggedToInt32(index), #k), #k)) | 1469 // Load(obj, Int32Add(Int32Mul(ChangeTaggedToInt32(index), #k), #k)) |
1463 TestingGraph t(Type::Any(), Type::Signed32()); | 1470 TestingGraph t(Type::Any(), Type::Signed32()); |
1464 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), | 1471 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), |
1465 kMachAnyTagged}; | 1472 MachineType::AnyTagged()}; |
1466 | 1473 |
1467 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0, | 1474 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0, |
1468 t.p1, t.start, t.start); | 1475 t.p1, t.start, t.start); |
1469 t.Return(load); | 1476 t.Return(load); |
1470 t.Lower(); | 1477 t.Lower(); |
1471 CHECK_EQ(IrOpcode::kLoadElement, load->opcode()); | 1478 CHECK_EQ(IrOpcode::kLoadElement, load->opcode()); |
1472 CHECK_EQ(t.p0, load->InputAt(0)); | 1479 CHECK_EQ(t.p0, load->InputAt(0)); |
1473 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p1, load->InputAt(1)); | 1480 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p1, load->InputAt(1)); |
1474 } | 1481 } |
1475 | 1482 |
1476 | 1483 |
1477 TEST(InsertChangeForStoreElementIndex) { | 1484 TEST(InsertChangeForStoreElementIndex) { |
1478 // StoreElement(obj: Tagged, index: kTypeInt32 | kRepTagged, length, val) => | 1485 // StoreElement(obj: Tagged, index: kTypeInt32 | kRepTagged, length, val) => |
1479 // Store(obj, Int32Add(Int32Mul(ChangeTaggedToInt32(index), #k), #k), val) | 1486 // Store(obj, Int32Add(Int32Mul(ChangeTaggedToInt32(index), #k), #k), val) |
1480 TestingGraph t(Type::Any(), Type::Signed32()); | 1487 TestingGraph t(Type::Any(), Type::Signed32()); |
1481 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), | 1488 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), |
1482 kMachAnyTagged}; | 1489 MachineType::AnyTagged()}; |
1483 | 1490 |
1484 Node* store = | 1491 Node* store = |
1485 t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, t.p1, | 1492 t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, t.p1, |
1486 t.jsgraph.TrueConstant(), t.start, t.start); | 1493 t.jsgraph.TrueConstant(), t.start, t.start); |
1487 t.Effect(store); | 1494 t.Effect(store); |
1488 t.Lower(); | 1495 t.Lower(); |
1489 CHECK_EQ(IrOpcode::kStoreElement, store->opcode()); | 1496 CHECK_EQ(IrOpcode::kStoreElement, store->opcode()); |
1490 CHECK_EQ(t.p0, store->InputAt(0)); | 1497 CHECK_EQ(t.p0, store->InputAt(0)); |
1491 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p1, store->InputAt(1)); | 1498 CheckChangeOf(IrOpcode::kChangeTaggedToInt32, t.p1, store->InputAt(1)); |
1492 } | 1499 } |
1493 | 1500 |
1494 | 1501 |
1495 TEST(InsertChangeForLoadElement) { | 1502 TEST(InsertChangeForLoadElement) { |
1496 // TODO(titzer): test all load/store representation change insertions. | 1503 // TODO(titzer): test all load/store representation change insertions. |
1497 TestingGraph t(Type::Any(), Type::Signed32(), Type::Any()); | 1504 TestingGraph t(Type::Any(), Type::Signed32(), Type::Any()); |
1498 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), | 1505 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), |
1499 kMachFloat64}; | 1506 MachineType::Float64()}; |
1500 | 1507 |
1501 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0, | 1508 Node* load = t.graph()->NewNode(t.simplified()->LoadElement(access), t.p0, |
1502 t.p1, t.start, t.start); | 1509 t.p1, t.start, t.start); |
1503 t.Return(load); | 1510 t.Return(load); |
1504 t.Lower(); | 1511 t.Lower(); |
1505 CHECK_EQ(IrOpcode::kLoadElement, load->opcode()); | 1512 CHECK_EQ(IrOpcode::kLoadElement, load->opcode()); |
1506 CHECK_EQ(t.p0, load->InputAt(0)); | 1513 CHECK_EQ(t.p0, load->InputAt(0)); |
1507 CheckChangeOf(IrOpcode::kChangeFloat64ToTagged, load, t.ret->InputAt(0)); | 1514 CheckChangeOf(IrOpcode::kChangeFloat64ToTagged, load, t.ret->InputAt(0)); |
1508 } | 1515 } |
1509 | 1516 |
1510 | 1517 |
1511 TEST(InsertChangeForLoadField) { | 1518 TEST(InsertChangeForLoadField) { |
1512 // TODO(titzer): test all load/store representation change insertions. | 1519 // TODO(titzer): test all load/store representation change insertions. |
1513 TestingGraph t(Type::Any(), Type::Signed32()); | 1520 TestingGraph t(Type::Any(), Type::Signed32()); |
1514 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1521 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
1515 Handle<Name>::null(), Type::Any(), kMachFloat64}; | 1522 Handle<Name>::null(), Type::Any(), |
| 1523 MachineType::Float64()}; |
1516 | 1524 |
1517 Node* load = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, | 1525 Node* load = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, |
1518 t.start, t.start); | 1526 t.start, t.start); |
1519 t.Return(load); | 1527 t.Return(load); |
1520 t.Lower(); | 1528 t.Lower(); |
1521 CHECK_EQ(IrOpcode::kLoadField, load->opcode()); | 1529 CHECK_EQ(IrOpcode::kLoadField, load->opcode()); |
1522 CHECK_EQ(t.p0, load->InputAt(0)); | 1530 CHECK_EQ(t.p0, load->InputAt(0)); |
1523 CheckChangeOf(IrOpcode::kChangeFloat64ToTagged, load, t.ret->InputAt(0)); | 1531 CheckChangeOf(IrOpcode::kChangeFloat64ToTagged, load, t.ret->InputAt(0)); |
1524 } | 1532 } |
1525 | 1533 |
1526 | 1534 |
1527 TEST(InsertChangeForStoreElement) { | 1535 TEST(InsertChangeForStoreElement) { |
1528 // TODO(titzer): test all load/store representation change insertions. | 1536 // TODO(titzer): test all load/store representation change insertions. |
1529 TestingGraph t(Type::Any(), Type::Signed32()); | 1537 TestingGraph t(Type::Any(), Type::Signed32()); |
1530 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), | 1538 ElementAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, Type::Any(), |
1531 kMachFloat64}; | 1539 MachineType::Float64()}; |
1532 | 1540 |
1533 Node* store = | 1541 Node* store = |
1534 t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, | 1542 t.graph()->NewNode(t.simplified()->StoreElement(access), t.p0, |
1535 t.jsgraph.Int32Constant(0), t.p1, t.start, t.start); | 1543 t.jsgraph.Int32Constant(0), t.p1, t.start, t.start); |
1536 t.Effect(store); | 1544 t.Effect(store); |
1537 t.Lower(); | 1545 t.Lower(); |
1538 | 1546 |
1539 CHECK_EQ(IrOpcode::kStoreElement, store->opcode()); | 1547 CHECK_EQ(IrOpcode::kStoreElement, store->opcode()); |
1540 CHECK_EQ(t.p0, store->InputAt(0)); | 1548 CHECK_EQ(t.p0, store->InputAt(0)); |
1541 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(2)); | 1549 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(2)); |
1542 } | 1550 } |
1543 | 1551 |
1544 | 1552 |
1545 TEST(InsertChangeForStoreField) { | 1553 TEST(InsertChangeForStoreField) { |
1546 // TODO(titzer): test all load/store representation change insertions. | 1554 // TODO(titzer): test all load/store representation change insertions. |
1547 TestingGraph t(Type::Any(), Type::Signed32()); | 1555 TestingGraph t(Type::Any(), Type::Signed32()); |
1548 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1556 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
1549 Handle<Name>::null(), Type::Any(), kMachFloat64}; | 1557 Handle<Name>::null(), Type::Any(), |
| 1558 MachineType::Float64()}; |
1550 | 1559 |
1551 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, | 1560 Node* store = t.graph()->NewNode(t.simplified()->StoreField(access), t.p0, |
1552 t.p1, t.start, t.start); | 1561 t.p1, t.start, t.start); |
1553 t.Effect(store); | 1562 t.Effect(store); |
1554 t.Lower(); | 1563 t.Lower(); |
1555 | 1564 |
1556 CHECK_EQ(IrOpcode::kStoreField, store->opcode()); | 1565 CHECK_EQ(IrOpcode::kStoreField, store->opcode()); |
1557 CHECK_EQ(t.p0, store->InputAt(0)); | 1566 CHECK_EQ(t.p0, store->InputAt(0)); |
1558 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(1)); | 1567 CheckChangeOf(IrOpcode::kChangeTaggedToFloat64, t.p1, store->InputAt(1)); |
1559 } | 1568 } |
1560 | 1569 |
1561 | 1570 |
1562 TEST(UpdatePhi) { | 1571 TEST(UpdatePhi) { |
1563 TestingGraph t(Type::Any(), Type::Signed32()); | 1572 TestingGraph t(Type::Any(), Type::Signed32()); |
1564 static const MachineType kMachineTypes[] = {kMachInt32, kMachUint32, | 1573 static const MachineType kMachineTypes[] = { |
1565 kMachFloat64}; | 1574 MachineType::Int32(), MachineType::Uint32(), MachineType::Float64()}; |
1566 Type* kTypes[] = {Type::Signed32(), Type::Unsigned32(), Type::Number()}; | 1575 Type* kTypes[] = {Type::Signed32(), Type::Unsigned32(), Type::Number()}; |
1567 | 1576 |
1568 for (size_t i = 0; i < arraysize(kMachineTypes); i++) { | 1577 for (size_t i = 0; i < arraysize(kMachineTypes); i++) { |
1569 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, | 1578 FieldAccess access = {kTaggedBase, FixedArrayBase::kHeaderSize, |
1570 Handle<Name>::null(), kTypes[i], kMachineTypes[i]}; | 1579 Handle<Name>::null(), kTypes[i], kMachineTypes[i]}; |
1571 | 1580 |
1572 Node* load0 = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, | 1581 Node* load0 = t.graph()->NewNode(t.simplified()->LoadField(access), t.p0, |
1573 t.start, t.start); | 1582 t.start, t.start); |
1574 Node* load1 = t.graph()->NewNode(t.simplified()->LoadField(access), t.p1, | 1583 Node* load1 = t.graph()->NewNode(t.simplified()->LoadField(access), t.p1, |
1575 t.start, t.start); | 1584 t.start, t.start); |
1576 Node* phi = t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), load0, | 1585 Node* phi = |
1577 load1, t.start); | 1586 t.graph()->NewNode(t.common()->Phi(MachineRepresentation::kTagged, 2), |
| 1587 load0, load1, t.start); |
1578 t.Return(t.Use(phi, kMachineTypes[i])); | 1588 t.Return(t.Use(phi, kMachineTypes[i])); |
1579 t.Lower(); | 1589 t.Lower(); |
1580 | 1590 |
1581 CHECK_EQ(IrOpcode::kPhi, phi->opcode()); | 1591 CHECK_EQ(IrOpcode::kPhi, phi->opcode()); |
1582 CHECK_EQ(RepresentationOf(kMachineTypes[i]), | 1592 CHECK_EQ(kMachineTypes[i].representation(), PhiRepresentationOf(phi->op())); |
1583 RepresentationOf(OpParameter<MachineType>(phi))); | |
1584 } | 1593 } |
1585 } | 1594 } |
1586 | 1595 |
1587 | 1596 |
1588 TEST(RunNumberDivide_minus_1_TruncatingToInt32) { | 1597 TEST(RunNumberDivide_minus_1_TruncatingToInt32) { |
1589 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 1598 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
1590 Node* num = t.NumberToInt32(t.Parameter(0)); | 1599 Node* num = t.NumberToInt32(t.Parameter(0)); |
1591 Node* div = t.NumberDivide(num, t.jsgraph.Constant(-1)); | 1600 Node* div = t.NumberDivide(num, t.jsgraph.Constant(-1)); |
1592 Node* trunc = t.NumberToInt32(div); | 1601 Node* trunc = t.NumberToInt32(div); |
1593 t.Return(trunc); | 1602 t.Return(trunc); |
1594 | 1603 |
1595 t.LowerAllNodesAndLowerChanges(); | 1604 t.LowerAllNodesAndLowerChanges(); |
1596 t.GenerateCode(); | 1605 t.GenerateCode(); |
1597 | 1606 |
1598 FOR_INT32_INPUTS(i) { | 1607 FOR_INT32_INPUTS(i) { |
1599 int32_t x = 0 - *i; | 1608 int32_t x = 0 - *i; |
1600 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); | 1609 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); |
1601 } | 1610 } |
1602 } | 1611 } |
1603 | 1612 |
1604 | 1613 |
1605 TEST(RunNumberMultiply_TruncatingToInt32) { | 1614 TEST(RunNumberMultiply_TruncatingToInt32) { |
1606 int32_t constants[] = {-100, -10, -1, 0, 1, 100, 1000, 3000999}; | 1615 int32_t constants[] = {-100, -10, -1, 0, 1, 100, 1000, 3000999}; |
1607 | 1616 |
1608 for (size_t i = 0; i < arraysize(constants); i++) { | 1617 for (size_t i = 0; i < arraysize(constants); i++) { |
1609 double k = static_cast<double>(constants[i]); | 1618 double k = static_cast<double>(constants[i]); |
1610 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 1619 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
1611 Node* num = t.NumberToInt32(t.Parameter(0)); | 1620 Node* num = t.NumberToInt32(t.Parameter(0)); |
1612 Node* mul = t.NumberMultiply(num, t.jsgraph.Constant(k)); | 1621 Node* mul = t.NumberMultiply(num, t.jsgraph.Constant(k)); |
1613 Node* trunc = t.NumberToInt32(mul); | 1622 Node* trunc = t.NumberToInt32(mul); |
1614 t.Return(trunc); | 1623 t.Return(trunc); |
1615 | 1624 |
1616 t.LowerAllNodesAndLowerChanges(); | 1625 t.LowerAllNodesAndLowerChanges(); |
1617 t.GenerateCode(); | 1626 t.GenerateCode(); |
1618 | 1627 |
1619 FOR_INT32_INPUTS(i) { | 1628 FOR_INT32_INPUTS(i) { |
1620 int32_t x = DoubleToInt32(static_cast<double>(*i) * k); | 1629 int32_t x = DoubleToInt32(static_cast<double>(*i) * k); |
1621 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); | 1630 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); |
1622 } | 1631 } |
1623 } | 1632 } |
1624 } | 1633 } |
1625 | 1634 |
1626 | 1635 |
1627 TEST(RunNumberMultiply_TruncatingToUint32) { | 1636 TEST(RunNumberMultiply_TruncatingToUint32) { |
1628 uint32_t constants[] = {0, 1, 2, 3, 4, 100, 1000, 1024, 2048, 3000999}; | 1637 uint32_t constants[] = {0, 1, 2, 3, 4, 100, 1000, 1024, 2048, 3000999}; |
1629 | 1638 |
1630 for (size_t i = 0; i < arraysize(constants); i++) { | 1639 for (size_t i = 0; i < arraysize(constants); i++) { |
1631 double k = static_cast<double>(constants[i]); | 1640 double k = static_cast<double>(constants[i]); |
1632 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 1641 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
1633 Node* num = t.NumberToUint32(t.Parameter(0)); | 1642 Node* num = t.NumberToUint32(t.Parameter(0)); |
1634 Node* mul = t.NumberMultiply(num, t.jsgraph.Constant(k)); | 1643 Node* mul = t.NumberMultiply(num, t.jsgraph.Constant(k)); |
1635 Node* trunc = t.NumberToUint32(mul); | 1644 Node* trunc = t.NumberToUint32(mul); |
1636 t.Return(trunc); | 1645 t.Return(trunc); |
1637 | 1646 |
1638 t.LowerAllNodesAndLowerChanges(); | 1647 t.LowerAllNodesAndLowerChanges(); |
1639 t.GenerateCode(); | 1648 t.GenerateCode(); |
1640 | 1649 |
1641 FOR_UINT32_INPUTS(i) { | 1650 FOR_UINT32_INPUTS(i) { |
1642 uint32_t x = DoubleToUint32(static_cast<double>(*i) * k); | 1651 uint32_t x = DoubleToUint32(static_cast<double>(*i) * k); |
1643 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); | 1652 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); |
1644 } | 1653 } |
1645 } | 1654 } |
1646 } | 1655 } |
1647 | 1656 |
1648 | 1657 |
1649 TEST(RunNumberDivide_2_TruncatingToUint32) { | 1658 TEST(RunNumberDivide_2_TruncatingToUint32) { |
1650 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 1659 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
1651 Node* num = t.NumberToUint32(t.Parameter(0)); | 1660 Node* num = t.NumberToUint32(t.Parameter(0)); |
1652 Node* div = t.NumberDivide(num, t.jsgraph.Constant(2)); | 1661 Node* div = t.NumberDivide(num, t.jsgraph.Constant(2)); |
1653 Node* trunc = t.NumberToUint32(div); | 1662 Node* trunc = t.NumberToUint32(div); |
1654 t.Return(trunc); | 1663 t.Return(trunc); |
1655 | 1664 |
1656 t.LowerAllNodesAndLowerChanges(); | 1665 t.LowerAllNodesAndLowerChanges(); |
1657 t.GenerateCode(); | 1666 t.GenerateCode(); |
1658 | 1667 |
1659 FOR_UINT32_INPUTS(i) { | 1668 FOR_UINT32_INPUTS(i) { |
1660 uint32_t x = DoubleToUint32(static_cast<double>(*i / 2.0)); | 1669 uint32_t x = DoubleToUint32(static_cast<double>(*i / 2.0)); |
(...skipping 25 matching lines...) Expand all Loading... |
1686 } | 1695 } |
1687 | 1696 |
1688 | 1697 |
1689 TEST(NumberDivide_TruncatingToInt32) { | 1698 TEST(NumberDivide_TruncatingToInt32) { |
1690 int32_t constants[] = {-100, -10, 1, 4, 100, 1000}; | 1699 int32_t constants[] = {-100, -10, 1, 4, 100, 1000}; |
1691 | 1700 |
1692 for (size_t i = 0; i < arraysize(constants); i++) { | 1701 for (size_t i = 0; i < arraysize(constants); i++) { |
1693 TestingGraph t(Type::Signed32()); | 1702 TestingGraph t(Type::Signed32()); |
1694 Node* k = t.jsgraph.Constant(constants[i]); | 1703 Node* k = t.jsgraph.Constant(constants[i]); |
1695 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); | 1704 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); |
1696 Node* use = t.Use(div, kMachInt32); | 1705 Node* use = t.Use(div, MachineType::Int32()); |
1697 t.Return(use); | 1706 t.Return(use); |
1698 t.Lower(); | 1707 t.Lower(); |
1699 | 1708 |
1700 CHECK_EQ(IrOpcode::kInt32Div, use->InputAt(0)->opcode()); | 1709 CHECK_EQ(IrOpcode::kInt32Div, use->InputAt(0)->opcode()); |
1701 } | 1710 } |
1702 } | 1711 } |
1703 | 1712 |
1704 | 1713 |
1705 TEST(RunNumberDivide_TruncatingToInt32) { | 1714 TEST(RunNumberDivide_TruncatingToInt32) { |
1706 int32_t constants[] = {-100, -10, -1, 1, 2, 100, 1000, 1024, 2048}; | 1715 int32_t constants[] = {-100, -10, -1, 1, 2, 100, 1000, 1024, 2048}; |
1707 | 1716 |
1708 for (size_t i = 0; i < arraysize(constants); i++) { | 1717 for (size_t i = 0; i < arraysize(constants); i++) { |
1709 int32_t k = constants[i]; | 1718 int32_t k = constants[i]; |
1710 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 1719 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
1711 Node* num = t.NumberToInt32(t.Parameter(0)); | 1720 Node* num = t.NumberToInt32(t.Parameter(0)); |
1712 Node* div = t.NumberDivide(num, t.jsgraph.Constant(k)); | 1721 Node* div = t.NumberDivide(num, t.jsgraph.Constant(k)); |
1713 Node* trunc = t.NumberToInt32(div); | 1722 Node* trunc = t.NumberToInt32(div); |
1714 t.Return(trunc); | 1723 t.Return(trunc); |
1715 | 1724 |
1716 t.LowerAllNodesAndLowerChanges(); | 1725 t.LowerAllNodesAndLowerChanges(); |
1717 t.GenerateCode(); | 1726 t.GenerateCode(); |
1718 | 1727 |
1719 FOR_INT32_INPUTS(i) { | 1728 FOR_INT32_INPUTS(i) { |
1720 if (*i == INT_MAX) continue; // exclude max int. | 1729 if (*i == INT_MAX) continue; // exclude max int. |
1721 int32_t x = DoubleToInt32(static_cast<double>(*i) / k); | 1730 int32_t x = DoubleToInt32(static_cast<double>(*i) / k); |
1722 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); | 1731 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); |
1723 } | 1732 } |
1724 } | 1733 } |
1725 } | 1734 } |
1726 | 1735 |
1727 | 1736 |
1728 TEST(NumberDivide_TruncatingToUint32) { | 1737 TEST(NumberDivide_TruncatingToUint32) { |
1729 double constants[] = {1, 3, 100, 1000, 100998348}; | 1738 double constants[] = {1, 3, 100, 1000, 100998348}; |
1730 | 1739 |
1731 for (size_t i = 0; i < arraysize(constants); i++) { | 1740 for (size_t i = 0; i < arraysize(constants); i++) { |
1732 TestingGraph t(Type::Unsigned32()); | 1741 TestingGraph t(Type::Unsigned32()); |
1733 Node* k = t.jsgraph.Constant(constants[i]); | 1742 Node* k = t.jsgraph.Constant(constants[i]); |
1734 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); | 1743 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); |
1735 Node* use = t.Use(div, kMachUint32); | 1744 Node* use = t.Use(div, MachineType::Uint32()); |
1736 t.Return(use); | 1745 t.Return(use); |
1737 t.Lower(); | 1746 t.Lower(); |
1738 | 1747 |
1739 CHECK_EQ(IrOpcode::kUint32Div, use->InputAt(0)->opcode()); | 1748 CHECK_EQ(IrOpcode::kUint32Div, use->InputAt(0)->opcode()); |
1740 } | 1749 } |
1741 } | 1750 } |
1742 | 1751 |
1743 | 1752 |
1744 TEST(RunNumberDivide_TruncatingToUint32) { | 1753 TEST(RunNumberDivide_TruncatingToUint32) { |
1745 uint32_t constants[] = {100, 10, 1, 1, 2, 4, 1000, 1024, 2048}; | 1754 uint32_t constants[] = {100, 10, 1, 1, 2, 4, 1000, 1024, 2048}; |
1746 | 1755 |
1747 for (size_t i = 0; i < arraysize(constants); i++) { | 1756 for (size_t i = 0; i < arraysize(constants); i++) { |
1748 uint32_t k = constants[i]; | 1757 uint32_t k = constants[i]; |
1749 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 1758 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
1750 Node* num = t.NumberToUint32(t.Parameter(0)); | 1759 Node* num = t.NumberToUint32(t.Parameter(0)); |
1751 Node* div = t.NumberDivide(num, t.jsgraph.Constant(static_cast<double>(k))); | 1760 Node* div = t.NumberDivide(num, t.jsgraph.Constant(static_cast<double>(k))); |
1752 Node* trunc = t.NumberToUint32(div); | 1761 Node* trunc = t.NumberToUint32(div); |
1753 t.Return(trunc); | 1762 t.Return(trunc); |
1754 | 1763 |
1755 t.LowerAllNodesAndLowerChanges(); | 1764 t.LowerAllNodesAndLowerChanges(); |
1756 t.GenerateCode(); | 1765 t.GenerateCode(); |
1757 | 1766 |
1758 FOR_UINT32_INPUTS(i) { | 1767 FOR_UINT32_INPUTS(i) { |
1759 uint32_t x = *i / k; | 1768 uint32_t x = *i / k; |
1760 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); | 1769 t.CheckNumberCall(static_cast<double>(x), static_cast<double>(*i)); |
1761 } | 1770 } |
1762 } | 1771 } |
1763 } | 1772 } |
1764 | 1773 |
1765 | 1774 |
1766 TEST(NumberDivide_BadConstants) { | 1775 TEST(NumberDivide_BadConstants) { |
1767 { | 1776 { |
1768 TestingGraph t(Type::Signed32()); | 1777 TestingGraph t(Type::Signed32()); |
1769 Node* k = t.jsgraph.Constant(-1); | 1778 Node* k = t.jsgraph.Constant(-1); |
1770 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); | 1779 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); |
1771 Node* use = t.Use(div, kMachInt32); | 1780 Node* use = t.Use(div, MachineType::Int32()); |
1772 t.Return(use); | 1781 t.Return(use); |
1773 t.Lower(); | 1782 t.Lower(); |
1774 | 1783 |
1775 CHECK_EQ(IrOpcode::kInt32Sub, use->InputAt(0)->opcode()); | 1784 CHECK_EQ(IrOpcode::kInt32Sub, use->InputAt(0)->opcode()); |
1776 } | 1785 } |
1777 | 1786 |
1778 { | 1787 { |
1779 TestingGraph t(Type::Signed32()); | 1788 TestingGraph t(Type::Signed32()); |
1780 Node* k = t.jsgraph.Constant(0); | 1789 Node* k = t.jsgraph.Constant(0); |
1781 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); | 1790 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); |
1782 Node* use = t.Use(div, kMachInt32); | 1791 Node* use = t.Use(div, MachineType::Int32()); |
1783 t.Return(use); | 1792 t.Return(use); |
1784 t.Lower(); | 1793 t.Lower(); |
1785 | 1794 |
1786 CHECK_EQ(IrOpcode::kInt32Constant, use->InputAt(0)->opcode()); | 1795 CHECK_EQ(IrOpcode::kInt32Constant, use->InputAt(0)->opcode()); |
1787 CHECK_EQ(0, OpParameter<int32_t>(use->InputAt(0))); | 1796 CHECK_EQ(0, OpParameter<int32_t>(use->InputAt(0))); |
1788 } | 1797 } |
1789 | 1798 |
1790 { | 1799 { |
1791 TestingGraph t(Type::Unsigned32()); | 1800 TestingGraph t(Type::Unsigned32()); |
1792 Node* k = t.jsgraph.Constant(0); | 1801 Node* k = t.jsgraph.Constant(0); |
1793 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); | 1802 Node* div = t.graph()->NewNode(t.simplified()->NumberDivide(), t.p0, k); |
1794 Node* use = t.Use(div, kMachUint32); | 1803 Node* use = t.Use(div, MachineType::Uint32()); |
1795 t.Return(use); | 1804 t.Return(use); |
1796 t.Lower(); | 1805 t.Lower(); |
1797 | 1806 |
1798 CHECK_EQ(IrOpcode::kInt32Constant, use->InputAt(0)->opcode()); | 1807 CHECK_EQ(IrOpcode::kInt32Constant, use->InputAt(0)->opcode()); |
1799 CHECK_EQ(0, OpParameter<int32_t>(use->InputAt(0))); | 1808 CHECK_EQ(0, OpParameter<int32_t>(use->InputAt(0))); |
1800 } | 1809 } |
1801 } | 1810 } |
1802 | 1811 |
1803 | 1812 |
1804 TEST(NumberModulus_TruncatingToInt32) { | 1813 TEST(NumberModulus_TruncatingToInt32) { |
1805 int32_t constants[] = {-100, -10, 1, 4, 100, 1000}; | 1814 int32_t constants[] = {-100, -10, 1, 4, 100, 1000}; |
1806 | 1815 |
1807 for (size_t i = 0; i < arraysize(constants); i++) { | 1816 for (size_t i = 0; i < arraysize(constants); i++) { |
1808 TestingGraph t(Type::Signed32()); | 1817 TestingGraph t(Type::Signed32()); |
1809 Node* k = t.jsgraph.Constant(constants[i]); | 1818 Node* k = t.jsgraph.Constant(constants[i]); |
1810 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k); | 1819 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k); |
1811 Node* use = t.Use(mod, kMachInt32); | 1820 Node* use = t.Use(mod, MachineType::Int32()); |
1812 t.Return(use); | 1821 t.Return(use); |
1813 t.Lower(); | 1822 t.Lower(); |
1814 | 1823 |
1815 CHECK_EQ(IrOpcode::kInt32Mod, use->InputAt(0)->opcode()); | 1824 CHECK_EQ(IrOpcode::kInt32Mod, use->InputAt(0)->opcode()); |
1816 } | 1825 } |
1817 } | 1826 } |
1818 | 1827 |
1819 | 1828 |
1820 TEST(RunNumberModulus_TruncatingToInt32) { | 1829 TEST(RunNumberModulus_TruncatingToInt32) { |
1821 int32_t constants[] = {-100, -10, -1, 1, 2, 100, 1000, 1024, 2048}; | 1830 int32_t constants[] = {-100, -10, -1, 1, 2, 100, 1000, 1024, 2048}; |
1822 | 1831 |
1823 for (size_t i = 0; i < arraysize(constants); i++) { | 1832 for (size_t i = 0; i < arraysize(constants); i++) { |
1824 int32_t k = constants[i]; | 1833 int32_t k = constants[i]; |
1825 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 1834 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
1826 Node* num = t.NumberToInt32(t.Parameter(0)); | 1835 Node* num = t.NumberToInt32(t.Parameter(0)); |
1827 Node* mod = t.NumberModulus(num, t.jsgraph.Constant(k)); | 1836 Node* mod = t.NumberModulus(num, t.jsgraph.Constant(k)); |
1828 Node* trunc = t.NumberToInt32(mod); | 1837 Node* trunc = t.NumberToInt32(mod); |
1829 t.Return(trunc); | 1838 t.Return(trunc); |
1830 | 1839 |
1831 t.LowerAllNodesAndLowerChanges(); | 1840 t.LowerAllNodesAndLowerChanges(); |
1832 t.GenerateCode(); | 1841 t.GenerateCode(); |
1833 | 1842 |
1834 FOR_INT32_INPUTS(i) { | 1843 FOR_INT32_INPUTS(i) { |
1835 if (*i == INT_MAX) continue; // exclude max int. | 1844 if (*i == INT_MAX) continue; // exclude max int. |
(...skipping 18 matching lines...) Expand all Loading... |
1854 CHECK_EQ(IrOpcode::kUint32Mod, t.ret->InputAt(0)->InputAt(0)->opcode()); | 1863 CHECK_EQ(IrOpcode::kUint32Mod, t.ret->InputAt(0)->InputAt(0)->opcode()); |
1855 } | 1864 } |
1856 } | 1865 } |
1857 | 1866 |
1858 | 1867 |
1859 TEST(RunNumberModulus_TruncatingToUint32) { | 1868 TEST(RunNumberModulus_TruncatingToUint32) { |
1860 uint32_t constants[] = {1, 2, 100, 1000, 1024, 2048}; | 1869 uint32_t constants[] = {1, 2, 100, 1000, 1024, 2048}; |
1861 | 1870 |
1862 for (size_t i = 0; i < arraysize(constants); i++) { | 1871 for (size_t i = 0; i < arraysize(constants); i++) { |
1863 uint32_t k = constants[i]; | 1872 uint32_t k = constants[i]; |
1864 SimplifiedLoweringTester<Object*> t(kMachAnyTagged); | 1873 SimplifiedLoweringTester<Object*> t(MachineType::AnyTagged()); |
1865 Node* num = t.NumberToUint32(t.Parameter(0)); | 1874 Node* num = t.NumberToUint32(t.Parameter(0)); |
1866 Node* mod = | 1875 Node* mod = |
1867 t.NumberModulus(num, t.jsgraph.Constant(static_cast<double>(k))); | 1876 t.NumberModulus(num, t.jsgraph.Constant(static_cast<double>(k))); |
1868 Node* trunc = t.NumberToUint32(mod); | 1877 Node* trunc = t.NumberToUint32(mod); |
1869 t.Return(trunc); | 1878 t.Return(trunc); |
1870 | 1879 |
1871 t.LowerAllNodesAndLowerChanges(); | 1880 t.LowerAllNodesAndLowerChanges(); |
1872 t.GenerateCode(); | 1881 t.GenerateCode(); |
1873 | 1882 |
1874 FOR_UINT32_INPUTS(i) { | 1883 FOR_UINT32_INPUTS(i) { |
(...skipping 14 matching lines...) Expand all Loading... |
1889 t.Return(mod); | 1898 t.Return(mod); |
1890 t.Lower(); | 1899 t.Lower(); |
1891 | 1900 |
1892 CHECK_EQ(IrOpcode::kFloat64Mod, mod->opcode()); // Pesky -0 behavior. | 1901 CHECK_EQ(IrOpcode::kFloat64Mod, mod->opcode()); // Pesky -0 behavior. |
1893 } | 1902 } |
1894 } | 1903 } |
1895 | 1904 |
1896 | 1905 |
1897 TEST(NumberModulus_Uint32) { | 1906 TEST(NumberModulus_Uint32) { |
1898 const double kConstants[] = {2, 100, 1000, 1024, 2048}; | 1907 const double kConstants[] = {2, 100, 1000, 1024, 2048}; |
1899 const MachineType kTypes[] = {kMachInt32, kMachUint32}; | 1908 const MachineType kTypes[] = {MachineType::Int32(), MachineType::Uint32()}; |
1900 | 1909 |
1901 for (auto const type : kTypes) { | 1910 for (auto const type : kTypes) { |
1902 for (auto const c : kConstants) { | 1911 for (auto const c : kConstants) { |
1903 TestingGraph t(Type::Unsigned32()); | 1912 TestingGraph t(Type::Unsigned32()); |
1904 Node* k = t.jsgraph.Constant(c); | 1913 Node* k = t.jsgraph.Constant(c); |
1905 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k); | 1914 Node* mod = t.graph()->NewNode(t.simplified()->NumberModulus(), t.p0, k); |
1906 Node* use = t.Use(mod, type); | 1915 Node* use = t.Use(mod, type); |
1907 t.Return(use); | 1916 t.Return(use); |
1908 t.Lower(); | 1917 t.Lower(); |
1909 | 1918 |
1910 CHECK_EQ(IrOpcode::kUint32Mod, use->InputAt(0)->opcode()); | 1919 CHECK_EQ(IrOpcode::kUint32Mod, use->InputAt(0)->opcode()); |
1911 } | 1920 } |
1912 } | 1921 } |
1913 } | 1922 } |
1914 | 1923 |
1915 | 1924 |
1916 TEST(PhiRepresentation) { | 1925 TEST(PhiRepresentation) { |
1917 HandleAndZoneScope scope; | 1926 HandleAndZoneScope scope; |
1918 Zone* z = scope.main_zone(); | 1927 Zone* z = scope.main_zone(); |
1919 | 1928 |
1920 struct TestData { | 1929 struct TestData { |
1921 Type* arg1; | 1930 Type* arg1; |
1922 Type* arg2; | 1931 Type* arg2; |
1923 MachineType use; | 1932 MachineType use; |
1924 MachineTypeUnion expected; | 1933 MachineRepresentation expected; |
1925 }; | 1934 }; |
1926 | 1935 |
1927 TestData test_data[] = { | 1936 TestData test_data[] = { |
1928 {Type::Signed32(), Type::Unsigned32(), kMachInt32, | 1937 {Type::Signed32(), Type::Unsigned32(), MachineType::Int32(), |
1929 kRepWord32 | kTypeNumber}, | 1938 MachineRepresentation::kWord32}, |
1930 {Type::Signed32(), Type::Unsigned32(), kMachUint32, | 1939 {Type::Signed32(), Type::Unsigned32(), MachineType::Uint32(), |
1931 kRepWord32 | kTypeNumber}, | 1940 MachineRepresentation::kWord32}, |
1932 {Type::Signed32(), Type::Signed32(), kMachInt32, kMachInt32}, | 1941 {Type::Signed32(), Type::Signed32(), MachineType::Int32(), |
1933 {Type::Unsigned32(), Type::Unsigned32(), kMachInt32, kMachUint32}, | 1942 MachineRepresentation::kWord32}, |
1934 {Type::Number(), Type::Signed32(), kMachInt32, kRepWord32 | kTypeNumber}}; | 1943 {Type::Unsigned32(), Type::Unsigned32(), MachineType::Int32(), |
| 1944 MachineRepresentation::kWord32}, |
| 1945 {Type::Number(), Type::Signed32(), MachineType::Int32(), |
| 1946 MachineRepresentation::kWord32}}; |
1935 | 1947 |
1936 for (auto const d : test_data) { | 1948 for (auto const d : test_data) { |
1937 TestingGraph t(d.arg1, d.arg2, Type::Boolean()); | 1949 TestingGraph t(d.arg1, d.arg2, Type::Boolean()); |
1938 | 1950 |
1939 Node* br = t.graph()->NewNode(t.common()->Branch(), t.p2, t.start); | 1951 Node* br = t.graph()->NewNode(t.common()->Branch(), t.p2, t.start); |
1940 Node* tb = t.graph()->NewNode(t.common()->IfTrue(), br); | 1952 Node* tb = t.graph()->NewNode(t.common()->IfTrue(), br); |
1941 Node* fb = t.graph()->NewNode(t.common()->IfFalse(), br); | 1953 Node* fb = t.graph()->NewNode(t.common()->IfFalse(), br); |
1942 Node* m = t.graph()->NewNode(t.common()->Merge(2), tb, fb); | 1954 Node* m = t.graph()->NewNode(t.common()->Merge(2), tb, fb); |
1943 | 1955 |
1944 Node* phi = | 1956 Node* phi = t.graph()->NewNode( |
1945 t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), t.p0, t.p1, m); | 1957 t.common()->Phi(MachineRepresentation::kTagged, 2), t.p0, t.p1, m); |
1946 | 1958 |
1947 Type* phi_type = Type::Union(d.arg1, d.arg2, z); | 1959 Type* phi_type = Type::Union(d.arg1, d.arg2, z); |
1948 NodeProperties::SetType(phi, phi_type); | 1960 NodeProperties::SetType(phi, phi_type); |
1949 | 1961 |
1950 Node* use = t.Use(phi, d.use); | 1962 Node* use = t.Use(phi, d.use); |
1951 t.Return(use); | 1963 t.Return(use); |
1952 t.Lower(); | 1964 t.Lower(); |
1953 | 1965 |
1954 CHECK_EQ(d.expected, OpParameter<MachineType>(phi)); | 1966 CHECK_EQ(d.expected, PhiRepresentationOf(phi->op())); |
1955 } | 1967 } |
1956 } | 1968 } |
1957 | 1969 |
1958 } // namespace compiler | 1970 } // namespace compiler |
1959 } // namespace internal | 1971 } // namespace internal |
1960 } // namespace v8 | 1972 } // namespace v8 |
OLD | NEW |