Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 5269) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -1250,7 +1250,7 @@ |
if (left_info_.IsSmi()) { |
// Right is a heap object. |
__ JumpIfNotNumber(right_, right_info_, entry_label()); |
- __ ConvertToInt32(right_, right_, dst_, left_info_, entry_label()); |
+ __ ConvertToInt32(right_, right_, dst_, right_info_, entry_label()); |
__ mov(dst_, Operand(left_)); |
__ SmiUntag(dst_); |
} else if (right_info_.IsSmi()) { |
@@ -1270,11 +1270,11 @@ |
// Both were heap objects. |
__ rcl(right_, 1); // Put tag back. |
__ JumpIfNotNumber(right_, right_info_, entry_label()); |
- __ ConvertToInt32(right_, right_, no_reg, left_info_, entry_label()); |
+ __ ConvertToInt32(right_, right_, no_reg, right_info_, entry_label()); |
__ jmp(&got_both); |
__ bind(&only_right_is_heap_object); |
__ JumpIfNotNumber(right_, right_info_, entry_label()); |
- __ ConvertToInt32(right_, right_, no_reg, left_info_, entry_label()); |
+ __ ConvertToInt32(right_, right_, no_reg, right_info_, entry_label()); |
__ bind(&got_both); |
} |
} |
@@ -1940,6 +1940,7 @@ |
// Use a fresh answer register to avoid spilling the left operand. |
answer = allocator_->Allocate(); |
ASSERT(answer.is_valid()); |
+ |
DeferredInlineBinaryOperation* deferred = |
new DeferredInlineBinaryOperation(op, |
answer.reg(), |
@@ -4605,10 +4606,11 @@ |
// loop. edx: i'th entry of the enum cache (or string there of) |
frame_->EmitPush(ebx); |
{ Reference each(this, node->each()); |
- // Loading a reference may leave the frame in an unspilled state. |
- frame_->SpillAll(); |
if (!each.is_illegal()) { |
if (each.size() > 0) { |
+ // Loading a reference may leave the frame in an unspilled state. |
+ frame_->SpillAll(); |
+ // Get the value (under the reference on the stack) from memory. |
frame_->EmitPush(frame_->ElementAt(each.size())); |
each.SetValue(NOT_CONST_INIT); |
frame_->Drop(2); |