Commit 363659d7 authored by jarin@chromium.org's avatar jarin@chromium.org

Proper support for deopt_every_n_times option on the x64 and ARM architectures.

R=danno@chromium.org
BUG=

Review URL: https://codereview.chromium.org/62293002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17564 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent cc5c9e9a
...@@ -769,13 +769,39 @@ void LCodeGen::DeoptimizeIf(Condition condition, ...@@ -769,13 +769,39 @@ void LCodeGen::DeoptimizeIf(Condition condition,
return; return;
} }
ASSERT(FLAG_deopt_every_n_times < 2); // Other values not supported on ARM. if (FLAG_deopt_every_n_times != 0 && !info()->IsStub()) {
if (FLAG_deopt_every_n_times == 1 && Register scratch = scratch0();
!info()->IsStub() && ExternalReference count = ExternalReference::stress_deopt_count(isolate());
info()->opt_count() == id) {
ASSERT(frame_is_built_); // Store the condition on the stack if necessary
__ Call(entry, RelocInfo::RUNTIME_ENTRY); if (condition != al) {
return; __ mov(scratch, Operand::Zero(), LeaveCC, NegateCondition(condition));
__ mov(scratch, Operand(1), LeaveCC, condition);
__ push(scratch);
}
__ push(r1);
__ mov(scratch, Operand(count));
__ ldr(r1, MemOperand(scratch));
__ sub(r1, r1, Operand(1), SetCC);
__ movw(r1, FLAG_deopt_every_n_times, eq);
__ str(r1, MemOperand(scratch));
__ pop(r1);
if (condition != al) {
// Clean up the stack before the deoptimizer call
__ pop(scratch);
}
__ Call(entry, RelocInfo::RUNTIME_ENTRY, eq);
// 'Restore' the condition in a slightly hacky way. (It would be better
// to use 'msr' and 'mrs' instructions here, but they are not supported by
// our ARM simulator).
if (condition != al) {
condition = ne;
__ cmp(scratch, Operand::Zero());
}
} }
if (info()->ShouldTrapOnDeopt()) { if (info()->ShouldTrapOnDeopt()) {
......
...@@ -649,7 +649,27 @@ void LCodeGen::DeoptimizeIf(Condition cc, ...@@ -649,7 +649,27 @@ void LCodeGen::DeoptimizeIf(Condition cc,
return; return;
} }
ASSERT(FLAG_deopt_every_n_times == 0); // Not yet implemented on x64. if (FLAG_deopt_every_n_times != 0 && !info()->IsStub()) {
ExternalReference count = ExternalReference::stress_deopt_count(isolate());
Label no_deopt;
__ pushfq();
__ push(rax);
Operand count_operand = masm()->ExternalOperand(count, kScratchRegister);
__ movl(rax, count_operand);
__ subl(rax, Immediate(1));
__ j(not_zero, &no_deopt, Label::kNear);
if (FLAG_trap_on_deopt) __ int3();
__ movl(rax, Immediate(FLAG_deopt_every_n_times));
__ movl(count_operand, rax);
__ pop(rax);
__ popfq();
ASSERT(frame_is_built_);
__ call(entry, RelocInfo::RUNTIME_ENTRY);
__ bind(&no_deopt);
__ movl(count_operand, rax);
__ pop(rax);
__ popfq();
}
if (info()->ShouldTrapOnDeopt()) { if (info()->ShouldTrapOnDeopt()) {
Label done; Label done;
......
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