Index: src/mips/stub-cache-mips.cc |
diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc |
index 3a83cece8dbc5451806b45a4e638a3f0499cb49a..07844f8d3796f30084303cf9e37b16624ef25cf6 100644 |
--- a/src/mips/stub-cache-mips.cc |
+++ b/src/mips/stub-cache-mips.cc |
@@ -3092,13 +3092,20 @@ MaybeObject* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { |
} |
-MaybeObject* KeyedLoadStubCompiler::CompileLoadFastElement(Map* receiver_map) { |
+MaybeObject* KeyedLoadStubCompiler::CompileLoadElement(Map* receiver_map) { |
// ----------- S t a t e ------------- |
// -- ra : return address |
// -- a0 : key |
// -- a1 : 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(a1, |
@@ -3181,7 +3188,7 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, |
} |
-MaybeObject* KeyedStoreStubCompiler::CompileStoreFastElement( |
+MaybeObject* KeyedStoreStubCompiler::CompileStoreElement( |
Map* receiver_map) { |
// ----------- S t a t e ------------- |
// -- a0 : value |
@@ -3190,9 +3197,15 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreFastElement( |
// -- ra : return address |
// -- a3 : 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(a2, |
@@ -3389,82 +3402,38 @@ MaybeObject* ConstructStubCompiler::CompileConstructStub(JSFunction* function) { |
} |
-MaybeObject* ExternalArrayLoadStubCompiler::CompileLoad( |
- JSObject*receiver, ExternalArrayType array_type) { |
- // ----------- S t a t e ------------- |
- // -- ra : return address |
- // -- a0 : key |
- // -- a1 : receiver |
- // ----------------------------------- |
- MaybeObject* maybe_stub = |
- KeyedLoadExternalArrayStub(array_type).TryGetCode(); |
- Code* stub; |
- if (!maybe_stub->To(&stub)) return maybe_stub; |
- __ DispatchMap(a1, |
- a2, |
- 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 ------------- |
- // -- a0 : value |
- // -- a1 : name |
- // -- a2 : receiver |
- // -- ra : return address |
- // ----------------------------------- |
- MaybeObject* maybe_stub = |
- KeyedStoreExternalArrayStub(array_type).TryGetCode(); |
- Code* stub; |
- if (!maybe_stub->To(&stub)) return maybe_stub; |
- __ DispatchMap(a2, |
- a3, |
- 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: |
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: |
+ case JSObject::EXTERNAL_PIXEL_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 -------------- |
// -- ra : return address |
// -- a0 : key |
@@ -3498,33 +3467,33 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
ASSERT((kSmiTag == 0) && (kSmiTagSize == 1)); |
Register value = a2; |
- switch (array_type) { |
- case kExternalByteArray: |
+ switch (elements_kind) { |
+ case JSObject::EXTERNAL_BYTE_ELEMENTS: |
__ srl(t2, key, 1); |
__ addu(t3, a3, t2); |
__ lb(value, MemOperand(t3, 0)); |
break; |
- case kExternalPixelArray: |
- case kExternalUnsignedByteArray: |
+ case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
__ srl(t2, key, 1); |
__ addu(t3, a3, t2); |
__ lbu(value, MemOperand(t3, 0)); |
break; |
- case kExternalShortArray: |
+ case JSObject::EXTERNAL_SHORT_ELEMENTS: |
__ addu(t3, a3, key); |
__ lh(value, MemOperand(t3, 0)); |
break; |
- case kExternalUnsignedShortArray: |
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
__ addu(t3, a3, key); |
__ lhu(value, MemOperand(t3, 0)); |
break; |
- case kExternalIntArray: |
- case kExternalUnsignedIntArray: |
+ case JSObject::EXTERNAL_INT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
__ sll(t2, key, 1); |
__ addu(t3, a3, t2); |
__ lw(value, MemOperand(t3, 0)); |
break; |
- case kExternalFloatArray: |
+ case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
__ sll(t3, t2, 2); |
__ addu(t3, a3, t3); |
if (CpuFeatures::IsSupported(FPU)) { |
@@ -3534,7 +3503,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
__ lw(value, MemOperand(t3, 0)); |
} |
break; |
- case kExternalDoubleArray: |
+ case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
__ sll(t2, key, 2); |
__ addu(t3, a3, t2); |
if (CpuFeatures::IsSupported(FPU)) { |
@@ -3546,7 +3515,9 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
__ lw(a3, MemOperand(t3, Register::kSizeInBytes)); |
} |
break; |
- default: |
+ case JSObject::FAST_ELEMENTS: |
+ case JSObject::FAST_DOUBLE_ELEMENTS: |
+ case JSObject::DICTIONARY_ELEMENTS: |
UNREACHABLE(); |
break; |
} |
@@ -3560,7 +3531,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
// f0: value (if FPU is supported) |
// a2/a3: value (if FPU 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. |
@@ -3602,7 +3573,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
__ sw(dst2, FieldMemOperand(v0, 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. |
@@ -3673,7 +3644,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
__ mov(v0, t2); |
__ 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(FPU)) { |
@@ -3740,7 +3711,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
__ Ret(); |
} |
- } else if (array_type == kExternalDoubleArray) { |
+ } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
if (CpuFeatures::IsSupported(FPU)) { |
CpuFeatures::Scope scope(FPU); |
// Allocate a HeapNumber for the result. Don't use a0 and a1 as |
@@ -3794,7 +3765,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
MacroAssembler* masm, |
- ExternalArrayType array_type) { |
+ JSObject::ElementsKind elements_kind) { |
// ---------- S t a t e -------------- |
// -- a0 : value |
// -- a1 : key |
@@ -3829,7 +3800,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
// a3: external array. |
// t0: 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 { |
@@ -3842,8 +3813,8 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
// t0: key (integer). |
// t1: value (integer). |
- switch (array_type) { |
- case kExternalPixelArray: { |
+ switch (elements_kind) { |
+ case JSObject::EXTERNAL_PIXEL_ELEMENTS: { |
// Clamp the value to [0..255]. |
// v0 is used as a scratch register here. |
Label done; |
@@ -3860,28 +3831,28 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
__ sb(t1, MemOperand(t8, 0)); |
} |
break; |
- case kExternalByteArray: |
- case kExternalUnsignedByteArray: |
+ case JSObject::EXTERNAL_BYTE_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
__ addu(t8, a3, t0); |
__ sb(t1, MemOperand(t8, 0)); |
break; |
- case kExternalShortArray: |
- case kExternalUnsignedShortArray: |
+ case JSObject::EXTERNAL_SHORT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
__ sll(t8, t0, 1); |
__ addu(t8, a3, t8); |
__ sh(t1, MemOperand(t8, 0)); |
break; |
- case kExternalIntArray: |
- case kExternalUnsignedIntArray: |
+ case JSObject::EXTERNAL_INT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
__ sll(t8, t0, 2); |
__ addu(t8, a3, t8); |
__ sw(t1, MemOperand(t8, 0)); |
break; |
- case kExternalFloatArray: |
+ case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
// Perform int-to-float conversion and store to memory. |
StoreIntAsFloat(masm, a3, t0, t1, t2, t3, t4); |
break; |
- case kExternalDoubleArray: |
+ case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
__ sll(t8, t0, 3); |
__ addu(a3, a3, t8); |
// a3: effective address of the double element |
@@ -3903,7 +3874,9 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
__ sw(t3, MemOperand(a3, Register::kSizeInBytes)); |
} |
break; |
- default: |
+ case JSObject::FAST_ELEMENTS: |
+ case JSObject::FAST_DOUBLE_ELEMENTS: |
+ case JSObject::DICTIONARY_ELEMENTS: |
UNREACHABLE(); |
break; |
} |
@@ -3912,7 +3885,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
__ mov(v0, value); |
__ Ret(); |
- if (array_type != kExternalPixelArray) { |
+ if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) { |
// a3: external array. |
// t0: index (integer). |
__ bind(&check_heap_number); |
@@ -3933,37 +3906,42 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
__ ldc1(f0, FieldMemOperand(a0, HeapNumber::kValueOffset)); |
- if (array_type == kExternalFloatArray) { |
+ if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { |
__ cvt_s_d(f0, f0); |
__ sll(t8, t0, 2); |
__ addu(t8, a3, t8); |
__ swc1(f0, MemOperand(t8, 0)); |
- } else if (array_type == kExternalDoubleArray) { |
+ } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
__ sll(t8, t0, 3); |
__ addu(t8, a3, t8); |
__ sdc1(f0, MemOperand(t8, 0)); |
} else { |
__ EmitECMATruncate(t3, f0, f2, t2, t1, t5); |
- switch (array_type) { |
- case kExternalByteArray: |
- case kExternalUnsignedByteArray: |
+ switch (elements_kind) { |
+ case JSObject::EXTERNAL_BYTE_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
__ addu(t8, a3, t0); |
__ sb(t3, MemOperand(t8, 0)); |
break; |
- case kExternalShortArray: |
- case kExternalUnsignedShortArray: |
+ case JSObject::EXTERNAL_SHORT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
__ sll(t8, t0, 1); |
__ addu(t8, a3, t8); |
__ sh(t3, MemOperand(t8, 0)); |
break; |
- case kExternalIntArray: |
- case kExternalUnsignedIntArray: |
+ case JSObject::EXTERNAL_INT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
__ sll(t8, t0, 2); |
__ addu(t8, a3, t8); |
__ sw(t3, MemOperand(t8, 0)); |
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; |
} |
@@ -3979,7 +3957,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
__ lw(t3, FieldMemOperand(value, HeapNumber::kExponentOffset)); |
__ lw(t4, 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; |
@@ -4044,7 +4022,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
__ srl(t4, t4, kMantissaInLoWordShift); |
__ or_(t3, t6, t4); |
__ Branch(&done); |
- } else if (array_type == kExternalDoubleArray) { |
+ } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
__ sll(t8, t0, 3); |
__ addu(t8, a3, t8); |
// t8: effective address of destination element. |
@@ -4052,7 +4030,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
__ sw(t3, MemOperand(t8, 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; |
@@ -4109,25 +4087,30 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
// Result is in t3. |
// This switch block should be exactly the same as above (FPU mode). |
- switch (array_type) { |
- case kExternalByteArray: |
- case kExternalUnsignedByteArray: |
+ switch (elements_kind) { |
+ case JSObject::EXTERNAL_BYTE_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
__ addu(t8, a3, t0); |
__ sb(t3, MemOperand(t8, 0)); |
break; |
- case kExternalShortArray: |
- case kExternalUnsignedShortArray: |
+ case JSObject::EXTERNAL_SHORT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
__ sll(t8, t0, 1); |
__ addu(t8, a3, t8); |
__ sh(t3, MemOperand(t8, 0)); |
break; |
- case kExternalIntArray: |
- case kExternalUnsignedIntArray: |
+ case JSObject::EXTERNAL_INT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
__ sll(t8, t0, 2); |
__ addu(t8, a3, t8); |
__ sw(t3, MemOperand(t8, 0)); |
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; |
} |