| Index: src/ia32/stub-cache-ia32.cc
|
| diff --git a/src/ia32/stub-cache-ia32.cc b/src/ia32/stub-cache-ia32.cc
|
| index 73f42a3d18fca38e895a73acb7c20deae166094d..4a37b07c71cfb6f12f1ced4e54fc58768362edb0 100644
|
| --- a/src/ia32/stub-cache-ia32.cc
|
| +++ b/src/ia32/stub-cache-ia32.cc
|
| @@ -3400,37 +3400,37 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
|
| __ JumpIfNotSmi(eax, &miss_force_generic);
|
|
|
| // Check that the index is in range.
|
| - __ mov(ecx, eax);
|
| - __ SmiUntag(ecx); // Untag the index.
|
| __ mov(ebx, FieldOperand(edx, JSObject::kElementsOffset));
|
| - __ cmp(ecx, FieldOperand(ebx, ExternalArray::kLengthOffset));
|
| + __ cmp(eax, FieldOperand(ebx, ExternalArray::kLengthOffset));
|
| // Unsigned comparison catches both negative and too-large values.
|
| __ j(above_equal, &miss_force_generic);
|
| __ mov(ebx, FieldOperand(ebx, ExternalArray::kExternalPointerOffset));
|
| // ebx: base pointer of external storage
|
| switch (elements_kind) {
|
| case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
| - __ movsx_b(eax, Operand(ebx, ecx, times_1, 0));
|
| + __ SmiUntag(eax); // Untag the index.
|
| + __ movsx_b(eax, Operand(ebx, eax, times_1, 0));
|
| break;
|
| case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
| case JSObject::EXTERNAL_PIXEL_ELEMENTS:
|
| - __ movzx_b(eax, Operand(ebx, ecx, times_1, 0));
|
| + __ SmiUntag(eax); // Untag the index.
|
| + __ movzx_b(eax, Operand(ebx, eax, times_1, 0));
|
| break;
|
| case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
| - __ movsx_w(eax, Operand(ebx, ecx, times_2, 0));
|
| + __ movsx_w(eax, Operand(ebx, eax, times_1, 0));
|
| break;
|
| case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
| - __ movzx_w(eax, Operand(ebx, ecx, times_2, 0));
|
| + __ movzx_w(eax, Operand(ebx, eax, times_1, 0));
|
| break;
|
| case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
| case JSObject::EXTERNAL_INT_ELEMENTS:
|
| - __ mov(ecx, Operand(ebx, ecx, times_4, 0));
|
| + __ mov(ecx, Operand(ebx, eax, times_2, 0));
|
| break;
|
| case JSObject::EXTERNAL_FLOAT_ELEMENTS:
|
| - __ fld_s(Operand(ebx, ecx, times_4, 0));
|
| + __ fld_s(Operand(ebx, eax, times_2, 0));
|
| break;
|
| case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
|
| - __ fld_d(Operand(ebx, ecx, times_8, 0));
|
| + __ fld_d(Operand(ebx, eax, times_4, 0));
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -3556,9 +3556,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
|
|
| // Check that the index is in range.
|
| __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset));
|
| - __ mov(ebx, ecx);
|
| - __ SmiUntag(ebx);
|
| - __ cmp(ebx, FieldOperand(edi, ExternalArray::kLengthOffset));
|
| + __ cmp(ecx, FieldOperand(edi, ExternalArray::kLengthOffset));
|
| // Unsigned comparison catches both negative and too-large values.
|
| __ j(above_equal, &slow);
|
|
|
| @@ -3568,7 +3566,6 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
| // edx: receiver
|
| // ecx: key
|
| // edi: elements array
|
| - // ebx: untagged index
|
| if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) {
|
| __ JumpIfNotSmi(eax, &slow);
|
| } else {
|
| @@ -3576,44 +3573,39 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
| }
|
|
|
| // smi case
|
| - __ mov(ecx, eax); // Preserve the value in eax. Key is no longer needed.
|
| - __ SmiUntag(ecx);
|
| + __ mov(ebx, eax); // Preserve the value in eax as the return value.
|
| + __ SmiUntag(ebx);
|
| __ mov(edi, FieldOperand(edi, ExternalArray::kExternalPointerOffset));
|
| - // ecx: base pointer of external storage
|
| + // edi: base pointer of external storage
|
| switch (elements_kind) {
|
| case JSObject::EXTERNAL_PIXEL_ELEMENTS:
|
| - { // Clamp the value to [0..255].
|
| - Label done;
|
| - __ test(ecx, Immediate(0xFFFFFF00));
|
| - __ j(zero, &done, Label::kNear);
|
| - __ setcc(negative, ecx); // 1 if negative, 0 if positive.
|
| - __ dec_b(ecx); // 0 if negative, 255 if positive.
|
| - __ bind(&done);
|
| - }
|
| - __ mov_b(Operand(edi, ebx, times_1, 0), ecx);
|
| + __ ClampUint8(ebx);
|
| + __ SmiUntag(ecx);
|
| + __ mov_b(Operand(edi, ecx, times_1, 0), ebx);
|
| break;
|
| case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
| case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
| - __ mov_b(Operand(edi, ebx, times_1, 0), ecx);
|
| + __ SmiUntag(ecx);
|
| + __ mov_b(Operand(edi, ecx, times_1, 0), ebx);
|
| break;
|
| case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
| case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
| - __ mov_w(Operand(edi, ebx, times_2, 0), ecx);
|
| + __ mov_w(Operand(edi, ecx, times_1, 0), ebx);
|
| break;
|
| case JSObject::EXTERNAL_INT_ELEMENTS:
|
| case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
|
| - __ mov(Operand(edi, ebx, times_4, 0), ecx);
|
| + __ mov(Operand(edi, ecx, times_2, 0), ebx);
|
| break;
|
| case JSObject::EXTERNAL_FLOAT_ELEMENTS:
|
| case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
|
| // Need to perform int-to-float conversion.
|
| - __ push(ecx);
|
| + __ push(ebx);
|
| __ fild_s(Operand(esp, 0));
|
| - __ pop(ecx);
|
| + __ pop(ebx);
|
| if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) {
|
| - __ fstp_s(Operand(edi, ebx, times_4, 0));
|
| + __ fstp_s(Operand(edi, ecx, times_2, 0));
|
| } else { // elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS.
|
| - __ fstp_d(Operand(edi, ebx, times_8, 0));
|
| + __ fstp_d(Operand(edi, ecx, times_4, 0));
|
| }
|
| break;
|
| default:
|
| @@ -3629,7 +3621,6 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
| // edx: receiver
|
| // ecx: key
|
| // edi: elements array
|
| - // ebx: untagged index
|
| __ cmp(FieldOperand(eax, HeapObject::kMapOffset),
|
| Immediate(masm->isolate()->factory()->heap_number_map()));
|
| __ j(not_equal, &slow);
|
| @@ -3638,15 +3629,14 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
| // +/-Infinity into integer arrays basically undefined. For more
|
| // reproducible behavior, convert these to zero.
|
| __ mov(edi, FieldOperand(edi, ExternalArray::kExternalPointerOffset));
|
| - // ebx: untagged index
|
| // edi: base pointer of external storage
|
| if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) {
|
| __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset));
|
| - __ fstp_s(Operand(edi, ebx, times_4, 0));
|
| + __ fstp_s(Operand(edi, ecx, times_2, 0));
|
| __ ret(0);
|
| } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) {
|
| __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset));
|
| - __ fstp_d(Operand(edi, ebx, times_8, 0));
|
| + __ fstp_d(Operand(edi, ecx, times_4, 0));
|
| __ ret(0);
|
| } else {
|
| // Perform float-to-int conversion with truncation (round-to-zero)
|
| @@ -3661,27 +3651,20 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
| elements_kind != JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) {
|
| ASSERT(CpuFeatures::IsSupported(SSE2));
|
| CpuFeatures::Scope scope(SSE2);
|
| - __ cvttsd2si(ecx, FieldOperand(eax, HeapNumber::kValueOffset));
|
| + __ cvttsd2si(ebx, FieldOperand(eax, HeapNumber::kValueOffset));
|
| // ecx: untagged integer value
|
| switch (elements_kind) {
|
| case JSObject::EXTERNAL_PIXEL_ELEMENTS:
|
| - { // Clamp the value to [0..255].
|
| - Label done;
|
| - __ test(ecx, Immediate(0xFFFFFF00));
|
| - __ j(zero, &done, Label::kNear);
|
| - __ setcc(negative, ecx); // 1 if negative, 0 if positive.
|
| - __ dec_b(ecx); // 0 if negative, 255 if positive.
|
| - __ bind(&done);
|
| - }
|
| - __ mov_b(Operand(edi, ebx, times_1, 0), ecx);
|
| - break;
|
| + __ ClampUint8(ebx);
|
| + // Fall through.
|
| case JSObject::EXTERNAL_BYTE_ELEMENTS:
|
| case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
| - __ mov_b(Operand(edi, ebx, times_1, 0), ecx);
|
| + __ SmiUntag(ecx);
|
| + __ mov_b(Operand(edi, ecx, times_1, 0), ebx);
|
| break;
|
| case JSObject::EXTERNAL_SHORT_ELEMENTS:
|
| case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
| - __ mov_w(Operand(edi, ebx, times_2, 0), ecx);
|
| + __ mov_w(Operand(edi, ecx, times_1, 0), ebx);
|
| break;
|
| default:
|
| UNREACHABLE();
|
| @@ -3698,7 +3681,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
| __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset));
|
| __ sub(Operand(esp), Immediate(2 * kPointerSize));
|
| __ fisttp_d(Operand(esp, 0));
|
| - __ pop(ecx);
|
| + __ pop(ebx);
|
| __ add(Operand(esp), Immediate(kPointerSize));
|
| } else {
|
| ASSERT(CpuFeatures::IsSupported(SSE2));
|
| @@ -3709,15 +3692,15 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
|
| // Note: we could do better for signed int arrays.
|
| __ movd(xmm0, FieldOperand(eax, HeapNumber::kValueOffset));
|
| // We will need the key if we have to make the slow runtime call.
|
| - __ push(ecx);
|
| - __ LoadPowerOf2(xmm1, ecx, 31);
|
| - __ pop(ecx);
|
| + __ push(ebx);
|
| + __ LoadPowerOf2(xmm1, ebx, 31);
|
| + __ pop(ebx);
|
| __ ucomisd(xmm1, xmm0);
|
| __ j(above_equal, &slow);
|
| - __ cvttsd2si(ecx, Operand(xmm0));
|
| + __ cvttsd2si(ebx, Operand(xmm0));
|
| }
|
| - // ecx: untagged integer value
|
| - __ mov(Operand(edi, ebx, times_4, 0), ecx);
|
| + // ebx: untagged integer value
|
| + __ mov(Operand(edi, ecx, times_2, 0), ebx);
|
| }
|
| __ ret(0); // Return original value.
|
| }
|
|
|