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 #if V8_TARGET_ARCH_MIPS64 | 5 #if V8_TARGET_ARCH_MIPS64 |
6 | 6 |
7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
965 // frames.h for its layout. | 965 // frames.h for its layout. |
966 void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { | 966 void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
967 ProfileEntryHookStub::MaybeCallEntryHook(masm); | 967 ProfileEntryHookStub::MaybeCallEntryHook(masm); |
968 | 968 |
969 // Open a frame scope to indicate that there is a frame on the stack. The | 969 // Open a frame scope to indicate that there is a frame on the stack. The |
970 // MANUAL indicates that the scope shouldn't actually generate code to set up | 970 // MANUAL indicates that the scope shouldn't actually generate code to set up |
971 // the frame (that is done below). | 971 // the frame (that is done below). |
972 FrameScope frame_scope(masm, StackFrame::MANUAL); | 972 FrameScope frame_scope(masm, StackFrame::MANUAL); |
973 __ PushStandardFrame(a1); | 973 __ PushStandardFrame(a1); |
974 | 974 |
975 // Get the bytecode array from the function object and load the pointer to the | 975 // Get the bytecode array from the function object (or from the DebugInfo if |
976 // first entry into kInterpreterBytecodeRegister. | 976 // it is present) and load it into kInterpreterBytecodeArrayRegister. |
977 __ ld(a0, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 977 __ ld(a0, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
978 Label load_debug_bytecode_array, bytecode_array_loaded; | 978 Label load_debug_bytecode_array, bytecode_array_loaded; |
979 Register debug_info = kInterpreterBytecodeArrayRegister; | 979 Register debug_info = kInterpreterBytecodeArrayRegister; |
980 DCHECK(!debug_info.is(a0)); | 980 DCHECK(!debug_info.is(a0)); |
981 __ ld(debug_info, FieldMemOperand(a0, SharedFunctionInfo::kDebugInfoOffset)); | 981 __ ld(debug_info, FieldMemOperand(a0, SharedFunctionInfo::kDebugInfoOffset)); |
982 __ Branch(&load_debug_bytecode_array, ne, debug_info, | 982 __ Branch(&load_debug_bytecode_array, ne, debug_info, |
983 Operand(DebugInfo::uninitialized())); | 983 Operand(DebugInfo::uninitialized())); |
984 __ ld(kInterpreterBytecodeArrayRegister, | 984 __ ld(kInterpreterBytecodeArrayRegister, |
985 FieldMemOperand(a0, SharedFunctionInfo::kFunctionDataOffset)); | 985 FieldMemOperand(a0, SharedFunctionInfo::kFunctionDataOffset)); |
986 __ bind(&bytecode_array_loaded); | 986 __ bind(&bytecode_array_loaded); |
987 | 987 |
| 988 // Check function data field is actually a BytecodeArray object. |
| 989 Label bytecode_array_not_present; |
| 990 __ JumpIfRoot(kInterpreterBytecodeArrayRegister, |
| 991 Heap::kUndefinedValueRootIndex, &bytecode_array_not_present); |
988 if (FLAG_debug_code) { | 992 if (FLAG_debug_code) { |
989 // Check function data field is actually a BytecodeArray object. | |
990 __ SmiTst(kInterpreterBytecodeArrayRegister, a4); | 993 __ SmiTst(kInterpreterBytecodeArrayRegister, a4); |
991 __ Assert(ne, kFunctionDataShouldBeBytecodeArrayOnInterpreterEntry, a4, | 994 __ Assert(ne, kFunctionDataShouldBeBytecodeArrayOnInterpreterEntry, a4, |
992 Operand(zero_reg)); | 995 Operand(zero_reg)); |
993 __ GetObjectType(kInterpreterBytecodeArrayRegister, a4, a4); | 996 __ GetObjectType(kInterpreterBytecodeArrayRegister, a4, a4); |
994 __ Assert(eq, kFunctionDataShouldBeBytecodeArrayOnInterpreterEntry, a4, | 997 __ Assert(eq, kFunctionDataShouldBeBytecodeArrayOnInterpreterEntry, a4, |
995 Operand(BYTECODE_ARRAY_TYPE)); | 998 Operand(BYTECODE_ARRAY_TYPE)); |
996 } | 999 } |
997 | 1000 |
998 // Push new.target, bytecode array and zero for bytecode array offset. | 1001 // Push new.target, bytecode array and zero for bytecode array offset. |
999 __ Push(a3, kInterpreterBytecodeArrayRegister, zero_reg); | 1002 __ Push(a3, kInterpreterBytecodeArrayRegister, zero_reg); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 __ Call(at); | 1047 __ Call(at); |
1045 | 1048 |
1046 // Even though the first bytecode handler was called, we will never return. | 1049 // Even though the first bytecode handler was called, we will never return. |
1047 __ Abort(kUnexpectedReturnFromBytecodeHandler); | 1050 __ Abort(kUnexpectedReturnFromBytecodeHandler); |
1048 | 1051 |
1049 // Load debug copy of the bytecode array. | 1052 // Load debug copy of the bytecode array. |
1050 __ bind(&load_debug_bytecode_array); | 1053 __ bind(&load_debug_bytecode_array); |
1051 __ ld(kInterpreterBytecodeArrayRegister, | 1054 __ ld(kInterpreterBytecodeArrayRegister, |
1052 FieldMemOperand(debug_info, DebugInfo::kAbstractCodeIndex)); | 1055 FieldMemOperand(debug_info, DebugInfo::kAbstractCodeIndex)); |
1053 __ Branch(&bytecode_array_loaded); | 1056 __ Branch(&bytecode_array_loaded); |
| 1057 |
| 1058 // If the bytecode array is no longer present, then the underlying function |
| 1059 // has been switched to a different kind of code and we heal the closure by |
| 1060 // switching the code entry field over to the new code object as well. |
| 1061 __ bind(&bytecode_array_not_present); |
| 1062 __ LeaveFrame(StackFrame::JAVA_SCRIPT); |
| 1063 __ ld(a4, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
| 1064 __ ld(a4, FieldMemOperand(a4, SharedFunctionInfo::kCodeOffset)); |
| 1065 __ Daddu(a4, a4, Operand(Code::kHeaderSize - kHeapObjectTag)); |
| 1066 __ sd(a4, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); |
| 1067 __ RecordWriteCodeEntryField(a1, a4, a5); |
| 1068 __ Jump(a4); |
1054 } | 1069 } |
1055 | 1070 |
1056 | 1071 |
1057 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { | 1072 void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { |
1058 // The return value is in accumulator, which is already in v0. | 1073 // The return value is in accumulator, which is already in v0. |
1059 | 1074 |
1060 // Leave the frame (also dropping the register file). | 1075 // Leave the frame (also dropping the register file). |
1061 __ LeaveFrame(StackFrame::JAVA_SCRIPT); | 1076 __ LeaveFrame(StackFrame::JAVA_SCRIPT); |
1062 | 1077 |
1063 // Drop receiver + arguments and return. | 1078 // Drop receiver + arguments and return. |
(...skipping 1783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2847 } | 2862 } |
2848 } | 2863 } |
2849 | 2864 |
2850 | 2865 |
2851 #undef __ | 2866 #undef __ |
2852 | 2867 |
2853 } // namespace internal | 2868 } // namespace internal |
2854 } // namespace v8 | 2869 } // namespace v8 |
2855 | 2870 |
2856 #endif // V8_TARGET_ARCH_MIPS64 | 2871 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |