From 64920e9ba659f448c8eb2979ce6f74861d0d7838 Mon Sep 17 00:00:00 2001 From: "jkummerow@chromium.org" Date: Mon, 27 Feb 2012 08:45:39 +0000 Subject: [PATCH] Profiler experiments: fix snapshotting with count-based interrupts Review URL: https://chromiumcodereview.appspot.com/9447098 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10837 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ia32/full-codegen-ia32.cc | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc index afb8a7f..ee14625 100644 --- a/src/ia32/full-codegen-ia32.cc +++ b/src/ia32/full-codegen-ia32.cc @@ -342,7 +342,15 @@ void FullCodeGenerator::EmitStackCheck(IterationStatement* stmt, int distance = masm_->SizeOfCodeGeneratedSince(back_edge_target); weight = Min(127, Max(1, distance / 100)); } - __ sub(Operand::Cell(profiling_counter_), Immediate(Smi::FromInt(weight))); + if (Serializer::enabled()) { + __ mov(ebx, Immediate(profiling_counter_)); + __ sub(FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset), + Immediate(Smi::FromInt(weight))); + } else { + // This version is slightly faster, but not snapshot safe. + __ sub(Operand::Cell(profiling_counter_), + Immediate(Smi::FromInt(weight))); + } __ j(positive, &ok, Label::kNear); InterruptStub stub; __ CallStub(&stub); @@ -372,8 +380,14 @@ void FullCodeGenerator::EmitStackCheck(IterationStatement* stmt, if (FLAG_count_based_interrupts) { // Reset the countdown. - __ mov(Operand::Cell(profiling_counter_), - Immediate(Smi::FromInt(FLAG_interrupt_budget))); + if (Serializer::enabled()) { + __ mov(ebx, Immediate(profiling_counter_)); + __ mov(FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset), + Immediate(Smi::FromInt(FLAG_interrupt_budget))); + } else { + __ mov(Operand::Cell(profiling_counter_), + Immediate(Smi::FromInt(FLAG_interrupt_budget))); + } } __ bind(&ok); @@ -403,8 +417,15 @@ void FullCodeGenerator::EmitReturnSequence() { int distance = masm_->pc_offset(); weight = Min(127, Max(1, distance / 100)); } - __ sub(Operand::Cell(profiling_counter_), - Immediate(Smi::FromInt(weight))); + if (Serializer::enabled()) { + __ mov(ebx, Immediate(profiling_counter_)); + __ sub(FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset), + Immediate(Smi::FromInt(weight))); + } else { + // This version is slightly faster, but not snapshot safe. + __ sub(Operand::Cell(profiling_counter_), + Immediate(Smi::FromInt(weight))); + } Label ok; __ j(positive, &ok, Label::kNear); __ push(eax); @@ -412,8 +433,14 @@ void FullCodeGenerator::EmitReturnSequence() { __ CallStub(&stub); __ pop(eax); // Reset the countdown. - __ mov(Operand::Cell(profiling_counter_), - Immediate(Smi::FromInt(FLAG_interrupt_budget))); + if (Serializer::enabled()) { + __ mov(ebx, Immediate(profiling_counter_)); + __ mov(FieldOperand(ebx, JSGlobalPropertyCell::kValueOffset), + Immediate(Smi::FromInt(FLAG_interrupt_budget))); + } else { + __ mov(Operand::Cell(profiling_counter_), + Immediate(Smi::FromInt(FLAG_interrupt_budget))); + } __ bind(&ok); } #ifdef DEBUG -- 2.7.4