Index: src/crankshaft/arm/lithium-codegen-arm.cc |
diff --git a/src/crankshaft/arm/lithium-codegen-arm.cc b/src/crankshaft/arm/lithium-codegen-arm.cc |
index 60b7c345a7cf5d185c63e273f9bbb0188763e655..6be1aeda4c29efb05727dc6c92a8db8ff4d21444 100644 |
--- a/src/crankshaft/arm/lithium-codegen-arm.cc |
+++ b/src/crankshaft/arm/lithium-codegen-arm.cc |
@@ -1932,8 +1932,14 @@ void LCodeGen::DoMathMinMax(LMathMinMax* instr) { |
// At this point, both left and right are either 0 or -0. |
if (operation == HMathMinMax::kMathMin) { |
// We could use a single 'vorr' instruction here if we had NEON support. |
+ // The algorithm is: -((-L) + (-R)), which in case of L and R being |
+ // different registers is most efficiently expressed as -((-L) - R). |
__ vneg(left_reg, left_reg); |
- __ vsub(result_reg, left_reg, right_reg); |
+ if (left_reg.is(right_reg)) { |
+ __ vadd(result_reg, left_reg, right_reg); |
+ } else { |
+ __ vsub(result_reg, left_reg, right_reg); |
+ } |
__ vneg(result_reg, result_reg); |
} else { |
// Since we operate on +0 and/or -0, vadd and vand have the same effect; |