| 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 // -- lr : return address | 3097 // -- lr : return address |
| 3098 // -- r0 : key | 3098 // -- r0 : key |
| 3099 // -- r1 : receiver | 3099 // -- r1 : 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(r1, | 3105 __ DispatchMap(r1, |
| 3106 r2, | 3106 r2, |
| 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3186 | 3186 |
| 3187 MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) { | 3187 MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) { |
| 3188 // ----------- S t a t e ------------- | 3188 // ----------- S t a t e ------------- |
| 3189 // -- r0 : value | 3189 // -- r0 : value |
| 3190 // -- r1 : key | 3190 // -- r1 : key |
| 3191 // -- r2 : receiver | 3191 // -- r2 : receiver |
| 3192 // -- lr : return address | 3192 // -- lr : return address |
| 3193 // -- r3 : scratch | 3193 // -- r3 : scratch |
| 3194 // ----------------------------------- | 3194 // ----------------------------------- |
| 3195 Code* stub; | 3195 Code* stub; |
| 3196 JSObject::ElementsKind elements_kind = receiver_map->elements_kind(); | 3196 ElementsKind elements_kind = receiver_map->elements_kind(); |
| 3197 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; | 3197 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
| 3198 MaybeObject* maybe_stub = | 3198 MaybeObject* maybe_stub = |
| 3199 KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode(); | 3199 KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode(); |
| 3200 if (!maybe_stub->To(&stub)) return maybe_stub; | 3200 if (!maybe_stub->To(&stub)) return maybe_stub; |
| 3201 __ DispatchMap(r2, | 3201 __ DispatchMap(r2, |
| 3202 r3, | 3202 r3, |
| 3203 Handle<Map>(receiver_map), | 3203 Handle<Map>(receiver_map), |
| 3204 Handle<Code>(stub), | 3204 Handle<Code>(stub), |
| 3205 DO_SMI_CHECK); | 3205 DO_SMI_CHECK); |
| 3206 | 3206 |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3431 // -- r0 : key | 3431 // -- r0 : key |
| 3432 // -- r1 : receiver | 3432 // -- r1 : receiver |
| 3433 // ----------------------------------- | 3433 // ----------------------------------- |
| 3434 | 3434 |
| 3435 Handle<Code> miss_ic = | 3435 Handle<Code> miss_ic = |
| 3436 masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric(); | 3436 masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric(); |
| 3437 __ Jump(miss_ic, RelocInfo::CODE_TARGET); | 3437 __ Jump(miss_ic, RelocInfo::CODE_TARGET); |
| 3438 } | 3438 } |
| 3439 | 3439 |
| 3440 | 3440 |
| 3441 static bool IsElementTypeSigned(JSObject::ElementsKind elements_kind) { | 3441 static bool IsElementTypeSigned(ElementsKind elements_kind) { |
| 3442 switch (elements_kind) { | 3442 switch (elements_kind) { |
| 3443 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3443 case EXTERNAL_BYTE_ELEMENTS: |
| 3444 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3444 case EXTERNAL_SHORT_ELEMENTS: |
| 3445 case JSObject::EXTERNAL_INT_ELEMENTS: | 3445 case EXTERNAL_INT_ELEMENTS: |
| 3446 return true; | 3446 return true; |
| 3447 | 3447 |
| 3448 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3448 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| 3449 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3449 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 3450 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3450 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 3451 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3451 case EXTERNAL_PIXEL_ELEMENTS: |
| 3452 return false; | 3452 return false; |
| 3453 | 3453 |
| 3454 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3454 case EXTERNAL_FLOAT_ELEMENTS: |
| 3455 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3455 case EXTERNAL_DOUBLE_ELEMENTS: |
| 3456 case JSObject::FAST_ELEMENTS: | 3456 case FAST_ELEMENTS: |
| 3457 case JSObject::FAST_DOUBLE_ELEMENTS: | 3457 case FAST_DOUBLE_ELEMENTS: |
| 3458 case JSObject::DICTIONARY_ELEMENTS: | 3458 case DICTIONARY_ELEMENTS: |
| 3459 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3459 case NON_STRICT_ARGUMENTS_ELEMENTS: |
| 3460 UNREACHABLE(); | 3460 UNREACHABLE(); |
| 3461 return false; | 3461 return false; |
| 3462 } | 3462 } |
| 3463 return false; | 3463 return false; |
| 3464 } | 3464 } |
| 3465 | 3465 |
| 3466 | 3466 |
| 3467 void KeyedLoadStubCompiler::GenerateLoadExternalArray( | 3467 void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| 3468 MacroAssembler* masm, | 3468 MacroAssembler* masm, |
| 3469 JSObject::ElementsKind elements_kind) { | 3469 ElementsKind elements_kind) { |
| 3470 // ---------- S t a t e -------------- | 3470 // ---------- S t a t e -------------- |
| 3471 // -- lr : return address | 3471 // -- lr : return address |
| 3472 // -- r0 : key | 3472 // -- r0 : key |
| 3473 // -- r1 : receiver | 3473 // -- r1 : receiver |
| 3474 // ----------------------------------- | 3474 // ----------------------------------- |
| 3475 Label miss_force_generic, slow, failed_allocation; | 3475 Label miss_force_generic, slow, failed_allocation; |
| 3476 | 3476 |
| 3477 Register key = r0; | 3477 Register key = r0; |
| 3478 Register receiver = r1; | 3478 Register receiver = r1; |
| 3479 | 3479 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3494 | 3494 |
| 3495 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); | 3495 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); |
| 3496 // r3: base pointer of external storage | 3496 // r3: base pointer of external storage |
| 3497 | 3497 |
| 3498 // We are not untagging smi key and instead work with it | 3498 // We are not untagging smi key and instead work with it |
| 3499 // as if it was premultiplied by 2. | 3499 // as if it was premultiplied by 2. |
| 3500 STATIC_ASSERT((kSmiTag == 0) && (kSmiTagSize == 1)); | 3500 STATIC_ASSERT((kSmiTag == 0) && (kSmiTagSize == 1)); |
| 3501 | 3501 |
| 3502 Register value = r2; | 3502 Register value = r2; |
| 3503 switch (elements_kind) { | 3503 switch (elements_kind) { |
| 3504 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3504 case EXTERNAL_BYTE_ELEMENTS: |
| 3505 __ ldrsb(value, MemOperand(r3, key, LSR, 1)); | 3505 __ ldrsb(value, MemOperand(r3, key, LSR, 1)); |
| 3506 break; | 3506 break; |
| 3507 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3507 case EXTERNAL_PIXEL_ELEMENTS: |
| 3508 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3508 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| 3509 __ ldrb(value, MemOperand(r3, key, LSR, 1)); | 3509 __ ldrb(value, MemOperand(r3, key, LSR, 1)); |
| 3510 break; | 3510 break; |
| 3511 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3511 case EXTERNAL_SHORT_ELEMENTS: |
| 3512 __ ldrsh(value, MemOperand(r3, key, LSL, 0)); | 3512 __ ldrsh(value, MemOperand(r3, key, LSL, 0)); |
| 3513 break; | 3513 break; |
| 3514 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3514 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 3515 __ ldrh(value, MemOperand(r3, key, LSL, 0)); | 3515 __ ldrh(value, MemOperand(r3, key, LSL, 0)); |
| 3516 break; | 3516 break; |
| 3517 case JSObject::EXTERNAL_INT_ELEMENTS: | 3517 case EXTERNAL_INT_ELEMENTS: |
| 3518 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3518 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 3519 __ ldr(value, MemOperand(r3, key, LSL, 1)); | 3519 __ ldr(value, MemOperand(r3, key, LSL, 1)); |
| 3520 break; | 3520 break; |
| 3521 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3521 case EXTERNAL_FLOAT_ELEMENTS: |
| 3522 if (CpuFeatures::IsSupported(VFP3)) { | 3522 if (CpuFeatures::IsSupported(VFP3)) { |
| 3523 CpuFeatures::Scope scope(VFP3); | 3523 CpuFeatures::Scope scope(VFP3); |
| 3524 __ add(r2, r3, Operand(key, LSL, 1)); | 3524 __ add(r2, r3, Operand(key, LSL, 1)); |
| 3525 __ vldr(s0, r2, 0); | 3525 __ vldr(s0, r2, 0); |
| 3526 } else { | 3526 } else { |
| 3527 __ ldr(value, MemOperand(r3, key, LSL, 1)); | 3527 __ ldr(value, MemOperand(r3, key, LSL, 1)); |
| 3528 } | 3528 } |
| 3529 break; | 3529 break; |
| 3530 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3530 case EXTERNAL_DOUBLE_ELEMENTS: |
| 3531 if (CpuFeatures::IsSupported(VFP3)) { | 3531 if (CpuFeatures::IsSupported(VFP3)) { |
| 3532 CpuFeatures::Scope scope(VFP3); | 3532 CpuFeatures::Scope scope(VFP3); |
| 3533 __ add(r2, r3, Operand(key, LSL, 2)); | 3533 __ add(r2, r3, Operand(key, LSL, 2)); |
| 3534 __ vldr(d0, r2, 0); | 3534 __ vldr(d0, r2, 0); |
| 3535 } else { | 3535 } else { |
| 3536 __ add(r4, r3, Operand(key, LSL, 2)); | 3536 __ add(r4, r3, Operand(key, LSL, 2)); |
| 3537 // r4: pointer to the beginning of the double we want to load. | 3537 // r4: pointer to the beginning of the double we want to load. |
| 3538 __ ldr(r2, MemOperand(r4, 0)); | 3538 __ ldr(r2, MemOperand(r4, 0)); |
| 3539 __ ldr(r3, MemOperand(r4, Register::kSizeInBytes)); | 3539 __ ldr(r3, MemOperand(r4, Register::kSizeInBytes)); |
| 3540 } | 3540 } |
| 3541 break; | 3541 break; |
| 3542 case JSObject::FAST_ELEMENTS: | 3542 case FAST_ELEMENTS: |
| 3543 case JSObject::FAST_DOUBLE_ELEMENTS: | 3543 case FAST_DOUBLE_ELEMENTS: |
| 3544 case JSObject::DICTIONARY_ELEMENTS: | 3544 case DICTIONARY_ELEMENTS: |
| 3545 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3545 case NON_STRICT_ARGUMENTS_ELEMENTS: |
| 3546 UNREACHABLE(); | 3546 UNREACHABLE(); |
| 3547 break; | 3547 break; |
| 3548 } | 3548 } |
| 3549 | 3549 |
| 3550 // For integer array types: | 3550 // For integer array types: |
| 3551 // r2: value | 3551 // r2: value |
| 3552 // For float array type: | 3552 // For float array type: |
| 3553 // s0: value (if VFP3 is supported) | 3553 // s0: value (if VFP3 is supported) |
| 3554 // r2: value (if VFP3 is not supported) | 3554 // r2: value (if VFP3 is not supported) |
| 3555 // For double array type: | 3555 // For double array type: |
| 3556 // d0: value (if VFP3 is supported) | 3556 // d0: value (if VFP3 is supported) |
| 3557 // r2/r3: value (if VFP3 is not supported) | 3557 // r2/r3: value (if VFP3 is not supported) |
| 3558 | 3558 |
| 3559 if (elements_kind == JSObject::EXTERNAL_INT_ELEMENTS) { | 3559 if (elements_kind == EXTERNAL_INT_ELEMENTS) { |
| 3560 // For the Int and UnsignedInt array types, we need to see whether | 3560 // For the Int and UnsignedInt array types, we need to see whether |
| 3561 // the value can be represented in a Smi. If not, we need to convert | 3561 // the value can be represented in a Smi. If not, we need to convert |
| 3562 // it to a HeapNumber. | 3562 // it to a HeapNumber. |
| 3563 Label box_int; | 3563 Label box_int; |
| 3564 __ cmp(value, Operand(0xC0000000)); | 3564 __ cmp(value, Operand(0xC0000000)); |
| 3565 __ b(mi, &box_int); | 3565 __ b(mi, &box_int); |
| 3566 // Tag integer as smi and return it. | 3566 // Tag integer as smi and return it. |
| 3567 __ mov(r0, Operand(value, LSL, kSmiTagSize)); | 3567 __ mov(r0, Operand(value, LSL, kSmiTagSize)); |
| 3568 __ Ret(); | 3568 __ Ret(); |
| 3569 | 3569 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 3593 dest, | 3593 dest, |
| 3594 d0, | 3594 d0, |
| 3595 dst1, | 3595 dst1, |
| 3596 dst2, | 3596 dst2, |
| 3597 r9, | 3597 r9, |
| 3598 s0); | 3598 s0); |
| 3599 __ str(dst1, FieldMemOperand(r0, HeapNumber::kMantissaOffset)); | 3599 __ str(dst1, FieldMemOperand(r0, HeapNumber::kMantissaOffset)); |
| 3600 __ str(dst2, FieldMemOperand(r0, HeapNumber::kExponentOffset)); | 3600 __ str(dst2, FieldMemOperand(r0, HeapNumber::kExponentOffset)); |
| 3601 __ Ret(); | 3601 __ Ret(); |
| 3602 } | 3602 } |
| 3603 } else if (elements_kind == JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) { | 3603 } else if (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
| 3604 // The test is different for unsigned int values. Since we need | 3604 // The test is different for unsigned int values. Since we need |
| 3605 // the value to be in the range of a positive smi, we can't | 3605 // the value to be in the range of a positive smi, we can't |
| 3606 // handle either of the top two bits being set in the value. | 3606 // handle either of the top two bits being set in the value. |
| 3607 if (CpuFeatures::IsSupported(VFP3)) { | 3607 if (CpuFeatures::IsSupported(VFP3)) { |
| 3608 CpuFeatures::Scope scope(VFP3); | 3608 CpuFeatures::Scope scope(VFP3); |
| 3609 Label box_int, done; | 3609 Label box_int, done; |
| 3610 __ tst(value, Operand(0xC0000000)); | 3610 __ tst(value, Operand(0xC0000000)); |
| 3611 __ b(ne, &box_int); | 3611 __ b(ne, &box_int); |
| 3612 // Tag integer as smi and return it. | 3612 // Tag integer as smi and return it. |
| 3613 __ mov(r0, Operand(value, LSL, kSmiTagSize)); | 3613 __ mov(r0, Operand(value, LSL, kSmiTagSize)); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3658 // space. | 3658 // space. |
| 3659 __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex); | 3659 __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex); |
| 3660 __ AllocateHeapNumber(r4, r5, r7, r6, &slow); | 3660 __ AllocateHeapNumber(r4, r5, r7, r6, &slow); |
| 3661 | 3661 |
| 3662 __ str(hiword, FieldMemOperand(r4, HeapNumber::kExponentOffset)); | 3662 __ str(hiword, FieldMemOperand(r4, HeapNumber::kExponentOffset)); |
| 3663 __ str(loword, FieldMemOperand(r4, HeapNumber::kMantissaOffset)); | 3663 __ str(loword, FieldMemOperand(r4, HeapNumber::kMantissaOffset)); |
| 3664 | 3664 |
| 3665 __ mov(r0, r4); | 3665 __ mov(r0, r4); |
| 3666 __ Ret(); | 3666 __ Ret(); |
| 3667 } | 3667 } |
| 3668 } else if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { | 3668 } else if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
| 3669 // For the floating-point array type, we need to always allocate a | 3669 // For the floating-point array type, we need to always allocate a |
| 3670 // HeapNumber. | 3670 // HeapNumber. |
| 3671 if (CpuFeatures::IsSupported(VFP3)) { | 3671 if (CpuFeatures::IsSupported(VFP3)) { |
| 3672 CpuFeatures::Scope scope(VFP3); | 3672 CpuFeatures::Scope scope(VFP3); |
| 3673 // Allocate a HeapNumber for the result. Don't use r0 and r1 as | 3673 // Allocate a HeapNumber for the result. Don't use r0 and r1 as |
| 3674 // AllocateHeapNumber clobbers all registers - also when jumping due to | 3674 // AllocateHeapNumber clobbers all registers - also when jumping due to |
| 3675 // exhausted young space. | 3675 // exhausted young space. |
| 3676 __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex); | 3676 __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex); |
| 3677 __ AllocateHeapNumber(r2, r3, r4, r6, &slow); | 3677 __ AllocateHeapNumber(r2, r3, r4, r6, &slow); |
| 3678 __ vcvt_f64_f32(d0, s0); | 3678 __ vcvt_f64_f32(d0, s0); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3728 | 3728 |
| 3729 __ orr(r2, r2, Operand(r0, LSR, kMantissaShiftForHiWord)); | 3729 __ orr(r2, r2, Operand(r0, LSR, kMantissaShiftForHiWord)); |
| 3730 __ mov(r0, Operand(r0, LSL, kMantissaShiftForLoWord)); | 3730 __ mov(r0, Operand(r0, LSL, kMantissaShiftForLoWord)); |
| 3731 | 3731 |
| 3732 __ str(r2, FieldMemOperand(r3, HeapNumber::kExponentOffset)); | 3732 __ str(r2, FieldMemOperand(r3, HeapNumber::kExponentOffset)); |
| 3733 __ str(r0, FieldMemOperand(r3, HeapNumber::kMantissaOffset)); | 3733 __ str(r0, FieldMemOperand(r3, HeapNumber::kMantissaOffset)); |
| 3734 | 3734 |
| 3735 __ mov(r0, r3); | 3735 __ mov(r0, r3); |
| 3736 __ Ret(); | 3736 __ Ret(); |
| 3737 } | 3737 } |
| 3738 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 3738 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
| 3739 if (CpuFeatures::IsSupported(VFP3)) { | 3739 if (CpuFeatures::IsSupported(VFP3)) { |
| 3740 CpuFeatures::Scope scope(VFP3); | 3740 CpuFeatures::Scope scope(VFP3); |
| 3741 // Allocate a HeapNumber for the result. Don't use r0 and r1 as | 3741 // Allocate a HeapNumber for the result. Don't use r0 and r1 as |
| 3742 // AllocateHeapNumber clobbers all registers - also when jumping due to | 3742 // AllocateHeapNumber clobbers all registers - also when jumping due to |
| 3743 // exhausted young space. | 3743 // exhausted young space. |
| 3744 __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex); | 3744 __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex); |
| 3745 __ AllocateHeapNumber(r2, r3, r4, r6, &slow); | 3745 __ AllocateHeapNumber(r2, r3, r4, r6, &slow); |
| 3746 __ sub(r1, r2, Operand(kHeapObjectTag)); | 3746 __ sub(r1, r2, Operand(kHeapObjectTag)); |
| 3747 __ vstr(d0, r1, HeapNumber::kValueOffset); | 3747 __ vstr(d0, r1, HeapNumber::kValueOffset); |
| 3748 | 3748 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3785 | 3785 |
| 3786 __ bind(&miss_force_generic); | 3786 __ bind(&miss_force_generic); |
| 3787 Code* stub = masm->isolate()->builtins()->builtin( | 3787 Code* stub = masm->isolate()->builtins()->builtin( |
| 3788 Builtins::kKeyedLoadIC_MissForceGeneric); | 3788 Builtins::kKeyedLoadIC_MissForceGeneric); |
| 3789 __ Jump(Handle<Code>(stub), RelocInfo::CODE_TARGET); | 3789 __ Jump(Handle<Code>(stub), RelocInfo::CODE_TARGET); |
| 3790 } | 3790 } |
| 3791 | 3791 |
| 3792 | 3792 |
| 3793 void KeyedStoreStubCompiler::GenerateStoreExternalArray( | 3793 void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| 3794 MacroAssembler* masm, | 3794 MacroAssembler* masm, |
| 3795 JSObject::ElementsKind elements_kind) { | 3795 ElementsKind elements_kind) { |
| 3796 // ---------- S t a t e -------------- | 3796 // ---------- S t a t e -------------- |
| 3797 // -- r0 : value | 3797 // -- r0 : value |
| 3798 // -- r1 : key | 3798 // -- r1 : key |
| 3799 // -- r2 : receiver | 3799 // -- r2 : receiver |
| 3800 // -- lr : return address | 3800 // -- lr : return address |
| 3801 // ----------------------------------- | 3801 // ----------------------------------- |
| 3802 Label slow, check_heap_number, miss_force_generic; | 3802 Label slow, check_heap_number, miss_force_generic; |
| 3803 | 3803 |
| 3804 // Register usage. | 3804 // Register usage. |
| 3805 Register value = r0; | 3805 Register value = r0; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3817 | 3817 |
| 3818 // Check that the index is in range | 3818 // Check that the index is in range |
| 3819 __ ldr(ip, FieldMemOperand(r3, ExternalArray::kLengthOffset)); | 3819 __ ldr(ip, FieldMemOperand(r3, ExternalArray::kLengthOffset)); |
| 3820 __ cmp(key, ip); | 3820 __ cmp(key, ip); |
| 3821 // Unsigned comparison catches both negative and too-large values. | 3821 // Unsigned comparison catches both negative and too-large values. |
| 3822 __ b(hs, &miss_force_generic); | 3822 __ b(hs, &miss_force_generic); |
| 3823 | 3823 |
| 3824 // Handle both smis and HeapNumbers in the fast path. Go to the | 3824 // Handle both smis and HeapNumbers in the fast path. Go to the |
| 3825 // runtime for all other kinds of values. | 3825 // runtime for all other kinds of values. |
| 3826 // r3: external array. | 3826 // r3: external array. |
| 3827 if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) { | 3827 if (elements_kind == EXTERNAL_PIXEL_ELEMENTS) { |
| 3828 // Double to pixel conversion is only implemented in the runtime for now. | 3828 // Double to pixel conversion is only implemented in the runtime for now. |
| 3829 __ JumpIfNotSmi(value, &slow); | 3829 __ JumpIfNotSmi(value, &slow); |
| 3830 } else { | 3830 } else { |
| 3831 __ JumpIfNotSmi(value, &check_heap_number); | 3831 __ JumpIfNotSmi(value, &check_heap_number); |
| 3832 } | 3832 } |
| 3833 __ SmiUntag(r5, value); | 3833 __ SmiUntag(r5, value); |
| 3834 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); | 3834 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); |
| 3835 | 3835 |
| 3836 // r3: base pointer of external storage. | 3836 // r3: base pointer of external storage. |
| 3837 // r5: value (integer). | 3837 // r5: value (integer). |
| 3838 switch (elements_kind) { | 3838 switch (elements_kind) { |
| 3839 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3839 case EXTERNAL_PIXEL_ELEMENTS: |
| 3840 // Clamp the value to [0..255]. | 3840 // Clamp the value to [0..255]. |
| 3841 __ Usat(r5, 8, Operand(r5)); | 3841 __ Usat(r5, 8, Operand(r5)); |
| 3842 __ strb(r5, MemOperand(r3, key, LSR, 1)); | 3842 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
| 3843 break; | 3843 break; |
| 3844 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3844 case EXTERNAL_BYTE_ELEMENTS: |
| 3845 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3845 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| 3846 __ strb(r5, MemOperand(r3, key, LSR, 1)); | 3846 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
| 3847 break; | 3847 break; |
| 3848 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3848 case EXTERNAL_SHORT_ELEMENTS: |
| 3849 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3849 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 3850 __ strh(r5, MemOperand(r3, key, LSL, 0)); | 3850 __ strh(r5, MemOperand(r3, key, LSL, 0)); |
| 3851 break; | 3851 break; |
| 3852 case JSObject::EXTERNAL_INT_ELEMENTS: | 3852 case EXTERNAL_INT_ELEMENTS: |
| 3853 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3853 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 3854 __ str(r5, MemOperand(r3, key, LSL, 1)); | 3854 __ str(r5, MemOperand(r3, key, LSL, 1)); |
| 3855 break; | 3855 break; |
| 3856 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3856 case EXTERNAL_FLOAT_ELEMENTS: |
| 3857 // Perform int-to-float conversion and store to memory. | 3857 // Perform int-to-float conversion and store to memory. |
| 3858 __ SmiUntag(r4, key); | 3858 __ SmiUntag(r4, key); |
| 3859 StoreIntAsFloat(masm, r3, r4, r5, r6, r7, r9); | 3859 StoreIntAsFloat(masm, r3, r4, r5, r6, r7, r9); |
| 3860 break; | 3860 break; |
| 3861 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3861 case EXTERNAL_DOUBLE_ELEMENTS: |
| 3862 __ add(r3, r3, Operand(key, LSL, 2)); | 3862 __ add(r3, r3, Operand(key, LSL, 2)); |
| 3863 // r3: effective address of the double element | 3863 // r3: effective address of the double element |
| 3864 FloatingPointHelper::Destination destination; | 3864 FloatingPointHelper::Destination destination; |
| 3865 if (CpuFeatures::IsSupported(VFP3)) { | 3865 if (CpuFeatures::IsSupported(VFP3)) { |
| 3866 destination = FloatingPointHelper::kVFPRegisters; | 3866 destination = FloatingPointHelper::kVFPRegisters; |
| 3867 } else { | 3867 } else { |
| 3868 destination = FloatingPointHelper::kCoreRegisters; | 3868 destination = FloatingPointHelper::kCoreRegisters; |
| 3869 } | 3869 } |
| 3870 FloatingPointHelper::ConvertIntToDouble( | 3870 FloatingPointHelper::ConvertIntToDouble( |
| 3871 masm, r5, destination, | 3871 masm, r5, destination, |
| 3872 d0, r6, r7, // These are: double_dst, dst1, dst2. | 3872 d0, r6, r7, // These are: double_dst, dst1, dst2. |
| 3873 r4, s2); // These are: scratch2, single_scratch. | 3873 r4, s2); // These are: scratch2, single_scratch. |
| 3874 if (destination == FloatingPointHelper::kVFPRegisters) { | 3874 if (destination == FloatingPointHelper::kVFPRegisters) { |
| 3875 CpuFeatures::Scope scope(VFP3); | 3875 CpuFeatures::Scope scope(VFP3); |
| 3876 __ vstr(d0, r3, 0); | 3876 __ vstr(d0, r3, 0); |
| 3877 } else { | 3877 } else { |
| 3878 __ str(r6, MemOperand(r3, 0)); | 3878 __ str(r6, MemOperand(r3, 0)); |
| 3879 __ str(r7, MemOperand(r3, Register::kSizeInBytes)); | 3879 __ str(r7, MemOperand(r3, Register::kSizeInBytes)); |
| 3880 } | 3880 } |
| 3881 break; | 3881 break; |
| 3882 case JSObject::FAST_ELEMENTS: | 3882 case FAST_ELEMENTS: |
| 3883 case JSObject::FAST_DOUBLE_ELEMENTS: | 3883 case FAST_DOUBLE_ELEMENTS: |
| 3884 case JSObject::DICTIONARY_ELEMENTS: | 3884 case DICTIONARY_ELEMENTS: |
| 3885 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3885 case NON_STRICT_ARGUMENTS_ELEMENTS: |
| 3886 UNREACHABLE(); | 3886 UNREACHABLE(); |
| 3887 break; | 3887 break; |
| 3888 } | 3888 } |
| 3889 | 3889 |
| 3890 // Entry registers are intact, r0 holds the value which is the return value. | 3890 // Entry registers are intact, r0 holds the value which is the return value. |
| 3891 __ Ret(); | 3891 __ Ret(); |
| 3892 | 3892 |
| 3893 if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) { | 3893 if (elements_kind != EXTERNAL_PIXEL_ELEMENTS) { |
| 3894 // r3: external array. | 3894 // r3: external array. |
| 3895 __ bind(&check_heap_number); | 3895 __ bind(&check_heap_number); |
| 3896 __ CompareObjectType(value, r5, r6, HEAP_NUMBER_TYPE); | 3896 __ CompareObjectType(value, r5, r6, HEAP_NUMBER_TYPE); |
| 3897 __ b(ne, &slow); | 3897 __ b(ne, &slow); |
| 3898 | 3898 |
| 3899 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); | 3899 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); |
| 3900 | 3900 |
| 3901 // r3: base pointer of external storage. | 3901 // r3: base pointer of external storage. |
| 3902 | 3902 |
| 3903 // The WebGL specification leaves the behavior of storing NaN and | 3903 // The WebGL specification leaves the behavior of storing NaN and |
| 3904 // +/-Infinity into integer arrays basically undefined. For more | 3904 // +/-Infinity into integer arrays basically undefined. For more |
| 3905 // reproducible behavior, convert these to zero. | 3905 // reproducible behavior, convert these to zero. |
| 3906 if (CpuFeatures::IsSupported(VFP3)) { | 3906 if (CpuFeatures::IsSupported(VFP3)) { |
| 3907 CpuFeatures::Scope scope(VFP3); | 3907 CpuFeatures::Scope scope(VFP3); |
| 3908 | 3908 |
| 3909 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { | 3909 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
| 3910 // vldr requires offset to be a multiple of 4 so we can not | 3910 // vldr requires offset to be a multiple of 4 so we can not |
| 3911 // include -kHeapObjectTag into it. | 3911 // include -kHeapObjectTag into it. |
| 3912 __ sub(r5, r0, Operand(kHeapObjectTag)); | 3912 __ sub(r5, r0, Operand(kHeapObjectTag)); |
| 3913 __ vldr(d0, r5, HeapNumber::kValueOffset); | 3913 __ vldr(d0, r5, HeapNumber::kValueOffset); |
| 3914 __ add(r5, r3, Operand(key, LSL, 1)); | 3914 __ add(r5, r3, Operand(key, LSL, 1)); |
| 3915 __ vcvt_f32_f64(s0, d0); | 3915 __ vcvt_f32_f64(s0, d0); |
| 3916 __ vstr(s0, r5, 0); | 3916 __ vstr(s0, r5, 0); |
| 3917 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 3917 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
| 3918 __ sub(r5, r0, Operand(kHeapObjectTag)); | 3918 __ sub(r5, r0, Operand(kHeapObjectTag)); |
| 3919 __ vldr(d0, r5, HeapNumber::kValueOffset); | 3919 __ vldr(d0, r5, HeapNumber::kValueOffset); |
| 3920 __ add(r5, r3, Operand(key, LSL, 2)); | 3920 __ add(r5, r3, Operand(key, LSL, 2)); |
| 3921 __ vstr(d0, r5, 0); | 3921 __ vstr(d0, r5, 0); |
| 3922 } else { | 3922 } else { |
| 3923 // Hoisted load. vldr requires offset to be a multiple of 4 so we can | 3923 // Hoisted load. vldr requires offset to be a multiple of 4 so we can |
| 3924 // not include -kHeapObjectTag into it. | 3924 // not include -kHeapObjectTag into it. |
| 3925 __ sub(r5, value, Operand(kHeapObjectTag)); | 3925 __ sub(r5, value, Operand(kHeapObjectTag)); |
| 3926 __ vldr(d0, r5, HeapNumber::kValueOffset); | 3926 __ vldr(d0, r5, HeapNumber::kValueOffset); |
| 3927 __ EmitECMATruncate(r5, d0, s2, r6, r7, r9); | 3927 __ EmitECMATruncate(r5, d0, s2, r6, r7, r9); |
| 3928 | 3928 |
| 3929 switch (elements_kind) { | 3929 switch (elements_kind) { |
| 3930 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3930 case EXTERNAL_BYTE_ELEMENTS: |
| 3931 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3931 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| 3932 __ strb(r5, MemOperand(r3, key, LSR, 1)); | 3932 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
| 3933 break; | 3933 break; |
| 3934 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3934 case EXTERNAL_SHORT_ELEMENTS: |
| 3935 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3935 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 3936 __ strh(r5, MemOperand(r3, key, LSL, 0)); | 3936 __ strh(r5, MemOperand(r3, key, LSL, 0)); |
| 3937 break; | 3937 break; |
| 3938 case JSObject::EXTERNAL_INT_ELEMENTS: | 3938 case EXTERNAL_INT_ELEMENTS: |
| 3939 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3939 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 3940 __ str(r5, MemOperand(r3, key, LSL, 1)); | 3940 __ str(r5, MemOperand(r3, key, LSL, 1)); |
| 3941 break; | 3941 break; |
| 3942 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3942 case EXTERNAL_PIXEL_ELEMENTS: |
| 3943 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3943 case EXTERNAL_FLOAT_ELEMENTS: |
| 3944 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3944 case EXTERNAL_DOUBLE_ELEMENTS: |
| 3945 case JSObject::FAST_ELEMENTS: | 3945 case FAST_ELEMENTS: |
| 3946 case JSObject::FAST_DOUBLE_ELEMENTS: | 3946 case FAST_DOUBLE_ELEMENTS: |
| 3947 case JSObject::DICTIONARY_ELEMENTS: | 3947 case DICTIONARY_ELEMENTS: |
| 3948 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3948 case NON_STRICT_ARGUMENTS_ELEMENTS: |
| 3949 UNREACHABLE(); | 3949 UNREACHABLE(); |
| 3950 break; | 3950 break; |
| 3951 } | 3951 } |
| 3952 } | 3952 } |
| 3953 | 3953 |
| 3954 // Entry registers are intact, r0 holds the value which is the return | 3954 // Entry registers are intact, r0 holds the value which is the return |
| 3955 // value. | 3955 // value. |
| 3956 __ Ret(); | 3956 __ Ret(); |
| 3957 } else { | 3957 } else { |
| 3958 // VFP3 is not available do manual conversions. | 3958 // VFP3 is not available do manual conversions. |
| 3959 __ ldr(r5, FieldMemOperand(value, HeapNumber::kExponentOffset)); | 3959 __ ldr(r5, FieldMemOperand(value, HeapNumber::kExponentOffset)); |
| 3960 __ ldr(r6, FieldMemOperand(value, HeapNumber::kMantissaOffset)); | 3960 __ ldr(r6, FieldMemOperand(value, HeapNumber::kMantissaOffset)); |
| 3961 | 3961 |
| 3962 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { | 3962 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
| 3963 Label done, nan_or_infinity_or_zero; | 3963 Label done, nan_or_infinity_or_zero; |
| 3964 static const int kMantissaInHiWordShift = | 3964 static const int kMantissaInHiWordShift = |
| 3965 kBinary32MantissaBits - HeapNumber::kMantissaBitsInTopWord; | 3965 kBinary32MantissaBits - HeapNumber::kMantissaBitsInTopWord; |
| 3966 | 3966 |
| 3967 static const int kMantissaInLoWordShift = | 3967 static const int kMantissaInLoWordShift = |
| 3968 kBitsPerInt - kMantissaInHiWordShift; | 3968 kBitsPerInt - kMantissaInHiWordShift; |
| 3969 | 3969 |
| 3970 // Test for all special exponent values: zeros, subnormal numbers, NaNs | 3970 // Test for all special exponent values: zeros, subnormal numbers, NaNs |
| 3971 // and infinities. All these should be converted to 0. | 3971 // and infinities. All these should be converted to 0. |
| 3972 __ mov(r7, Operand(HeapNumber::kExponentMask)); | 3972 __ mov(r7, Operand(HeapNumber::kExponentMask)); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4004 // value. | 4004 // value. |
| 4005 __ Ret(); | 4005 __ Ret(); |
| 4006 | 4006 |
| 4007 __ bind(&nan_or_infinity_or_zero); | 4007 __ bind(&nan_or_infinity_or_zero); |
| 4008 __ and_(r7, r5, Operand(HeapNumber::kSignMask)); | 4008 __ and_(r7, r5, Operand(HeapNumber::kSignMask)); |
| 4009 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); | 4009 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); |
| 4010 __ orr(r9, r9, r7); | 4010 __ orr(r9, r9, r7); |
| 4011 __ orr(r9, r9, Operand(r5, LSL, kMantissaInHiWordShift)); | 4011 __ orr(r9, r9, Operand(r5, LSL, kMantissaInHiWordShift)); |
| 4012 __ orr(r5, r9, Operand(r6, LSR, kMantissaInLoWordShift)); | 4012 __ orr(r5, r9, Operand(r6, LSR, kMantissaInLoWordShift)); |
| 4013 __ b(&done); | 4013 __ b(&done); |
| 4014 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 4014 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
| 4015 __ add(r7, r3, Operand(key, LSL, 2)); | 4015 __ add(r7, r3, Operand(key, LSL, 2)); |
| 4016 // r7: effective address of destination element. | 4016 // r7: effective address of destination element. |
| 4017 __ str(r6, MemOperand(r7, 0)); | 4017 __ str(r6, MemOperand(r7, 0)); |
| 4018 __ str(r5, MemOperand(r7, Register::kSizeInBytes)); | 4018 __ str(r5, MemOperand(r7, Register::kSizeInBytes)); |
| 4019 __ Ret(); | 4019 __ Ret(); |
| 4020 } else { | 4020 } else { |
| 4021 bool is_signed_type = IsElementTypeSigned(elements_kind); | 4021 bool is_signed_type = IsElementTypeSigned(elements_kind); |
| 4022 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; | 4022 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; |
| 4023 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; | 4023 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; |
| 4024 | 4024 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4059 __ mov(r5, Operand(r5, LSL, r9)); | 4059 __ mov(r5, Operand(r5, LSL, r9)); |
| 4060 __ rsb(r9, r9, Operand(meaningfull_bits)); | 4060 __ rsb(r9, r9, Operand(meaningfull_bits)); |
| 4061 __ orr(r5, r5, Operand(r6, LSR, r9)); | 4061 __ orr(r5, r5, Operand(r6, LSR, r9)); |
| 4062 | 4062 |
| 4063 __ bind(&sign); | 4063 __ bind(&sign); |
| 4064 __ teq(r7, Operand(0, RelocInfo::NONE)); | 4064 __ teq(r7, Operand(0, RelocInfo::NONE)); |
| 4065 __ rsb(r5, r5, Operand(0, RelocInfo::NONE), LeaveCC, ne); | 4065 __ rsb(r5, r5, Operand(0, RelocInfo::NONE), LeaveCC, ne); |
| 4066 | 4066 |
| 4067 __ bind(&done); | 4067 __ bind(&done); |
| 4068 switch (elements_kind) { | 4068 switch (elements_kind) { |
| 4069 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 4069 case EXTERNAL_BYTE_ELEMENTS: |
| 4070 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 4070 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| 4071 __ strb(r5, MemOperand(r3, key, LSR, 1)); | 4071 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
| 4072 break; | 4072 break; |
| 4073 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 4073 case EXTERNAL_SHORT_ELEMENTS: |
| 4074 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 4074 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 4075 __ strh(r5, MemOperand(r3, key, LSL, 0)); | 4075 __ strh(r5, MemOperand(r3, key, LSL, 0)); |
| 4076 break; | 4076 break; |
| 4077 case JSObject::EXTERNAL_INT_ELEMENTS: | 4077 case EXTERNAL_INT_ELEMENTS: |
| 4078 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 4078 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 4079 __ str(r5, MemOperand(r3, key, LSL, 1)); | 4079 __ str(r5, MemOperand(r3, key, LSL, 1)); |
| 4080 break; | 4080 break; |
| 4081 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 4081 case EXTERNAL_PIXEL_ELEMENTS: |
| 4082 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 4082 case EXTERNAL_FLOAT_ELEMENTS: |
| 4083 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 4083 case EXTERNAL_DOUBLE_ELEMENTS: |
| 4084 case JSObject::FAST_ELEMENTS: | 4084 case FAST_ELEMENTS: |
| 4085 case JSObject::FAST_DOUBLE_ELEMENTS: | 4085 case FAST_DOUBLE_ELEMENTS: |
| 4086 case JSObject::DICTIONARY_ELEMENTS: | 4086 case DICTIONARY_ELEMENTS: |
| 4087 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 4087 case NON_STRICT_ARGUMENTS_ELEMENTS: |
| 4088 UNREACHABLE(); | 4088 UNREACHABLE(); |
| 4089 break; | 4089 break; |
| 4090 } | 4090 } |
| 4091 } | 4091 } |
| 4092 } | 4092 } |
| 4093 } | 4093 } |
| 4094 | 4094 |
| 4095 // Slow case, key and receiver still in r0 and r1. | 4095 // Slow case, key and receiver still in r0 and r1. |
| 4096 __ bind(&slow); | 4096 __ bind(&slow); |
| 4097 __ IncrementCounter( | 4097 __ IncrementCounter( |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4421 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); | 4421 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); |
| 4422 __ Jump(ic, RelocInfo::CODE_TARGET); | 4422 __ Jump(ic, RelocInfo::CODE_TARGET); |
| 4423 } | 4423 } |
| 4424 | 4424 |
| 4425 | 4425 |
| 4426 #undef __ | 4426 #undef __ |
| 4427 | 4427 |
| 4428 } } // namespace v8::internal | 4428 } } // namespace v8::internal |
| 4429 | 4429 |
| 4430 #endif // V8_TARGET_ARCH_ARM | 4430 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |