1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/instrument-arm64.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCounter::Counter(const char* name, CounterType type)
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : count_(0), enabled_(false), type_(type) {
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(name != NULL);
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  strncpy(name_, name, kCounterNameMaxLength);
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Counter::Enable() {
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enabled_ = true;
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Counter::Disable() {
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enabled_ = false;
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Counter::IsEnabled() {
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return enabled_;
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Counter::Increment() {
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (enabled_) {
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    count_++;
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint64_t Counter::count() {
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint64_t result = count_;
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (type_ == Gauge) {
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // If the counter is a Gauge, reset the count after reading.
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    count_ = 0;
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return result;
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst char* Counter::name() {
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return name_;
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCounterType Counter::type() {
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return type_;
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef struct {
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* name;
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CounterType type;
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} CounterDescriptor;
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const CounterDescriptor kCounterList[] = {
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Instruction", Cumulative},
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Move Immediate", Gauge},
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Add/Sub DP", Gauge},
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Logical DP", Gauge},
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Other Int DP", Gauge},
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"FP DP", Gauge},
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Conditional Select", Gauge},
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Conditional Compare", Gauge},
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Unconditional Branch", Gauge},
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Compare and Branch", Gauge},
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Test and Branch", Gauge},
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Conditional Branch", Gauge},
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Load Integer", Gauge},
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Load FP", Gauge},
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Load Pair", Gauge},
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Load Literal", Gauge},
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Store Integer", Gauge},
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Store FP", Gauge},
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Store Pair", Gauge},
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"PC Addressing", Gauge},
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"Other", Gauge},
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {"SP Adjust", Gauge},
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstrument::Instrument(const char* datafile, uint64_t sample_period)
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : output_stream_(stderr), sample_period_(sample_period) {
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Set up the output stream. If datafile is non-NULL, use that file. If it
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // can't be opened, or datafile is NULL, use stderr.
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (datafile != NULL) {
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    output_stream_ = fopen(datafile, "w");
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (output_stream_ == NULL) {
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      fprintf(stderr, "Can't open output file %s. Using stderr.\n", datafile);
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      output_stream_ = stderr;
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int num_counters = arraysize(kCounterList);
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Dump an instrumentation description comment at the top of the file.
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fprintf(output_stream_, "# counters=%d\n", num_counters);
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fprintf(output_stream_, "# sample_period=%" PRIu64 "\n", sample_period_);
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Construct Counter objects from counter description array.
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < num_counters; i++) {
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Counter* counter = new Counter(kCounterList[i].name, kCounterList[i].type);
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    counters_.push_back(counter);
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DumpCounterNames();
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochInstrument::~Instrument() {
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Dump any remaining instruction data to the output file.
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DumpCounters();
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Free all the counter objects.
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  std::list<Counter*>::iterator it;
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (it = counters_.begin(); it != counters_.end(); it++) {
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    delete *it;
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (output_stream_ != stderr) {
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fclose(output_stream_);
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::Update() {
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Increment the instruction counter, and dump all counters if a sample period
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // has elapsed.
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Instruction");
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(counter->type() == Cumulative);
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (counter->IsEnabled() && (counter->count() % sample_period_) == 0) {
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DumpCounters();
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::DumpCounters() {
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterate through the counter objects, dumping their values to the output
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // stream.
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  std::list<Counter*>::const_iterator it;
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (it = counters_.begin(); it != counters_.end(); it++) {
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fprintf(output_stream_, "%" PRIu64 ",", (*it)->count());
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fprintf(output_stream_, "\n");
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fflush(output_stream_);
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::DumpCounterNames() {
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Iterate through the counter objects, dumping the counter names to the
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // output stream.
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  std::list<Counter*>::const_iterator it;
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (it = counters_.begin(); it != counters_.end(); it++) {
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    fprintf(output_stream_, "%s,", (*it)->name());
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fprintf(output_stream_, "\n");
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fflush(output_stream_);
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::HandleInstrumentationEvent(unsigned event) {
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (event) {
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case InstrumentStateEnable: Enable(); break;
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case InstrumentStateDisable: Disable(); break;
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default: DumpEventMarker(event);
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::DumpEventMarker(unsigned marker) {
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Dumpan event marker to the output stream as a specially formatted comment
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // line.
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Instruction");
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fprintf(output_stream_, "# %c%c @ %" PRId64 "\n", marker & 0xff,
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (marker >> 8) & 0xff, counter->count());
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCounter* Instrument::GetCounter(const char* name) {
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Get a Counter object by name from the counter list.
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  std::list<Counter*>::const_iterator it;
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (it = counters_.begin(); it != counters_.end(); it++) {
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (strcmp((*it)->name(), name) == 0) {
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return *it;
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // A Counter by that name does not exist: print an error message to stderr
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // and the output file, and exit.
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const char* error_message =
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    "# Error: Unknown counter \"%s\". Exiting.\n";
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fprintf(stderr, error_message, name);
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  fprintf(output_stream_, error_message, name);
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  exit(1);
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::Enable() {
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  std::list<Counter*>::iterator it;
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (it = counters_.begin(); it != counters_.end(); it++) {
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    (*it)->Enable();
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::Disable() {
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  std::list<Counter*>::iterator it;
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (it = counters_.begin(); it != counters_.end(); it++) {
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    (*it)->Disable();
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitPCRelAddressing(Instruction* instr) {
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("PC Addressing");
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitAddSubImmediate(Instruction* instr) {
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* sp_counter = GetCounter("SP Adjust");
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* add_sub_counter = GetCounter("Add/Sub DP");
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (((instr->Mask(AddSubOpMask) == SUB) ||
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       (instr->Mask(AddSubOpMask) == ADD)) &&
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->Rd() == 31) && (instr->Rn() == 31)) {
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Count adjustments to the C stack pointer caused by V8 needing two SPs.
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    sp_counter->Increment();
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    add_sub_counter->Increment();
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLogicalImmediate(Instruction* instr) {
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Logical DP");
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitMoveWideImmediate(Instruction* instr) {
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Move Immediate");
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->IsMovn() && (instr->Rd() == kZeroRegCode)) {
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    unsigned imm = instr->ImmMoveWide();
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    HandleInstrumentationEvent(imm);
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    counter->Increment();
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitBitfield(Instruction* instr) {
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Other Int DP");
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitExtract(Instruction* instr) {
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Other Int DP");
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitUnconditionalBranch(Instruction* instr) {
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Unconditional Branch");
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitUnconditionalBranchToRegister(Instruction* instr) {
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Unconditional Branch");
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitCompareBranch(Instruction* instr) {
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Compare and Branch");
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitTestBranch(Instruction* instr) {
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Test and Branch");
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitConditionalBranch(Instruction* instr) {
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Conditional Branch");
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitSystem(Instruction* instr) {
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Other");
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitException(Instruction* instr) {
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Other");
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::InstrumentLoadStorePair(Instruction* instr) {
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* load_pair_counter = GetCounter("Load Pair");
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* store_pair_counter = GetCounter("Store Pair");
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instr->Mask(LoadStorePairLBit) != 0) {
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    load_pair_counter->Increment();
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    store_pair_counter->Increment();
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLoadStorePairPostIndex(Instruction* instr) {
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentLoadStorePair(instr);
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLoadStorePairOffset(Instruction* instr) {
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentLoadStorePair(instr);
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLoadStorePairPreIndex(Instruction* instr) {
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentLoadStorePair(instr);
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLoadLiteral(Instruction* instr) {
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Load Literal");
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::InstrumentLoadStore(Instruction* instr) {
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* load_int_counter = GetCounter("Load Integer");
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* store_int_counter = GetCounter("Store Integer");
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* load_fp_counter = GetCounter("Load FP");
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* store_fp_counter = GetCounter("Store FP");
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (instr->Mask(LoadStoreOpMask)) {
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case STRB_w:    // Fall through.
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case STRH_w:    // Fall through.
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case STR_w:     // Fall through.
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case STR_x:     store_int_counter->Increment(); break;
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case STR_s:     // Fall through.
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case STR_d:     store_fp_counter->Increment(); break;
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDRB_w:    // Fall through.
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDRH_w:    // Fall through.
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDR_w:     // Fall through.
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDR_x:     // Fall through.
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDRSB_x:   // Fall through.
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDRSH_x:   // Fall through.
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDRSW_x:   // Fall through.
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDRSB_w:   // Fall through.
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDRSH_w:   load_int_counter->Increment(); break;
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDR_s:     // Fall through.
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case LDR_d:     load_fp_counter->Increment(); break;
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default: UNREACHABLE();
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLoadStoreUnscaledOffset(Instruction* instr) {
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentLoadStore(instr);
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLoadStorePostIndex(Instruction* instr) {
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentLoadStore(instr);
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLoadStorePreIndex(Instruction* instr) {
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentLoadStore(instr);
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLoadStoreRegisterOffset(Instruction* instr) {
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentLoadStore(instr);
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLoadStoreUnsignedOffset(Instruction* instr) {
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstrumentLoadStore(instr);
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitLogicalShifted(Instruction* instr) {
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Logical DP");
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitAddSubShifted(Instruction* instr) {
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Add/Sub DP");
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitAddSubExtended(Instruction* instr) {
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* sp_counter = GetCounter("SP Adjust");
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* add_sub_counter = GetCounter("Add/Sub DP");
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (((instr->Mask(AddSubOpMask) == SUB) ||
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch       (instr->Mask(AddSubOpMask) == ADD)) &&
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (instr->Rd() == 31) && (instr->Rn() == 31)) {
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Count adjustments to the C stack pointer caused by V8 needing two SPs.
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    sp_counter->Increment();
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    add_sub_counter->Increment();
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitAddSubWithCarry(Instruction* instr) {
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Add/Sub DP");
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitConditionalCompareRegister(Instruction* instr) {
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Conditional Compare");
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitConditionalCompareImmediate(Instruction* instr) {
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Conditional Compare");
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitConditionalSelect(Instruction* instr) {
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Conditional Select");
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitDataProcessing1Source(Instruction* instr) {
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Other Int DP");
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitDataProcessing2Source(Instruction* instr) {
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Other Int DP");
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitDataProcessing3Source(Instruction* instr) {
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Other Int DP");
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitFPCompare(Instruction* instr) {
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("FP DP");
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitFPConditionalCompare(Instruction* instr) {
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Conditional Compare");
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitFPConditionalSelect(Instruction* instr) {
526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Conditional Select");
528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitFPImmediate(Instruction* instr) {
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("FP DP");
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitFPDataProcessing1Source(Instruction* instr) {
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("FP DP");
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitFPDataProcessing2Source(Instruction* instr) {
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("FP DP");
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitFPDataProcessing3Source(Instruction* instr) {
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("FP DP");
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitFPIntegerConvert(Instruction* instr) {
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("FP DP");
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitFPFixedPointConvert(Instruction* instr) {
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("FP DP");
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitUnallocated(Instruction* instr) {
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Other");
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Instrument::VisitUnimplemented(Instruction* instr) {
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Update();
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static Counter* counter = GetCounter("Other");
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  counter->Increment();
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
590