Index: src/ia32/codegen-ia32.cc |
diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc |
index d3e7de6741e3d078a1d24a062a28ead102c9a480..4b6c55ef1803b1fb7be7a3e6d2e49734dd0aa78c 100644 |
--- a/src/ia32/codegen-ia32.cc |
+++ b/src/ia32/codegen-ia32.cc |
@@ -7034,17 +7034,21 @@ void DeferredPrefixCountOperation::Generate() { |
} else { |
__ add(Operand(dst_), Immediate(Smi::FromInt(1))); |
} |
- __ push(dst_); |
- if (!input_type_.IsNumber()) { |
- __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); |
- __ push(eax); |
- } |
- __ push(Immediate(Smi::FromInt(1))); |
- if (is_increment_) { |
- __ CallRuntime(Runtime::kNumberAdd, 2); |
+ Register left; |
+ if (input_type_.IsNumber()) { |
+ left = dst_; |
} else { |
- __ CallRuntime(Runtime::kNumberSub, 2); |
+ __ push(dst_); |
+ __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); |
+ left = eax; |
} |
+ |
+ GenericBinaryOpStub stub(is_increment_ ? Token::ADD : Token::SUB, |
+ NO_OVERWRITE, |
+ NO_GENERIC_BINARY_FLAGS, |
+ TypeInfo::Number()); |
+ stub.GenerateCall(masm_, left, Smi::FromInt(1)); |
+ |
if (!dst_.is(eax)) __ mov(dst_, eax); |
} |
@@ -7084,23 +7088,23 @@ void DeferredPostfixCountOperation::Generate() { |
} else { |
__ add(Operand(dst_), Immediate(Smi::FromInt(1))); |
} |
+ Register left; |
if (input_type_.IsNumber()) { |
__ push(dst_); // Save the input to use as the old value. |
- __ push(dst_); |
+ left = dst_; |
} else { |
__ push(dst_); |
__ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); |
__ push(eax); // Save the result of ToNumber to use as the old value. |
- __ push(eax); |
+ left = eax; |
} |
- // Call the runtime for the addition or subtraction. |
- __ push(Immediate(Smi::FromInt(1))); |
- if (is_increment_) { |
- __ CallRuntime(Runtime::kNumberAdd, 2); |
- } else { |
- __ CallRuntime(Runtime::kNumberSub, 2); |
- } |
+ GenericBinaryOpStub stub(is_increment_ ? Token::ADD : Token::SUB, |
+ NO_OVERWRITE, |
+ NO_GENERIC_BINARY_FLAGS, |
+ TypeInfo::Number()); |
+ stub.GenerateCall(masm_, left, Smi::FromInt(1)); |
+ |
if (!dst_.is(eax)) __ mov(dst_, eax); |
__ pop(old_); |
} |