Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 4588) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -1426,6 +1426,9 @@ |
Result* left, |
Result* right, |
OverwriteMode overwrite_mode) { |
+ // Copy the type info because left and right may be overwritten. |
+ TypeInfo left_type_info = left->type_info(); |
+ TypeInfo right_type_info = right->type_info(); |
Token::Value op = expr->op(); |
Result answer; |
// Special handling of div and mod because they use fixed registers. |
@@ -1501,8 +1504,8 @@ |
(op == Token::DIV) ? eax : edx, |
left->reg(), |
right->reg(), |
- left->type_info(), |
- right->type_info(), |
+ left_type_info, |
+ right_type_info, |
overwrite_mode); |
if (left->reg().is(right->reg())) { |
__ test(left->reg(), Immediate(kSmiTagMask)); |
@@ -1605,18 +1608,18 @@ |
answer.reg(), |
left->reg(), |
ecx, |
- left->type_info(), |
- right->type_info(), |
+ left_type_info, |
+ right_type_info, |
overwrite_mode); |
Label do_op, left_nonsmi; |
// If right is a smi we make a fast case if left is either a smi |
// or a heapnumber. |
- if (CpuFeatures::IsSupported(SSE2) && right->type_info().IsSmi()) { |
+ if (CpuFeatures::IsSupported(SSE2) && right_type_info.IsSmi()) { |
CpuFeatures::Scope use_sse2(SSE2); |
__ mov(answer.reg(), left->reg()); |
// Fast case - both are actually smis. |
- if (!left->type_info().IsSmi()) { |
+ if (!left_type_info.IsSmi()) { |
__ test(answer.reg(), Immediate(kSmiTagMask)); |
__ j(not_zero, &left_nonsmi); |
} else { |
@@ -1640,7 +1643,7 @@ |
deferred->Branch(negative); |
} else { |
CheckTwoForSminess(masm_, left->reg(), right->reg(), answer.reg(), |
- left->type_info(), right->type_info(), deferred); |
+ left_type_info, right_type_info, deferred); |
// Untag both operands. |
__ mov(answer.reg(), left->reg()); |
@@ -1713,11 +1716,11 @@ |
answer.reg(), |
left->reg(), |
right->reg(), |
- left->type_info(), |
- right->type_info(), |
+ left_type_info, |
+ right_type_info, |
overwrite_mode); |
CheckTwoForSminess(masm_, left->reg(), right->reg(), answer.reg(), |
- left->type_info(), right->type_info(), deferred); |
+ left_type_info, right_type_info, deferred); |
__ mov(answer.reg(), left->reg()); |
switch (op) { |
@@ -1988,18 +1991,13 @@ |
} |
-Result CodeGenerator::ConstantSmiBinaryOperation( |
- BinaryOperation* expr, |
- Result* operand, |
- Handle<Object> value, |
- bool reversed, |
- OverwriteMode overwrite_mode) { |
- // NOTE: This is an attempt to inline (a bit) more of the code for |
- // some possible smi operations (like + and -) when (at least) one |
- // of the operands is a constant smi. |
- // Consumes the argument "operand". |
- // TODO(199): Optimize some special cases of operations involving a |
- // smi literal (multiply by 2, shift by 0, etc.). |
+Result CodeGenerator::ConstantSmiBinaryOperation(BinaryOperation* expr, |
+ Result* operand, |
+ Handle<Object> value, |
+ bool reversed, |
+ OverwriteMode overwrite_mode) { |
+ // Generate inline code for a binary operation when one of the |
+ // operands is a constant smi. Consumes the argument "operand". |
if (IsUnsafeSmi(value)) { |
Result unsafe_operand(value); |
if (reversed) { |