Chromium Code Reviews| Index: src/arm/lithium-codegen-arm.cc |
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
| index 8eca27d77d9427f5c4fa58ae0d58e8cf4956b28c..094e164c918c94241d4bb2a5d40b62b2804bb79f 100644 |
| --- a/src/arm/lithium-codegen-arm.cc |
| +++ b/src/arm/lithium-codegen-arm.cc |
| @@ -769,13 +769,39 @@ void LCodeGen::DeoptimizeIf(Condition condition, |
| return; |
| } |
| - ASSERT(FLAG_deopt_every_n_times < 2); // Other values not supported on ARM. |
| - if (FLAG_deopt_every_n_times == 1 && |
| - !info()->IsStub() && |
| - info()->opt_count() == id) { |
| - ASSERT(frame_is_built_); |
| - __ Call(entry, RelocInfo::RUNTIME_ENTRY); |
| - return; |
| + if (FLAG_deopt_every_n_times != 0 && !info()->IsStub()) { |
| + Register scratch = scratch0(); |
|
vincent.belliard.fr
2013/11/07 08:43:24
May be you can leave the case FLAG_deopt_every_n_t
|
| + ExternalReference count = ExternalReference::stress_deopt_count(isolate()); |
| + |
| + // Store the condition on the stack if necessary |
| + if (condition != al) { |
| + __ mov(scratch, Operand::Zero()); |
|
vincent.belliard.fr
2013/11/07 08:43:24
You can also make this mov conditional (you must n
|
| + __ 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 |
|
vincent.belliard.fr
2013/11/07 08:43:24
mrs and msr are available (assembler-arm.h line 10
|
| + // our ARM simulator). |
| + if (condition != al) { |
| + condition = ne; |
| + __ cmp(scratch, Operand::Zero()); |
| + } |
| } |
| if (info()->ShouldTrapOnDeopt()) { |