Index: src/ia32/ic-ia32.cc |
=================================================================== |
--- src/ia32/ic-ia32.cc (revision 4722) |
+++ src/ia32/ic-ia32.cc (working copy) |
@@ -304,7 +304,7 @@ |
// -- edx : receiver |
// -- esp[0] : return address |
// ----------------------------------- |
- Label slow, check_string, index_smi, index_string; |
+ Label slow, check_string, index_int, index_string; |
Label check_pixel_array, probe_dictionary; |
Label check_number_dictionary; |
@@ -329,17 +329,18 @@ |
// Check that the key is a smi. |
__ test(eax, Immediate(kSmiTagMask)); |
__ j(not_zero, &check_string, not_taken); |
+ __ mov(ebx, eax); |
+ __ SmiUntag(ebx); |
// Get the elements array of the object. |
- __ bind(&index_smi); |
+ __ bind(&index_int); |
__ mov(ecx, FieldOperand(edx, JSObject::kElementsOffset)); |
// Check that the object is in fast mode (not dictionary). |
__ CheckMap(ecx, Factory::fixed_array_map(), &check_pixel_array, true); |
// Check that the key (index) is within bounds. |
- __ cmp(eax, FieldOperand(ecx, FixedArray::kLengthOffset)); |
+ __ cmp(ebx, FieldOperand(ecx, FixedArray::kLengthOffset)); |
__ j(above_equal, &slow); |
// Fast case: Do the load. |
- ASSERT((kPointerSize == 4) && (kSmiTagSize == 1) && (kSmiTag == 0)); |
- __ mov(ecx, FieldOperand(ecx, eax, times_2, FixedArray::kHeaderSize)); |
+ __ mov(ecx, FieldOperand(ecx, ebx, times_4, FixedArray::kHeaderSize)); |
__ cmp(Operand(ecx), Immediate(Factory::the_hole_value())); |
// In case the loaded value is the_hole we have to consult GetProperty |
// to ensure the prototype chain is searched. |
@@ -351,10 +352,9 @@ |
__ bind(&check_pixel_array); |
// Check whether the elements is a pixel array. |
// edx: receiver |
+ // ebx: untagged index |
// eax: key |
// ecx: elements |
- __ mov(ebx, eax); |
- __ SmiUntag(ebx); |
__ CheckMap(ecx, Factory::pixel_array_map(), &check_number_dictionary, true); |
__ cmp(ebx, FieldOperand(ecx, PixelArray::kLengthOffset)); |
__ j(above_equal, &slow); |
@@ -485,13 +485,9 @@ |
ASSERT(TenToThe(String::kMaxCachedArrayIndexLength) < |
(1 << String::kArrayIndexValueBits)); |
__ bind(&index_string); |
- // We want the smi-tagged index in eax. kArrayIndexValueMask has zeros in |
- // the low kHashShift bits. |
- ASSERT(String::kHashShift >= kSmiTagSize); |
- __ and_(ebx, String::kArrayIndexValueMask); |
- __ shr(ebx, String::kHashShift - kSmiTagSize); |
- __ mov(eax, ebx); |
- __ jmp(&index_smi); |
+ __ and_(ebx, String::kArrayIndexHashMask); |
+ __ shr(ebx, String::kHashShift); |
+ __ jmp(&index_int); |
} |
@@ -796,7 +792,9 @@ |
__ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
// Check that the object is in fast mode (not dictionary). |
__ CheckMap(edi, Factory::fixed_array_map(), &check_pixel_array, true); |
- __ cmp(ecx, FieldOperand(edi, FixedArray::kLengthOffset)); |
+ __ mov(ebx, Operand(ecx)); |
+ __ SmiUntag(ebx); |
+ __ cmp(ebx, FieldOperand(edi, Array::kLengthOffset)); |
__ j(below, &fast, taken); |
// Slow case: call runtime. |
@@ -806,7 +804,7 @@ |
// Check whether the elements is a pixel array. |
__ bind(&check_pixel_array); |
// eax: value |
- // ecx: key (a smi) |
+ // ecx: key |
// edx: receiver |
// edi: elements array |
__ CheckMap(edi, Factory::pixel_array_map(), &slow, true); |
@@ -842,11 +840,13 @@ |
// edi: receiver->elements, a FixedArray |
// flags: compare (ecx, edx.length()) |
__ j(not_equal, &slow, not_taken); // do not leave holes in the array |
- __ cmp(ecx, FieldOperand(edi, FixedArray::kLengthOffset)); |
+ __ mov(ebx, ecx); |
+ __ SmiUntag(ebx); // untag |
+ __ cmp(ebx, FieldOperand(edi, Array::kLengthOffset)); |
__ j(above_equal, &slow, not_taken); |
// Add 1 to receiver->length, and go to fast array write. |
__ add(FieldOperand(edx, JSArray::kLengthOffset), |
- Immediate(Smi::FromInt(1))); |
+ Immediate(1 << kSmiTagSize)); |
__ jmp(&fast); |
// Array case: Get the length and the elements array from the JS |