Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Unified Diff: src/codegen-ia32.cc

Issue 13746: Experimental: thread live register references to deferred code.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/toiger/
Patch Set: '' Created 12 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/codegen.cc ('K') | « src/codegen.cc ('k') | src/jump-target-arm.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« src/codegen.cc ('K') | « src/codegen.cc ('k') | src/jump-target-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698