OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 | 5 |
6 | 6 |
7 #include "src/v8.h" | 7 #include "src/v8.h" |
8 | 8 |
9 #if V8_TARGET_ARCH_MIPS64 | 9 #if V8_TARGET_ARCH_MIPS64 |
10 | 10 |
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 | 910 |
911 // Do a stack check to ensure we don't go over the limit. | 911 // Do a stack check to ensure we don't go over the limit. |
912 Label ok; | 912 Label ok; |
913 __ Dsubu(a5, sp, Operand(a4)); | 913 __ Dsubu(a5, sp, Operand(a4)); |
914 __ LoadRoot(a2, Heap::kRealStackLimitRootIndex); | 914 __ LoadRoot(a2, Heap::kRealStackLimitRootIndex); |
915 __ Branch(&ok, hs, a5, Operand(a2)); | 915 __ Branch(&ok, hs, a5, Operand(a2)); |
916 __ InvokeBuiltin(Builtins::STACK_OVERFLOW, CALL_FUNCTION); | 916 __ InvokeBuiltin(Builtins::STACK_OVERFLOW, CALL_FUNCTION); |
917 __ bind(&ok); | 917 __ bind(&ok); |
918 | 918 |
919 // If ok, push undefined as the initial value for all register file entries. | 919 // If ok, push undefined as the initial value for all register file entries. |
920 // Note: there should always be at least one stack slot for the return | |
921 // register in the register file. | |
922 Label loop_header; | 920 Label loop_header; |
| 921 Label loop_check; |
923 __ LoadRoot(a5, Heap::kUndefinedValueRootIndex); | 922 __ LoadRoot(a5, Heap::kUndefinedValueRootIndex); |
| 923 __ Branch(&loop_check); |
924 __ bind(&loop_header); | 924 __ bind(&loop_header); |
925 // TODO(rmcilroy): Consider doing more than one push per loop iteration. | 925 // TODO(rmcilroy): Consider doing more than one push per loop iteration. |
926 __ push(a5); | 926 __ push(a5); |
927 // Continue loop if not done. | 927 // Continue loop if not done. |
| 928 __ bind(&loop_check); |
928 __ Dsubu(a4, a4, Operand(kPointerSize)); | 929 __ Dsubu(a4, a4, Operand(kPointerSize)); |
929 __ Branch(&loop_header, ge, a4, Operand(zero_reg)); | 930 __ Branch(&loop_header, ge, a4, Operand(zero_reg)); |
930 } | 931 } |
931 | 932 |
932 // TODO(rmcilroy): List of things not currently dealt with here but done in | 933 // TODO(rmcilroy): List of things not currently dealt with here but done in |
933 // fullcodegen's prologue: | 934 // fullcodegen's prologue: |
934 // - Support profiler (specifically profiling_counter). | 935 // - Support profiler (specifically profiling_counter). |
935 // - Call ProfileEntryHookStub when isolate has a function_entry_hook. | 936 // - Call ProfileEntryHookStub when isolate has a function_entry_hook. |
936 // - Allow simulator stop operations if FLAG_stop_at is set. | 937 // - Allow simulator stop operations if FLAG_stop_at is set. |
937 // - Deal with sloppy mode functions which need to replace the | 938 // - Deal with sloppy mode functions which need to replace the |
(...skipping 15 matching lines...) Expand all Loading... |
953 // Perform stack guard check. | 954 // Perform stack guard check. |
954 { | 955 { |
955 Label ok; | 956 Label ok; |
956 __ LoadRoot(at, Heap::kStackLimitRootIndex); | 957 __ LoadRoot(at, Heap::kStackLimitRootIndex); |
957 __ Branch(&ok, hs, sp, Operand(at)); | 958 __ Branch(&ok, hs, sp, Operand(at)); |
958 __ CallRuntime(Runtime::kStackGuard, 0); | 959 __ CallRuntime(Runtime::kStackGuard, 0); |
959 __ bind(&ok); | 960 __ bind(&ok); |
960 } | 961 } |
961 | 962 |
962 // Load bytecode offset and dispatch table into registers. | 963 // Load bytecode offset and dispatch table into registers. |
| 964 __ LoadRoot(kInterpreterAccumulatorRegister, Heap::kUndefinedValueRootIndex); |
| 965 __ Dsubu( |
| 966 kInterpreterRegisterFileRegister, fp, |
| 967 Operand(kPointerSize + StandardFrameConstants::kFixedFrameSizeFromFp)); |
963 __ li(kInterpreterBytecodeOffsetRegister, | 968 __ li(kInterpreterBytecodeOffsetRegister, |
964 Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); | 969 Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); |
965 __ LoadRoot(kInterpreterDispatchTableRegister, | 970 __ LoadRoot(kInterpreterDispatchTableRegister, |
966 Heap::kInterpreterTableRootIndex); | 971 Heap::kInterpreterTableRootIndex); |
967 __ Daddu(kInterpreterDispatchTableRegister, kInterpreterDispatchTableRegister, | 972 __ Daddu(kInterpreterDispatchTableRegister, kInterpreterDispatchTableRegister, |
968 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | 973 Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
969 | 974 |
970 // Dispatch to the first bytecode handler for the function. | 975 // Dispatch to the first bytecode handler for the function. |
971 __ Daddu(a0, kInterpreterBytecodeArrayRegister, | 976 __ Daddu(a0, kInterpreterBytecodeArrayRegister, |
972 kInterpreterBytecodeOffsetRegister); | 977 kInterpreterBytecodeOffsetRegister); |
973 __ lbu(a0, MemOperand(a0)); | 978 __ lbu(a0, MemOperand(a0)); |
974 __ dsll(at, a0, kPointerSizeLog2); | 979 __ dsll(at, a0, kPointerSizeLog2); |
975 __ Daddu(at, kInterpreterDispatchTableRegister, at); | 980 __ Daddu(at, kInterpreterDispatchTableRegister, at); |
976 __ ld(at, MemOperand(at)); | 981 __ ld(at, MemOperand(at)); |
977 // TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging | 982 // TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging |
978 // and header removal. | 983 // and header removal. |
979 __ Daddu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag)); | 984 __ Daddu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag)); |
980 __ Jump(at); | 985 __ Call(at); |
981 } | 986 } |
982 | 987 |
983 | 988 |
984 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { | 989 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { |
985 // TODO(rmcilroy): List of things not currently dealt with here but done in | 990 // TODO(rmcilroy): List of things not currently dealt with here but done in |
986 // fullcodegen's EmitReturnSequence. | 991 // fullcodegen's EmitReturnSequence. |
987 // - Supporting FLAG_trace for Runtime::TraceExit. | 992 // - Supporting FLAG_trace for Runtime::TraceExit. |
988 // - Support profiler (specifically decrementing profiling_counter | 993 // - Support profiler (specifically decrementing profiling_counter |
989 // appropriately and calling out to HandleInterrupts if necessary). | 994 // appropriately and calling out to HandleInterrupts if necessary). |
990 | 995 |
991 // Load return value into v0. | 996 // The return value is in accumulator, which is already in v0. |
992 __ ld(v0, MemOperand(fp, -kPointerSize - | 997 |
993 StandardFrameConstants::kFixedFrameSizeFromFp)); | |
994 // Leave the frame (also dropping the register file). | 998 // Leave the frame (also dropping the register file). |
995 __ LeaveFrame(StackFrame::JAVA_SCRIPT); | 999 __ LeaveFrame(StackFrame::JAVA_SCRIPT); |
996 // Drop receiver + arguments. | 1000 // Drop receiver + arguments. |
997 __ Drop(1); // TODO(rmcilroy): Get number of arguments from BytecodeArray. | 1001 __ Drop(1); // TODO(rmcilroy): Get number of arguments from BytecodeArray. |
998 __ Jump(ra); | 1002 __ Jump(ra); |
999 } | 1003 } |
1000 | 1004 |
1001 | 1005 |
1002 void Builtins::Generate_CompileLazy(MacroAssembler* masm) { | 1006 void Builtins::Generate_CompileLazy(MacroAssembler* masm) { |
1003 CallRuntimePassFunction(masm, Runtime::kCompileLazy); | 1007 CallRuntimePassFunction(masm, Runtime::kCompileLazy); |
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1874 } | 1878 } |
1875 } | 1879 } |
1876 | 1880 |
1877 | 1881 |
1878 #undef __ | 1882 #undef __ |
1879 | 1883 |
1880 } // namespace internal | 1884 } // namespace internal |
1881 } // namespace v8 | 1885 } // namespace v8 |
1882 | 1886 |
1883 #endif // V8_TARGET_ARCH_MIPS64 | 1887 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |