OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/intermediate_language.h" | 5 #include "vm/intermediate_language.h" |
6 | 6 |
7 #include "vm/bit_vector.h" | 7 #include "vm/bit_vector.h" |
8 #include "vm/constant_propagator.h" | 8 #include "vm/constant_propagator.h" |
9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 1926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1937 } | 1937 } |
1938 return this; | 1938 return this; |
1939 } | 1939 } |
1940 | 1940 |
1941 | 1941 |
1942 Definition* InstantiateTypeArgumentsInstr::Canonicalize(FlowGraph* flow_graph) { | 1942 Definition* InstantiateTypeArgumentsInstr::Canonicalize(FlowGraph* flow_graph) { |
1943 return (FLAG_enable_type_checks || HasUses()) ? this : NULL; | 1943 return (FLAG_enable_type_checks || HasUses()) ? this : NULL; |
1944 } | 1944 } |
1945 | 1945 |
1946 | 1946 |
1947 LocationSummary* DebugStepCheckInstr::MakeLocationSummary(Isolate* isolate, | 1947 LocationSummary* DebugStepCheckInstr::MakeLocationSummary(Zone* zone, |
1948 bool opt) const { | 1948 bool opt) const { |
1949 const intptr_t kNumInputs = 0; | 1949 const intptr_t kNumInputs = 0; |
1950 const intptr_t kNumTemps = 0; | 1950 const intptr_t kNumTemps = 0; |
1951 LocationSummary* locs = new(isolate) LocationSummary( | 1951 LocationSummary* locs = new(zone) LocationSummary( |
1952 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 1952 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
1953 return locs; | 1953 return locs; |
1954 } | 1954 } |
1955 | 1955 |
1956 | 1956 |
1957 Instruction* DebugStepCheckInstr::Canonicalize(FlowGraph* flow_graph) { | 1957 Instruction* DebugStepCheckInstr::Canonicalize(FlowGraph* flow_graph) { |
1958 return NULL; | 1958 return NULL; |
1959 } | 1959 } |
1960 | 1960 |
1961 | 1961 |
1962 static bool HasTryBlockUse(Value* use_list) { | 1962 static bool HasTryBlockUse(Value* use_list) { |
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2537 } | 2537 } |
2538 | 2538 |
2539 | 2539 |
2540 // Shared code generation methods (EmitNativeCode and | 2540 // Shared code generation methods (EmitNativeCode and |
2541 // MakeLocationSummary). Only assembly code that can be shared across all | 2541 // MakeLocationSummary). Only assembly code that can be shared across all |
2542 // architectures can be used. Machine specific register allocation and code | 2542 // architectures can be used. Machine specific register allocation and code |
2543 // generation is located in intermediate_language_<arch>.cc | 2543 // generation is located in intermediate_language_<arch>.cc |
2544 | 2544 |
2545 #define __ compiler->assembler()-> | 2545 #define __ compiler->assembler()-> |
2546 | 2546 |
2547 LocationSummary* GraphEntryInstr::MakeLocationSummary(Isolate* isolate, | 2547 LocationSummary* GraphEntryInstr::MakeLocationSummary(Zone* zone, |
2548 bool optimizing) const { | 2548 bool optimizing) const { |
2549 UNREACHABLE(); | 2549 UNREACHABLE(); |
2550 return NULL; | 2550 return NULL; |
2551 } | 2551 } |
2552 | 2552 |
2553 | 2553 |
2554 LocationSummary* JoinEntryInstr::MakeLocationSummary(Isolate* isolate, | 2554 LocationSummary* JoinEntryInstr::MakeLocationSummary(Zone* zone, |
2555 bool optimizing) const { | 2555 bool optimizing) const { |
2556 UNREACHABLE(); | 2556 UNREACHABLE(); |
2557 return NULL; | 2557 return NULL; |
2558 } | 2558 } |
2559 | 2559 |
2560 | 2560 |
2561 void JoinEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2561 void JoinEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2562 __ Bind(compiler->GetJumpLabel(this)); | 2562 __ Bind(compiler->GetJumpLabel(this)); |
2563 if (!compiler->is_optimizing()) { | 2563 if (!compiler->is_optimizing()) { |
2564 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, | 2564 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, |
2565 GetDeoptId(), | 2565 GetDeoptId(), |
2566 Scanner::kNoSourcePos); | 2566 Scanner::kNoSourcePos); |
2567 } | 2567 } |
2568 if (HasParallelMove()) { | 2568 if (HasParallelMove()) { |
2569 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 2569 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
2570 } | 2570 } |
2571 } | 2571 } |
2572 | 2572 |
2573 | 2573 |
2574 LocationSummary* TargetEntryInstr::MakeLocationSummary(Isolate* isolate, | 2574 LocationSummary* TargetEntryInstr::MakeLocationSummary(Zone* zone, |
2575 bool optimizing) const { | 2575 bool optimizing) const { |
2576 UNREACHABLE(); | 2576 UNREACHABLE(); |
2577 return NULL; | 2577 return NULL; |
2578 } | 2578 } |
2579 | 2579 |
2580 | 2580 |
2581 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2581 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2582 __ Bind(compiler->GetJumpLabel(this)); | 2582 __ Bind(compiler->GetJumpLabel(this)); |
2583 if (!compiler->is_optimizing()) { | 2583 if (!compiler->is_optimizing()) { |
2584 if (compiler->NeedsEdgeCounter(this)) { | 2584 if (compiler->NeedsEdgeCounter(this)) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2626 } | 2626 } |
2627 | 2627 |
2628 ASSERT(offset > 0); | 2628 ASSERT(offset > 0); |
2629 offset -= Assembler::EntryPointToPcMarkerOffset(); | 2629 offset -= Assembler::EntryPointToPcMarkerOffset(); |
2630 offsets_.SetInt32(i * element_size, offset); | 2630 offsets_.SetInt32(i * element_size, offset); |
2631 } | 2631 } |
2632 } | 2632 } |
2633 | 2633 |
2634 | 2634 |
2635 LocationSummary* IndirectEntryInstr::MakeLocationSummary( | 2635 LocationSummary* IndirectEntryInstr::MakeLocationSummary( |
2636 Isolate* isolate, bool optimizing) const { | 2636 Zone* zone, bool optimizing) const { |
2637 return JoinEntryInstr::MakeLocationSummary(isolate, optimizing); | 2637 return JoinEntryInstr::MakeLocationSummary(zone, optimizing); |
2638 } | 2638 } |
2639 | 2639 |
2640 | 2640 |
2641 void IndirectEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2641 void IndirectEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2642 JoinEntryInstr::EmitNativeCode(compiler); | 2642 JoinEntryInstr::EmitNativeCode(compiler); |
2643 } | 2643 } |
2644 | 2644 |
2645 | 2645 |
2646 LocationSummary* PhiInstr::MakeLocationSummary(Isolate* isolate, | 2646 LocationSummary* PhiInstr::MakeLocationSummary(Zone* zone, |
2647 bool optimizing) const { | 2647 bool optimizing) const { |
2648 UNREACHABLE(); | 2648 UNREACHABLE(); |
2649 return NULL; | 2649 return NULL; |
2650 } | 2650 } |
2651 | 2651 |
2652 | 2652 |
2653 void PhiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2653 void PhiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2654 UNREACHABLE(); | 2654 UNREACHABLE(); |
2655 } | 2655 } |
2656 | 2656 |
2657 | 2657 |
2658 LocationSummary* RedefinitionInstr::MakeLocationSummary(Isolate* isolate, | 2658 LocationSummary* RedefinitionInstr::MakeLocationSummary(Zone* zone, |
2659 bool optimizing) const { | 2659 bool optimizing) const { |
2660 UNREACHABLE(); | 2660 UNREACHABLE(); |
2661 return NULL; | 2661 return NULL; |
2662 } | 2662 } |
2663 | 2663 |
2664 | 2664 |
2665 void RedefinitionInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2665 void RedefinitionInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2666 UNREACHABLE(); | 2666 UNREACHABLE(); |
2667 } | 2667 } |
2668 | 2668 |
2669 | 2669 |
2670 LocationSummary* ParameterInstr::MakeLocationSummary(Isolate* isolate, | 2670 LocationSummary* ParameterInstr::MakeLocationSummary(Zone* zone, |
2671 bool optimizing) const { | 2671 bool optimizing) const { |
2672 UNREACHABLE(); | 2672 UNREACHABLE(); |
2673 return NULL; | 2673 return NULL; |
2674 } | 2674 } |
2675 | 2675 |
2676 | 2676 |
2677 void ParameterInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2677 void ParameterInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2678 UNREACHABLE(); | 2678 UNREACHABLE(); |
2679 } | 2679 } |
2680 | 2680 |
2681 | 2681 |
2682 bool ParallelMoveInstr::IsRedundant() const { | 2682 bool ParallelMoveInstr::IsRedundant() const { |
2683 for (intptr_t i = 0; i < moves_.length(); i++) { | 2683 for (intptr_t i = 0; i < moves_.length(); i++) { |
2684 if (!moves_[i]->IsRedundant()) { | 2684 if (!moves_[i]->IsRedundant()) { |
2685 return false; | 2685 return false; |
2686 } | 2686 } |
2687 } | 2687 } |
2688 return true; | 2688 return true; |
2689 } | 2689 } |
2690 | 2690 |
2691 | 2691 |
2692 LocationSummary* ParallelMoveInstr::MakeLocationSummary(Isolate* isolate, | 2692 LocationSummary* ParallelMoveInstr::MakeLocationSummary(Zone* zone, |
2693 bool optimizing) const { | 2693 bool optimizing) const { |
2694 return NULL; | 2694 return NULL; |
2695 } | 2695 } |
2696 | 2696 |
2697 | 2697 |
2698 void ParallelMoveInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2698 void ParallelMoveInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2699 UNREACHABLE(); | 2699 UNREACHABLE(); |
2700 } | 2700 } |
2701 | 2701 |
2702 | 2702 |
2703 LocationSummary* ConstraintInstr::MakeLocationSummary(Isolate* isolate, | 2703 LocationSummary* ConstraintInstr::MakeLocationSummary(Zone* zone, |
2704 bool optimizing) const { | 2704 bool optimizing) const { |
2705 UNREACHABLE(); | 2705 UNREACHABLE(); |
2706 return NULL; | 2706 return NULL; |
2707 } | 2707 } |
2708 | 2708 |
2709 | 2709 |
2710 void ConstraintInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2710 void ConstraintInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2711 UNREACHABLE(); | 2711 UNREACHABLE(); |
2712 } | 2712 } |
2713 | 2713 |
2714 | 2714 |
2715 LocationSummary* MaterializeObjectInstr::MakeLocationSummary( | 2715 LocationSummary* MaterializeObjectInstr::MakeLocationSummary( |
2716 Isolate* isolate, bool optimizing) const { | 2716 Zone* zone, bool optimizing) const { |
2717 UNREACHABLE(); | 2717 UNREACHABLE(); |
2718 return NULL; | 2718 return NULL; |
2719 } | 2719 } |
2720 | 2720 |
2721 | 2721 |
2722 void MaterializeObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2722 void MaterializeObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2723 UNREACHABLE(); | 2723 UNREACHABLE(); |
2724 } | 2724 } |
2725 | 2725 |
2726 | 2726 |
2727 // This function should be kept in sync with | 2727 // This function should be kept in sync with |
2728 // FlowGraphCompiler::SlowPathEnvironmentFor(). | 2728 // FlowGraphCompiler::SlowPathEnvironmentFor(). |
2729 void MaterializeObjectInstr::RemapRegisters(intptr_t* cpu_reg_slots, | 2729 void MaterializeObjectInstr::RemapRegisters(intptr_t* cpu_reg_slots, |
2730 intptr_t* fpu_reg_slots) { | 2730 intptr_t* fpu_reg_slots) { |
2731 if (registers_remapped_) { | 2731 if (registers_remapped_) { |
2732 return; | 2732 return; |
2733 } | 2733 } |
2734 registers_remapped_ = true; | 2734 registers_remapped_ = true; |
2735 | 2735 |
2736 for (intptr_t i = 0; i < InputCount(); i++) { | 2736 for (intptr_t i = 0; i < InputCount(); i++) { |
2737 locations_[i] = LocationAt(i).RemapForSlowPath( | 2737 locations_[i] = LocationAt(i).RemapForSlowPath( |
2738 InputAt(i)->definition(), cpu_reg_slots, fpu_reg_slots); | 2738 InputAt(i)->definition(), cpu_reg_slots, fpu_reg_slots); |
2739 } | 2739 } |
2740 } | 2740 } |
2741 | 2741 |
2742 | 2742 |
2743 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate, | 2743 LocationSummary* CurrentContextInstr::MakeLocationSummary(Zone* zone, |
2744 bool opt) const { | 2744 bool opt) const { |
2745 // Only appears in initial definitions, never in normal code. | 2745 // Only appears in initial definitions, never in normal code. |
2746 UNREACHABLE(); | 2746 UNREACHABLE(); |
2747 return NULL; | 2747 return NULL; |
2748 } | 2748 } |
2749 | 2749 |
2750 | 2750 |
2751 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2751 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2752 // Only appears in initial definitions, never in normal code. | 2752 // Only appears in initial definitions, never in normal code. |
2753 UNREACHABLE(); | 2753 UNREACHABLE(); |
2754 } | 2754 } |
2755 | 2755 |
2756 | 2756 |
2757 LocationSummary* PushTempInstr::MakeLocationSummary(Isolate* isolate, | 2757 LocationSummary* PushTempInstr::MakeLocationSummary(Zone* zone, |
2758 bool optimizing) const { | 2758 bool optimizing) const { |
2759 return LocationSummary::Make(isolate, | 2759 return LocationSummary::Make(zone, |
2760 1, | 2760 1, |
2761 Location::NoLocation(), | 2761 Location::NoLocation(), |
2762 LocationSummary::kNoCall); | 2762 LocationSummary::kNoCall); |
2763 } | 2763 } |
2764 | 2764 |
2765 | 2765 |
2766 void PushTempInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2766 void PushTempInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2767 ASSERT(!compiler->is_optimizing()); | 2767 ASSERT(!compiler->is_optimizing()); |
2768 // Nothing to do. | 2768 // Nothing to do. |
2769 } | 2769 } |
2770 | 2770 |
2771 | 2771 |
2772 LocationSummary* DropTempsInstr::MakeLocationSummary(Isolate* isolate, | 2772 LocationSummary* DropTempsInstr::MakeLocationSummary(Zone* zone, |
2773 bool optimizing) const { | 2773 bool optimizing) const { |
2774 return (InputCount() == 1) | 2774 return (InputCount() == 1) |
2775 ? LocationSummary::Make(isolate, | 2775 ? LocationSummary::Make(zone, |
2776 1, | 2776 1, |
2777 Location::SameAsFirstInput(), | 2777 Location::SameAsFirstInput(), |
2778 LocationSummary::kNoCall) | 2778 LocationSummary::kNoCall) |
2779 : LocationSummary::Make(isolate, | 2779 : LocationSummary::Make(zone, |
2780 0, | 2780 0, |
2781 Location::NoLocation(), | 2781 Location::NoLocation(), |
2782 LocationSummary::kNoCall); | 2782 LocationSummary::kNoCall); |
2783 } | 2783 } |
2784 | 2784 |
2785 | 2785 |
2786 void DropTempsInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2786 void DropTempsInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2787 ASSERT(!compiler->is_optimizing()); | 2787 ASSERT(!compiler->is_optimizing()); |
2788 // Assert that register assignment is correct. | 2788 // Assert that register assignment is correct. |
2789 ASSERT((InputCount() == 0) || (locs()->out(0).reg() == locs()->in(0).reg())); | 2789 ASSERT((InputCount() == 0) || (locs()->out(0).reg() == locs()->in(0).reg())); |
2790 __ Drop(num_temps()); | 2790 __ Drop(num_temps()); |
2791 } | 2791 } |
2792 | 2792 |
2793 | 2793 |
2794 StrictCompareInstr::StrictCompareInstr(intptr_t token_pos, | 2794 StrictCompareInstr::StrictCompareInstr(intptr_t token_pos, |
2795 Token::Kind kind, | 2795 Token::Kind kind, |
2796 Value* left, | 2796 Value* left, |
2797 Value* right, | 2797 Value* right, |
2798 bool needs_number_check) | 2798 bool needs_number_check) |
2799 : ComparisonInstr(token_pos, | 2799 : ComparisonInstr(token_pos, |
2800 kind, | 2800 kind, |
2801 left, | 2801 left, |
2802 right, | 2802 right, |
2803 Isolate::Current()->GetNextDeoptId()), | 2803 Isolate::Current()->GetNextDeoptId()), |
2804 needs_number_check_(needs_number_check) { | 2804 needs_number_check_(needs_number_check) { |
2805 ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT)); | 2805 ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT)); |
2806 } | 2806 } |
2807 | 2807 |
2808 | 2808 |
2809 LocationSummary* InstanceCallInstr::MakeLocationSummary(Isolate* isolate, | 2809 LocationSummary* InstanceCallInstr::MakeLocationSummary(Zone* zone, |
2810 bool optimizing) const { | 2810 bool optimizing) const { |
2811 return MakeCallSummary(isolate); | 2811 return MakeCallSummary(zone); |
2812 } | 2812 } |
2813 | 2813 |
2814 | 2814 |
2815 static uword TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) { | 2815 static uword TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) { |
2816 if (!FLAG_two_args_smi_icd) { | 2816 if (!FLAG_two_args_smi_icd) { |
2817 return 0; | 2817 return 0; |
2818 } | 2818 } |
2819 StubCode* stub_code = Isolate::Current()->stub_code(); | 2819 StubCode* stub_code = Isolate::Current()->stub_code(); |
2820 switch (kind) { | 2820 switch (kind) { |
2821 case Token::kADD: return stub_code->SmiAddInlineCacheEntryPoint(); | 2821 case Token::kADD: return stub_code->SmiAddInlineCacheEntryPoint(); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2930 const Function& target = Function::Handle(ic_data().GetTargetAt(i)); | 2930 const Function& target = Function::Handle(ic_data().GetTargetAt(i)); |
2931 if (!target.IsNoSuchMethodDispatcher() && | 2931 if (!target.IsNoSuchMethodDispatcher() && |
2932 !target.IsInvokeFieldDispatcher()) { | 2932 !target.IsInvokeFieldDispatcher()) { |
2933 return false; | 2933 return false; |
2934 } | 2934 } |
2935 } | 2935 } |
2936 return true; | 2936 return true; |
2937 } | 2937 } |
2938 | 2938 |
2939 | 2939 |
2940 LocationSummary* StaticCallInstr::MakeLocationSummary(Isolate* isolate, | 2940 LocationSummary* StaticCallInstr::MakeLocationSummary(Zone* zone, |
2941 bool optimizing) const { | 2941 bool optimizing) const { |
2942 return MakeCallSummary(isolate); | 2942 return MakeCallSummary(zone); |
2943 } | 2943 } |
2944 | 2944 |
2945 | 2945 |
2946 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2946 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2947 const ICData* call_ic_data = NULL; | 2947 const ICData* call_ic_data = NULL; |
2948 if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) { | 2948 if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) { |
2949 const Array& arguments_descriptor = | 2949 const Array& arguments_descriptor = |
2950 Array::Handle(ArgumentsDescriptor::New(ArgumentCount(), | 2950 Array::Handle(ArgumentsDescriptor::New(ArgumentCount(), |
2951 argument_names())); | 2951 argument_names())); |
2952 MethodRecognizer::Kind recognized_kind = | 2952 MethodRecognizer::Kind recognized_kind = |
(...skipping 28 matching lines...) Expand all Loading... |
2981 void AssertAssignableInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2981 void AssertAssignableInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2982 compiler->GenerateAssertAssignable(token_pos(), | 2982 compiler->GenerateAssertAssignable(token_pos(), |
2983 deopt_id(), | 2983 deopt_id(), |
2984 dst_type(), | 2984 dst_type(), |
2985 dst_name(), | 2985 dst_name(), |
2986 locs()); | 2986 locs()); |
2987 ASSERT(locs()->in(0).reg() == locs()->out(0).reg()); | 2987 ASSERT(locs()->in(0).reg() == locs()->out(0).reg()); |
2988 } | 2988 } |
2989 | 2989 |
2990 | 2990 |
2991 LocationSummary* DeoptimizeInstr::MakeLocationSummary(Isolate* isolate, | 2991 LocationSummary* DeoptimizeInstr::MakeLocationSummary(Zone* zone, |
2992 bool opt) const { | 2992 bool opt) const { |
2993 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall); | 2993 return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall); |
2994 } | 2994 } |
2995 | 2995 |
2996 | 2996 |
2997 void DeoptimizeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2997 void DeoptimizeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2998 __ Jump(compiler->AddDeoptStub(deopt_id(), deopt_reason_)); | 2998 __ Jump(compiler->AddDeoptStub(deopt_id(), deopt_reason_)); |
2999 } | 2999 } |
3000 | 3000 |
3001 | 3001 |
3002 Environment* Environment::From(Isolate* isolate, | 3002 Environment* Environment::From(Isolate* isolate, |
3003 const GrowableArray<Definition*>& definitions, | 3003 const GrowableArray<Definition*>& definitions, |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3490 case Token::kTRUNCDIV: return 0; | 3490 case Token::kTRUNCDIV: return 0; |
3491 case Token::kMOD: return 1; | 3491 case Token::kMOD: return 1; |
3492 default: UNIMPLEMENTED(); return -1; | 3492 default: UNIMPLEMENTED(); return -1; |
3493 } | 3493 } |
3494 } | 3494 } |
3495 | 3495 |
3496 | 3496 |
3497 #undef __ | 3497 #undef __ |
3498 | 3498 |
3499 } // namespace dart | 3499 } // namespace dart |
OLD | NEW |