| Index: src/type-feedback-vector.cc
|
| diff --git a/src/type-feedback-vector.cc b/src/type-feedback-vector.cc
|
| index e21ad93ba6dfff57abe0111222f679598ea88664..e0e6e95a14b9f3e603034b470affbefaf5262e9d 100644
|
| --- a/src/type-feedback-vector.cc
|
| +++ b/src/type-feedback-vector.cc
|
| @@ -202,6 +202,10 @@ const char* TypeFeedbackMetadata::Kind2String(FeedbackVectorSlotKind kind) {
|
| return "STORE_IC";
|
| case FeedbackVectorSlotKind::KEYED_STORE_IC:
|
| return "KEYED_STORE_IC";
|
| + case FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC:
|
| + return "INTERPRETER_BINARYOP_IC";
|
| + case FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC:
|
| + return "INTERPRETER_COMPARE_IC";
|
| case FeedbackVectorSlotKind::GENERAL:
|
| return "STUB";
|
| case FeedbackVectorSlotKind::KINDS_NUMBER:
|
| @@ -252,6 +256,9 @@ Handle<TypeFeedbackVector> TypeFeedbackVector::New(
|
| Object* value;
|
| if (kind == FeedbackVectorSlotKind::LOAD_GLOBAL_IC) {
|
| value = *factory->empty_weak_cell();
|
| + } else if (kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC ||
|
| + kind == FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC) {
|
| + value = Smi::FromInt(0);
|
| } else {
|
| value = *uninitialized_sentinel;
|
| }
|
| @@ -339,6 +346,13 @@ void TypeFeedbackVector::ClearSlotsImpl(SharedFunctionInfo* shared,
|
| nexus.Clear(shared->code());
|
| break;
|
| }
|
| + case FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC:
|
| + case FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC: {
|
| + DCHECK(Get(slot)->IsSmi());
|
| + // don't clear these smi slots.
|
| + // Set(slot, Smi::FromInt(0));
|
| + break;
|
| + }
|
| case FeedbackVectorSlotKind::GENERAL: {
|
| if (obj->IsHeapObject()) {
|
| InstanceType instance_type =
|
| @@ -1037,5 +1051,38 @@ IcCheckType KeyedStoreICNexus::GetKeyType() const {
|
| }
|
| return IsPropertyNameFeedback(feedback) ? PROPERTY : ELEMENT;
|
| }
|
| +
|
| +InlineCacheState BinaryOpICNexus::StateFromFeedback() const {
|
| + BinaryOperationHint hint = GetBinaryOperationFeedback();
|
| + if (hint == BinaryOperationHint::kNone) {
|
| + return UNINITIALIZED;
|
| + } else if (hint == BinaryOperationHint::kAny) {
|
| + return GENERIC;
|
| + }
|
| +
|
| + return MONOMORPHIC;
|
| +}
|
| +
|
| +InlineCacheState CompareICNexus::StateFromFeedback() const {
|
| + CompareOperationHint hint = GetCompareOperationFeedback();
|
| + if (hint == CompareOperationHint::kNone) {
|
| + return UNINITIALIZED;
|
| + } else if (hint == CompareOperationHint::kAny) {
|
| + return GENERIC;
|
| + }
|
| +
|
| + return MONOMORPHIC;
|
| +}
|
| +
|
| +BinaryOperationHint BinaryOpICNexus::GetBinaryOperationFeedback() const {
|
| + int feedback = Smi::cast(GetFeedback())->value();
|
| + return BinaryOperationHintFromFeedback(feedback);
|
| +}
|
| +
|
| +CompareOperationHint CompareICNexus::GetCompareOperationFeedback() const {
|
| + int feedback = Smi::cast(GetFeedback())->value();
|
| + return CompareOperationHintFromFeedback(feedback);
|
| +}
|
| +
|
| } // namespace internal
|
| } // namespace v8
|
|
|