Index: runtime/vm/intermediate_language_x64.cc |
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc |
index 741698aceb24da4e444c8194a451bb5c3b2e3460..871e82861a090d7f7a831118d3e37442374bdfb7 100644 |
--- a/runtime/vm/intermediate_language_x64.cc |
+++ b/runtime/vm/intermediate_language_x64.cc |
@@ -968,9 +968,11 @@ Representation LoadIndexedInstr::representation() const { |
case kTypedDataUint16ArrayCid: |
case kOneByteStringCid: |
case kTwoByteStringCid: |
+ return kTagged; |
case kTypedDataInt32ArrayCid: |
+ return kUnboxedInt32; |
case kTypedDataUint32ArrayCid: |
- return kTagged; |
+ return kUnboxedUint32; |
case kTypedDataFloat32ArrayCid: |
case kTypedDataFloat64ArrayCid: |
return kUnboxedDouble; |
@@ -1052,6 +1054,29 @@ void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
return; |
} |
+ if ((representation() == kUnboxedUint32) || |
+ (representation() == kUnboxedInt32)) { |
+ if ((index_scale() == 1) && index.IsRegister()) { |
+ __ SmiUntag(index.reg()); |
+ } |
+ Register result = locs()->out(0).reg(); |
+ switch (class_id()) { |
+ case kTypedDataInt32ArrayCid: |
+ ASSERT(representation() == kUnboxedInt32); |
+ __ movsxd(result, element_address); |
+ break; |
+ case kTypedDataUint32ArrayCid: |
+ ASSERT(representation() == kUnboxedUint32); |
+ __ movl(result, element_address); |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ return; |
+ } |
+ |
+ ASSERT(representation() == kTagged); |
+ |
if ((index_scale() == 1) && index.IsRegister()) { |
__ SmiUntag(index.reg()); |
} |
@@ -1078,14 +1103,6 @@ void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
__ movzxw(result, element_address); |
__ SmiTag(result); |
break; |
- case kTypedDataInt32ArrayCid: |
- __ movsxd(result, element_address); |
- __ SmiTag(result); |
- break; |
- case kTypedDataUint32ArrayCid: |
- __ movl(result, element_address); |
- __ SmiTag(result); |
- break; |
default: |
ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); |
__ movq(result, element_address); |