| Index: runtime/vm/intermediate_language_x64.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_x64.cc (revision 18309)
|
| +++ runtime/vm/intermediate_language_x64.cc (working copy)
|
| @@ -1143,7 +1143,9 @@
|
| case kArrayCid:
|
| case kInt8ArrayCid:
|
| case kUint8ArrayCid:
|
| + case kExternalUint8ArrayCid:
|
| case kUint8ClampedArrayCid:
|
| + case kExternalUint8ClampedArrayCid:
|
| case kInt16ArrayCid:
|
| case kUint16ArrayCid:
|
| case kInt32ArrayCid:
|
| @@ -1177,6 +1179,11 @@
|
| ? Location::WritableRegister()
|
| : Location::RegisterOrConstant(value()));
|
| break;
|
| + case kExternalUint8ArrayCid:
|
| + case kExternalUint8ClampedArrayCid:
|
| + // Need temp register to load the external array's data array.
|
| + locs->AddTemp(Location::RequiresRegister());
|
| + // Fall through.
|
| case kInt8ArrayCid:
|
| case kUint8ArrayCid:
|
| case kUint8ClampedArrayCid:
|
| @@ -1212,14 +1219,27 @@
|
| Location index = locs()->in(1);
|
|
|
| intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(class_id());
|
| + Address element_address(kNoRegister, 0);
|
| + if ((class_id() == kExternalUint8ArrayCid) ||
|
| + (class_id() == kExternalUint8ClampedArrayCid)) {
|
| + Register temp = locs()->temp(0).reg();
|
| + element_address = index.IsRegister()
|
| + ? FlowGraphCompiler::ExternalElementAddressForRegIndex(
|
| + class_id(), index_scale, temp, index.reg())
|
| + : FlowGraphCompiler::ExternalElementAddressForIntIndex(
|
| + class_id(), index_scale, temp,
|
| + Smi::Cast(index.constant()).Value());
|
| + __ movq(temp,
|
| + FieldAddress(array, ExternalUint8Array::data_offset()));
|
| + } else {
|
| + element_address = index.IsRegister()
|
| + ? FlowGraphCompiler::ElementAddressForRegIndex(
|
| + class_id(), index_scale, array, index.reg())
|
| + : FlowGraphCompiler::ElementAddressForIntIndex(
|
| + class_id(), index_scale, array,
|
| + Smi::Cast(index.constant()).Value());
|
| + }
|
|
|
| - FieldAddress element_address = index.IsRegister()
|
| - ? FlowGraphCompiler::ElementAddressForRegIndex(
|
| - class_id(), index_scale, array, index.reg())
|
| - : FlowGraphCompiler::ElementAddressForIntIndex(
|
| - class_id(), index_scale, array,
|
| - Smi::Cast(index.constant()).Value());
|
| -
|
| switch (class_id()) {
|
| case kArrayCid:
|
| if (ShouldEmitStoreBarrier()) {
|
| @@ -1235,6 +1255,7 @@
|
| break;
|
| case kInt8ArrayCid:
|
| case kUint8ArrayCid:
|
| + case kExternalUint8ArrayCid:
|
| if (index.IsRegister()) {
|
| __ SmiUntag(index.reg());
|
| }
|
| @@ -1251,7 +1272,8 @@
|
| __ SmiTag(index.reg()); // Re-tag.
|
| }
|
| break;
|
| - case kUint8ClampedArrayCid: {
|
| + case kUint8ClampedArrayCid:
|
| + case kExternalUint8ClampedArrayCid: {
|
| if (index.IsRegister()) {
|
| __ SmiUntag(index.reg());
|
| }
|
|
|