OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 1240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1251 | 1251 |
1252 void MacroAssembler::ThrowUncatchable(UncatchableExceptionType type, | 1252 void MacroAssembler::ThrowUncatchable(UncatchableExceptionType type, |
1253 Register value) { | 1253 Register value) { |
1254 // Adjust this code if not the case. | 1254 // Adjust this code if not the case. |
1255 STATIC_ASSERT(StackHandlerConstants::kSize == 5 * kPointerSize); | 1255 STATIC_ASSERT(StackHandlerConstants::kSize == 5 * kPointerSize); |
1256 STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0 * kPointerSize); | 1256 STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0 * kPointerSize); |
1257 STATIC_ASSERT(StackHandlerConstants::kStateOffset == 1 * kPointerSize); | 1257 STATIC_ASSERT(StackHandlerConstants::kStateOffset == 1 * kPointerSize); |
1258 STATIC_ASSERT(StackHandlerConstants::kContextOffset == 2 * kPointerSize); | 1258 STATIC_ASSERT(StackHandlerConstants::kContextOffset == 2 * kPointerSize); |
1259 STATIC_ASSERT(StackHandlerConstants::kFPOffset == 3 * kPointerSize); | 1259 STATIC_ASSERT(StackHandlerConstants::kFPOffset == 3 * kPointerSize); |
1260 STATIC_ASSERT(StackHandlerConstants::kPCOffset == 4 * kPointerSize); | 1260 STATIC_ASSERT(StackHandlerConstants::kPCOffset == 4 * kPointerSize); |
1261 // r0 is expected to hold the exception. | |
1262 if (!value.is(r0)) { | |
1263 mov(r0, value); | |
1264 } | |
1265 | 1261 |
1266 // Drop sp to the top stack handler. | 1262 // The exception is expected in r0. |
1267 mov(r3, Operand(ExternalReference(Isolate::kHandlerAddress, isolate()))); | |
1268 ldr(sp, MemOperand(r3)); | |
1269 | |
1270 // Unwind the handlers until the ENTRY handler is found. | |
1271 Label loop, done; | |
1272 bind(&loop); | |
1273 // Load the type of the current stack handler. | |
1274 const int kStateOffset = StackHandlerConstants::kStateOffset; | |
1275 ldr(r2, MemOperand(sp, kStateOffset)); | |
1276 cmp(r2, Operand(StackHandler::ENTRY)); | |
1277 b(eq, &done); | |
1278 // Fetch the next handler in the list. | |
1279 const int kNextOffset = StackHandlerConstants::kNextOffset; | |
1280 ldr(sp, MemOperand(sp, kNextOffset)); | |
1281 jmp(&loop); | |
1282 bind(&done); | |
1283 | |
1284 // Set the top handler address to next handler past the current ENTRY handler. | |
1285 pop(r2); | |
1286 str(r2, MemOperand(r3)); | |
1287 | |
1288 if (type == OUT_OF_MEMORY) { | 1263 if (type == OUT_OF_MEMORY) { |
1289 // Set external caught exception to false. | 1264 // Set external caught exception to false. |
1290 ExternalReference external_caught( | 1265 ExternalReference external_caught(Isolate::kExternalCaughtExceptionAddress, |
1291 Isolate::kExternalCaughtExceptionAddress, isolate()); | 1266 isolate()); |
1292 mov(r0, Operand(false, RelocInfo::NONE)); | 1267 mov(r0, Operand(false, RelocInfo::NONE)); |
1293 mov(r2, Operand(external_caught)); | 1268 mov(r2, Operand(external_caught)); |
1294 str(r0, MemOperand(r2)); | 1269 str(r0, MemOperand(r2)); |
1295 | 1270 |
1296 // Set pending exception and r0 to out of memory exception. | 1271 // Set pending exception and r0 to out of memory exception. |
1297 Failure* out_of_memory = Failure::OutOfMemoryException(); | 1272 Failure* out_of_memory = Failure::OutOfMemoryException(); |
1298 mov(r0, Operand(reinterpret_cast<int32_t>(out_of_memory))); | 1273 mov(r0, Operand(reinterpret_cast<int32_t>(out_of_memory))); |
1299 mov(r2, Operand(ExternalReference(Isolate::kPendingExceptionAddress, | 1274 mov(r2, Operand(ExternalReference(Isolate::kPendingExceptionAddress, |
1300 isolate()))); | 1275 isolate()))); |
1301 str(r0, MemOperand(r2)); | 1276 str(r0, MemOperand(r2)); |
| 1277 } else if (!value.is(r0)) { |
| 1278 mov(r0, value); |
1302 } | 1279 } |
1303 | 1280 |
1304 // Stack layout at this point. See also StackHandlerConstants. | 1281 // Drop the stack pointer to the top of the top stack handler. |
1305 // sp -> state (ENTRY) | 1282 mov(r3, Operand(ExternalReference(Isolate::kHandlerAddress, isolate()))); |
1306 // cp | 1283 ldr(sp, MemOperand(r3)); |
1307 // fp | |
1308 // lr | |
1309 | 1284 |
1310 // Restore context and frame pointer, discard state (r2). | 1285 // Unwind the handlers until the top ENTRY handler is found. |
| 1286 Label fetch_next, check_kind; |
| 1287 jmp(&check_kind); |
| 1288 bind(&fetch_next); |
| 1289 ldr(sp, MemOperand(sp, StackHandlerConstants::kNextOffset)); |
| 1290 |
| 1291 bind(&check_kind); |
| 1292 ldr(r2, MemOperand(sp, StackHandlerConstants::kStateOffset)); |
| 1293 cmp(r2, Operand(StackHandler::ENTRY)); |
| 1294 b(ne, &fetch_next); |
| 1295 |
| 1296 // Set the top handler address to next handler past the top ENTRY handler. |
| 1297 pop(r2); |
| 1298 str(r2, MemOperand(r3)); |
| 1299 |
| 1300 // Clear the context and frame pointer (0 was saved in the handler), and |
| 1301 // discard the state (r2). |
1311 ldm(ia_w, sp, r2.bit() | cp.bit() | fp.bit()); | 1302 ldm(ia_w, sp, r2.bit() | cp.bit() | fp.bit()); |
1312 #ifdef DEBUG | 1303 |
1313 if (emit_debug_code()) { | |
1314 mov(lr, Operand(pc)); | |
1315 } | |
1316 #endif | |
1317 pop(pc); | 1304 pop(pc); |
1318 } | 1305 } |
1319 | 1306 |
1320 | 1307 |
1321 void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, | 1308 void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, |
1322 Register scratch, | 1309 Register scratch, |
1323 Label* miss) { | 1310 Label* miss) { |
1324 Label same_contexts; | 1311 Label same_contexts; |
1325 | 1312 |
1326 ASSERT(!holder_reg.is(scratch)); | 1313 ASSERT(!holder_reg.is(scratch)); |
(...skipping 2279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3606 void CodePatcher::EmitCondition(Condition cond) { | 3593 void CodePatcher::EmitCondition(Condition cond) { |
3607 Instr instr = Assembler::instr_at(masm_.pc_); | 3594 Instr instr = Assembler::instr_at(masm_.pc_); |
3608 instr = (instr & ~kCondMask) | cond; | 3595 instr = (instr & ~kCondMask) | cond; |
3609 masm_.emit(instr); | 3596 masm_.emit(instr); |
3610 } | 3597 } |
3611 | 3598 |
3612 | 3599 |
3613 } } // namespace v8::internal | 3600 } } // namespace v8::internal |
3614 | 3601 |
3615 #endif // V8_TARGET_ARCH_ARM | 3602 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |