Revision: 3874 Author: [email protected] Date: Tue Feb 16 06:13:21 2010 Log: Port keyed interceptor stubs to ARM and x64.
Review URL: http://codereview.chromium.org/600123 http://code.google.com/p/v8/source/detail?r=3874 Modified: /branches/bleeding_edge/src/arm/ic-arm.cc /branches/bleeding_edge/src/x64/ic-x64.cc ======================================= --- /branches/bleeding_edge/src/arm/ic-arm.cc Mon Feb 15 04:26:07 2010 +++ /branches/bleeding_edge/src/arm/ic-arm.cc Tue Feb 16 06:13:21 2010 @@ -559,17 +559,11 @@ // 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 @@ __ 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::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); } ======================================= --- /branches/bleeding_edge/src/x64/ic-x64.cc Fri Feb 12 06:21:18 2010 +++ /branches/bleeding_edge/src/x64/ic-x64.cc Tue Feb 16 06:13:21 2010 @@ -574,7 +574,45 @@ 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); } -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
