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

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

Issue 14738009: Ensure that soft-deopts don't count against opt_count (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Implement x64 and ARM, review feedback 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
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 } 537 }
538 538
539 FullCodeGenerator::State state = 539 FullCodeGenerator::State state =
540 FullCodeGenerator::StateField::decode(pc_and_state); 540 FullCodeGenerator::StateField::decode(pc_and_state);
541 output_frame->SetState(Smi::FromInt(state)); 541 output_frame->SetState(Smi::FromInt(state));
542 542
543 543
544 // Set the continuation for the topmost frame. 544 // Set the continuation for the topmost frame.
545 if (is_topmost && bailout_type_ != DEBUGGER) { 545 if (is_topmost && bailout_type_ != DEBUGGER) {
546 Builtins* builtins = isolate_->builtins(); 546 Builtins* builtins = isolate_->builtins();
547 Code* continuation = (bailout_type_ == EAGER) 547 Code* continuation = builtins->builtin(Builtins::kNotifyDeoptimized);
548 ? builtins->builtin(Builtins::kNotifyDeoptimized) 548 if (bailout_type_ == LAZY) {
549 : builtins->builtin(Builtins::kNotifyLazyDeoptimized); 549 continuation = builtins->builtin(Builtins::kNotifyLazyDeoptimized);
550 } else if (bailout_type_ == SOFT) {
551 continuation = builtins->builtin(Builtins::kNotifySoftDeoptimized);
552 } else {
553 ASSERT(bailout_type_ == EAGER);
554 }
550 output_frame->SetContinuation( 555 output_frame->SetContinuation(
551 reinterpret_cast<uint32_t>(continuation->entry())); 556 reinterpret_cast<uint32_t>(continuation->entry()));
552 } 557 }
553 } 558 }
554 559
555 560
556 void Deoptimizer::FillInputFrame(Address tos, JavaScriptFrame* frame) { 561 void Deoptimizer::FillInputFrame(Address tos, JavaScriptFrame* frame) {
557 // Set the register values. The values are not important as there are no 562 // Set the register values. The values are not important as there are no
558 // callee saved registers in JavaScript frames, so all registers are 563 // callee saved registers in JavaScript frames, so all registers are
559 // spilled. Registers fp and sp are set to the correct values though. 564 // spilled. Registers fp and sp are set to the correct values though.
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 637
633 const int kSavedRegistersAreaSize = 638 const int kSavedRegistersAreaSize =
634 (kNumberOfRegisters * kPointerSize) + kDoubleRegsSize; 639 (kNumberOfRegisters * kPointerSize) + kDoubleRegsSize;
635 640
636 // Get the bailout id from the stack. 641 // Get the bailout id from the stack.
637 __ ldr(r2, MemOperand(sp, kSavedRegistersAreaSize)); 642 __ ldr(r2, MemOperand(sp, kSavedRegistersAreaSize));
638 643
639 // Get the address of the location in the code object if possible (r3) (return 644 // Get the address of the location in the code object if possible (r3) (return
640 // address for lazy deoptimization) and compute the fp-to-sp delta in 645 // address for lazy deoptimization) and compute the fp-to-sp delta in
641 // register r4. 646 // register r4.
642 if (type() == EAGER) { 647 if (type() == EAGER || type() == SOFT) {
643 __ mov(r3, Operand::Zero()); 648 __ mov(r3, Operand::Zero());
644 // Correct one word for bailout id. 649 // Correct one word for bailout id.
645 __ add(r4, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize))); 650 __ add(r4, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize)));
646 } else if (type() == OSR) { 651 } else if (type() == OSR) {
647 __ mov(r3, lr); 652 __ mov(r3, lr);
648 // Correct one word for bailout id. 653 // Correct one word for bailout id.
649 __ add(r4, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize))); 654 __ add(r4, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize)));
650 } else { 655 } else {
651 __ mov(r3, lr); 656 __ mov(r3, lr);
652 // Correct two words for bailout id and return address. 657 // Correct two words for bailout id and return address.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 int double_regs_offset = FrameDescription::double_registers_offset(); 692 int double_regs_offset = FrameDescription::double_registers_offset();
688 for (int i = 0; i < DwVfpRegister::kMaxNumAllocatableRegisters; ++i) { 693 for (int i = 0; i < DwVfpRegister::kMaxNumAllocatableRegisters; ++i) {
689 int dst_offset = i * kDoubleSize + double_regs_offset; 694 int dst_offset = i * kDoubleSize + double_regs_offset;
690 int src_offset = i * kDoubleSize + kNumberOfRegisters * kPointerSize; 695 int src_offset = i * kDoubleSize + kNumberOfRegisters * kPointerSize;
691 __ vldr(d0, sp, src_offset); 696 __ vldr(d0, sp, src_offset);
692 __ vstr(d0, r1, dst_offset); 697 __ vstr(d0, r1, dst_offset);
693 } 698 }
694 699
695 // Remove the bailout id, eventually return address, and the saved registers 700 // Remove the bailout id, eventually return address, and the saved registers
696 // from the stack. 701 // from the stack.
697 if (type() == EAGER || type() == OSR) { 702 if (type() == EAGER || type() == SOFT || type() == OSR) {
698 __ add(sp, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize))); 703 __ add(sp, sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize)));
699 } else { 704 } else {
700 __ add(sp, sp, Operand(kSavedRegistersAreaSize + (2 * kPointerSize))); 705 __ add(sp, sp, Operand(kSavedRegistersAreaSize + (2 * kPointerSize)));
701 } 706 }
702 707
703 // Compute a pointer to the unwinding limit in register r2; that is 708 // Compute a pointer to the unwinding limit in register r2; that is
704 // the first stack slot not part of the input frame. 709 // the first stack slot not part of the input frame.
705 __ ldr(r2, MemOperand(r1, FrameDescription::frame_size_offset())); 710 __ ldr(r2, MemOperand(r1, FrameDescription::frame_size_offset()));
706 __ add(r2, r2, sp); 711 __ add(r2, r2, sp);
707 712
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 } 811 }
807 812
808 813
809 void Deoptimizer::TableEntryGenerator::GeneratePrologue() { 814 void Deoptimizer::TableEntryGenerator::GeneratePrologue() {
810 // Create a sequence of deoptimization entries. Note that any 815 // Create a sequence of deoptimization entries. Note that any
811 // registers may be still live. 816 // registers may be still live.
812 Label done; 817 Label done;
813 for (int i = 0; i < count(); i++) { 818 for (int i = 0; i < count(); i++) {
814 int start = masm()->pc_offset(); 819 int start = masm()->pc_offset();
815 USE(start); 820 USE(start);
816 if (type() == EAGER) { 821 if (type() == EAGER || type() == SOFT) {
817 __ nop(); 822 __ nop();
818 } else { 823 } else {
819 // Emulate ia32 like call by pushing return address to stack. 824 // Emulate ia32 like call by pushing return address to stack.
820 __ push(lr); 825 __ push(lr);
821 } 826 }
822 __ mov(ip, Operand(i)); 827 __ mov(ip, Operand(i));
823 __ push(ip); 828 __ push(ip);
824 __ b(&done); 829 __ b(&done);
825 ASSERT(masm()->pc_offset() - start == table_entry_size_); 830 ASSERT(masm()->pc_offset() - start == table_entry_size_);
826 } 831 }
827 __ bind(&done); 832 __ bind(&done);
828 } 833 }
829 834
830 #undef __ 835 #undef __
831 836
832 } } // namespace v8::internal 837 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698