| 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 #include <limits.h> // For LONG_MIN, LONG_MAX. | 5 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #if V8_TARGET_ARCH_MIPS | 9 #if V8_TARGET_ARCH_MIPS |
| 10 | 10 |
| (...skipping 3252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3263 | 3263 |
| 3264 void MacroAssembler::PopTryHandler() { | 3264 void MacroAssembler::PopTryHandler() { |
| 3265 STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0); | 3265 STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0); |
| 3266 pop(a1); | 3266 pop(a1); |
| 3267 Addu(sp, sp, Operand(StackHandlerConstants::kSize - kPointerSize)); | 3267 Addu(sp, sp, Operand(StackHandlerConstants::kSize - kPointerSize)); |
| 3268 li(at, Operand(ExternalReference(Isolate::kHandlerAddress, isolate()))); | 3268 li(at, Operand(ExternalReference(Isolate::kHandlerAddress, isolate()))); |
| 3269 sw(a1, MemOperand(at)); | 3269 sw(a1, MemOperand(at)); |
| 3270 } | 3270 } |
| 3271 | 3271 |
| 3272 | 3272 |
| 3273 void MacroAssembler::JumpToHandlerEntry() { | |
| 3274 // Compute the handler entry address and jump to it. The handler table is | |
| 3275 // a fixed array of (smi-tagged) code offsets. | |
| 3276 // v0 = exception, a1 = code object, a2 = state. | |
| 3277 lw(a3, FieldMemOperand(a1, Code::kHandlerTableOffset)); // Handler table. | |
| 3278 Addu(a3, a3, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | |
| 3279 srl(a2, a2, StackHandler::kKindWidth); // Handler index. | |
| 3280 sll(a2, a2, kPointerSizeLog2); | |
| 3281 Addu(a2, a3, a2); | |
| 3282 lw(a2, MemOperand(a2)); // Smi-tagged offset. | |
| 3283 Addu(a1, a1, Operand(Code::kHeaderSize - kHeapObjectTag)); // Code start. | |
| 3284 sra(t9, a2, kSmiTagSize); | |
| 3285 Addu(t9, t9, a1); | |
| 3286 Jump(t9); // Jump. | |
| 3287 } | |
| 3288 | |
| 3289 | |
| 3290 void MacroAssembler::Throw(Register value) { | |
| 3291 // Adjust this code if not the case. | |
| 3292 STATIC_ASSERT(StackHandlerConstants::kSize == 5 * kPointerSize); | |
| 3293 STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0); | |
| 3294 STATIC_ASSERT(StackHandlerConstants::kCodeOffset == 1 * kPointerSize); | |
| 3295 STATIC_ASSERT(StackHandlerConstants::kStateOffset == 2 * kPointerSize); | |
| 3296 STATIC_ASSERT(StackHandlerConstants::kContextOffset == 3 * kPointerSize); | |
| 3297 STATIC_ASSERT(StackHandlerConstants::kFPOffset == 4 * kPointerSize); | |
| 3298 | |
| 3299 // The exception is expected in v0. | |
| 3300 Move(v0, value); | |
| 3301 | |
| 3302 // Drop the stack pointer to the top of the top handler. | |
| 3303 li(a3, Operand(ExternalReference(Isolate::kHandlerAddress, | |
| 3304 isolate()))); | |
| 3305 lw(sp, MemOperand(a3)); | |
| 3306 | |
| 3307 // Restore the next handler. | |
| 3308 pop(a2); | |
| 3309 sw(a2, MemOperand(a3)); | |
| 3310 | |
| 3311 // Get the code object (a1) and state (a2). Restore the context and frame | |
| 3312 // pointer. | |
| 3313 MultiPop(a1.bit() | a2.bit() | cp.bit() | fp.bit()); | |
| 3314 | |
| 3315 // If the handler is a JS frame, restore the context to the frame. | |
| 3316 // (kind == ENTRY) == (fp == 0) == (cp == 0), so we could test either fp | |
| 3317 // or cp. | |
| 3318 Label done; | |
| 3319 Branch(&done, eq, cp, Operand(zero_reg)); | |
| 3320 sw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | |
| 3321 bind(&done); | |
| 3322 | |
| 3323 JumpToHandlerEntry(); | |
| 3324 } | |
| 3325 | |
| 3326 | |
| 3327 void MacroAssembler::ThrowUncatchable(Register value) { | |
| 3328 // Adjust this code if not the case. | |
| 3329 STATIC_ASSERT(StackHandlerConstants::kSize == 5 * kPointerSize); | |
| 3330 STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0 * kPointerSize); | |
| 3331 STATIC_ASSERT(StackHandlerConstants::kCodeOffset == 1 * kPointerSize); | |
| 3332 STATIC_ASSERT(StackHandlerConstants::kStateOffset == 2 * kPointerSize); | |
| 3333 STATIC_ASSERT(StackHandlerConstants::kContextOffset == 3 * kPointerSize); | |
| 3334 STATIC_ASSERT(StackHandlerConstants::kFPOffset == 4 * kPointerSize); | |
| 3335 | |
| 3336 // The exception is expected in v0. | |
| 3337 if (!value.is(v0)) { | |
| 3338 mov(v0, value); | |
| 3339 } | |
| 3340 // Drop the stack pointer to the top of the top stack handler. | |
| 3341 li(a3, Operand(ExternalReference(Isolate::kHandlerAddress, isolate()))); | |
| 3342 lw(sp, MemOperand(a3)); | |
| 3343 | |
| 3344 // Unwind the handlers until the ENTRY handler is found. | |
| 3345 Label fetch_next, check_kind; | |
| 3346 jmp(&check_kind); | |
| 3347 bind(&fetch_next); | |
| 3348 lw(sp, MemOperand(sp, StackHandlerConstants::kNextOffset)); | |
| 3349 | |
| 3350 bind(&check_kind); | |
| 3351 STATIC_ASSERT(StackHandler::JS_ENTRY == 0); | |
| 3352 lw(a2, MemOperand(sp, StackHandlerConstants::kStateOffset)); | |
| 3353 And(a2, a2, Operand(StackHandler::KindField::kMask)); | |
| 3354 Branch(&fetch_next, ne, a2, Operand(zero_reg)); | |
| 3355 | |
| 3356 // Set the top handler address to next handler past the top ENTRY handler. | |
| 3357 pop(a2); | |
| 3358 sw(a2, MemOperand(a3)); | |
| 3359 | |
| 3360 // Get the code object (a1) and state (a2). Clear the context and frame | |
| 3361 // pointer (0 was saved in the handler). | |
| 3362 MultiPop(a1.bit() | a2.bit() | cp.bit() | fp.bit()); | |
| 3363 | |
| 3364 JumpToHandlerEntry(); | |
| 3365 } | |
| 3366 | |
| 3367 | |
| 3368 void MacroAssembler::Allocate(int object_size, | 3273 void MacroAssembler::Allocate(int object_size, |
| 3369 Register result, | 3274 Register result, |
| 3370 Register scratch1, | 3275 Register scratch1, |
| 3371 Register scratch2, | 3276 Register scratch2, |
| 3372 Label* gc_required, | 3277 Label* gc_required, |
| 3373 AllocationFlags flags) { | 3278 AllocationFlags flags) { |
| 3374 DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); | 3279 DCHECK(object_size <= Page::kMaxRegularHeapObjectSize); |
| 3375 if (!FLAG_inline_new) { | 3280 if (!FLAG_inline_new) { |
| 3376 if (emit_debug_code()) { | 3281 if (emit_debug_code()) { |
| 3377 // Trash the registers to simulate an allocation failure. | 3282 // Trash the registers to simulate an allocation failure. |
| (...skipping 2793 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6171 } | 6076 } |
| 6172 if (mag.shift > 0) sra(result, result, mag.shift); | 6077 if (mag.shift > 0) sra(result, result, mag.shift); |
| 6173 srl(at, dividend, 31); | 6078 srl(at, dividend, 31); |
| 6174 Addu(result, result, Operand(at)); | 6079 Addu(result, result, Operand(at)); |
| 6175 } | 6080 } |
| 6176 | 6081 |
| 6177 | 6082 |
| 6178 } } // namespace v8::internal | 6083 } } // namespace v8::internal |
| 6179 | 6084 |
| 6180 #endif // V8_TARGET_ARCH_MIPS | 6085 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |