OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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_S390 | 5 #if V8_TARGET_ARCH_S390 |
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 1063 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1074 FieldMemOperand(r2, SharedFunctionInfo::kDebugInfoOffset)); | 1074 FieldMemOperand(r2, SharedFunctionInfo::kDebugInfoOffset)); |
1075 // Load original bytecode array or the debug copy. | 1075 // Load original bytecode array or the debug copy. |
1076 __ LoadP(kInterpreterBytecodeArrayRegister, | 1076 __ LoadP(kInterpreterBytecodeArrayRegister, |
1077 FieldMemOperand(r2, SharedFunctionInfo::kFunctionDataOffset)); | 1077 FieldMemOperand(r2, SharedFunctionInfo::kFunctionDataOffset)); |
1078 __ CmpSmiLiteral(debug_info, DebugInfo::uninitialized(), r0); | 1078 __ CmpSmiLiteral(debug_info, DebugInfo::uninitialized(), r0); |
1079 __ beq(&array_done); | 1079 __ beq(&array_done); |
1080 __ LoadP(kInterpreterBytecodeArrayRegister, | 1080 __ LoadP(kInterpreterBytecodeArrayRegister, |
1081 FieldMemOperand(debug_info, DebugInfo::kDebugBytecodeArrayIndex)); | 1081 FieldMemOperand(debug_info, DebugInfo::kDebugBytecodeArrayIndex)); |
1082 __ bind(&array_done); | 1082 __ bind(&array_done); |
1083 | 1083 |
| 1084 // Check whether we should continue to use the interpreter. |
| 1085 Label switch_to_different_code_kind; |
| 1086 __ LoadP(r2, FieldMemOperand(r2, SharedFunctionInfo::kCodeOffset)); |
| 1087 __ CmpP(r2, Operand(masm->CodeObject())); // Self-reference to this code. |
| 1088 __ bne(&switch_to_different_code_kind); |
| 1089 |
1084 // Check function data field is actually a BytecodeArray object. | 1090 // Check function data field is actually a BytecodeArray object. |
1085 Label bytecode_array_not_present; | |
1086 __ CompareRoot(kInterpreterBytecodeArrayRegister, | |
1087 Heap::kUndefinedValueRootIndex); | |
1088 __ beq(&bytecode_array_not_present); | |
1089 | |
1090 if (FLAG_debug_code) { | 1091 if (FLAG_debug_code) { |
1091 __ TestIfSmi(kInterpreterBytecodeArrayRegister); | 1092 __ TestIfSmi(kInterpreterBytecodeArrayRegister); |
1092 __ Assert(ne, kFunctionDataShouldBeBytecodeArrayOnInterpreterEntry); | 1093 __ Assert(ne, kFunctionDataShouldBeBytecodeArrayOnInterpreterEntry); |
1093 __ CompareObjectType(kInterpreterBytecodeArrayRegister, r2, no_reg, | 1094 __ CompareObjectType(kInterpreterBytecodeArrayRegister, r2, no_reg, |
1094 BYTECODE_ARRAY_TYPE); | 1095 BYTECODE_ARRAY_TYPE); |
1095 __ Assert(eq, kFunctionDataShouldBeBytecodeArrayOnInterpreterEntry); | 1096 __ Assert(eq, kFunctionDataShouldBeBytecodeArrayOnInterpreterEntry); |
1096 } | 1097 } |
1097 | 1098 |
1098 // Load the initial bytecode offset. | 1099 // Load the initial bytecode offset. |
1099 __ mov(kInterpreterBytecodeOffsetRegister, | 1100 __ mov(kInterpreterBytecodeOffsetRegister, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 __ ShiftLeftP(ip, r3, Operand(kPointerSizeLog2)); | 1146 __ ShiftLeftP(ip, r3, Operand(kPointerSizeLog2)); |
1146 __ LoadP(ip, MemOperand(kInterpreterDispatchTableRegister, ip)); | 1147 __ LoadP(ip, MemOperand(kInterpreterDispatchTableRegister, ip)); |
1147 __ Call(ip); | 1148 __ Call(ip); |
1148 | 1149 |
1149 masm->isolate()->heap()->SetInterpreterEntryReturnPCOffset(masm->pc_offset()); | 1150 masm->isolate()->heap()->SetInterpreterEntryReturnPCOffset(masm->pc_offset()); |
1150 | 1151 |
1151 // The return value is in r2. | 1152 // The return value is in r2. |
1152 LeaveInterpreterFrame(masm, r4); | 1153 LeaveInterpreterFrame(masm, r4); |
1153 __ Ret(); | 1154 __ Ret(); |
1154 | 1155 |
1155 // If the bytecode array is no longer present, then the underlying function | 1156 // If the shared code is no longer this entry trampoline, then the underlying |
1156 // has been switched to a different kind of code and we heal the closure by | 1157 // function has been switched to a different kind of code and we heal the |
1157 // switching the code entry field over to the new code object as well. | 1158 // closure by switching the code entry field over to the new code as well. |
1158 __ bind(&bytecode_array_not_present); | 1159 __ bind(&switch_to_different_code_kind); |
1159 __ LeaveFrame(StackFrame::JAVA_SCRIPT); | 1160 __ LeaveFrame(StackFrame::JAVA_SCRIPT); |
1160 __ LoadP(r6, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); | 1161 __ LoadP(r6, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); |
1161 __ LoadP(r6, FieldMemOperand(r6, SharedFunctionInfo::kCodeOffset)); | 1162 __ LoadP(r6, FieldMemOperand(r6, SharedFunctionInfo::kCodeOffset)); |
1162 __ AddP(r6, r6, Operand(Code::kHeaderSize - kHeapObjectTag)); | 1163 __ AddP(r6, r6, Operand(Code::kHeaderSize - kHeapObjectTag)); |
1163 __ StoreP(r6, FieldMemOperand(r3, JSFunction::kCodeEntryOffset), r0); | 1164 __ StoreP(r6, FieldMemOperand(r3, JSFunction::kCodeEntryOffset), r0); |
1164 __ RecordWriteCodeEntryField(r3, r6, r7); | 1165 __ RecordWriteCodeEntryField(r3, r6, r7); |
1165 __ JumpToJSEntry(r6); | 1166 __ JumpToJSEntry(r6); |
1166 } | 1167 } |
1167 | 1168 |
1168 void Builtins::Generate_InterpreterMarkBaselineOnReturn(MacroAssembler* masm) { | 1169 void Builtins::Generate_InterpreterMarkBaselineOnReturn(MacroAssembler* masm) { |
(...skipping 1851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3020 __ bkpt(0); | 3021 __ bkpt(0); |
3021 } | 3022 } |
3022 } | 3023 } |
3023 | 3024 |
3024 #undef __ | 3025 #undef __ |
3025 | 3026 |
3026 } // namespace internal | 3027 } // namespace internal |
3027 } // namespace v8 | 3028 } // namespace v8 |
3028 | 3029 |
3029 #endif // V8_TARGET_ARCH_S390 | 3030 #endif // V8_TARGET_ARCH_S390 |
OLD | NEW |