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

Side by Side Diff: runtime/vm/intermediate_language_arm.cc

Issue 51653006: Track live instance and allocation counts for classes (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 1 month 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 (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/globals.h" // Needed here to get TARGET_ARCH_ARM. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM.
6 #if defined(TARGET_ARCH_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/intermediate_language.h" 8 #include "vm/intermediate_language.h"
9 9
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 2539 matching lines...) Expand 10 before | Expand all | Expand 10 after
2550 } else { 2550 } else {
2551 __ orr(IP, left, ShifterOperand(right)); 2551 __ orr(IP, left, ShifterOperand(right));
2552 __ tst(IP, ShifterOperand(kSmiTagMask)); 2552 __ tst(IP, ShifterOperand(kSmiTagMask));
2553 } 2553 }
2554 __ b(deopt, EQ); 2554 __ b(deopt, EQ);
2555 } 2555 }
2556 2556
2557 2557
2558 LocationSummary* BoxDoubleInstr::MakeLocationSummary() const { 2558 LocationSummary* BoxDoubleInstr::MakeLocationSummary() const {
2559 const intptr_t kNumInputs = 1; 2559 const intptr_t kNumInputs = 1;
2560 const intptr_t kNumTemps = 0; 2560 const intptr_t kNumTemps = 1;
2561 LocationSummary* summary = 2561 LocationSummary* summary =
2562 new LocationSummary(kNumInputs, 2562 new LocationSummary(kNumInputs,
2563 kNumTemps, 2563 kNumTemps,
2564 LocationSummary::kCallOnSlowPath); 2564 LocationSummary::kCallOnSlowPath);
2565 summary->set_in(0, Location::RequiresFpuRegister()); 2565 summary->set_in(0, Location::RequiresFpuRegister());
2566 summary->set_temp(0, Location::RequiresRegister());
2566 summary->set_out(Location::RequiresRegister()); 2567 summary->set_out(Location::RequiresRegister());
2567 return summary; 2568 return summary;
2568 } 2569 }
2569 2570
2570 2571
2571 class BoxDoubleSlowPath : public SlowPathCode { 2572 class BoxDoubleSlowPath : public SlowPathCode {
2572 public: 2573 public:
2573 explicit BoxDoubleSlowPath(BoxDoubleInstr* instruction) 2574 explicit BoxDoubleSlowPath(BoxDoubleInstr* instruction)
2574 : instruction_(instruction) { } 2575 : instruction_(instruction) { }
2575 2576
(...skipping 26 matching lines...) Expand all
2602 2603
2603 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2604 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2604 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); 2605 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this);
2605 compiler->AddSlowPathCode(slow_path); 2606 compiler->AddSlowPathCode(slow_path);
2606 2607
2607 const Register out_reg = locs()->out().reg(); 2608 const Register out_reg = locs()->out().reg();
2608 const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg()); 2609 const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
2609 2610
2610 __ TryAllocate(compiler->double_class(), 2611 __ TryAllocate(compiler->double_class(),
2611 slow_path->entry_label(), 2612 slow_path->entry_label(),
2612 out_reg); 2613 out_reg,
2614 locs()->temp(0).reg());
2613 __ Bind(slow_path->exit_label()); 2615 __ Bind(slow_path->exit_label());
2614 __ StoreDToOffset(value, out_reg, Double::value_offset() - kHeapObjectTag); 2616 __ StoreDToOffset(value, out_reg, Double::value_offset() - kHeapObjectTag);
2615 } 2617 }
2616 2618
2617 2619
2618 LocationSummary* UnboxDoubleInstr::MakeLocationSummary() const { 2620 LocationSummary* UnboxDoubleInstr::MakeLocationSummary() const {
2619 const intptr_t kNumInputs = 1; 2621 const intptr_t kNumInputs = 1;
2620 const intptr_t value_cid = value()->Type()->ToCid(); 2622 const intptr_t value_cid = value()->Type()->ToCid();
2621 const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid)); 2623 const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid));
2622 const bool needs_writable_input = (value_cid == kSmiCid); 2624 const bool needs_writable_input = (value_cid == kSmiCid);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2658 __ mov(IP, ShifterOperand(value, ASR, 1)); // Copy and untag. 2660 __ mov(IP, ShifterOperand(value, ASR, 1)); // Copy and untag.
2659 __ vmovsr(STMP, IP); 2661 __ vmovsr(STMP, IP);
2660 __ vcvtdi(result, STMP); 2662 __ vcvtdi(result, STMP);
2661 __ Bind(&done); 2663 __ Bind(&done);
2662 } 2664 }
2663 } 2665 }
2664 2666
2665 2667
2666 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary() const { 2668 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary() const {
2667 const intptr_t kNumInputs = 1; 2669 const intptr_t kNumInputs = 1;
2668 const intptr_t kNumTemps = 0; 2670 const intptr_t kNumTemps = 1;
2669 LocationSummary* summary = 2671 LocationSummary* summary =
2670 new LocationSummary(kNumInputs, 2672 new LocationSummary(kNumInputs,
2671 kNumTemps, 2673 kNumTemps,
2672 LocationSummary::kCallOnSlowPath); 2674 LocationSummary::kCallOnSlowPath);
2673 summary->set_in(0, Location::RequiresFpuRegister()); 2675 summary->set_in(0, Location::RequiresFpuRegister());
2676 summary->set_temp(0, Location::RequiresRegister());
2674 summary->set_out(Location::RequiresRegister()); 2677 summary->set_out(Location::RequiresRegister());
2675 return summary; 2678 return summary;
2676 } 2679 }
2677 2680
2678 2681
2679 class BoxFloat32x4SlowPath : public SlowPathCode { 2682 class BoxFloat32x4SlowPath : public SlowPathCode {
2680 public: 2683 public:
2681 explicit BoxFloat32x4SlowPath(BoxFloat32x4Instr* instruction) 2684 explicit BoxFloat32x4SlowPath(BoxFloat32x4Instr* instruction)
2682 : instruction_(instruction) { } 2685 : instruction_(instruction) { }
2683 2686
(...skipping 28 matching lines...) Expand all
2712 BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this); 2715 BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this);
2713 compiler->AddSlowPathCode(slow_path); 2716 compiler->AddSlowPathCode(slow_path);
2714 2717
2715 Register out_reg = locs()->out().reg(); 2718 Register out_reg = locs()->out().reg();
2716 QRegister value = locs()->in(0).fpu_reg(); 2719 QRegister value = locs()->in(0).fpu_reg();
2717 DRegister value_even = EvenDRegisterOf(value); 2720 DRegister value_even = EvenDRegisterOf(value);
2718 DRegister value_odd = OddDRegisterOf(value); 2721 DRegister value_odd = OddDRegisterOf(value);
2719 2722
2720 __ TryAllocate(compiler->float32x4_class(), 2723 __ TryAllocate(compiler->float32x4_class(),
2721 slow_path->entry_label(), 2724 slow_path->entry_label(),
2722 out_reg); 2725 out_reg,
2726 locs()->temp(0).reg());
2723 __ Bind(slow_path->exit_label()); 2727 __ Bind(slow_path->exit_label());
2724 2728
2725 __ StoreDToOffset(value_even, out_reg, 2729 __ StoreDToOffset(value_even, out_reg,
2726 Float32x4::value_offset() - kHeapObjectTag); 2730 Float32x4::value_offset() - kHeapObjectTag);
2727 __ StoreDToOffset(value_odd, out_reg, 2731 __ StoreDToOffset(value_odd, out_reg,
2728 Float32x4::value_offset() + 2*kWordSize - kHeapObjectTag); 2732 Float32x4::value_offset() + 2*kWordSize - kHeapObjectTag);
2729 } 2733 }
2730 2734
2731 2735
2732 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary() const { 2736 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary() const {
(...skipping 30 matching lines...) Expand all
2763 const DRegister result_odd = OddDRegisterOf(result); 2767 const DRegister result_odd = OddDRegisterOf(result);
2764 __ LoadDFromOffset(result_even, value, 2768 __ LoadDFromOffset(result_even, value,
2765 Float32x4::value_offset() - kHeapObjectTag); 2769 Float32x4::value_offset() - kHeapObjectTag);
2766 __ LoadDFromOffset(result_odd, value, 2770 __ LoadDFromOffset(result_odd, value,
2767 Float32x4::value_offset() + 2*kWordSize - kHeapObjectTag); 2771 Float32x4::value_offset() + 2*kWordSize - kHeapObjectTag);
2768 } 2772 }
2769 2773
2770 2774
2771 LocationSummary* BoxInt32x4Instr::MakeLocationSummary() const { 2775 LocationSummary* BoxInt32x4Instr::MakeLocationSummary() const {
2772 const intptr_t kNumInputs = 1; 2776 const intptr_t kNumInputs = 1;
2773 const intptr_t kNumTemps = 0; 2777 const intptr_t kNumTemps = 1;
2774 LocationSummary* summary = 2778 LocationSummary* summary =
2775 new LocationSummary(kNumInputs, 2779 new LocationSummary(kNumInputs,
2776 kNumTemps, 2780 kNumTemps,
2777 LocationSummary::kCallOnSlowPath); 2781 LocationSummary::kCallOnSlowPath);
2778 summary->set_in(0, Location::RequiresFpuRegister()); 2782 summary->set_in(0, Location::RequiresFpuRegister());
2783 summary->set_temp(0, Location::RequiresRegister());
2779 summary->set_out(Location::RequiresRegister()); 2784 summary->set_out(Location::RequiresRegister());
2780 return summary; 2785 return summary;
2781 } 2786 }
2782 2787
2783 2788
2784 class BoxInt32x4SlowPath : public SlowPathCode { 2789 class BoxInt32x4SlowPath : public SlowPathCode {
2785 public: 2790 public:
2786 explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction) 2791 explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction)
2787 : instruction_(instruction) { } 2792 : instruction_(instruction) { }
2788 2793
(...skipping 28 matching lines...) Expand all
2817 BoxInt32x4SlowPath* slow_path = new BoxInt32x4SlowPath(this); 2822 BoxInt32x4SlowPath* slow_path = new BoxInt32x4SlowPath(this);
2818 compiler->AddSlowPathCode(slow_path); 2823 compiler->AddSlowPathCode(slow_path);
2819 2824
2820 Register out_reg = locs()->out().reg(); 2825 Register out_reg = locs()->out().reg();
2821 QRegister value = locs()->in(0).fpu_reg(); 2826 QRegister value = locs()->in(0).fpu_reg();
2822 DRegister value_even = EvenDRegisterOf(value); 2827 DRegister value_even = EvenDRegisterOf(value);
2823 DRegister value_odd = OddDRegisterOf(value); 2828 DRegister value_odd = OddDRegisterOf(value);
2824 2829
2825 __ TryAllocate(compiler->int32x4_class(), 2830 __ TryAllocate(compiler->int32x4_class(),
2826 slow_path->entry_label(), 2831 slow_path->entry_label(),
2827 out_reg); 2832 out_reg,
2833 locs()->temp(0).reg());
2828 __ Bind(slow_path->exit_label()); 2834 __ Bind(slow_path->exit_label());
2829 __ StoreDToOffset(value_even, out_reg, 2835 __ StoreDToOffset(value_even, out_reg,
2830 Int32x4::value_offset() - kHeapObjectTag); 2836 Int32x4::value_offset() - kHeapObjectTag);
2831 __ StoreDToOffset(value_odd, out_reg, 2837 __ StoreDToOffset(value_odd, out_reg,
2832 Int32x4::value_offset() + 2*kWordSize - kHeapObjectTag); 2838 Int32x4::value_offset() + 2*kWordSize - kHeapObjectTag);
2833 } 2839 }
2834 2840
2835 2841
2836 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary() const { 2842 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary() const {
2837 const intptr_t value_cid = value()->Type()->ToCid(); 2843 const intptr_t value_cid = value()->Type()->ToCid();
(...skipping 1715 matching lines...) Expand 10 before | Expand all | Expand 10 after
4553 compiler->GenerateCall(token_pos(), 4559 compiler->GenerateCall(token_pos(),
4554 &label, 4560 &label,
4555 PcDescriptors::kOther, 4561 PcDescriptors::kOther,
4556 locs()); 4562 locs());
4557 __ Drop(2); // Discard type arguments and receiver. 4563 __ Drop(2); // Discard type arguments and receiver.
4558 } 4564 }
4559 4565
4560 } // namespace dart 4566 } // namespace dart
4561 4567
4562 #endif // defined TARGET_ARCH_ARM 4568 #endif // defined TARGET_ARCH_ARM
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698