diff options
author | Michaël Zasso <targos@protonmail.com> | 2017-05-02 10:50:00 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2017-05-06 20:02:35 +0200 |
commit | 60d1aac8d225e844e68ae48e8f3d58802e635fbe (patch) | |
tree | 922f347dd054db18d88666fad7181e5a777f4022 /deps/v8/src/compiler/x87/code-generator-x87.cc | |
parent | 73d9c0f903ae371cd5011af64c3a6f69a1bda978 (diff) | |
download | node-new-60d1aac8d225e844e68ae48e8f3d58802e635fbe.tar.gz |
deps: update V8 to 5.8.283.38
PR-URL: https://github.com/nodejs/node/pull/12784
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com>
Diffstat (limited to 'deps/v8/src/compiler/x87/code-generator-x87.cc')
-rw-r--r-- | deps/v8/src/compiler/x87/code-generator-x87.cc | 220 |
1 files changed, 123 insertions, 97 deletions
diff --git a/deps/v8/src/compiler/x87/code-generator-x87.cc b/deps/v8/src/compiler/x87/code-generator-x87.cc index 5d8594c92b..fc5992a9c1 100644 --- a/deps/v8/src/compiler/x87/code-generator-x87.cc +++ b/deps/v8/src/compiler/x87/code-generator-x87.cc @@ -736,10 +736,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ fild_s(MemOperand(esp, 0)); __ lea(esp, Operand(esp, kPointerSize)); - Deoptimizer::BailoutType bailout_type = - Deoptimizer::BailoutType(MiscField::decode(instr->opcode())); - CodeGenResult result = AssembleDeoptimizerCall( - deopt_state_id, bailout_type, current_source_position_); + CodeGenResult result = + AssembleDeoptimizerCall(deopt_state_id, current_source_position_); if (result != kSuccess) return result; break; } @@ -994,10 +992,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( } else { __ add(i.OutputRegister(0), i.InputRegister(2)); } - __ adc(i.InputRegister(1), Operand(i.InputRegister(3))); if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { __ Move(i.OutputRegister(1), i.InputRegister(1)); } + __ adc(i.OutputRegister(1), Operand(i.InputRegister(3))); if (use_temp) { __ Move(i.OutputRegister(0), i.TempRegister(0)); } @@ -1019,10 +1017,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( } else { __ sub(i.OutputRegister(0), i.InputRegister(2)); } - __ sbb(i.InputRegister(1), Operand(i.InputRegister(3))); if (i.OutputRegister(1).code() != i.InputRegister(1).code()) { __ Move(i.OutputRegister(1), i.InputRegister(1)); } + __ sbb(i.OutputRegister(1), Operand(i.InputRegister(3))); if (use_temp) { __ Move(i.OutputRegister(0), i.TempRegister(0)); } @@ -2028,69 +2026,74 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( return kSuccess; } // NOLINT(readability/fn_size) - -// Assembles a branch after an instruction. -void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { - X87OperandConverter i(this, instr); - Label::Distance flabel_distance = - branch->fallthru ? Label::kNear : Label::kFar; - - Label done; - Label tlabel_tmp; - Label flabel_tmp; - Label* tlabel = &tlabel_tmp; - Label* flabel = &flabel_tmp; - - Label* tlabel_dst = branch->true_label; - Label* flabel_dst = branch->false_label; - - switch (branch->condition) { +static Condition FlagsConditionToCondition(FlagsCondition condition) { + switch (condition) { case kUnorderedEqual: - __ j(parity_even, flabel, flabel_distance); - // Fall through. case kEqual: - __ j(equal, tlabel); + return equal; break; case kUnorderedNotEqual: - __ j(parity_even, tlabel); - // Fall through. case kNotEqual: - __ j(not_equal, tlabel); + return not_equal; break; case kSignedLessThan: - __ j(less, tlabel); + return less; break; case kSignedGreaterThanOrEqual: - __ j(greater_equal, tlabel); + return greater_equal; break; case kSignedLessThanOrEqual: - __ j(less_equal, tlabel); + return less_equal; break; case kSignedGreaterThan: - __ j(greater, tlabel); + return greater; break; case kUnsignedLessThan: - __ j(below, tlabel); + return below; break; case kUnsignedGreaterThanOrEqual: - __ j(above_equal, tlabel); + return above_equal; break; case kUnsignedLessThanOrEqual: - __ j(below_equal, tlabel); + return below_equal; break; case kUnsignedGreaterThan: - __ j(above, tlabel); + return above; break; case kOverflow: - __ j(overflow, tlabel); + return overflow; break; case kNotOverflow: - __ j(no_overflow, tlabel); + return no_overflow; break; default: UNREACHABLE(); + return no_condition; break; } +} + +// Assembles a branch after an instruction. +void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { + Label::Distance flabel_distance = + branch->fallthru ? Label::kNear : Label::kFar; + + Label done; + Label tlabel_tmp; + Label flabel_tmp; + Label* tlabel = &tlabel_tmp; + Label* flabel = &flabel_tmp; + + Label* tlabel_dst = branch->true_label; + Label* flabel_dst = branch->false_label; + + if (branch->condition == kUnorderedEqual) { + __ j(parity_even, flabel, flabel_distance); + } else if (branch->condition == kUnorderedNotEqual) { + __ j(parity_even, tlabel); + } + __ j(FlagsConditionToCondition(branch->condition), tlabel); + // Add a jump if not falling through to the next block. if (!branch->fallthru) __ jmp(flabel); @@ -2130,7 +2133,68 @@ void CodeGenerator::AssembleArchJump(RpoNumber target) { void CodeGenerator::AssembleArchTrap(Instruction* instr, FlagsCondition condition) { - UNREACHABLE(); + class OutOfLineTrap final : public OutOfLineCode { + public: + OutOfLineTrap(CodeGenerator* gen, bool frame_elided, Instruction* instr) + : OutOfLineCode(gen), + frame_elided_(frame_elided), + instr_(instr), + gen_(gen) {} + + void Generate() final { + X87OperandConverter i(gen_, instr_); + + Runtime::FunctionId trap_id = static_cast<Runtime::FunctionId>( + i.InputInt32(instr_->InputCount() - 1)); + bool old_has_frame = __ has_frame(); + if (frame_elided_) { + __ set_has_frame(true); + __ EnterFrame(StackFrame::WASM_COMPILED); + } + GenerateCallToTrap(trap_id); + if (frame_elided_) { + ReferenceMap* reference_map = + new (gen_->zone()) ReferenceMap(gen_->zone()); + gen_->RecordSafepoint(reference_map, Safepoint::kSimple, 0, + Safepoint::kNoLazyDeopt); + __ set_has_frame(old_has_frame); + } + if (FLAG_debug_code) { + __ ud2(); + } + } + + private: + void GenerateCallToTrap(Runtime::FunctionId trap_id) { + if (trap_id == Runtime::kNumFunctions) { + // We cannot test calls to the runtime in cctest/test-run-wasm. + // Therefore we emit a call to C here instead of a call to the runtime. + __ PrepareCallCFunction(0, esi); + __ CallCFunction( + ExternalReference::wasm_call_trap_callback_for_testing(isolate()), + 0); + } else { + __ Move(esi, isolate()->native_context()); + gen_->AssembleSourcePosition(instr_); + __ CallRuntime(trap_id); + } + } + + bool frame_elided_; + Instruction* instr_; + CodeGenerator* gen_; + }; + bool frame_elided = !frame_access_state()->has_frame(); + auto ool = new (zone()) OutOfLineTrap(this, frame_elided, instr); + Label* tlabel = ool->entry(); + Label end; + if (condition == kUnorderedEqual) { + __ j(parity_even, &end); + } else if (condition == kUnorderedNotEqual) { + __ j(parity_even, tlabel); + } + __ j(FlagsConditionToCondition(condition), tlabel); + __ bind(&end); } // Assembles boolean materializations after an instruction. @@ -2144,58 +2208,17 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr, Label check; DCHECK_NE(0u, instr->OutputCount()); Register reg = i.OutputRegister(instr->OutputCount() - 1); - Condition cc = no_condition; - switch (condition) { - case kUnorderedEqual: - __ j(parity_odd, &check, Label::kNear); - __ Move(reg, Immediate(0)); - __ jmp(&done, Label::kNear); - // Fall through. - case kEqual: - cc = equal; - break; - case kUnorderedNotEqual: - __ j(parity_odd, &check, Label::kNear); - __ mov(reg, Immediate(1)); - __ jmp(&done, Label::kNear); - // Fall through. - case kNotEqual: - cc = not_equal; - break; - case kSignedLessThan: - cc = less; - break; - case kSignedGreaterThanOrEqual: - cc = greater_equal; - break; - case kSignedLessThanOrEqual: - cc = less_equal; - break; - case kSignedGreaterThan: - cc = greater; - break; - case kUnsignedLessThan: - cc = below; - break; - case kUnsignedGreaterThanOrEqual: - cc = above_equal; - break; - case kUnsignedLessThanOrEqual: - cc = below_equal; - break; - case kUnsignedGreaterThan: - cc = above; - break; - case kOverflow: - cc = overflow; - break; - case kNotOverflow: - cc = no_overflow; - break; - default: - UNREACHABLE(); - break; + if (condition == kUnorderedEqual) { + __ j(parity_odd, &check, Label::kNear); + __ Move(reg, Immediate(0)); + __ jmp(&done, Label::kNear); + } else if (condition == kUnorderedNotEqual) { + __ j(parity_odd, &check, Label::kNear); + __ mov(reg, Immediate(1)); + __ jmp(&done, Label::kNear); } + Condition cc = FlagsConditionToCondition(condition); + __ bind(&check); if (reg.is_byte_register()) { // setcc for byte registers (al, bl, cl, dl). @@ -2240,13 +2263,16 @@ void CodeGenerator::AssembleArchTableSwitch(Instruction* instr) { } CodeGenerator::CodeGenResult CodeGenerator::AssembleDeoptimizerCall( - int deoptimization_id, Deoptimizer::BailoutType bailout_type, - SourcePosition pos) { + int deoptimization_id, SourcePosition pos) { + DeoptimizeKind deoptimization_kind = GetDeoptimizationKind(deoptimization_id); + DeoptimizeReason deoptimization_reason = + GetDeoptimizationReason(deoptimization_id); + Deoptimizer::BailoutType bailout_type = + deoptimization_kind == DeoptimizeKind::kSoft ? Deoptimizer::SOFT + : Deoptimizer::EAGER; Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( isolate(), deoptimization_id, bailout_type); if (deopt_entry == nullptr) return kTooManyDeoptimizationBailouts; - DeoptimizeReason deoptimization_reason = - GetDeoptimizationReason(deoptimization_id); __ RecordDeoptReason(deoptimization_reason, pos, deoptimization_id); __ call(deopt_entry, RelocInfo::RUNTIME_ENTRY); return kSuccess; @@ -2562,7 +2588,7 @@ void CodeGenerator::AssembleMove(InstructionOperand* source, __ Move(dst, g.ToImmediate(source)); } else if (src_constant.type() == Constant::kFloat32) { // TODO(turbofan): Can we do better here? - uint32_t src = bit_cast<uint32_t>(src_constant.ToFloat32()); + uint32_t src = src_constant.ToFloat32AsInt(); if (destination->IsFPRegister()) { __ sub(esp, Immediate(kInt32Size)); __ mov(MemOperand(esp, 0), Immediate(src)); @@ -2577,7 +2603,7 @@ void CodeGenerator::AssembleMove(InstructionOperand* source, } } else { DCHECK_EQ(Constant::kFloat64, src_constant.type()); - uint64_t src = bit_cast<uint64_t>(src_constant.ToFloat64()); + uint64_t src = src_constant.ToFloat64AsInt(); uint32_t lower = static_cast<uint32_t>(src); uint32_t upper = static_cast<uint32_t>(src >> 32); if (destination->IsFPRegister()) { |