From 70331f67f9280c49d2f13ffa867a141bb80e8cca Mon Sep 17 00:00:00 2001 From: "erik.corry@gmail.com" Date: Wed, 1 Jul 2009 11:32:08 +0000 Subject: [PATCH] ARM: Don't always go into the runtime system just because a mul gave zero. Review URL: http://codereview.chromium.org/151144 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2318 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/codegen-arm.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc index 989a09c..5cc4824 100644 --- a/src/arm/codegen-arm.cc +++ b/src/arm/codegen-arm.cc @@ -5334,7 +5334,13 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) { __ tst(r3, Operand(r3)); __ mov(r0, Operand(r3), LeaveCC, ne); __ Ret(ne); - // Slow case. + // We need -0 if we were multiplying a negative number with 0 to get 0. + // We know one of them was zero. + __ add(r2, r0, Operand(r1), SetCC); + __ mov(r0, Operand(Smi::FromInt(0)), LeaveCC, pl); + __ Ret(pl); // Return Smi 0 if the non-zero one was positive. + // Slow case. We fall through here if we multiplied a negative number + // with 0, because that would mean we should produce -0. __ bind(&slow); HandleBinaryOpSlowCases(masm, -- 2.7.4