| Index: runtime/vm/intermediate_language_ia32.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_ia32.cc (revision 17771)
|
| +++ runtime/vm/intermediate_language_ia32.cc (working copy)
|
| @@ -1114,7 +1114,9 @@
|
| case kInt32ArrayCid:
|
| case kUint32ArrayCid:
|
| // Result can be smi or mint when boxed.
|
| - return kDynamicCid;
|
| + // Optimistic assumption that result is Smi means that the instruction
|
| + // can deoptimize.
|
| + return CanDeoptimize() ? kSmiCid : kDynamicCid;
|
| default:
|
| UNIMPLEMENTED();
|
| return kDynamicCid;
|
| @@ -1137,7 +1139,9 @@
|
| return kTagged;
|
| case kInt32ArrayCid:
|
| case kUint32ArrayCid:
|
| - return kUnboxedMint;
|
| + // Optimistic assumption that result is Smi means that the instruction
|
| + // can deoptimize.
|
| + return CanDeoptimize() ? kTagged : kUnboxedMint;
|
| case kFloat32ArrayCid :
|
| case kFloat64ArrayCid :
|
| return kUnboxedDouble;
|
| @@ -1253,6 +1257,24 @@
|
| __ movzxw(result, element_address);
|
| __ SmiTag(result);
|
| break;
|
| + case kInt32ArrayCid: {
|
| + Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptInt32Load);
|
| + __ movl(result, element_address);
|
| + // Verify that the signed value in 'result' can fit inside a Smi.
|
| + __ cmpl(result, Immediate(0xC0000000));
|
| + __ j(NEGATIVE, deopt);
|
| + __ SmiTag(result);
|
| + }
|
| + break;
|
| + case kUint32ArrayCid: {
|
| + Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptUint32Load);
|
| + __ movl(result, element_address);
|
| + // Verify that the unsigned value in 'result' can fit inside a Smi.
|
| + __ testl(result, Immediate(0xC0000000));
|
| + __ j(NOT_ZERO, deopt);
|
| + __ SmiTag(result);
|
| + }
|
| + break;
|
| default:
|
| ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
|
| __ movl(result, element_address);
|
|
|