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

Side by Side Diff: src/hydrogen.cc

Issue 1124443004: New hydrogen instruction to reduce cost of growing an array on keyed stores. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: REBASE. Created 5 years, 7 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-stubs-hydrogen.cc ('k') | src/hydrogen-instructions.h » ('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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/hydrogen.h" 5 #include "src/hydrogen.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/v8.h" 9 #include "src/v8.h"
10 10
(...skipping 1313 matching lines...) Expand 10 before | Expand all | Expand 10 after
1324 PropertyAccessType access_type) { 1324 PropertyAccessType access_type) {
1325 IfBuilder length_checker(this); 1325 IfBuilder length_checker(this);
1326 1326
1327 Token::Value token = IsHoleyElementsKind(kind) ? Token::GTE : Token::EQ; 1327 Token::Value token = IsHoleyElementsKind(kind) ? Token::GTE : Token::EQ;
1328 length_checker.If<HCompareNumericAndBranch>(key, length, token); 1328 length_checker.If<HCompareNumericAndBranch>(key, length, token);
1329 1329
1330 length_checker.Then(); 1330 length_checker.Then();
1331 1331
1332 HValue* current_capacity = AddLoadFixedArrayLength(elements); 1332 HValue* current_capacity = AddLoadFixedArrayLength(elements);
1333 1333
1334 IfBuilder capacity_checker(this);
1335
1336 capacity_checker.If<HCompareNumericAndBranch>(key, current_capacity,
1337 Token::GTE);
1338 capacity_checker.Then();
1339
1340 // BuildCheckAndGrowElementsCapacity could de-opt without profitable feedback
1341 // therefore we defer calling it to a stub in optimized functions. It is
1342 // okay to call directly in a code stub though, because a bailout to the
1343 // runtime is tolerable in the corner cases.
1344 if (top_info()->IsStub()) { 1334 if (top_info()->IsStub()) {
1335 IfBuilder capacity_checker(this);
1336 capacity_checker.If<HCompareNumericAndBranch>(key, current_capacity,
1337 Token::GTE);
1338 capacity_checker.Then();
1345 HValue* new_elements = BuildCheckAndGrowElementsCapacity( 1339 HValue* new_elements = BuildCheckAndGrowElementsCapacity(
1346 object, elements, kind, length, current_capacity, key); 1340 object, elements, kind, length, current_capacity, key);
1347 environment()->Push(new_elements); 1341 environment()->Push(new_elements);
1342 capacity_checker.Else();
1343 environment()->Push(elements);
1344 capacity_checker.End();
1348 } else { 1345 } else {
1349 GrowArrayElementsStub stub(isolate(), is_js_array, kind); 1346 HValue* result = Add<HMaybeGrowElements>(
1350 GrowArrayElementsDescriptor descriptor(isolate()); 1347 object, elements, key, current_capacity, is_js_array, kind);
1351 HConstant* target = Add<HConstant>(stub.GetCode()); 1348 environment()->Push(result);
1352 HValue* op_vals[] = {context(), object, key, current_capacity};
1353 HValue* new_elements = Add<HCallWithDescriptor>(
1354 target, 0, descriptor, Vector<HValue*>(op_vals, 4));
1355 // If the object changed to a dictionary, GrowArrayElements will return a
1356 // smi to signal that deopt is required.
1357 Add<HCheckHeapObject>(new_elements);
1358 environment()->Push(new_elements);
1359 } 1349 }
1360 1350
1361 capacity_checker.Else();
1362
1363 environment()->Push(elements);
1364 capacity_checker.End();
1365
1366 if (is_js_array) { 1351 if (is_js_array) {
1367 HValue* new_length = AddUncasted<HAdd>(key, graph_->GetConstant1()); 1352 HValue* new_length = AddUncasted<HAdd>(key, graph_->GetConstant1());
1368 new_length->ClearFlag(HValue::kCanOverflow); 1353 new_length->ClearFlag(HValue::kCanOverflow);
1369 1354
1370 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(kind), 1355 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(kind),
1371 new_length); 1356 new_length);
1372 } 1357 }
1373 1358
1374 if (access_type == STORE && kind == FAST_SMI_ELEMENTS) { 1359 if (access_type == STORE && kind == FAST_SMI_ELEMENTS) {
1375 HValue* checked_elements = environment()->Top(); 1360 HValue* checked_elements = environment()->Top();
(...skipping 11771 matching lines...) Expand 10 before | Expand all | Expand 10 after
13147 if (ShouldProduceTraceOutput()) { 13132 if (ShouldProduceTraceOutput()) {
13148 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13133 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13149 } 13134 }
13150 13135
13151 #ifdef DEBUG 13136 #ifdef DEBUG
13152 graph_->Verify(false); // No full verify. 13137 graph_->Verify(false); // No full verify.
13153 #endif 13138 #endif
13154 } 13139 }
13155 13140
13156 } } // namespace v8::internal 13141 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/code-stubs-hydrogen.cc ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698