OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/ic/accessor-assembler.h" | 5 #include "src/ic/accessor-assembler.h" |
6 #include "src/ic/accessor-assembler-impl.h" | 6 #include "src/ic/accessor-assembler-impl.h" |
7 | 7 |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/ic/handler-configuration.h" | 10 #include "src/ic/handler-configuration.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 Node* receiver_map, Node* feedback, Label* if_handler, | 55 Node* receiver_map, Node* feedback, Label* if_handler, |
56 Variable* var_handler, Label* if_miss, int unroll_count) { | 56 Variable* var_handler, Label* if_miss, int unroll_count) { |
57 Comment("HandlePolymorphicCase"); | 57 Comment("HandlePolymorphicCase"); |
58 DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); | 58 DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); |
59 | 59 |
60 // Iterate {feedback} array. | 60 // Iterate {feedback} array. |
61 const int kEntrySize = 2; | 61 const int kEntrySize = 2; |
62 | 62 |
63 for (int i = 0; i < unroll_count; i++) { | 63 for (int i = 0; i < unroll_count; i++) { |
64 Label next_entry(this); | 64 Label next_entry(this); |
65 Node* cached_map = LoadWeakCellValue(LoadFixedArrayElement( | 65 Node* cached_map = |
66 feedback, IntPtrConstant(i * kEntrySize), 0, INTPTR_PARAMETERS)); | 66 LoadWeakCellValue(LoadFixedArrayElement(feedback, i * kEntrySize)); |
67 GotoIf(WordNotEqual(receiver_map, cached_map), &next_entry); | 67 GotoIf(WordNotEqual(receiver_map, cached_map), &next_entry); |
68 | 68 |
69 // Found, now call handler. | 69 // Found, now call handler. |
70 Node* handler = LoadFixedArrayElement( | 70 Node* handler = LoadFixedArrayElement(feedback, i * kEntrySize + 1); |
71 feedback, IntPtrConstant(i * kEntrySize + 1), 0, INTPTR_PARAMETERS); | |
72 var_handler->Bind(handler); | 71 var_handler->Bind(handler); |
73 Goto(if_handler); | 72 Goto(if_handler); |
74 | 73 |
75 Bind(&next_entry); | 74 Bind(&next_entry); |
76 } | 75 } |
77 | 76 |
78 // Loop from {unroll_count}*kEntrySize to {length}. | 77 // Loop from {unroll_count}*kEntrySize to {length}. |
79 Node* init = IntPtrConstant(unroll_count * kEntrySize); | 78 Node* init = IntPtrConstant(unroll_count * kEntrySize); |
80 Node* length = LoadAndUntagFixedArrayBaseLength(feedback); | 79 Node* length = LoadAndUntagFixedArrayBaseLength(feedback); |
81 BuildFastLoop( | 80 BuildFastLoop( |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 | 424 |
426 BuildFastLoop( | 425 BuildFastLoop( |
427 MachineType::PointerRepresentation(), start_index.value(), handler_length, | 426 MachineType::PointerRepresentation(), start_index.value(), handler_length, |
428 [this, p, handler, miss](CodeStubAssembler*, Node* current) { | 427 [this, p, handler, miss](CodeStubAssembler*, Node* current) { |
429 Node* prototype_cell = | 428 Node* prototype_cell = |
430 LoadFixedArrayElement(handler, current, 0, INTPTR_PARAMETERS); | 429 LoadFixedArrayElement(handler, current, 0, INTPTR_PARAMETERS); |
431 CheckPrototype(prototype_cell, p->name, miss); | 430 CheckPrototype(prototype_cell, p->name, miss); |
432 }, | 431 }, |
433 1, IndexAdvanceMode::kPost); | 432 1, IndexAdvanceMode::kPost); |
434 | 433 |
435 Node* maybe_holder_cell = LoadFixedArrayElement( | 434 Node* maybe_holder_cell = |
436 handler, IntPtrConstant(LoadHandler::kHolderCellIndex), 0, | 435 LoadFixedArrayElement(handler, LoadHandler::kHolderCellIndex); |
437 INTPTR_PARAMETERS); | |
438 Label load_existent(this); | 436 Label load_existent(this); |
439 GotoIf(WordNotEqual(maybe_holder_cell, NullConstant()), &load_existent); | 437 GotoIf(WordNotEqual(maybe_holder_cell, NullConstant()), &load_existent); |
440 // This is a handler for a load of a non-existent value. | 438 // This is a handler for a load of a non-existent value. |
441 if (throw_reference_error_if_nonexistent) { | 439 if (throw_reference_error_if_nonexistent) { |
442 TailCallRuntime(Runtime::kThrowReferenceError, p->context, p->name); | 440 TailCallRuntime(Runtime::kThrowReferenceError, p->context, p->name); |
443 } else { | 441 } else { |
444 Return(UndefinedConstant()); | 442 Return(UndefinedConstant()); |
445 } | 443 } |
446 | 444 |
447 Bind(&load_existent); | 445 Bind(&load_existent); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 Node* length = SmiUntag(maybe_transition_cell); | 549 Node* length = SmiUntag(maybe_transition_cell); |
552 BuildFastLoop(MachineType::PointerRepresentation(), | 550 BuildFastLoop(MachineType::PointerRepresentation(), |
553 IntPtrConstant(StoreHandler::kFirstPrototypeIndex), length, | 551 IntPtrConstant(StoreHandler::kFirstPrototypeIndex), length, |
554 [this, p, handler, miss](CodeStubAssembler*, Node* current) { | 552 [this, p, handler, miss](CodeStubAssembler*, Node* current) { |
555 Node* prototype_cell = LoadFixedArrayElement( | 553 Node* prototype_cell = LoadFixedArrayElement( |
556 handler, current, 0, INTPTR_PARAMETERS); | 554 handler, current, 0, INTPTR_PARAMETERS); |
557 CheckPrototype(prototype_cell, p->name, miss); | 555 CheckPrototype(prototype_cell, p->name, miss); |
558 }, | 556 }, |
559 1, IndexAdvanceMode::kPost); | 557 1, IndexAdvanceMode::kPost); |
560 | 558 |
561 Node* maybe_transition_cell = LoadFixedArrayElement( | 559 Node* maybe_transition_cell = |
562 handler, IntPtrConstant(StoreHandler::kTransitionCellIndex), 0, | 560 LoadFixedArrayElement(handler, StoreHandler::kTransitionCellIndex); |
563 INTPTR_PARAMETERS); | |
564 Node* transition = LoadWeakCellValue(maybe_transition_cell, miss); | 561 Node* transition = LoadWeakCellValue(maybe_transition_cell, miss); |
565 var_transition.Bind(transition); | 562 var_transition.Bind(transition); |
566 Goto(&if_transition); | 563 Goto(&if_transition); |
567 } | 564 } |
568 | 565 |
569 Bind(&if_transition); | 566 Bind(&if_transition); |
570 { | 567 { |
571 Node* holder = p->receiver; | 568 Node* holder = p->receiver; |
572 Node* transition = var_transition.value(); | 569 Node* transition = var_transition.value(); |
573 Node* handler_word = SmiUntag(smi_handler); | 570 Node* handler_word = SmiUntag(smi_handler); |
(...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1767 void AccessorAssembler::GenerateKeyedStoreICTrampolineTF( | 1764 void AccessorAssembler::GenerateKeyedStoreICTrampolineTF( |
1768 CodeAssemblerState* state, LanguageMode language_mode) { | 1765 CodeAssemblerState* state, LanguageMode language_mode) { |
1769 AccessorAssemblerImpl assembler(state); | 1766 AccessorAssemblerImpl assembler(state); |
1770 assembler.GenerateKeyedStoreICTrampolineTF(language_mode); | 1767 assembler.GenerateKeyedStoreICTrampolineTF(language_mode); |
1771 } | 1768 } |
1772 | 1769 |
1773 #undef ACCESSOR_ASSEMBLER_PUBLIC_INTERFACE | 1770 #undef ACCESSOR_ASSEMBLER_PUBLIC_INTERFACE |
1774 | 1771 |
1775 } // namespace internal | 1772 } // namespace internal |
1776 } // namespace v8 | 1773 } // namespace v8 |
OLD | NEW |