OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/interpreter/interpreter-assembler.h" | 5 #include "src/interpreter/interpreter-assembler.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <ostream> | 8 #include <ostream> |
9 | 9 |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
708 #endif | 708 #endif |
709 } | 709 } |
710 | 710 |
711 Node* InterpreterAssembler::RegisterCount() { | 711 Node* InterpreterAssembler::RegisterCount() { |
712 Node* bytecode_array = LoadRegister(Register::bytecode_array()); | 712 Node* bytecode_array = LoadRegister(Register::bytecode_array()); |
713 Node* frame_size = LoadObjectField( | 713 Node* frame_size = LoadObjectField( |
714 bytecode_array, BytecodeArray::kFrameSizeOffset, MachineType::Int32()); | 714 bytecode_array, BytecodeArray::kFrameSizeOffset, MachineType::Int32()); |
715 return Word32Sar(frame_size, Int32Constant(kPointerSizeLog2)); | 715 return Word32Sar(frame_size, Int32Constant(kPointerSizeLog2)); |
716 } | 716 } |
717 | 717 |
718 Node* InterpreterAssembler::ExportRegisterFile() { | 718 Node* InterpreterAssembler::ExportRegisterFile(Node* array) { |
719 Node* register_count = RegisterCount(); | |
720 Node* array = | |
721 AllocateUninitializedFixedArray(ChangeInt32ToIntPtr(register_count)); | |
722 | |
723 Variable var_index(this, MachineRepresentation::kWord32); | 719 Variable var_index(this, MachineRepresentation::kWord32); |
724 var_index.Bind(Int32Constant(0)); | 720 var_index.Bind(Int32Constant(0)); |
725 | 721 |
rmcilroy
2016/04/28 11:40:57
Maybe we could add if (FLAG_debug_code) which chec
neis
2016/04/28 11:47:21
Acknowledged. But why this flag rather than a DCHE
neis
2016/04/28 12:05:25
Nevermind, I got it.
| |
726 // Iterate over register file and write values into array. | 722 // Iterate over register file and write values into array. |
727 Label loop(this, &var_index), done_loop(this); | 723 Label loop(this, &var_index), done_loop(this); |
728 Goto(&loop); | 724 Goto(&loop); |
729 Bind(&loop); | 725 Bind(&loop); |
730 { | 726 { |
731 Node* index = var_index.value(); | 727 Node* index = var_index.value(); |
732 Node* condition = Int32LessThan(index, register_count); | 728 Node* condition = Int32LessThan(index, RegisterCount()); |
733 GotoUnless(condition, &done_loop); | 729 GotoUnless(condition, &done_loop); |
734 | 730 |
735 Node* reg_index = | 731 Node* reg_index = |
736 Int32Sub(Int32Constant(Register(0).ToOperand()), index); | 732 Int32Sub(Int32Constant(Register(0).ToOperand()), index); |
737 Node* value = LoadRegister(ChangeInt32ToIntPtr(reg_index)); | 733 Node* value = LoadRegister(ChangeInt32ToIntPtr(reg_index)); |
738 | 734 |
739 // No write barrier needed for writing into freshly allocated object. | 735 // No write barrier needed for writing into freshly allocated object. |
rmcilroy
2016/04/28 11:40:57
This is no longer the case, I guess we need a writ
neis
2016/04/28 11:47:21
Good catch :)
| |
740 StoreFixedArrayElementNoWriteBarrier( | 736 StoreFixedArrayElementNoWriteBarrier( |
741 array, ChangeInt32ToIntPtr(index), value); | 737 array, ChangeInt32ToIntPtr(index), value); |
742 | 738 |
743 var_index.Bind(Int32Add(index, Int32Constant(1))); | 739 var_index.Bind(Int32Add(index, Int32Constant(1))); |
744 Goto(&loop); | 740 Goto(&loop); |
745 } | 741 } |
746 Bind(&done_loop); | 742 Bind(&done_loop); |
747 | 743 |
748 return array; | 744 return array; |
749 } | 745 } |
750 | 746 |
751 Node* InterpreterAssembler::ImportRegisterFile(Node* array) { | 747 Node* InterpreterAssembler::ImportRegisterFile(Node* array) { |
752 Node* register_count = RegisterCount(); | |
753 | |
754 Variable var_index(this, MachineRepresentation::kWord32); | 748 Variable var_index(this, MachineRepresentation::kWord32); |
755 var_index.Bind(Int32Constant(0)); | 749 var_index.Bind(Int32Constant(0)); |
756 | 750 |
rmcilroy
2016/04/28 11:40:57
ditto
neis
2016/04/28 11:47:21
Acknowledged.
| |
757 // Iterate over array and write values into register file. | 751 // Iterate over array and write values into register file. Also erase the |
752 // array contents to not keep them alive artificially. | |
758 Label loop(this, &var_index), done_loop(this); | 753 Label loop(this, &var_index), done_loop(this); |
759 Goto(&loop); | 754 Goto(&loop); |
760 Bind(&loop); | 755 Bind(&loop); |
761 { | 756 { |
762 Node* index = var_index.value(); | 757 Node* index = var_index.value(); |
763 Node* condition = Int32LessThan(index, register_count); | 758 Node* condition = Int32LessThan(index, RegisterCount()); |
764 GotoUnless(condition, &done_loop); | 759 GotoUnless(condition, &done_loop); |
765 | 760 |
766 Node* value = LoadFixedArrayElementInt32Index(array, index); | 761 Node* value = LoadFixedArrayElementInt32Index(array, index); |
767 | 762 |
768 Node* reg_index = | 763 Node* reg_index = |
769 Int32Sub(Int32Constant(Register(0).ToOperand()), index); | 764 Int32Sub(Int32Constant(Register(0).ToOperand()), index); |
770 StoreRegister(value, ChangeInt32ToIntPtr(reg_index)); | 765 StoreRegister(value, ChangeInt32ToIntPtr(reg_index)); |
771 | 766 |
767 StoreFixedArrayElementInt32Index(array, index, StaleRegisterConstant()); | |
768 | |
772 var_index.Bind(Int32Add(index, Int32Constant(1))); | 769 var_index.Bind(Int32Add(index, Int32Constant(1))); |
773 Goto(&loop); | 770 Goto(&loop); |
774 } | 771 } |
775 Bind(&done_loop); | 772 Bind(&done_loop); |
776 | 773 |
777 return array; | 774 return array; |
778 } | 775 } |
779 | 776 |
780 } // namespace interpreter | 777 } // namespace interpreter |
781 } // namespace internal | 778 } // namespace internal |
782 } // namespace v8 | 779 } // namespace v8 |
OLD | NEW |