| 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 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1188 Register scratch1, | 1188 Register scratch1, |
| 1189 Register scratch2, | 1189 Register scratch2, |
| 1190 Register scratch3, | 1190 Register scratch3, |
| 1191 Object* value, | 1191 Object* value, |
| 1192 String* name, | 1192 String* name, |
| 1193 Label* miss) { | 1193 Label* miss) { |
| 1194 // Check that the receiver isn't a smi. | 1194 // Check that the receiver isn't a smi. |
| 1195 __ JumpIfSmi(receiver, miss); | 1195 __ JumpIfSmi(receiver, miss); |
| 1196 | 1196 |
| 1197 // Check that the maps haven't changed. | 1197 // Check that the maps haven't changed. |
| 1198 Register reg = | 1198 CheckPrototypes(object, receiver, holder, scratch1, scratch2, scratch3, name, |
| 1199 CheckPrototypes(object, receiver, holder, | 1199 miss); |
| 1200 scratch1, scratch2, scratch3, name, miss); | |
| 1201 | 1200 |
| 1202 // Return the constant value. | 1201 // Return the constant value. |
| 1203 __ mov(r0, Operand(Handle<Object>(value))); | 1202 __ mov(r0, Operand(Handle<Object>(value))); |
| 1204 __ Ret(); | 1203 __ Ret(); |
| 1205 } | 1204 } |
| 1206 | 1205 |
| 1207 | 1206 |
| 1208 MaybeObject* StubCompiler::GenerateLoadCallback(JSObject* object, | 1207 MaybeObject* StubCompiler::GenerateLoadCallback(JSObject* object, |
| 1209 JSObject* holder, | 1208 JSObject* holder, |
| 1210 Register receiver, | 1209 Register receiver, |
| (...skipping 2289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3500 // have been verified by the caller to not be a smi. | 3499 // have been verified by the caller to not be a smi. |
| 3501 | 3500 |
| 3502 // Check that the key is a smi. | 3501 // Check that the key is a smi. |
| 3503 __ JumpIfNotSmi(key, &miss_force_generic); | 3502 __ JumpIfNotSmi(key, &miss_force_generic); |
| 3504 | 3503 |
| 3505 __ ldr(r3, FieldMemOperand(receiver, JSObject::kElementsOffset)); | 3504 __ ldr(r3, FieldMemOperand(receiver, JSObject::kElementsOffset)); |
| 3506 // r3: elements array | 3505 // r3: elements array |
| 3507 | 3506 |
| 3508 // Check that the index is in range. | 3507 // Check that the index is in range. |
| 3509 __ ldr(ip, FieldMemOperand(r3, ExternalArray::kLengthOffset)); | 3508 __ ldr(ip, FieldMemOperand(r3, ExternalArray::kLengthOffset)); |
| 3510 __ cmp(ip, Operand(key, ASR, kSmiTagSize)); | 3509 __ cmp(key, ip); |
| 3511 // Unsigned comparison catches both negative and too-large values. | 3510 // Unsigned comparison catches both negative and too-large values. |
| 3512 __ b(lo, &miss_force_generic); | 3511 __ b(hs, &miss_force_generic); |
| 3513 | 3512 |
| 3514 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); | 3513 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); |
| 3515 // r3: base pointer of external storage | 3514 // r3: base pointer of external storage |
| 3516 | 3515 |
| 3517 // We are not untagging smi key and instead work with it | 3516 // We are not untagging smi key and instead work with it |
| 3518 // as if it was premultiplied by 2. | 3517 // as if it was premultiplied by 2. |
| 3519 ASSERT((kSmiTag == 0) && (kSmiTagSize == 1)); | 3518 ASSERT((kSmiTag == 0) && (kSmiTagSize == 1)); |
| 3520 | 3519 |
| 3521 Register value = r2; | 3520 Register value = r2; |
| 3522 switch (elements_kind) { | 3521 switch (elements_kind) { |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3822 | 3821 |
| 3823 // Register usage. | 3822 // Register usage. |
| 3824 Register value = r0; | 3823 Register value = r0; |
| 3825 Register key = r1; | 3824 Register key = r1; |
| 3826 Register receiver = r2; | 3825 Register receiver = r2; |
| 3827 // r3 mostly holds the elements array or the destination external array. | 3826 // r3 mostly holds the elements array or the destination external array. |
| 3828 | 3827 |
| 3829 // This stub is meant to be tail-jumped to, the receiver must already | 3828 // This stub is meant to be tail-jumped to, the receiver must already |
| 3830 // have been verified by the caller to not be a smi. | 3829 // have been verified by the caller to not be a smi. |
| 3831 | 3830 |
| 3832 __ ldr(r3, FieldMemOperand(receiver, JSObject::kElementsOffset)); | |
| 3833 | |
| 3834 // Check that the key is a smi. | 3831 // Check that the key is a smi. |
| 3835 __ JumpIfNotSmi(key, &miss_force_generic); | 3832 __ JumpIfNotSmi(key, &miss_force_generic); |
| 3836 | 3833 |
| 3834 __ ldr(r3, FieldMemOperand(receiver, JSObject::kElementsOffset)); |
| 3835 |
| 3837 // Check that the index is in range | 3836 // Check that the index is in range |
| 3838 __ SmiUntag(r4, key); | |
| 3839 __ ldr(ip, FieldMemOperand(r3, ExternalArray::kLengthOffset)); | 3837 __ ldr(ip, FieldMemOperand(r3, ExternalArray::kLengthOffset)); |
| 3840 __ cmp(r4, ip); | 3838 __ cmp(key, ip); |
| 3841 // Unsigned comparison catches both negative and too-large values. | 3839 // Unsigned comparison catches both negative and too-large values. |
| 3842 __ b(hs, &miss_force_generic); | 3840 __ b(hs, &miss_force_generic); |
| 3843 | 3841 |
| 3844 // Handle both smis and HeapNumbers in the fast path. Go to the | 3842 // Handle both smis and HeapNumbers in the fast path. Go to the |
| 3845 // runtime for all other kinds of values. | 3843 // runtime for all other kinds of values. |
| 3846 // r3: external array. | 3844 // r3: external array. |
| 3847 // r4: key (integer). | |
| 3848 if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) { | 3845 if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) { |
| 3849 // Double to pixel conversion is only implemented in the runtime for now. | 3846 // Double to pixel conversion is only implemented in the runtime for now. |
| 3850 __ JumpIfNotSmi(value, &slow); | 3847 __ JumpIfNotSmi(value, &slow); |
| 3851 } else { | 3848 } else { |
| 3852 __ JumpIfNotSmi(value, &check_heap_number); | 3849 __ JumpIfNotSmi(value, &check_heap_number); |
| 3853 } | 3850 } |
| 3854 __ SmiUntag(r5, value); | 3851 __ SmiUntag(r5, value); |
| 3855 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); | 3852 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); |
| 3856 | 3853 |
| 3857 // r3: base pointer of external storage. | 3854 // r3: base pointer of external storage. |
| 3858 // r4: key (integer). | |
| 3859 // r5: value (integer). | 3855 // r5: value (integer). |
| 3860 switch (elements_kind) { | 3856 switch (elements_kind) { |
| 3861 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3857 case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
| 3862 // Clamp the value to [0..255]. | 3858 // Clamp the value to [0..255]. |
| 3863 __ Usat(r5, 8, Operand(r5)); | 3859 __ Usat(r5, 8, Operand(r5)); |
| 3864 __ strb(r5, MemOperand(r3, r4, LSL, 0)); | 3860 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
| 3865 break; | 3861 break; |
| 3866 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3862 case JSObject::EXTERNAL_BYTE_ELEMENTS: |
| 3867 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3863 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| 3868 __ strb(r5, MemOperand(r3, r4, LSL, 0)); | 3864 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
| 3869 break; | 3865 break; |
| 3870 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3866 case JSObject::EXTERNAL_SHORT_ELEMENTS: |
| 3871 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3867 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 3872 __ strh(r5, MemOperand(r3, r4, LSL, 1)); | 3868 __ strh(r5, MemOperand(r3, key, LSL, 0)); |
| 3873 break; | 3869 break; |
| 3874 case JSObject::EXTERNAL_INT_ELEMENTS: | 3870 case JSObject::EXTERNAL_INT_ELEMENTS: |
| 3875 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3871 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 3876 __ str(r5, MemOperand(r3, r4, LSL, 2)); | 3872 __ str(r5, MemOperand(r3, key, LSL, 1)); |
| 3877 break; | 3873 break; |
| 3878 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3874 case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
| 3879 // Perform int-to-float conversion and store to memory. | 3875 // Perform int-to-float conversion and store to memory. |
| 3876 __ SmiUntag(r4, key); |
| 3880 StoreIntAsFloat(masm, r3, r4, r5, r6, r7, r9); | 3877 StoreIntAsFloat(masm, r3, r4, r5, r6, r7, r9); |
| 3881 break; | 3878 break; |
| 3882 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3879 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
| 3883 __ add(r3, r3, Operand(r4, LSL, 3)); | 3880 __ add(r3, r3, Operand(key, LSL, 2)); |
| 3884 // r3: effective address of the double element | 3881 // r3: effective address of the double element |
| 3885 FloatingPointHelper::Destination destination; | 3882 FloatingPointHelper::Destination destination; |
| 3886 if (CpuFeatures::IsSupported(VFP3)) { | 3883 if (CpuFeatures::IsSupported(VFP3)) { |
| 3887 destination = FloatingPointHelper::kVFPRegisters; | 3884 destination = FloatingPointHelper::kVFPRegisters; |
| 3888 } else { | 3885 } else { |
| 3889 destination = FloatingPointHelper::kCoreRegisters; | 3886 destination = FloatingPointHelper::kCoreRegisters; |
| 3890 } | 3887 } |
| 3891 FloatingPointHelper::ConvertIntToDouble( | 3888 FloatingPointHelper::ConvertIntToDouble( |
| 3892 masm, r5, destination, | 3889 masm, r5, destination, |
| 3893 d0, r6, r7, // These are: double_dst, dst1, dst2. | 3890 d0, r6, r7, // These are: double_dst, dst1, dst2. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3906 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3903 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: |
| 3907 UNREACHABLE(); | 3904 UNREACHABLE(); |
| 3908 break; | 3905 break; |
| 3909 } | 3906 } |
| 3910 | 3907 |
| 3911 // Entry registers are intact, r0 holds the value which is the return value. | 3908 // Entry registers are intact, r0 holds the value which is the return value. |
| 3912 __ Ret(); | 3909 __ Ret(); |
| 3913 | 3910 |
| 3914 if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) { | 3911 if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) { |
| 3915 // r3: external array. | 3912 // r3: external array. |
| 3916 // r4: index (integer). | |
| 3917 __ bind(&check_heap_number); | 3913 __ bind(&check_heap_number); |
| 3918 __ CompareObjectType(value, r5, r6, HEAP_NUMBER_TYPE); | 3914 __ CompareObjectType(value, r5, r6, HEAP_NUMBER_TYPE); |
| 3919 __ b(ne, &slow); | 3915 __ b(ne, &slow); |
| 3920 | 3916 |
| 3921 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); | 3917 __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset)); |
| 3922 | 3918 |
| 3923 // r3: base pointer of external storage. | 3919 // r3: base pointer of external storage. |
| 3924 // r4: key (integer). | |
| 3925 | 3920 |
| 3926 // The WebGL specification leaves the behavior of storing NaN and | 3921 // The WebGL specification leaves the behavior of storing NaN and |
| 3927 // +/-Infinity into integer arrays basically undefined. For more | 3922 // +/-Infinity into integer arrays basically undefined. For more |
| 3928 // reproducible behavior, convert these to zero. | 3923 // reproducible behavior, convert these to zero. |
| 3929 if (CpuFeatures::IsSupported(VFP3)) { | 3924 if (CpuFeatures::IsSupported(VFP3)) { |
| 3930 CpuFeatures::Scope scope(VFP3); | 3925 CpuFeatures::Scope scope(VFP3); |
| 3931 | 3926 |
| 3932 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { | 3927 if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { |
| 3933 // vldr requires offset to be a multiple of 4 so we can not | 3928 // vldr requires offset to be a multiple of 4 so we can not |
| 3934 // include -kHeapObjectTag into it. | 3929 // include -kHeapObjectTag into it. |
| 3935 __ sub(r5, r0, Operand(kHeapObjectTag)); | 3930 __ sub(r5, r0, Operand(kHeapObjectTag)); |
| 3936 __ vldr(d0, r5, HeapNumber::kValueOffset); | 3931 __ vldr(d0, r5, HeapNumber::kValueOffset); |
| 3937 __ add(r5, r3, Operand(r4, LSL, 2)); | 3932 __ add(r5, r3, Operand(key, LSL, 1)); |
| 3938 __ vcvt_f32_f64(s0, d0); | 3933 __ vcvt_f32_f64(s0, d0); |
| 3939 __ vstr(s0, r5, 0); | 3934 __ vstr(s0, r5, 0); |
| 3940 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 3935 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
| 3941 __ sub(r5, r0, Operand(kHeapObjectTag)); | 3936 __ sub(r5, r0, Operand(kHeapObjectTag)); |
| 3942 __ vldr(d0, r5, HeapNumber::kValueOffset); | 3937 __ vldr(d0, r5, HeapNumber::kValueOffset); |
| 3943 __ add(r5, r3, Operand(r4, LSL, 3)); | 3938 __ add(r5, r3, Operand(key, LSL, 2)); |
| 3944 __ vstr(d0, r5, 0); | 3939 __ vstr(d0, r5, 0); |
| 3945 } else { | 3940 } else { |
| 3946 // Hoisted load. vldr requires offset to be a multiple of 4 so we can | 3941 // Hoisted load. vldr requires offset to be a multiple of 4 so we can |
| 3947 // not include -kHeapObjectTag into it. | 3942 // not include -kHeapObjectTag into it. |
| 3948 __ sub(r5, value, Operand(kHeapObjectTag)); | 3943 __ sub(r5, value, Operand(kHeapObjectTag)); |
| 3949 __ vldr(d0, r5, HeapNumber::kValueOffset); | 3944 __ vldr(d0, r5, HeapNumber::kValueOffset); |
| 3950 __ EmitECMATruncate(r5, d0, s2, r6, r7, r9); | 3945 __ EmitECMATruncate(r5, d0, s2, r6, r7, r9); |
| 3951 | 3946 |
| 3952 switch (elements_kind) { | 3947 switch (elements_kind) { |
| 3953 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 3948 case JSObject::EXTERNAL_BYTE_ELEMENTS: |
| 3954 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 3949 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| 3955 __ strb(r5, MemOperand(r3, r4, LSL, 0)); | 3950 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
| 3956 break; | 3951 break; |
| 3957 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 3952 case JSObject::EXTERNAL_SHORT_ELEMENTS: |
| 3958 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 3953 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 3959 __ strh(r5, MemOperand(r3, r4, LSL, 1)); | 3954 __ strh(r5, MemOperand(r3, key, LSL, 0)); |
| 3960 break; | 3955 break; |
| 3961 case JSObject::EXTERNAL_INT_ELEMENTS: | 3956 case JSObject::EXTERNAL_INT_ELEMENTS: |
| 3962 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3957 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 3963 __ str(r5, MemOperand(r3, r4, LSL, 2)); | 3958 __ str(r5, MemOperand(r3, key, LSL, 1)); |
| 3964 break; | 3959 break; |
| 3965 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 3960 case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
| 3966 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 3961 case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
| 3967 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 3962 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
| 3968 case JSObject::FAST_ELEMENTS: | 3963 case JSObject::FAST_ELEMENTS: |
| 3969 case JSObject::FAST_DOUBLE_ELEMENTS: | 3964 case JSObject::FAST_DOUBLE_ELEMENTS: |
| 3970 case JSObject::DICTIONARY_ELEMENTS: | 3965 case JSObject::DICTIONARY_ELEMENTS: |
| 3971 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 3966 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: |
| 3972 UNREACHABLE(); | 3967 UNREACHABLE(); |
| 3973 break; | 3968 break; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4015 __ and_(r5, r5, Operand(HeapNumber::kSignMask), LeaveCC, lt); | 4010 __ and_(r5, r5, Operand(HeapNumber::kSignMask), LeaveCC, lt); |
| 4016 __ b(lt, &done); | 4011 __ b(lt, &done); |
| 4017 | 4012 |
| 4018 __ and_(r7, r5, Operand(HeapNumber::kSignMask)); | 4013 __ and_(r7, r5, Operand(HeapNumber::kSignMask)); |
| 4019 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); | 4014 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); |
| 4020 __ orr(r7, r7, Operand(r5, LSL, kMantissaInHiWordShift)); | 4015 __ orr(r7, r7, Operand(r5, LSL, kMantissaInHiWordShift)); |
| 4021 __ orr(r7, r7, Operand(r6, LSR, kMantissaInLoWordShift)); | 4016 __ orr(r7, r7, Operand(r6, LSR, kMantissaInLoWordShift)); |
| 4022 __ orr(r5, r7, Operand(r9, LSL, kBinary32ExponentShift)); | 4017 __ orr(r5, r7, Operand(r9, LSL, kBinary32ExponentShift)); |
| 4023 | 4018 |
| 4024 __ bind(&done); | 4019 __ bind(&done); |
| 4025 __ str(r5, MemOperand(r3, r4, LSL, 2)); | 4020 __ str(r5, MemOperand(r3, key, LSL, 1)); |
| 4026 // Entry registers are intact, r0 holds the value which is the return | 4021 // Entry registers are intact, r0 holds the value which is the return |
| 4027 // value. | 4022 // value. |
| 4028 __ Ret(); | 4023 __ Ret(); |
| 4029 | 4024 |
| 4030 __ bind(&nan_or_infinity_or_zero); | 4025 __ bind(&nan_or_infinity_or_zero); |
| 4031 __ and_(r7, r5, Operand(HeapNumber::kSignMask)); | 4026 __ and_(r7, r5, Operand(HeapNumber::kSignMask)); |
| 4032 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); | 4027 __ and_(r5, r5, Operand(HeapNumber::kMantissaMask)); |
| 4033 __ orr(r9, r9, r7); | 4028 __ orr(r9, r9, r7); |
| 4034 __ orr(r9, r9, Operand(r5, LSL, kMantissaInHiWordShift)); | 4029 __ orr(r9, r9, Operand(r5, LSL, kMantissaInHiWordShift)); |
| 4035 __ orr(r5, r9, Operand(r6, LSR, kMantissaInLoWordShift)); | 4030 __ orr(r5, r9, Operand(r6, LSR, kMantissaInLoWordShift)); |
| 4036 __ b(&done); | 4031 __ b(&done); |
| 4037 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { | 4032 } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
| 4038 __ add(r7, r3, Operand(r4, LSL, 3)); | 4033 __ add(r7, r3, Operand(key, LSL, 2)); |
| 4039 // r7: effective address of destination element. | 4034 // r7: effective address of destination element. |
| 4040 __ str(r6, MemOperand(r7, 0)); | 4035 __ str(r6, MemOperand(r7, 0)); |
| 4041 __ str(r5, MemOperand(r7, Register::kSizeInBytes)); | 4036 __ str(r5, MemOperand(r7, Register::kSizeInBytes)); |
| 4042 __ Ret(); | 4037 __ Ret(); |
| 4043 } else { | 4038 } else { |
| 4044 bool is_signed_type = IsElementTypeSigned(elements_kind); | 4039 bool is_signed_type = IsElementTypeSigned(elements_kind); |
| 4045 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; | 4040 int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; |
| 4046 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; | 4041 int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; |
| 4047 | 4042 |
| 4048 Label done, sign; | 4043 Label done, sign; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4084 __ orr(r5, r5, Operand(r6, LSR, r9)); | 4079 __ orr(r5, r5, Operand(r6, LSR, r9)); |
| 4085 | 4080 |
| 4086 __ bind(&sign); | 4081 __ bind(&sign); |
| 4087 __ teq(r7, Operand(0, RelocInfo::NONE)); | 4082 __ teq(r7, Operand(0, RelocInfo::NONE)); |
| 4088 __ rsb(r5, r5, Operand(0, RelocInfo::NONE), LeaveCC, ne); | 4083 __ rsb(r5, r5, Operand(0, RelocInfo::NONE), LeaveCC, ne); |
| 4089 | 4084 |
| 4090 __ bind(&done); | 4085 __ bind(&done); |
| 4091 switch (elements_kind) { | 4086 switch (elements_kind) { |
| 4092 case JSObject::EXTERNAL_BYTE_ELEMENTS: | 4087 case JSObject::EXTERNAL_BYTE_ELEMENTS: |
| 4093 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 4088 case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| 4094 __ strb(r5, MemOperand(r3, r4, LSL, 0)); | 4089 __ strb(r5, MemOperand(r3, key, LSR, 1)); |
| 4095 break; | 4090 break; |
| 4096 case JSObject::EXTERNAL_SHORT_ELEMENTS: | 4091 case JSObject::EXTERNAL_SHORT_ELEMENTS: |
| 4097 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 4092 case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 4098 __ strh(r5, MemOperand(r3, r4, LSL, 1)); | 4093 __ strh(r5, MemOperand(r3, key, LSL, 0)); |
| 4099 break; | 4094 break; |
| 4100 case JSObject::EXTERNAL_INT_ELEMENTS: | 4095 case JSObject::EXTERNAL_INT_ELEMENTS: |
| 4101 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: | 4096 case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 4102 __ str(r5, MemOperand(r3, r4, LSL, 2)); | 4097 __ str(r5, MemOperand(r3, key, LSL, 1)); |
| 4103 break; | 4098 break; |
| 4104 case JSObject::EXTERNAL_PIXEL_ELEMENTS: | 4099 case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
| 4105 case JSObject::EXTERNAL_FLOAT_ELEMENTS: | 4100 case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
| 4106 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: | 4101 case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
| 4107 case JSObject::FAST_ELEMENTS: | 4102 case JSObject::FAST_ELEMENTS: |
| 4108 case JSObject::FAST_DOUBLE_ELEMENTS: | 4103 case JSObject::FAST_DOUBLE_ELEMENTS: |
| 4109 case JSObject::DICTIONARY_ELEMENTS: | 4104 case JSObject::DICTIONARY_ELEMENTS: |
| 4110 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: | 4105 case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS: |
| 4111 UNREACHABLE(); | 4106 UNREACHABLE(); |
| 4112 break; | 4107 break; |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4449 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); | 4444 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); |
| 4450 __ Jump(ic, RelocInfo::CODE_TARGET); | 4445 __ Jump(ic, RelocInfo::CODE_TARGET); |
| 4451 } | 4446 } |
| 4452 | 4447 |
| 4453 | 4448 |
| 4454 #undef __ | 4449 #undef __ |
| 4455 | 4450 |
| 4456 } } // namespace v8::internal | 4451 } } // namespace v8::internal |
| 4457 | 4452 |
| 4458 #endif // V8_TARGET_ARCH_ARM | 4453 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |