Port keyed interceptor stubs to ARM and x64.
Review URL: http://codereview.chromium.org/600123 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3874 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
fc67ad346a
commit
8bc68937a7
@ -559,17 +559,11 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
|
||||
|
||||
// Get the key and receiver object from the stack.
|
||||
__ ldm(ia, sp, r0.bit() | r1.bit());
|
||||
// Check that the key is a smi.
|
||||
__ tst(r0, Operand(kSmiTagMask));
|
||||
__ b(ne, &slow);
|
||||
__ mov(r0, Operand(r0, ASR, kSmiTagSize));
|
||||
// Check that the object isn't a smi.
|
||||
__ tst(r1, Operand(kSmiTagMask));
|
||||
__ b(eq, &slow);
|
||||
|
||||
// Check that the object isn't a smi.
|
||||
__ BranchOnSmi(r1, &slow);
|
||||
// Get the map of the receiver.
|
||||
__ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
|
||||
|
||||
// Check bit field.
|
||||
__ ldrb(r3, FieldMemOperand(r2, Map::kBitFieldOffset));
|
||||
__ tst(r3, Operand(kSlowCaseBitFieldMask));
|
||||
@ -583,6 +577,10 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) {
|
||||
__ cmp(r2, Operand(JS_OBJECT_TYPE));
|
||||
__ b(lt, &slow);
|
||||
|
||||
// Check that the key is a smi.
|
||||
__ BranchOnNotSmi(r0, &slow);
|
||||
__ mov(r0, Operand(r0, ASR, kSmiTagSize));
|
||||
|
||||
// Get the elements array of the object.
|
||||
__ ldr(r1, FieldMemOperand(r1, JSObject::kElementsOffset));
|
||||
// Check that the object is in fast mode (not dictionary).
|
||||
@ -633,7 +631,42 @@ void KeyedLoadIC::GenerateExternalArray(MacroAssembler* masm,
|
||||
|
||||
|
||||
void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
|
||||
GenerateGeneric(masm);
|
||||
// ---------- S t a t e --------------
|
||||
// -- lr : return address
|
||||
// -- sp[0] : key
|
||||
// -- sp[4] : receiver
|
||||
// -----------------------------------
|
||||
Label slow;
|
||||
|
||||
// Get the key and receiver object from the stack.
|
||||
__ ldm(ia, sp, r0.bit() | r1.bit());
|
||||
|
||||
// Check that the receiver isn't a smi.
|
||||
__ BranchOnSmi(r1, &slow);
|
||||
|
||||
// Check that the key is a smi.
|
||||
__ BranchOnNotSmi(r0, &slow);
|
||||
|
||||
// Get the map of the receiver.
|
||||
__ ldr(r2, FieldMemOperand(r1, HeapObject::kMapOffset));
|
||||
|
||||
// Check that it has indexed interceptor and access checks
|
||||
// are not enabled for this object.
|
||||
__ ldrb(r3, FieldMemOperand(r2, Map::kBitFieldOffset));
|
||||
__ and_(r3, r3, Operand(kSlowCaseBitFieldMask));
|
||||
__ cmp(r3, Operand(1 << Map::kHasIndexedInterceptor));
|
||||
__ b(ne, &slow);
|
||||
|
||||
// Everything is fine, call runtime.
|
||||
__ push(r1); // receiver
|
||||
__ push(r0); // key
|
||||
|
||||
// Perform tail call to the entry.
|
||||
__ TailCallRuntime(ExternalReference(
|
||||
IC_Utility(kKeyedLoadPropertyWithInterceptor)), 2, 1);
|
||||
|
||||
__ bind(&slow);
|
||||
GenerateMiss(masm);
|
||||
}
|
||||
|
||||
|
||||
|
@ -574,7 +574,45 @@ void KeyedLoadIC::GenerateExternalArray(MacroAssembler* masm,
|
||||
|
||||
|
||||
void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) {
|
||||
GenerateGeneric(masm);
|
||||
// ----------- S t a t e -------------
|
||||
// -- rsp[0] : return address
|
||||
// -- rsp[8] : key
|
||||
// -- rsp[16] : receiver
|
||||
// -----------------------------------
|
||||
Label slow;
|
||||
|
||||
// Load key and receiver.
|
||||
__ movq(rax, Operand(rsp, kPointerSize));
|
||||
__ movq(rcx, Operand(rsp, 2 * kPointerSize));
|
||||
|
||||
// Check that the receiver isn't a smi.
|
||||
__ JumpIfSmi(rcx, &slow);
|
||||
|
||||
// Check that the key is a smi.
|
||||
__ JumpIfNotSmi(rax, &slow);
|
||||
|
||||
// Get the map of the receiver.
|
||||
__ movq(rdx, FieldOperand(rcx, HeapObject::kMapOffset));
|
||||
|
||||
// Check that it has indexed interceptor and access checks
|
||||
// are not enabled for this object.
|
||||
__ movb(rdx, FieldOperand(rdx, Map::kBitFieldOffset));
|
||||
__ andb(rdx, Immediate(kSlowCaseBitFieldMask));
|
||||
__ cmpb(rdx, Immediate(1 << Map::kHasIndexedInterceptor));
|
||||
__ j(not_zero, &slow);
|
||||
|
||||
// Everything is fine, call runtime.
|
||||
__ pop(rdx);
|
||||
__ push(rcx); // receiver
|
||||
__ push(rax); // key
|
||||
__ push(rdx); // return address
|
||||
|
||||
// Perform tail call to the entry.
|
||||
__ TailCallRuntime(ExternalReference(
|
||||
IC_Utility(kKeyedLoadPropertyWithInterceptor)), 2, 1);
|
||||
|
||||
__ bind(&slow);
|
||||
GenerateMiss(masm);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user