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 1433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1444 int32_t entry_size = SeededNumberDictionary::kEntrySize; | 1444 int32_t entry_size = SeededNumberDictionary::kEntrySize; |
1445 raw_index = AddUncasted<HMul>(raw_index, Add<HConstant>(entry_size)); | 1445 raw_index = AddUncasted<HMul>(raw_index, Add<HConstant>(entry_size)); |
1446 raw_index->ClearFlag(HValue::kCanOverflow); | 1446 raw_index->ClearFlag(HValue::kCanOverflow); |
1447 | 1447 |
1448 int32_t base_offset = SeededNumberDictionary::kElementsStartIndex; | 1448 int32_t base_offset = SeededNumberDictionary::kElementsStartIndex; |
1449 HValue* key_index = AddUncasted<HAdd>(raw_index, Add<HConstant>(base_offset)); | 1449 HValue* key_index = AddUncasted<HAdd>(raw_index, Add<HConstant>(base_offset)); |
1450 key_index->ClearFlag(HValue::kCanOverflow); | 1450 key_index->ClearFlag(HValue::kCanOverflow); |
1451 | 1451 |
1452 HValue* candidate_key = Add<HLoadKeyed>(elements, key_index, | 1452 HValue* candidate_key = Add<HLoadKeyed>(elements, key_index, |
1453 static_cast<HValue*>(NULL), | 1453 static_cast<HValue*>(NULL), |
1454 FAST_SMI_ELEMENTS); | 1454 FAST_ELEMENTS); |
1455 | 1455 |
1456 IfBuilder key_compare(this); | 1456 IfBuilder key_compare(this); |
1457 key_compare.IfNot<HCompareObjectEqAndBranch>(key, candidate_key); | 1457 key_compare.IfNot<HCompareObjectEqAndBranch>(key, candidate_key); |
1458 key_compare.Then(); | 1458 key_compare.Then(); |
1459 { | 1459 { |
1460 // Key at the current probe doesn't match, try at the next probe. | 1460 // Key at the current probe doesn't match, try at the next probe. |
1461 HValue* result = BuildUncheckedDictionaryElementLoadHelper( | 1461 HValue* result = BuildUncheckedDictionaryElementLoadHelper( |
1462 elements, key, hash, mask, current_probe + 1); | 1462 elements, key, hash, mask, current_probe + 1); |
1463 if (result == NULL) { | 1463 if (result == NULL) { |
1464 key_compare.Deopt("probes exhausted in keyed load dictionary lookup"); | 1464 key_compare.Deopt("probes exhausted in keyed load dictionary lookup"); |
1465 result = graph()->GetConstantUndefined(); | 1465 result = graph()->GetConstantUndefined(); |
1466 } else { | 1466 } else { |
1467 Push(result); | 1467 Push(result); |
1468 } | 1468 } |
1469 } | 1469 } |
1470 key_compare.Else(); | 1470 key_compare.Else(); |
1471 { | 1471 { |
1472 // Key at current probe matches. Details must be zero, otherwise the | 1472 // Key at current probe matches. Details must be zero, otherwise the |
1473 // dictionary element requires special handling. | 1473 // dictionary element requires special handling. |
1474 HValue* details_index = AddUncasted<HAdd>( | 1474 HValue* details_index = AddUncasted<HAdd>( |
1475 raw_index, Add<HConstant>(base_offset + 2)); | 1475 raw_index, Add<HConstant>(base_offset + 2)); |
1476 details_index->ClearFlag(HValue::kCanOverflow); | 1476 details_index->ClearFlag(HValue::kCanOverflow); |
1477 | 1477 |
1478 HValue* details = Add<HLoadKeyed>(elements, details_index, | 1478 HValue* details = Add<HLoadKeyed>(elements, details_index, |
1479 static_cast<HValue*>(NULL), | 1479 static_cast<HValue*>(NULL), |
1480 FAST_SMI_ELEMENTS); | 1480 FAST_ELEMENTS); |
1481 IfBuilder details_compare(this); | 1481 IfBuilder details_compare(this); |
1482 details_compare.If<HCompareNumericAndBranch>(details, | 1482 details_compare.If<HCompareNumericAndBranch>(details, |
1483 graph()->GetConstant0(), | 1483 graph()->GetConstant0(), |
1484 Token::NE); | 1484 Token::NE); |
1485 details_compare.ThenDeopt("keyed load dictionary element not fast case"); | 1485 details_compare.ThenDeopt("keyed load dictionary element not fast case"); |
1486 | 1486 |
1487 details_compare.Else(); | 1487 details_compare.Else(); |
1488 { | 1488 { |
1489 // Key matches and details are zero --> fast case. Load and return the | 1489 // Key matches and details are zero --> fast case. Load and return the |
1490 // value. | 1490 // value. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1540 HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoad(HValue* receiver, | 1540 HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoad(HValue* receiver, |
1541 HValue* key) { | 1541 HValue* key) { |
1542 HValue* elements = AddLoadElements(receiver); | 1542 HValue* elements = AddLoadElements(receiver); |
1543 | 1543 |
1544 HValue* hash = BuildElementIndexHash(key); | 1544 HValue* hash = BuildElementIndexHash(key); |
1545 | 1545 |
1546 HValue* capacity = Add<HLoadKeyed>( | 1546 HValue* capacity = Add<HLoadKeyed>( |
1547 elements, | 1547 elements, |
1548 Add<HConstant>(NameDictionary::kCapacityIndex), | 1548 Add<HConstant>(NameDictionary::kCapacityIndex), |
1549 static_cast<HValue*>(NULL), | 1549 static_cast<HValue*>(NULL), |
1550 FAST_SMI_ELEMENTS); | 1550 FAST_ELEMENTS); |
1551 | 1551 |
1552 HValue* mask = AddUncasted<HSub>(capacity, graph()->GetConstant1()); | 1552 HValue* mask = AddUncasted<HSub>(capacity, graph()->GetConstant1()); |
1553 mask->ChangeRepresentation(Representation::Integer32()); | 1553 mask->ChangeRepresentation(Representation::Integer32()); |
1554 mask->ClearFlag(HValue::kCanOverflow); | 1554 mask->ClearFlag(HValue::kCanOverflow); |
1555 | 1555 |
1556 return BuildUncheckedDictionaryElementLoadHelper(elements, key, | 1556 return BuildUncheckedDictionaryElementLoadHelper(elements, key, |
1557 hash, mask, 0); | 1557 hash, mask, 0); |
1558 } | 1558 } |
1559 | 1559 |
1560 | 1560 |
(...skipping 9721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11282 if (ShouldProduceTraceOutput()) { | 11282 if (ShouldProduceTraceOutput()) { |
11283 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11283 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
11284 } | 11284 } |
11285 | 11285 |
11286 #ifdef DEBUG | 11286 #ifdef DEBUG |
11287 graph_->Verify(false); // No full verify. | 11287 graph_->Verify(false); // No full verify. |
11288 #endif | 11288 #endif |
11289 } | 11289 } |
11290 | 11290 |
11291 } } // namespace v8::internal | 11291 } } // namespace v8::internal |
OLD | NEW |