| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
| 6 #include "src/compiler/code-generator.h" | 6 #include "src/compiler/code-generator.h" |
| 7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
| 8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
| 9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
| 10 #include "src/compiler/osr.h" | 10 #include "src/compiler/osr.h" |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 __ cvt_s_w(i.OutputDoubleRegister(), i.OutputDoubleRegister()); \ | 470 __ cvt_s_w(i.OutputDoubleRegister(), i.OutputDoubleRegister()); \ |
| 471 __ bind(ool->exit()); \ | 471 __ bind(ool->exit()); \ |
| 472 __ bind(&done); \ | 472 __ bind(&done); \ |
| 473 } | 473 } |
| 474 | 474 |
| 475 void CodeGenerator::AssembleDeconstructFrame() { | 475 void CodeGenerator::AssembleDeconstructFrame() { |
| 476 __ mov(sp, fp); | 476 __ mov(sp, fp); |
| 477 __ Pop(ra, fp); | 477 __ Pop(ra, fp); |
| 478 } | 478 } |
| 479 | 479 |
| 480 void CodeGenerator::AssembleSetupStackPointer() {} | |
| 481 | |
| 482 void CodeGenerator::AssembleDeconstructActivationRecord(int stack_param_delta) { | 480 void CodeGenerator::AssembleDeconstructActivationRecord(int stack_param_delta) { |
| 483 int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); | 481 int sp_slot_delta = TailCallFrameStackSlotDelta(stack_param_delta); |
| 484 if (sp_slot_delta > 0) { | 482 if (sp_slot_delta > 0) { |
| 485 __ addiu(sp, sp, sp_slot_delta * kPointerSize); | 483 __ addiu(sp, sp, sp_slot_delta * kPointerSize); |
| 486 } | 484 } |
| 487 frame_access_state()->SetFrameAccessToDefault(); | 485 frame_access_state()->SetFrameAccessToDefault(); |
| 488 } | 486 } |
| 489 | 487 |
| 490 | 488 |
| 491 void CodeGenerator::AssemblePrepareTailCall(int stack_param_delta) { | 489 void CodeGenerator::AssemblePrepareTailCall(int stack_param_delta) { |
| (...skipping 1128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1620 } | 1618 } |
| 1621 | 1619 |
| 1622 | 1620 |
| 1623 void CodeGenerator::AssembleDeoptimizerCall( | 1621 void CodeGenerator::AssembleDeoptimizerCall( |
| 1624 int deoptimization_id, Deoptimizer::BailoutType bailout_type) { | 1622 int deoptimization_id, Deoptimizer::BailoutType bailout_type) { |
| 1625 Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( | 1623 Address deopt_entry = Deoptimizer::GetDeoptimizationEntry( |
| 1626 isolate(), deoptimization_id, bailout_type); | 1624 isolate(), deoptimization_id, bailout_type); |
| 1627 __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY); | 1625 __ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY); |
| 1628 } | 1626 } |
| 1629 | 1627 |
| 1628 void CodeGenerator::FinishFrame(Frame* frame) { |
| 1629 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
| 1630 | 1630 |
| 1631 void CodeGenerator::AssemblePrologue() { | 1631 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters(); |
| 1632 if (saves_fpu != 0) { |
| 1633 frame->AlignSavedCalleeRegisterSlots(); |
| 1634 } |
| 1635 |
| 1636 if (saves_fpu != 0) { |
| 1637 int count = base::bits::CountPopulation32(saves_fpu); |
| 1638 DCHECK(kNumCalleeSavedFPU == count); |
| 1639 frame->AllocateSavedCalleeRegisterSlots(count * |
| 1640 (kDoubleSize / kPointerSize)); |
| 1641 } |
| 1642 |
| 1643 const RegList saves = descriptor->CalleeSavedRegisters(); |
| 1644 if (saves != 0) { |
| 1645 int count = base::bits::CountPopulation32(saves); |
| 1646 DCHECK(kNumCalleeSaved == count + 1); |
| 1647 frame->AllocateSavedCalleeRegisterSlots(count); |
| 1648 } |
| 1649 } |
| 1650 |
| 1651 void CodeGenerator::AssembleConstructFrame() { |
| 1632 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); | 1652 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
| 1633 int stack_shrink_slots = frame()->GetSpillSlotCount(); | |
| 1634 if (frame_access_state()->has_frame()) { | 1653 if (frame_access_state()->has_frame()) { |
| 1635 if (descriptor->IsCFunctionCall()) { | 1654 if (descriptor->IsCFunctionCall()) { |
| 1636 __ Push(ra, fp); | 1655 __ Push(ra, fp); |
| 1637 __ mov(fp, sp); | 1656 __ mov(fp, sp); |
| 1638 } else if (descriptor->IsJSFunctionCall()) { | 1657 } else if (descriptor->IsJSFunctionCall()) { |
| 1639 __ Prologue(this->info()->GeneratePreagedPrologue()); | 1658 __ Prologue(this->info()->GeneratePreagedPrologue()); |
| 1640 } else { | 1659 } else { |
| 1641 __ StubPrologue(info()->GetOutputStackFrameType()); | 1660 __ StubPrologue(info()->GetOutputStackFrameType()); |
| 1642 } | 1661 } |
| 1643 } | 1662 } |
| 1644 | 1663 |
| 1664 int shrink_slots = frame()->GetSpillSlotCount(); |
| 1665 |
| 1645 if (info()->is_osr()) { | 1666 if (info()->is_osr()) { |
| 1646 // TurboFan OSR-compiled functions cannot be entered directly. | 1667 // TurboFan OSR-compiled functions cannot be entered directly. |
| 1647 __ Abort(kShouldNotDirectlyEnterOsrFunction); | 1668 __ Abort(kShouldNotDirectlyEnterOsrFunction); |
| 1648 | 1669 |
| 1649 // Unoptimized code jumps directly to this entrypoint while the unoptimized | 1670 // Unoptimized code jumps directly to this entrypoint while the unoptimized |
| 1650 // frame is still on the stack. Optimized code uses OSR values directly from | 1671 // frame is still on the stack. Optimized code uses OSR values directly from |
| 1651 // the unoptimized frame. Thus, all that needs to be done is to allocate the | 1672 // the unoptimized frame. Thus, all that needs to be done is to allocate the |
| 1652 // remaining stack slots. | 1673 // remaining stack slots. |
| 1653 if (FLAG_code_comments) __ RecordComment("-- OSR entrypoint --"); | 1674 if (FLAG_code_comments) __ RecordComment("-- OSR entrypoint --"); |
| 1654 osr_pc_offset_ = __ pc_offset(); | 1675 osr_pc_offset_ = __ pc_offset(); |
| 1655 stack_shrink_slots -= OsrHelper(info()).UnoptimizedFrameSlots(); | 1676 shrink_slots -= OsrHelper(info()).UnoptimizedFrameSlots(); |
| 1656 } | 1677 } |
| 1657 | 1678 |
| 1658 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters(); | 1679 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters(); |
| 1659 if (saves_fpu != 0) { | 1680 if (shrink_slots > 0) { |
| 1660 stack_shrink_slots += frame()->AlignSavedCalleeRegisterSlots(); | 1681 __ Subu(sp, sp, Operand(shrink_slots * kPointerSize)); |
| 1661 } | |
| 1662 if (stack_shrink_slots > 0) { | |
| 1663 __ Subu(sp, sp, Operand(stack_shrink_slots * kPointerSize)); | |
| 1664 } | 1682 } |
| 1665 | 1683 |
| 1666 // Save callee-saved FPU registers. | 1684 // Save callee-saved FPU registers. |
| 1667 if (saves_fpu != 0) { | 1685 if (saves_fpu != 0) { |
| 1668 __ MultiPushFPU(saves_fpu); | 1686 __ MultiPushFPU(saves_fpu); |
| 1669 int count = base::bits::CountPopulation32(saves_fpu); | |
| 1670 DCHECK(kNumCalleeSavedFPU == count); | |
| 1671 frame()->AllocateSavedCalleeRegisterSlots(count * | |
| 1672 (kDoubleSize / kPointerSize)); | |
| 1673 } | 1687 } |
| 1674 | 1688 |
| 1675 const RegList saves = descriptor->CalleeSavedRegisters(); | 1689 const RegList saves = descriptor->CalleeSavedRegisters(); |
| 1676 if (saves != 0) { | 1690 if (saves != 0) { |
| 1677 // Save callee-saved registers. | 1691 // Save callee-saved registers. |
| 1678 __ MultiPush(saves); | 1692 __ MultiPush(saves); |
| 1679 // kNumCalleeSaved includes the fp register, but the fp register | 1693 DCHECK(kNumCalleeSaved == base::bits::CountPopulation32(saves) + 1); |
| 1680 // is saved separately in TF. | |
| 1681 int count = base::bits::CountPopulation32(saves); | |
| 1682 DCHECK(kNumCalleeSaved == count + 1); | |
| 1683 frame()->AllocateSavedCalleeRegisterSlots(count); | |
| 1684 } | 1694 } |
| 1685 } | 1695 } |
| 1686 | 1696 |
| 1687 | 1697 |
| 1688 void CodeGenerator::AssembleReturn() { | 1698 void CodeGenerator::AssembleReturn() { |
| 1689 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); | 1699 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
| 1690 int pop_count = static_cast<int>(descriptor->StackParameterCount()); | 1700 int pop_count = static_cast<int>(descriptor->StackParameterCount()); |
| 1691 | 1701 |
| 1692 // Restore GP registers. | 1702 // Restore GP registers. |
| 1693 const RegList saves = descriptor->CalleeSavedRegisters(); | 1703 const RegList saves = descriptor->CalleeSavedRegisters(); |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1931 padding_size -= v8::internal::Assembler::kInstrSize; | 1941 padding_size -= v8::internal::Assembler::kInstrSize; |
| 1932 } | 1942 } |
| 1933 } | 1943 } |
| 1934 } | 1944 } |
| 1935 | 1945 |
| 1936 #undef __ | 1946 #undef __ |
| 1937 | 1947 |
| 1938 } // namespace compiler | 1948 } // namespace compiler |
| 1939 } // namespace internal | 1949 } // namespace internal |
| 1940 } // namespace v8 | 1950 } // namespace v8 |
| OLD | NEW |