Index: src/x64/ic-x64.cc |
diff --git a/src/x64/ic-x64.cc b/src/x64/ic-x64.cc |
index ee3a309b14018867255d74fbc63c9ba94c33b34f..7108025a7bba89b9ede551f2ee29c0bbe9b18f56 100644 |
--- a/src/x64/ic-x64.cc |
+++ b/src/x64/ic-x64.cc |
@@ -131,8 +131,8 @@ static void GenerateDictionaryLoad(MacroAssembler* masm, Label* miss_label, |
// Check that the value is a normal property. |
__ bind(&done); |
const int kDetailsOffset = kElementsStartOffset + 2 * kPointerSize; |
- __ testl(Operand(r0, r1, times_pointer_size, kDetailsOffset - kHeapObjectTag), |
- Immediate(Smi::FromInt(PropertyDetails::TypeField::mask()))); |
+ __ Test(Operand(r0, r1, times_pointer_size, kDetailsOffset - kHeapObjectTag), |
+ Smi::FromInt(PropertyDetails::TypeField::mask())); |
__ j(not_zero, miss_label); |
// Get the value at the masked, scaled index. |
@@ -336,13 +336,13 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { |
__ testb(FieldOperand(rdx, Map::kInstanceTypeOffset), |
Immediate(kIsSymbolMask)); |
__ j(zero, &slow); |
- // Probe the dictionary leaving result in ecx. |
+ // Probe the dictionary leaving result in rcx. |
GenerateDictionaryLoad(masm, &slow, rbx, rcx, rdx, rax); |
GenerateCheckNonObjectOrLoaded(masm, &slow, rcx); |
__ movq(rax, rcx); |
__ IncrementCounter(&Counters::keyed_load_generic_symbol, 1); |
__ ret(0); |
- // Array index string: If short enough use cache in length/hash field (ebx). |
+ // Array index string: If short enough use cache in length/hash field (rbx). |
// We assert that there are enough bits in an int32_t after the hash shift |
// bits have been subtracted to allow space for the length and the cached |
// array index. |
@@ -434,9 +434,6 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { |
__ movq(rbx, Operand(rsp, 1 * kPointerSize)); // 1 ~ return address |
// Check that the key is a smi. |
__ JumpIfNotSmi(rbx, &slow); |
- // If it is a smi, make sure it is zero-extended, so it can be |
- // used as an index in a memory operand. |
- __ movl(rbx, rbx); // Clear the high bits of rbx. |
__ CmpInstanceType(rcx, JS_ARRAY_TYPE); |
__ j(equal, &array); |
@@ -447,7 +444,7 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { |
// Object case: Check key against length in the elements array. |
// rax: value |
// rdx: JSObject |
- // rbx: index (as a smi), zero-extended. |
+ // rbx: index (as a smi) |
__ movq(rcx, FieldOperand(rdx, JSObject::kElementsOffset)); |
// Check that the object is in fast mode (not dictionary). |
__ CompareRoot(FieldOperand(rcx, HeapObject::kMapOffset), |
@@ -508,15 +505,15 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { |
// rdx: JSArray |
// rcx: FixedArray |
// rbx: index (as a smi) |
- // flags: compare (rbx, rdx.length()) |
+ // flags: smicompare (rdx.length(), rbx) |
__ j(not_equal, &slow); // do not leave holes in the array |
__ SmiToInteger64(rbx, rbx); |
__ cmpl(rbx, FieldOperand(rcx, FixedArray::kLengthOffset)); |
__ j(above_equal, &slow); |
// Increment and restore smi-tag. |
- __ Integer64AddToSmi(rbx, rbx, 1); |
+ __ Integer64PlusConstantToSmi(rbx, rbx, 1); |
__ movq(FieldOperand(rdx, JSArray::kLengthOffset), rbx); |
- __ SmiSubConstant(rbx, rbx, 1, NULL); |
+ __ SmiSubConstant(rbx, rbx, Smi::FromInt(1)); |
__ jmp(&fast); |
// Array case: Get the length and the elements array from the JS |
@@ -527,25 +524,36 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { |
// rdx: JSArray |
// rbx: index (as a smi) |
__ movq(rcx, FieldOperand(rdx, JSObject::kElementsOffset)); |
- __ Cmp(FieldOperand(rcx, HeapObject::kMapOffset), Factory::fixed_array_map()); |
+ __ CompareRoot(FieldOperand(rcx, HeapObject::kMapOffset), |
+ Heap::kFixedArrayMapRootIndex); |
__ j(not_equal, &slow); |
// Check the key against the length in the array, compute the |
// address to store into and fall through to fast case. |
- __ cmpl(rbx, FieldOperand(rdx, JSArray::kLengthOffset)); |
- __ j(above_equal, &extra); |
+ __ SmiCompare(FieldOperand(rdx, JSArray::kLengthOffset), rbx); |
+ __ j(below_equal, &extra); |
// Fast case: Do the store. |
__ bind(&fast); |
// rax: value |
// rcx: FixedArray |
// rbx: index (as a smi) |
- __ movq(Operand(rcx, rbx, times_half_pointer_size, |
+ Label non_smi_value; |
+ __ JumpIfNotSmi(rax, &non_smi_value); |
+ SmiIndex index = masm->SmiToIndex(rbx, rbx, kPointerSizeLog2); |
+ __ movq(Operand(rcx, index.reg, index.scale, |
FixedArray::kHeaderSize - kHeapObjectTag), |
- rax); |
+ rax); |
+ __ ret(0); |
+ __ bind(&non_smi_value); |
+ // Slow case that needs to retain rbx for use by RecordWrite. |
// Update write barrier for the elements array address. |
+ SmiIndex index2 = masm->SmiToIndex(kScratchRegister, rbx, kPointerSizeLog2); |
+ __ movq(Operand(rcx, index2.reg, index2.scale, |
+ FixedArray::kHeaderSize - kHeapObjectTag), |
+ rax); |
__ movq(rdx, rax); |
- __ RecordWrite(rcx, 0, rdx, rbx); |
+ __ RecordWriteNonSmi(rcx, 0, rdx, rbx); |
__ ret(0); |
} |