Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Side by Side Diff: src/mips/code-stubs-mips.cc

Issue 18089025: MIPS: Create AllocationSite objects, pointed to by AllocationSiteInfo. (Closed) Base URL: https://github.com/v8/v8.git@gbl
Patch Set: Port fix. Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/mips/ic-mips.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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(&not_array_function, ne, a1, Operand(a3)); 4827 __ Branch(&not_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(&not_array_function); 4847 __ bind(&not_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
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
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(&not_zero_case, ne, at, Operand(zero_reg)); 7513 __ Branch(&not_zero_case, ne, at, Operand(zero_reg));
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
OLDNEW
« no previous file with comments | « no previous file | src/mips/ic-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698