| Index: src/a64/lithium-codegen-a64.cc
|
| diff --git a/src/a64/lithium-codegen-a64.cc b/src/a64/lithium-codegen-a64.cc
|
| index 033a439513672589c0727811ac25f47fd4d984a6..fe45ed8fe4acad18b8c2123129f97b355c80fd2d 100644
|
| --- a/src/a64/lithium-codegen-a64.cc
|
| +++ b/src/a64/lithium-codegen-a64.cc
|
| @@ -960,22 +960,26 @@ void LCodeGen::PopulateDeoptimizationLiteralsWithInlinedFunctions() {
|
| }
|
|
|
|
|
| -Deoptimizer::BailoutType LCodeGen::DeoptimizeHeader(
|
| +void LCodeGen::DeoptimizeBranch(
|
| LEnvironment* environment,
|
| + BranchType branch_type, Register reg, int bit,
|
| Deoptimizer::BailoutType* override_bailout_type) {
|
| RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt);
|
| + Deoptimizer::BailoutType bailout_type =
|
| + info()->IsStub() ? Deoptimizer::LAZY : Deoptimizer::EAGER;
|
| +
|
| + if (override_bailout_type != NULL) {
|
| + bailout_type = *override_bailout_type;
|
| + }
|
| +
|
| ASSERT(environment->HasBeenRegistered());
|
| ASSERT(info()->IsOptimizing() || info()->IsStub());
|
| int id = environment->deoptimization_index();
|
| - Deoptimizer::BailoutType bailout_type =
|
| - info()->IsStub() ? Deoptimizer::LAZY : Deoptimizer::EAGER;
|
| - if (override_bailout_type) bailout_type = *override_bailout_type;
|
| Address entry =
|
| Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type);
|
|
|
| if (entry == NULL) {
|
| Abort(kBailoutWasNotPrepared);
|
| - return bailout_type;
|
| }
|
|
|
| if (FLAG_deopt_every_n_times != 0 && !info()->IsStub()) {
|
| @@ -1001,26 +1005,20 @@ Deoptimizer::BailoutType LCodeGen::DeoptimizeHeader(
|
| __ Pop(x0, x1, x2);
|
| }
|
|
|
| - return bailout_type;
|
| -}
|
| -
|
| -
|
| -void LCodeGen::Deoptimize(LEnvironment* environment,
|
| - Deoptimizer::BailoutType bailout_type) {
|
| - ASSERT(environment->HasBeenRegistered());
|
| - ASSERT(info()->IsOptimizing() || info()->IsStub());
|
| - int id = environment->deoptimization_index();
|
| - Address entry =
|
| - Deoptimizer::GetDeoptimizationEntry(isolate(), id, bailout_type);
|
| -
|
| if (info()->ShouldTrapOnDeopt()) {
|
| + Label dont_trap;
|
| + __ B(&dont_trap, InvertBranchType(branch_type), reg, bit);
|
| __ Debug("trap_on_deopt", __LINE__, BREAK);
|
| + __ Bind(&dont_trap);
|
| }
|
|
|
| ASSERT(info()->IsStub() || frame_is_built_);
|
| // Go through jump table if we need to build frame, or restore caller doubles.
|
| if (frame_is_built_ && !info()->saves_caller_doubles()) {
|
| + Label dont_deopt;
|
| + __ B(&dont_deopt, InvertBranchType(branch_type), reg, bit);
|
| __ Call(entry, RelocInfo::RUNTIME_ENTRY);
|
| + __ Bind(&dont_deopt);
|
| } else {
|
| // We often have several deopts to the same entry, reuse the last
|
| // jump entry if this is the case.
|
| @@ -1033,82 +1031,58 @@ void LCodeGen::Deoptimize(LEnvironment* environment,
|
| !frame_is_built_);
|
| deopt_jump_table_.Add(table_entry, zone());
|
| }
|
| - __ B(&deopt_jump_table_.last().label);
|
| + __ B(&deopt_jump_table_.last().label,
|
| + branch_type, reg, bit);
|
| }
|
| }
|
|
|
|
|
| -void LCodeGen::Deoptimize(LEnvironment* environment) {
|
| - Deoptimizer::BailoutType bailout_type = DeoptimizeHeader(environment, NULL);
|
| - Deoptimize(environment, bailout_type);
|
| +void LCodeGen::Deoptimize(LEnvironment* environment,
|
| + Deoptimizer::BailoutType* override_bailout_type) {
|
| + DeoptimizeBranch(environment, always, NoReg, -1, override_bailout_type);
|
| }
|
|
|
|
|
| void LCodeGen::DeoptimizeIf(Condition cond, LEnvironment* environment) {
|
| - Label dont_deopt;
|
| - Deoptimizer::BailoutType bailout_type = DeoptimizeHeader(environment, NULL);
|
| - __ B(InvertCondition(cond), &dont_deopt);
|
| - Deoptimize(environment, bailout_type);
|
| - __ Bind(&dont_deopt);
|
| + DeoptimizeBranch(environment, static_cast<BranchType>(cond));
|
| }
|
|
|
|
|
| void LCodeGen::DeoptimizeIfZero(Register rt, LEnvironment* environment) {
|
| - Label dont_deopt;
|
| - Deoptimizer::BailoutType bailout_type = DeoptimizeHeader(environment, NULL);
|
| - __ Cbnz(rt, &dont_deopt);
|
| - Deoptimize(environment, bailout_type);
|
| - __ Bind(&dont_deopt);
|
| + DeoptimizeBranch(environment, reg_zero, rt);
|
| }
|
|
|
|
|
| void LCodeGen::DeoptimizeIfNegative(Register rt, LEnvironment* environment) {
|
| - Label dont_deopt;
|
| - Deoptimizer::BailoutType bailout_type = DeoptimizeHeader(environment, NULL);
|
| - __ Tbz(rt, rt.Is64Bits() ? kXSignBit : kWSignBit, &dont_deopt);
|
| - Deoptimize(environment, bailout_type);
|
| - __ Bind(&dont_deopt);
|
| + int sign_bit = rt.Is64Bits() ? kXSignBit : kWSignBit;
|
| + DeoptimizeBranch(environment, reg_bit_set, rt, sign_bit);
|
| }
|
|
|
|
|
| void LCodeGen::DeoptimizeIfSmi(Register rt,
|
| LEnvironment* environment) {
|
| - Label dont_deopt;
|
| - Deoptimizer::BailoutType bailout_type = DeoptimizeHeader(environment, NULL);
|
| - __ JumpIfNotSmi(rt, &dont_deopt);
|
| - Deoptimize(environment, bailout_type);
|
| - __ Bind(&dont_deopt);
|
| + DeoptimizeBranch(environment, reg_bit_clear, rt, MaskToBit(kSmiTagMask));
|
| }
|
|
|
|
|
| void LCodeGen::DeoptimizeIfNotSmi(Register rt, LEnvironment* environment) {
|
| - Label dont_deopt;
|
| - Deoptimizer::BailoutType bailout_type = DeoptimizeHeader(environment, NULL);
|
| - __ JumpIfSmi(rt, &dont_deopt);
|
| - Deoptimize(environment, bailout_type);
|
| - __ Bind(&dont_deopt);
|
| + DeoptimizeBranch(environment, reg_bit_set, rt, MaskToBit(kSmiTagMask));
|
| }
|
|
|
|
|
| void LCodeGen::DeoptimizeIfRoot(Register rt,
|
| Heap::RootListIndex index,
|
| LEnvironment* environment) {
|
| - Label dont_deopt;
|
| - Deoptimizer::BailoutType bailout_type = DeoptimizeHeader(environment, NULL);
|
| - __ JumpIfNotRoot(rt, index, &dont_deopt);
|
| - Deoptimize(environment, bailout_type);
|
| - __ Bind(&dont_deopt);
|
| + __ CompareRoot(rt, index);
|
| + DeoptimizeIf(eq, environment);
|
| }
|
|
|
|
|
| void LCodeGen::DeoptimizeIfNotRoot(Register rt,
|
| Heap::RootListIndex index,
|
| LEnvironment* environment) {
|
| - Label dont_deopt;
|
| - Deoptimizer::BailoutType bailout_type = DeoptimizeHeader(environment, NULL);
|
| - __ JumpIfRoot(rt, index, &dont_deopt);
|
| - Deoptimize(environment, bailout_type);
|
| - __ Bind(&dont_deopt);
|
| + __ CompareRoot(rt, index);
|
| + DeoptimizeIf(ne, environment);
|
| }
|
|
|
|
|
| @@ -2126,9 +2100,6 @@ void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
|
|
|
| void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) {
|
| if (!instr->hydrogen()->value()->IsHeapObject()) {
|
| - // TODO(all): Depending of how we chose to implement the deopt, if we could
|
| - // guarantee that we have a deopt handler reachable by a tbz instruction,
|
| - // we could use tbz here and produce less code to support this instruction.
|
| DeoptimizeIfSmi(ToRegister(instr->value()), instr->environment());
|
| }
|
| }
|
| @@ -2137,7 +2108,6 @@ void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) {
|
| void LCodeGen::DoCheckSmi(LCheckSmi* instr) {
|
| Register value = ToRegister(instr->value());
|
| ASSERT(!instr->result() || ToRegister(instr->result()).Is(value));
|
| - // TODO(all): See DoCheckNonSmi for comments on use of tbz.
|
| DeoptimizeIfNotSmi(value, instr->environment());
|
| }
|
|
|
| @@ -2577,8 +2547,7 @@ void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
|
| }
|
|
|
| Comment(";;; deoptimize: %s", instr->hydrogen()->reason());
|
| - DeoptimizeHeader(instr->environment(), &type);
|
| - Deoptimize(instr->environment(), type);
|
| + Deoptimize(instr->environment(), &type);
|
| }
|
|
|
|
|
|
|