Chromium Code Reviews| Index: src/codegen-ia32.cc |
| =================================================================== |
| --- src/codegen-ia32.cc (revision 969) |
| +++ src/codegen-ia32.cc (working copy) |
| @@ -567,7 +567,8 @@ |
| // ECMA-262, section 9.2, page 30: ToBoolean(). Pop the top of stack and |
| // convert it to a boolean in the condition code register or jump to |
| // 'false_target'/'true_target' as appropriate. |
| -void CodeGenerator::ToBoolean(JumpTarget* true_target, JumpTarget* false_target) { |
| +void CodeGenerator::ToBoolean(JumpTarget* true_target, |
| + JumpTarget* false_target) { |
| Comment cmnt(masm_, "[ ToBoolean"); |
| // The value to convert should be popped from the stack. |
| @@ -775,7 +776,7 @@ |
| // the deferred code jump back before the assignment to the frame |
| // top, but this is just to let the peephole optimizer get rid of |
| // more code. |
| - deferred->exit()->Bind(); |
| + deferred->BindExit(); |
| __ mov(frame_->Top(), eax); |
| } else { |
| // Call the stub and push the result to the stack. |
| @@ -960,10 +961,10 @@ |
| } |
| frame_->EmitPop(eax); |
| __ add(Operand(eax), Immediate(value)); |
| - deferred->enter()->Branch(overflow, not_taken); |
| + deferred->BranchTo(overflow); |
| __ test(eax, Immediate(kSmiTagMask)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| - deferred->exit()->Bind(); |
| + deferred->BranchTo(not_zero); |
| + deferred->BindExit(); |
| frame_->EmitPush(eax); |
| break; |
| } |
| @@ -980,10 +981,10 @@ |
| __ mov(eax, Immediate(value)); |
| __ sub(eax, Operand(edx)); |
| } |
| - deferred->enter()->Branch(overflow, not_taken); |
| + deferred->BranchTo(overflow); |
| __ test(eax, Immediate(kSmiTagMask)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| - deferred->exit()->Bind(); |
| + deferred->BranchTo(not_zero); |
| + deferred->BindExit(); |
| frame_->EmitPush(eax); |
| break; |
| } |
| @@ -1001,10 +1002,10 @@ |
| overwrite_mode); |
| frame_->EmitPop(eax); |
| __ test(eax, Immediate(kSmiTagMask)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| + deferred->BranchTo(not_zero); |
| __ sar(eax, shift_value); |
| __ and_(eax, ~kSmiTagMask); |
| - deferred->exit()->Bind(); |
| + deferred->BindExit(); |
| frame_->EmitPush(eax); |
| } |
| break; |
| @@ -1024,15 +1025,15 @@ |
| frame_->EmitPop(eax); |
| __ test(eax, Immediate(kSmiTagMask)); |
| __ mov(ebx, Operand(eax)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| + deferred->BranchTo(not_zero); |
| __ sar(ebx, kSmiTagSize); |
| __ shr(ebx, shift_value); |
| __ test(ebx, Immediate(0xc0000000)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| + deferred->BranchTo(not_zero); |
| // tag result and store it in TOS (eax) |
| ASSERT(kSmiTagSize == times_2); // adjust code if not the case |
| __ lea(eax, Operand(ebx, ebx, times_1, kSmiTag)); |
| - deferred->exit()->Bind(); |
| + deferred->BindExit(); |
| frame_->EmitPush(eax); |
| } |
| break; |
| @@ -1052,16 +1053,16 @@ |
| frame_->EmitPop(eax); |
| __ test(eax, Immediate(kSmiTagMask)); |
| __ mov(ebx, Operand(eax)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| + deferred->BranchTo(not_zero); |
| __ sar(ebx, kSmiTagSize); |
| __ shl(ebx, shift_value); |
| __ lea(ecx, Operand(ebx, 0x40000000)); |
| __ test(ecx, Immediate(0x80000000)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| + deferred->BranchTo(not_zero); |
| // tag result and store it in TOS (eax) |
| ASSERT(kSmiTagSize == times_2); // adjust code if not the case |
| __ lea(eax, Operand(ebx, ebx, times_1, kSmiTag)); |
| - deferred->exit()->Bind(); |
| + deferred->BindExit(); |
| frame_->EmitPush(eax); |
| } |
| break; |
| @@ -1080,7 +1081,7 @@ |
| } |
| frame_->EmitPop(eax); |
| __ test(eax, Immediate(kSmiTagMask)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| + deferred->BranchTo(not_zero); |
| if (op == Token::BIT_AND) { |
| __ and_(Operand(eax), Immediate(value)); |
| } else if (op == Token::BIT_XOR) { |
| @@ -1089,7 +1090,7 @@ |
| ASSERT(op == Token::BIT_OR); |
| __ or_(Operand(eax), Immediate(value)); |
| } |
| - deferred->exit()->Bind(); |
| + deferred->BindExit(); |
| frame_->EmitPush(eax); |
| break; |
| } |
| @@ -1222,10 +1223,10 @@ |
| new SmiComparisonDeferred(this, cc, strict, int_value); |
| frame_->EmitPop(eax); |
| __ test(eax, Immediate(kSmiTagMask)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| + deferred->BranchTo(not_zero); |
|
William Hesse
2008/12/16 09:10:54
Will conflict with my changes, I think
|
| // Test smi equality by pointer comparison. |
| __ cmp(Operand(eax), Immediate(value)); |
| - deferred->exit()->Bind(); |
| + deferred->BindExit(); |
| cc_reg_ = cc; |
| } |
| @@ -2709,8 +2710,8 @@ |
| // Check whether we need to materialize the RegExp object. |
| // If so, jump to the deferred code. |
| __ cmp(ebx, Factory::undefined_value()); |
| - deferred->enter()->Branch(equal, not_taken); |
| - deferred->exit()->Bind(); |
| + deferred->BranchTo(equal); |
| + deferred->BindExit(); |
| // Push the literal. |
| frame_->EmitPush(ebx); |
| @@ -2770,8 +2771,8 @@ |
| // Check whether we need to materialize the object literal boilerplate. |
| // If so, jump to the deferred code. |
| __ cmp(ebx, Factory::undefined_value()); |
| - deferred->enter()->Branch(equal, not_taken); |
| - deferred->exit()->Bind(); |
| + deferred->BranchTo(equal); |
| + deferred->BindExit(); |
| // Push the literal. |
| frame_->EmitPush(ebx); |
| @@ -3773,12 +3774,12 @@ |
| // If the count operation didn't overflow and the result is a |
| // valid smi, we're done. Otherwise, we jump to the deferred |
| // slow-case code. |
| - deferred->enter()->Branch(overflow, not_taken); |
| + deferred->BranchTo(overflow); |
| __ test(eax, Immediate(kSmiTagMask)); |
| - deferred->enter()->Branch(not_zero, not_taken); |
| + deferred->BranchTo(not_zero); |
| // Store the new value in the target if not const. |
| - deferred->exit()->Bind(); |
| + deferred->BindExit(); |
| frame_->EmitPush(eax); // Push the new value to TOS |
| if (!is_const) target.SetValue(NOT_CONST_INIT); |
| } |
| @@ -4094,8 +4095,6 @@ |
| // Uncommon case: typeof testing against a string literal that is |
| // never returned from the typeof operator. |
| false_target()->Jump(); |
| - // TODO(): Can this cause a problem because it is an expression that |
| - // exits without a virtual frame in place? |
| } |
| return; |
| } |
| @@ -4395,12 +4394,12 @@ |
| switch (op_) { |
| case Token::ADD: |
| __ add(eax, Operand(ebx)); // add optimistically |
| - enter()->Branch(overflow, not_taken); |
| + BranchTo(overflow); |
| break; |
| case Token::SUB: |
| __ sub(eax, Operand(ebx)); // subtract optimistically |
| - enter()->Branch(overflow, not_taken); |
| + BranchTo(overflow); |
| break; |
| case Token::DIV: |
| @@ -4409,7 +4408,7 @@ |
| __ cdq(); |
| // Check for 0 divisor. |
| __ test(ebx, Operand(ebx)); |
| - enter()->Branch(zero, not_taken); |
| + BranchTo(zero); |
| break; |
| default: |
| @@ -4420,7 +4419,7 @@ |
| // Perform the actual smi check. |
| ASSERT(kSmiTag == 0); // adjust zero check if not the case |
| __ test(ecx, Immediate(kSmiTagMask)); |
| - enter()->Branch(not_zero, not_taken); |
| + BranchTo(not_zero); |
| switch (op_) { |
| case Token::ADD: |
| @@ -4436,9 +4435,12 @@ |
| // Do multiplication. |
| __ imul(eax, Operand(ebx)); // multiplication of smis; result in eax |
| // Go slow on overflows. |
| - enter()->Branch(overflow, not_taken); |
| - // Check for negative zero result. Use ecx = x | y. |
| - __ NegativeZeroTest(generator(), eax, ecx, enter()); |
| + BranchTo(overflow); |
| + // Check for negative zero result. Use ecx = x | y. NegativeZeroTest |
| + // must be called after the deferred code has already been branched to |
| + // via BranchTo, because NegativeZeroTest will not set the entry frame |
| + // or register file for the deferred code. |
| + __ NegativeZeroTest(eax, ecx, enter()); |
| break; |
| case Token::DIV: |
| @@ -4449,12 +4451,15 @@ |
| // by idiv instruction. |
| ASSERT(kSmiTag == 0 && kSmiTagSize == 1); |
| __ cmp(eax, 0x40000000); |
| - enter()->Branch(equal); |
| - // Check for negative zero result. Use ecx = x | y. |
| - __ NegativeZeroTest(generator(), eax, ecx, enter()); |
| + BranchTo(equal); |
| + // Check for negative zero result. Use ecx = x | y. NegativeZeroTest |
| + // must be called after the deferred code has already been branched to |
| + // via BranchTo, because NegativeZeroTest will not set the entry frame |
| + // or register file for the deferred code. |
| + __ NegativeZeroTest(eax, ecx, enter()); |
| // Check that the remainder is zero. |
| __ test(edx, Operand(edx)); |
| - enter()->Branch(not_zero); |
| + BranchTo(not_zero); |
| // Tag the result and store it in register eax. |
| ASSERT(kSmiTagSize == times_2); // adjust code if not the case |
| __ lea(eax, Operand(eax, eax, times_1, kSmiTag)); |
| @@ -4463,8 +4468,11 @@ |
| case Token::MOD: |
| // Divide edx:eax by ebx. |
| __ idiv(ebx); |
| - // Check for negative zero result. Use ecx = x | y. |
| - __ NegativeZeroTest(generator(), edx, ecx, enter()); |
| + // Check for negative zero result. Use ecx = x | y. NegativeZeroTest |
| + // must be called after the deferred code has already been branched to |
| + // via BranchTo, because NegativeZeroTest will not set the entry frame |
| + // or register file for the deferred code. |
| + __ NegativeZeroTest(edx, ecx, enter()); |
| // Move remainder to register eax. |
| __ mov(eax, Operand(edx)); |
| break; |
| @@ -4504,14 +4512,14 @@ |
| // Smi tagging these two cases can only happen with shifts |
| // by 0 or 1 when handed a valid smi. |
| __ test(eax, Immediate(0xc0000000)); |
| - enter()->Branch(not_zero, not_taken); |
| + BranchTo(not_zero); |
| break; |
| case Token::SHL: |
| __ shl(eax); |
| // Check that the *signed* result fits in a smi. |
| __ lea(ecx, Operand(eax, 0x40000000)); |
| __ test(ecx, Immediate(0x80000000)); |
| - enter()->Branch(not_zero, not_taken); |
| + BranchTo(not_zero); |
| break; |
| default: |
| UNREACHABLE(); |