From bfa152df59fbefdc5e2cdf3940f635482e270ae8 Mon Sep 17 00:00:00 2001 From: "vegorov@google.com" Date: Tue, 2 Dec 2014 13:19:03 +0000 Subject: [PATCH] Support non-deoptimizing version of UnboxInt32 for integer definitions. If range analysis infered that integer definition is within Int32 range then it is guaranteed to be either Smi or Mint. BUG=http://dartbug.com/21763 R=fschneider@google.com Review URL: https://codereview.chromium.org//770303002 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@42065 260f80e4-7a28-3924-810f-c04153c831b5 --- runtime/vm/intermediate_language.cc | 4 ++++ runtime/vm/intermediate_language_arm.cc | 5 +++++ runtime/vm/intermediate_language_ia32.cc | 7 +++++++ runtime/vm/intermediate_language_mips.cc | 7 +++++++ 4 files changed, 23 insertions(+) diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc index 036bf803769..e7d138f06c8 100644 --- a/runtime/vm/intermediate_language.cc +++ b/runtime/vm/intermediate_language.cc @@ -1202,6 +1202,10 @@ bool UnboxInt32Instr::CanDeoptimize() const { return !is_truncating() && !RangeUtils::Fits(value()->definition()->range(), RangeBoundary::kRangeBoundaryInt32); + } else if ((kSmiBits < 32) && value()->Type()->IsInt()) { + // Note: we don't support truncation of Bigint values. + return !RangeUtils::Fits(value()->definition()->range(), + RangeBoundary::kRangeBoundaryInt32); } else { return true; } diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc index c6f82c95a39..3bc55576fb8 100644 --- a/runtime/vm/intermediate_language_arm.cc +++ b/runtime/vm/intermediate_language_arm.cc @@ -3986,6 +3986,11 @@ void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { __ SmiUntag(out, value); } else if (value_cid == kMintCid) { LoadInt32FromMint(compiler, value, out, temp, out_of_range); + } else if (!CanDeoptimize()) { + Label done; + __ SmiUntag(out, value, &done); + LoadInt32FromMint(compiler, value, out, kNoRegister, NULL); + __ Bind(&done); } else { Label done; __ SmiUntag(out, value, &done); diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc index 76096c3a700..75b4d092362 100644 --- a/runtime/vm/intermediate_language_ia32.cc +++ b/runtime/vm/intermediate_language_ia32.cc @@ -3673,6 +3673,13 @@ void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { FieldAddress(value, hi_offset), temp, out_of_range); + } else if (!CanDeoptimize()) { + ASSERT(value == result); + Label done; + __ SmiUntag(value); + __ j(NOT_CARRY, &done); + __ movl(value, Address(value, TIMES_2, lo_offset)); + __ Bind(&done); } else { ASSERT(value == result); Label done; diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc index 1257aed0d75..ae1115d3a75 100644 --- a/runtime/vm/intermediate_language_mips.cc +++ b/runtime/vm/intermediate_language_mips.cc @@ -3347,6 +3347,13 @@ void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { __ SmiUntag(out, value); } else if (value_cid == kMintCid) { LoadInt32FromMint(compiler, value, out, out_of_range); + } else if (!CanDeoptimize()) { + Label done; + __ SmiUntag(out, value); + __ andi(CMPRES1, value, Immediate(kSmiTagMask)); + __ beq(CMPRES1, ZR, &done); + LoadInt32FromMint(compiler, value, out, NULL); + __ Bind(&done); } else { Label done; __ SmiUntag(out, value);