Index: src/x64/stub-cache-x64.cc |
diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc |
index ab38a7f35b90621b4221421fbc74a652b698b08e..45d610bc4c018c7c420989834fb4a49c9a23a060 100644 |
--- a/src/x64/stub-cache-x64.cc |
+++ b/src/x64/stub-cache-x64.cc |
@@ -2530,7 +2530,7 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, |
} |
-MaybeObject* KeyedStoreStubCompiler::CompileStoreFastElement( |
+MaybeObject* KeyedStoreStubCompiler::CompileStoreElement( |
Map* receiver_map) { |
// ----------- S t a t e ------------- |
// -- rax : value |
@@ -2538,9 +2538,15 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreFastElement( |
// -- rdx : receiver |
// -- rsp[0] : return address |
// ----------------------------------- |
- 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(rdx, |
@@ -2990,13 +2996,20 @@ MaybeObject* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { |
} |
-MaybeObject* KeyedLoadStubCompiler::CompileLoadFastElement(Map* receiver_map) { |
+MaybeObject* KeyedLoadStubCompiler::CompileLoadElement(Map* receiver_map) { |
// ----------- S t a t e ------------- |
// -- rax : key |
// -- rdx : receiver |
// -- rsp[0] : return address |
// ----------------------------------- |
- 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(rdx, |
@@ -3176,60 +3189,13 @@ MaybeObject* ConstructStubCompiler::CompileConstructStub(JSFunction* function) { |
} |
-MaybeObject* ExternalArrayLoadStubCompiler::CompileLoad( |
- JSObject*receiver, ExternalArrayType array_type) { |
- // ----------- S t a t e ------------- |
- // -- rax : key |
- // -- rdx : receiver |
- // -- rsp[0] : return address |
- // ----------------------------------- |
- MaybeObject* maybe_stub = |
- KeyedLoadExternalArrayStub(array_type).TryGetCode(); |
- Code* stub; |
- if (!maybe_stub->To(&stub)) return maybe_stub; |
- __ DispatchMap(rdx, |
- Handle<Map>(receiver->map()), |
- Handle<Code>(stub), |
- DO_SMI_CHECK); |
- |
- Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss(); |
- __ jmp(ic, RelocInfo::CODE_TARGET); |
- |
- // Return the generated code. |
- return GetCode(); |
-} |
- |
-MaybeObject* ExternalArrayStoreStubCompiler::CompileStore( |
- JSObject* receiver, ExternalArrayType array_type) { |
- // ----------- S t a t e ------------- |
- // -- rax : value |
- // -- rcx : key |
- // -- rdx : receiver |
- // -- rsp[0] : return address |
- // ----------------------------------- |
- MaybeObject* maybe_stub = |
- KeyedStoreExternalArrayStub(array_type).TryGetCode(); |
- Code* stub; |
- if (!maybe_stub->To(&stub)) return maybe_stub; |
- __ DispatchMap(rdx, |
- Handle<Map>(receiver->map()), |
- Handle<Code>(stub), |
- DO_SMI_CHECK); |
- |
- Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); |
- __ jmp(ic, RelocInfo::CODE_TARGET); |
- |
- return GetCode(); |
-} |
- |
- |
#undef __ |
#define __ ACCESS_MASM(masm) |
void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
MacroAssembler* masm, |
- ExternalArrayType array_type) { |
+ JSObject::ElementsKind elements_kind) { |
// ----------- S t a t e ------------- |
// -- rax : key |
// -- rdx : receiver |
@@ -3256,30 +3222,30 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
// rbx: elements array |
__ movq(rbx, FieldOperand(rbx, ExternalArray::kExternalPointerOffset)); |
// rbx: base pointer of external storage |
- switch (array_type) { |
- case kExternalByteArray: |
+ switch (elements_kind) { |
+ case JSObject::EXTERNAL_BYTE_ELEMENTS: |
__ movsxbq(rcx, Operand(rbx, rcx, times_1, 0)); |
break; |
- case kExternalPixelArray: |
- case kExternalUnsignedByteArray: |
+ case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
__ movzxbq(rcx, Operand(rbx, rcx, times_1, 0)); |
break; |
- case kExternalShortArray: |
+ case JSObject::EXTERNAL_SHORT_ELEMENTS: |
__ movsxwq(rcx, Operand(rbx, rcx, times_2, 0)); |
break; |
- case kExternalUnsignedShortArray: |
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
__ movzxwq(rcx, Operand(rbx, rcx, times_2, 0)); |
break; |
- case kExternalIntArray: |
+ case JSObject::EXTERNAL_INT_ELEMENTS: |
__ movsxlq(rcx, Operand(rbx, rcx, times_4, 0)); |
break; |
- case kExternalUnsignedIntArray: |
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
__ movl(rcx, Operand(rbx, rcx, times_4, 0)); |
break; |
- case kExternalFloatArray: |
+ case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
__ cvtss2sd(xmm0, Operand(rbx, rcx, times_4, 0)); |
break; |
- case kExternalDoubleArray: |
+ case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
__ movsd(xmm0, Operand(rbx, rcx, times_8, 0)); |
break; |
default: |
@@ -3295,7 +3261,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
// xmm0: value as double. |
ASSERT(kSmiValueSize == 32); |
- if (array_type == kExternalUnsignedIntArray) { |
+ if (elements_kind == JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) { |
// For the UnsignedInt array type, we need to see whether |
// the value can be represented in a Smi. If not, we need to convert |
// it to a HeapNumber. |
@@ -3319,8 +3285,8 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
__ movsd(FieldOperand(rcx, HeapNumber::kValueOffset), xmm0); |
__ movq(rax, rcx); |
__ ret(0); |
- } else if (array_type == kExternalFloatArray || |
- array_type == kExternalDoubleArray) { |
+ } else if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS || |
+ elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
// For the floating-point array type, we need to always allocate a |
// HeapNumber. |
__ AllocateHeapNumber(rcx, rbx, &slow); |
@@ -3363,7 +3329,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray( |
void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
MacroAssembler* masm, |
- ExternalArrayType array_type) { |
+ JSObject::ElementsKind elements_kind) { |
// ----------- S t a t e ------------- |
// -- rax : value |
// -- rcx : key |
@@ -3393,7 +3359,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
// rbx: elements array |
// rdi: untagged key |
Label check_heap_number; |
- if (array_type == kExternalPixelArray) { |
+ if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) { |
// Float to pixel conversion is only implemented in the runtime for now. |
__ JumpIfNotSmi(rax, &slow); |
} else { |
@@ -3403,8 +3369,8 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
__ SmiToInteger32(rdx, rax); |
__ movq(rbx, FieldOperand(rbx, ExternalArray::kExternalPointerOffset)); |
// rbx: base pointer of external storage |
- switch (array_type) { |
- case kExternalPixelArray: |
+ switch (elements_kind) { |
+ case JSObject::EXTERNAL_PIXEL_ELEMENTS: |
{ // Clamp the value to [0..255]. |
Label done; |
__ testl(rdx, Immediate(0xFFFFFF00)); |
@@ -3415,36 +3381,38 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
} |
__ movb(Operand(rbx, rdi, times_1, 0), rdx); |
break; |
- case kExternalByteArray: |
- case kExternalUnsignedByteArray: |
+ case JSObject::EXTERNAL_BYTE_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
__ movb(Operand(rbx, rdi, times_1, 0), rdx); |
break; |
- case kExternalShortArray: |
- case kExternalUnsignedShortArray: |
+ case JSObject::EXTERNAL_SHORT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
__ movw(Operand(rbx, rdi, times_2, 0), rdx); |
break; |
- case kExternalIntArray: |
- case kExternalUnsignedIntArray: |
+ case JSObject::EXTERNAL_INT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
__ movl(Operand(rbx, rdi, times_4, 0), rdx); |
break; |
- case kExternalFloatArray: |
+ case JSObject::EXTERNAL_FLOAT_ELEMENTS: |
// Need to perform int-to-float conversion. |
__ cvtlsi2ss(xmm0, rdx); |
__ movss(Operand(rbx, rdi, times_4, 0), xmm0); |
break; |
- case kExternalDoubleArray: |
+ case JSObject::EXTERNAL_DOUBLE_ELEMENTS: |
// Need to perform int-to-float conversion. |
__ cvtlsi2sd(xmm0, rdx); |
__ movsd(Operand(rbx, rdi, times_8, 0), xmm0); |
break; |
- default: |
+ case JSObject::FAST_ELEMENTS: |
+ case JSObject::FAST_DOUBLE_ELEMENTS: |
+ case JSObject::DICTIONARY_ELEMENTS: |
UNREACHABLE(); |
break; |
} |
__ ret(0); |
// TODO(danno): handle heap number -> pixel array conversion |
- if (array_type != kExternalPixelArray) { |
+ if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) { |
__ bind(&check_heap_number); |
// rax: value |
// rcx: key (a smi) |
@@ -3463,11 +3431,11 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
// rdi: untagged index |
// rbx: base pointer of external storage |
// top of FPU stack: value |
- if (array_type == kExternalFloatArray) { |
+ if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) { |
__ cvtsd2ss(xmm0, xmm0); |
__ movss(Operand(rbx, rdi, times_4, 0), xmm0); |
__ ret(0); |
- } else if (array_type == kExternalDoubleArray) { |
+ } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) { |
__ movsd(Operand(rbx, rdi, times_8, 0), xmm0); |
__ ret(0); |
} else { |
@@ -3480,26 +3448,30 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray( |
// rdx: value (converted to an untagged integer) |
// rdi: untagged index |
// rbx: base pointer of external storage |
- switch (array_type) { |
- case kExternalByteArray: |
- case kExternalUnsignedByteArray: |
+ switch (elements_kind) { |
+ case JSObject::EXTERNAL_BYTE_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
__ cvttsd2si(rdx, xmm0); |
__ movb(Operand(rbx, rdi, times_1, 0), rdx); |
break; |
- case kExternalShortArray: |
- case kExternalUnsignedShortArray: |
+ case JSObject::EXTERNAL_SHORT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
__ cvttsd2si(rdx, xmm0); |
__ movw(Operand(rbx, rdi, times_2, 0), rdx); |
break; |
- case kExternalIntArray: |
- case kExternalUnsignedIntArray: { |
+ case JSObject::EXTERNAL_INT_ELEMENTS: |
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS: |
// Convert to int64, so that NaN and infinities become |
// 0x8000000000000000, which is zero mod 2^32. |
__ cvttsd2siq(rdx, xmm0); |
__ movl(Operand(rbx, rdi, times_4, 0), rdx); |
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; |
} |