| 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;
|
| }
|
|
|