Index: src/mips/code-stubs-mips.cc |
diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc |
index 47a0a8ea7930394875b406521881cda289432e48..f134cc09f7dab8e7125eb7d463f883c618d042c7 100644 |
--- a/src/mips/code-stubs-mips.cc |
+++ b/src/mips/code-stubs-mips.cc |
@@ -823,10 +823,14 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
__ Move(double_result, 1.0); |
// Get absolute value of exponent. |
- Label positive_exponent; |
+ Label positive_exponent, bail_out; |
__ Branch(&positive_exponent, ge, scratch, Operand(zero_reg)); |
__ Subu(scratch, zero_reg, scratch); |
+ // Check when Subu overflows and we get negative result |
+ // (happens only when input is MIN_INT). |
+ __ Branch(&bail_out, gt, zero_reg, Operand(scratch)); |
__ bind(&positive_exponent); |
+ __ Assert(ge, kUnexpectedNegativeValue, scratch, Operand(zero_reg)); |
Label while_true, no_carry, loop_end; |
__ bind(&while_true); |
@@ -859,6 +863,7 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
__ cvt_d_w(double_exponent, single_scratch); |
// Returning or bailing out. |
+ __ bind(&bail_out); |
__ push(ra); |
{ |
AllowExternalCallThatCantCauseGC scope(masm); |