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 |