Chromium Code Reviews| Index: src/arm/stub-cache-arm.cc |
| diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc |
| index cc7de05dc5d00dd772c650bbfc758b9ad8e1e5b8..0a859e28906d5a2dfb5600e872ca21ad06572d8c 100644 |
| --- a/src/arm/stub-cache-arm.cc |
| +++ b/src/arm/stub-cache-arm.cc |
| @@ -3115,13 +3115,20 @@ MaybeObject* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { |
| } |
| -MaybeObject* KeyedLoadStubCompiler::CompileLoadFastElement(Map* receiver_map) { |
| +MaybeObject* KeyedLoadStubCompiler::CompileLoadElement(Map* receiver_map) { |
| // ----------- S t a t e ------------- |
| // -- lr : return address |
| // -- r0 : key |
| // -- r1 : receiver |
| // ----------------------------------- |
| - MaybeObject* maybe_stub = KeyedLoadFastElementStub().TryGetCode(); |
| + MaybeObject* maybe_stub; |
| + if (receiver_map->has_fast_elements()) { |
| + maybe_stub = KeyedLoadFastElementStub().TryGetCode(); |
| + } else { |
| + ASSERT(receiver_map->has_external_array_elements()); |
| + JSObject::ElementsKind elements_kind = receiver_map->elements_kind(); |
| + maybe_stub = KeyedLoadExternalArrayStub(elements_kind).TryGetCode(); |
| + } |
| Code* stub; |
| if (!maybe_stub->To(&stub)) return maybe_stub; |
| __ DispatchMap(r1, |
| @@ -3206,7 +3213,7 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, |
| } |
| -MaybeObject* KeyedStoreStubCompiler::CompileStoreFastElement( |
| +MaybeObject* KeyedStoreStubCompiler::CompileStoreElement( |
| Map* receiver_map) { |
| // ----------- S t a t e ------------- |
| // -- r0 : value |
| @@ -3215,9 +3222,15 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreFastElement( |
| // -- lr : return address |
| // -- r3 : scratch |
| // ----------------------------------- |
| - bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
| - MaybeObject* maybe_stub = |
| - KeyedStoreFastElementStub(is_js_array).TryGetCode(); |
| + MaybeObject* maybe_stub; |
| + if (receiver_map->has_fast_elements()) { |
| + bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
| + maybe_stub = KeyedStoreFastElementStub(is_js_array).TryGetCode(); |
| + } else { |
| + ASSERT(receiver_map->has_external_array_elements()); |
| + JSObject::ElementsKind elements_kind = receiver_map->elements_kind(); |
| + maybe_stub = KeyedStoreExternalArrayStub(elements_kind).TryGetCode(); |
| + } |
| Code* stub; |
| if (!maybe_stub->To(&stub)) return maybe_stub; |
| __ DispatchMap(r2, |
| @@ -3410,82 +3423,38 @@ MaybeObject* ConstructStubCompiler::CompileConstructStub(JSFunction* function) { |
| } |
| -MaybeObject* ExternalArrayLoadStubCompiler::CompileLoad( |
| - JSObject*receiver, ExternalArrayType array_type) { |
| - // ----------- S t a t e ------------- |
| - // -- lr : return address |
| - // -- r0 : key |
| - // -- r1 : receiver |
| - // ----------------------------------- |
| - MaybeObject* maybe_stub = |
| - KeyedLoadExternalArrayStub(array_type).TryGetCode(); |
| - Code* stub; |
| - if (!maybe_stub->To(&stub)) return maybe_stub; |
| - __ DispatchMap(r1, |
| - r2, |
| - Handle<Map>(receiver->map()), |
| - Handle<Code>(stub), |
| - DO_SMI_CHECK); |
| - |
| - Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss(); |
| - __ Jump(ic, RelocInfo::CODE_TARGET); |
| - |
| - // Return the generated code. |
| - return GetCode(); |
| -} |
| - |
| - |
| -MaybeObject* ExternalArrayStoreStubCompiler::CompileStore( |
| - JSObject* receiver, ExternalArrayType array_type) { |
| - // ----------- S t a t e ------------- |
| - // -- r0 : value |
| - // -- r1 : name |
| - // -- r2 : receiver |
| - // -- lr : return address |
| - // ----------------------------------- |
| - MaybeObject* maybe_stub = |
| - KeyedStoreExternalArrayStub(array_type).TryGetCode(); |
| - Code* stub; |
| - if (!maybe_stub->To(&stub)) return maybe_stub; |
| - __ DispatchMap(r2, |
| - r3, |
| - Handle<Map>(receiver->map()), |
| - Handle<Code>(stub), |
| - DO_SMI_CHECK); |
| - |
| - Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
| - __ Jump(ic, RelocInfo::CODE_TARGET); |
| - |
| - return GetCode(); |
| -} |
| - |
| - |
| #undef __ |
| #define __ ACCESS_MASM(masm) |
| -static bool IsElementTypeSigned(ExternalArrayType array_type) { |
| - switch (array_type) { |
| - case kExternalByteArray: |
| - case kExternalShortArray: |
| - case kExternalIntArray: |
| +static bool IsElementTypeSigned(JSObject::ElementsKind elements_kind) { |
| + switch (elements_kind) { |
| + case JSObject::EXTERNAL_BYTE_ELEMENTS: |
| + case JSObject::EXTERNAL_SHORT_ELEMENTS: |
| + case JSObject::EXTERNAL_INT_ELEMENTS: |
| + case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
|
Mads Ager (chromium)
2011/06/09 14:15:45
Are pixel values signed? I didn't think so. It see
Jakob Kummerow
2011/06/09 14:26:40
really?
danno
2011/06/09 15:03:27
Done.
danno
2011/06/09 15:03:27
Done.
|
| return true; |
| - case kExternalUnsignedByteArray: |
| - case kExternalUnsignedShortArray: |
| - case kExternalUnsignedIntArray: |
| + case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| return false; |
| - default: |
| + case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
| + case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
| + case JSObject::FAST_ELEMENTS: |
| + case JSObject::FAST_DOUBLE_ELEMENTS: |
| + case JSObject::DICTIONARY_ELEMENTS: |
| UNREACHABLE(); |
| return false; |
| } |
| + return false; |
| } |
| void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| MacroAssembler* masm, |
| - ExternalArrayType array_type) { |
| + JSObject::ElementsKind elements_kind) { |
| // ---------- S t a t e -------------- |
| // -- lr : return address |
| // -- r0 : key |
| @@ -3519,25 +3488,25 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| ASSERT((kSmiTag == 0) && (kSmiTagSize == 1)); |
| Register value = r2; |
| - switch (array_type) { |
| - case kExternalByteArray: |
| + switch (elements_kind) { |
| + case JSObject::EXTERNAL_BYTE_ELEMENTS: |
| __ ldrsb(value, MemOperand(r3, key, LSR, 1)); |
| break; |
| - case kExternalPixelArray: |
| - case kExternalUnsignedByteArray: |
| + case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| __ ldrb(value, MemOperand(r3, key, LSR, 1)); |
| break; |
| - case kExternalShortArray: |
| + case JSObject::EXTERNAL_SHORT_ELEMENTS: |
| __ ldrsh(value, MemOperand(r3, key, LSL, 0)); |
| break; |
| - case kExternalUnsignedShortArray: |
| + case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| __ ldrh(value, MemOperand(r3, key, LSL, 0)); |
| break; |
| - case kExternalIntArray: |
| - case kExternalUnsignedIntArray: |
| + case JSObject::EXTERNAL_INT_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| __ ldr(value, MemOperand(r3, key, LSL, 1)); |
| break; |
| - case kExternalFloatArray: |
| + case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
| if (CpuFeatures::IsSupported(VFP3)) { |
| CpuFeatures::Scope scope(VFP3); |
| __ add(r2, r3, Operand(key, LSL, 1)); |
| @@ -3546,8 +3515,8 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| __ ldr(value, MemOperand(r3, key, LSL, 1)); |
| } |
| break; |
| - case kExternalDoubleArray: |
| - if (CpuFeatures::IsSupported(VFP3)) { |
| + case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
|
Mads Ager (chromium)
2011/06/09 14:15:45
Something is off with the indentation I think?
danno
2011/06/09 15:03:27
Done.
|
| + if (CpuFeatures::IsSupported(VFP3)) { |
| CpuFeatures::Scope scope(VFP3); |
| __ add(r2, r3, Operand(key, LSL, 2)); |
| __ vldr(d0, r2, 0); |
| @@ -3558,7 +3527,9 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| __ ldr(r3, MemOperand(r4, Register::kSizeInBytes)); |
| } |
| break; |
| - default: |
| + case JSObject::FAST_ELEMENTS: |
| + case JSObject::FAST_DOUBLE_ELEMENTS: |
| + case JSObject::DICTIONARY_ELEMENTS: |
| UNREACHABLE(); |
| break; |
| } |
| @@ -3572,7 +3543,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| // d0: value (if VFP3 is supported) |
| // r2/r3: value (if VFP3 is not supported) |
| - if (array_type == kExternalIntArray) { |
| + if (elements_kind == JSObject::EXTERNAL_INT_ELEMENTS) { |
| // For the Int and UnsignedInt array types, we need to see whether |
| // the value can be represented in a Smi. If not, we need to convert |
| // it to a HeapNumber. |
| @@ -3616,7 +3587,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| __ str(dst2, FieldMemOperand(r0, HeapNumber::kExponentOffset)); |
| __ Ret(); |
| } |
| - } else if (array_type == kExternalUnsignedIntArray) { |
| + } else if (elements_kind == JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
| // The test is different for unsigned int values. Since we need |
| // the value to be in the range of a positive smi, we can't |
| // handle either of the top two bits being set in the value. |
| @@ -3681,7 +3652,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| __ mov(r0, r4); |
| __ Ret(); |
| } |
| - } else if (array_type == kExternalFloatArray) { |
| + } else if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { |
| // For the floating-point array type, we need to always allocate a |
| // HeapNumber. |
| if (CpuFeatures::IsSupported(VFP3)) { |
| @@ -3751,7 +3722,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| __ mov(r0, r3); |
| __ Ret(); |
| } |
| - } else if (array_type == kExternalDoubleArray) { |
| + } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
| if (CpuFeatures::IsSupported(VFP3)) { |
| CpuFeatures::Scope scope(VFP3); |
| // Allocate a HeapNumber for the result. Don't use r0 and r1 as |
| @@ -3808,7 +3779,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
| void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| MacroAssembler* masm, |
| - ExternalArrayType array_type) { |
| + JSObject::ElementsKind elements_kind) { |
| // ---------- S t a t e -------------- |
| // -- r0 : value |
| // -- r1 : key |
| @@ -3842,7 +3813,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| // runtime for all other kinds of values. |
| // r3: external array. |
| // r4: key (integer). |
| - if (array_type == kExternalPixelArray) { |
| + if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) { |
| // Double to pixel conversion is only implemented in the runtime for now. |
| __ JumpIfNotSmi(value, &slow); |
| } else { |
| @@ -3854,29 +3825,29 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| // r3: base pointer of external storage. |
| // r4: key (integer). |
| // r5: value (integer). |
| - switch (array_type) { |
| - case kExternalPixelArray: |
| + switch (elements_kind) { |
| + case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
| // Clamp the value to [0..255]. |
| __ Usat(r5, 8, Operand(r5)); |
| __ strb(r5, MemOperand(r3, r4, LSL, 0)); |
| break; |
| - case kExternalByteArray: |
| - case kExternalUnsignedByteArray: |
| + case JSObject::EXTERNAL_BYTE_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| __ strb(r5, MemOperand(r3, r4, LSL, 0)); |
| break; |
| - case kExternalShortArray: |
| - case kExternalUnsignedShortArray: |
| + case JSObject::EXTERNAL_SHORT_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| __ strh(r5, MemOperand(r3, r4, LSL, 1)); |
| break; |
| - case kExternalIntArray: |
| - case kExternalUnsignedIntArray: |
| + case JSObject::EXTERNAL_INT_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| __ str(r5, MemOperand(r3, r4, LSL, 2)); |
| break; |
| - case kExternalFloatArray: |
| + case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
| // Perform int-to-float conversion and store to memory. |
| StoreIntAsFloat(masm, r3, r4, r5, r6, r7, r9); |
| break; |
| - case kExternalDoubleArray: |
| + case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
| __ add(r3, r3, Operand(r4, LSL, 3)); |
| // r3: effective address of the double element |
| FloatingPointHelper::Destination destination; |
| @@ -3897,7 +3868,9 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| __ str(r7, MemOperand(r3, Register::kSizeInBytes)); |
| } |
| break; |
| - default: |
| + case JSObject::FAST_ELEMENTS: |
| + case JSObject::FAST_DOUBLE_ELEMENTS: |
| + case JSObject::DICTIONARY_ELEMENTS: |
| UNREACHABLE(); |
| break; |
| } |
| @@ -3905,7 +3878,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| // Entry registers are intact, r0 holds the value which is the return value. |
| __ Ret(); |
| - if (array_type != kExternalPixelArray) { |
| + if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) { |
| // r3: external array. |
| // r4: index (integer). |
| __ bind(&check_heap_number); |
| @@ -3923,7 +3896,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| if (CpuFeatures::IsSupported(VFP3)) { |
| CpuFeatures::Scope scope(VFP3); |
| - if (array_type == kExternalFloatArray) { |
| + if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { |
| // vldr requires offset to be a multiple of 4 so we can not |
| // include -kHeapObjectTag into it. |
| __ sub(r5, r0, Operand(kHeapObjectTag)); |
| @@ -3931,7 +3904,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| __ add(r5, r3, Operand(r4, LSL, 2)); |
| __ vcvt_f32_f64(s0, d0); |
| __ vstr(s0, r5, 0); |
| - } else if (array_type == kExternalDoubleArray) { |
| + } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
| __ sub(r5, r0, Operand(kHeapObjectTag)); |
| __ vldr(d0, r5, HeapNumber::kValueOffset); |
| __ add(r5, r3, Operand(r4, LSL, 3)); |
| @@ -3943,20 +3916,25 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| __ vldr(d0, r5, HeapNumber::kValueOffset); |
| __ EmitECMATruncate(r5, d0, s2, r6, r7, r9); |
| - switch (array_type) { |
| - case kExternalByteArray: |
| - case kExternalUnsignedByteArray: |
| + switch (elements_kind) { |
| + case JSObject::EXTERNAL_BYTE_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| __ strb(r5, MemOperand(r3, r4, LSL, 0)); |
| break; |
| - case kExternalShortArray: |
| - case kExternalUnsignedShortArray: |
| + case JSObject::EXTERNAL_SHORT_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| __ strh(r5, MemOperand(r3, r4, LSL, 1)); |
| break; |
| - case kExternalIntArray: |
| - case kExternalUnsignedIntArray: |
| + case JSObject::EXTERNAL_INT_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| __ str(r5, MemOperand(r3, r4, LSL, 2)); |
| break; |
| - default: |
| + case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
| + case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
| + case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
| + case JSObject::FAST_ELEMENTS: |
| + case JSObject::FAST_DOUBLE_ELEMENTS: |
| + case JSObject::DICTIONARY_ELEMENTS: |
| UNREACHABLE(); |
| break; |
| } |
| @@ -3970,7 +3948,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| __ ldr(r5, FieldMemOperand(value, HeapNumber::kExponentOffset)); |
| __ ldr(r6, FieldMemOperand(value, HeapNumber::kMantissaOffset)); |
| - if (array_type == kExternalFloatArray) { |
| + if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { |
| Label done, nan_or_infinity_or_zero; |
| static const int kMantissaInHiWordShift = |
| kBinary32MantissaBits - HeapNumber::kMantissaBitsInTopWord; |
| @@ -4022,14 +4000,14 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| __ orr(r9, r9, Operand(r5, LSL, kMantissaInHiWordShift)); |
| __ orr(r5, r9, Operand(r6, LSR, kMantissaInLoWordShift)); |
| __ b(&done); |
| - } else if (array_type == kExternalDoubleArray) { |
| + } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
| __ add(r7, r3, Operand(r4, LSL, 3)); |
| // r7: effective address of destination element. |
| __ str(r6, MemOperand(r7, 0)); |
| __ str(r5, MemOperand(r7, Register::kSizeInBytes)); |
| __ Ret(); |
| } else { |
| - bool is_signed_type = IsElementTypeSigned(array_type); |
| + bool is_signed_type = IsElementTypeSigned(elements_kind); |
| int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt; |
| int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000; |
| @@ -4076,20 +4054,25 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
| __ rsb(r5, r5, Operand(0, RelocInfo::NONE), LeaveCC, ne); |
| __ bind(&done); |
| - switch (array_type) { |
| - case kExternalByteArray: |
| - case kExternalUnsignedByteArray: |
| + switch (elements_kind) { |
| + case JSObject::EXTERNAL_BYTE_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| __ strb(r5, MemOperand(r3, r4, LSL, 0)); |
| break; |
| - case kExternalShortArray: |
| - case kExternalUnsignedShortArray: |
| + case JSObject::EXTERNAL_SHORT_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| __ strh(r5, MemOperand(r3, r4, LSL, 1)); |
| break; |
| - case kExternalIntArray: |
| - case kExternalUnsignedIntArray: |
| + case JSObject::EXTERNAL_INT_ELEMENTS: |
| + case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| __ str(r5, MemOperand(r3, r4, LSL, 2)); |
| break; |
| - default: |
| + case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
| + case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
| + case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
| + case JSObject::FAST_ELEMENTS: |
| + case JSObject::FAST_DOUBLE_ELEMENTS: |
| + case JSObject::DICTIONARY_ELEMENTS: |
| UNREACHABLE(); |
| break; |
| } |