Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: src/hydrogen-instructions.cc

Issue 19562003: Add support for IncrementCounter in Hydrogen. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add ExternalMemory portion Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 Verify(); 441 Verify();
442 #endif 442 #endif
443 return may_overflow; 443 return may_overflow;
444 } 444 }
445 445
446 446
447 const char* HType::ToString() { 447 const char* HType::ToString() {
448 // Note: The c1visualizer syntax for locals allows only a sequence of the 448 // Note: The c1visualizer syntax for locals allows only a sequence of the
449 // following characters: A-Za-z0-9_-|: 449 // following characters: A-Za-z0-9_-|:
450 switch (type_) { 450 switch (type_) {
451 case kNone: return "none";
451 case kTagged: return "tagged"; 452 case kTagged: return "tagged";
452 case kTaggedPrimitive: return "primitive"; 453 case kTaggedPrimitive: return "primitive";
453 case kTaggedNumber: return "number"; 454 case kTaggedNumber: return "number";
454 case kSmi: return "smi"; 455 case kSmi: return "smi";
455 case kHeapNumber: return "heap-number"; 456 case kHeapNumber: return "heap-number";
456 case kString: return "string"; 457 case kString: return "string";
457 case kBoolean: return "boolean"; 458 case kBoolean: return "boolean";
458 case kNonPrimitive: return "non-primitive"; 459 case kNonPrimitive: return "non-primitive";
459 case kJSArray: return "array"; 460 case kJSArray: return "array";
460 case kJSObject: return "object"; 461 case kJSObject: return "object";
(...skipping 2179 matching lines...) Expand 10 before | Expand all | Expand 10 after
2640 return BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(value); 2641 return BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(value);
2641 } 2642 }
2642 2643
2643 2644
2644 HConstant::HConstant(Handle<Object> handle, Representation r) 2645 HConstant::HConstant(Handle<Object> handle, Representation r)
2645 : handle_(handle), 2646 : handle_(handle),
2646 unique_id_(), 2647 unique_id_(),
2647 has_smi_value_(false), 2648 has_smi_value_(false),
2648 has_int32_value_(false), 2649 has_int32_value_(false),
2649 has_double_value_(false), 2650 has_double_value_(false),
2651 has_external_value_(false),
2650 is_internalized_string_(false), 2652 is_internalized_string_(false),
2651 is_not_in_new_space_(true), 2653 is_not_in_new_space_(true),
2652 is_cell_(false), 2654 is_cell_(false),
2653 boolean_value_(handle->BooleanValue()) { 2655 boolean_value_(handle->BooleanValue()) {
2654 if (handle_->IsHeapObject()) { 2656 if (handle_->IsHeapObject()) {
2655 Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap(); 2657 Heap* heap = Handle<HeapObject>::cast(handle)->GetHeap();
2656 is_not_in_new_space_ = !heap->InNewSpace(*handle); 2658 is_not_in_new_space_ = !heap->InNewSpace(*handle);
2657 } 2659 }
2658 if (handle_->IsNumber()) { 2660 if (handle_->IsNumber()) {
2659 double n = handle_->Number(); 2661 double n = handle_->Number();
(...skipping 14 matching lines...) Expand all
2674 2676
2675 2677
2676 HConstant::HConstant(Handle<Object> handle, 2678 HConstant::HConstant(Handle<Object> handle,
2677 UniqueValueId unique_id, 2679 UniqueValueId unique_id,
2678 Representation r, 2680 Representation r,
2679 HType type, 2681 HType type,
2680 bool is_internalize_string, 2682 bool is_internalize_string,
2681 bool is_not_in_new_space, 2683 bool is_not_in_new_space,
2682 bool is_cell, 2684 bool is_cell,
2683 bool boolean_value) 2685 bool boolean_value)
2684 : handle_(handle), 2686 : handle_(handle),
2685 unique_id_(unique_id), 2687 unique_id_(unique_id),
2686 has_smi_value_(false), 2688 has_smi_value_(false),
2687 has_int32_value_(false), 2689 has_int32_value_(false),
2688 has_double_value_(false), 2690 has_double_value_(false),
2689 is_internalized_string_(is_internalize_string), 2691 has_external_value_(false),
2690 is_not_in_new_space_(is_not_in_new_space), 2692 is_internalized_string_(is_internalize_string),
2691 is_cell_(is_cell), 2693 is_not_in_new_space_(is_not_in_new_space),
2692 boolean_value_(boolean_value), 2694 is_cell_(is_cell),
2693 type_from_value_(type) { 2695 boolean_value_(boolean_value),
2696 type_from_value_(type) {
2694 ASSERT(!handle.is_null()); 2697 ASSERT(!handle.is_null());
2695 ASSERT(!type.IsUninitialized()); 2698 ASSERT(!type.IsUninitialized());
2696 ASSERT(!type.IsTaggedNumber()); 2699 ASSERT(!type.IsTaggedNumber());
2697 Initialize(r); 2700 Initialize(r);
2698 } 2701 }
2699 2702
2700 2703
2701 HConstant::HConstant(int32_t integer_value, 2704 HConstant::HConstant(int32_t integer_value,
2702 Representation r, 2705 Representation r,
2703 bool is_not_in_new_space, 2706 bool is_not_in_new_space,
2704 Handle<Object> optional_handle) 2707 Handle<Object> optional_handle)
2705 : handle_(optional_handle), 2708 : handle_(optional_handle),
2706 unique_id_(), 2709 unique_id_(),
2707 has_int32_value_(true), 2710 has_int32_value_(true),
2708 has_double_value_(true), 2711 has_double_value_(true),
2709 is_internalized_string_(false), 2712 has_external_value_(false),
2710 is_not_in_new_space_(is_not_in_new_space), 2713 is_internalized_string_(false),
2711 is_cell_(false), 2714 is_not_in_new_space_(is_not_in_new_space),
2712 boolean_value_(integer_value != 0), 2715 is_cell_(false),
2713 int32_value_(integer_value), 2716 boolean_value_(integer_value != 0),
2714 double_value_(FastI2D(integer_value)) { 2717 int32_value_(integer_value),
2718 double_value_(FastI2D(integer_value)) {
2715 has_smi_value_ = Smi::IsValid(int32_value_); 2719 has_smi_value_ = Smi::IsValid(int32_value_);
2716 Initialize(r); 2720 Initialize(r);
2717 } 2721 }
2718 2722
2719 2723
2720 HConstant::HConstant(double double_value, 2724 HConstant::HConstant(double double_value,
2721 Representation r, 2725 Representation r,
2722 bool is_not_in_new_space, 2726 bool is_not_in_new_space,
2723 Handle<Object> optional_handle) 2727 Handle<Object> optional_handle)
2724 : handle_(optional_handle), 2728 : handle_(optional_handle),
2725 unique_id_(), 2729 unique_id_(),
2726 has_int32_value_(IsInteger32(double_value)), 2730 has_int32_value_(IsInteger32(double_value)),
2727 has_double_value_(true), 2731 has_double_value_(true),
2728 is_internalized_string_(false), 2732 has_external_value_(false),
2729 is_not_in_new_space_(is_not_in_new_space), 2733 is_internalized_string_(false),
2730 is_cell_(false), 2734 is_not_in_new_space_(is_not_in_new_space),
2731 boolean_value_(double_value != 0 && !std::isnan(double_value)), 2735 is_cell_(false),
2732 int32_value_(DoubleToInt32(double_value)), 2736 boolean_value_(double_value != 0 && !std::isnan(double_value)),
2733 double_value_(double_value) { 2737 int32_value_(DoubleToInt32(double_value)),
2738 double_value_(double_value) {
2734 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_); 2739 has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_);
2735 Initialize(r); 2740 Initialize(r);
2736 } 2741 }
2737 2742
2738 2743
2744 HConstant::HConstant(ExternalReference reference, Representation r)
2745 : has_smi_value_(false),
2746 has_int32_value_(false),
2747 has_double_value_(false),
2748 has_external_value_(true),
2749 is_internalized_string_(false),
2750 is_not_in_new_space_(true),
2751 is_cell_(false),
2752 boolean_value_(true),
2753 external_value_(reference) {
2754 Initialize(r);
2755 }
2756
2757
2739 void HConstant::Initialize(Representation r) { 2758 void HConstant::Initialize(Representation r) {
2740 if (r.IsNone()) { 2759 if (r.IsNone()) {
2741 if (has_smi_value_ && kSmiValueSize == 31) { 2760 if (has_smi_value_ && kSmiValueSize == 31) {
2742 r = Representation::Smi(); 2761 r = Representation::Smi();
2743 } else if (has_int32_value_) { 2762 } else if (has_int32_value_) {
2744 r = Representation::Integer32(); 2763 r = Representation::Integer32();
2745 } else if (has_double_value_) { 2764 } else if (has_double_value_) {
2746 r = Representation::Double(); 2765 r = Representation::Double();
2766 } else if (has_external_value_) {
2767 r = Representation::External();
2747 } else { 2768 } else {
2748 r = Representation::Tagged(); 2769 r = Representation::Tagged();
2749 } 2770 }
2750 } 2771 }
2751 set_representation(r); 2772 set_representation(r);
2752 SetFlag(kUseGVN); 2773 SetFlag(kUseGVN);
2753 } 2774 }
2754 2775
2755 2776
2756 bool HConstant::EmitAtUses() { 2777 bool HConstant::EmitAtUses() {
2757 ASSERT(IsLinked()); 2778 ASSERT(IsLinked());
2758 if (block()->graph()->has_osr()) { 2779 if (block()->graph()->has_osr()) {
2759 return block()->graph()->IsStandardConstant(this); 2780 return block()->graph()->IsStandardConstant(this);
2760 } 2781 }
2761 if (IsCell()) return false; 2782 if (IsCell()) return false;
2762 if (representation().IsDouble()) return false; 2783 if (representation().IsDouble()) return false;
2763 return true; 2784 return true;
2764 } 2785 }
2765 2786
2766 2787
2767 HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const { 2788 HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const {
2768 if (r.IsSmi() && !has_smi_value_) return NULL; 2789 if (r.IsSmi() && !has_smi_value_) return NULL;
2769 if (r.IsInteger32() && !has_int32_value_) return NULL; 2790 if (r.IsInteger32() && !has_int32_value_) return NULL;
2770 if (r.IsDouble() && !has_double_value_) return NULL; 2791 if (r.IsDouble() && !has_double_value_) return NULL;
2792 if (r.IsExternal() && !has_external_value_) return NULL;
2771 if (has_int32_value_) { 2793 if (has_int32_value_) {
2772 return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, handle_); 2794 return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, handle_);
2773 } 2795 }
2774 if (has_double_value_) { 2796 if (has_double_value_) {
2775 return new(zone) HConstant(double_value_, r, is_not_in_new_space_, handle_); 2797 return new(zone) HConstant(double_value_, r, is_not_in_new_space_, handle_);
2776 } 2798 }
2799 if (has_external_value_) {
2800 return new(zone) HConstant(external_value_, r);
2801 }
2777 ASSERT(!handle_.is_null()); 2802 ASSERT(!handle_.is_null());
2778 return new(zone) HConstant(handle_, 2803 return new(zone) HConstant(handle_,
2779 unique_id_, 2804 unique_id_,
2780 r, 2805 r,
2781 type_from_value_, 2806 type_from_value_,
2782 is_internalized_string_, 2807 is_internalized_string_,
2783 is_not_in_new_space_, 2808 is_not_in_new_space_,
2784 is_cell_, 2809 is_cell_,
2785 boolean_value_); 2810 boolean_value_);
2786 } 2811 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2819 } 2844 }
2820 return Maybe<HConstant*>(res != NULL, res); 2845 return Maybe<HConstant*>(res != NULL, res);
2821 } 2846 }
2822 2847
2823 2848
2824 void HConstant::PrintDataTo(StringStream* stream) { 2849 void HConstant::PrintDataTo(StringStream* stream) {
2825 if (has_int32_value_) { 2850 if (has_int32_value_) {
2826 stream->Add("%d ", int32_value_); 2851 stream->Add("%d ", int32_value_);
2827 } else if (has_double_value_) { 2852 } else if (has_double_value_) {
2828 stream->Add("%f ", FmtElm(double_value_)); 2853 stream->Add("%f ", FmtElm(double_value_));
2854 } else if (has_external_value_) {
2855 stream->Add("%p ", reinterpret_cast<void*>(external_value_.address()));
2829 } else { 2856 } else {
2830 handle()->ShortPrint(stream); 2857 handle()->ShortPrint(stream);
2831 } 2858 }
2832 } 2859 }
2833 2860
2834 2861
2835 void HBinaryOperation::PrintDataTo(StringStream* stream) { 2862 void HBinaryOperation::PrintDataTo(StringStream* stream) {
2836 left()->PrintNameTo(stream); 2863 left()->PrintNameTo(stream);
2837 stream->Add(" "); 2864 stream->Add(" ");
2838 right()->PrintNameTo(stream); 2865 right()->PrintNameTo(stream);
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
3660 } 3687 }
3661 return result; 3688 return result;
3662 } 3689 }
3663 3690
3664 3691
3665 HType HConstant::CalculateInferredType() { 3692 HType HConstant::CalculateInferredType() {
3666 if (has_int32_value_) { 3693 if (has_int32_value_) {
3667 return Smi::IsValid(int32_value_) ? HType::Smi() : HType::HeapNumber(); 3694 return Smi::IsValid(int32_value_) ? HType::Smi() : HType::HeapNumber();
3668 } 3695 }
3669 if (has_double_value_) return HType::HeapNumber(); 3696 if (has_double_value_) return HType::HeapNumber();
3697 if (has_external_value_) return HType::None();
danno 2013/07/25 18:35:57 You should also look in HLoadExternalArrayPointer
Benedikt Meurer 2013/07/25 21:09:11 Why? It's an external pointer, shouldn't it have R
danno 2013/07/25 22:22:05 HLoadExternalArrayPointer already does return Repr
3670 ASSERT(!type_from_value_.IsUninitialized()); 3698 ASSERT(!type_from_value_.IsUninitialized());
3671 return type_from_value_; 3699 return type_from_value_;
3672 } 3700 }
3673 3701
3674 3702
3675 HType HCompareGeneric::CalculateInferredType() { 3703 HType HCompareGeneric::CalculateInferredType() {
3676 return HType::Boolean(); 3704 return HType::Boolean();
3677 } 3705 }
3678 3706
3679 3707
(...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after
4513 ? kChangesBackingStoreFields : kDependsOnBackingStoreFields); 4541 ? kChangesBackingStoreFields : kDependsOnBackingStoreFields);
4514 break; 4542 break;
4515 case kElementsPointer: 4543 case kElementsPointer:
4516 instr->SetGVNFlag(is_store 4544 instr->SetGVNFlag(is_store
4517 ? kChangesElementsPointer : kDependsOnElementsPointer); 4545 ? kChangesElementsPointer : kDependsOnElementsPointer);
4518 break; 4546 break;
4519 case kMaps: 4547 case kMaps:
4520 instr->SetGVNFlag(is_store 4548 instr->SetGVNFlag(is_store
4521 ? kChangesMaps : kDependsOnMaps); 4549 ? kChangesMaps : kDependsOnMaps);
4522 break; 4550 break;
4551 case kExternalMemory:
4552 instr->SetGVNFlag(is_store
4553 ? kChangesExternalMemory : kDependsOnExternalMemory);
4554 break;
4523 } 4555 }
4524 } 4556 }
4525 4557
4526 4558
4527 void HObjectAccess::PrintTo(StringStream* stream) { 4559 void HObjectAccess::PrintTo(StringStream* stream) {
4528 stream->Add("."); 4560 stream->Add(".");
4529 4561
4530 switch (portion()) { 4562 switch (portion()) {
4531 case kArrayLengths: 4563 case kArrayLengths:
4532 stream->Add("%length"); 4564 stream->Add("%length");
4533 break; 4565 break;
4534 case kElementsPointer: 4566 case kElementsPointer:
4535 stream->Add("%elements"); 4567 stream->Add("%elements");
4536 break; 4568 break;
4537 case kMaps: 4569 case kMaps:
4538 stream->Add("%map"); 4570 stream->Add("%map");
4539 break; 4571 break;
4540 case kDouble: // fall through 4572 case kDouble: // fall through
4541 case kInobject: 4573 case kInobject:
4542 if (!name_.is_null()) stream->Add(*String::cast(*name_)->ToCString()); 4574 if (!name_.is_null()) stream->Add(*String::cast(*name_)->ToCString());
4543 stream->Add("[in-object]"); 4575 stream->Add("[in-object]");
4544 break; 4576 break;
4545 case kBackingStore: 4577 case kBackingStore:
4546 if (!name_.is_null()) stream->Add(*String::cast(*name_)->ToCString()); 4578 if (!name_.is_null()) stream->Add(*String::cast(*name_)->ToCString());
4547 stream->Add("[backing-store]"); 4579 stream->Add("[backing-store]");
4548 break; 4580 break;
4581 case kExternalMemory:
4582 stream->Add("[external-memory]");
4583 break;
4549 } 4584 }
4550 4585
4551 stream->Add("@%d", offset()); 4586 stream->Add("@%d", offset());
4552 } 4587 }
4553 4588
4554 } } // namespace v8::internal 4589 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698