Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: src/mips/deoptimizer-mips.cc

Issue 15005008: MIPS: Ensure that soft-deopts don't count against opt_count (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed nits. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/mips/builtins-mips.cc ('k') | src/mips/lithium-codegen-mips.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 // Copyright 2011 the V8 project authors. All rights reserved. 2 // Copyright 2011 the V8 project authors. All rights reserved.
3 // Redistribution and use in source and binary forms, with or without 3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are 4 // modification, are permitted provided that the following conditions are
5 // met: 5 // met:
6 // 6 //
7 // * Redistributions of source code must retain the above copyright 7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer. 8 // notice, this list of conditions and the following disclaimer.
9 // * Redistributions in binary form must reproduce the above 9 // * Redistributions in binary form must reproduce the above
10 // copyright notice, this list of conditions and the following 10 // copyright notice, this list of conditions and the following
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 output_frame->SetPc(pc_value); 524 output_frame->SetPc(pc_value);
525 525
526 FullCodeGenerator::State state = 526 FullCodeGenerator::State state =
527 FullCodeGenerator::StateField::decode(pc_and_state); 527 FullCodeGenerator::StateField::decode(pc_and_state);
528 output_frame->SetState(Smi::FromInt(state)); 528 output_frame->SetState(Smi::FromInt(state));
529 529
530 530
531 // Set the continuation for the topmost frame. 531 // Set the continuation for the topmost frame.
532 if (is_topmost && bailout_type_ != DEBUGGER) { 532 if (is_topmost && bailout_type_ != DEBUGGER) {
533 Builtins* builtins = isolate_->builtins(); 533 Builtins* builtins = isolate_->builtins();
534 Code* continuation = (bailout_type_ == EAGER) 534 Code* continuation = builtins->builtin(Builtins::kNotifyDeoptimized);
535 ? builtins->builtin(Builtins::kNotifyDeoptimized) 535 if (bailout_type_ == LAZY) {
536 : builtins->builtin(Builtins::kNotifyLazyDeoptimized); 536 continuation = builtins->builtin(Builtins::kNotifyLazyDeoptimized);
537 } else if (bailout_type_ == SOFT) {
538 continuation = builtins->builtin(Builtins::kNotifySoftDeoptimized);
539 } else {
540 ASSERT(bailout_type_ == EAGER);
541 }
537 output_frame->SetContinuation( 542 output_frame->SetContinuation(
538 reinterpret_cast<uint32_t>(continuation->entry())); 543 reinterpret_cast<uint32_t>(continuation->entry()));
539 } 544 }
540 } 545 }
541 546
542 void Deoptimizer::FillInputFrame(Address tos, JavaScriptFrame* frame) { 547 void Deoptimizer::FillInputFrame(Address tos, JavaScriptFrame* frame) {
543 // Set the register values. The values are not important as there are no 548 // Set the register values. The values are not important as there are no
544 // callee saved registers in JavaScript frames, so all registers are 549 // callee saved registers in JavaScript frames, so all registers are
545 // spilled. Registers fp and sp are set to the correct values though. 550 // spilled. Registers fp and sp are set to the correct values though.
546 551
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 625
621 const int kSavedRegistersAreaSize = 626 const int kSavedRegistersAreaSize =
622 (kNumberOfRegisters * kPointerSize) + kDoubleRegsSize; 627 (kNumberOfRegisters * kPointerSize) + kDoubleRegsSize;
623 628
624 // Get the bailout id from the stack. 629 // Get the bailout id from the stack.
625 __ lw(a2, MemOperand(sp, kSavedRegistersAreaSize)); 630 __ lw(a2, MemOperand(sp, kSavedRegistersAreaSize));
626 631
627 // Get the address of the location in the code object if possible (a3) (return 632 // Get the address of the location in the code object if possible (a3) (return
628 // address for lazy deoptimization) and compute the fp-to-sp delta in 633 // address for lazy deoptimization) and compute the fp-to-sp delta in
629 // register t0. 634 // register t0.
630 if (type() == EAGER) { 635 if (type() == EAGER || type() == SOFT) {
631 __ mov(a3, zero_reg); 636 __ mov(a3, zero_reg);
632 // Correct one word for bailout id. 637 // Correct one word for bailout id.
633 __ Addu(t0, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize))); 638 __ Addu(t0, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize)));
634 } else if (type() == OSR) { 639 } else if (type() == OSR) {
635 __ mov(a3, ra); 640 __ mov(a3, ra);
636 // Correct one word for bailout id. 641 // Correct one word for bailout id.
637 __ Addu(t0, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize))); 642 __ Addu(t0, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize)));
638 } else { 643 } else {
639 __ mov(a3, ra); 644 __ mov(a3, ra);
640 // Correct two words for bailout id and return address. 645 // Correct two words for bailout id and return address.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
683 // double_registers_[DoubleRegister::kNumAllocatableRegisters] 688 // double_registers_[DoubleRegister::kNumAllocatableRegisters]
684 for (int i = 0; i < FPURegister::NumAllocatableRegisters(); ++i) { 689 for (int i = 0; i < FPURegister::NumAllocatableRegisters(); ++i) {
685 int dst_offset = i * kDoubleSize + double_regs_offset; 690 int dst_offset = i * kDoubleSize + double_regs_offset;
686 int src_offset = i * kDoubleSize + kNumberOfRegisters * kPointerSize; 691 int src_offset = i * kDoubleSize + kNumberOfRegisters * kPointerSize;
687 __ ldc1(f0, MemOperand(sp, src_offset)); 692 __ ldc1(f0, MemOperand(sp, src_offset));
688 __ sdc1(f0, MemOperand(a1, dst_offset)); 693 __ sdc1(f0, MemOperand(a1, dst_offset));
689 } 694 }
690 695
691 // Remove the bailout id, eventually return address, and the saved registers 696 // Remove the bailout id, eventually return address, and the saved registers
692 // from the stack. 697 // from the stack.
693 if (type() == EAGER || type() == OSR) { 698 if (type() == EAGER || type() == SOFT || type() == OSR) {
694 __ Addu(sp, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize))); 699 __ Addu(sp, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize)));
695 } else { 700 } else {
696 __ Addu(sp, sp, Operand(kSavedRegistersAreaSize + (2 * kPointerSize))); 701 __ Addu(sp, sp, Operand(kSavedRegistersAreaSize + (2 * kPointerSize)));
697 } 702 }
698 703
699 // Compute a pointer to the unwinding limit in register a2; that is 704 // Compute a pointer to the unwinding limit in register a2; that is
700 // the first stack slot not part of the input frame. 705 // the first stack slot not part of the input frame.
701 __ lw(a2, MemOperand(a1, FrameDescription::frame_size_offset())); 706 __ lw(a2, MemOperand(a1, FrameDescription::frame_size_offset()));
702 __ Addu(a2, a2, sp); 707 __ Addu(a2, a2, sp);
703 708
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 void Deoptimizer::TableEntryGenerator::GeneratePrologue() { 805 void Deoptimizer::TableEntryGenerator::GeneratePrologue() {
801 Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm()); 806 Assembler::BlockTrampolinePoolScope block_trampoline_pool(masm());
802 807
803 // Create a sequence of deoptimization entries. Note that any 808 // Create a sequence of deoptimization entries. Note that any
804 // registers may be still live. 809 // registers may be still live.
805 Label table_start; 810 Label table_start;
806 __ bind(&table_start); 811 __ bind(&table_start);
807 for (int i = 0; i < count(); i++) { 812 for (int i = 0; i < count(); i++) {
808 Label start; 813 Label start;
809 __ bind(&start); 814 __ bind(&start);
810 if (type() != EAGER) { 815 if (type() != EAGER && type() != SOFT) {
811 // Emulate ia32 like call by pushing return address to stack. 816 // Emulate ia32 like call by pushing return address to stack.
812 __ addiu(sp, sp, -2 * kPointerSize); 817 __ addiu(sp, sp, -2 * kPointerSize);
813 __ sw(ra, MemOperand(sp, 1 * kPointerSize)); 818 __ sw(ra, MemOperand(sp, 1 * kPointerSize));
814 } else { 819 } else {
815 __ addiu(sp, sp, -1 * kPointerSize); 820 __ addiu(sp, sp, -1 * kPointerSize);
816 } 821 }
817 // Jump over the remaining deopt entries (including this one). 822 // Jump over the remaining deopt entries (including this one).
818 // This code is always reached by calling Jump, which puts the target (label 823 // This code is always reached by calling Jump, which puts the target (label
819 // start) into t9. 824 // start) into t9.
820 const int remaining_entries = (count() - i) * table_entry_size_; 825 const int remaining_entries = (count() - i) * table_entry_size_;
(...skipping 12 matching lines...) Expand all
833 } 838 }
834 839
835 ASSERT_EQ(masm()->SizeOfCodeGeneratedSince(&table_start), 840 ASSERT_EQ(masm()->SizeOfCodeGeneratedSince(&table_start),
836 count() * table_entry_size_); 841 count() * table_entry_size_);
837 } 842 }
838 843
839 #undef __ 844 #undef __
840 845
841 846
842 } } // namespace v8::internal 847 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/mips/builtins-mips.cc ('k') | src/mips/lithium-codegen-mips.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698