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

Side by Side Diff: src/code-stub-assembler.cc

Issue 2617393002: [stubs] Ensure generated CalculateNewElementsCapacity is identical to runtime version (Closed)
Patch Set: Review feedback Created 3 years, 11 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 | « src/code-stub-assembler.h ('k') | test/cctest/test-code-stub-assembler.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 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 1474 matching lines...) Expand 10 before | Expand all | Expand 10 after
1485 Node* capacity = 1485 Node* capacity =
1486 TaggedToParameter(LoadFixedArrayBaseLength(var_elements.value()), mode); 1486 TaggedToParameter(LoadFixedArrayBaseLength(var_elements.value()), mode);
1487 1487
1488 // Resize the capacity of the fixed array if it doesn't fit. 1488 // Resize the capacity of the fixed array if it doesn't fit.
1489 Label fits(this, &var_elements); 1489 Label fits(this, &var_elements);
1490 Node* first = arg_index.value(); 1490 Node* first = arg_index.value();
1491 Node* growth = IntPtrSub(args.GetLength(), first); 1491 Node* growth = IntPtrSub(args.GetLength(), first);
1492 Node* new_length = 1492 Node* new_length =
1493 IntPtrOrSmiAdd(WordToParameter(growth, mode), var_length.value(), mode); 1493 IntPtrOrSmiAdd(WordToParameter(growth, mode), var_length.value(), mode);
1494 GotoUnless(IntPtrOrSmiGreaterThan(new_length, capacity, mode), &fits); 1494 GotoUnless(IntPtrOrSmiGreaterThan(new_length, capacity, mode), &fits);
1495 Node* new_capacity = CalculateNewElementsCapacity( 1495 Node* new_capacity = CalculateNewElementsCapacity(new_length, mode);
1496 IntPtrOrSmiAdd(new_length, IntPtrOrSmiConstant(1, mode), mode), mode);
1497 var_elements.Bind(GrowElementsCapacity(array, var_elements.value(), kind, 1496 var_elements.Bind(GrowElementsCapacity(array, var_elements.value(), kind,
1498 kind, capacity, new_capacity, mode, 1497 kind, capacity, new_capacity, mode,
1499 &pre_bailout)); 1498 &pre_bailout));
1500 Goto(&fits); 1499 Goto(&fits);
1501 Bind(&fits); 1500 Bind(&fits);
1502 Node* elements = var_elements.value(); 1501 Node* elements = var_elements.value();
1503 1502
1504 // Push each argument onto the end of the array now that there is enough 1503 // Push each argument onto the end of the array now that there is enough
1505 // capacity. 1504 // capacity.
1506 CodeStubAssembler::VariableList push_vars({&var_length}, zone()); 1505 CodeStubAssembler::VariableList push_vars({&var_length}, zone());
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after
2339 } else { 2338 } else {
2340 value = LoadHeapNumberValue(value); 2339 value = LoadHeapNumberValue(value);
2341 } 2340 }
2342 } 2341 }
2343 return value; 2342 return value;
2344 } 2343 }
2345 } 2344 }
2346 2345
2347 Node* CodeStubAssembler::CalculateNewElementsCapacity(Node* old_capacity, 2346 Node* CodeStubAssembler::CalculateNewElementsCapacity(Node* old_capacity,
2348 ParameterMode mode) { 2347 ParameterMode mode) {
2349 if (mode == SMI_PARAMETERS) { 2348 Node* half_old_capacity = WordOrSmiShr(old_capacity, 1, mode);
2350 old_capacity = BitcastTaggedToWord(old_capacity); 2349 Node* new_capacity = IntPtrOrSmiAdd(half_old_capacity, old_capacity, mode);
2351 } 2350 Node* padding = IntPtrOrSmiConstant(16, mode);
2352 Node* half_old_capacity = WordShr(old_capacity, IntPtrConstant(1)); 2351 return IntPtrOrSmiAdd(new_capacity, padding, mode);
2353 Node* new_capacity = IntPtrAdd(half_old_capacity, old_capacity);
2354 Node* unconditioned_result = IntPtrAdd(new_capacity, IntPtrConstant(16));
2355 if (mode == SMI_PARAMETERS) {
2356 return SmiAnd(BitcastWordToTaggedSigned(unconditioned_result),
2357 SmiConstant(-1));
2358 } else {
2359 return unconditioned_result;
2360 }
2361 } 2352 }
2362 2353
2363 Node* CodeStubAssembler::TryGrowElementsCapacity(Node* object, Node* elements, 2354 Node* CodeStubAssembler::TryGrowElementsCapacity(Node* object, Node* elements,
2364 ElementsKind kind, Node* key, 2355 ElementsKind kind, Node* key,
2365 Label* bailout) { 2356 Label* bailout) {
2366 Node* capacity = LoadFixedArrayBaseLength(elements); 2357 Node* capacity = LoadFixedArrayBaseLength(elements);
2367 2358
2368 ParameterMode mode = OptimalParameterMode(); 2359 ParameterMode mode = OptimalParameterMode();
2369 capacity = TaggedToParameter(capacity, mode); 2360 capacity = TaggedToParameter(capacity, mode);
2370 key = TaggedToParameter(key, mode); 2361 key = TaggedToParameter(key, mode);
(...skipping 5973 matching lines...) Expand 10 before | Expand all | Expand 10 after
8344 StoreObjectFieldNoWriteBarrier(result, 8335 StoreObjectFieldNoWriteBarrier(result,
8345 PromiseReactionJobInfo::kDebugNameOffset, 8336 PromiseReactionJobInfo::kDebugNameOffset,
8346 SmiConstant(kDebugNotActive)); 8337 SmiConstant(kDebugNotActive));
8347 StoreObjectFieldNoWriteBarrier(result, PromiseReactionJobInfo::kContextOffset, 8338 StoreObjectFieldNoWriteBarrier(result, PromiseReactionJobInfo::kContextOffset,
8348 context); 8339 context);
8349 return result; 8340 return result;
8350 } 8341 }
8351 8342
8352 } // namespace internal 8343 } // namespace internal
8353 } // namespace v8 8344 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.h ('k') | test/cctest/test-code-stub-assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698