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);