Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(563)

Unified Diff: runtime/vm/intermediate_language_ia32.cc

Issue 12086045: On Ia32 optimistically assume that results from int32 and uint32 array loads fit into Smi. Only if … (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698