| 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 |