| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "src/code-stubs.h" | 5 #include "src/code-stubs.h" |
| 6 | 6 |
| 7 #include "src/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
| 8 #include "src/crankshaft/hydrogen.h" | 8 #include "src/crankshaft/hydrogen.h" |
| 9 #include "src/crankshaft/lithium.h" | 9 #include "src/crankshaft/lithium.h" |
| 10 #include "src/field-index.h" | 10 #include "src/field-index.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 Isolate* isolate() { return info_->isolate(); } | 74 Isolate* isolate() { return info_->isolate(); } |
| 75 | 75 |
| 76 HLoadNamedField* BuildLoadNamedField(HValue* object, FieldIndex index); | 76 HLoadNamedField* BuildLoadNamedField(HValue* object, FieldIndex index); |
| 77 void BuildStoreNamedField(HValue* object, HValue* value, FieldIndex index, | 77 void BuildStoreNamedField(HValue* object, HValue* value, FieldIndex index, |
| 78 Representation representation, | 78 Representation representation, |
| 79 bool transition_to_field); | 79 bool transition_to_field); |
| 80 | 80 |
| 81 HValue* BuildPushElement(HValue* object, HValue* argc, | 81 HValue* BuildPushElement(HValue* object, HValue* argc, |
| 82 HValue* argument_elements, ElementsKind kind); | 82 HValue* argument_elements, ElementsKind kind); |
| 83 | 83 |
| 84 enum ArgumentClass { | |
| 85 NONE, | |
| 86 SINGLE, | |
| 87 MULTIPLE | |
| 88 }; | |
| 89 | |
| 90 HValue* UnmappedCase(HValue* elements, HValue* key, HValue* value); | 84 HValue* UnmappedCase(HValue* elements, HValue* key, HValue* value); |
| 91 HValue* EmitKeyedSloppyArguments(HValue* receiver, HValue* key, | 85 HValue* EmitKeyedSloppyArguments(HValue* receiver, HValue* key, |
| 92 HValue* value); | 86 HValue* value); |
| 93 | 87 |
| 94 HValue* BuildArrayConstructor(ElementsKind kind, | 88 HValue* BuildArrayConstructor(ElementsKind kind, |
| 95 AllocationSiteOverrideMode override_mode, | 89 AllocationSiteOverrideMode override_mode); |
| 96 ArgumentClass argument_class); | 90 HValue* BuildInternalArrayConstructor(ElementsKind kind); |
| 97 HValue* BuildInternalArrayConstructor(ElementsKind kind, | |
| 98 ArgumentClass argument_class); | |
| 99 | 91 |
| 100 HValue* BuildToString(HValue* input, bool convert); | 92 HValue* BuildToString(HValue* input, bool convert); |
| 101 HValue* BuildToPrimitive(HValue* input, HValue* input_map); | 93 HValue* BuildToPrimitive(HValue* input, HValue* input_map); |
| 102 | 94 |
| 103 private: | 95 private: |
| 104 HValue* BuildArraySingleArgumentConstructor(JSArrayBuilder* builder); | 96 HValue* BuildArraySingleArgumentConstructor(JSArrayBuilder* builder); |
| 105 HValue* BuildArrayNArgumentsConstructor(JSArrayBuilder* builder, | 97 HValue* BuildArrayNArgumentsConstructor(JSArrayBuilder* builder, |
| 106 ElementsKind kind); | 98 ElementsKind kind); |
| 107 | 99 |
| 108 base::SmartArrayPointer<HParameter*> parameters_; | 100 base::SmartArrayPointer<HParameter*> parameters_; |
| (...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1285 | 1277 |
| 1286 return GetParameter(0); | 1278 return GetParameter(0); |
| 1287 } | 1279 } |
| 1288 | 1280 |
| 1289 | 1281 |
| 1290 Handle<Code> TransitionElementsKindStub::GenerateCode() { | 1282 Handle<Code> TransitionElementsKindStub::GenerateCode() { |
| 1291 return DoGenerateCode(this); | 1283 return DoGenerateCode(this); |
| 1292 } | 1284 } |
| 1293 | 1285 |
| 1294 HValue* CodeStubGraphBuilderBase::BuildArrayConstructor( | 1286 HValue* CodeStubGraphBuilderBase::BuildArrayConstructor( |
| 1295 ElementsKind kind, | 1287 ElementsKind kind, AllocationSiteOverrideMode override_mode) { |
| 1296 AllocationSiteOverrideMode override_mode, | |
| 1297 ArgumentClass argument_class) { | |
| 1298 HValue* constructor = GetParameter(ArrayConstructorStubBase::kConstructor); | 1288 HValue* constructor = GetParameter(ArrayConstructorStubBase::kConstructor); |
| 1299 HValue* alloc_site = GetParameter(ArrayConstructorStubBase::kAllocationSite); | 1289 HValue* alloc_site = GetParameter(ArrayConstructorStubBase::kAllocationSite); |
| 1300 JSArrayBuilder array_builder(this, kind, alloc_site, constructor, | 1290 JSArrayBuilder array_builder(this, kind, alloc_site, constructor, |
| 1301 override_mode); | 1291 override_mode); |
| 1302 HValue* result = NULL; | 1292 return BuildArrayNArgumentsConstructor(&array_builder, kind); |
| 1303 switch (argument_class) { | 1293 } |
| 1304 case NONE: | |
| 1305 // This stub is very performance sensitive, the generated code must be | |
| 1306 // tuned so that it doesn't build and eager frame. | |
| 1307 info()->MarkMustNotHaveEagerFrame(); | |
| 1308 result = array_builder.AllocateEmptyArray(); | |
| 1309 break; | |
| 1310 case SINGLE: | |
| 1311 result = BuildArraySingleArgumentConstructor(&array_builder); | |
| 1312 break; | |
| 1313 case MULTIPLE: | |
| 1314 result = BuildArrayNArgumentsConstructor(&array_builder, kind); | |
| 1315 break; | |
| 1316 } | |
| 1317 | 1294 |
| 1318 return result; | 1295 HValue* CodeStubGraphBuilderBase::BuildInternalArrayConstructor( |
| 1296 ElementsKind kind) { |
| 1297 HValue* constructor = GetParameter( |
| 1298 InternalArrayConstructorStubBase::kConstructor); |
| 1299 JSArrayBuilder array_builder(this, kind, constructor); |
| 1300 return BuildArrayNArgumentsConstructor(&array_builder, kind); |
| 1319 } | 1301 } |
| 1320 | 1302 |
| 1321 | 1303 |
| 1322 HValue* CodeStubGraphBuilderBase::BuildInternalArrayConstructor( | |
| 1323 ElementsKind kind, ArgumentClass argument_class) { | |
| 1324 HValue* constructor = GetParameter( | |
| 1325 InternalArrayConstructorStubBase::kConstructor); | |
| 1326 JSArrayBuilder array_builder(this, kind, constructor); | |
| 1327 | |
| 1328 HValue* result = NULL; | |
| 1329 switch (argument_class) { | |
| 1330 case NONE: | |
| 1331 // This stub is very performance sensitive, the generated code must be | |
| 1332 // tuned so that it doesn't build and eager frame. | |
| 1333 info()->MarkMustNotHaveEagerFrame(); | |
| 1334 result = array_builder.AllocateEmptyArray(); | |
| 1335 break; | |
| 1336 case SINGLE: | |
| 1337 result = BuildArraySingleArgumentConstructor(&array_builder); | |
| 1338 break; | |
| 1339 case MULTIPLE: | |
| 1340 result = BuildArrayNArgumentsConstructor(&array_builder, kind); | |
| 1341 break; | |
| 1342 } | |
| 1343 return result; | |
| 1344 } | |
| 1345 | |
| 1346 | |
| 1347 HValue* CodeStubGraphBuilderBase::BuildArraySingleArgumentConstructor( | 1304 HValue* CodeStubGraphBuilderBase::BuildArraySingleArgumentConstructor( |
| 1348 JSArrayBuilder* array_builder) { | 1305 JSArrayBuilder* array_builder) { |
| 1349 // Smi check and range check on the input arg. | 1306 // Smi check and range check on the input arg. |
| 1350 HValue* constant_one = graph()->GetConstant1(); | 1307 HValue* constant_one = graph()->GetConstant1(); |
| 1351 HValue* constant_zero = graph()->GetConstant0(); | 1308 HValue* constant_zero = graph()->GetConstant0(); |
| 1352 | 1309 |
| 1353 HInstruction* elements = Add<HArgumentsElements>(false); | 1310 HInstruction* elements = Add<HArgumentsElements>(false); |
| 1354 HInstruction* argument = Add<HAccessArgumentsAt>( | 1311 HInstruction* argument = Add<HAccessArgumentsAt>( |
| 1355 elements, constant_one, constant_zero); | 1312 elements, constant_one, constant_zero); |
| 1356 | 1313 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1396 HInstruction* argument = Add<HAccessArgumentsAt>( | 1353 HInstruction* argument = Add<HAccessArgumentsAt>( |
| 1397 argument_elements, checked_length, key); | 1354 argument_elements, checked_length, key); |
| 1398 | 1355 |
| 1399 Add<HStoreKeyed>(elements, key, argument, nullptr, kind); | 1356 Add<HStoreKeyed>(elements, key, argument, nullptr, kind); |
| 1400 builder.EndBody(); | 1357 builder.EndBody(); |
| 1401 return new_object; | 1358 return new_object; |
| 1402 } | 1359 } |
| 1403 | 1360 |
| 1404 | 1361 |
| 1405 template <> | 1362 template <> |
| 1406 HValue* CodeStubGraphBuilder<ArrayNoArgumentConstructorStub>::BuildCodeStub() { | |
| 1407 ElementsKind kind = casted_stub()->elements_kind(); | |
| 1408 AllocationSiteOverrideMode override_mode = casted_stub()->override_mode(); | |
| 1409 return BuildArrayConstructor(kind, override_mode, NONE); | |
| 1410 } | |
| 1411 | |
| 1412 template <> | |
| 1413 HValue* CodeStubGraphBuilder<ArraySingleArgumentConstructorStub>:: | |
| 1414 BuildCodeStub() { | |
| 1415 ElementsKind kind = casted_stub()->elements_kind(); | |
| 1416 AllocationSiteOverrideMode override_mode = casted_stub()->override_mode(); | |
| 1417 return BuildArrayConstructor(kind, override_mode, SINGLE); | |
| 1418 } | |
| 1419 | |
| 1420 | |
| 1421 Handle<Code> ArraySingleArgumentConstructorStub::GenerateCode() { | |
| 1422 return DoGenerateCode(this); | |
| 1423 } | |
| 1424 | |
| 1425 | |
| 1426 template <> | |
| 1427 HValue* CodeStubGraphBuilder<ArrayNArgumentsConstructorStub>::BuildCodeStub() { | 1363 HValue* CodeStubGraphBuilder<ArrayNArgumentsConstructorStub>::BuildCodeStub() { |
| 1428 ElementsKind kind = casted_stub()->elements_kind(); | 1364 ElementsKind kind = casted_stub()->elements_kind(); |
| 1429 AllocationSiteOverrideMode override_mode = casted_stub()->override_mode(); | 1365 AllocationSiteOverrideMode override_mode = casted_stub()->override_mode(); |
| 1430 return BuildArrayConstructor(kind, override_mode, MULTIPLE); | 1366 return BuildArrayConstructor(kind, override_mode); |
| 1431 } | 1367 } |
| 1432 | 1368 |
| 1433 | 1369 |
| 1434 Handle<Code> ArrayNArgumentsConstructorStub::GenerateCode() { | 1370 Handle<Code> ArrayNArgumentsConstructorStub::GenerateCode() { |
| 1435 return DoGenerateCode(this); | 1371 return DoGenerateCode(this); |
| 1436 } | 1372 } |
| 1437 | 1373 |
| 1438 | 1374 |
| 1439 template <> | 1375 template <> |
| 1440 HValue* CodeStubGraphBuilder<InternalArrayNoArgumentConstructorStub>:: | |
| 1441 BuildCodeStub() { | |
| 1442 ElementsKind kind = casted_stub()->elements_kind(); | |
| 1443 return BuildInternalArrayConstructor(kind, NONE); | |
| 1444 } | |
| 1445 | |
| 1446 | |
| 1447 template <> | |
| 1448 HValue* CodeStubGraphBuilder<InternalArraySingleArgumentConstructorStub>:: | |
| 1449 BuildCodeStub() { | |
| 1450 ElementsKind kind = casted_stub()->elements_kind(); | |
| 1451 return BuildInternalArrayConstructor(kind, SINGLE); | |
| 1452 } | |
| 1453 | |
| 1454 | |
| 1455 Handle<Code> InternalArraySingleArgumentConstructorStub::GenerateCode() { | |
| 1456 return DoGenerateCode(this); | |
| 1457 } | |
| 1458 | |
| 1459 | |
| 1460 template <> | |
| 1461 HValue* CodeStubGraphBuilder<InternalArrayNArgumentsConstructorStub>:: | 1376 HValue* CodeStubGraphBuilder<InternalArrayNArgumentsConstructorStub>:: |
| 1462 BuildCodeStub() { | 1377 BuildCodeStub() { |
| 1463 ElementsKind kind = casted_stub()->elements_kind(); | 1378 ElementsKind kind = casted_stub()->elements_kind(); |
| 1464 return BuildInternalArrayConstructor(kind, MULTIPLE); | 1379 return BuildInternalArrayConstructor(kind); |
| 1465 } | 1380 } |
| 1466 | 1381 |
| 1467 | 1382 |
| 1468 Handle<Code> InternalArrayNArgumentsConstructorStub::GenerateCode() { | 1383 Handle<Code> InternalArrayNArgumentsConstructorStub::GenerateCode() { |
| 1469 return DoGenerateCode(this); | 1384 return DoGenerateCode(this); |
| 1470 } | 1385 } |
| 1471 | 1386 |
| 1472 | 1387 |
| 1473 template <> | 1388 template <> |
| 1474 HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { | 1389 HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { |
| (...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2274 return Pop(); | 2189 return Pop(); |
| 2275 } | 2190 } |
| 2276 | 2191 |
| 2277 | 2192 |
| 2278 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 2193 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
| 2279 return DoGenerateCode(this); | 2194 return DoGenerateCode(this); |
| 2280 } | 2195 } |
| 2281 | 2196 |
| 2282 } // namespace internal | 2197 } // namespace internal |
| 2283 } // namespace v8 | 2198 } // namespace v8 |
| OLD | NEW |