default:
UNREACHABLE();
}
-
- // Generate an unreachable reference to the DEFAULT stub so that it can be
- // found at the end of this stub when clearing ICs at GC.
- if (runtime_operands_type_ != BinaryOpIC::DEFAULT) {
- GenericBinaryOpStub uninit(MinorKey(), BinaryOpIC::DEFAULT);
- __ TailCallStub(&uninit);
- }
}
case Code::STORE_IC: return StoreIC::Clear(address, target);
case Code::KEYED_STORE_IC: return KeyedStoreIC::Clear(address, target);
case Code::CALL_IC: return CallIC::Clear(address, target);
- case Code::BINARY_OP_IC: return BinaryOpIC::Clear(address, target);
+ case Code::BINARY_OP_IC: return; // Clearing these is tricky and does not
+ // make any performance difference.
default: UNREACHABLE();
}
}
}
-void BinaryOpIC::Clear(Address address, Code* target) {
- if (target->ic_state() == UNINITIALIZED) return;
-
- // At the end of a fast case stub there should be a reference to
- // a corresponding UNINITIALIZED stub, so look for the last reloc info item.
- RelocInfo* rinfo = NULL;
- for (RelocIterator it(target, RelocInfo::kCodeTargetMask);
- !it.done(); it.next()) {
- rinfo = it.rinfo();
- }
-
- ASSERT(rinfo != NULL);
- Code* uninit_stub = Code::GetCodeFromTargetAddress(rinfo->target_address());
- ASSERT(uninit_stub->ic_state() == UNINITIALIZED &&
- uninit_stub->kind() == Code::BINARY_OP_IC);
- SetTargetAtAddress(address, uninit_stub);
-}
-
-
const char* BinaryOpIC::GetName(TypeInfo type_info) {
switch (type_info) {
case DEFAULT: return "Default";
default:
UNREACHABLE();
}
-
- // TODO(kaznacheev) Remove this (along with clearing) if it does not harm
- // performance.
- // Generate an unreachable reference to the DEFAULT stub so that it can be
- // found at the end of this stub when clearing ICs at GC.
- if (runtime_operands_type_ != BinaryOpIC::DEFAULT) {
- GenericBinaryOpStub uninit(MinorKey(), BinaryOpIC::DEFAULT);
- __ TailCallStub(&uninit);
- }
}