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

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

Issue 1989363004: [turbofan] Add FixedArray peephole optimizations to CodeStubAssembler (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Review feedback Created 4 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-stub-assembler.h ('k') | src/code-stubs.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 4
5 #include "src/code-stub-assembler.h" 5 #include "src/code-stub-assembler.h"
6 #include "src/code-factory.h" 6 #include "src/code-factory.h"
7 7
8 namespace v8 { 8 namespace v8 {
9 namespace internal { 9 namespace internal {
10 10
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 Bind(&return_x); 236 Bind(&return_x);
237 return var_x.value(); 237 return var_x.value();
238 } 238 }
239 239
240 Node* CodeStubAssembler::SmiFromWord32(Node* value) { 240 Node* CodeStubAssembler::SmiFromWord32(Node* value) {
241 value = ChangeInt32ToIntPtr(value); 241 value = ChangeInt32ToIntPtr(value);
242 return WordShl(value, SmiShiftBitsConstant()); 242 return WordShl(value, SmiShiftBitsConstant());
243 } 243 }
244 244
245 Node* CodeStubAssembler::SmiTag(Node* value) { 245 Node* CodeStubAssembler::SmiTag(Node* value) {
246 int32_t constant_value;
247 if (ToInt32Constant(value, constant_value)) {
248 DCHECK(constant_value >= Smi::kMinValue &&
249 constant_value <= Smi::kMaxValue);
Michael Starzinger 2016/05/19 11:19:17 nit: DCHECK(Smi::IsValid(constant_value))
danno 2016/05/19 14:25:49 Done.
250 return SmiConstant(Smi::FromInt(constant_value));
251 }
246 return WordShl(value, SmiShiftBitsConstant()); 252 return WordShl(value, SmiShiftBitsConstant());
247 } 253 }
248 254
249 Node* CodeStubAssembler::SmiUntag(Node* value) { 255 Node* CodeStubAssembler::SmiUntag(Node* value) {
250 return WordSar(value, SmiShiftBitsConstant()); 256 return WordSar(value, SmiShiftBitsConstant());
251 } 257 }
252 258
253 Node* CodeStubAssembler::SmiToWord32(Node* value) { 259 Node* CodeStubAssembler::SmiToWord32(Node* value) {
254 Node* result = WordSar(value, SmiShiftBitsConstant()); 260 Node* result = WordSar(value, SmiShiftBitsConstant());
255 if (Is64()) { 261 if (Is64()) {
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 Node* total_size = IntPtrAdd(data_size, header_size); 522 Node* total_size = IntPtrAdd(data_size, header_size);
517 523
518 Node* result = Allocate(total_size, kNone); 524 Node* result = Allocate(total_size, kNone);
519 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kFixedArrayMapRootIndex)); 525 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kFixedArrayMapRootIndex));
520 StoreObjectFieldNoWriteBarrier(result, FixedArray::kLengthOffset, 526 StoreObjectFieldNoWriteBarrier(result, FixedArray::kLengthOffset,
521 SmiTag(length)); 527 SmiTag(length));
522 528
523 return result; 529 return result;
524 } 530 }
525 531
526 Node* CodeStubAssembler::LoadFixedArrayElementInt32Index( 532 Node* CodeStubAssembler::LoadFixedArrayElement(Node* object, Node* index_node,
527 Node* object, Node* index, int additional_offset) { 533 int additional_offset,
528 Node* header_size = IntPtrConstant(additional_offset + 534 ParameterMode parameter_mode) {
529 FixedArray::kHeaderSize - kHeapObjectTag); 535 int32_t header_size =
530 index = ChangeInt32ToIntPtr(index); 536 FixedArray::kHeaderSize + additional_offset - kHeapObjectTag;
531 Node* scaled_index = WordShl(index, IntPtrConstant(kPointerSizeLog2)); 537 Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_ELEMENTS,
532 Node* offset = IntPtrAdd(scaled_index, header_size); 538 parameter_mode, header_size);
533 return Load(MachineType::AnyTagged(), object, offset); 539 return Load(MachineType::AnyTagged(), object, offset);
534 } 540 }
535 541
536 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { 542 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) {
537 return Load(MachineType::Uint8(), map, 543 return Load(MachineType::Uint8(), map,
538 IntPtrConstant(Map::kInstanceSizeOffset - kHeapObjectTag)); 544 IntPtrConstant(Map::kInstanceSizeOffset - kHeapObjectTag));
539 } 545 }
540 546
541 Node* CodeStubAssembler::LoadFixedArrayElementSmiIndex(Node* object,
542 Node* smi_index,
543 int additional_offset) {
544 int const kSmiShiftBits = kSmiShiftSize + kSmiTagSize;
545 Node* header_size = IntPtrConstant(additional_offset +
546 FixedArray::kHeaderSize - kHeapObjectTag);
547 Node* scaled_index =
548 (kSmiShiftBits > kPointerSizeLog2)
549 ? WordSar(smi_index, IntPtrConstant(kSmiShiftBits - kPointerSizeLog2))
550 : WordShl(smi_index,
551 IntPtrConstant(kPointerSizeLog2 - kSmiShiftBits));
552 Node* offset = IntPtrAdd(scaled_index, header_size);
553 return Load(MachineType::AnyTagged(), object, offset);
554 }
555
556 Node* CodeStubAssembler::LoadFixedArrayElementConstantIndex(Node* object,
557 int index) {
558 Node* offset = IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag +
559 index * kPointerSize);
560 return Load(MachineType::AnyTagged(), object, offset);
561 }
562
563 Node* CodeStubAssembler::LoadNativeContext(Node* context) { 547 Node* CodeStubAssembler::LoadNativeContext(Node* context) {
564 return LoadFixedArrayElementConstantIndex(context, 548 return LoadFixedArrayElement(context,
565 Context::NATIVE_CONTEXT_INDEX); 549 Int32Constant(Context::NATIVE_CONTEXT_INDEX));
566 } 550 }
567 551
568 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, 552 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind,
569 Node* native_context) { 553 Node* native_context) {
570 return LoadFixedArrayElementConstantIndex(native_context, 554 return LoadFixedArrayElement(native_context,
571 Context::ArrayMapIndex(kind)); 555 Int32Constant(Context::ArrayMapIndex(kind)));
572 } 556 }
573 557
574 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { 558 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) {
575 return StoreNoWriteBarrier( 559 return StoreNoWriteBarrier(
576 MachineRepresentation::kFloat64, object, 560 MachineRepresentation::kFloat64, object,
577 IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag), value); 561 IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag), value);
578 } 562 }
579 563
580 Node* CodeStubAssembler::StoreObjectField( 564 Node* CodeStubAssembler::StoreObjectField(
581 Node* object, int offset, Node* value) { 565 Node* object, int offset, Node* value) {
582 return Store(MachineRepresentation::kTagged, object, 566 return Store(MachineRepresentation::kTagged, object,
583 IntPtrConstant(offset - kHeapObjectTag), value); 567 IntPtrConstant(offset - kHeapObjectTag), value);
584 } 568 }
585 569
586 Node* CodeStubAssembler::StoreObjectFieldNoWriteBarrier( 570 Node* CodeStubAssembler::StoreObjectFieldNoWriteBarrier(
587 Node* object, int offset, Node* value, MachineRepresentation rep) { 571 Node* object, int offset, Node* value, MachineRepresentation rep) {
588 return StoreNoWriteBarrier(rep, object, 572 return StoreNoWriteBarrier(rep, object,
589 IntPtrConstant(offset - kHeapObjectTag), value); 573 IntPtrConstant(offset - kHeapObjectTag), value);
590 } 574 }
591 575
592 Node* CodeStubAssembler::StoreMapNoWriteBarrier(Node* object, Node* map) { 576 Node* CodeStubAssembler::StoreMapNoWriteBarrier(Node* object, Node* map) {
593 return StoreNoWriteBarrier( 577 return StoreNoWriteBarrier(
594 MachineRepresentation::kTagged, object, 578 MachineRepresentation::kTagged, object,
595 IntPtrConstant(HeapNumber::kMapOffset - kHeapObjectTag), map); 579 IntPtrConstant(HeapNumber::kMapOffset - kHeapObjectTag), map);
596 } 580 }
597 581
598 Node* CodeStubAssembler::StoreFixedArrayElementNoWriteBarrier(Node* object, 582 Node* CodeStubAssembler::StoreFixedArrayElement(Node* object, Node* index_node,
599 Node* index, 583 Node* value,
600 Node* value) { 584 WriteBarrierMode barrier_mode,
601 index = ChangeInt32ToIntPtr(index); 585 ParameterMode parameter_mode) {
586 DCHECK(barrier_mode == SKIP_WRITE_BARRIER ||
587 barrier_mode == UPDATE_WRITE_BARRIER);
602 Node* offset = 588 Node* offset =
603 IntPtrAdd(WordShl(index, IntPtrConstant(kPointerSizeLog2)), 589 ElementOffsetFromIndex(index_node, FAST_HOLEY_ELEMENTS, parameter_mode,
604 IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag)); 590 FixedArray::kHeaderSize - kHeapObjectTag);
605 return StoreNoWriteBarrier(MachineRepresentation::kTagged, object, offset, 591 MachineRepresentation rep = MachineRepresentation::kTagged;
606 value); 592 if (barrier_mode == SKIP_WRITE_BARRIER) {
593 return StoreNoWriteBarrier(rep, object, offset, value);
594 } else {
595 return Store(rep, object, offset, value);
596 }
607 } 597 }
608 598
609 Node* CodeStubAssembler::StoreFixedArrayElementInt32Index(Node* object, 599 Node* CodeStubAssembler::StoreFixedDoubleArrayElement(
610 Node* index, 600 Node* object, Node* index_node, Node* value, ParameterMode parameter_mode) {
611 Node* value) {
612 index = ChangeInt32ToIntPtr(index);
613 Node* offset = 601 Node* offset =
614 IntPtrAdd(WordShl(index, IntPtrConstant(kPointerSizeLog2)), 602 ElementOffsetFromIndex(index_node, FAST_DOUBLE_ELEMENTS, parameter_mode,
615 IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag)); 603 FixedArray::kHeaderSize - kHeapObjectTag);
616 return Store(MachineRepresentation::kTagged, object, offset, value); 604 MachineRepresentation rep = MachineRepresentation::kFloat64;
617 } 605 return StoreNoWriteBarrier(rep, object, offset, value);
618
619 Node* CodeStubAssembler::StoreFixedDoubleArrayElementInt32Index(Node* object,
620 Node* index,
621 Node* value) {
622 index = ChangeInt32ToIntPtr(index);
623 Node* offset =
624 IntPtrAdd(WordShl(index, IntPtrConstant(kPointerSizeLog2)),
625 IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag));
626 return StoreNoWriteBarrier(MachineRepresentation::kFloat64, object, offset,
627 value);
628 }
629
630 Node* CodeStubAssembler::StoreFixedArrayElementInt32Index(Node* object,
631 int index,
632 Node* value) {
633 Node* offset = IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag +
634 index * kPointerSize);
635 return Store(MachineRepresentation::kTagged, object, offset, value);
636 }
637
638 Node* CodeStubAssembler::StoreFixedArrayElementNoWriteBarrier(Node* object,
639 int index,
640 Node* value) {
641 Node* offset = IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag +
642 index * kPointerSize);
643 return StoreNoWriteBarrier(MachineRepresentation::kTagged, object, offset,
644 value);
645 }
646
647 Node* CodeStubAssembler::StoreFixedDoubleArrayElementInt32Index(Node* object,
648 int index,
649 Node* value) {
650 Node* offset = IntPtrConstant(FixedDoubleArray::kHeaderSize - kHeapObjectTag +
651 index * kDoubleSize);
652 return StoreNoWriteBarrier(MachineRepresentation::kFloat64, object, offset,
653 value);
654 } 606 }
655 607
656 Node* CodeStubAssembler::AllocateHeapNumber() { 608 Node* CodeStubAssembler::AllocateHeapNumber() {
657 Node* result = Allocate(HeapNumber::kSize, kNone); 609 Node* result = Allocate(HeapNumber::kSize, kNone);
658 StoreMapNoWriteBarrier(result, HeapNumberMapConstant()); 610 StoreMapNoWriteBarrier(result, HeapNumberMapConstant());
659 return result; 611 return result;
660 } 612 }
661 613
662 Node* CodeStubAssembler::AllocateHeapNumberWithValue(Node* value) { 614 Node* CodeStubAssembler::AllocateHeapNumberWithValue(Node* value) {
663 Node* result = AllocateHeapNumber(); 615 Node* result = AllocateHeapNumber();
(...skipping 15 matching lines...) Expand all
679 Node* result = Allocate(SeqTwoByteString::SizeFor(length)); 631 Node* result = Allocate(SeqTwoByteString::SizeFor(length));
680 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kStringMapRootIndex)); 632 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kStringMapRootIndex));
681 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kLengthOffset, 633 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kLengthOffset,
682 SmiConstant(Smi::FromInt(length))); 634 SmiConstant(Smi::FromInt(length)));
683 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kHashFieldSlot, 635 StoreObjectFieldNoWriteBarrier(result, SeqTwoByteString::kHashFieldSlot,
684 IntPtrConstant(String::kEmptyHashField)); 636 IntPtrConstant(String::kEmptyHashField));
685 return result; 637 return result;
686 } 638 }
687 639
688 Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map, 640 Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map,
689 int capacity, int length, 641 Node* capacity_node, Node* length_node,
690 compiler::Node* allocation_site) { 642 compiler::Node* allocation_site,
643 ParameterMode mode) {
691 bool is_double = IsFastDoubleElementsKind(kind); 644 bool is_double = IsFastDoubleElementsKind(kind);
692 int element_size = is_double ? kDoubleSize : kPointerSize; 645 int base_size = JSArray::kSize + FixedArray::kHeaderSize;
693 int total_size =
694 JSArray::kSize + FixedArray::kHeaderSize + element_size * capacity;
695 int elements_offset = JSArray::kSize; 646 int elements_offset = JSArray::kSize;
696 647
697 if (allocation_site != nullptr) { 648 if (allocation_site != nullptr) {
698 total_size += AllocationMemento::kSize; 649 base_size += AllocationMemento::kSize;
699 elements_offset += AllocationMemento::kSize; 650 elements_offset += AllocationMemento::kSize;
700 } 651 }
701 652
653 int32_t capacity;
654 bool constant_capacity = ToInt32Constant(capacity_node, capacity);
655 Node* total_size =
656 ElementOffsetFromIndex(capacity_node, kind, mode, base_size);
657
702 // Allocate both array and elements object, and initialize the JSArray. 658 // Allocate both array and elements object, and initialize the JSArray.
703 Heap* heap = isolate()->heap(); 659 Heap* heap = isolate()->heap();
704 Node* array = Allocate(total_size); 660 Node* array = Allocate(total_size);
705 StoreMapNoWriteBarrier(array, array_map); 661 StoreMapNoWriteBarrier(array, array_map);
706 Node* empty_properties = 662 Node* empty_properties =
707 HeapConstant(Handle<HeapObject>(heap->empty_fixed_array())); 663 HeapConstant(Handle<HeapObject>(heap->empty_fixed_array()));
708 StoreObjectFieldNoWriteBarrier(array, JSArray::kPropertiesOffset, 664 StoreObjectFieldNoWriteBarrier(array, JSArray::kPropertiesOffset,
709 empty_properties); 665 empty_properties);
710 StoreObjectFieldNoWriteBarrier(array, JSArray::kLengthOffset, 666 StoreObjectFieldNoWriteBarrier(
711 SmiConstant(Smi::FromInt(length))); 667 array, JSArray::kLengthOffset,
668 mode == SMI_PARAMETERS ? length_node : SmiTag(length_node));
712 669
713 if (allocation_site != nullptr) { 670 if (allocation_site != nullptr) {
714 InitializeAllocationMemento(array, JSArray::kSize, allocation_site); 671 InitializeAllocationMemento(array, JSArray::kSize, allocation_site);
715 } 672 }
716 673
717 // Setup elements object. 674 // Setup elements object.
718 Node* elements = InnerAllocate(array, elements_offset); 675 Node* elements = InnerAllocate(array, elements_offset);
719 StoreObjectFieldNoWriteBarrier(array, JSArray::kElementsOffset, elements); 676 StoreObjectFieldNoWriteBarrier(array, JSArray::kElementsOffset, elements);
720 Handle<Map> elements_map(is_double ? heap->fixed_double_array_map() 677 Handle<Map> elements_map(is_double ? heap->fixed_double_array_map()
721 : heap->fixed_array_map()); 678 : heap->fixed_array_map());
722 StoreMapNoWriteBarrier(elements, HeapConstant(elements_map)); 679 StoreMapNoWriteBarrier(elements, HeapConstant(elements_map));
723 StoreObjectFieldNoWriteBarrier(elements, FixedArray::kLengthOffset, 680 StoreObjectFieldNoWriteBarrier(
724 SmiConstant(Smi::FromInt(capacity))); 681 elements, FixedArray::kLengthOffset,
682 mode == SMI_PARAMETERS ? capacity_node : SmiTag(capacity_node));
725 683
726 Node* double_hole = Float64Constant(bit_cast<double>(kHoleNanInt64)); 684 Node* double_hole = Float64Constant(bit_cast<double>(kHoleNanInt64));
727 Node* hole = HeapConstant(Handle<HeapObject>(heap->the_hole_value())); 685 Node* hole = HeapConstant(Handle<HeapObject>(heap->the_hole_value()));
728 if (capacity <= kElementLoopUnrollThreshold) { 686 if (constant_capacity && capacity <= kElementLoopUnrollThreshold) {
729 for (int i = 0; i < capacity; ++i) { 687 for (int i = 0; i < capacity; ++i) {
730 if (is_double) { 688 if (is_double) {
731 StoreFixedDoubleArrayElementInt32Index(elements, i, double_hole); 689 StoreFixedDoubleArrayElement(elements, Int32Constant(i), double_hole);
732 } else { 690 } else {
733 StoreFixedArrayElementNoWriteBarrier(elements, i, hole); 691 StoreFixedArrayElement(elements, Int32Constant(i), hole,
692 SKIP_WRITE_BARRIER);
734 } 693 }
735 } 694 }
736 } else { 695 } else {
737 // TODO(danno): Add a loop for initialization 696 // TODO(danno): Add a loop for initialization
738 UNIMPLEMENTED(); 697 UNIMPLEMENTED();
739 } 698 }
740 699
741 return array; 700 return array;
742 } 701 }
743 702
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 &if_codeisonebyte, &if_codeistwobyte); 1183 &if_codeisonebyte, &if_codeistwobyte);
1225 Bind(&if_codeisonebyte); 1184 Bind(&if_codeisonebyte);
1226 { 1185 {
1227 // Load the isolate wide single character string cache. 1186 // Load the isolate wide single character string cache.
1228 Node* cache = LoadRoot(Heap::kSingleCharacterStringCacheRootIndex); 1187 Node* cache = LoadRoot(Heap::kSingleCharacterStringCacheRootIndex);
1229 1188
1230 // Check if we have an entry for the {code} in the single character string 1189 // Check if we have an entry for the {code} in the single character string
1231 // cache already. 1190 // cache already.
1232 Label if_entryisundefined(this, Label::kDeferred), 1191 Label if_entryisundefined(this, Label::kDeferred),
1233 if_entryisnotundefined(this); 1192 if_entryisnotundefined(this);
1234 Node* entry = LoadFixedArrayElementInt32Index(cache, code); 1193 Node* entry = LoadFixedArrayElement(cache, code);
1235 Branch(WordEqual(entry, UndefinedConstant()), &if_entryisundefined, 1194 Branch(WordEqual(entry, UndefinedConstant()), &if_entryisundefined,
1236 &if_entryisnotundefined); 1195 &if_entryisnotundefined);
1237 1196
1238 Bind(&if_entryisundefined); 1197 Bind(&if_entryisundefined);
1239 { 1198 {
1240 // Allocate a new SeqOneByteString for {code} and store it in the {cache}. 1199 // Allocate a new SeqOneByteString for {code} and store it in the {cache}.
1241 Node* result = AllocateSeqOneByteString(1); 1200 Node* result = AllocateSeqOneByteString(1);
1242 StoreNoWriteBarrier( 1201 StoreNoWriteBarrier(
1243 MachineRepresentation::kWord8, result, 1202 MachineRepresentation::kWord8, result,
1244 IntPtrConstant(SeqOneByteString::kHeaderSize - kHeapObjectTag), code); 1203 IntPtrConstant(SeqOneByteString::kHeaderSize - kHeapObjectTag), code);
1245 StoreFixedArrayElementInt32Index(cache, code, result); 1204 StoreFixedArrayElement(cache, code, result);
1246 var_result.Bind(result); 1205 var_result.Bind(result);
1247 Goto(&if_done); 1206 Goto(&if_done);
1248 } 1207 }
1249 1208
1250 Bind(&if_entryisnotundefined); 1209 Bind(&if_entryisnotundefined);
1251 { 1210 {
1252 // Return the entry from the {cache}. 1211 // Return the entry from the {cache}.
1253 var_result.Bind(entry); 1212 var_result.Bind(entry);
1254 Goto(&if_done); 1213 Goto(&if_done);
1255 } 1214 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 Bind(&loop); 1321 Bind(&loop);
1363 { 1322 {
1364 Node* index = var_descriptor.value(); 1323 Node* index = var_descriptor.value();
1365 Node* offset = Int32Constant(DescriptorArray::ToKeyIndex(0)); 1324 Node* offset = Int32Constant(DescriptorArray::ToKeyIndex(0));
1366 Node* factor = Int32Constant(DescriptorArray::kDescriptorSize); 1325 Node* factor = Int32Constant(DescriptorArray::kDescriptorSize);
1367 Label if_notdone(this); 1326 Label if_notdone(this);
1368 Branch(Word32Equal(index, nof), if_not_found, &if_notdone); 1327 Branch(Word32Equal(index, nof), if_not_found, &if_notdone);
1369 Bind(&if_notdone); 1328 Bind(&if_notdone);
1370 { 1329 {
1371 Node* array_index = Int32Add(offset, Int32Mul(index, factor)); 1330 Node* array_index = Int32Add(offset, Int32Mul(index, factor));
1372 Node* current = LoadFixedArrayElementInt32Index(descriptors, array_index); 1331 Node* current = LoadFixedArrayElement(descriptors, array_index);
1373 Label if_unequal(this); 1332 Label if_unequal(this);
1374 Branch(WordEqual(current, name), if_found, &if_unequal); 1333 Branch(WordEqual(current, name), if_found, &if_unequal);
1375 Bind(&if_unequal); 1334 Bind(&if_unequal);
1376 1335
1377 var_descriptor.Bind(Int32Add(index, Int32Constant(1))); 1336 var_descriptor.Bind(Int32Add(index, Int32Constant(1)));
1378 Goto(&loop); 1337 Goto(&loop);
1379 } 1338 }
1380 } 1339 }
1381 } 1340 }
1382 1341
(...skipping 20 matching lines...) Expand all
1403 Bind(&if_isobjectorsmi); 1362 Bind(&if_isobjectorsmi);
1404 { 1363 {
1405 Node* elements = LoadElements(object); 1364 Node* elements = LoadElements(object);
1406 Node* length = LoadFixedArrayBaseLength(elements); 1365 Node* length = LoadFixedArrayBaseLength(elements);
1407 1366
1408 Label if_iskeyinrange(this); 1367 Label if_iskeyinrange(this);
1409 Branch(Int32LessThan(index, SmiToWord32(length)), &if_iskeyinrange, 1368 Branch(Int32LessThan(index, SmiToWord32(length)), &if_iskeyinrange,
1410 if_not_found); 1369 if_not_found);
1411 1370
1412 Bind(&if_iskeyinrange); 1371 Bind(&if_iskeyinrange);
1413 Node* element = LoadFixedArrayElementInt32Index(elements, index); 1372 Node* element = LoadFixedArrayElement(elements, index);
1414 Node* the_hole = LoadRoot(Heap::kTheHoleValueRootIndex); 1373 Node* the_hole = LoadRoot(Heap::kTheHoleValueRootIndex);
1415 Branch(WordEqual(element, the_hole), if_not_found, if_found); 1374 Branch(WordEqual(element, the_hole), if_not_found, if_found);
1416 } 1375 }
1417 } 1376 }
1418 1377
1419 Node* CodeStubAssembler::OrdinaryHasInstance(Node* context, Node* callable, 1378 Node* CodeStubAssembler::OrdinaryHasInstance(Node* context, Node* callable,
1420 Node* object) { 1379 Node* object) {
1421 Variable var_result(this, MachineRepresentation::kTagged); 1380 Variable var_result(this, MachineRepresentation::kTagged);
1422 Label return_false(this), return_true(this), 1381 Label return_false(this), return_true(this),
1423 return_runtime(this, Label::kDeferred), return_result(this); 1382 return_runtime(this, Label::kDeferred), return_result(this);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1545 // Fallback to the runtime implementation. 1504 // Fallback to the runtime implementation.
1546 var_result.Bind( 1505 var_result.Bind(
1547 CallRuntime(Runtime::kOrdinaryHasInstance, context, callable, object)); 1506 CallRuntime(Runtime::kOrdinaryHasInstance, context, callable, object));
1548 } 1507 }
1549 Goto(&return_result); 1508 Goto(&return_result);
1550 1509
1551 Bind(&return_result); 1510 Bind(&return_result);
1552 return var_result.value(); 1511 return var_result.value();
1553 } 1512 }
1554 1513
1514 compiler::Node* CodeStubAssembler::ElementOffsetFromIndex(Node* index_node,
1515 ElementsKind kind,
1516 ParameterMode mode,
1517 int base_size) {
1518 bool is_double = IsFastDoubleElementsKind(kind);
1519 int element_size_shift = is_double ? kDoubleSizeLog2 : kPointerSizeLog2;
1520 int element_size = 1 << element_size_shift;
1521 int const kSmiShiftBits = kSmiShiftSize + kSmiTagSize;
1522 int32_t index = 0;
1523 bool constant_index = false;
1524 if (mode == SMI_PARAMETERS) {
1525 element_size_shift -= kSmiShiftBits;
1526 intptr_t temp;
Michael Starzinger 2016/05/19 11:19:17 nit: Better initialize "temp" here, because it is
danno 2016/05/19 14:25:49 Done.
1527 constant_index = ToIntPtrConstant(index_node, temp);
1528 index = temp >> kSmiShiftBits;
1529 } else {
1530 constant_index = ToInt32Constant(index_node, index);
1531 }
1532 if (constant_index) {
1533 return IntPtrConstant(base_size + element_size * index);
1534 }
1535 if (base_size == 0) {
1536 return (element_size_shift >= 0)
1537 ? WordShl(index_node, IntPtrConstant(element_size_shift))
1538 : WordShr(index_node, IntPtrConstant(-element_size_shift));
1539 }
1540 return IntPtrAdd(
1541 Int32Constant(base_size),
1542 (element_size_shift >= 0)
1543 ? WordShl(index_node, IntPtrConstant(element_size_shift))
1544 : WordShr(index_node, IntPtrConstant(-element_size_shift)));
1545 }
1546
1555 } // namespace internal 1547 } // namespace internal
1556 } // namespace v8 1548 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698