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

Side by Side Diff: runtime/vm/object.h

Issue 735543003: Range feedback for binary integer operations. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: ready for review Created 6 years 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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_OBJECT_H_ 5 #ifndef VM_OBJECT_H_
6 #define VM_OBJECT_H_ 6 #define VM_OBJECT_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
(...skipping 3529 matching lines...) Expand 10 before | Expand all | Expand 10 after
3540 RawArray* arguments_descriptor() const { 3540 RawArray* arguments_descriptor() const {
3541 return raw_ptr()->args_descriptor_; 3541 return raw_ptr()->args_descriptor_;
3542 } 3542 }
3543 3543
3544 intptr_t NumArgsTested() const; 3544 intptr_t NumArgsTested() const;
3545 3545
3546 intptr_t deopt_id() const { 3546 intptr_t deopt_id() const {
3547 return raw_ptr()->deopt_id_; 3547 return raw_ptr()->deopt_id_;
3548 } 3548 }
3549 3549
3550 uint32_t range_feedback() const {
3551 return raw_ptr()->range_feedback_;
3552 }
3553
3550 #define DEOPT_REASONS(V) \ 3554 #define DEOPT_REASONS(V) \
3551 V(Unknown) \ 3555 V(Unknown) \
3552 V(InstanceGetter) \ 3556 V(InstanceGetter) \
3553 V(PolymorphicInstanceCallTestFail) \ 3557 V(PolymorphicInstanceCallTestFail) \
3554 V(InstanceCallNoICData) \ 3558 V(InstanceCallNoICData) \
3555 V(IntegerToDouble) \ 3559 V(IntegerToDouble) \
3556 V(BinarySmiOp) \ 3560 V(BinarySmiOp) \
3557 V(BinaryMintOp) \ 3561 V(BinaryMintOp) \
3558 V(UnaryMintOp) \ 3562 V(UnaryMintOp) \
3559 V(ShiftMintOp) \ 3563 V(ShiftMintOp) \
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
3634 } 3638 }
3635 3639
3636 static intptr_t ic_data_offset() { 3640 static intptr_t ic_data_offset() {
3637 return OFFSET_OF(RawICData, ic_data_); 3641 return OFFSET_OF(RawICData, ic_data_);
3638 } 3642 }
3639 3643
3640 static intptr_t owner_offset() { 3644 static intptr_t owner_offset() {
3641 return OFFSET_OF(RawICData, owner_); 3645 return OFFSET_OF(RawICData, owner_);
3642 } 3646 }
3643 3647
3648 static intptr_t range_feedback_offset() {
3649 return OFFSET_OF(RawICData, range_feedback_);
3650 }
3651
3644 // Used for unoptimized static calls when no class-ids are checked. 3652 // Used for unoptimized static calls when no class-ids are checked.
3645 void AddTarget(const Function& target) const; 3653 void AddTarget(const Function& target) const;
3646 3654
3647 // Adding checks. 3655 // Adding checks.
3648 3656
3649 // Adds one more class test to ICData. Length of 'classes' must be equal to 3657 // Adds one more class test to ICData. Length of 'classes' must be equal to
3650 // the number of arguments tested. Use only for num_args_tested > 1. 3658 // the number of arguments tested. Use only for num_args_tested > 1.
3651 void AddCheck(const GrowableArray<intptr_t>& class_ids, 3659 void AddCheck(const GrowableArray<intptr_t>& class_ids,
3652 const Function& target) const; 3660 const Function& target) const;
3653 // Adds sorted so that Smi is the first class-id. Use only for 3661 // Adds sorted so that Smi is the first class-id. Use only for
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
3708 3716
3709 static intptr_t CountIndexFor(intptr_t num_args) { 3717 static intptr_t CountIndexFor(intptr_t num_args) {
3710 return (num_args + 1); 3718 return (num_args + 1);
3711 } 3719 }
3712 3720
3713 bool IsUsedAt(intptr_t i) const; 3721 bool IsUsedAt(intptr_t i) const;
3714 3722
3715 void GetUsedCidsForTwoArgs(GrowableArray<intptr_t>* first, 3723 void GetUsedCidsForTwoArgs(GrowableArray<intptr_t>* first,
3716 GrowableArray<intptr_t>* second) const; 3724 GrowableArray<intptr_t>* second) const;
3717 3725
3726 enum RangeFeedback {
3727 kSmiRange, kInt32Range, kUint32Range, kInt64Range
3728 };
3729
3730 enum {
3731 kSignBit = 1 << 0,
3732 kInt32Bit = 1 << 1,
3733 kUint32Bit = 1 << 2,
3734 kInt64Bit = 1 << 3,
3735 kBitsPerRangeFeedback = 4,
3736 kRangeFeedbackMask = (1 << kBitsPerRangeFeedback) - 1
3737 };
srdjan 2014/12/15 16:39:01 I think it would be more readable to say, e.g., kI
Vyacheslav Egorov (Google) 2014/12/15 17:20:05 Done.
3738
3739 static const char* RangeFeedbackToString(RangeFeedback feedback) {
3740 switch (feedback) {
3741 case kSmiRange:
3742 return "smi";
3743 case kInt32Range:
3744 return "int32";
3745 case kUint32Range:
3746 return "uint32";
3747 case kInt64Range:
3748 return "int64";
3749 default:
3750 UNREACHABLE();
3751 return "?";
3752 }
3753 }
3754
3755 bool HasRangeFeedback() const;
3756 RangeFeedback DecodeRangeFeedbackAt(intptr_t idx) const;
3757
3718 private: 3758 private:
3719 RawArray* ic_data() const { 3759 RawArray* ic_data() const {
3720 return raw_ptr()->ic_data_; 3760 return raw_ptr()->ic_data_;
3721 } 3761 }
3722 3762
3723 void set_owner(const Function& value) const; 3763 void set_owner(const Function& value) const;
3724 void set_target_name(const String& value) const; 3764 void set_target_name(const String& value) const;
3725 void set_arguments_descriptor(const Array& value) const; 3765 void set_arguments_descriptor(const Array& value) const;
3726 void set_deopt_id(intptr_t value) const; 3766 void set_deopt_id(intptr_t value) const;
3727 void SetNumArgsTested(intptr_t value) const; 3767 void SetNumArgsTested(intptr_t value) const;
3728 void set_ic_data(const Array& value) const; 3768 void set_ic_data(const Array& value) const;
3729 void set_state_bits(uint32_t bits) const; 3769 void set_state_bits(uint32_t bits) const;
3770 void set_range_feedback(uint32_t feedback);
3730 3771
3731 enum { 3772 enum {
3732 kNumArgsTestedPos = 0, 3773 kNumArgsTestedPos = 0,
3733 kNumArgsTestedSize = 2, 3774 kNumArgsTestedSize = 2,
3734 kDeoptReasonPos = kNumArgsTestedPos + kNumArgsTestedSize, 3775 kDeoptReasonPos = kNumArgsTestedPos + kNumArgsTestedSize,
3735 kDeoptReasonSize = kDeoptNumReasons, 3776 kDeoptReasonSize = kDeoptNumReasons,
3736 kIssuedJSWarningBit = kDeoptReasonPos + kDeoptReasonSize, 3777 kIssuedJSWarningBit = kDeoptReasonPos + kDeoptReasonSize,
3737 }; 3778 };
3738 3779
3739 class NumArgsTestedBits : public BitField<uint32_t, 3780 class NumArgsTestedBits : public BitField<uint32_t,
(...skipping 3852 matching lines...) Expand 10 before | Expand all | Expand 10 after
7592 7633
7593 7634
7594 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, 7635 RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
7595 intptr_t index) { 7636 intptr_t index) {
7596 return array.At((index * kEntryLength) + kTargetFunctionIndex); 7637 return array.At((index * kEntryLength) + kTargetFunctionIndex);
7597 } 7638 }
7598 7639
7599 } // namespace dart 7640 } // namespace dart
7600 7641
7601 #endif // VM_OBJECT_H_ 7642 #endif // VM_OBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698