| OLD | NEW |
| 1 | 1 |
| 2 // Copyright 2012 the V8 project authors. All rights reserved. | 2 // Copyright 2012 the V8 project authors. All rights reserved. |
| 3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
| 4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
| 5 | 5 |
| 6 #include <limits.h> // For LONG_MIN, LONG_MAX. | 6 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 7 | 7 |
| 8 #if V8_TARGET_ARCH_MIPS | 8 #if V8_TARGET_ARCH_MIPS |
| 9 | 9 |
| 10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
| (...skipping 3329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3340 Branch(gc_required, Ugreater, scratch2, Operand(t9)); | 3340 Branch(gc_required, Ugreater, scratch2, Operand(t9)); |
| 3341 sw(scratch2, MemOperand(topaddr)); | 3341 sw(scratch2, MemOperand(topaddr)); |
| 3342 | 3342 |
| 3343 // Tag object if requested. | 3343 // Tag object if requested. |
| 3344 if ((flags & TAG_OBJECT) != 0) { | 3344 if ((flags & TAG_OBJECT) != 0) { |
| 3345 Addu(result, result, Operand(kHeapObjectTag)); | 3345 Addu(result, result, Operand(kHeapObjectTag)); |
| 3346 } | 3346 } |
| 3347 } | 3347 } |
| 3348 | 3348 |
| 3349 | 3349 |
| 3350 void MacroAssembler::Allocate(Register object_size, | 3350 void MacroAssembler::Allocate(Register object_size, Register result, |
| 3351 Register result, | 3351 Register result_end, Register scratch1, |
| 3352 Register scratch1, | 3352 Label* gc_required, AllocationFlags flags) { |
| 3353 Register scratch2, | |
| 3354 Label* gc_required, | |
| 3355 AllocationFlags flags) { | |
| 3356 if (!FLAG_inline_new) { | 3353 if (!FLAG_inline_new) { |
| 3357 if (emit_debug_code()) { | 3354 if (emit_debug_code()) { |
| 3358 // Trash the registers to simulate an allocation failure. | 3355 // Trash the registers to simulate an allocation failure. |
| 3359 li(result, 0x7091); | 3356 li(result, 0x7091); |
| 3360 li(scratch1, 0x7191); | 3357 li(scratch1, 0x7191); |
| 3361 li(scratch2, 0x7291); | 3358 li(result_end, 0x7291); |
| 3362 } | 3359 } |
| 3363 jmp(gc_required); | 3360 jmp(gc_required); |
| 3364 return; | 3361 return; |
| 3365 } | 3362 } |
| 3366 | 3363 |
| 3367 DCHECK(!result.is(scratch1)); | 3364 DCHECK(!result.is(scratch1)); |
| 3368 DCHECK(!result.is(scratch2)); | 3365 DCHECK(!result.is(result_end)); |
| 3369 DCHECK(!scratch1.is(scratch2)); | 3366 DCHECK(!scratch1.is(result_end)); |
| 3370 DCHECK(!object_size.is(t9)); | 3367 DCHECK(!object_size.is(t9)); |
| 3371 DCHECK(!scratch1.is(t9) && !scratch2.is(t9) && !result.is(t9)); | 3368 DCHECK(!scratch1.is(t9) && !result_end.is(t9) && !result.is(t9)); |
| 3372 | 3369 |
| 3373 // Check relative positions of allocation top and limit addresses. | 3370 // Check relative positions of allocation top and limit addresses. |
| 3374 // ARM adds additional checks to make sure the ldm instruction can be | 3371 // ARM adds additional checks to make sure the ldm instruction can be |
| 3375 // used. On MIPS we don't have ldm so we don't need additional checks either. | 3372 // used. On MIPS we don't have ldm so we don't need additional checks either. |
| 3376 ExternalReference allocation_top = | 3373 ExternalReference allocation_top = |
| 3377 AllocationUtils::GetAllocationTopReference(isolate(), flags); | 3374 AllocationUtils::GetAllocationTopReference(isolate(), flags); |
| 3378 ExternalReference allocation_limit = | 3375 ExternalReference allocation_limit = |
| 3379 AllocationUtils::GetAllocationLimitReference(isolate(), flags); | 3376 AllocationUtils::GetAllocationLimitReference(isolate(), flags); |
| 3380 intptr_t top = | 3377 intptr_t top = |
| 3381 reinterpret_cast<intptr_t>(allocation_top.address()); | 3378 reinterpret_cast<intptr_t>(allocation_top.address()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 3401 Check(eq, kUnexpectedAllocationTop, result, Operand(t9)); | 3398 Check(eq, kUnexpectedAllocationTop, result, Operand(t9)); |
| 3402 } | 3399 } |
| 3403 // Load allocation limit into t9. Result already contains allocation top. | 3400 // Load allocation limit into t9. Result already contains allocation top. |
| 3404 lw(t9, MemOperand(topaddr, limit - top)); | 3401 lw(t9, MemOperand(topaddr, limit - top)); |
| 3405 } | 3402 } |
| 3406 | 3403 |
| 3407 if ((flags & DOUBLE_ALIGNMENT) != 0) { | 3404 if ((flags & DOUBLE_ALIGNMENT) != 0) { |
| 3408 // Align the next allocation. Storing the filler map without checking top is | 3405 // Align the next allocation. Storing the filler map without checking top is |
| 3409 // safe in new-space because the limit of the heap is aligned there. | 3406 // safe in new-space because the limit of the heap is aligned there. |
| 3410 DCHECK(kPointerAlignment * 2 == kDoubleAlignment); | 3407 DCHECK(kPointerAlignment * 2 == kDoubleAlignment); |
| 3411 And(scratch2, result, Operand(kDoubleAlignmentMask)); | 3408 And(result_end, result, Operand(kDoubleAlignmentMask)); |
| 3412 Label aligned; | 3409 Label aligned; |
| 3413 Branch(&aligned, eq, scratch2, Operand(zero_reg)); | 3410 Branch(&aligned, eq, result_end, Operand(zero_reg)); |
| 3414 if ((flags & PRETENURE) != 0) { | 3411 if ((flags & PRETENURE) != 0) { |
| 3415 Branch(gc_required, Ugreater_equal, result, Operand(t9)); | 3412 Branch(gc_required, Ugreater_equal, result, Operand(t9)); |
| 3416 } | 3413 } |
| 3417 li(scratch2, Operand(isolate()->factory()->one_pointer_filler_map())); | 3414 li(result_end, Operand(isolate()->factory()->one_pointer_filler_map())); |
| 3418 sw(scratch2, MemOperand(result)); | 3415 sw(result_end, MemOperand(result)); |
| 3419 Addu(result, result, Operand(kDoubleSize / 2)); | 3416 Addu(result, result, Operand(kDoubleSize / 2)); |
| 3420 bind(&aligned); | 3417 bind(&aligned); |
| 3421 } | 3418 } |
| 3422 | 3419 |
| 3423 // Calculate new top and bail out if new space is exhausted. Use result | 3420 // Calculate new top and bail out if new space is exhausted. Use result |
| 3424 // to calculate the new top. Object size may be in words so a shift is | 3421 // to calculate the new top. Object size may be in words so a shift is |
| 3425 // required to get the number of bytes. | 3422 // required to get the number of bytes. |
| 3426 if ((flags & SIZE_IN_WORDS) != 0) { | 3423 if ((flags & SIZE_IN_WORDS) != 0) { |
| 3427 sll(scratch2, object_size, kPointerSizeLog2); | 3424 sll(result_end, object_size, kPointerSizeLog2); |
| 3428 Addu(scratch2, result, scratch2); | 3425 Addu(result_end, result, result_end); |
| 3429 } else { | 3426 } else { |
| 3430 Addu(scratch2, result, Operand(object_size)); | 3427 Addu(result_end, result, Operand(object_size)); |
| 3431 } | 3428 } |
| 3432 Branch(gc_required, Ugreater, scratch2, Operand(t9)); | 3429 Branch(gc_required, Ugreater, result_end, Operand(t9)); |
| 3433 | 3430 |
| 3434 // Update allocation top. result temporarily holds the new top. | 3431 // Update allocation top. result temporarily holds the new top. |
| 3435 if (emit_debug_code()) { | 3432 if (emit_debug_code()) { |
| 3436 And(t9, scratch2, Operand(kObjectAlignmentMask)); | 3433 And(t9, result_end, Operand(kObjectAlignmentMask)); |
| 3437 Check(eq, kUnalignedAllocationInNewSpace, t9, Operand(zero_reg)); | 3434 Check(eq, kUnalignedAllocationInNewSpace, t9, Operand(zero_reg)); |
| 3438 } | 3435 } |
| 3439 sw(scratch2, MemOperand(topaddr)); | 3436 sw(result_end, MemOperand(topaddr)); |
| 3440 | 3437 |
| 3441 // Tag object if requested. | 3438 // Tag object if requested. |
| 3442 if ((flags & TAG_OBJECT) != 0) { | 3439 if ((flags & TAG_OBJECT) != 0) { |
| 3443 Addu(result, result, Operand(kHeapObjectTag)); | 3440 Addu(result, result, Operand(kHeapObjectTag)); |
| 3444 } | 3441 } |
| 3445 } | 3442 } |
| 3446 | 3443 |
| 3447 | 3444 |
| 3448 void MacroAssembler::AllocateTwoByteString(Register result, | 3445 void MacroAssembler::AllocateTwoByteString(Register result, |
| 3449 Register length, | 3446 Register length, |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3699 lbu(scratch, MemOperand(src)); | 3696 lbu(scratch, MemOperand(src)); |
| 3700 Addu(src, src, 1); | 3697 Addu(src, src, 1); |
| 3701 sb(scratch, MemOperand(dst)); | 3698 sb(scratch, MemOperand(dst)); |
| 3702 Addu(dst, dst, 1); | 3699 Addu(dst, dst, 1); |
| 3703 Subu(length, length, Operand(1)); | 3700 Subu(length, length, Operand(1)); |
| 3704 Branch(&byte_loop_1, ne, length, Operand(zero_reg)); | 3701 Branch(&byte_loop_1, ne, length, Operand(zero_reg)); |
| 3705 bind(&done); | 3702 bind(&done); |
| 3706 } | 3703 } |
| 3707 | 3704 |
| 3708 | 3705 |
| 3709 void MacroAssembler::InitializeFieldsWithFiller(Register start_offset, | 3706 void MacroAssembler::InitializeFieldsWithFiller(Register current_address, |
| 3710 Register end_offset, | 3707 Register end_address, |
| 3711 Register filler) { | 3708 Register filler) { |
| 3712 Label loop, entry; | 3709 Label loop, entry; |
| 3713 Branch(&entry); | 3710 Branch(&entry); |
| 3714 bind(&loop); | 3711 bind(&loop); |
| 3715 sw(filler, MemOperand(start_offset)); | 3712 sw(filler, MemOperand(current_address)); |
| 3716 Addu(start_offset, start_offset, kPointerSize); | 3713 Addu(current_address, current_address, kPointerSize); |
| 3717 bind(&entry); | 3714 bind(&entry); |
| 3718 Branch(&loop, ult, start_offset, Operand(end_offset)); | 3715 Branch(&loop, ult, current_address, Operand(end_address)); |
| 3719 } | 3716 } |
| 3720 | 3717 |
| 3721 | 3718 |
| 3722 void MacroAssembler::CheckFastElements(Register map, | 3719 void MacroAssembler::CheckFastElements(Register map, |
| 3723 Register scratch, | 3720 Register scratch, |
| 3724 Label* fail) { | 3721 Label* fail) { |
| 3725 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); | 3722 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); |
| 3726 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); | 3723 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
| 3727 STATIC_ASSERT(FAST_ELEMENTS == 2); | 3724 STATIC_ASSERT(FAST_ELEMENTS == 2); |
| 3728 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); | 3725 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); |
| (...skipping 2128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5857 if (mag.shift > 0) sra(result, result, mag.shift); | 5854 if (mag.shift > 0) sra(result, result, mag.shift); |
| 5858 srl(at, dividend, 31); | 5855 srl(at, dividend, 31); |
| 5859 Addu(result, result, Operand(at)); | 5856 Addu(result, result, Operand(at)); |
| 5860 } | 5857 } |
| 5861 | 5858 |
| 5862 | 5859 |
| 5863 } // namespace internal | 5860 } // namespace internal |
| 5864 } // namespace v8 | 5861 } // namespace v8 |
| 5865 | 5862 |
| 5866 #endif // V8_TARGET_ARCH_MIPS | 5863 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |