X87: Convert KeyedLoad indexed interceptor case to a Handler.

port r24042.

original commit message:

  Convert KeyedLoad indexed interceptor case to a Handler.

  Currently, KeyedLoads on objects with indexed interceptors are handled with a
  special stub. Instead, key on the map and handler mechanism for more uniform
  treatment.

BUG=
R=weiliang.lin@intel.com

Review URL: https://codereview.chromium.org/581273005

Patch from Jing Bao <jing.bao@intel.com>.

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24063 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent bf187385
...@@ -505,48 +505,6 @@ void KeyedLoadIC::GenerateString(MacroAssembler* masm) { ...@@ -505,48 +505,6 @@ void KeyedLoadIC::GenerateString(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 = eax;
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.
__ test(key, Immediate(kSmiTagMask | kSmiSignMask));
__ j(not_zero, &slow);
// Get the map of the receiver.
__ mov(scratch, FieldOperand(receiver, HeapObject::kMapOffset));
// Check that it has indexed interceptor and access checks
// are not enabled for this object.
__ movzx_b(scratch, FieldOperand(scratch, Map::kBitFieldOffset));
__ and_(scratch, Immediate(kSlowCaseBitFieldMask));
__ cmp(scratch, Immediate(1 << Map::kHasIndexedInterceptor));
__ j(not_zero, &slow);
// Everything is fine, call runtime.
__ pop(scratch);
__ push(receiver); // receiver
__ push(key); // key
__ push(scratch); // return address
// Perform tail call to the entry.
ExternalReference ref = ExternalReference(
IC_Utility(kLoadElementWithInterceptor), masm->isolate());
__ TailCallExternalReference(ref, 2, 1);
__ bind(&slow);
GenerateMiss(masm);
}
void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) { void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) {
// The return address is on the stack. // The return address is on the stack.
Register receiver = LoadDescriptor::ReceiverRegister(); Register receiver = LoadDescriptor::ReceiverRegister();
......
...@@ -331,6 +331,36 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) { ...@@ -331,6 +331,36 @@ void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
} }
void LoadIndexedInterceptorStub::Generate(MacroAssembler* masm) {
// Return address is on the stack.
Label slow;
Register receiver = LoadDescriptor::ReceiverRegister();
Register key = LoadDescriptor::NameRegister();
Register scratch = eax;
DCHECK(!scratch.is(receiver) && !scratch.is(key));
// Check that the key is an array index, that is Uint32.
__ test(key, Immediate(kSmiTagMask | kSmiSignMask));
__ j(not_zero, &slow);
// Everything is fine, call runtime.
__ pop(scratch);
__ push(receiver); // receiver
__ push(key); // key
__ push(scratch); // return address
// Perform tail call to the entry.
ExternalReference ref = ExternalReference(
IC_Utility(IC::kLoadElementWithInterceptor), masm->isolate());
__ TailCallExternalReference(ref, 2, 1);
__ bind(&slow);
PropertyAccessCompiler::TailCallBuiltin(
masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC));
}
void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
// The key is in edx and the parameter count is in eax. // The key is in edx and the parameter count is in eax.
DCHECK(edx.is(ArgumentsAccessReadDescriptor::index())); DCHECK(edx.is(ArgumentsAccessReadDescriptor::index()));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment