OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |