| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 if (!pointer->is_set()) { | 596 if (!pointer->is_set()) { |
| 597 HConstant* constant = | 597 HConstant* constant = |
| 598 new(zone()) HConstant(value, Representation::Integer32()); | 598 new(zone()) HConstant(value, Representation::Integer32()); |
| 599 constant->InsertAfter(GetConstantUndefined()); | 599 constant->InsertAfter(GetConstantUndefined()); |
| 600 pointer->set(constant); | 600 pointer->set(constant); |
| 601 } | 601 } |
| 602 return pointer->get(); | 602 return pointer->get(); |
| 603 } | 603 } |
| 604 | 604 |
| 605 | 605 |
| 606 HConstant* HGraph::GetConstantSmi(SetOncePointer<HConstant>* pointer, | |
| 607 int32_t value) { | |
| 608 if (!pointer->is_set()) { | |
| 609 HConstant* constant = | |
| 610 new(zone()) HConstant(Handle<Object>(Smi::FromInt(value), isolate()), | |
| 611 Representation::Tagged()); | |
| 612 constant->InsertAfter(GetConstantUndefined()); | |
| 613 pointer->set(constant); | |
| 614 } | |
| 615 return pointer->get(); | |
| 616 } | |
| 617 | |
| 618 | |
| 619 HConstant* HGraph::GetConstant0() { | 606 HConstant* HGraph::GetConstant0() { |
| 620 return GetConstantInt32(&constant_0_, 0); | 607 return GetConstantInt32(&constant_0_, 0); |
| 621 } | 608 } |
| 622 | 609 |
| 623 | 610 |
| 624 HConstant* HGraph::GetConstant1() { | 611 HConstant* HGraph::GetConstant1() { |
| 625 return GetConstantInt32(&constant_1_, 1); | 612 return GetConstantInt32(&constant_1_, 1); |
| 626 } | 613 } |
| 627 | 614 |
| 628 | 615 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 648 return constant_##name##_.get(); \ | 635 return constant_##name##_.get(); \ |
| 649 } | 636 } |
| 650 | 637 |
| 651 | 638 |
| 652 DEFINE_GET_CONSTANT(True, true, HType::Boolean(), true) | 639 DEFINE_GET_CONSTANT(True, true, HType::Boolean(), true) |
| 653 DEFINE_GET_CONSTANT(False, false, HType::Boolean(), false) | 640 DEFINE_GET_CONSTANT(False, false, HType::Boolean(), false) |
| 654 DEFINE_GET_CONSTANT(Hole, the_hole, HType::Tagged(), false) | 641 DEFINE_GET_CONSTANT(Hole, the_hole, HType::Tagged(), false) |
| 655 DEFINE_GET_CONSTANT(Null, null, HType::Tagged(), false) | 642 DEFINE_GET_CONSTANT(Null, null, HType::Tagged(), false) |
| 656 | 643 |
| 657 | 644 |
| 658 HConstant* HGraph::GetConstantSmi0() { | |
| 659 return GetConstantSmi(&constant_smi_0_, 0); | |
| 660 } | |
| 661 | |
| 662 | |
| 663 HConstant* HGraph::GetConstantSmi1() { | |
| 664 return GetConstantSmi(&constant_smi_1_, 1); | |
| 665 } | |
| 666 | |
| 667 | |
| 668 #undef DEFINE_GET_CONSTANT | 645 #undef DEFINE_GET_CONSTANT |
| 669 | 646 |
| 670 | 647 |
| 671 HConstant* HGraph::GetInvalidContext() { | 648 HConstant* HGraph::GetInvalidContext() { |
| 672 return GetConstantInt32(&constant_invalid_context_, 0xFFFFC0C7); | 649 return GetConstantInt32(&constant_invalid_context_, 0xFFFFC0C7); |
| 673 } | 650 } |
| 674 | 651 |
| 675 | 652 |
| 676 HGraphBuilder::IfBuilder::IfBuilder(HGraphBuilder* builder, int position) | 653 HGraphBuilder::IfBuilder::IfBuilder(HGraphBuilder* builder, int position) |
| 677 : builder_(builder), | 654 : builder_(builder), |
| (...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 HConstant* constant_to = HConstant::cast(to); | 1532 HConstant* constant_to = HConstant::cast(to); |
| 1556 | 1533 |
| 1557 if (constant_from->HasInteger32Value() && | 1534 if (constant_from->HasInteger32Value() && |
| 1558 constant_from->Integer32Value() == 0 && | 1535 constant_from->Integer32Value() == 0 && |
| 1559 constant_to->HasInteger32Value() && | 1536 constant_to->HasInteger32Value() && |
| 1560 constant_to->Integer32Value() == initial_capacity) { | 1537 constant_to->Integer32Value() == initial_capacity) { |
| 1561 unfold_loop = true; | 1538 unfold_loop = true; |
| 1562 } | 1539 } |
| 1563 } | 1540 } |
| 1564 | 1541 |
| 1542 // Since we're about to store a hole value, the store instruction below must |
| 1543 // assume an elements kind that supports heap object values. |
| 1544 if (IsFastSmiOrObjectElementsKind(elements_kind)) { |
| 1545 elements_kind = FAST_HOLEY_ELEMENTS; |
| 1546 } |
| 1547 |
| 1565 if (unfold_loop) { | 1548 if (unfold_loop) { |
| 1566 for (int i = 0; i < initial_capacity; i++) { | 1549 for (int i = 0; i < initial_capacity; i++) { |
| 1567 HInstruction* key = AddInstruction(new(zone) | 1550 HInstruction* key = AddInstruction(new(zone) |
| 1568 HConstant(i, Representation::Integer32())); | 1551 HConstant(i, Representation::Integer32())); |
| 1569 AddInstruction(new(zone) HStoreKeyed(elements, key, hole, elements_kind)); | 1552 AddInstruction(new(zone) HStoreKeyed(elements, key, hole, elements_kind)); |
| 1570 } | 1553 } |
| 1571 } else { | 1554 } else { |
| 1572 LoopBuilder builder(this, context, LoopBuilder::kPostIncrement); | 1555 LoopBuilder builder(this, context, LoopBuilder::kPostIncrement); |
| 1573 | 1556 |
| 1574 HValue* key = builder.BeginBody(from, to, Token::LT); | 1557 HValue* key = builder.BeginBody(from, to, Token::LT); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1601 | 1584 |
| 1602 LoopBuilder builder(this, context, LoopBuilder::kPostIncrement); | 1585 LoopBuilder builder(this, context, LoopBuilder::kPostIncrement); |
| 1603 | 1586 |
| 1604 HValue* key = builder.BeginBody(graph()->GetConstant0(), length, Token::LT); | 1587 HValue* key = builder.BeginBody(graph()->GetConstant0(), length, Token::LT); |
| 1605 | 1588 |
| 1606 HValue* element = | 1589 HValue* element = |
| 1607 AddInstruction(new(zone()) HLoadKeyed(from_elements, key, NULL, | 1590 AddInstruction(new(zone()) HLoadKeyed(from_elements, key, NULL, |
| 1608 from_elements_kind, | 1591 from_elements_kind, |
| 1609 ALLOW_RETURN_HOLE)); | 1592 ALLOW_RETURN_HOLE)); |
| 1610 | 1593 |
| 1611 AddInstruction(new(zone()) HStoreKeyed(to_elements, key, element, | 1594 ElementsKind holey_kind = IsFastSmiElementsKind(to_elements_kind) |
| 1612 to_elements_kind)); | 1595 ? FAST_HOLEY_ELEMENTS : to_elements_kind; |
| 1596 HInstruction* holey_store = AddInstruction( |
| 1597 new(zone()) HStoreKeyed(to_elements, key, element, holey_kind)); |
| 1598 holey_store->ClearFlag(HValue::kDeoptimizeOnUndefined); |
| 1613 | 1599 |
| 1614 builder.EndBody(); | 1600 builder.EndBody(); |
| 1615 | 1601 |
| 1616 if (!pre_fill_with_holes && length != capacity) { | 1602 if (!pre_fill_with_holes && length != capacity) { |
| 1617 // Fill unused capacity with the hole. | 1603 // Fill unused capacity with the hole. |
| 1618 BuildFillElementsWithHole(context, to_elements, to_elements_kind, | 1604 BuildFillElementsWithHole(context, to_elements, to_elements_kind, |
| 1619 key, capacity); | 1605 key, capacity); |
| 1620 } | 1606 } |
| 1621 } | 1607 } |
| 1622 | 1608 |
| (...skipping 10734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12357 } | 12343 } |
| 12358 } | 12344 } |
| 12359 | 12345 |
| 12360 #ifdef DEBUG | 12346 #ifdef DEBUG |
| 12361 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 12347 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
| 12362 if (allocator_ != NULL) allocator_->Verify(); | 12348 if (allocator_ != NULL) allocator_->Verify(); |
| 12363 #endif | 12349 #endif |
| 12364 } | 12350 } |
| 12365 | 12351 |
| 12366 } } // namespace v8::internal | 12352 } } // namespace v8::internal |
| OLD | NEW |