Index: src/x64/stub-cache-x64.cc |
diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc |
index fed783f1e5f4bba9703bfaf72d86f437a80c86df..1e103ac263162a593c801975dd623e7182be775f 100644 |
--- a/src/x64/stub-cache-x64.cc |
+++ b/src/x64/stub-cache-x64.cc |
@@ -985,30 +985,30 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, |
Label call_builtin, exit, with_write_barrier, attempt_to_grow_elements; |
// Get the array's length into rax and calculate new length. |
- __ movq(rax, FieldOperand(rdx, JSArray::kLengthOffset)); |
+ __ SmiToInteger32(rax, FieldOperand(rdx, JSArray::kLengthOffset)); |
STATIC_ASSERT(FixedArray::kMaxLength < Smi::kMaxValue); |
- __ SmiAddConstant(rax, rax, Smi::FromInt(argc)); |
+ __ addl(rax, Immediate(argc)); |
// Get the element's length into rcx. |
- __ movq(rcx, FieldOperand(rbx, FixedArray::kLengthOffset)); |
+ __ SmiToInteger32(rcx, FieldOperand(rbx, FixedArray::kLengthOffset)); |
// Check if we could survive without allocation. |
- __ SmiCompare(rax, rcx); |
+ __ cmpl(rax, rcx); |
__ j(greater, &attempt_to_grow_elements); |
// Save new length. |
- __ movq(FieldOperand(rdx, JSArray::kLengthOffset), rax); |
+ __ Integer32ToSmiField(FieldOperand(rdx, JSArray::kLengthOffset), rax); |
// Push the element. |
__ movq(rcx, Operand(rsp, argc * kPointerSize)); |
- SmiIndex index = |
- masm()->SmiToIndex(kScratchRegister, rax, times_pointer_size); |
__ lea(rdx, FieldOperand(rbx, |
- index.reg, index.scale, |
+ rax, times_pointer_size, |
FixedArray::kHeaderSize - argc * kPointerSize)); |
__ movq(Operand(rdx, 0), rcx); |
// Check if value is a smi. |
+ __ Integer32ToSmi(rax, rax); // Return new length as smi. |
+ |
__ JumpIfNotSmi(rcx, &with_write_barrier); |
__ bind(&exit); |
@@ -1020,6 +1020,7 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, |
RecordWriteStub stub(rbx, rdx, rcx); |
__ CallStub(&stub); |
+ |
__ ret((argc + 1) * kPointerSize); |
__ bind(&attempt_to_grow_elements); |
@@ -1034,9 +1035,8 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, |
__ movq(rcx, Operand(rcx, 0)); |
// Check if it's the end of elements. |
- index = masm()->SmiToIndex(kScratchRegister, rax, times_pointer_size); |
__ lea(rdx, FieldOperand(rbx, |
- index.reg, index.scale, |
+ rax, times_pointer_size, |
FixedArray::kHeaderSize - argc * kPointerSize)); |
__ cmpq(rdx, rcx); |
__ j(not_equal, &call_builtin); |
@@ -1064,8 +1064,9 @@ Object* CallStubCompiler::CompileArrayPushCall(Object* object, |
// Increment element's and array's sizes. |
__ SmiAddConstant(FieldOperand(rbx, FixedArray::kLengthOffset), |
Smi::FromInt(kAllocationDelta)); |
+ // Make new length a smi before returning it. |
+ __ Integer32ToSmi(rax, rax); |
__ movq(FieldOperand(rdx, JSArray::kLengthOffset), rax); |
- |
// Elements are in new space, so write barrier is not required. |
__ ret((argc + 1) * kPointerSize); |
@@ -1128,28 +1129,26 @@ Object* CallStubCompiler::CompileArrayPopCall(Object* object, |
__ j(not_equal, &miss); |
// Get the array's length into rcx and calculate new length. |
- __ movq(rcx, FieldOperand(rdx, JSArray::kLengthOffset)); |
- __ SmiSubConstant(rcx, rcx, Smi::FromInt(1)); |
- __ SmiTest(rcx); |
+ __ SmiToInteger32(rcx, FieldOperand(rdx, JSArray::kLengthOffset)); |
+ __ subl(rcx, Immediate(1)); |
__ j(negative, &return_undefined); |
// Get the last element. |
__ Move(r9, Factory::the_hole_value()); |
- SmiIndex index = |
- masm()->SmiToIndex(r8, rcx, times_pointer_size); |
__ movq(rax, FieldOperand(rbx, |
- index.reg, index.scale, |
+ rcx, times_pointer_size, |
FixedArray::kHeaderSize)); |
// Check if element is already the hole. |
__ cmpq(rax, r9); |
+ // If so, call slow-case to also check prototypes for value. |
__ j(equal, &call_builtin); |
// Set the array's length. |
- __ movq(FieldOperand(rdx, JSArray::kLengthOffset), rcx); |
+ __ Integer32ToSmiField(FieldOperand(rdx, JSArray::kLengthOffset), rcx); |
- // Fill with the hole and return original value.. |
+ // Fill with the hole and return original value. |
__ movq(FieldOperand(rbx, |
- index.reg, index.scale, |
+ rcx, times_pointer_size, |
FixedArray::kHeaderSize), |
r9); |
__ ret((argc + 1) * kPointerSize); |