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 3081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3092 } | 3092 } |
3093 | 3093 |
3094 | 3094 |
3095 MaybeObject* KeyedLoadStubCompiler::CompileLoadElement(Map* receiver_map) { | 3095 MaybeObject* KeyedLoadStubCompiler::CompileLoadElement(Map* receiver_map) { |
3096 // ----------- S t a t e ------------- | 3096 // ----------- S t a t e ------------- |
3097 // -- ra : return address | 3097 // -- ra : return address |
3098 // -- a0 : key | 3098 // -- a0 : key |
3099 // -- a1 : receiver | 3099 // -- a1 : receiver |
3100 // ----------------------------------- | 3100 // ----------------------------------- |
3101 Code* stub; | 3101 Code* stub; |
3102 JSObject::ElementsKind elements_kind = receiver_map->elements_kind(); | 3102 ElementsKind elements_kind = receiver_map->elements_kind(); |
3103 MaybeObject* maybe_stub = KeyedLoadElementStub(elements_kind).TryGetCode(); | 3103 MaybeObject* maybe_stub = KeyedLoadElementStub(elements_kind).TryGetCode(); |
3104 if (!maybe_stub->To(&stub)) return maybe_stub; | 3104 if (!maybe_stub->To(&stub)) return maybe_stub; |
3105 __ DispatchMap(a1, | 3105 __ DispatchMap(a1, |
3106 a2, | 3106 a2, |
3107 Handle<Map>(receiver_map), | 3107 Handle<Map>(receiver_map), |
3108 Handle<Code>(stub), | 3108 Handle<Code>(stub), |
3109 DO_SMI_CHECK); | 3109 DO_SMI_CHECK); |
3110 | 3110 |
3111 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss(); | 3111 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss(); |
3112 __ Jump(ic, RelocInfo::CODE_TARGET); | 3112 __ Jump(ic, RelocInfo::CODE_TARGET); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3184 | 3184 |
3185 MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) { | 3185 MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) { |
3186 // ----------- S t a t e ------------- | 3186 // ----------- S t a t e ------------- |
3187 // -- a0 : value | 3187 // -- a0 : value |
3188 // -- a1 : key | 3188 // -- a1 : key |
3189 // -- a2 : receiver | 3189 // -- a2 : receiver |
3190 // -- ra : return address | 3190 // -- ra : return address |
3191 // -- a3 : scratch | 3191 // -- a3 : scratch |
3192 // ----------------------------------- | 3192 // ----------------------------------- |
3193 Code* stub; | 3193 Code* stub; |
3194 JSObject::ElementsKind elements_kind = receiver_map->elements_kind(); | 3194 ElementsKind elements_kind = receiver_map->elements_kind(); |
3195 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; | 3195 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
3196 MaybeObject* maybe_stub = | 3196 MaybeObject* maybe_stub = |
3197 KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode(); | 3197 KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode(); |
3198 if (!maybe_stub->To(&stub)) return maybe_stub; | 3198 if (!maybe_stub->To(&stub)) return maybe_stub; |
3199 __ DispatchMap(a2, | 3199 __ DispatchMap(a2, |
3200 a3, | 3200 a3, |
3201 Handle<Map>(receiver_map), | 3201 Handle<Map>(receiver_map), |
3202 Handle<Code>(stub), | 3202 Handle<Code>(stub), |
3203 DO_SMI_CHECK); | 3203 DO_SMI_CHECK); |
3204 | 3204 |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3435 // -- a0 : key | 3435 // -- a0 : key |
3436 // -- a1 : receiver | 3436 // -- a1 : receiver |
3437 // ----------------------------------- | 3437 // ----------------------------------- |
3438 | 3438 |
3439 Handle<Code> miss_ic = | 3439 Handle<Code> miss_ic = |
3440 masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric(); | 3440 masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric(); |
3441 __ Jump(miss_ic, RelocInfo::CODE_TARGET); | 3441 __ Jump(miss_ic, RelocInfo::CODE_TARGET); |
3442 } | 3442 } |
3443 | 3443 |
3444 | 3444 |
3445 static bool IsElementTypeSigned(JSObject::ElementsKind elements_kind) { | 3445 static bool IsElementTypeSigned(ElementsKind elements_kind) { |
3446 switch (elements_kind) { | 3446 switch (elements_kind) { |
3447 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3447 case EXTERNAL_BYTE_ELEMENTS: |
3448 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3448 case EXTERNAL_SHORT_ELEMENTS: |
3449 case JSObject::EXTERNAL_INT_ELEMENTS: | 3449 case EXTERNAL_INT_ELEMENTS: |
3450 return true; | 3450 return true; |
3451 | 3451 |
3452 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3452 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
3453 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3453 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
3454 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3454 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
3455 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3455 case EXTERNAL_PIXEL_ELEMENTS: |
3456 return false; | 3456 return false; |
3457 | 3457 |
3458 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3458 case EXTERNAL_FLOAT_ELEMENTS: |
3459 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3459 case EXTERNAL_DOUBLE_ELEMENTS: |
3460 case JSObject::FAST_ELEMENTS: | 3460 case FAST_ELEMENTS: |
3461 case JSObject::FAST_DOUBLE_ELEMENTS: | 3461 case FAST_DOUBLE_ELEMENTS: |
3462 case JSObject::DICTIONARY_ELEMENTS: | 3462 case DICTIONARY_ELEMENTS: |
3463 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3463 case NON_STRICT_ARGUMENTS_ELEMENTS: |
3464 UNREACHABLE(); | 3464 UNREACHABLE(); |
3465 return false; | 3465 return false; |
3466 } | 3466 } |
3467 return false; | 3467 return false; |
3468 } | 3468 } |
3469 | 3469 |
3470 | 3470 |
3471 void KeyedLoadStubCompiler::GenerateLoadExternalArray( | 3471 void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
3472 MacroAssembler* masm, | 3472 MacroAssembler* masm, |
3473 JSObject::ElementsKind elements_kind) { | 3473 ElementsKind elements_kind) { |
3474 // ---------- S t a t e -------------- | 3474 // ---------- S t a t e -------------- |
3475 // -- ra : return address | 3475 // -- ra : return address |
3476 // -- a0 : key | 3476 // -- a0 : key |
3477 // -- a1 : receiver | 3477 // -- a1 : receiver |
3478 // ----------------------------------- | 3478 // ----------------------------------- |
3479 Label miss_force_generic, slow, failed_allocation; | 3479 Label miss_force_generic, slow, failed_allocation; |
3480 | 3480 |
3481 Register key = a0; | 3481 Register key = a0; |
3482 Register receiver = a1; | 3482 Register receiver = a1; |
3483 | 3483 |
(...skipping 14 matching lines...) Expand all Loading... |
3498 | 3498 |
3499 __ lw(a3, FieldMemOperand(a3, ExternalArray::kExternalPointerOffset)); | 3499 __ lw(a3, FieldMemOperand(a3, ExternalArray::kExternalPointerOffset)); |
3500 // a3: base pointer of external storage | 3500 // a3: base pointer of external storage |
3501 | 3501 |
3502 // We are not untagging smi key and instead work with it | 3502 // We are not untagging smi key and instead work with it |
3503 // as if it was premultiplied by 2. | 3503 // as if it was premultiplied by 2. |
3504 STATIC_ASSERT((kSmiTag == 0) && (kSmiTagSize == 1)); | 3504 STATIC_ASSERT((kSmiTag == 0) && (kSmiTagSize == 1)); |
3505 | 3505 |
3506 Register value = a2; | 3506 Register value = a2; |
3507 switch (elements_kind) { | 3507 switch (elements_kind) { |
3508 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3508 case EXTERNAL_BYTE_ELEMENTS: |
3509 __ srl(t2, key, 1); | 3509 __ srl(t2, key, 1); |
3510 __ addu(t3, a3, t2); | 3510 __ addu(t3, a3, t2); |
3511 __ lb(value, MemOperand(t3, 0)); | 3511 __ lb(value, MemOperand(t3, 0)); |
3512 break; | 3512 break; |
3513 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3513 case EXTERNAL_PIXEL_ELEMENTS: |
3514 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3514 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
3515 __ srl(t2, key, 1); | 3515 __ srl(t2, key, 1); |
3516 __ addu(t3, a3, t2); | 3516 __ addu(t3, a3, t2); |
3517 __ lbu(value, MemOperand(t3, 0)); | 3517 __ lbu(value, MemOperand(t3, 0)); |
3518 break; | 3518 break; |
3519 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3519 case EXTERNAL_SHORT_ELEMENTS: |
3520 __ addu(t3, a3, key); | 3520 __ addu(t3, a3, key); |
3521 __ lh(value, MemOperand(t3, 0)); | 3521 __ lh(value, MemOperand(t3, 0)); |
3522 break; | 3522 break; |
3523 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3523 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
3524 __ addu(t3, a3, key); | 3524 __ addu(t3, a3, key); |
3525 __ lhu(value, MemOperand(t3, 0)); | 3525 __ lhu(value, MemOperand(t3, 0)); |
3526 break; | 3526 break; |
3527 case JSObject::EXTERNAL_INT_ELEMENTS: | 3527 case EXTERNAL_INT_ELEMENTS: |
3528 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3528 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
3529 __ sll(t2, key, 1); | 3529 __ sll(t2, key, 1); |
3530 __ addu(t3, a3, t2); | 3530 __ addu(t3, a3, t2); |
3531 __ lw(value, MemOperand(t3, 0)); | 3531 __ lw(value, MemOperand(t3, 0)); |
3532 break; | 3532 break; |
3533 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3533 case EXTERNAL_FLOAT_ELEMENTS: |
3534 __ sll(t3, t2, 2); | 3534 __ sll(t3, t2, 2); |
3535 __ addu(t3, a3, t3); | 3535 __ addu(t3, a3, t3); |
3536 if (CpuFeatures::IsSupported(FPU)) { | 3536 if (CpuFeatures::IsSupported(FPU)) { |
3537 CpuFeatures::Scope scope(FPU); | 3537 CpuFeatures::Scope scope(FPU); |
3538 __ lwc1(f0, MemOperand(t3, 0)); | 3538 __ lwc1(f0, MemOperand(t3, 0)); |
3539 } else { | 3539 } else { |
3540 __ lw(value, MemOperand(t3, 0)); | 3540 __ lw(value, MemOperand(t3, 0)); |
3541 } | 3541 } |
3542 break; | 3542 break; |
3543 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3543 case EXTERNAL_DOUBLE_ELEMENTS: |
3544 __ sll(t2, key, 2); | 3544 __ sll(t2, key, 2); |
3545 __ addu(t3, a3, t2); | 3545 __ addu(t3, a3, t2); |
3546 if (CpuFeatures::IsSupported(FPU)) { | 3546 if (CpuFeatures::IsSupported(FPU)) { |
3547 CpuFeatures::Scope scope(FPU); | 3547 CpuFeatures::Scope scope(FPU); |
3548 __ ldc1(f0, MemOperand(t3, 0)); | 3548 __ ldc1(f0, MemOperand(t3, 0)); |
3549 } else { | 3549 } else { |
3550 // t3: pointer to the beginning of the double we want to load. | 3550 // t3: pointer to the beginning of the double we want to load. |
3551 __ lw(a2, MemOperand(t3, 0)); | 3551 __ lw(a2, MemOperand(t3, 0)); |
3552 __ lw(a3, MemOperand(t3, Register::kSizeInBytes)); | 3552 __ lw(a3, MemOperand(t3, Register::kSizeInBytes)); |
3553 } | 3553 } |
3554 break; | 3554 break; |
3555 case JSObject::FAST_ELEMENTS: | 3555 case FAST_ELEMENTS: |
3556 case JSObject::FAST_DOUBLE_ELEMENTS: | 3556 case FAST_DOUBLE_ELEMENTS: |
3557 case JSObject::DICTIONARY_ELEMENTS: | 3557 case DICTIONARY_ELEMENTS: |
3558 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3558 case NON_STRICT_ARGUMENTS_ELEMENTS: |
3559 UNREACHABLE(); | 3559 UNREACHABLE(); |
3560 break; | 3560 break; |
3561 } | 3561 } |
3562 | 3562 |
3563 // For integer array types: | 3563 // For integer array types: |
3564 // a2: value | 3564 // a2: value |
3565 // For float array type: | 3565 // For float array type: |
3566 // f0: value (if FPU is supported) | 3566 // f0: value (if FPU is supported) |
3567 // a2: value (if FPU is not supported) | 3567 // a2: value (if FPU is not supported) |
3568 // For double array type: | 3568 // For double array type: |
3569 // f0: value (if FPU is supported) | 3569 // f0: value (if FPU is supported) |
3570 // a2/a3: value (if FPU is not supported) | 3570 // a2/a3: value (if FPU is not supported) |
3571 | 3571 |
3572 if (elements_kind == JSObject::EXTERNAL_INT_ELEMENTS) { | 3572 if (elements_kind == EXTERNAL_INT_ELEMENTS) { |
3573 // For the Int and UnsignedInt array types, we need to see whether | 3573 // For the Int and UnsignedInt array types, we need to see whether |
3574 // the value can be represented in a Smi. If not, we need to convert | 3574 // the value can be represented in a Smi. If not, we need to convert |
3575 // it to a HeapNumber. | 3575 // it to a HeapNumber. |
3576 Label box_int; | 3576 Label box_int; |
3577 __ Subu(t3, value, Operand(0xC0000000)); // Non-smi value gives neg result. | 3577 __ Subu(t3, value, Operand(0xC0000000)); // Non-smi value gives neg result. |
3578 __ Branch(&box_int, lt, t3, Operand(zero_reg)); | 3578 __ Branch(&box_int, lt, t3, Operand(zero_reg)); |
3579 // Tag integer as smi and return it. | 3579 // Tag integer as smi and return it. |
3580 __ sll(v0, value, kSmiTagSize); | 3580 __ sll(v0, value, kSmiTagSize); |
3581 __ Ret(); | 3581 __ Ret(); |
3582 | 3582 |
(...skipping 21 matching lines...) Expand all Loading... |
3604 dest, | 3604 dest, |
3605 f0, | 3605 f0, |
3606 dst1, | 3606 dst1, |
3607 dst2, | 3607 dst2, |
3608 t1, | 3608 t1, |
3609 f2); | 3609 f2); |
3610 __ sw(dst1, FieldMemOperand(v0, HeapNumber::kMantissaOffset)); | 3610 __ sw(dst1, FieldMemOperand(v0, HeapNumber::kMantissaOffset)); |
3611 __ sw(dst2, FieldMemOperand(v0, HeapNumber::kExponentOffset)); | 3611 __ sw(dst2, FieldMemOperand(v0, HeapNumber::kExponentOffset)); |
3612 __ Ret(); | 3612 __ Ret(); |
3613 } | 3613 } |
3614 } else if (elements_kind == JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) { | 3614 } else if (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
3615 // The test is different for unsigned int values. Since we need | 3615 // The test is different for unsigned int values. Since we need |
3616 // the value to be in the range of a positive smi, we can't | 3616 // the value to be in the range of a positive smi, we can't |
3617 // handle either of the top two bits being set in the value. | 3617 // handle either of the top two bits being set in the value. |
3618 if (CpuFeatures::IsSupported(FPU)) { | 3618 if (CpuFeatures::IsSupported(FPU)) { |
3619 CpuFeatures::Scope scope(FPU); | 3619 CpuFeatures::Scope scope(FPU); |
3620 Label pl_box_int; | 3620 Label pl_box_int; |
3621 __ And(t2, value, Operand(0xC0000000)); | 3621 __ And(t2, value, Operand(0xC0000000)); |
3622 __ Branch(&pl_box_int, ne, t2, Operand(zero_reg)); | 3622 __ Branch(&pl_box_int, ne, t2, Operand(zero_reg)); |
3623 | 3623 |
3624 // It can fit in an Smi. | 3624 // It can fit in an Smi. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3675 // space. | 3675 // space. |
3676 __ LoadRoot(t6, Heap::kHeapNumberMapRootIndex); | 3676 __ LoadRoot(t6, Heap::kHeapNumberMapRootIndex); |
3677 __ AllocateHeapNumber(t2, t3, t5, t6, &slow); | 3677 __ AllocateHeapNumber(t2, t3, t5, t6, &slow); |
3678 | 3678 |
3679 __ sw(hiword, FieldMemOperand(t2, HeapNumber::kExponentOffset)); | 3679 __ sw(hiword, FieldMemOperand(t2, HeapNumber::kExponentOffset)); |
3680 __ sw(loword, FieldMemOperand(t2, HeapNumber::kMantissaOffset)); | 3680 __ sw(loword, FieldMemOperand(t2, HeapNumber::kMantissaOffset)); |
3681 | 3681 |
3682 __ mov(v0, t2); | 3682 __ mov(v0, t2); |
3683 __ Ret(); | 3683 __ Ret(); |
3684 } | 3684 } |
3685 } else if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { | 3685 } else if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
3686 // For the floating-point array type, we need to always allocate a | 3686 // For the floating-point array type, we need to always allocate a |
3687 // HeapNumber. | 3687 // HeapNumber. |
3688 if (CpuFeatures::IsSupported(FPU)) { | 3688 if (CpuFeatures::IsSupported(FPU)) { |
3689 CpuFeatures::Scope scope(FPU); | 3689 CpuFeatures::Scope scope(FPU); |
3690 // Allocate a HeapNumber for the result. Don't use a0 and a1 as | 3690 // Allocate a HeapNumber for the result. Don't use a0 and a1 as |
3691 // AllocateHeapNumber clobbers all registers - also when jumping due to | 3691 // AllocateHeapNumber clobbers all registers - also when jumping due to |
3692 // exhausted young space. | 3692 // exhausted young space. |
3693 __ LoadRoot(t6, Heap::kHeapNumberMapRootIndex); | 3693 __ LoadRoot(t6, Heap::kHeapNumberMapRootIndex); |
3694 __ AllocateHeapNumber(v0, t3, t5, t6, &slow); | 3694 __ AllocateHeapNumber(v0, t3, t5, t6, &slow); |
3695 // The float (single) value is already in fpu reg f0 (if we use float). | 3695 // The float (single) value is already in fpu reg f0 (if we use float). |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3742 | 3742 |
3743 __ srl(t0, t4, kMantissaShiftForHiWord); | 3743 __ srl(t0, t4, kMantissaShiftForHiWord); |
3744 __ or_(a2, a2, t0); | 3744 __ or_(a2, a2, t0); |
3745 __ sll(a0, t4, kMantissaShiftForLoWord); | 3745 __ sll(a0, t4, kMantissaShiftForLoWord); |
3746 | 3746 |
3747 __ sw(a2, FieldMemOperand(v0, HeapNumber::kExponentOffset)); | 3747 __ sw(a2, FieldMemOperand(v0, HeapNumber::kExponentOffset)); |
3748 __ sw(a0, FieldMemOperand(v0, HeapNumber::kMantissaOffset)); | 3748 __ sw(a0, FieldMemOperand(v0, HeapNumber::kMantissaOffset)); |
3749 __ Ret(); | 3749 __ Ret(); |
3750 } | 3750 } |
3751 | 3751 |
3752 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 3752 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
3753 if (CpuFeatures::IsSupported(FPU)) { | 3753 if (CpuFeatures::IsSupported(FPU)) { |
3754 CpuFeatures::Scope scope(FPU); | 3754 CpuFeatures::Scope scope(FPU); |
3755 // Allocate a HeapNumber for the result. Don't use a0 and a1 as | 3755 // Allocate a HeapNumber for the result. Don't use a0 and a1 as |
3756 // AllocateHeapNumber clobbers all registers - also when jumping due to | 3756 // AllocateHeapNumber clobbers all registers - also when jumping due to |
3757 // exhausted young space. | 3757 // exhausted young space. |
3758 __ LoadRoot(t6, Heap::kHeapNumberMapRootIndex); | 3758 __ LoadRoot(t6, Heap::kHeapNumberMapRootIndex); |
3759 __ AllocateHeapNumber(v0, t3, t5, t6, &slow); | 3759 __ AllocateHeapNumber(v0, t3, t5, t6, &slow); |
3760 // The double value is already in f0 | 3760 // The double value is already in f0 |
3761 __ sdc1(f0, FieldMemOperand(v0, HeapNumber::kValueOffset)); | 3761 __ sdc1(f0, FieldMemOperand(v0, HeapNumber::kValueOffset)); |
3762 __ Ret(); | 3762 __ Ret(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3796 | 3796 |
3797 __ bind(&miss_force_generic); | 3797 __ bind(&miss_force_generic); |
3798 Code* stub = masm->isolate()->builtins()->builtin( | 3798 Code* stub = masm->isolate()->builtins()->builtin( |
3799 Builtins::kKeyedLoadIC_MissForceGeneric); | 3799 Builtins::kKeyedLoadIC_MissForceGeneric); |
3800 __ Jump(Handle<Code>(stub), RelocInfo::CODE_TARGET); | 3800 __ Jump(Handle<Code>(stub), RelocInfo::CODE_TARGET); |
3801 } | 3801 } |
3802 | 3802 |
3803 | 3803 |
3804 void KeyedStoreStubCompiler::GenerateStoreExternalArray( | 3804 void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
3805 MacroAssembler* masm, | 3805 MacroAssembler* masm, |
3806 JSObject::ElementsKind elements_kind) { | 3806 ElementsKind elements_kind) { |
3807 // ---------- S t a t e -------------- | 3807 // ---------- S t a t e -------------- |
3808 // -- a0 : value | 3808 // -- a0 : value |
3809 // -- a1 : key | 3809 // -- a1 : key |
3810 // -- a2 : receiver | 3810 // -- a2 : receiver |
3811 // -- ra : return address | 3811 // -- ra : return address |
3812 // ----------------------------------- | 3812 // ----------------------------------- |
3813 | 3813 |
3814 Label slow, check_heap_number, miss_force_generic; | 3814 Label slow, check_heap_number, miss_force_generic; |
3815 | 3815 |
3816 // Register usage. | 3816 // Register usage. |
(...skipping 14 matching lines...) Expand all Loading... |
3831 __ SmiUntag(t0, key); | 3831 __ SmiUntag(t0, key); |
3832 __ lw(t1, FieldMemOperand(a3, ExternalArray::kLengthOffset)); | 3832 __ lw(t1, FieldMemOperand(a3, ExternalArray::kLengthOffset)); |
3833 // Unsigned comparison catches both negative and too-large values. | 3833 // Unsigned comparison catches both negative and too-large values. |
3834 __ Branch(&miss_force_generic, Ugreater_equal, key, Operand(t1)); | 3834 __ Branch(&miss_force_generic, Ugreater_equal, key, Operand(t1)); |
3835 | 3835 |
3836 // Handle both smis and HeapNumbers in the fast path. Go to the | 3836 // Handle both smis and HeapNumbers in the fast path. Go to the |
3837 // runtime for all other kinds of values. | 3837 // runtime for all other kinds of values. |
3838 // a3: external array. | 3838 // a3: external array. |
3839 // t0: key (integer). | 3839 // t0: key (integer). |
3840 | 3840 |
3841 if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) { | 3841 if (elements_kind == EXTERNAL_PIXEL_ELEMENTS) { |
3842 // Double to pixel conversion is only implemented in the runtime for now. | 3842 // Double to pixel conversion is only implemented in the runtime for now. |
3843 __ JumpIfNotSmi(value, &slow); | 3843 __ JumpIfNotSmi(value, &slow); |
3844 } else { | 3844 } else { |
3845 __ JumpIfNotSmi(value, &check_heap_number); | 3845 __ JumpIfNotSmi(value, &check_heap_number); |
3846 } | 3846 } |
3847 __ SmiUntag(t1, value); | 3847 __ SmiUntag(t1, value); |
3848 __ lw(a3, FieldMemOperand(a3, ExternalArray::kExternalPointerOffset)); | 3848 __ lw(a3, FieldMemOperand(a3, ExternalArray::kExternalPointerOffset)); |
3849 | 3849 |
3850 // a3: base pointer of external storage. | 3850 // a3: base pointer of external storage. |
3851 // t0: key (integer). | 3851 // t0: key (integer). |
3852 // t1: value (integer). | 3852 // t1: value (integer). |
3853 | 3853 |
3854 switch (elements_kind) { | 3854 switch (elements_kind) { |
3855 case JSObject::EXTERNAL_PIXEL_ELEMENTS: { | 3855 case EXTERNAL_PIXEL_ELEMENTS: { |
3856 // Clamp the value to [0..255]. | 3856 // Clamp the value to [0..255]. |
3857 // v0 is used as a scratch register here. | 3857 // v0 is used as a scratch register here. |
3858 Label done; | 3858 Label done; |
3859 __ li(v0, Operand(255)); | 3859 __ li(v0, Operand(255)); |
3860 // Normal branch: nop in delay slot. | 3860 // Normal branch: nop in delay slot. |
3861 __ Branch(&done, gt, t1, Operand(v0)); | 3861 __ Branch(&done, gt, t1, Operand(v0)); |
3862 // Use delay slot in this branch. | 3862 // Use delay slot in this branch. |
3863 __ Branch(USE_DELAY_SLOT, &done, lt, t1, Operand(zero_reg)); | 3863 __ Branch(USE_DELAY_SLOT, &done, lt, t1, Operand(zero_reg)); |
3864 __ mov(v0, zero_reg); // In delay slot. | 3864 __ mov(v0, zero_reg); // In delay slot. |
3865 __ mov(v0, t1); // Value is in range 0..255. | 3865 __ mov(v0, t1); // Value is in range 0..255. |
3866 __ bind(&done); | 3866 __ bind(&done); |
3867 __ mov(t1, v0); | 3867 __ mov(t1, v0); |
3868 __ addu(t8, a3, t0); | 3868 __ addu(t8, a3, t0); |
3869 __ sb(t1, MemOperand(t8, 0)); | 3869 __ sb(t1, MemOperand(t8, 0)); |
3870 } | 3870 } |
3871 break; | 3871 break; |
3872 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3872 case EXTERNAL_BYTE_ELEMENTS: |
3873 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3873 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
3874 __ addu(t8, a3, t0); | 3874 __ addu(t8, a3, t0); |
3875 __ sb(t1, MemOperand(t8, 0)); | 3875 __ sb(t1, MemOperand(t8, 0)); |
3876 break; | 3876 break; |
3877 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3877 case EXTERNAL_SHORT_ELEMENTS: |
3878 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3878 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
3879 __ sll(t8, t0, 1); | 3879 __ sll(t8, t0, 1); |
3880 __ addu(t8, a3, t8); | 3880 __ addu(t8, a3, t8); |
3881 __ sh(t1, MemOperand(t8, 0)); | 3881 __ sh(t1, MemOperand(t8, 0)); |
3882 break; | 3882 break; |
3883 case JSObject::EXTERNAL_INT_ELEMENTS: | 3883 case EXTERNAL_INT_ELEMENTS: |
3884 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3884 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
3885 __ sll(t8, t0, 2); | 3885 __ sll(t8, t0, 2); |
3886 __ addu(t8, a3, t8); | 3886 __ addu(t8, a3, t8); |
3887 __ sw(t1, MemOperand(t8, 0)); | 3887 __ sw(t1, MemOperand(t8, 0)); |
3888 break; | 3888 break; |
3889 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3889 case EXTERNAL_FLOAT_ELEMENTS: |
3890 // Perform int-to-float conversion and store to memory. | 3890 // Perform int-to-float conversion and store to memory. |
3891 StoreIntAsFloat(masm, a3, t0, t1, t2, t3, t4); | 3891 StoreIntAsFloat(masm, a3, t0, t1, t2, t3, t4); |
3892 break; | 3892 break; |
3893 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3893 case EXTERNAL_DOUBLE_ELEMENTS: |
3894 __ sll(t8, t0, 3); | 3894 __ sll(t8, t0, 3); |
3895 __ addu(a3, a3, t8); | 3895 __ addu(a3, a3, t8); |
3896 // a3: effective address of the double element | 3896 // a3: effective address of the double element |
3897 FloatingPointHelper::Destination destination; | 3897 FloatingPointHelper::Destination destination; |
3898 if (CpuFeatures::IsSupported(FPU)) { | 3898 if (CpuFeatures::IsSupported(FPU)) { |
3899 destination = FloatingPointHelper::kFPURegisters; | 3899 destination = FloatingPointHelper::kFPURegisters; |
3900 } else { | 3900 } else { |
3901 destination = FloatingPointHelper::kCoreRegisters; | 3901 destination = FloatingPointHelper::kCoreRegisters; |
3902 } | 3902 } |
3903 FloatingPointHelper::ConvertIntToDouble( | 3903 FloatingPointHelper::ConvertIntToDouble( |
3904 masm, t1, destination, | 3904 masm, t1, destination, |
3905 f0, t2, t3, // These are: double_dst, dst1, dst2. | 3905 f0, t2, t3, // These are: double_dst, dst1, dst2. |
3906 t0, f2); // These are: scratch2, single_scratch. | 3906 t0, f2); // These are: scratch2, single_scratch. |
3907 if (destination == FloatingPointHelper::kFPURegisters) { | 3907 if (destination == FloatingPointHelper::kFPURegisters) { |
3908 CpuFeatures::Scope scope(FPU); | 3908 CpuFeatures::Scope scope(FPU); |
3909 __ sdc1(f0, MemOperand(a3, 0)); | 3909 __ sdc1(f0, MemOperand(a3, 0)); |
3910 } else { | 3910 } else { |
3911 __ sw(t2, MemOperand(a3, 0)); | 3911 __ sw(t2, MemOperand(a3, 0)); |
3912 __ sw(t3, MemOperand(a3, Register::kSizeInBytes)); | 3912 __ sw(t3, MemOperand(a3, Register::kSizeInBytes)); |
3913 } | 3913 } |
3914 break; | 3914 break; |
3915 case JSObject::FAST_ELEMENTS: | 3915 case FAST_ELEMENTS: |
3916 case JSObject::FAST_DOUBLE_ELEMENTS: | 3916 case FAST_DOUBLE_ELEMENTS: |
3917 case JSObject::DICTIONARY_ELEMENTS: | 3917 case DICTIONARY_ELEMENTS: |
3918 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3918 case NON_STRICT_ARGUMENTS_ELEMENTS: |
3919 UNREACHABLE(); | 3919 UNREACHABLE(); |
3920 break; | 3920 break; |
3921 } | 3921 } |
3922 | 3922 |
3923 // Entry registers are intact, a0 holds the value which is the return value. | 3923 // Entry registers are intact, a0 holds the value which is the return value. |
3924 __ mov(v0, value); | 3924 __ mov(v0, value); |
3925 __ Ret(); | 3925 __ Ret(); |
3926 | 3926 |
3927 if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) { | 3927 if (elements_kind != EXTERNAL_PIXEL_ELEMENTS) { |
3928 // a3: external array. | 3928 // a3: external array. |
3929 // t0: index (integer). | 3929 // t0: index (integer). |
3930 __ bind(&check_heap_number); | 3930 __ bind(&check_heap_number); |
3931 __ GetObjectType(value, t1, t2); | 3931 __ GetObjectType(value, t1, t2); |
3932 __ Branch(&slow, ne, t2, Operand(HEAP_NUMBER_TYPE)); | 3932 __ Branch(&slow, ne, t2, Operand(HEAP_NUMBER_TYPE)); |
3933 | 3933 |
3934 __ lw(a3, FieldMemOperand(a3, ExternalArray::kExternalPointerOffset)); | 3934 __ lw(a3, FieldMemOperand(a3, ExternalArray::kExternalPointerOffset)); |
3935 | 3935 |
3936 // a3: base pointer of external storage. | 3936 // a3: base pointer of external storage. |
3937 // t0: key (integer). | 3937 // t0: key (integer). |
3938 | 3938 |
3939 // The WebGL specification leaves the behavior of storing NaN and | 3939 // The WebGL specification leaves the behavior of storing NaN and |
3940 // +/-Infinity into integer arrays basically undefined. For more | 3940 // +/-Infinity into integer arrays basically undefined. For more |
3941 // reproducible behavior, convert these to zero. | 3941 // reproducible behavior, convert these to zero. |
3942 | 3942 |
3943 if (CpuFeatures::IsSupported(FPU)) { | 3943 if (CpuFeatures::IsSupported(FPU)) { |
3944 CpuFeatures::Scope scope(FPU); | 3944 CpuFeatures::Scope scope(FPU); |
3945 | 3945 |
3946 __ ldc1(f0, FieldMemOperand(a0, HeapNumber::kValueOffset)); | 3946 __ ldc1(f0, FieldMemOperand(a0, HeapNumber::kValueOffset)); |
3947 | 3947 |
3948 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { | 3948 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
3949 __ cvt_s_d(f0, f0); | 3949 __ cvt_s_d(f0, f0); |
3950 __ sll(t8, t0, 2); | 3950 __ sll(t8, t0, 2); |
3951 __ addu(t8, a3, t8); | 3951 __ addu(t8, a3, t8); |
3952 __ swc1(f0, MemOperand(t8, 0)); | 3952 __ swc1(f0, MemOperand(t8, 0)); |
3953 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 3953 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
3954 __ sll(t8, t0, 3); | 3954 __ sll(t8, t0, 3); |
3955 __ addu(t8, a3, t8); | 3955 __ addu(t8, a3, t8); |
3956 __ sdc1(f0, MemOperand(t8, 0)); | 3956 __ sdc1(f0, MemOperand(t8, 0)); |
3957 } else { | 3957 } else { |
3958 __ EmitECMATruncate(t3, f0, f2, t2, t1, t5); | 3958 __ EmitECMATruncate(t3, f0, f2, t2, t1, t5); |
3959 | 3959 |
3960 switch (elements_kind) { | 3960 switch (elements_kind) { |
3961 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3961 case EXTERNAL_BYTE_ELEMENTS: |
3962 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3962 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
3963 __ addu(t8, a3, t0); | 3963 __ addu(t8, a3, t0); |
3964 __ sb(t3, MemOperand(t8, 0)); | 3964 __ sb(t3, MemOperand(t8, 0)); |
3965 break; | 3965 break; |
3966 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3966 case EXTERNAL_SHORT_ELEMENTS: |
3967 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3967 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
3968 __ sll(t8, t0, 1); | 3968 __ sll(t8, t0, 1); |
3969 __ addu(t8, a3, t8); | 3969 __ addu(t8, a3, t8); |
3970 __ sh(t3, MemOperand(t8, 0)); | 3970 __ sh(t3, MemOperand(t8, 0)); |
3971 break; | 3971 break; |
3972 case JSObject::EXTERNAL_INT_ELEMENTS: | 3972 case EXTERNAL_INT_ELEMENTS: |
3973 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3973 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
3974 __ sll(t8, t0, 2); | 3974 __ sll(t8, t0, 2); |
3975 __ addu(t8, a3, t8); | 3975 __ addu(t8, a3, t8); |
3976 __ sw(t3, MemOperand(t8, 0)); | 3976 __ sw(t3, MemOperand(t8, 0)); |
3977 break; | 3977 break; |
3978 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3978 case EXTERNAL_PIXEL_ELEMENTS: |
3979 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3979 case EXTERNAL_FLOAT_ELEMENTS: |
3980 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3980 case EXTERNAL_DOUBLE_ELEMENTS: |
3981 case JSObject::FAST_ELEMENTS: | 3981 case FAST_ELEMENTS: |
3982 case JSObject::FAST_DOUBLE_ELEMENTS: | 3982 case FAST_DOUBLE_ELEMENTS: |
3983 case JSObject::DICTIONARY_ELEMENTS: | 3983 case DICTIONARY_ELEMENTS: |
3984 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3984 case NON_STRICT_ARGUMENTS_ELEMENTS: |
3985 UNREACHABLE(); | 3985 UNREACHABLE(); |
3986 break; | 3986 break; |
3987 } | 3987 } |
3988 } | 3988 } |
3989 | 3989 |
3990 // Entry registers are intact, a0 holds the value | 3990 // Entry registers are intact, a0 holds the value |
3991 // which is the return value. | 3991 // which is the return value. |
3992 __ mov(v0, value); | 3992 __ mov(v0, value); |
3993 __ Ret(); | 3993 __ Ret(); |
3994 } else { | 3994 } else { |
3995 // FPU is not available, do manual conversions. | 3995 // FPU is not available, do manual conversions. |
3996 | 3996 |
3997 __ lw(t3, FieldMemOperand(value, HeapNumber::kExponentOffset)); | 3997 __ lw(t3, FieldMemOperand(value, HeapNumber::kExponentOffset)); |
3998 __ lw(t4, FieldMemOperand(value, HeapNumber::kMantissaOffset)); | 3998 __ lw(t4, FieldMemOperand(value, HeapNumber::kMantissaOffset)); |
3999 | 3999 |
4000 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { | 4000 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
4001 Label done, nan_or_infinity_or_zero; | 4001 Label done, nan_or_infinity_or_zero; |
4002 static const int kMantissaInHiWordShift = | 4002 static const int kMantissaInHiWordShift = |
4003 kBinary32MantissaBits - HeapNumber::kMantissaBitsInTopWord; | 4003 kBinary32MantissaBits - HeapNumber::kMantissaBitsInTopWord; |
4004 | 4004 |
4005 static const int kMantissaInLoWordShift = | 4005 static const int kMantissaInLoWordShift = |
4006 kBitsPerInt - kMantissaInHiWordShift; | 4006 kBitsPerInt - kMantissaInHiWordShift; |
4007 | 4007 |
4008 // Test for all special exponent values: zeros, subnormal numbers, NaNs | 4008 // Test for all special exponent values: zeros, subnormal numbers, NaNs |
4009 // and infinities. All these should be converted to 0. | 4009 // and infinities. All these should be converted to 0. |
4010 __ li(t5, HeapNumber::kExponentMask); | 4010 __ li(t5, HeapNumber::kExponentMask); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4055 | 4055 |
4056 __ bind(&nan_or_infinity_or_zero); | 4056 __ bind(&nan_or_infinity_or_zero); |
4057 __ And(t7, t3, Operand(HeapNumber::kSignMask)); | 4057 __ And(t7, t3, Operand(HeapNumber::kSignMask)); |
4058 __ And(t3, t3, Operand(HeapNumber::kMantissaMask)); | 4058 __ And(t3, t3, Operand(HeapNumber::kMantissaMask)); |
4059 __ or_(t6, t6, t7); | 4059 __ or_(t6, t6, t7); |
4060 __ sll(t3, t3, kMantissaInHiWordShift); | 4060 __ sll(t3, t3, kMantissaInHiWordShift); |
4061 __ or_(t6, t6, t3); | 4061 __ or_(t6, t6, t3); |
4062 __ srl(t4, t4, kMantissaInLoWordShift); | 4062 __ srl(t4, t4, kMantissaInLoWordShift); |
4063 __ or_(t3, t6, t4); | 4063 __ or_(t3, t6, t4); |
4064 __ Branch(&done); | 4064 __ Branch(&done); |
4065 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 4065 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
4066 __ sll(t8, t0, 3); | 4066 __ sll(t8, t0, 3); |
4067 __ addu(t8, a3, t8); | 4067 __ addu(t8, a3, t8); |
4068 // t8: effective address of destination element. | 4068 // t8: effective address of destination element. |
4069 __ sw(t4, MemOperand(t8, 0)); | 4069 __ sw(t4, MemOperand(t8, 0)); |
4070 __ sw(t3, MemOperand(t8, Register::kSizeInBytes)); | 4070 __ sw(t3, MemOperand(t8, Register::kSizeInBytes)); |
4071 __ Ret(); | 4071 __ Ret(); |
4072 } else { | 4072 } else { |
4073 bool is_signed_type = IsElementTypeSigned(elements_kind); | 4073 bool is_signed_type = IsElementTypeSigned(elements_kind); |
4074 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; | 4074 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; |
4075 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; | 4075 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4121 | 4121 |
4122 __ bind(&sign); | 4122 __ bind(&sign); |
4123 __ subu(t2, t3, zero_reg); | 4123 __ subu(t2, t3, zero_reg); |
4124 __ movz(t3, t2, t5); // Only if t5 is zero. | 4124 __ movz(t3, t2, t5); // Only if t5 is zero. |
4125 | 4125 |
4126 __ bind(&done); | 4126 __ bind(&done); |
4127 | 4127 |
4128 // Result is in t3. | 4128 // Result is in t3. |
4129 // This switch block should be exactly the same as above (FPU mode). | 4129 // This switch block should be exactly the same as above (FPU mode). |
4130 switch (elements_kind) { | 4130 switch (elements_kind) { |
4131 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 4131 case EXTERNAL_BYTE_ELEMENTS: |
4132 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 4132 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
4133 __ addu(t8, a3, t0); | 4133 __ addu(t8, a3, t0); |
4134 __ sb(t3, MemOperand(t8, 0)); | 4134 __ sb(t3, MemOperand(t8, 0)); |
4135 break; | 4135 break; |
4136 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 4136 case EXTERNAL_SHORT_ELEMENTS: |
4137 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 4137 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
4138 __ sll(t8, t0, 1); | 4138 __ sll(t8, t0, 1); |
4139 __ addu(t8, a3, t8); | 4139 __ addu(t8, a3, t8); |
4140 __ sh(t3, MemOperand(t8, 0)); | 4140 __ sh(t3, MemOperand(t8, 0)); |
4141 break; | 4141 break; |
4142 case JSObject::EXTERNAL_INT_ELEMENTS: | 4142 case EXTERNAL_INT_ELEMENTS: |
4143 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 4143 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
4144 __ sll(t8, t0, 2); | 4144 __ sll(t8, t0, 2); |
4145 __ addu(t8, a3, t8); | 4145 __ addu(t8, a3, t8); |
4146 __ sw(t3, MemOperand(t8, 0)); | 4146 __ sw(t3, MemOperand(t8, 0)); |
4147 break; | 4147 break; |
4148 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 4148 case EXTERNAL_PIXEL_ELEMENTS: |
4149 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 4149 case EXTERNAL_FLOAT_ELEMENTS: |
4150 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 4150 case EXTERNAL_DOUBLE_ELEMENTS: |
4151 case JSObject::FAST_ELEMENTS: | 4151 case FAST_ELEMENTS: |
4152 case JSObject::FAST_DOUBLE_ELEMENTS: | 4152 case FAST_DOUBLE_ELEMENTS: |
4153 case JSObject::DICTIONARY_ELEMENTS: | 4153 case DICTIONARY_ELEMENTS: |
4154 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 4154 case NON_STRICT_ARGUMENTS_ELEMENTS: |
4155 UNREACHABLE(); | 4155 UNREACHABLE(); |
4156 break; | 4156 break; |
4157 } | 4157 } |
4158 } | 4158 } |
4159 } | 4159 } |
4160 } | 4160 } |
4161 | 4161 |
4162 // Slow case, key and receiver still in a0 and a1. | 4162 // Slow case, key and receiver still in a0 and a1. |
4163 __ bind(&slow); | 4163 __ bind(&slow); |
4164 __ IncrementCounter( | 4164 __ IncrementCounter( |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4488 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); | 4488 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); |
4489 __ Jump(ic, RelocInfo::CODE_TARGET); | 4489 __ Jump(ic, RelocInfo::CODE_TARGET); |
4490 } | 4490 } |
4491 | 4491 |
4492 | 4492 |
4493 #undef __ | 4493 #undef __ |
4494 | 4494 |
4495 } } // namespace v8::internal | 4495 } } // namespace v8::internal |
4496 | 4496 |
4497 #endif // V8_TARGET_ARCH_MIPS | 4497 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |