diff options
Diffstat (limited to 'deps/v8/src/x87/lithium-codegen-x87.cc')
-rw-r--r-- | deps/v8/src/x87/lithium-codegen-x87.cc | 171 |
1 files changed, 105 insertions, 66 deletions
diff --git a/deps/v8/src/x87/lithium-codegen-x87.cc b/deps/v8/src/x87/lithium-codegen-x87.cc index f8872d7187..c292bb94b3 100644 --- a/deps/v8/src/x87/lithium-codegen-x87.cc +++ b/deps/v8/src/x87/lithium-codegen-x87.cc @@ -32,9 +32,9 @@ class SafepointGenerator FINAL : public CallWrapper { deopt_mode_(mode) {} virtual ~SafepointGenerator() {} - virtual void BeforeCall(int call_size) const OVERRIDE {} + void BeforeCall(int call_size) const OVERRIDE {} - virtual void AfterCall() const OVERRIDE { + void AfterCall() const OVERRIDE { codegen_->RecordSafepoint(pointers_, deopt_mode_); } @@ -2924,10 +2924,10 @@ void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) { LInstanceOfKnownGlobal* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { + void Generate() OVERRIDE { codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_); } - virtual LInstruction* instr() OVERRIDE { return instr_; } + LInstruction* instr() OVERRIDE { return instr_; } Label* map_check() { return &map_check_; } private: LInstanceOfKnownGlobal* instr_; @@ -3050,6 +3050,7 @@ void LCodeGen::EmitReturn(LReturn* instr, bool dynamic_frame_alignment) { } __ Ret((parameter_count + extra_value_count) * kPointerSize, ecx); } else { + DCHECK(info()->IsStub()); // Functions would need to drop one more value. Register reg = ToRegister(instr->parameter_count()); // The argument count parameter is a smi __ SmiUntag(reg); @@ -3125,14 +3126,17 @@ template <class T> void LCodeGen::EmitVectorLoadICRegisters(T* instr) { DCHECK(FLAG_vector_ics); Register vector_register = ToRegister(instr->temp_vector()); + Register slot_register = VectorLoadICDescriptor::SlotRegister(); DCHECK(vector_register.is(VectorLoadICDescriptor::VectorRegister())); + DCHECK(slot_register.is(eax)); + + AllowDeferredHandleDereference vector_structure_check; Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector(); __ mov(vector_register, vector); // No need to allocate this register. - DCHECK(VectorLoadICDescriptor::SlotRegister().is(eax)); - int index = vector->GetIndex(instr->hydrogen()->slot()); - __ mov(VectorLoadICDescriptor::SlotRegister(), - Immediate(Smi::FromInt(index))); + FeedbackVectorICSlot slot = instr->hydrogen()->slot(); + int index = vector->GetIndex(slot); + __ mov(slot_register, Immediate(Smi::FromInt(index))); } @@ -3737,45 +3741,81 @@ void LCodeGen::DoTailCallThroughMegamorphicCache( Register name = ToRegister(instr->name()); DCHECK(receiver.is(LoadDescriptor::ReceiverRegister())); DCHECK(name.is(LoadDescriptor::NameRegister())); + Register slot = FLAG_vector_ics ? ToRegister(instr->slot()) : no_reg; + Register vector = FLAG_vector_ics ? ToRegister(instr->vector()) : no_reg; Register scratch = ebx; - Register extra = eax; + Register extra = edi; + DCHECK(!extra.is(slot) && !extra.is(vector)); DCHECK(!scratch.is(receiver) && !scratch.is(name)); DCHECK(!extra.is(receiver) && !extra.is(name)); // Important for the tail-call. bool must_teardown_frame = NeedsEagerFrame(); - // The probe will tail call to a handler if found. - isolate()->stub_cache()->GenerateProbe(masm(), instr->hydrogen()->flags(), - must_teardown_frame, receiver, name, - scratch, extra); + if (!instr->hydrogen()->is_just_miss()) { + if (FLAG_vector_ics) { + __ push(slot); + __ push(vector); + } + + // The probe will tail call to a handler if found. + // If --vector-ics is on, then it knows to pop the two args first. + DCHECK(!instr->hydrogen()->is_keyed_load()); + isolate()->stub_cache()->GenerateProbe( + masm(), Code::LOAD_IC, instr->hydrogen()->flags(), must_teardown_frame, + receiver, name, scratch, extra); + + if (FLAG_vector_ics) { + __ pop(vector); + __ pop(slot); + } + } // Tail call to miss if we ended up here. if (must_teardown_frame) __ leave(); - LoadIC::GenerateMiss(masm()); + if (instr->hydrogen()->is_keyed_load()) { + KeyedLoadIC::GenerateMiss(masm()); + } else { + LoadIC::GenerateMiss(masm()); + } } void LCodeGen::DoCallWithDescriptor(LCallWithDescriptor* instr) { DCHECK(ToRegister(instr->result()).is(eax)); - LPointerMap* pointers = instr->pointer_map(); - SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); + if (instr->hydrogen()->IsTailCall()) { + if (NeedsEagerFrame()) __ leave(); - if (instr->target()->IsConstantOperand()) { - LConstantOperand* target = LConstantOperand::cast(instr->target()); - Handle<Code> code = Handle<Code>::cast(ToHandle(target)); - generator.BeforeCall(__ CallSize(code, RelocInfo::CODE_TARGET)); - __ call(code, RelocInfo::CODE_TARGET); + if (instr->target()->IsConstantOperand()) { + LConstantOperand* target = LConstantOperand::cast(instr->target()); + Handle<Code> code = Handle<Code>::cast(ToHandle(target)); + __ jmp(code, RelocInfo::CODE_TARGET); + } else { + DCHECK(instr->target()->IsRegister()); + Register target = ToRegister(instr->target()); + __ add(target, Immediate(Code::kHeaderSize - kHeapObjectTag)); + __ jmp(target); + } } else { - DCHECK(instr->target()->IsRegister()); - Register target = ToRegister(instr->target()); - generator.BeforeCall(__ CallSize(Operand(target))); - __ add(target, Immediate(Code::kHeaderSize - kHeapObjectTag)); - __ call(target); + LPointerMap* pointers = instr->pointer_map(); + SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); + + if (instr->target()->IsConstantOperand()) { + LConstantOperand* target = LConstantOperand::cast(instr->target()); + Handle<Code> code = Handle<Code>::cast(ToHandle(target)); + generator.BeforeCall(__ CallSize(code, RelocInfo::CODE_TARGET)); + __ call(code, RelocInfo::CODE_TARGET); + } else { + DCHECK(instr->target()->IsRegister()); + Register target = ToRegister(instr->target()); + generator.BeforeCall(__ CallSize(Operand(target))); + __ add(target, Immediate(Code::kHeaderSize - kHeapObjectTag)); + __ call(target); + } + generator.AfterCall(); } - generator.AfterCall(); } @@ -3872,10 +3912,11 @@ void LCodeGen::DoMathAbs(LMathAbs* instr) { LMathAbs* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { + void Generate() OVERRIDE { codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_); } - virtual LInstruction* instr() OVERRIDE { return instr_; } + LInstruction* instr() OVERRIDE { return instr_; } + private: LMathAbs* instr_; }; @@ -4063,8 +4104,8 @@ void LCodeGen::DoMathSqrt(LMathSqrt* instr) { __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); __ push(temp_result); __ CallRuntimeSaveDoubles(Runtime::kMathSqrtRT); - RecordSafepointWithRegisters( - instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); + RecordSafepointWithRegisters(instr->pointer_map(), 1, + Safepoint::kNoLazyDeopt); __ StoreToSafepointRegisterSlot(temp_result, eax); } X87PrepareToWrite(result_reg); @@ -4278,7 +4319,7 @@ void LCodeGen::DoMathExp(LMathExp* instr) { __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); __ push(temp_result); __ CallRuntimeSaveDoubles(Runtime::kMathExpRT); - RecordSafepointWithRegisters(instr->pointer_map(), 0, + RecordSafepointWithRegisters(instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); __ StoreToSafepointRegisterSlot(temp_result, eax); } @@ -4780,10 +4821,9 @@ void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) { LStringCharCodeAt* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { - codegen()->DoDeferredStringCharCodeAt(instr_); - } - virtual LInstruction* instr() OVERRIDE { return instr_; } + void Generate() OVERRIDE { codegen()->DoDeferredStringCharCodeAt(instr_); } + LInstruction* instr() OVERRIDE { return instr_; } + private: LStringCharCodeAt* instr_; }; @@ -4839,10 +4879,11 @@ void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { LStringCharFromCode* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { + void Generate() OVERRIDE { codegen()->DoDeferredStringCharFromCode(instr_); } - virtual LInstruction* instr() OVERRIDE { return instr_; } + LInstruction* instr() OVERRIDE { return instr_; } + private: LStringCharFromCode* instr_; }; @@ -4928,11 +4969,12 @@ void LCodeGen::DoNumberTagI(LNumberTagI* instr) { LNumberTagI* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { + void Generate() OVERRIDE { codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp(), SIGNED_INT32); } - virtual LInstruction* instr() OVERRIDE { return instr_; } + LInstruction* instr() OVERRIDE { return instr_; } + private: LNumberTagI* instr_; }; @@ -4956,11 +4998,12 @@ void LCodeGen::DoNumberTagU(LNumberTagU* instr) { LNumberTagU* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { + void Generate() OVERRIDE { codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp(), UNSIGNED_INT32); } - virtual LInstruction* instr() OVERRIDE { return instr_; } + LInstruction* instr() OVERRIDE { return instr_; } + private: LNumberTagU* instr_; }; @@ -5045,10 +5088,9 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) { LNumberTagD* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { - codegen()->DoDeferredNumberTagD(instr_); - } - virtual LInstruction* instr() OVERRIDE { return instr_; } + void Generate() OVERRIDE { codegen()->DoDeferredNumberTagD(instr_); } + LInstruction* instr() OVERRIDE { return instr_; } + private: LNumberTagD* instr_; }; @@ -5291,10 +5333,9 @@ void LCodeGen::DoTaggedToI(LTaggedToI* instr) { LTaggedToI* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { - codegen()->DoDeferredTaggedToI(instr_, done()); - } - virtual LInstruction* instr() OVERRIDE { return instr_; } + void Generate() OVERRIDE { codegen()->DoDeferredTaggedToI(instr_, done()); } + LInstruction* instr() OVERRIDE { return instr_; } + private: LTaggedToI* instr_; }; @@ -5356,9 +5397,8 @@ void LCodeGen::DoDoubleToI(LDoubleToI* instr) { Label lost_precision, is_nan, minus_zero, done; X87Register input_reg = ToX87Register(input); X87Fxch(input_reg); - Label::Distance dist = DeoptEveryNTimes() ? Label::kFar : Label::kNear; __ X87TOSToI(result_reg, instr->hydrogen()->GetMinusZeroMode(), - &lost_precision, &is_nan, &minus_zero, dist); + &lost_precision, &is_nan, &minus_zero); __ jmp(&done); __ bind(&lost_precision); DeoptimizeIf(no_condition, instr, "lost precision"); @@ -5381,9 +5421,8 @@ void LCodeGen::DoDoubleToSmi(LDoubleToSmi* instr) { Label lost_precision, is_nan, minus_zero, done; X87Register input_reg = ToX87Register(input); X87Fxch(input_reg); - Label::Distance dist = DeoptEveryNTimes() ? Label::kFar : Label::kNear; __ X87TOSToI(result_reg, instr->hydrogen()->GetMinusZeroMode(), - &lost_precision, &is_nan, &minus_zero, dist); + &lost_precision, &is_nan, &minus_zero); __ jmp(&done); __ bind(&lost_precision); DeoptimizeIf(no_condition, instr, "lost precision"); @@ -5497,11 +5536,12 @@ void LCodeGen::DoCheckMaps(LCheckMaps* instr) { : LDeferredCode(codegen, x87_stack), instr_(instr), object_(object) { SetExit(check_maps()); } - virtual void Generate() OVERRIDE { + void Generate() OVERRIDE { codegen()->DoDeferredInstanceMigration(instr_, object_); } Label* check_maps() { return &check_maps_; } - virtual LInstruction* instr() OVERRIDE { return instr_; } + LInstruction* instr() OVERRIDE { return instr_; } + private: LCheckMaps* instr_; Label check_maps_; @@ -5720,10 +5760,9 @@ void LCodeGen::DoAllocate(LAllocate* instr) { LAllocate* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { - codegen()->DoDeferredAllocate(instr_); - } - virtual LInstruction* instr() OVERRIDE { return instr_; } + void Generate() OVERRIDE { codegen()->DoDeferredAllocate(instr_); } + LInstruction* instr() OVERRIDE { return instr_; } + private: LAllocate* instr_; }; @@ -6089,10 +6128,9 @@ void LCodeGen::DoStackCheck(LStackCheck* instr) { LStackCheck* instr, const X87Stack& x87_stack) : LDeferredCode(codegen, x87_stack), instr_(instr) { } - virtual void Generate() OVERRIDE { - codegen()->DoDeferredStackCheck(instr_); - } - virtual LInstruction* instr() OVERRIDE { return instr_; } + void Generate() OVERRIDE { codegen()->DoDeferredStackCheck(instr_); } + LInstruction* instr() OVERRIDE { return instr_; } + private: LStackCheck* instr_; }; @@ -6240,10 +6278,11 @@ void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { object_(object), index_(index) { } - virtual void Generate() OVERRIDE { + void Generate() OVERRIDE { codegen()->DoDeferredLoadMutableDouble(instr_, object_, index_); } - virtual LInstruction* instr() OVERRIDE { return instr_; } + LInstruction* instr() OVERRIDE { return instr_; } + private: LLoadFieldByIndex* instr_; Register object_; |