diff options
Diffstat (limited to 'deps/v8/src/compiler/arm/code-generator-arm.cc')
-rw-r--r-- | deps/v8/src/compiler/arm/code-generator-arm.cc | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/deps/v8/src/compiler/arm/code-generator-arm.cc b/deps/v8/src/compiler/arm/code-generator-arm.cc index dca6d4e3ec..796d132a34 100644 --- a/deps/v8/src/compiler/arm/code-generator-arm.cc +++ b/deps/v8/src/compiler/arm/code-generator-arm.cc @@ -220,12 +220,27 @@ Condition FlagsConditionToCondition(FlagsCondition condition) { return ls; case kUnsignedGreaterThan: return hi; + case kFloatLessThanOrUnordered: + return lt; + case kFloatGreaterThanOrEqual: + return ge; + case kFloatLessThanOrEqual: + return ls; + case kFloatGreaterThanOrUnordered: + return hi; + case kFloatLessThan: + return lo; + case kFloatGreaterThanOrEqualOrUnordered: + return hs; + case kFloatLessThanOrEqualOrUnordered: + return le; + case kFloatGreaterThan: + return gt; case kOverflow: return vs; case kNotOverflow: return vc; - case kUnorderedEqual: - case kUnorderedNotEqual: + default: break; } UNREACHABLE(); @@ -573,8 +588,8 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { } else { DCHECK(instr->InputAt(1)->IsImmediate()); // 0.0 is the only immediate supported by vcmp instructions. - DCHECK(i.InputDouble(1) == 0.0); - __ VFPCompareAndSetFlags(i.InputFloat32Register(0), i.InputDouble(1)); + DCHECK(i.InputFloat32(1) == 0.0f); + __ VFPCompareAndSetFlags(i.InputFloat32Register(0), i.InputFloat32(1)); } DCHECK_EQ(SetCC, i.OutputSBit()); break; @@ -816,10 +831,9 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { } case kArmPush: if (instr->InputAt(0)->IsDoubleRegister()) { - __ vstr(i.InputDoubleRegister(0), MemOperand(sp, -kDoubleSize)); - __ sub(sp, sp, Operand(kDoubleSize)); + __ vpush(i.InputDoubleRegister(0)); } else { - __ Push(i.InputRegister(0)); + __ push(i.InputRegister(0)); } DCHECK_EQ(LeaveCC, i.OutputSBit()); break; @@ -878,6 +892,10 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { case kCheckedStoreFloat64: ASSEMBLE_CHECKED_STORE_FLOAT(64); break; + case kCheckedLoadWord64: + case kCheckedStoreWord64: + UNREACHABLE(); // currently unsupported checked int64 load/store. + break; } } // NOLINT(readability/fn_size) @@ -1240,20 +1258,22 @@ void CodeGenerator::AddNopForSmiCodeInlining() { void CodeGenerator::EnsureSpaceForLazyDeopt() { + if (!info()->ShouldEnsureSpaceForLazyDeopt()) { + return; + } + int space_needed = Deoptimizer::patch_size(); - if (!info()->IsStub()) { - // Ensure that we have enough space after the previous lazy-bailout - // instruction for patching the code here. - int current_pc = masm()->pc_offset(); - if (current_pc < last_lazy_deopt_pc_ + space_needed) { - // Block literal pool emission for duration of padding. - v8::internal::Assembler::BlockConstPoolScope block_const_pool(masm()); - int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; - DCHECK_EQ(0, padding_size % v8::internal::Assembler::kInstrSize); - while (padding_size > 0) { - __ nop(); - padding_size -= v8::internal::Assembler::kInstrSize; - } + // Ensure that we have enough space after the previous lazy-bailout + // instruction for patching the code here. + int current_pc = masm()->pc_offset(); + if (current_pc < last_lazy_deopt_pc_ + space_needed) { + // Block literal pool emission for duration of padding. + v8::internal::Assembler::BlockConstPoolScope block_const_pool(masm()); + int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; + DCHECK_EQ(0, padding_size % v8::internal::Assembler::kInstrSize); + while (padding_size > 0) { + __ nop(); + padding_size -= v8::internal::Assembler::kInstrSize; } } } |