| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 Isolate* isolate, | 54 Isolate* isolate, |
| 55 CodeStubInterfaceDescriptor* descriptor) { | 55 CodeStubInterfaceDescriptor* descriptor) { |
| 56 static Register registers[] = { a3, a2, a1, a0 }; | 56 static Register registers[] = { a3, a2, a1, a0 }; |
| 57 descriptor->register_param_count_ = 4; | 57 descriptor->register_param_count_ = 4; |
| 58 descriptor->register_params_ = registers; | 58 descriptor->register_params_ = registers; |
| 59 descriptor->deoptimization_handler_ = | 59 descriptor->deoptimization_handler_ = |
| 60 Runtime::FunctionForId(Runtime::kCreateObjectLiteralShallow)->entry; | 60 Runtime::FunctionForId(Runtime::kCreateObjectLiteralShallow)->entry; |
| 61 } | 61 } |
| 62 | 62 |
| 63 | 63 |
| 64 void CreateAllocationSiteStub::InitializeInterfaceDescriptor( |
| 65 Isolate* isolate, |
| 66 CodeStubInterfaceDescriptor* descriptor) { |
| 67 static Register registers[] = { a2 }; |
| 68 descriptor->register_param_count_ = 1; |
| 69 descriptor->register_params_ = registers; |
| 70 descriptor->deoptimization_handler_ = NULL; |
| 71 } |
| 72 |
| 73 |
| 64 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( | 74 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( |
| 65 Isolate* isolate, | 75 Isolate* isolate, |
| 66 CodeStubInterfaceDescriptor* descriptor) { | 76 CodeStubInterfaceDescriptor* descriptor) { |
| 67 static Register registers[] = { a1, a0 }; | 77 static Register registers[] = { a1, a0 }; |
| 68 descriptor->register_param_count_ = 2; | 78 descriptor->register_param_count_ = 2; |
| 69 descriptor->register_params_ = registers; | 79 descriptor->register_params_ = registers; |
| 70 descriptor->deoptimization_handler_ = | 80 descriptor->deoptimization_handler_ = |
| 71 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); | 81 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); |
| 72 } | 82 } |
| 73 | 83 |
| (...skipping 2998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3072 } | 3082 } |
| 3073 | 3083 |
| 3074 | 3084 |
| 3075 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { | 3085 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 3076 CEntryStub::GenerateAheadOfTime(isolate); | 3086 CEntryStub::GenerateAheadOfTime(isolate); |
| 3077 WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime(isolate); | 3087 WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 3078 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); | 3088 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 3079 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); | 3089 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); |
| 3080 RecordWriteStub::GenerateFixedRegStubsAheadOfTime(isolate); | 3090 RecordWriteStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 3081 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 3091 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); |
| 3092 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 3082 } | 3093 } |
| 3083 | 3094 |
| 3084 | 3095 |
| 3085 void CodeStub::GenerateFPStubs(Isolate* isolate) { | 3096 void CodeStub::GenerateFPStubs(Isolate* isolate) { |
| 3086 SaveFPRegsMode mode = kSaveFPRegs; | 3097 SaveFPRegsMode mode = kSaveFPRegs; |
| 3087 CEntryStub save_doubles(1, mode); | 3098 CEntryStub save_doubles(1, mode); |
| 3088 StoreBufferOverflowStub stub(mode); | 3099 StoreBufferOverflowStub stub(mode); |
| 3089 // These stubs might already be in the snapshot, detect that and don't | 3100 // These stubs might already be in the snapshot, detect that and don't |
| 3090 // regenerate, which would lead to code stub initialization state being messed | 3101 // regenerate, which would lead to code stub initialization state being messed |
| 3091 // up. | 3102 // up. |
| (...skipping 1679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4771 masm->isolate()->heap()->undefined_value()); | 4782 masm->isolate()->heap()->undefined_value()); |
| 4772 ASSERT_EQ(*TypeFeedbackCells::UninitializedSentinel(masm->isolate()), | 4783 ASSERT_EQ(*TypeFeedbackCells::UninitializedSentinel(masm->isolate()), |
| 4773 masm->isolate()->heap()->the_hole_value()); | 4784 masm->isolate()->heap()->the_hole_value()); |
| 4774 | 4785 |
| 4775 // Load the cache state into a3. | 4786 // Load the cache state into a3. |
| 4776 __ lw(a3, FieldMemOperand(a2, Cell::kValueOffset)); | 4787 __ lw(a3, FieldMemOperand(a2, Cell::kValueOffset)); |
| 4777 | 4788 |
| 4778 // A monomorphic cache hit or an already megamorphic state: invoke the | 4789 // A monomorphic cache hit or an already megamorphic state: invoke the |
| 4779 // function without changing the state. | 4790 // function without changing the state. |
| 4780 __ Branch(&done, eq, a3, Operand(a1)); | 4791 __ Branch(&done, eq, a3, Operand(a1)); |
| 4781 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); | |
| 4782 __ Branch(&done, eq, a3, Operand(at)); | |
| 4783 | 4792 |
| 4784 // Special handling of the Array() function, which caches not only the | 4793 // If we came here, we need to see if we are the array function. |
| 4785 // monomorphic Array function but the initial ElementsKind with special | 4794 // If we didn't have a matching function, and we didn't find the megamorph |
| 4786 // sentinels | 4795 // sentinel, then we have in the cell either some other function or an |
| 4787 __ JumpIfNotSmi(a3, &miss); | 4796 // AllocationSite. Do a map check on the object in a3. |
| 4788 if (FLAG_debug_code) { | 4797 Handle<Map> allocation_site_map( |
| 4789 Handle<Object> terminal_kind_sentinel = | 4798 masm->isolate()->heap()->allocation_site_map(), |
| 4790 TypeFeedbackCells::MonomorphicArraySentinel(masm->isolate(), | 4799 masm->isolate()); |
| 4791 LAST_FAST_ELEMENTS_KIND); | 4800 __ lw(t1, FieldMemOperand(a3, 0)); |
| 4792 __ Assert(le, "Array function sentinel is not an ElementsKind", | 4801 __ LoadRoot(at, Heap::kAllocationSiteMapRootIndex); |
| 4793 a3, Operand(terminal_kind_sentinel)); | 4802 __ Branch(&miss, ne, t1, Operand(at)); |
| 4794 } | |
| 4795 | 4803 |
| 4796 // Make sure the function is the Array() function | 4804 // Make sure the function is the Array() function |
| 4797 __ LoadArrayFunction(a3); | 4805 __ LoadArrayFunction(a3); |
| 4798 __ Branch(&megamorphic, ne, a1, Operand(a3)); | 4806 __ Branch(&megamorphic, ne, a1, Operand(a3)); |
| 4799 __ jmp(&done); | 4807 __ jmp(&done); |
| 4800 | 4808 |
| 4801 __ bind(&miss); | 4809 __ bind(&miss); |
| 4802 | 4810 |
| 4803 // A monomorphic miss (i.e, here the cache is not uninitialized) goes | 4811 // A monomorphic miss (i.e, here the cache is not uninitialized) goes |
| 4804 // megamorphic. | 4812 // megamorphic. |
| 4805 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); | 4813 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
| 4806 __ Branch(&initialize, eq, a3, Operand(at)); | 4814 __ Branch(&initialize, eq, a3, Operand(at)); |
| 4807 // MegamorphicSentinel is an immortal immovable object (undefined) so no | 4815 // MegamorphicSentinel is an immortal immovable object (undefined) so no |
| 4808 // write-barrier is needed. | 4816 // write-barrier is needed. |
| 4809 __ bind(&megamorphic); | 4817 __ bind(&megamorphic); |
| 4810 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); | 4818 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); |
| 4811 __ sw(at, FieldMemOperand(a2, Cell::kValueOffset)); | 4819 __ sw(at, FieldMemOperand(a2, Cell::kValueOffset)); |
| 4812 __ jmp(&done); | 4820 __ jmp(&done); |
| 4813 | 4821 |
| 4814 // An uninitialized cache is patched with the function or sentinel to | 4822 // An uninitialized cache is patched with the function or sentinel to |
| 4815 // indicate the ElementsKind if function is the Array constructor. | 4823 // indicate the ElementsKind if function is the Array constructor. |
| 4816 __ bind(&initialize); | 4824 __ bind(&initialize); |
| 4817 // Make sure the function is the Array() function | 4825 // Make sure the function is the Array() function |
| 4818 __ LoadArrayFunction(a3); | 4826 __ LoadArrayFunction(a3); |
| 4819 __ Branch(¬_array_function, ne, a1, Operand(a3)); | 4827 __ Branch(¬_array_function, ne, a1, Operand(a3)); |
| 4820 | 4828 |
| 4821 // The target function is the Array constructor, install a sentinel value in | 4829 // The target function is the Array constructor. |
| 4822 // the constructor's type info cell that will track the initial ElementsKind | 4830 // Create an AllocationSite if we don't already have it, store it in the cell. |
| 4823 // that should be used for the array when its constructed. | 4831 { |
| 4824 Handle<Object> initial_kind_sentinel = | 4832 FrameScope scope(masm, StackFrame::INTERNAL); |
| 4825 TypeFeedbackCells::MonomorphicArraySentinel(masm->isolate(), | 4833 const RegList kSavedRegs = |
| 4826 GetInitialFastElementsKind()); | 4834 1 << 4 | // a0 |
| 4827 __ li(a3, Operand(initial_kind_sentinel)); | 4835 1 << 5 | // a1 |
| 4828 __ sw(a3, FieldMemOperand(a2, Cell::kValueOffset)); | 4836 1 << 6; // a2 |
| 4837 |
| 4838 __ MultiPush(kSavedRegs); |
| 4839 |
| 4840 CreateAllocationSiteStub create_stub; |
| 4841 __ CallStub(&create_stub); |
| 4842 |
| 4843 __ MultiPop(kSavedRegs); |
| 4844 } |
| 4829 __ Branch(&done); | 4845 __ Branch(&done); |
| 4830 | 4846 |
| 4831 __ bind(¬_array_function); | 4847 __ bind(¬_array_function); |
| 4832 __ sw(a1, FieldMemOperand(a2, Cell::kValueOffset)); | 4848 __ sw(a1, FieldMemOperand(a2, Cell::kValueOffset)); |
| 4833 // No need for a write barrier here - cells are rescanned. | 4849 // No need for a write barrier here - cells are rescanned. |
| 4834 | 4850 |
| 4835 __ bind(&done); | 4851 __ bind(&done); |
| 4836 } | 4852 } |
| 4837 | 4853 |
| 4838 | 4854 |
| (...skipping 2503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7342 // a0 - number of arguments | 7358 // a0 - number of arguments |
| 7343 // a1 - constructor? | 7359 // a1 - constructor? |
| 7344 // sp[0] - last argument | 7360 // sp[0] - last argument |
| 7345 ASSERT(FAST_SMI_ELEMENTS == 0); | 7361 ASSERT(FAST_SMI_ELEMENTS == 0); |
| 7346 ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); | 7362 ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
| 7347 ASSERT(FAST_ELEMENTS == 2); | 7363 ASSERT(FAST_ELEMENTS == 2); |
| 7348 ASSERT(FAST_HOLEY_ELEMENTS == 3); | 7364 ASSERT(FAST_HOLEY_ELEMENTS == 3); |
| 7349 ASSERT(FAST_DOUBLE_ELEMENTS == 4); | 7365 ASSERT(FAST_DOUBLE_ELEMENTS == 4); |
| 7350 ASSERT(FAST_HOLEY_DOUBLE_ELEMENTS == 5); | 7366 ASSERT(FAST_HOLEY_DOUBLE_ELEMENTS == 5); |
| 7351 | 7367 |
| 7352 Handle<Object> undefined_sentinel( | |
| 7353 masm->isolate()->heap()->undefined_value(), | |
| 7354 masm->isolate()); | |
| 7355 | |
| 7356 // is the low bit set? If so, we are holey and that is good. | 7368 // is the low bit set? If so, we are holey and that is good. |
| 7357 Label normal_sequence; | 7369 Label normal_sequence; |
| 7358 __ And(at, a3, Operand(1)); | 7370 __ And(at, a3, Operand(1)); |
| 7359 __ Branch(&normal_sequence, ne, at, Operand(zero_reg)); | 7371 __ Branch(&normal_sequence, ne, at, Operand(zero_reg)); |
| 7360 | 7372 |
| 7361 // look at the first argument | 7373 // look at the first argument |
| 7362 __ lw(t1, MemOperand(sp, 0)); | 7374 __ lw(t1, MemOperand(sp, 0)); |
| 7363 __ Branch(&normal_sequence, eq, t1, Operand(zero_reg)); | 7375 __ Branch(&normal_sequence, eq, t1, Operand(zero_reg)); |
| 7364 | 7376 |
| 7365 // We are going to create a holey array, but our kind is non-holey. | 7377 // We are going to create a holey array, but our kind is non-holey. |
| 7366 // Fix kind and retry | 7378 // Fix kind and retry (only if we have an allocation site in the cell). |
| 7367 __ Addu(a3, a3, Operand(1)); | 7379 __ Addu(a3, a3, Operand(1)); |
| 7368 __ Branch(&normal_sequence, eq, a2, Operand(undefined_sentinel)); | 7380 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); |
| 7369 | 7381 __ Branch(&normal_sequence, eq, a2, Operand(at)); |
| 7370 // The type cell may have gone megamorphic, don't overwrite if so. | 7382 __ lw(t1, FieldMemOperand(a2, Cell::kValueOffset)); |
| 7371 __ lw(t1, FieldMemOperand(a2, kPointerSize)); | 7383 __ lw(t1, FieldMemOperand(t1, 0)); |
| 7372 __ JumpIfNotSmi(t1, &normal_sequence); | 7384 __ LoadRoot(at, Heap::kAllocationSiteMapRootIndex); |
| 7385 __ Branch(&normal_sequence, ne, t1, Operand(at)); |
| 7373 | 7386 |
| 7374 // Save the resulting elements kind in type info | 7387 // Save the resulting elements kind in type info |
| 7375 __ SmiTag(a3); | 7388 __ SmiTag(a3); |
| 7376 __ sw(a3, FieldMemOperand(a2, kPointerSize)); | 7389 __ lw(t1, FieldMemOperand(a2, Cell::kValueOffset)); |
| 7390 __ sw(a3, FieldMemOperand(t1, AllocationSite::kPayloadOffset)); |
| 7377 __ SmiUntag(a3); | 7391 __ SmiUntag(a3); |
| 7378 | 7392 |
| 7379 __ bind(&normal_sequence); | 7393 __ bind(&normal_sequence); |
| 7380 int last_index = GetSequenceIndexFromFastElementsKind( | 7394 int last_index = GetSequenceIndexFromFastElementsKind( |
| 7381 TERMINAL_FAST_ELEMENTS_KIND); | 7395 TERMINAL_FAST_ELEMENTS_KIND); |
| 7382 for (int i = 0; i <= last_index; ++i) { | 7396 for (int i = 0; i <= last_index; ++i) { |
| 7383 Label next; | 7397 Label next; |
| 7384 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 7398 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
| 7385 __ Branch(&next, ne, a3, Operand(kind)); | 7399 __ Branch(&next, ne, a3, Operand(kind)); |
| 7386 ArraySingleArgumentConstructorStub stub(kind); | 7400 ArraySingleArgumentConstructorStub stub(kind); |
| 7387 __ TailCallStub(&stub); | 7401 __ TailCallStub(&stub); |
| 7388 __ bind(&next); | 7402 __ bind(&next); |
| 7389 } | 7403 } |
| 7390 | 7404 |
| 7391 // If we reached this point there is a problem. | 7405 // If we reached this point there is a problem. |
| 7392 __ Abort("Unexpected ElementsKind in array constructor"); | 7406 __ Abort("Unexpected ElementsKind in array constructor"); |
| 7393 } | 7407 } |
| 7394 | 7408 |
| 7395 | 7409 |
| 7396 template<class T> | 7410 template<class T> |
| 7397 static void ArrayConstructorStubAheadOfTimeHelper(Isolate* isolate) { | 7411 static void ArrayConstructorStubAheadOfTimeHelper(Isolate* isolate) { |
| 7398 int to_index = GetSequenceIndexFromFastElementsKind( | 7412 int to_index = GetSequenceIndexFromFastElementsKind( |
| 7399 TERMINAL_FAST_ELEMENTS_KIND); | 7413 TERMINAL_FAST_ELEMENTS_KIND); |
| 7400 for (int i = 0; i <= to_index; ++i) { | 7414 for (int i = 0; i <= to_index; ++i) { |
| 7401 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 7415 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
| 7402 T stub(kind); | 7416 T stub(kind); |
| 7403 stub.GetCode(isolate)->set_is_pregenerated(true); | 7417 stub.GetCode(isolate)->set_is_pregenerated(true); |
| 7404 if (AllocationSiteInfo::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { | 7418 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { |
| 7405 T stub1(kind, CONTEXT_CHECK_REQUIRED, DISABLE_ALLOCATION_SITES); | 7419 T stub1(kind, CONTEXT_CHECK_REQUIRED, DISABLE_ALLOCATION_SITES); |
| 7406 stub1.GetCode(isolate)->set_is_pregenerated(true); | 7420 stub1.GetCode(isolate)->set_is_pregenerated(true); |
| 7407 } | 7421 } |
| 7408 } | 7422 } |
| 7409 } | 7423 } |
| 7410 | 7424 |
| 7411 | 7425 |
| 7412 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) { | 7426 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 7413 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( | 7427 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( |
| 7414 isolate); | 7428 isolate); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 7435 | 7449 |
| 7436 | 7450 |
| 7437 void ArrayConstructorStub::Generate(MacroAssembler* masm) { | 7451 void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 7438 // ----------- S t a t e ------------- | 7452 // ----------- S t a t e ------------- |
| 7439 // -- a0 : argc (only if argument_count_ == ANY) | 7453 // -- a0 : argc (only if argument_count_ == ANY) |
| 7440 // -- a1 : constructor | 7454 // -- a1 : constructor |
| 7441 // -- a2 : type info cell | 7455 // -- a2 : type info cell |
| 7442 // -- sp[0] : return address | 7456 // -- sp[0] : return address |
| 7443 // -- sp[4] : last argument | 7457 // -- sp[4] : last argument |
| 7444 // ----------------------------------- | 7458 // ----------------------------------- |
| 7445 Handle<Object> undefined_sentinel( | |
| 7446 masm->isolate()->heap()->undefined_value(), | |
| 7447 masm->isolate()); | |
| 7448 | |
| 7449 if (FLAG_debug_code) { | 7459 if (FLAG_debug_code) { |
| 7450 // The array construct code is only set for the global and natives | 7460 // The array construct code is only set for the global and natives |
| 7451 // builtin Array functions which always have maps. | 7461 // builtin Array functions which always have maps. |
| 7452 | 7462 |
| 7453 // Initial map for the builtin Array function should be a map. | 7463 // Initial map for the builtin Array function should be a map. |
| 7454 __ lw(a3, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset)); | 7464 __ lw(a3, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset)); |
| 7455 // Will both indicate a NULL and a Smi. | 7465 // Will both indicate a NULL and a Smi. |
| 7456 __ And(at, a3, Operand(kSmiTagMask)); | 7466 __ And(at, a3, Operand(kSmiTagMask)); |
| 7457 __ Assert(ne, "Unexpected initial map for Array function", | 7467 __ Assert(ne, "Unexpected initial map for Array function", |
| 7458 at, Operand(zero_reg)); | 7468 at, Operand(zero_reg)); |
| 7459 __ GetObjectType(a3, a3, t0); | 7469 __ GetObjectType(a3, a3, t0); |
| 7460 __ Assert(eq, "Unexpected initial map for Array function", | 7470 __ Assert(eq, "Unexpected initial map for Array function", |
| 7461 t0, Operand(MAP_TYPE)); | 7471 t0, Operand(MAP_TYPE)); |
| 7462 | 7472 |
| 7463 // We should either have undefined in a2 or a valid cell | 7473 // We should either have undefined in a2 or a valid cell. |
| 7464 Label okay_here; | 7474 Label okay_here; |
| 7465 Handle<Map> cell_map = masm->isolate()->factory()->cell_map(); | 7475 Handle<Map> cell_map = masm->isolate()->factory()->cell_map(); |
| 7466 __ Branch(&okay_here, eq, a2, Operand(undefined_sentinel)); | 7476 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); |
| 7477 __ Branch(&okay_here, eq, a2, Operand(at)); |
| 7467 __ lw(a3, FieldMemOperand(a2, 0)); | 7478 __ lw(a3, FieldMemOperand(a2, 0)); |
| 7468 __ Assert(eq, "Expected property cell in register a2", | 7479 __ Assert(eq, "Expected property cell in register a2", |
| 7469 a3, Operand(cell_map)); | 7480 a3, Operand(cell_map)); |
| 7470 __ bind(&okay_here); | 7481 __ bind(&okay_here); |
| 7471 } | 7482 } |
| 7472 | 7483 |
| 7473 Label no_info, switch_ready; | 7484 Label no_info, switch_ready; |
| 7474 // Get the elements kind and case on that. | 7485 // Get the elements kind and case on that. |
| 7475 __ Branch(&no_info, eq, a2, Operand(undefined_sentinel)); | 7486 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); |
| 7487 __ Branch(&no_info, eq, a2, Operand(at)); |
| 7476 __ lw(a3, FieldMemOperand(a2, Cell::kValueOffset)); | 7488 __ lw(a3, FieldMemOperand(a2, Cell::kValueOffset)); |
| 7477 __ JumpIfNotSmi(a3, &no_info); | 7489 |
| 7490 // The type cell may have undefined in its value. |
| 7491 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); |
| 7492 __ Branch(&no_info, eq, a3, Operand(at)); |
| 7493 |
| 7494 // We should have an allocation site object |
| 7495 if (FLAG_debug_code) { |
| 7496 __ push(a3); |
| 7497 __ sw(a3, FieldMemOperand(a3, 0)); |
| 7498 __ LoadRoot(at, Heap::kAllocationSiteMapRootIndex); |
| 7499 __ Assert(eq, "Expected AllocationSite object in register a3", |
| 7500 a3, Operand(at)); |
| 7501 } |
| 7502 |
| 7503 __ lw(a3, FieldMemOperand(a3, AllocationSite::kPayloadOffset)); |
| 7478 __ SmiUntag(a3); | 7504 __ SmiUntag(a3); |
| 7479 __ jmp(&switch_ready); | 7505 __ jmp(&switch_ready); |
| 7480 __ bind(&no_info); | 7506 __ bind(&no_info); |
| 7481 __ li(a3, Operand(GetInitialFastElementsKind())); | 7507 __ li(a3, Operand(GetInitialFastElementsKind())); |
| 7482 __ bind(&switch_ready); | 7508 __ bind(&switch_ready); |
| 7483 | 7509 |
| 7484 if (argument_count_ == ANY) { | 7510 if (argument_count_ == ANY) { |
| 7485 Label not_zero_case, not_one_case; | 7511 Label not_zero_case, not_one_case; |
| 7486 __ And(at, a0, a0); | 7512 __ And(at, a0, a0); |
| 7487 __ Branch(¬_zero_case, ne, at, Operand(zero_reg)); | 7513 __ Branch(¬_zero_case, ne, at, Operand(zero_reg)); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7586 __ bind(&fast_elements_case); | 7612 __ bind(&fast_elements_case); |
| 7587 GenerateCase(masm, FAST_ELEMENTS); | 7613 GenerateCase(masm, FAST_ELEMENTS); |
| 7588 } | 7614 } |
| 7589 | 7615 |
| 7590 | 7616 |
| 7591 #undef __ | 7617 #undef __ |
| 7592 | 7618 |
| 7593 } } // namespace v8::internal | 7619 } } // namespace v8::internal |
| 7594 | 7620 |
| 7595 #endif // V8_TARGET_ARCH_MIPS | 7621 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |