| Index: src/x64/full-codegen-x64.cc
|
| diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc
|
| index e03c023ff9ddfe1fb5979b67aa703f91f97936ca..f15165a781865b9f65c72a6fca917143e028a30c 100644
|
| --- a/src/x64/full-codegen-x64.cc
|
| +++ b/src/x64/full-codegen-x64.cc
|
| @@ -1026,10 +1026,34 @@ void FullCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) {
|
|
|
| // Compile all the case bodies.
|
| for (int i = 0; i < clauses->length(); i++) {
|
| - Comment cmnt(masm_, "[ Case body");
|
| CaseClause* clause = clauses->at(i);
|
| __ bind(clause->body_target());
|
| PrepareForBailoutForId(clause->EntryId(), NO_REGISTERS);
|
| +
|
| + // Initialize counter
|
| + { Comment cmnt(masm_, "[ Case hit counter");
|
| + Handle<JSGlobalPropertyCell> cell =
|
| + isolate()->factory()->NewJSGlobalPropertyCell(
|
| + Handle<Object>(Smi::FromInt(0), isolate()));
|
| + RecordTypeFeedbackCell(clause->CounterId(), cell);
|
| +
|
| + // Increment counter
|
| + Label ok;
|
| + Operand counter = FieldOperand(rbx, JSGlobalPropertyCell::kValueOffset);
|
| +
|
| + __ LoadHeapObject(rbx, cell);
|
| + __ movq(rcx, counter);
|
| + __ AssertSmi(rcx);
|
| + __ SmiAddConstant(rcx, rcx, Smi::FromInt(1));
|
| + __ j(no_overflow, &ok, Label::kNear);
|
| +
|
| + // Decrement on overflow
|
| + __ SmiAddConstant(rcx, rcx, Smi::FromInt(-1));
|
| + __ bind(&ok);
|
| + __ movq(counter, rcx);
|
| + }
|
| +
|
| + Comment cmnt(masm_, "[ Case body");
|
| VisitStatements(clause->statements());
|
| }
|
|
|
|
|