MIPS: Remove the forward-bailout stack from the non-optimizing compiler.

Port r9863 (0996dc77)

Original commit message:
This was pretty heavyweight.  It was kept in just for a few corner cases
that assumed it was there.  We can work around them by making sure that the
expression in a reified test context is always really the expression that
was visited in that context; and by inspecting the context manually and
consing up a pair of extra AST IDs for the unusual case of unary not in a
value AST context.

BUG=
TEST=

Review URL: http://codereview.chromium.org/8372085
Patch from Gergely Kis <gergely@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9865 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent aaba9d8f
...@@ -405,7 +405,7 @@ void FullCodeGenerator::StackValueContext::Plug(Variable* var) const { ...@@ -405,7 +405,7 @@ void FullCodeGenerator::StackValueContext::Plug(Variable* var) const {
void FullCodeGenerator::TestContext::Plug(Variable* var) const { void FullCodeGenerator::TestContext::Plug(Variable* var) const {
// For simplicity we always test the accumulator register. // For simplicity we always test the accumulator register.
codegen()->GetVar(result_register(), var); codegen()->GetVar(result_register(), var);
codegen()->PrepareForBailoutBeforeSplit(false, NULL, NULL); codegen()->PrepareForBailoutBeforeSplit(condition(), false, NULL, NULL);
codegen()->DoTest(this); codegen()->DoTest(this);
} }
...@@ -428,7 +428,7 @@ void FullCodeGenerator::StackValueContext::Plug( ...@@ -428,7 +428,7 @@ void FullCodeGenerator::StackValueContext::Plug(
void FullCodeGenerator::TestContext::Plug(Heap::RootListIndex index) const { void FullCodeGenerator::TestContext::Plug(Heap::RootListIndex index) const {
codegen()->PrepareForBailoutBeforeSplit(TOS_REG, codegen()->PrepareForBailoutBeforeSplit(condition(),
true, true,
true_label_, true_label_,
false_label_); false_label_);
...@@ -463,7 +463,7 @@ void FullCodeGenerator::StackValueContext::Plug(Handle<Object> lit) const { ...@@ -463,7 +463,7 @@ void FullCodeGenerator::StackValueContext::Plug(Handle<Object> lit) const {
void FullCodeGenerator::TestContext::Plug(Handle<Object> lit) const { void FullCodeGenerator::TestContext::Plug(Handle<Object> lit) const {
codegen()->PrepareForBailoutBeforeSplit(TOS_REG, codegen()->PrepareForBailoutBeforeSplit(condition(),
true, true,
true_label_, true_label_,
false_label_); false_label_);
...@@ -522,7 +522,7 @@ void FullCodeGenerator::TestContext::DropAndPlug(int count, ...@@ -522,7 +522,7 @@ void FullCodeGenerator::TestContext::DropAndPlug(int count,
// For simplicity we always test the accumulator register. // For simplicity we always test the accumulator register.
__ Drop(count); __ Drop(count);
__ Move(result_register(), reg); __ Move(result_register(), reg);
codegen()->PrepareForBailoutBeforeSplit(false, NULL, NULL); codegen()->PrepareForBailoutBeforeSplit(condition(), false, NULL, NULL);
codegen()->DoTest(this); codegen()->DoTest(this);
} }
...@@ -589,7 +589,7 @@ void FullCodeGenerator::StackValueContext::Plug(bool flag) const { ...@@ -589,7 +589,7 @@ void FullCodeGenerator::StackValueContext::Plug(bool flag) const {
void FullCodeGenerator::TestContext::Plug(bool flag) const { void FullCodeGenerator::TestContext::Plug(bool flag) const {
codegen()->PrepareForBailoutBeforeSplit(TOS_REG, codegen()->PrepareForBailoutBeforeSplit(condition(),
true, true,
true_label_, true_label_,
false_label_); false_label_);
...@@ -692,7 +692,7 @@ void FullCodeGenerator::SetVar(Variable* var, ...@@ -692,7 +692,7 @@ void FullCodeGenerator::SetVar(Variable* var,
} }
void FullCodeGenerator::PrepareForBailoutBeforeSplit(State state, void FullCodeGenerator::PrepareForBailoutBeforeSplit(Expression* expr,
bool should_normalize, bool should_normalize,
Label* if_true, Label* if_true,
Label* if_false) { Label* if_false) {
...@@ -703,13 +703,7 @@ void FullCodeGenerator::PrepareForBailoutBeforeSplit(State state, ...@@ -703,13 +703,7 @@ void FullCodeGenerator::PrepareForBailoutBeforeSplit(State state,
Label skip; Label skip;
if (should_normalize) __ Branch(&skip); if (should_normalize) __ Branch(&skip);
PrepareForBailout(expr, TOS_REG);
ForwardBailoutStack* current = forward_bailout_stack_;
while (current != NULL) {
PrepareForBailout(current->expr(), state);
current = current->parent();
}
if (should_normalize) { if (should_normalize) {
__ LoadRoot(t0, Heap::kTrueValueRootIndex); __ LoadRoot(t0, Heap::kTrueValueRootIndex);
Split(eq, a0, Operand(t0), if_true, if_false, NULL); Split(eq, a0, Operand(t0), if_true, if_false, NULL);
...@@ -2401,7 +2395,8 @@ void FullCodeGenerator::VisitCallNew(CallNew* expr) { ...@@ -2401,7 +2395,8 @@ void FullCodeGenerator::VisitCallNew(CallNew* expr) {
} }
void FullCodeGenerator::EmitIsSmi(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsSmi(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2413,7 +2408,7 @@ void FullCodeGenerator::EmitIsSmi(ZoneList<Expression*>* args) { ...@@ -2413,7 +2408,7 @@ void FullCodeGenerator::EmitIsSmi(ZoneList<Expression*>* args) {
context()->PrepareTest(&materialize_true, &materialize_false, context()->PrepareTest(&materialize_true, &materialize_false,
&if_true, &if_false, &fall_through); &if_true, &if_false, &fall_through);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
__ And(t0, v0, Operand(kSmiTagMask)); __ And(t0, v0, Operand(kSmiTagMask));
Split(eq, t0, Operand(zero_reg), if_true, if_false, fall_through); Split(eq, t0, Operand(zero_reg), if_true, if_false, fall_through);
...@@ -2421,7 +2416,8 @@ void FullCodeGenerator::EmitIsSmi(ZoneList<Expression*>* args) { ...@@ -2421,7 +2416,8 @@ void FullCodeGenerator::EmitIsSmi(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitIsNonNegativeSmi(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsNonNegativeSmi(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2433,7 +2429,7 @@ void FullCodeGenerator::EmitIsNonNegativeSmi(ZoneList<Expression*>* args) { ...@@ -2433,7 +2429,7 @@ void FullCodeGenerator::EmitIsNonNegativeSmi(ZoneList<Expression*>* args) {
context()->PrepareTest(&materialize_true, &materialize_false, context()->PrepareTest(&materialize_true, &materialize_false,
&if_true, &if_false, &fall_through); &if_true, &if_false, &fall_through);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
__ And(at, v0, Operand(kSmiTagMask | 0x80000000)); __ And(at, v0, Operand(kSmiTagMask | 0x80000000));
Split(eq, at, Operand(zero_reg), if_true, if_false, fall_through); Split(eq, at, Operand(zero_reg), if_true, if_false, fall_through);
...@@ -2441,7 +2437,8 @@ void FullCodeGenerator::EmitIsNonNegativeSmi(ZoneList<Expression*>* args) { ...@@ -2441,7 +2437,8 @@ void FullCodeGenerator::EmitIsNonNegativeSmi(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitIsObject(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsObject(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2463,7 +2460,7 @@ void FullCodeGenerator::EmitIsObject(ZoneList<Expression*>* args) { ...@@ -2463,7 +2460,7 @@ void FullCodeGenerator::EmitIsObject(ZoneList<Expression*>* args) {
__ Branch(if_false, ne, at, Operand(zero_reg)); __ Branch(if_false, ne, at, Operand(zero_reg));
__ lbu(a1, FieldMemOperand(a2, Map::kInstanceTypeOffset)); __ lbu(a1, FieldMemOperand(a2, Map::kInstanceTypeOffset));
__ Branch(if_false, lt, a1, Operand(FIRST_NONCALLABLE_SPEC_OBJECT_TYPE)); __ Branch(if_false, lt, a1, Operand(FIRST_NONCALLABLE_SPEC_OBJECT_TYPE));
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(le, a1, Operand(LAST_NONCALLABLE_SPEC_OBJECT_TYPE), Split(le, a1, Operand(LAST_NONCALLABLE_SPEC_OBJECT_TYPE),
if_true, if_false, fall_through); if_true, if_false, fall_through);
...@@ -2471,7 +2468,8 @@ void FullCodeGenerator::EmitIsObject(ZoneList<Expression*>* args) { ...@@ -2471,7 +2468,8 @@ void FullCodeGenerator::EmitIsObject(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitIsSpecObject(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsSpecObject(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2485,7 +2483,7 @@ void FullCodeGenerator::EmitIsSpecObject(ZoneList<Expression*>* args) { ...@@ -2485,7 +2483,7 @@ void FullCodeGenerator::EmitIsSpecObject(ZoneList<Expression*>* args) {
__ JumpIfSmi(v0, if_false); __ JumpIfSmi(v0, if_false);
__ GetObjectType(v0, a1, a1); __ GetObjectType(v0, a1, a1);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(ge, a1, Operand(FIRST_SPEC_OBJECT_TYPE), Split(ge, a1, Operand(FIRST_SPEC_OBJECT_TYPE),
if_true, if_false, fall_through); if_true, if_false, fall_through);
...@@ -2493,7 +2491,8 @@ void FullCodeGenerator::EmitIsSpecObject(ZoneList<Expression*>* args) { ...@@ -2493,7 +2491,8 @@ void FullCodeGenerator::EmitIsSpecObject(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitIsUndetectableObject(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsUndetectableObject(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2509,7 +2508,7 @@ void FullCodeGenerator::EmitIsUndetectableObject(ZoneList<Expression*>* args) { ...@@ -2509,7 +2508,7 @@ void FullCodeGenerator::EmitIsUndetectableObject(ZoneList<Expression*>* args) {
__ lw(a1, FieldMemOperand(v0, HeapObject::kMapOffset)); __ lw(a1, FieldMemOperand(v0, HeapObject::kMapOffset));
__ lbu(a1, FieldMemOperand(a1, Map::kBitFieldOffset)); __ lbu(a1, FieldMemOperand(a1, Map::kBitFieldOffset));
__ And(at, a1, Operand(1 << Map::kIsUndetectable)); __ And(at, a1, Operand(1 << Map::kIsUndetectable));
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(ne, at, Operand(zero_reg), if_true, if_false, fall_through); Split(ne, at, Operand(zero_reg), if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
...@@ -2517,8 +2516,8 @@ void FullCodeGenerator::EmitIsUndetectableObject(ZoneList<Expression*>* args) { ...@@ -2517,8 +2516,8 @@ void FullCodeGenerator::EmitIsUndetectableObject(ZoneList<Expression*>* args) {
void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf(
ZoneList<Expression*>* args) { CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2594,12 +2593,13 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( ...@@ -2594,12 +2593,13 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf(
__ sb(a2, FieldMemOperand(a1, Map::kBitField2Offset)); __ sb(a2, FieldMemOperand(a1, Map::kBitField2Offset));
__ jmp(if_true); __ jmp(if_true);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }
void FullCodeGenerator::EmitIsFunction(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsFunction(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2613,7 +2613,7 @@ void FullCodeGenerator::EmitIsFunction(ZoneList<Expression*>* args) { ...@@ -2613,7 +2613,7 @@ void FullCodeGenerator::EmitIsFunction(ZoneList<Expression*>* args) {
__ JumpIfSmi(v0, if_false); __ JumpIfSmi(v0, if_false);
__ GetObjectType(v0, a1, a2); __ GetObjectType(v0, a1, a2);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
__ Branch(if_true, eq, a2, Operand(JS_FUNCTION_TYPE)); __ Branch(if_true, eq, a2, Operand(JS_FUNCTION_TYPE));
__ Branch(if_false); __ Branch(if_false);
...@@ -2621,7 +2621,8 @@ void FullCodeGenerator::EmitIsFunction(ZoneList<Expression*>* args) { ...@@ -2621,7 +2621,8 @@ void FullCodeGenerator::EmitIsFunction(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitIsArray(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsArray(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2635,7 +2636,7 @@ void FullCodeGenerator::EmitIsArray(ZoneList<Expression*>* args) { ...@@ -2635,7 +2636,7 @@ void FullCodeGenerator::EmitIsArray(ZoneList<Expression*>* args) {
__ JumpIfSmi(v0, if_false); __ JumpIfSmi(v0, if_false);
__ GetObjectType(v0, a1, a1); __ GetObjectType(v0, a1, a1);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(eq, a1, Operand(JS_ARRAY_TYPE), Split(eq, a1, Operand(JS_ARRAY_TYPE),
if_true, if_false, fall_through); if_true, if_false, fall_through);
...@@ -2643,7 +2644,8 @@ void FullCodeGenerator::EmitIsArray(ZoneList<Expression*>* args) { ...@@ -2643,7 +2644,8 @@ void FullCodeGenerator::EmitIsArray(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitIsRegExp(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsRegExp(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2657,15 +2659,15 @@ void FullCodeGenerator::EmitIsRegExp(ZoneList<Expression*>* args) { ...@@ -2657,15 +2659,15 @@ void FullCodeGenerator::EmitIsRegExp(ZoneList<Expression*>* args) {
__ JumpIfSmi(v0, if_false); __ JumpIfSmi(v0, if_false);
__ GetObjectType(v0, a1, a1); __ GetObjectType(v0, a1, a1);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(eq, a1, Operand(JS_REGEXP_TYPE), if_true, if_false, fall_through); Split(eq, a1, Operand(JS_REGEXP_TYPE), if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }
void FullCodeGenerator::EmitIsConstructCall(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsConstructCall(CallRuntime* expr) {
ASSERT(args->length() == 0); ASSERT(expr->arguments()->length() == 0);
Label materialize_true, materialize_false; Label materialize_true, materialize_false;
Label* if_true = NULL; Label* if_true = NULL;
...@@ -2687,7 +2689,7 @@ void FullCodeGenerator::EmitIsConstructCall(ZoneList<Expression*>* args) { ...@@ -2687,7 +2689,7 @@ void FullCodeGenerator::EmitIsConstructCall(ZoneList<Expression*>* args) {
// Check the marker in the calling frame. // Check the marker in the calling frame.
__ bind(&check_frame_marker); __ bind(&check_frame_marker);
__ lw(a1, MemOperand(a2, StandardFrameConstants::kMarkerOffset)); __ lw(a1, MemOperand(a2, StandardFrameConstants::kMarkerOffset));
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(eq, a1, Operand(Smi::FromInt(StackFrame::CONSTRUCT)), Split(eq, a1, Operand(Smi::FromInt(StackFrame::CONSTRUCT)),
if_true, if_false, fall_through); if_true, if_false, fall_through);
...@@ -2695,7 +2697,8 @@ void FullCodeGenerator::EmitIsConstructCall(ZoneList<Expression*>* args) { ...@@ -2695,7 +2697,8 @@ void FullCodeGenerator::EmitIsConstructCall(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitObjectEquals(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitObjectEquals(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 2); ASSERT(args->length() == 2);
// Load the two objects into registers and perform the comparison. // Load the two objects into registers and perform the comparison.
...@@ -2710,14 +2713,15 @@ void FullCodeGenerator::EmitObjectEquals(ZoneList<Expression*>* args) { ...@@ -2710,14 +2713,15 @@ void FullCodeGenerator::EmitObjectEquals(ZoneList<Expression*>* args) {
&if_true, &if_false, &fall_through); &if_true, &if_false, &fall_through);
__ pop(a1); __ pop(a1);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(eq, v0, Operand(a1), if_true, if_false, fall_through); Split(eq, v0, Operand(a1), if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }
void FullCodeGenerator::EmitArguments(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitArguments(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
// ArgumentsAccessStub expects the key in a1 and the formal // ArgumentsAccessStub expects the key in a1 and the formal
...@@ -2731,9 +2735,8 @@ void FullCodeGenerator::EmitArguments(ZoneList<Expression*>* args) { ...@@ -2731,9 +2735,8 @@ void FullCodeGenerator::EmitArguments(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitArgumentsLength(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitArgumentsLength(CallRuntime* expr) {
ASSERT(args->length() == 0); ASSERT(expr->arguments()->length() == 0);
Label exit; Label exit;
// Get the number of formal parameters. // Get the number of formal parameters.
__ li(v0, Operand(Smi::FromInt(info_->scope()->num_parameters()))); __ li(v0, Operand(Smi::FromInt(info_->scope()->num_parameters())));
...@@ -2753,7 +2756,8 @@ void FullCodeGenerator::EmitArgumentsLength(ZoneList<Expression*>* args) { ...@@ -2753,7 +2756,8 @@ void FullCodeGenerator::EmitArgumentsLength(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitClassOf(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitClassOf(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
Label done, null, function, non_function_constructor; Label done, null, function, non_function_constructor;
...@@ -2812,7 +2816,7 @@ void FullCodeGenerator::EmitClassOf(ZoneList<Expression*>* args) { ...@@ -2812,7 +2816,7 @@ void FullCodeGenerator::EmitClassOf(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitLog(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitLog(CallRuntime* expr) {
// Conditionally generate a log call. // Conditionally generate a log call.
// Args: // Args:
// 0 (literal string): The type of logging (corresponds to the flags). // 0 (literal string): The type of logging (corresponds to the flags).
...@@ -2820,6 +2824,7 @@ void FullCodeGenerator::EmitLog(ZoneList<Expression*>* args) { ...@@ -2820,6 +2824,7 @@ void FullCodeGenerator::EmitLog(ZoneList<Expression*>* args) {
// 1 (string): Format string. Access the string at argument index 2 // 1 (string): Format string. Access the string at argument index 2
// with '%2s' (see Logger::LogRuntime for all the formats). // with '%2s' (see Logger::LogRuntime for all the formats).
// 2 (array): Arguments to the format string. // 2 (array): Arguments to the format string.
ZoneList<Expression*>* args = expr->arguments();
ASSERT_EQ(args->length(), 3); ASSERT_EQ(args->length(), 3);
if (CodeGenerator::ShouldGenerateLog(args->at(0))) { if (CodeGenerator::ShouldGenerateLog(args->at(0))) {
VisitForStackValue(args->at(1)); VisitForStackValue(args->at(1));
...@@ -2833,9 +2838,8 @@ void FullCodeGenerator::EmitLog(ZoneList<Expression*>* args) { ...@@ -2833,9 +2838,8 @@ void FullCodeGenerator::EmitLog(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitRandomHeapNumber(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitRandomHeapNumber(CallRuntime* expr) {
ASSERT(args->length() == 0); ASSERT(expr->arguments()->length() == 0);
Label slow_allocate_heapnumber; Label slow_allocate_heapnumber;
Label heapnumber_allocated; Label heapnumber_allocated;
...@@ -2886,9 +2890,10 @@ void FullCodeGenerator::EmitRandomHeapNumber(ZoneList<Expression*>* args) { ...@@ -2886,9 +2890,10 @@ void FullCodeGenerator::EmitRandomHeapNumber(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitSubString(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitSubString(CallRuntime* expr) {
// Load the arguments on the stack and call the stub. // Load the arguments on the stack and call the stub.
SubStringStub stub; SubStringStub stub;
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 3); ASSERT(args->length() == 3);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
VisitForStackValue(args->at(1)); VisitForStackValue(args->at(1));
...@@ -2898,9 +2903,10 @@ void FullCodeGenerator::EmitSubString(ZoneList<Expression*>* args) { ...@@ -2898,9 +2903,10 @@ void FullCodeGenerator::EmitSubString(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitRegExpExec(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitRegExpExec(CallRuntime* expr) {
// Load the arguments on the stack and call the stub. // Load the arguments on the stack and call the stub.
RegExpExecStub stub; RegExpExecStub stub;
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 4); ASSERT(args->length() == 4);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
VisitForStackValue(args->at(1)); VisitForStackValue(args->at(1));
...@@ -2911,7 +2917,8 @@ void FullCodeGenerator::EmitRegExpExec(ZoneList<Expression*>* args) { ...@@ -2911,7 +2917,8 @@ void FullCodeGenerator::EmitRegExpExec(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitValueOf(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitValueOf(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); // Load the object. VisitForAccumulatorValue(args->at(0)); // Load the object.
...@@ -2930,8 +2937,9 @@ void FullCodeGenerator::EmitValueOf(ZoneList<Expression*>* args) { ...@@ -2930,8 +2937,9 @@ void FullCodeGenerator::EmitValueOf(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitMathPow(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitMathPow(CallRuntime* expr) {
// Load the arguments on the stack and call the runtime function. // Load the arguments on the stack and call the runtime function.
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 2); ASSERT(args->length() == 2);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
VisitForStackValue(args->at(1)); VisitForStackValue(args->at(1));
...@@ -2941,7 +2949,8 @@ void FullCodeGenerator::EmitMathPow(ZoneList<Expression*>* args) { ...@@ -2941,7 +2949,8 @@ void FullCodeGenerator::EmitMathPow(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitSetValueOf(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitSetValueOf(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 2); ASSERT(args->length() == 2);
VisitForStackValue(args->at(0)); // Load the object. VisitForStackValue(args->at(0)); // Load the object.
...@@ -2969,7 +2978,8 @@ void FullCodeGenerator::EmitSetValueOf(ZoneList<Expression*>* args) { ...@@ -2969,7 +2978,8 @@ void FullCodeGenerator::EmitSetValueOf(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitNumberToString(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitNumberToString(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT_EQ(args->length(), 1); ASSERT_EQ(args->length(), 1);
// Load the argument on the stack and call the stub. // Load the argument on the stack and call the stub.
...@@ -2981,7 +2991,8 @@ void FullCodeGenerator::EmitNumberToString(ZoneList<Expression*>* args) { ...@@ -2981,7 +2991,8 @@ void FullCodeGenerator::EmitNumberToString(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitStringCharFromCode(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitStringCharFromCode(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -2999,7 +3010,8 @@ void FullCodeGenerator::EmitStringCharFromCode(ZoneList<Expression*>* args) { ...@@ -2999,7 +3010,8 @@ void FullCodeGenerator::EmitStringCharFromCode(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitStringCharCodeAt(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitStringCharCodeAt(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 2); ASSERT(args->length() == 2);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
...@@ -3047,7 +3059,8 @@ void FullCodeGenerator::EmitStringCharCodeAt(ZoneList<Expression*>* args) { ...@@ -3047,7 +3059,8 @@ void FullCodeGenerator::EmitStringCharCodeAt(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitStringCharAt(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitStringCharAt(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 2); ASSERT(args->length() == 2);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
...@@ -3097,9 +3110,9 @@ void FullCodeGenerator::EmitStringCharAt(ZoneList<Expression*>* args) { ...@@ -3097,9 +3110,9 @@ void FullCodeGenerator::EmitStringCharAt(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitStringAdd(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitStringAdd(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT_EQ(2, args->length()); ASSERT_EQ(2, args->length());
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
VisitForStackValue(args->at(1)); VisitForStackValue(args->at(1));
...@@ -3109,7 +3122,8 @@ void FullCodeGenerator::EmitStringAdd(ZoneList<Expression*>* args) { ...@@ -3109,7 +3122,8 @@ void FullCodeGenerator::EmitStringAdd(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitStringCompare(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitStringCompare(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT_EQ(2, args->length()); ASSERT_EQ(2, args->length());
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
...@@ -3121,10 +3135,11 @@ void FullCodeGenerator::EmitStringCompare(ZoneList<Expression*>* args) { ...@@ -3121,10 +3135,11 @@ void FullCodeGenerator::EmitStringCompare(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitMathSin(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitMathSin(CallRuntime* expr) {
// Load the argument on the stack and call the stub. // Load the argument on the stack and call the stub.
TranscendentalCacheStub stub(TranscendentalCache::SIN, TranscendentalCacheStub stub(TranscendentalCache::SIN,
TranscendentalCacheStub::TAGGED); TranscendentalCacheStub::TAGGED);
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
__ mov(a0, result_register()); // Stub requires parameter in a0 and on tos. __ mov(a0, result_register()); // Stub requires parameter in a0 and on tos.
...@@ -3133,10 +3148,11 @@ void FullCodeGenerator::EmitMathSin(ZoneList<Expression*>* args) { ...@@ -3133,10 +3148,11 @@ void FullCodeGenerator::EmitMathSin(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitMathCos(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitMathCos(CallRuntime* expr) {
// Load the argument on the stack and call the stub. // Load the argument on the stack and call the stub.
TranscendentalCacheStub stub(TranscendentalCache::COS, TranscendentalCacheStub stub(TranscendentalCache::COS,
TranscendentalCacheStub::TAGGED); TranscendentalCacheStub::TAGGED);
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
__ mov(a0, result_register()); // Stub requires parameter in a0 and on tos. __ mov(a0, result_register()); // Stub requires parameter in a0 and on tos.
...@@ -3145,10 +3161,11 @@ void FullCodeGenerator::EmitMathCos(ZoneList<Expression*>* args) { ...@@ -3145,10 +3161,11 @@ void FullCodeGenerator::EmitMathCos(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitMathLog(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitMathLog(CallRuntime* expr) {
// Load the argument on the stack and call the stub. // Load the argument on the stack and call the stub.
TranscendentalCacheStub stub(TranscendentalCache::LOG, TranscendentalCacheStub stub(TranscendentalCache::LOG,
TranscendentalCacheStub::TAGGED); TranscendentalCacheStub::TAGGED);
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
__ mov(a0, result_register()); // Stub requires parameter in a0 and on tos. __ mov(a0, result_register()); // Stub requires parameter in a0 and on tos.
...@@ -3157,8 +3174,9 @@ void FullCodeGenerator::EmitMathLog(ZoneList<Expression*>* args) { ...@@ -3157,8 +3174,9 @@ void FullCodeGenerator::EmitMathLog(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitMathSqrt(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitMathSqrt(CallRuntime* expr) {
// Load the argument on the stack and call the runtime function. // Load the argument on the stack and call the runtime function.
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
__ CallRuntime(Runtime::kMath_sqrt, 1); __ CallRuntime(Runtime::kMath_sqrt, 1);
...@@ -3166,7 +3184,8 @@ void FullCodeGenerator::EmitMathSqrt(ZoneList<Expression*>* args) { ...@@ -3166,7 +3184,8 @@ void FullCodeGenerator::EmitMathSqrt(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitCallFunction(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() >= 2); ASSERT(args->length() >= 2);
int arg_count = args->length() - 2; // 2 ~ receiver and function. int arg_count = args->length() - 2; // 2 ~ receiver and function.
...@@ -3185,8 +3204,9 @@ void FullCodeGenerator::EmitCallFunction(ZoneList<Expression*>* args) { ...@@ -3185,8 +3204,9 @@ void FullCodeGenerator::EmitCallFunction(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitRegExpConstructResult(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitRegExpConstructResult(CallRuntime* expr) {
RegExpConstructResultStub stub; RegExpConstructResultStub stub;
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 3); ASSERT(args->length() == 3);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
VisitForStackValue(args->at(1)); VisitForStackValue(args->at(1));
...@@ -3196,7 +3216,8 @@ void FullCodeGenerator::EmitRegExpConstructResult(ZoneList<Expression*>* args) { ...@@ -3196,7 +3216,8 @@ void FullCodeGenerator::EmitRegExpConstructResult(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitSwapElements(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitSwapElements(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 3); ASSERT(args->length() == 3);
VisitForStackValue(args->at(0)); VisitForStackValue(args->at(0));
VisitForStackValue(args->at(1)); VisitForStackValue(args->at(1));
...@@ -3293,7 +3314,8 @@ void FullCodeGenerator::EmitSwapElements(ZoneList<Expression*>* args) { ...@@ -3293,7 +3314,8 @@ void FullCodeGenerator::EmitSwapElements(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitGetFromCache(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT_EQ(2, args->length()); ASSERT_EQ(2, args->length());
ASSERT_NE(NULL, args->at(0)->AsLiteral()); ASSERT_NE(NULL, args->at(0)->AsLiteral());
...@@ -3346,7 +3368,8 @@ void FullCodeGenerator::EmitGetFromCache(ZoneList<Expression*>* args) { ...@@ -3346,7 +3368,8 @@ void FullCodeGenerator::EmitGetFromCache(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitIsRegExpEquivalent(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitIsRegExpEquivalent(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT_EQ(2, args->length()); ASSERT_EQ(2, args->length());
Register right = v0; Register right = v0;
...@@ -3383,7 +3406,8 @@ void FullCodeGenerator::EmitIsRegExpEquivalent(ZoneList<Expression*>* args) { ...@@ -3383,7 +3406,8 @@ void FullCodeGenerator::EmitIsRegExpEquivalent(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitHasCachedArrayIndex(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitHasCachedArrayIndex(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
Label materialize_true, materialize_false; Label materialize_true, materialize_false;
...@@ -3396,14 +3420,15 @@ void FullCodeGenerator::EmitHasCachedArrayIndex(ZoneList<Expression*>* args) { ...@@ -3396,14 +3420,15 @@ void FullCodeGenerator::EmitHasCachedArrayIndex(ZoneList<Expression*>* args) {
__ lw(a0, FieldMemOperand(v0, String::kHashFieldOffset)); __ lw(a0, FieldMemOperand(v0, String::kHashFieldOffset));
__ And(a0, a0, Operand(String::kContainsCachedArrayIndexMask)); __ And(a0, a0, Operand(String::kContainsCachedArrayIndexMask));
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(eq, a0, Operand(zero_reg), if_true, if_false, fall_through); Split(eq, a0, Operand(zero_reg), if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }
void FullCodeGenerator::EmitGetCachedArrayIndex(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitGetCachedArrayIndex(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 1); ASSERT(args->length() == 1);
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -3418,12 +3443,12 @@ void FullCodeGenerator::EmitGetCachedArrayIndex(ZoneList<Expression*>* args) { ...@@ -3418,12 +3443,12 @@ void FullCodeGenerator::EmitGetCachedArrayIndex(ZoneList<Expression*>* args) {
} }
void FullCodeGenerator::EmitFastAsciiArrayJoin(ZoneList<Expression*>* args) { void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
Label bailout, done, one_char_separator, long_separator, Label bailout, done, one_char_separator, long_separator,
non_trivial_array, not_size_one_array, loop, non_trivial_array, not_size_one_array, loop,
empty_separator_loop, one_char_separator_loop, empty_separator_loop, one_char_separator_loop,
one_char_separator_loop_entry, long_separator_loop; one_char_separator_loop_entry, long_separator_loop;
ZoneList<Expression*>* args = expr->arguments();
ASSERT(args->length() == 2); ASSERT(args->length() == 2);
VisitForStackValue(args->at(1)); VisitForStackValue(args->at(1));
VisitForAccumulatorValue(args->at(0)); VisitForAccumulatorValue(args->at(0));
...@@ -3759,18 +3784,35 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { ...@@ -3759,18 +3784,35 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
// Unary NOT has no side effects so it's only necessary to visit the // Unary NOT has no side effects so it's only necessary to visit the
// subexpression. Match the optimizing compiler by not branching. // subexpression. Match the optimizing compiler by not branching.
VisitForEffect(expr->expression()); VisitForEffect(expr->expression());
} else if (context()->IsTest()) {
const TestContext* test = TestContext::cast(context());
// The labels are swapped for the recursive call.
VisitForControl(expr->expression(),
test->false_label(),
test->true_label(),
test->fall_through());
context()->Plug(test->true_label(), test->false_label());
} else { } else {
Label materialize_true, materialize_false; // We handle value contexts explicitly rather than simply visiting
Label* if_true = NULL; // for control and plugging the control flow into the context,
Label* if_false = NULL; // because we need to prepare a pair of extra administrative AST ids
Label* fall_through = NULL; // for the optimizing compiler.
ASSERT(context()->IsAccumulatorValue() || context()->IsStackValue());
// Notice that the labels are swapped. Label materialize_true, materialize_false, done;
context()->PrepareTest(&materialize_true, &materialize_false, VisitForControl(expr->expression(),
&if_false, &if_true, &fall_through); &materialize_false,
if (context()->IsTest()) ForwardBailoutToChild(expr); &materialize_true,
VisitForControl(expr->expression(), if_true, if_false, fall_through); &materialize_true);
context()->Plug(if_false, if_true); // Labels swapped. __ bind(&materialize_true);
PrepareForBailoutForId(expr->MaterializeTrueId(), NO_REGISTERS);
__ LoadRoot(v0, Heap::kTrueValueRootIndex);
if (context()->IsStackValue()) __ push(v0);
__ jmp(&done);
__ bind(&materialize_false);
PrepareForBailoutForId(expr->MaterializeFalseId(), NO_REGISTERS);
__ LoadRoot(v0, Heap::kFalseValueRootIndex);
if (context()->IsStackValue()) __ push(v0);
__ bind(&done);
} }
break; break;
} }
...@@ -4032,11 +4074,12 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) { ...@@ -4032,11 +4074,12 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
context()->Plug(v0); context()->Plug(v0);
} else { } else {
// This expression cannot throw a reference error at the top level. // This expression cannot throw a reference error at the top level.
VisitInCurrentContext(expr); VisitInDuplicateContext(expr);
} }
} }
void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr, void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr,
Expression* sub_expr,
Handle<String> check) { Handle<String> check) {
Label materialize_true, materialize_false; Label materialize_true, materialize_false;
Label* if_true = NULL; Label* if_true = NULL;
...@@ -4046,9 +4089,9 @@ void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr, ...@@ -4046,9 +4089,9 @@ void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr,
&if_true, &if_false, &fall_through); &if_true, &if_false, &fall_through);
{ AccumulatorValueContext context(this); { AccumulatorValueContext context(this);
VisitForTypeofValue(expr); VisitForTypeofValue(sub_expr);
} }
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
if (check->Equals(isolate()->heap()->number_symbol())) { if (check->Equals(isolate()->heap()->number_symbol())) {
__ JumpIfSmi(v0, if_true); __ JumpIfSmi(v0, if_true);
...@@ -4134,7 +4177,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) { ...@@ -4134,7 +4177,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
case Token::IN: case Token::IN:
VisitForStackValue(expr->right()); VisitForStackValue(expr->right());
__ InvokeBuiltin(Builtins::IN, CALL_FUNCTION); __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION);
PrepareForBailoutBeforeSplit(false, NULL, NULL); PrepareForBailoutBeforeSplit(expr, false, NULL, NULL);
__ LoadRoot(t0, Heap::kTrueValueRootIndex); __ LoadRoot(t0, Heap::kTrueValueRootIndex);
Split(eq, v0, Operand(t0), if_true, if_false, fall_through); Split(eq, v0, Operand(t0), if_true, if_false, fall_through);
break; break;
...@@ -4143,7 +4186,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) { ...@@ -4143,7 +4186,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
VisitForStackValue(expr->right()); VisitForStackValue(expr->right());
InstanceofStub stub(InstanceofStub::kNoFlags); InstanceofStub stub(InstanceofStub::kNoFlags);
__ CallStub(&stub); __ CallStub(&stub);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
// The stub returns 0 for true. // The stub returns 0 for true.
Split(eq, v0, Operand(zero_reg), if_true, if_false, fall_through); Split(eq, v0, Operand(zero_reg), if_true, if_false, fall_through);
break; break;
...@@ -4191,7 +4234,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) { ...@@ -4191,7 +4234,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
Handle<Code> ic = CompareIC::GetUninitialized(op); Handle<Code> ic = CompareIC::GetUninitialized(op);
__ Call(ic, RelocInfo::CODE_TARGET, expr->id()); __ Call(ic, RelocInfo::CODE_TARGET, expr->id());
patch_site.EmitPatchInfo(); patch_site.EmitPatchInfo();
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(cc, v0, Operand(zero_reg), if_true, if_false, fall_through); Split(cc, v0, Operand(zero_reg), if_true, if_false, fall_through);
} }
} }
...@@ -4213,7 +4256,7 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr, ...@@ -4213,7 +4256,7 @@ void FullCodeGenerator::EmitLiteralCompareNil(CompareOperation* expr,
&if_true, &if_false, &fall_through); &if_true, &if_false, &fall_through);
VisitForAccumulatorValue(sub_expr); VisitForAccumulatorValue(sub_expr);
PrepareForBailoutBeforeSplit(true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Heap::RootListIndex nil_value = nil == kNullValue ? Heap::RootListIndex nil_value = nil == kNullValue ?
Heap::kNullValueRootIndex : Heap::kNullValueRootIndex :
Heap::kUndefinedValueRootIndex; Heap::kUndefinedValueRootIndex;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment