| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index be44c13819310b8fbc01ffc15f36f64e771c2789..432613d929fae795fe962ae38ade473cb59d0593 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -5704,125 +5704,6 @@
|
| }
|
| }
|
|
|
| -void CodeStubAssembler::HandleStoreFieldAndReturn(
|
| - Node* handler_word, Node* holder, Representation representation,
|
| - Node* value, bool transition_to_field, Label* miss) {
|
| - Node* prepared_value = PrepareValueForWrite(value, representation, miss);
|
| -
|
| - Node* offset = DecodeWord<StoreHandler::FieldOffsetBits>(handler_word);
|
| - Label if_inobject(this), if_out_of_object(this);
|
| - Branch(IsSetWord<StoreHandler::IsInobjectBits>(handler_word), &if_inobject,
|
| - &if_out_of_object);
|
| -
|
| - Bind(&if_inobject);
|
| - {
|
| - StoreNamedField(holder, offset, true, representation, prepared_value,
|
| - transition_to_field);
|
| - Return(value);
|
| - }
|
| -
|
| - Bind(&if_out_of_object);
|
| - {
|
| - StoreNamedField(holder, offset, false, representation, prepared_value,
|
| - transition_to_field);
|
| - Return(value);
|
| - }
|
| -}
|
| -
|
| -void CodeStubAssembler::HandleStoreICSmiHandlerCase(Node* handler_word,
|
| - Node* holder, Node* value,
|
| - bool transition_to_field,
|
| - Label* miss) {
|
| - Comment(transition_to_field ? "transitioning field store" : "field store");
|
| -
|
| - Node* field_representation =
|
| - DecodeWord<StoreHandler::FieldRepresentationBits>(handler_word);
|
| -
|
| - Label if_smi_field(this), if_double_field(this), if_heap_object_field(this),
|
| - if_tagged_field(this);
|
| -
|
| - GotoIf(WordEqual(field_representation, IntPtrConstant(StoreHandler::kTagged)),
|
| - &if_tagged_field);
|
| - GotoIf(WordEqual(field_representation,
|
| - IntPtrConstant(StoreHandler::kHeapObject)),
|
| - &if_heap_object_field);
|
| - GotoIf(WordEqual(field_representation, IntPtrConstant(StoreHandler::kDouble)),
|
| - &if_double_field);
|
| - CSA_ASSERT(
|
| - WordEqual(field_representation, IntPtrConstant(StoreHandler::kSmi)));
|
| - Goto(&if_smi_field);
|
| -
|
| - Bind(&if_tagged_field);
|
| - {
|
| - Comment("store tagged field");
|
| - HandleStoreFieldAndReturn(handler_word, holder, Representation::Tagged(),
|
| - value, transition_to_field, miss);
|
| - }
|
| -
|
| - Bind(&if_double_field);
|
| - {
|
| - Comment("store double field");
|
| - HandleStoreFieldAndReturn(handler_word, holder, Representation::Double(),
|
| - value, transition_to_field, miss);
|
| - }
|
| -
|
| - Bind(&if_heap_object_field);
|
| - {
|
| - Comment("store heap object field");
|
| - // Generate full field type check here and then store value as Tagged.
|
| - Node* prepared_value =
|
| - PrepareValueForWrite(value, Representation::HeapObject(), miss);
|
| - Node* value_index_in_descriptor =
|
| - DecodeWord<StoreHandler::DescriptorValueIndexBits>(handler_word);
|
| - Node* descriptors = LoadMapDescriptors(LoadMap(holder));
|
| - Node* maybe_field_type = LoadFixedArrayElement(
|
| - descriptors, value_index_in_descriptor, 0, INTPTR_PARAMETERS);
|
| - Label do_store(this);
|
| - GotoIf(TaggedIsSmi(maybe_field_type), &do_store);
|
| - // Check that value type matches the field type.
|
| - {
|
| - Node* field_type = LoadWeakCellValue(maybe_field_type, miss);
|
| - Branch(WordEqual(LoadMap(prepared_value), field_type), &do_store, miss);
|
| - }
|
| - Bind(&do_store);
|
| - HandleStoreFieldAndReturn(handler_word, holder, Representation::Tagged(),
|
| - prepared_value, transition_to_field, miss);
|
| - }
|
| -
|
| - Bind(&if_smi_field);
|
| - {
|
| - Comment("store smi field");
|
| - HandleStoreFieldAndReturn(handler_word, holder, Representation::Smi(),
|
| - value, transition_to_field, miss);
|
| - }
|
| -}
|
| -
|
| -void CodeStubAssembler::HandleStoreICHandlerCase(const StoreICParameters* p,
|
| - Node* handler, Label* miss) {
|
| - Label if_smi_handler(this), call_handler(this);
|
| -
|
| - Branch(TaggedIsSmi(handler), &if_smi_handler, &call_handler);
|
| -
|
| - // |handler| is a Smi, encoding what to do. See SmiHandler methods
|
| - // for the encoding format.
|
| - Bind(&if_smi_handler);
|
| - {
|
| - Node* holder = p->receiver;
|
| - Node* handler_word = SmiUntag(handler);
|
| -
|
| - // Handle non-transitioning stores.
|
| - HandleStoreICSmiHandlerCase(handler_word, holder, p->value, false, miss);
|
| - }
|
| -
|
| - // |handler| is a heap object. Must be code, call it.
|
| - Bind(&call_handler);
|
| - {
|
| - StoreWithVectorDescriptor descriptor(isolate());
|
| - TailCallStub(descriptor, handler, p->context, p->receiver, p->name,
|
| - p->value, p->slot, p->vector);
|
| - }
|
| -}
|
| -
|
| void CodeStubAssembler::StoreIC(const StoreICParameters* p) {
|
| Variable var_handler(this, MachineRepresentation::kTagged);
|
| // TODO(ishell): defer blocks when it works.
|
| @@ -5839,7 +5720,9 @@
|
| Bind(&if_handler);
|
| {
|
| Comment("StoreIC_if_handler");
|
| - HandleStoreICHandlerCase(p, var_handler.value(), &miss);
|
| + StoreWithVectorDescriptor descriptor(isolate());
|
| + TailCallStub(descriptor, var_handler.value(), p->context, p->receiver,
|
| + p->name, p->value, p->slot, p->vector);
|
| }
|
|
|
| Bind(&try_polymorphic);
|
| @@ -5873,9 +5756,6 @@
|
| void CodeStubAssembler::KeyedStoreIC(const StoreICParameters* p,
|
| LanguageMode language_mode) {
|
| Variable var_handler(this, MachineRepresentation::kTagged);
|
| - // This is to make |miss| label see the var_handler bound on all paths.
|
| - var_handler.Bind(IntPtrConstant(0));
|
| -
|
| // TODO(ishell): defer blocks when it works.
|
| Label if_handler(this, &var_handler), try_polymorphic(this),
|
| try_megamorphic(this /*, Label::kDeferred*/),
|
| @@ -5891,7 +5771,9 @@
|
| Bind(&if_handler);
|
| {
|
| Comment("KeyedStoreIC_if_handler");
|
| - HandleStoreICHandlerCase(p, var_handler.value(), &miss);
|
| + StoreWithVectorDescriptor descriptor(isolate());
|
| + TailCallStub(descriptor, var_handler.value(), p->context, p->receiver,
|
| + p->name, p->value, p->slot, p->vector);
|
| }
|
|
|
| Bind(&try_polymorphic);
|
|
|