| Index: src/ic/x64/ic-x64.cc
|
| diff --git a/src/ic/x64/ic-x64.cc b/src/ic/x64/ic-x64.cc
|
| index f125322645ceaf6a565f80187a6a86d51ea926c7..a95e135bb522859542dc6a2c35df6f65c1ee2d9d 100644
|
| --- a/src/ic/x64/ic-x64.cc
|
| +++ b/src/ic/x64/ic-x64.cc
|
| @@ -403,6 +403,49 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| +void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
|
| + // Return address is on the stack.
|
| + Label slow;
|
| +
|
| + Register receiver = LoadDescriptor::ReceiverRegister();
|
| + Register key = LoadDescriptor::NameRegister();
|
| + Register scratch = rax;
|
| + DCHECK(!scratch.is(receiver) && !scratch.is(key));
|
| +
|
| + // Check that the receiver isn't a smi.
|
| + __ JumpIfSmi(receiver, &slow);
|
| +
|
| + // Check that the key is an array index, that is Uint32.
|
| + STATIC_ASSERT(kSmiValueSize <= 32);
|
| + __ JumpUnlessNonNegativeSmi(key, &slow);
|
| +
|
| + // Get the map of the receiver.
|
| + __ movp(scratch, FieldOperand(receiver, HeapObject::kMapOffset));
|
| +
|
| + // Check that it has indexed interceptor and access checks
|
| + // are not enabled for this object.
|
| + __ movb(scratch, FieldOperand(scratch, Map::kBitFieldOffset));
|
| + __ andb(scratch, Immediate(kSlowCaseBitFieldMask));
|
| + __ cmpb(scratch, Immediate(1 << Map::kHasIndexedInterceptor));
|
| + __ j(not_zero, &slow);
|
| +
|
| + // Everything is fine, call runtime.
|
| + __ PopReturnAddressTo(scratch);
|
| + __ Push(receiver); // receiver
|
| + __ Push(key); // key
|
| + __ PushReturnAddressFrom(scratch);
|
| +
|
| + // Perform tail call to the entry.
|
| + __ TailCallExternalReference(
|
| + ExternalReference(IC_Utility(IC::kLoadElementWithInterceptor),
|
| + masm->isolate()),
|
| + 2, 1);
|
| +
|
| + __ bind(&slow);
|
| + GenerateMiss(masm);
|
| +}
|
| +
|
| +
|
| static void KeyedStoreGenerateMegamorphicHelper(
|
| MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow,
|
| KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length) {
|
|
|