Index: runtime/vm/flow_graph_compiler.cc |
=================================================================== |
--- runtime/vm/flow_graph_compiler.cc (revision 17016) |
+++ runtime/vm/flow_graph_compiler.cc (working copy) |
@@ -1027,54 +1027,76 @@ |
} |
-FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid, |
- Register array, |
- intptr_t offset) { |
+intptr_t FlowGraphCompiler::ElementSizeFor(intptr_t cid) { |
switch (cid) { |
case kArrayCid: |
- case kImmutableArrayCid: { |
- const intptr_t disp = offset * kWordSize + sizeof(RawArray); |
- ASSERT(Utils::IsInt(31, disp)); |
- return FieldAddress(array, disp); |
- } |
- case kFloat32ArrayCid: { |
- const intptr_t disp = |
- offset * kFloatSize + Float32Array::data_offset(); |
- ASSERT(Utils::IsInt(31, disp)); |
- return FieldAddress(array, disp); |
- } |
- case kFloat64ArrayCid: { |
- const intptr_t disp = |
- offset * kDoubleSize + Float64Array::data_offset(); |
- ASSERT(Utils::IsInt(31, disp)); |
- return FieldAddress(array, disp); |
- } |
- case kUint8ArrayCid: { |
- const intptr_t disp = offset + Uint8Array::data_offset(); |
- ASSERT(Utils::IsInt(31, disp)); |
- return FieldAddress(array, disp); |
- } |
- case kUint8ClampedArrayCid: { |
- const intptr_t disp = offset + Uint8ClampedArray::data_offset(); |
- ASSERT(Utils::IsInt(31, disp)); |
- return FieldAddress(array, disp); |
- } |
+ case kImmutableArrayCid: |
+ return Array::kBytesPerElement; |
+ case kFloat32ArrayCid: |
+ return Float32Array::kBytesPerElement; |
+ case kFloat64ArrayCid: |
+ return Float64Array::kBytesPerElement; |
+ case kUint8ArrayCid: |
+ return Uint8Array::kBytesPerElement; |
+ case kUint8ClampedArrayCid: |
+ return Uint8ClampedArray::kBytesPerElement; |
+ case kOneByteStringCid: |
+ return OneByteString::kBytesPerElement; |
+ case kTwoByteStringCid: |
+ return TwoByteString::kBytesPerElement; |
default: |
UNIMPLEMENTED(); |
- return FieldAddress(SPREG, 0); |
+ return 0; |
} |
} |
+intptr_t FlowGraphCompiler::DataOffsetFor(intptr_t cid) { |
+ switch (cid) { |
+ case kArrayCid: |
+ case kImmutableArrayCid: |
+ return Array::data_offset(); |
+ case kFloat32ArrayCid: |
+ return Float32Array::data_offset(); |
+ case kFloat64ArrayCid: |
+ return Float64Array::data_offset(); |
+ case kUint8ArrayCid: |
+ return Uint8Array::data_offset(); |
+ case kUint8ClampedArrayCid: |
+ return Uint8ClampedArray::data_offset(); |
+ case kOneByteStringCid: |
+ return OneByteString::data_offset(); |
+ case kTwoByteStringCid: |
+ return TwoByteString::data_offset(); |
+ default: |
+ UNIMPLEMENTED(); |
+ return Array::data_offset(); |
+ } |
+} |
+ |
+ |
+FieldAddress FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid, |
+ Register array, |
+ intptr_t index) { |
+ const int64_t disp = |
+ static_cast<int64_t>(index) * ElementSizeFor(cid) + DataOffsetFor(cid); |
+ ASSERT(Utils::IsInt(32, disp)); |
+ return FieldAddress(array, static_cast<int32_t>(disp)); |
+} |
+ |
+ |
FieldAddress FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid, |
Register array, |
Register index) { |
- // Note that index is Smi, i.e, times 2. |
+ // Note that index is smi-tagged, (i.e, times 2) for all arrays with element |
+ // size > 1. For Uint8Array and OneByteString the index is expected to be |
+ // untagged before accessing. |
ASSERT(kSmiTagShift == 1); |
switch (cid) { |
case kArrayCid: |
case kImmutableArrayCid: |
- return FieldAddress(array, index, TIMES_HALF_WORD_SIZE, sizeof(RawArray)); |
+ return FieldAddress( |
+ array, index, TIMES_HALF_WORD_SIZE, Array::data_offset()); |
case kFloat32ArrayCid: |
return FieldAddress(array, index, TIMES_2, Float32Array::data_offset()); |
case kFloat64ArrayCid: |
@@ -1084,6 +1106,10 @@ |
case kUint8ClampedArrayCid: |
return |
FieldAddress(array, index, TIMES_1, Uint8ClampedArray::data_offset()); |
+ case kOneByteStringCid: |
+ return FieldAddress(array, index, TIMES_1, OneByteString::data_offset()); |
+ case kTwoByteStringCid: |
+ return FieldAddress(array, index, TIMES_1, TwoByteString::data_offset()); |
default: |
UNIMPLEMENTED(); |
return FieldAddress(SPREG, 0); |