| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_PPC | 7 #if V8_TARGET_ARCH_PPC |
| 8 | 8 |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 isolate->set_fp_stubs_generated(true); | 988 isolate->set_fp_stubs_generated(true); |
| 989 } | 989 } |
| 990 | 990 |
| 991 | 991 |
| 992 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { | 992 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { |
| 993 CEntryStub stub(isolate, 1, kDontSaveFPRegs); | 993 CEntryStub stub(isolate, 1, kDontSaveFPRegs); |
| 994 stub.GetCode(); | 994 stub.GetCode(); |
| 995 } | 995 } |
| 996 | 996 |
| 997 | 997 |
| 998 static void ThrowPendingException(MacroAssembler* masm) { | |
| 999 Isolate* isolate = masm->isolate(); | |
| 1000 | |
| 1001 ExternalReference pending_handler_context_address( | |
| 1002 Isolate::kPendingHandlerContextAddress, isolate); | |
| 1003 ExternalReference pending_handler_code_address( | |
| 1004 Isolate::kPendingHandlerCodeAddress, isolate); | |
| 1005 ExternalReference pending_handler_offset_address( | |
| 1006 Isolate::kPendingHandlerOffsetAddress, isolate); | |
| 1007 ExternalReference pending_handler_fp_address( | |
| 1008 Isolate::kPendingHandlerFPAddress, isolate); | |
| 1009 ExternalReference pending_handler_sp_address( | |
| 1010 Isolate::kPendingHandlerSPAddress, isolate); | |
| 1011 | |
| 1012 // Ask the runtime for help to determine the handler. This will set r3 to | |
| 1013 // contain the current pending exception, don't clobber it. | |
| 1014 ExternalReference find_handler(Runtime::kFindExceptionHandler, isolate); | |
| 1015 { | |
| 1016 FrameScope scope(masm, StackFrame::MANUAL); | |
| 1017 __ PrepareCallCFunction(3, 0, r3); | |
| 1018 __ li(r3, Operand::Zero()); | |
| 1019 __ li(r4, Operand::Zero()); | |
| 1020 __ mov(r5, Operand(ExternalReference::isolate_address(isolate))); | |
| 1021 __ CallCFunction(find_handler, 3); | |
| 1022 } | |
| 1023 | |
| 1024 // Retrieve the handler context, SP and FP. | |
| 1025 __ mov(cp, Operand(pending_handler_context_address)); | |
| 1026 __ LoadP(cp, MemOperand(cp)); | |
| 1027 __ mov(sp, Operand(pending_handler_sp_address)); | |
| 1028 __ LoadP(sp, MemOperand(sp)); | |
| 1029 __ mov(fp, Operand(pending_handler_fp_address)); | |
| 1030 __ LoadP(fp, MemOperand(fp)); | |
| 1031 | |
| 1032 // If the handler is a JS frame, restore the context to the frame. | |
| 1033 // (kind == ENTRY) == (fp == 0) == (cp == 0), so we could test either fp | |
| 1034 // or cp. | |
| 1035 Label skip; | |
| 1036 __ cmpi(cp, Operand::Zero()); | |
| 1037 __ beq(&skip); | |
| 1038 __ StoreP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | |
| 1039 __ bind(&skip); | |
| 1040 | |
| 1041 // Compute the handler entry address and jump to it. | |
| 1042 __ mov(r4, Operand(pending_handler_code_address)); | |
| 1043 __ LoadP(r4, MemOperand(r4)); | |
| 1044 __ mov(r5, Operand(pending_handler_offset_address)); | |
| 1045 __ LoadP(r5, MemOperand(r5)); | |
| 1046 __ addi(r4, r4, Operand(Code::kHeaderSize - kHeapObjectTag)); // Code start | |
| 1047 __ add(ip, r4, r5); | |
| 1048 __ Jump(ip); | |
| 1049 } | |
| 1050 | |
| 1051 | |
| 1052 void CEntryStub::Generate(MacroAssembler* masm) { | 998 void CEntryStub::Generate(MacroAssembler* masm) { |
| 1053 // Called from JavaScript; parameters are on stack as if calling JS function. | 999 // Called from JavaScript; parameters are on stack as if calling JS function. |
| 1054 // r3: number of arguments including receiver | 1000 // r3: number of arguments including receiver |
| 1055 // r4: pointer to builtin function | 1001 // r4: pointer to builtin function |
| 1056 // fp: frame pointer (restored after C call) | 1002 // fp: frame pointer (restored after C call) |
| 1057 // sp: stack pointer (restored as callee's sp after C call) | 1003 // sp: stack pointer (restored as callee's sp after C call) |
| 1058 // cp: current context (C callee-saved) | 1004 // cp: current context (C callee-saved) |
| 1059 | 1005 |
| 1060 ProfileEntryHookStub::MaybeCallEntryHook(masm); | 1006 ProfileEntryHookStub::MaybeCallEntryHook(masm); |
| 1061 | 1007 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1173 // r3:r4: result | 1119 // r3:r4: result |
| 1174 // sp: stack pointer | 1120 // sp: stack pointer |
| 1175 // fp: frame pointer | 1121 // fp: frame pointer |
| 1176 // r14: still holds argc (callee-saved). | 1122 // r14: still holds argc (callee-saved). |
| 1177 __ LeaveExitFrame(save_doubles(), r14, true); | 1123 __ LeaveExitFrame(save_doubles(), r14, true); |
| 1178 __ blr(); | 1124 __ blr(); |
| 1179 | 1125 |
| 1180 // Handling of exception. | 1126 // Handling of exception. |
| 1181 __ bind(&exception_returned); | 1127 __ bind(&exception_returned); |
| 1182 | 1128 |
| 1183 ThrowPendingException(masm); | 1129 ExternalReference pending_handler_context_address( |
| 1130 Isolate::kPendingHandlerContextAddress, isolate()); |
| 1131 ExternalReference pending_handler_code_address( |
| 1132 Isolate::kPendingHandlerCodeAddress, isolate()); |
| 1133 ExternalReference pending_handler_offset_address( |
| 1134 Isolate::kPendingHandlerOffsetAddress, isolate()); |
| 1135 ExternalReference pending_handler_fp_address( |
| 1136 Isolate::kPendingHandlerFPAddress, isolate()); |
| 1137 ExternalReference pending_handler_sp_address( |
| 1138 Isolate::kPendingHandlerSPAddress, isolate()); |
| 1139 |
| 1140 // Ask the runtime for help to determine the handler. This will set r3 to |
| 1141 // contain the current pending exception, don't clobber it. |
| 1142 ExternalReference find_handler(Runtime::kFindExceptionHandler, isolate()); |
| 1143 { |
| 1144 FrameScope scope(masm, StackFrame::MANUAL); |
| 1145 __ PrepareCallCFunction(3, 0, r3); |
| 1146 __ li(r3, Operand::Zero()); |
| 1147 __ li(r4, Operand::Zero()); |
| 1148 __ mov(r5, Operand(ExternalReference::isolate_address(isolate()))); |
| 1149 __ CallCFunction(find_handler, 3); |
| 1150 } |
| 1151 |
| 1152 // Retrieve the handler context, SP and FP. |
| 1153 __ mov(cp, Operand(pending_handler_context_address)); |
| 1154 __ LoadP(cp, MemOperand(cp)); |
| 1155 __ mov(sp, Operand(pending_handler_sp_address)); |
| 1156 __ LoadP(sp, MemOperand(sp)); |
| 1157 __ mov(fp, Operand(pending_handler_fp_address)); |
| 1158 __ LoadP(fp, MemOperand(fp)); |
| 1159 |
| 1160 // If the handler is a JS frame, restore the context to the frame. |
| 1161 // (kind == ENTRY) == (fp == 0) == (cp == 0), so we could test either fp |
| 1162 // or cp. |
| 1163 Label skip; |
| 1164 __ cmpi(cp, Operand::Zero()); |
| 1165 __ beq(&skip); |
| 1166 __ StoreP(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
| 1167 __ bind(&skip); |
| 1168 |
| 1169 // Compute the handler entry address and jump to it. |
| 1170 __ mov(r4, Operand(pending_handler_code_address)); |
| 1171 __ LoadP(r4, MemOperand(r4)); |
| 1172 __ mov(r5, Operand(pending_handler_offset_address)); |
| 1173 __ LoadP(r5, MemOperand(r5)); |
| 1174 __ addi(r4, r4, Operand(Code::kHeaderSize - kHeapObjectTag)); // Code start |
| 1175 __ add(ip, r4, r5); |
| 1176 __ Jump(ip); |
| 1184 } | 1177 } |
| 1185 | 1178 |
| 1186 | 1179 |
| 1187 void JSEntryStub::Generate(MacroAssembler* masm) { | 1180 void JSEntryStub::Generate(MacroAssembler* masm) { |
| 1188 // r3: code entry | 1181 // r3: code entry |
| 1189 // r4: function | 1182 // r4: function |
| 1190 // r5: receiver | 1183 // r5: receiver |
| 1191 // r6: argc | 1184 // r6: argc |
| 1192 // [sp+0]: argv | 1185 // [sp+0]: argv |
| 1193 | 1186 |
| (...skipping 1200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2394 // haven't created the exception yet. Handle that in the runtime system. | 2387 // haven't created the exception yet. Handle that in the runtime system. |
| 2395 // TODO(592): Rerunning the RegExp to get the stack overflow exception. | 2388 // TODO(592): Rerunning the RegExp to get the stack overflow exception. |
| 2396 __ mov(r4, Operand(isolate()->factory()->the_hole_value())); | 2389 __ mov(r4, Operand(isolate()->factory()->the_hole_value())); |
| 2397 __ mov(r5, Operand(ExternalReference(Isolate::kPendingExceptionAddress, | 2390 __ mov(r5, Operand(ExternalReference(Isolate::kPendingExceptionAddress, |
| 2398 isolate()))); | 2391 isolate()))); |
| 2399 __ LoadP(r3, MemOperand(r5, 0)); | 2392 __ LoadP(r3, MemOperand(r5, 0)); |
| 2400 __ cmp(r3, r4); | 2393 __ cmp(r3, r4); |
| 2401 __ beq(&runtime); | 2394 __ beq(&runtime); |
| 2402 | 2395 |
| 2403 // For exception, throw the exception again. | 2396 // For exception, throw the exception again. |
| 2404 __ EnterExitFrame(false); | 2397 __ TailCallRuntime(Runtime::kRegExpExecReThrow, 4, 1); |
| 2405 ThrowPendingException(masm); | |
| 2406 | 2398 |
| 2407 __ bind(&failure); | 2399 __ bind(&failure); |
| 2408 // For failure and exception return null. | 2400 // For failure and exception return null. |
| 2409 __ mov(r3, Operand(isolate()->factory()->null_value())); | 2401 __ mov(r3, Operand(isolate()->factory()->null_value())); |
| 2410 __ addi(sp, sp, Operand(4 * kPointerSize)); | 2402 __ addi(sp, sp, Operand(4 * kPointerSize)); |
| 2411 __ Ret(); | 2403 __ Ret(); |
| 2412 | 2404 |
| 2413 // Process the result from the native regexp code. | 2405 // Process the result from the native regexp code. |
| 2414 __ bind(&success); | 2406 __ bind(&success); |
| 2415 __ LoadP(r4, | 2407 __ LoadP(r4, |
| (...skipping 2926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5342 kStackUnwindSpace, NULL, | 5334 kStackUnwindSpace, NULL, |
| 5343 MemOperand(fp, 6 * kPointerSize), NULL); | 5335 MemOperand(fp, 6 * kPointerSize), NULL); |
| 5344 } | 5336 } |
| 5345 | 5337 |
| 5346 | 5338 |
| 5347 #undef __ | 5339 #undef __ |
| 5348 } | 5340 } |
| 5349 } // namespace v8::internal | 5341 } // namespace v8::internal |
| 5350 | 5342 |
| 5351 #endif // V8_TARGET_ARCH_PPC | 5343 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |