Chromium Code Reviews| 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 #include "src/code-stub-assembler.h" | 4 #include "src/code-stub-assembler.h" |
| 5 #include "src/code-factory.h" | 5 #include "src/code-factory.h" |
| 6 #include "src/frames-inl.h" | 6 #include "src/frames-inl.h" |
| 7 #include "src/frames.h" | 7 #include "src/frames.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 1979 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1990 IntPtrSub(IntPtrAdd(object, size), IntPtrConstant(kHeapObjectTag)); | 1990 IntPtrSub(IntPtrAdd(object, size), IntPtrConstant(kHeapObjectTag)); |
| 1991 StoreFieldsNoWriteBarrier(start_address, end_address, filler); | 1991 StoreFieldsNoWriteBarrier(start_address, end_address, filler); |
| 1992 } | 1992 } |
| 1993 | 1993 |
| 1994 void CodeStubAssembler::StoreFieldsNoWriteBarrier(Node* start_address, | 1994 void CodeStubAssembler::StoreFieldsNoWriteBarrier(Node* start_address, |
| 1995 Node* end_address, | 1995 Node* end_address, |
| 1996 Node* value) { | 1996 Node* value) { |
| 1997 Comment("StoreFieldsNoWriteBarrier"); | 1997 Comment("StoreFieldsNoWriteBarrier"); |
| 1998 CSA_ASSERT(this, WordIsWordAligned(start_address)); | 1998 CSA_ASSERT(this, WordIsWordAligned(start_address)); |
| 1999 CSA_ASSERT(this, WordIsWordAligned(end_address)); | 1999 CSA_ASSERT(this, WordIsWordAligned(end_address)); |
| 2000 BuildFastLoop( | 2000 BuildFastLoop(start_address, end_address, |
| 2001 MachineType::PointerRepresentation(), start_address, end_address, | 2001 [this, value](Node* current) { |
| 2002 [this, value](Node* current) { | 2002 StoreNoWriteBarrier(MachineRepresentation::kTagged, current, |
| 2003 StoreNoWriteBarrier(MachineRepresentation::kTagged, current, value); | 2003 value); |
| 2004 }, | 2004 }, |
| 2005 kPointerSize, IndexAdvanceMode::kPost); | 2005 kPointerSize, INTPTR_PARAMETERS, IndexAdvanceMode::kPost); |
| 2006 } | 2006 } |
| 2007 | 2007 |
| 2008 Node* CodeStubAssembler::AllocateUninitializedJSArrayWithoutElements( | 2008 Node* CodeStubAssembler::AllocateUninitializedJSArrayWithoutElements( |
| 2009 ElementsKind kind, Node* array_map, Node* length, Node* allocation_site) { | 2009 ElementsKind kind, Node* array_map, Node* length, Node* allocation_site) { |
| 2010 Comment("begin allocation of JSArray without elements"); | 2010 Comment("begin allocation of JSArray without elements"); |
| 2011 int base_size = JSArray::kSize; | 2011 int base_size = JSArray::kSize; |
| 2012 if (allocation_site != nullptr) { | 2012 if (allocation_site != nullptr) { |
| 2013 base_size += AllocationMemento::kSize; | 2013 base_size += AllocationMemento::kSize; |
| 2014 } | 2014 } |
| 2015 | 2015 |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2335 Smi* to_index_smi = nullptr; | 2335 Smi* to_index_smi = nullptr; |
| 2336 Smi* from_index_smi = nullptr; | 2336 Smi* from_index_smi = nullptr; |
| 2337 bool index_same = (from_encoding == to_encoding) && | 2337 bool index_same = (from_encoding == to_encoding) && |
| 2338 (from_index == to_index || | 2338 (from_index == to_index || |
| 2339 (ToInt32Constant(from_index, from_index_constant) && | 2339 (ToInt32Constant(from_index, from_index_constant) && |
| 2340 ToInt32Constant(to_index, to_index_constant) && | 2340 ToInt32Constant(to_index, to_index_constant) && |
| 2341 from_index_constant == to_index_constant) || | 2341 from_index_constant == to_index_constant) || |
| 2342 (ToSmiConstant(from_index, from_index_smi) && | 2342 (ToSmiConstant(from_index, from_index_smi) && |
| 2343 ToSmiConstant(to_index, to_index_smi) && | 2343 ToSmiConstant(to_index, to_index_smi) && |
| 2344 to_index_smi == from_index_smi)); | 2344 to_index_smi == from_index_smi)); |
| 2345 BuildFastLoop(vars, MachineType::PointerRepresentation(), from_offset, | 2345 BuildFastLoop(vars, from_offset, limit_offset, |
| 2346 limit_offset, | |
| 2347 [this, from_string, to_string, ¤t_to_offset, to_increment, | 2346 [this, from_string, to_string, ¤t_to_offset, to_increment, |
| 2348 type, rep, index_same](Node* offset) { | 2347 type, rep, index_same](Node* offset) { |
| 2349 Node* value = Load(type, from_string, offset); | 2348 Node* value = Load(type, from_string, offset); |
| 2350 StoreNoWriteBarrier( | 2349 StoreNoWriteBarrier( |
| 2351 rep, to_string, | 2350 rep, to_string, |
| 2352 index_same ? offset : current_to_offset.value(), value); | 2351 index_same ? offset : current_to_offset.value(), value); |
| 2353 if (!index_same) { | 2352 if (!index_same) { |
| 2354 Increment(current_to_offset, to_increment); | 2353 Increment(current_to_offset, to_increment); |
| 2355 } | 2354 } |
| 2356 }, | 2355 }, |
| 2357 from_increment, IndexAdvanceMode::kPost); | 2356 from_increment, INTPTR_PARAMETERS, IndexAdvanceMode::kPost); |
|
Igor Sheludko
2017/02/01 17:12:53
mode
danno
2017/02/01 17:33:43
As discussed, this is correct as-is.
| |
| 2358 } | 2357 } |
| 2359 | 2358 |
| 2360 Node* CodeStubAssembler::LoadElementAndPrepareForStore(Node* array, | 2359 Node* CodeStubAssembler::LoadElementAndPrepareForStore(Node* array, |
| 2361 Node* offset, | 2360 Node* offset, |
| 2362 ElementsKind from_kind, | 2361 ElementsKind from_kind, |
| 2363 ElementsKind to_kind, | 2362 ElementsKind to_kind, |
| 2364 Label* if_hole) { | 2363 Label* if_hole) { |
| 2365 if (IsFastDoubleElementsKind(from_kind)) { | 2364 if (IsFastDoubleElementsKind(from_kind)) { |
| 2366 Node* value = | 2365 Node* value = |
| 2367 LoadDoubleWithHoleCheck(array, offset, if_hole, MachineType::Float64()); | 2366 LoadDoubleWithHoleCheck(array, offset, if_hole, MachineType::Float64()); |
| (...skipping 1391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3759 Node* const search_range_length = SmiUntag(SmiSub(length, from)); | 3758 Node* const search_range_length = SmiUntag(SmiSub(length, from)); |
| 3760 | 3759 |
| 3761 const int offset = SeqOneByteString::kHeaderSize - kHeapObjectTag; | 3760 const int offset = SeqOneByteString::kHeaderSize - kHeapObjectTag; |
| 3762 Node* const begin = IntPtrConstant(offset); | 3761 Node* const begin = IntPtrConstant(offset); |
| 3763 Node* const cursor = IntPtrAdd(begin, SmiUntag(from)); | 3762 Node* const cursor = IntPtrAdd(begin, SmiUntag(from)); |
| 3764 Node* const end = IntPtrAdd(cursor, search_range_length); | 3763 Node* const end = IntPtrAdd(cursor, search_range_length); |
| 3765 | 3764 |
| 3766 var_result.Bind(SmiConstant(Smi::FromInt(-1))); | 3765 var_result.Bind(SmiConstant(Smi::FromInt(-1))); |
| 3767 | 3766 |
| 3768 BuildFastLoop( | 3767 BuildFastLoop( |
| 3769 MachineType::PointerRepresentation(), cursor, end, | 3768 cursor, end, |
| 3770 [this, string, needle_char, begin, &var_result, &out](Node* cursor) { | 3769 [this, string, needle_char, begin, &var_result, &out](Node* cursor) { |
| 3771 Label next(this); | 3770 Label next(this); |
| 3772 Node* value = Load(MachineType::Uint8(), string, cursor); | 3771 Node* value = Load(MachineType::Uint8(), string, cursor); |
| 3773 GotoUnless(Word32Equal(value, needle_char), &next); | 3772 GotoUnless(Word32Equal(value, needle_char), &next); |
| 3774 | 3773 |
| 3775 // Found a match. | 3774 // Found a match. |
| 3776 Node* index = SmiTag(IntPtrSub(cursor, begin)); | 3775 Node* index = SmiTag(IntPtrSub(cursor, begin)); |
| 3777 var_result.Bind(index); | 3776 var_result.Bind(index); |
| 3778 Goto(&out); | 3777 Goto(&out); |
| 3779 | 3778 |
| 3780 Bind(&next); | 3779 Bind(&next); |
| 3781 }, | 3780 }, |
| 3782 1, IndexAdvanceMode::kPost); | 3781 1, INTPTR_PARAMETERS, IndexAdvanceMode::kPost); |
| 3783 Goto(&out); | 3782 Goto(&out); |
| 3784 | 3783 |
| 3785 Bind(&runtime); | 3784 Bind(&runtime); |
| 3786 { | 3785 { |
| 3787 Node* const pattern = StringFromCharCode(needle_char); | 3786 Node* const pattern = StringFromCharCode(needle_char); |
| 3788 Node* const result = | 3787 Node* const result = |
| 3789 CallRuntime(Runtime::kStringIndexOf, context, string, pattern, from); | 3788 CallRuntime(Runtime::kStringIndexOf, context, string, pattern, from); |
| 3790 var_result.Bind(result); | 3789 var_result.Bind(result); |
| 3791 Goto(&out); | 3790 Goto(&out); |
| 3792 } | 3791 } |
| (...skipping 992 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4785 | 4784 |
| 4786 void CodeStubAssembler::DescriptorLookupLinear(Node* unique_name, | 4785 void CodeStubAssembler::DescriptorLookupLinear(Node* unique_name, |
| 4787 Node* descriptors, Node* nof, | 4786 Node* descriptors, Node* nof, |
| 4788 Label* if_found, | 4787 Label* if_found, |
| 4789 Variable* var_name_index, | 4788 Variable* var_name_index, |
| 4790 Label* if_not_found) { | 4789 Label* if_not_found) { |
| 4791 Node* first_inclusive = IntPtrConstant(DescriptorArray::ToKeyIndex(0)); | 4790 Node* first_inclusive = IntPtrConstant(DescriptorArray::ToKeyIndex(0)); |
| 4792 Node* factor = IntPtrConstant(DescriptorArray::kDescriptorSize); | 4791 Node* factor = IntPtrConstant(DescriptorArray::kDescriptorSize); |
| 4793 Node* last_exclusive = IntPtrAdd(first_inclusive, IntPtrMul(nof, factor)); | 4792 Node* last_exclusive = IntPtrAdd(first_inclusive, IntPtrMul(nof, factor)); |
| 4794 | 4793 |
| 4795 BuildFastLoop( | 4794 BuildFastLoop(last_exclusive, first_inclusive, |
| 4796 MachineType::PointerRepresentation(), last_exclusive, first_inclusive, | 4795 [this, descriptors, unique_name, if_found, |
| 4797 [this, descriptors, unique_name, if_found, | 4796 var_name_index](Node* name_index) { |
| 4798 var_name_index](Node* name_index) { | 4797 Node* candidate_name = |
| 4799 Node* candidate_name = LoadFixedArrayElement(descriptors, name_index); | 4798 LoadFixedArrayElement(descriptors, name_index); |
| 4800 var_name_index->Bind(name_index); | 4799 var_name_index->Bind(name_index); |
| 4801 GotoIf(WordEqual(candidate_name, unique_name), if_found); | 4800 GotoIf(WordEqual(candidate_name, unique_name), if_found); |
| 4802 }, | 4801 }, |
| 4803 -DescriptorArray::kDescriptorSize, IndexAdvanceMode::kPre); | 4802 -DescriptorArray::kDescriptorSize, INTPTR_PARAMETERS, |
| 4803 IndexAdvanceMode::kPre); | |
| 4804 Goto(if_not_found); | 4804 Goto(if_not_found); |
| 4805 } | 4805 } |
| 4806 | 4806 |
| 4807 void CodeStubAssembler::TryLookupProperty( | 4807 void CodeStubAssembler::TryLookupProperty( |
| 4808 Node* object, Node* map, Node* instance_type, Node* unique_name, | 4808 Node* object, Node* map, Node* instance_type, Node* unique_name, |
| 4809 Label* if_found_fast, Label* if_found_dict, Label* if_found_global, | 4809 Label* if_found_fast, Label* if_found_dict, Label* if_found_global, |
| 4810 Variable* var_meta_storage, Variable* var_name_index, Label* if_not_found, | 4810 Variable* var_meta_storage, Variable* var_name_index, Label* if_not_found, |
| 4811 Label* if_bailout) { | 4811 Label* if_bailout) { |
| 4812 DCHECK_EQ(MachineRepresentation::kTagged, var_meta_storage->rep()); | 4812 DCHECK_EQ(MachineRepresentation::kTagged, var_meta_storage->rep()); |
| 4813 DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep()); | 4813 DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep()); |
| (...skipping 1438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6252 StoreObjectFieldRoot(cell, WeakCell::kNextOffset, | 6252 StoreObjectFieldRoot(cell, WeakCell::kNextOffset, |
| 6253 Heap::kTheHoleValueRootIndex); | 6253 Heap::kTheHoleValueRootIndex); |
| 6254 | 6254 |
| 6255 // Store the WeakCell in the feedback vector. | 6255 // Store the WeakCell in the feedback vector. |
| 6256 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, 0, | 6256 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, 0, |
| 6257 CodeStubAssembler::SMI_PARAMETERS); | 6257 CodeStubAssembler::SMI_PARAMETERS); |
| 6258 return cell; | 6258 return cell; |
| 6259 } | 6259 } |
| 6260 | 6260 |
| 6261 Node* CodeStubAssembler::BuildFastLoop( | 6261 Node* CodeStubAssembler::BuildFastLoop( |
| 6262 const CodeStubAssembler::VariableList& vars, | 6262 const CodeStubAssembler::VariableList& vars, Node* start_index, |
| 6263 MachineRepresentation index_rep, Node* start_index, Node* end_index, | 6263 Node* end_index, const FastLoopBody& body, int increment, |
| 6264 const FastLoopBody& body, int increment, IndexAdvanceMode mode) { | 6264 ParameterMode parameter_mode, IndexAdvanceMode advance_mode) { |
| 6265 MachineRepresentation index_rep = (parameter_mode == INTPTR_PARAMETERS) | |
| 6266 ? MachineType::PointerRepresentation() | |
| 6267 : MachineRepresentation::kTaggedSigned; | |
| 6265 Variable var(this, index_rep, start_index); | 6268 Variable var(this, index_rep, start_index); |
| 6266 VariableList vars_copy(vars, zone()); | 6269 VariableList vars_copy(vars, zone()); |
| 6267 vars_copy.Add(&var, zone()); | 6270 vars_copy.Add(&var, zone()); |
| 6268 Label loop(this, vars_copy); | 6271 Label loop(this, vars_copy); |
| 6269 Label after_loop(this); | 6272 Label after_loop(this); |
| 6270 // Introduce an explicit second check of the termination condition before the | 6273 // Introduce an explicit second check of the termination condition before the |
| 6271 // loop that helps turbofan generate better code. If there's only a single | 6274 // loop that helps turbofan generate better code. If there's only a single |
| 6272 // check, then the CodeStubAssembler forces it to be at the beginning of the | 6275 // check, then the CodeStubAssembler forces it to be at the beginning of the |
| 6273 // loop requiring a backwards branch at the end of the loop (it's not possible | 6276 // loop requiring a backwards branch at the end of the loop (it's not possible |
| 6274 // to force the loop header check at the end of the loop and branch forward to | 6277 // to force the loop header check at the end of the loop and branch forward to |
| 6275 // it from the pre-header). The extra branch is slower in the case that the | 6278 // it from the pre-header). The extra branch is slower in the case that the |
| 6276 // loop actually iterates. | 6279 // loop actually iterates. |
| 6277 Branch(WordEqual(var.value(), end_index), &after_loop, &loop); | 6280 Branch(WordEqual(var.value(), end_index), &after_loop, &loop); |
| 6278 Bind(&loop); | 6281 Bind(&loop); |
| 6279 { | 6282 { |
| 6280 if (mode == IndexAdvanceMode::kPre) { | 6283 if (advance_mode == IndexAdvanceMode::kPre) { |
| 6281 Increment(var, increment); | 6284 Increment(var, increment, parameter_mode); |
| 6282 } | 6285 } |
| 6283 body(var.value()); | 6286 body(var.value()); |
| 6284 if (mode == IndexAdvanceMode::kPost) { | 6287 if (advance_mode == IndexAdvanceMode::kPost) { |
| 6285 Increment(var, increment); | 6288 Increment(var, increment, parameter_mode); |
| 6286 } | 6289 } |
| 6287 Branch(WordNotEqual(var.value(), end_index), &loop, &after_loop); | 6290 Branch(WordNotEqual(var.value(), end_index), &loop, &after_loop); |
| 6288 } | 6291 } |
| 6289 Bind(&after_loop); | 6292 Bind(&after_loop); |
| 6290 return var.value(); | 6293 return var.value(); |
| 6291 } | 6294 } |
| 6292 | 6295 |
| 6293 void CodeStubAssembler::BuildFastFixedArrayForEach( | 6296 void CodeStubAssembler::BuildFastFixedArrayForEach( |
| 6294 const CodeStubAssembler::VariableList& vars, Node* fixed_array, | 6297 const CodeStubAssembler::VariableList& vars, Node* fixed_array, |
| 6295 ElementsKind kind, Node* first_element_inclusive, | 6298 ElementsKind kind, Node* first_element_inclusive, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6328 Node* start = | 6331 Node* start = |
| 6329 ElementOffsetFromIndex(first_element_inclusive, kind, mode, | 6332 ElementOffsetFromIndex(first_element_inclusive, kind, mode, |
| 6330 FixedArray::kHeaderSize - kHeapObjectTag); | 6333 FixedArray::kHeaderSize - kHeapObjectTag); |
| 6331 Node* limit = | 6334 Node* limit = |
| 6332 ElementOffsetFromIndex(last_element_exclusive, kind, mode, | 6335 ElementOffsetFromIndex(last_element_exclusive, kind, mode, |
| 6333 FixedArray::kHeaderSize - kHeapObjectTag); | 6336 FixedArray::kHeaderSize - kHeapObjectTag); |
| 6334 if (direction == ForEachDirection::kReverse) std::swap(start, limit); | 6337 if (direction == ForEachDirection::kReverse) std::swap(start, limit); |
| 6335 | 6338 |
| 6336 int increment = IsFastDoubleElementsKind(kind) ? kDoubleSize : kPointerSize; | 6339 int increment = IsFastDoubleElementsKind(kind) ? kDoubleSize : kPointerSize; |
| 6337 BuildFastLoop( | 6340 BuildFastLoop( |
| 6338 vars, MachineType::PointerRepresentation(), start, limit, | 6341 vars, start, limit, |
| 6339 [fixed_array, &body](Node* offset) { body(fixed_array, offset); }, | 6342 [fixed_array, &body](Node* offset) { body(fixed_array, offset); }, |
| 6340 direction == ForEachDirection::kReverse ? -increment : increment, | 6343 direction == ForEachDirection::kReverse ? -increment : increment, |
| 6344 INTPTR_PARAMETERS, | |
|
Igor Sheludko
2017/02/01 17:12:53
mode
danno
2017/02/01 17:33:43
As discussed, this is correct as-is.
| |
| 6341 direction == ForEachDirection::kReverse ? IndexAdvanceMode::kPre | 6345 direction == ForEachDirection::kReverse ? IndexAdvanceMode::kPre |
| 6342 : IndexAdvanceMode::kPost); | 6346 : IndexAdvanceMode::kPost); |
| 6343 } | 6347 } |
| 6344 | 6348 |
| 6345 void CodeStubAssembler::InitializeFieldsWithRoot( | 6349 void CodeStubAssembler::InitializeFieldsWithRoot( |
| 6346 Node* object, Node* start_offset, Node* end_offset, | 6350 Node* object, Node* start_offset, Node* end_offset, |
| 6347 Heap::RootListIndex root_index) { | 6351 Heap::RootListIndex root_index) { |
| 6348 start_offset = IntPtrAdd(start_offset, IntPtrConstant(-kHeapObjectTag)); | 6352 start_offset = IntPtrAdd(start_offset, IntPtrConstant(-kHeapObjectTag)); |
| 6349 end_offset = IntPtrAdd(end_offset, IntPtrConstant(-kHeapObjectTag)); | 6353 end_offset = IntPtrAdd(end_offset, IntPtrConstant(-kHeapObjectTag)); |
| 6350 Node* root_value = LoadRoot(root_index); | 6354 Node* root_value = LoadRoot(root_index); |
| 6351 BuildFastLoop(MachineType::PointerRepresentation(), end_offset, start_offset, | 6355 BuildFastLoop(end_offset, start_offset, |
| 6352 [this, object, root_value](Node* current) { | 6356 [this, object, root_value](Node* current) { |
| 6353 StoreNoWriteBarrier(MachineRepresentation::kTagged, object, | 6357 StoreNoWriteBarrier(MachineRepresentation::kTagged, object, |
| 6354 current, root_value); | 6358 current, root_value); |
| 6355 }, | 6359 }, |
| 6356 -kPointerSize, CodeStubAssembler::IndexAdvanceMode::kPre); | 6360 -kPointerSize, INTPTR_PARAMETERS, |
| 6361 CodeStubAssembler::IndexAdvanceMode::kPre); | |
| 6357 } | 6362 } |
| 6358 | 6363 |
| 6359 void CodeStubAssembler::BranchIfNumericRelationalComparison( | 6364 void CodeStubAssembler::BranchIfNumericRelationalComparison( |
| 6360 RelationalComparisonMode mode, Node* lhs, Node* rhs, Label* if_true, | 6365 RelationalComparisonMode mode, Node* lhs, Node* rhs, Label* if_true, |
| 6361 Label* if_false) { | 6366 Label* if_false) { |
| 6362 Label end(this); | 6367 Label end(this); |
| 6363 Variable result(this, MachineRepresentation::kTagged); | 6368 Variable result(this, MachineRepresentation::kTagged); |
| 6364 | 6369 |
| 6365 // Shared entry for floating point comparison. | 6370 // Shared entry for floating point comparison. |
| 6366 Label do_fcmp(this); | 6371 Label do_fcmp(this); |
| (...skipping 1907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8274 if (last == nullptr) { | 8279 if (last == nullptr) { |
| 8275 DCHECK_EQ(mode, argc_mode_); | 8280 DCHECK_EQ(mode, argc_mode_); |
| 8276 last = argc_; | 8281 last = argc_; |
| 8277 } | 8282 } |
| 8278 Node* start = assembler_->IntPtrSub( | 8283 Node* start = assembler_->IntPtrSub( |
| 8279 arguments_, | 8284 arguments_, |
| 8280 assembler_->ElementOffsetFromIndex(first, FAST_ELEMENTS, mode)); | 8285 assembler_->ElementOffsetFromIndex(first, FAST_ELEMENTS, mode)); |
| 8281 Node* end = assembler_->IntPtrSub( | 8286 Node* end = assembler_->IntPtrSub( |
| 8282 arguments_, | 8287 arguments_, |
| 8283 assembler_->ElementOffsetFromIndex(last, FAST_ELEMENTS, mode)); | 8288 assembler_->ElementOffsetFromIndex(last, FAST_ELEMENTS, mode)); |
| 8284 assembler_->BuildFastLoop( | 8289 assembler_->BuildFastLoop(vars, start, end, |
| 8285 vars, MachineType::PointerRepresentation(), start, end, | 8290 [this, &body](Node* current) { |
| 8286 [this, &body](Node* current) { | 8291 Node* arg = assembler_->Load( |
| 8287 Node* arg = assembler_->Load(MachineType::AnyTagged(), current); | 8292 MachineType::AnyTagged(), current); |
| 8288 body(arg); | 8293 body(arg); |
| 8289 }, | 8294 }, |
| 8290 -kPointerSize, CodeStubAssembler::IndexAdvanceMode::kPost); | 8295 -kPointerSize, CodeStubAssembler::INTPTR_PARAMETERS, |
| 8296 CodeStubAssembler::IndexAdvanceMode::kPost); | |
| 8291 } | 8297 } |
| 8292 | 8298 |
| 8293 void CodeStubArguments::PopAndReturn(Node* value) { | 8299 void CodeStubArguments::PopAndReturn(Node* value) { |
| 8294 assembler_->PopAndReturn( | 8300 assembler_->PopAndReturn( |
| 8295 assembler_->IntPtrAdd(argc_, assembler_->IntPtrConstant(1)), value); | 8301 assembler_->IntPtrAdd(argc_, assembler_->IntPtrConstant(1)), value); |
| 8296 } | 8302 } |
| 8297 | 8303 |
| 8298 Node* CodeStubAssembler::IsFastElementsKind(Node* elements_kind) { | 8304 Node* CodeStubAssembler::IsFastElementsKind(Node* elements_kind) { |
| 8299 return Uint32LessThanOrEqual(elements_kind, | 8305 return Uint32LessThanOrEqual(elements_kind, |
| 8300 Int32Constant(LAST_FAST_ELEMENTS_KIND)); | 8306 Int32Constant(LAST_FAST_ELEMENTS_KIND)); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8398 formatted.c_str(), TENURED); | 8404 formatted.c_str(), TENURED); |
| 8399 CallRuntime(Runtime::kGlobalPrint, NoContextConstant(), | 8405 CallRuntime(Runtime::kGlobalPrint, NoContextConstant(), |
| 8400 HeapConstant(string)); | 8406 HeapConstant(string)); |
| 8401 } | 8407 } |
| 8402 CallRuntime(Runtime::kDebugPrint, NoContextConstant(), tagged_value); | 8408 CallRuntime(Runtime::kDebugPrint, NoContextConstant(), tagged_value); |
| 8403 #endif | 8409 #endif |
| 8404 } | 8410 } |
| 8405 | 8411 |
| 8406 } // namespace internal | 8412 } // namespace internal |
| 8407 } // namespace v8 | 8413 } // namespace v8 |
| OLD | NEW |