OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 external_elements, checked_key, dependency, elements_kind); | 1097 external_elements, checked_key, dependency, elements_kind); |
1098 if (FLAG_opt_safe_uint32_operations && | 1098 if (FLAG_opt_safe_uint32_operations && |
1099 elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) { | 1099 elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
1100 graph()->RecordUint32Instruction(load); | 1100 graph()->RecordUint32Instruction(load); |
1101 } | 1101 } |
1102 return load; | 1102 return load; |
1103 } | 1103 } |
1104 } | 1104 } |
1105 | 1105 |
1106 | 1106 |
1107 HInstruction* HGraphBuilder::BuildFastElementAccess( | |
1108 HValue* elements, | |
1109 HValue* checked_key, | |
1110 HValue* val, | |
1111 HValue* load_dependency, | |
1112 ElementsKind elements_kind, | |
1113 bool is_store, | |
1114 LoadKeyedHoleMode load_mode, | |
1115 KeyedAccessStoreMode store_mode) { | |
1116 Zone* zone = this->zone(); | |
1117 if (is_store) { | |
1118 ASSERT(val != NULL); | |
1119 switch (elements_kind) { | |
1120 case FAST_SMI_ELEMENTS: | |
1121 case FAST_HOLEY_SMI_ELEMENTS: | |
1122 case FAST_ELEMENTS: | |
1123 case FAST_HOLEY_ELEMENTS: | |
1124 case FAST_DOUBLE_ELEMENTS: | |
1125 case FAST_HOLEY_DOUBLE_ELEMENTS: | |
1126 return new(zone) HStoreKeyed(elements, checked_key, val, elements_kind); | |
1127 default: | |
1128 UNREACHABLE(); | |
1129 return NULL; | |
1130 } | |
1131 } | |
1132 // It's an element load (!is_store). | |
1133 return new(zone) HLoadKeyed(elements, | |
1134 checked_key, | |
1135 load_dependency, | |
1136 elements_kind, | |
1137 load_mode); | |
1138 } | |
1139 | |
1140 | |
1141 HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, | 1107 HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, |
1142 HValue* elements, | 1108 HValue* elements, |
1143 ElementsKind kind, | 1109 ElementsKind kind, |
1144 HValue* length, | 1110 HValue* length, |
1145 HValue* key, | 1111 HValue* key, |
1146 bool is_js_array) { | 1112 bool is_js_array) { |
1147 Zone* zone = this->zone(); | 1113 Zone* zone = this->zone(); |
1148 IfBuilder length_checker(this); | 1114 IfBuilder length_checker(this); |
1149 | 1115 |
1150 Token::Value token = IsHoleyElementsKind(kind) ? Token::GTE : Token::EQ; | 1116 Token::Value token = IsHoleyElementsKind(kind) ? Token::GTE : Token::EQ; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1364 elements = BuildCopyElementsOnWrite(object, elements, elements_kind, | 1330 elements = BuildCopyElementsOnWrite(object, elements, elements_kind, |
1365 length); | 1331 length); |
1366 } else { | 1332 } else { |
1367 HCheckMaps* check_cow_map = HCheckMaps::New( | 1333 HCheckMaps* check_cow_map = HCheckMaps::New( |
1368 elements, isolate()->factory()->fixed_array_map(), zone); | 1334 elements, isolate()->factory()->fixed_array_map(), zone); |
1369 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); | 1335 check_cow_map->ClearGVNFlag(kDependsOnElementsKind); |
1370 AddInstruction(check_cow_map); | 1336 AddInstruction(check_cow_map); |
1371 } | 1337 } |
1372 } | 1338 } |
1373 } | 1339 } |
1374 return AddInstruction( | 1340 return AddFastElementAccess(elements, checked_key, val, mapcheck, |
1375 BuildFastElementAccess(elements, checked_key, val, mapcheck, | 1341 elements_kind, is_store, load_mode, store_mode); |
1376 elements_kind, is_store, load_mode, store_mode)); | |
1377 } | 1342 } |
1378 | 1343 |
1379 | 1344 |
1380 HValue* HGraphBuilder::BuildAllocateElements(HValue* context, | 1345 HValue* HGraphBuilder::BuildAllocateElements(HValue* context, |
1381 ElementsKind kind, | 1346 ElementsKind kind, |
1382 HValue* capacity) { | 1347 HValue* capacity) { |
1383 Zone* zone = this->zone(); | 1348 Zone* zone = this->zone(); |
1384 | 1349 |
1385 int elements_size = IsFastDoubleElementsKind(kind) | 1350 int elements_size = IsFastDoubleElementsKind(kind) |
1386 ? kDoubleSize : kPointerSize; | 1351 ? kDoubleSize : kPointerSize; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1463 elements_location += AllocationSiteInfo::kSize; | 1428 elements_location += AllocationSiteInfo::kSize; |
1464 } | 1429 } |
1465 | 1430 |
1466 HInnerAllocatedObject* elements = | 1431 HInnerAllocatedObject* elements = |
1467 Add<HInnerAllocatedObject>(array, elements_location); | 1432 Add<HInnerAllocatedObject>(array, elements_location); |
1468 AddStore(array, HObjectAccess::ForElementsPointer(), elements); | 1433 AddStore(array, HObjectAccess::ForElementsPointer(), elements); |
1469 return elements; | 1434 return elements; |
1470 } | 1435 } |
1471 | 1436 |
1472 | 1437 |
| 1438 HInstruction* HGraphBuilder::AddFastElementAccess( |
| 1439 HValue* elements, |
| 1440 HValue* checked_key, |
| 1441 HValue* val, |
| 1442 HValue* load_dependency, |
| 1443 ElementsKind elements_kind, |
| 1444 bool is_store, |
| 1445 LoadKeyedHoleMode load_mode, |
| 1446 KeyedAccessStoreMode store_mode) { |
| 1447 if (is_store) { |
| 1448 ASSERT(val != NULL); |
| 1449 switch (elements_kind) { |
| 1450 case FAST_SMI_ELEMENTS: |
| 1451 case FAST_HOLEY_SMI_ELEMENTS: |
| 1452 case FAST_ELEMENTS: |
| 1453 case FAST_HOLEY_ELEMENTS: |
| 1454 case FAST_DOUBLE_ELEMENTS: |
| 1455 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 1456 return Add<HStoreKeyed>(elements, checked_key, val, elements_kind); |
| 1457 default: |
| 1458 UNREACHABLE(); |
| 1459 return NULL; |
| 1460 } |
| 1461 } |
| 1462 // It's an element load (!is_store). |
| 1463 return Add<HLoadKeyed>( |
| 1464 elements, checked_key, load_dependency, elements_kind, load_mode); |
| 1465 } |
| 1466 |
| 1467 |
1473 HLoadNamedField* HGraphBuilder::AddLoadElements(HValue* object, | 1468 HLoadNamedField* HGraphBuilder::AddLoadElements(HValue* object, |
1474 HValue* typecheck) { | 1469 HValue* typecheck) { |
1475 return AddLoad(object, HObjectAccess::ForElementsPointer(), typecheck); | 1470 return AddLoad(object, HObjectAccess::ForElementsPointer(), typecheck); |
1476 } | 1471 } |
1477 | 1472 |
1478 | 1473 |
1479 HLoadNamedField* HGraphBuilder::AddLoadFixedArrayLength(HValue* object) { | 1474 HLoadNamedField* HGraphBuilder::AddLoadFixedArrayLength(HValue* object) { |
1480 HLoadNamedField* instr = AddLoad(object, HObjectAccess::ForFixedArrayLength(), | 1475 HLoadNamedField* instr = AddLoad(object, HObjectAccess::ForFixedArrayLength(), |
1481 NULL, Representation::Smi()); | 1476 NULL, Representation::Smi()); |
1482 instr->set_type(HType::Smi()); | 1477 instr->set_type(HType::Smi()); |
(...skipping 4219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5702 } | 5697 } |
5703 if (map->IsJSArray()) { | 5698 if (map->IsJSArray()) { |
5704 HInstruction* length = AddLoad(object, HObjectAccess::ForArrayLength(), | 5699 HInstruction* length = AddLoad(object, HObjectAccess::ForArrayLength(), |
5705 mapcompare, Representation::Smi()); | 5700 mapcompare, Representation::Smi()); |
5706 length->set_type(HType::Smi()); | 5701 length->set_type(HType::Smi()); |
5707 checked_key = Add<HBoundsCheck>(key, length); | 5702 checked_key = Add<HBoundsCheck>(key, length); |
5708 } else { | 5703 } else { |
5709 HInstruction* length = AddLoadFixedArrayLength(elements); | 5704 HInstruction* length = AddLoadFixedArrayLength(elements); |
5710 checked_key = Add<HBoundsCheck>(key, length); | 5705 checked_key = Add<HBoundsCheck>(key, length); |
5711 } | 5706 } |
5712 access = AddInstruction(BuildFastElementAccess( | 5707 access = AddFastElementAccess( |
5713 elements, checked_key, val, mapcompare, | 5708 elements, checked_key, val, mapcompare, |
5714 elements_kind, is_store, NEVER_RETURN_HOLE, STANDARD_STORE)); | 5709 elements_kind, is_store, NEVER_RETURN_HOLE, STANDARD_STORE); |
5715 } else if (IsDictionaryElementsKind(elements_kind)) { | 5710 } else if (IsDictionaryElementsKind(elements_kind)) { |
5716 if (is_store) { | 5711 if (is_store) { |
5717 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val)); | 5712 access = AddInstruction(BuildStoreKeyedGeneric(object, key, val)); |
5718 } else { | 5713 } else { |
5719 access = AddInstruction(BuildLoadKeyedGeneric(object, key)); | 5714 access = AddInstruction(BuildLoadKeyedGeneric(object, key)); |
5720 } | 5715 } |
5721 } else { | 5716 } else { |
5722 ASSERT(IsExternalArrayElementsKind(elements_kind)); | 5717 ASSERT(IsExternalArrayElementsKind(elements_kind)); |
5723 HInstruction* length = AddLoadFixedArrayLength(elements); | 5718 HInstruction* length = AddLoadFixedArrayLength(elements); |
5724 checked_key = Add<HBoundsCheck>(key, length); | 5719 checked_key = Add<HBoundsCheck>(key, length); |
(...skipping 4187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9912 if (ShouldProduceTraceOutput()) { | 9907 if (ShouldProduceTraceOutput()) { |
9913 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9908 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
9914 } | 9909 } |
9915 | 9910 |
9916 #ifdef DEBUG | 9911 #ifdef DEBUG |
9917 graph_->Verify(false); // No full verify. | 9912 graph_->Verify(false); // No full verify. |
9918 #endif | 9913 #endif |
9919 } | 9914 } |
9920 | 9915 |
9921 } } // namespace v8::internal | 9916 } } // namespace v8::internal |
OLD | NEW |