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 | 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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |