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 3382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3393 // ----------------------------------- | 3393 // ----------------------------------- |
3394 Label miss_force_generic, failed_allocation, slow; | 3394 Label miss_force_generic, failed_allocation, slow; |
3395 | 3395 |
3396 // This stub is meant to be tail-jumped to, the receiver must already | 3396 // This stub is meant to be tail-jumped to, the receiver must already |
3397 // have been verified by the caller to not be a smi. | 3397 // have been verified by the caller to not be a smi. |
3398 | 3398 |
3399 // Check that the key is a smi. | 3399 // Check that the key is a smi. |
3400 __ JumpIfNotSmi(eax, &miss_force_generic); | 3400 __ JumpIfNotSmi(eax, &miss_force_generic); |
3401 | 3401 |
3402 // Check that the index is in range. | 3402 // Check that the index is in range. |
3403 __ mov(ecx, eax); | |
3404 __ SmiUntag(ecx); // Untag the index. | |
3405 __ mov(ebx, FieldOperand(edx, JSObject::kElementsOffset)); | 3403 __ mov(ebx, FieldOperand(edx, JSObject::kElementsOffset)); |
3406 __ cmp(ecx, FieldOperand(ebx, ExternalArray::kLengthOffset)); | 3404 __ cmp(eax, FieldOperand(ebx, ExternalArray::kLengthOffset)); |
3407 // Unsigned comparison catches both negative and too-large values. | 3405 // Unsigned comparison catches both negative and too-large values. |
3408 __ j(above_equal, &miss_force_generic); | 3406 __ j(above_equal, &miss_force_generic); |
3409 __ mov(ebx, FieldOperand(ebx, ExternalArray::kExternalPointerOffset)); | 3407 __ mov(ebx, FieldOperand(ebx, ExternalArray::kExternalPointerOffset)); |
3410 // ebx: base pointer of external storage | 3408 // ebx: base pointer of external storage |
3411 switch (elements_kind) { | 3409 switch (elements_kind) { |
3412 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3410 case JSObject::EXTERNAL_BYTE_ELEMENTS: |
3413 __ movsx_b(eax, Operand(ebx, ecx, times_1, 0)); | 3411 __ SmiUntag(eax); // Untag the index. |
| 3412 __ movsx_b(eax, Operand(ebx, eax, times_1, 0)); |
3414 break; | 3413 break; |
3415 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3414 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
3416 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3415 case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
3417 __ movzx_b(eax, Operand(ebx, ecx, times_1, 0)); | 3416 __ SmiUntag(eax); // Untag the index. |
| 3417 __ movzx_b(eax, Operand(ebx, eax, times_1, 0)); |
3418 break; | 3418 break; |
3419 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3419 case JSObject::EXTERNAL_SHORT_ELEMENTS: |
3420 __ movsx_w(eax, Operand(ebx, ecx, times_2, 0)); | 3420 __ movsx_w(eax, Operand(ebx, eax, times_1, 0)); |
3421 break; | 3421 break; |
3422 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3422 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
3423 __ movzx_w(eax, Operand(ebx, ecx, times_2, 0)); | 3423 __ movzx_w(eax, Operand(ebx, eax, times_1, 0)); |
3424 break; | 3424 break; |
3425 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3425 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
3426 case JSObject::EXTERNAL_INT_ELEMENTS: | 3426 case JSObject::EXTERNAL_INT_ELEMENTS: |
3427 __ mov(ecx, Operand(ebx, ecx, times_4, 0)); | 3427 __ mov(ecx, Operand(ebx, eax, times_2, 0)); |
3428 break; | 3428 break; |
3429 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3429 case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
3430 __ fld_s(Operand(ebx, ecx, times_4, 0)); | 3430 __ fld_s(Operand(ebx, eax, times_2, 0)); |
3431 break; | 3431 break; |
3432 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3432 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
3433 __ fld_d(Operand(ebx, ecx, times_8, 0)); | 3433 __ fld_d(Operand(ebx, eax, times_4, 0)); |
3434 break; | 3434 break; |
3435 default: | 3435 default: |
3436 UNREACHABLE(); | 3436 UNREACHABLE(); |
3437 break; | 3437 break; |
3438 } | 3438 } |
3439 | 3439 |
3440 // For integer array types: | 3440 // For integer array types: |
3441 // ecx: value | 3441 // ecx: value |
3442 // For floating-point array type: | 3442 // For floating-point array type: |
3443 // FP(0): value | 3443 // FP(0): value |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3549 Label miss_force_generic, slow, check_heap_number; | 3549 Label miss_force_generic, slow, check_heap_number; |
3550 | 3550 |
3551 // This stub is meant to be tail-jumped to, the receiver must already | 3551 // This stub is meant to be tail-jumped to, the receiver must already |
3552 // have been verified by the caller to not be a smi. | 3552 // have been verified by the caller to not be a smi. |
3553 | 3553 |
3554 // Check that the key is a smi. | 3554 // Check that the key is a smi. |
3555 __ JumpIfNotSmi(ecx, &miss_force_generic); | 3555 __ JumpIfNotSmi(ecx, &miss_force_generic); |
3556 | 3556 |
3557 // Check that the index is in range. | 3557 // Check that the index is in range. |
3558 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); | 3558 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
3559 __ mov(ebx, ecx); | 3559 __ cmp(ecx, FieldOperand(edi, ExternalArray::kLengthOffset)); |
3560 __ SmiUntag(ebx); | |
3561 __ cmp(ebx, FieldOperand(edi, ExternalArray::kLengthOffset)); | |
3562 // Unsigned comparison catches both negative and too-large values. | 3560 // Unsigned comparison catches both negative and too-large values. |
3563 __ j(above_equal, &slow); | 3561 __ j(above_equal, &slow); |
3564 | 3562 |
3565 // Handle both smis and HeapNumbers in the fast path. Go to the | 3563 // Handle both smis and HeapNumbers in the fast path. Go to the |
3566 // runtime for all other kinds of values. | 3564 // runtime for all other kinds of values. |
3567 // eax: value | 3565 // eax: value |
3568 // edx: receiver | 3566 // edx: receiver |
3569 // ecx: key | 3567 // ecx: key |
3570 // edi: elements array | 3568 // edi: elements array |
3571 // ebx: untagged index | |
3572 if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) { | 3569 if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) { |
3573 __ JumpIfNotSmi(eax, &slow); | 3570 __ JumpIfNotSmi(eax, &slow); |
3574 } else { | 3571 } else { |
3575 __ JumpIfNotSmi(eax, &check_heap_number); | 3572 __ JumpIfNotSmi(eax, &check_heap_number); |
3576 } | 3573 } |
3577 | 3574 |
3578 // smi case | 3575 // smi case |
3579 __ mov(ecx, eax); // Preserve the value in eax. Key is no longer needed. | 3576 __ mov(ebx, eax); // Preserve the value in eax as the return value. |
3580 __ SmiUntag(ecx); | 3577 __ SmiUntag(ebx); |
3581 __ mov(edi, FieldOperand(edi, ExternalArray::kExternalPointerOffset)); | 3578 __ mov(edi, FieldOperand(edi, ExternalArray::kExternalPointerOffset)); |
3582 // ecx: base pointer of external storage | 3579 // edi: base pointer of external storage |
3583 switch (elements_kind) { | 3580 switch (elements_kind) { |
3584 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3581 case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
3585 { // Clamp the value to [0..255]. | 3582 __ ClampUint8(ebx); |
3586 Label done; | 3583 __ SmiUntag(ecx); |
3587 __ test(ecx, Immediate(0xFFFFFF00)); | 3584 __ mov_b(Operand(edi, ecx, times_1, 0), ebx); |
3588 __ j(zero, &done, Label::kNear); | |
3589 __ setcc(negative, ecx); // 1 if negative, 0 if positive. | |
3590 __ dec_b(ecx); // 0 if negative, 255 if positive. | |
3591 __ bind(&done); | |
3592 } | |
3593 __ mov_b(Operand(edi, ebx, times_1, 0), ecx); | |
3594 break; | 3585 break; |
3595 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3586 case JSObject::EXTERNAL_BYTE_ELEMENTS: |
3596 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3587 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
3597 __ mov_b(Operand(edi, ebx, times_1, 0), ecx); | 3588 __ SmiUntag(ecx); |
| 3589 __ mov_b(Operand(edi, ecx, times_1, 0), ebx); |
3598 break; | 3590 break; |
3599 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3591 case JSObject::EXTERNAL_SHORT_ELEMENTS: |
3600 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3592 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
3601 __ mov_w(Operand(edi, ebx, times_2, 0), ecx); | 3593 __ mov_w(Operand(edi, ecx, times_1, 0), ebx); |
3602 break; | 3594 break; |
3603 case JSObject::EXTERNAL_INT_ELEMENTS: | 3595 case JSObject::EXTERNAL_INT_ELEMENTS: |
3604 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3596 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
3605 __ mov(Operand(edi, ebx, times_4, 0), ecx); | 3597 __ mov(Operand(edi, ecx, times_2, 0), ebx); |
3606 break; | 3598 break; |
3607 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3599 case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
3608 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3600 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
3609 // Need to perform int-to-float conversion. | 3601 // Need to perform int-to-float conversion. |
3610 __ push(ecx); | 3602 __ push(ebx); |
3611 __ fild_s(Operand(esp, 0)); | 3603 __ fild_s(Operand(esp, 0)); |
3612 __ pop(ecx); | 3604 __ pop(ebx); |
3613 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { | 3605 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { |
3614 __ fstp_s(Operand(edi, ebx, times_4, 0)); | 3606 __ fstp_s(Operand(edi, ecx, times_2, 0)); |
3615 } else { // elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS. | 3607 } else { // elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS. |
3616 __ fstp_d(Operand(edi, ebx, times_8, 0)); | 3608 __ fstp_d(Operand(edi, ecx, times_4, 0)); |
3617 } | 3609 } |
3618 break; | 3610 break; |
3619 default: | 3611 default: |
3620 UNREACHABLE(); | 3612 UNREACHABLE(); |
3621 break; | 3613 break; |
3622 } | 3614 } |
3623 __ ret(0); // Return the original value. | 3615 __ ret(0); // Return the original value. |
3624 | 3616 |
3625 // TODO(danno): handle heap number -> pixel array conversion | 3617 // TODO(danno): handle heap number -> pixel array conversion |
3626 if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) { | 3618 if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) { |
3627 __ bind(&check_heap_number); | 3619 __ bind(&check_heap_number); |
3628 // eax: value | 3620 // eax: value |
3629 // edx: receiver | 3621 // edx: receiver |
3630 // ecx: key | 3622 // ecx: key |
3631 // edi: elements array | 3623 // edi: elements array |
3632 // ebx: untagged index | |
3633 __ cmp(FieldOperand(eax, HeapObject::kMapOffset), | 3624 __ cmp(FieldOperand(eax, HeapObject::kMapOffset), |
3634 Immediate(masm->isolate()->factory()->heap_number_map())); | 3625 Immediate(masm->isolate()->factory()->heap_number_map())); |
3635 __ j(not_equal, &slow); | 3626 __ j(not_equal, &slow); |
3636 | 3627 |
3637 // The WebGL specification leaves the behavior of storing NaN and | 3628 // The WebGL specification leaves the behavior of storing NaN and |
3638 // +/-Infinity into integer arrays basically undefined. For more | 3629 // +/-Infinity into integer arrays basically undefined. For more |
3639 // reproducible behavior, convert these to zero. | 3630 // reproducible behavior, convert these to zero. |
3640 __ mov(edi, FieldOperand(edi, ExternalArray::kExternalPointerOffset)); | 3631 __ mov(edi, FieldOperand(edi, ExternalArray::kExternalPointerOffset)); |
3641 // ebx: untagged index | |
3642 // edi: base pointer of external storage | 3632 // edi: base pointer of external storage |
3643 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { | 3633 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { |
3644 __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset)); | 3634 __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset)); |
3645 __ fstp_s(Operand(edi, ebx, times_4, 0)); | 3635 __ fstp_s(Operand(edi, ecx, times_2, 0)); |
3646 __ ret(0); | 3636 __ ret(0); |
3647 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 3637 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
3648 __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset)); | 3638 __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset)); |
3649 __ fstp_d(Operand(edi, ebx, times_8, 0)); | 3639 __ fstp_d(Operand(edi, ecx, times_4, 0)); |
3650 __ ret(0); | 3640 __ ret(0); |
3651 } else { | 3641 } else { |
3652 // Perform float-to-int conversion with truncation (round-to-zero) | 3642 // Perform float-to-int conversion with truncation (round-to-zero) |
3653 // behavior. | 3643 // behavior. |
3654 | 3644 |
3655 // For the moment we make the slow call to the runtime on | 3645 // For the moment we make the slow call to the runtime on |
3656 // processors that don't support SSE2. The code in IntegerConvert | 3646 // processors that don't support SSE2. The code in IntegerConvert |
3657 // (code-stubs-ia32.cc) is roughly what is needed here though the | 3647 // (code-stubs-ia32.cc) is roughly what is needed here though the |
3658 // conversion failure case does not need to be handled. | 3648 // conversion failure case does not need to be handled. |
3659 if (CpuFeatures::IsSupported(SSE2)) { | 3649 if (CpuFeatures::IsSupported(SSE2)) { |
3660 if (elements_kind != JSObject::EXTERNAL_INT_ELEMENTS && | 3650 if (elements_kind != JSObject::EXTERNAL_INT_ELEMENTS && |
3661 elements_kind != JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) { | 3651 elements_kind != JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
3662 ASSERT(CpuFeatures::IsSupported(SSE2)); | 3652 ASSERT(CpuFeatures::IsSupported(SSE2)); |
3663 CpuFeatures::Scope scope(SSE2); | 3653 CpuFeatures::Scope scope(SSE2); |
3664 __ cvttsd2si(ecx, FieldOperand(eax, HeapNumber::kValueOffset)); | 3654 __ cvttsd2si(ebx, FieldOperand(eax, HeapNumber::kValueOffset)); |
3665 // ecx: untagged integer value | 3655 // ecx: untagged integer value |
3666 switch (elements_kind) { | 3656 switch (elements_kind) { |
3667 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3657 case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
3668 { // Clamp the value to [0..255]. | 3658 __ ClampUint8(ebx); |
3669 Label done; | 3659 // Fall through. |
3670 __ test(ecx, Immediate(0xFFFFFF00)); | |
3671 __ j(zero, &done, Label::kNear); | |
3672 __ setcc(negative, ecx); // 1 if negative, 0 if positive. | |
3673 __ dec_b(ecx); // 0 if negative, 255 if positive. | |
3674 __ bind(&done); | |
3675 } | |
3676 __ mov_b(Operand(edi, ebx, times_1, 0), ecx); | |
3677 break; | |
3678 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3660 case JSObject::EXTERNAL_BYTE_ELEMENTS: |
3679 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3661 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
3680 __ mov_b(Operand(edi, ebx, times_1, 0), ecx); | 3662 __ SmiUntag(ecx); |
| 3663 __ mov_b(Operand(edi, ecx, times_1, 0), ebx); |
3681 break; | 3664 break; |
3682 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3665 case JSObject::EXTERNAL_SHORT_ELEMENTS: |
3683 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3666 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
3684 __ mov_w(Operand(edi, ebx, times_2, 0), ecx); | 3667 __ mov_w(Operand(edi, ecx, times_1, 0), ebx); |
3685 break; | 3668 break; |
3686 default: | 3669 default: |
3687 UNREACHABLE(); | 3670 UNREACHABLE(); |
3688 break; | 3671 break; |
3689 } | 3672 } |
3690 } else { | 3673 } else { |
3691 if (CpuFeatures::IsSupported(SSE3)) { | 3674 if (CpuFeatures::IsSupported(SSE3)) { |
3692 CpuFeatures::Scope scope(SSE3); | 3675 CpuFeatures::Scope scope(SSE3); |
3693 // fisttp stores values as signed integers. To represent the | 3676 // fisttp stores values as signed integers. To represent the |
3694 // entire range of int and unsigned int arrays, store as a | 3677 // entire range of int and unsigned int arrays, store as a |
3695 // 64-bit int and discard the high 32 bits. | 3678 // 64-bit int and discard the high 32 bits. |
3696 // If the value is NaN or +/-infinity, the result is 0x80000000, | 3679 // If the value is NaN or +/-infinity, the result is 0x80000000, |
3697 // which is automatically zero when taken mod 2^n, n < 32. | 3680 // which is automatically zero when taken mod 2^n, n < 32. |
3698 __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset)); | 3681 __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset)); |
3699 __ sub(Operand(esp), Immediate(2 * kPointerSize)); | 3682 __ sub(Operand(esp), Immediate(2 * kPointerSize)); |
3700 __ fisttp_d(Operand(esp, 0)); | 3683 __ fisttp_d(Operand(esp, 0)); |
3701 __ pop(ecx); | 3684 __ pop(ebx); |
3702 __ add(Operand(esp), Immediate(kPointerSize)); | 3685 __ add(Operand(esp), Immediate(kPointerSize)); |
3703 } else { | 3686 } else { |
3704 ASSERT(CpuFeatures::IsSupported(SSE2)); | 3687 ASSERT(CpuFeatures::IsSupported(SSE2)); |
3705 CpuFeatures::Scope scope(SSE2); | 3688 CpuFeatures::Scope scope(SSE2); |
3706 // We can easily implement the correct rounding behavior for the | 3689 // We can easily implement the correct rounding behavior for the |
3707 // range [0, 2^31-1]. For the time being, to keep this code simple, | 3690 // range [0, 2^31-1]. For the time being, to keep this code simple, |
3708 // make the slow runtime call for values outside this range. | 3691 // make the slow runtime call for values outside this range. |
3709 // Note: we could do better for signed int arrays. | 3692 // Note: we could do better for signed int arrays. |
3710 __ movd(xmm0, FieldOperand(eax, HeapNumber::kValueOffset)); | 3693 __ movd(xmm0, FieldOperand(eax, HeapNumber::kValueOffset)); |
3711 // We will need the key if we have to make the slow runtime call. | 3694 // We will need the key if we have to make the slow runtime call. |
3712 __ push(ecx); | 3695 __ push(ebx); |
3713 __ LoadPowerOf2(xmm1, ecx, 31); | 3696 __ LoadPowerOf2(xmm1, ebx, 31); |
3714 __ pop(ecx); | 3697 __ pop(ebx); |
3715 __ ucomisd(xmm1, xmm0); | 3698 __ ucomisd(xmm1, xmm0); |
3716 __ j(above_equal, &slow); | 3699 __ j(above_equal, &slow); |
3717 __ cvttsd2si(ecx, Operand(xmm0)); | 3700 __ cvttsd2si(ebx, Operand(xmm0)); |
3718 } | 3701 } |
3719 // ecx: untagged integer value | 3702 // ebx: untagged integer value |
3720 __ mov(Operand(edi, ebx, times_4, 0), ecx); | 3703 __ mov(Operand(edi, ecx, times_2, 0), ebx); |
3721 } | 3704 } |
3722 __ ret(0); // Return original value. | 3705 __ ret(0); // Return original value. |
3723 } | 3706 } |
3724 } | 3707 } |
3725 } | 3708 } |
3726 | 3709 |
3727 // Slow case: call runtime. | 3710 // Slow case: call runtime. |
3728 __ bind(&slow); | 3711 __ bind(&slow); |
3729 Counters* counters = masm->isolate()->counters(); | 3712 Counters* counters = masm->isolate()->counters(); |
3730 __ IncrementCounter(counters->keyed_store_external_array_slow(), 1); | 3713 __ IncrementCounter(counters->keyed_store_external_array_slow(), 1); |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3996 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); | 3979 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); |
3997 __ jmp(ic_force_generic, RelocInfo::CODE_TARGET); | 3980 __ jmp(ic_force_generic, RelocInfo::CODE_TARGET); |
3998 } | 3981 } |
3999 | 3982 |
4000 | 3983 |
4001 #undef __ | 3984 #undef __ |
4002 | 3985 |
4003 } } // namespace v8::internal | 3986 } } // namespace v8::internal |
4004 | 3987 |
4005 #endif // V8_TARGET_ARCH_IA32 | 3988 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |