10cc8b6ece4b3e757e11a906a81ece292437713abarmvixl// Copyright 2014, ARM Limited
2578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// All rights reserved.
3578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//
4578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// Redistribution and use in source and binary forms, with or without
5578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// modification, are permitted provided that the following conditions are met:
6578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//
7578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//   * Redistributions of source code must retain the above copyright notice,
8578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//     this list of conditions and the following disclaimer.
9578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//   * Redistributions in binary form must reproduce the above copyright notice,
10578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//     this list of conditions and the following disclaimer in the documentation
11578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//     and/or other materials provided with the distribution.
12578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//   * Neither the name of ARM Limited nor the names of its contributors may be
13578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//     used to endorse or promote products derived from this software without
14578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//     specific prior written permission.
15578645f14e122d2b87d907e298cda7e7d0babf1farmvixl//
16578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25578645f14e122d2b87d907e298cda7e7d0babf1farmvixl// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl#include "vixl/a64/instrument-a64.h"
28578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
29578645f14e122d2b87d907e298cda7e7d0babf1farmvixlnamespace vixl {
30578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
31578645f14e122d2b87d907e298cda7e7d0babf1farmvixlCounter::Counter(const char* name, CounterType type)
32578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    : count_(0), enabled_(false), type_(type) {
331123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(name != NULL);
34578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  strncpy(name_, name, kCounterNameMaxLength);
35578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
36578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
37578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
38578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Counter::Enable() {
39578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  enabled_ = true;
40578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
41578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
42578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
43578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Counter::Disable() {
44578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  enabled_ = false;
45578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
46578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
47578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
48578645f14e122d2b87d907e298cda7e7d0babf1farmvixlbool Counter::IsEnabled() {
49578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  return enabled_;
50578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
51578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
52578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
53578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Counter::Increment() {
54578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (enabled_) {
55578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    count_++;
56578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
57578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
58578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
59578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
60578645f14e122d2b87d907e298cda7e7d0babf1farmvixluint64_t Counter::count() {
61578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint64_t result = count_;
62578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (type_ == Gauge) {
63578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    // If the counter is a Gauge, reset the count after reading.
64578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    count_ = 0;
65578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
66578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  return result;
67578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
68578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
69578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
70578645f14e122d2b87d907e298cda7e7d0babf1farmvixlconst char* Counter::name() {
71578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  return name_;
72578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
73578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
74578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
75578645f14e122d2b87d907e298cda7e7d0babf1farmvixlCounterType Counter::type() {
76578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  return type_;
77578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
78578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
79578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
800cc8b6ece4b3e757e11a906a81ece292437713abarmvixlstruct CounterDescriptor {
81578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  const char* name;
82578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  CounterType type;
830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl};
84578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
85578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
86578645f14e122d2b87d907e298cda7e7d0babf1farmvixlstatic const CounterDescriptor kCounterList[] = {
87578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Instruction", Cumulative},
88578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
89578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Move Immediate", Gauge},
90578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Add/Sub DP", Gauge},
91578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Logical DP", Gauge},
92578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Other Int DP", Gauge},
93578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"FP DP", Gauge},
94578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
95578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Conditional Select", Gauge},
96578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Conditional Compare", Gauge},
97578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
98578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Unconditional Branch", Gauge},
99578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Compare and Branch", Gauge},
100578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Test and Branch", Gauge},
101578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Conditional Branch", Gauge},
102578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
103578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Load Integer", Gauge},
104578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Load FP", Gauge},
105578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Load Pair", Gauge},
106578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Load Literal", Gauge},
107578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
108578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Store Integer", Gauge},
109578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Store FP", Gauge},
110578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Store Pair", Gauge},
111578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
112578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"PC Addressing", Gauge},
113578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  {"Other", Gauge},
1140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {"NEON", Gauge},
1150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  {"Crypto", Gauge}
116578645f14e122d2b87d907e298cda7e7d0babf1farmvixl};
117578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
118578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
119578645f14e122d2b87d907e298cda7e7d0babf1farmvixlInstrument::Instrument(const char* datafile, uint64_t sample_period)
120578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    : output_stream_(stdout), sample_period_(sample_period) {
121578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
122578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Set up the output stream. If datafile is non-NULL, use that file. If it
123578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // can't be opened, or datafile is NULL, use stdout.
124578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (datafile != NULL) {
125578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    output_stream_ = fopen(datafile, "w");
126578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (output_stream_ == NULL) {
127578645f14e122d2b87d907e298cda7e7d0babf1farmvixl      printf("Can't open output file %s. Using stdout.\n", datafile);
128578645f14e122d2b87d907e298cda7e7d0babf1farmvixl      output_stream_ = stdout;
129578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    }
130578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
131578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
132578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static const int num_counters =
133578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    sizeof(kCounterList) / sizeof(CounterDescriptor);
134578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
135578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Dump an instrumentation description comment at the top of the file.
136578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, "# counters=%d\n", num_counters);
137578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, "# sample_period=%" PRIu64 "\n", sample_period_);
138578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
139578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Construct Counter objects from counter description array.
140578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int i = 0; i < num_counters; i++) {
141578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    Counter* counter = new Counter(kCounterList[i].name, kCounterList[i].type);
142578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    counters_.push_back(counter);
143578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
144578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
145578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  DumpCounterNames();
146578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
147578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
148578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
149578645f14e122d2b87d907e298cda7e7d0babf1farmvixlInstrument::~Instrument() {
150578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Dump any remaining instruction data to the output file.
151578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  DumpCounters();
152578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
153578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Free all the counter objects.
154578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::iterator it;
155578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
156f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    delete *it;
157578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
158578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
159578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (output_stream_ != stdout) {
160578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    fclose(output_stream_);
161578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
162578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
163578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
164578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
165578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::Update() {
166578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Increment the instruction counter, and dump all counters if a sample period
167578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // has elapsed.
168578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Instruction");
1691123fee00a9cef7f1b448eab3c2ca333dbd426d7armvixl  VIXL_ASSERT(counter->type() == Cumulative);
170578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
171578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
1729795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang  if ((sample_period_ != 0) && counter->IsEnabled()
1739795cffa6b242fddee25847d17136a8da5b5c2d7Phil Wang      && (counter->count() % sample_period_) == 0) {
174578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    DumpCounters();
175578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
176578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
177578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
178578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
179578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::DumpCounters() {
180578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Iterate through the counter objects, dumping their values to the output
181578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // stream.
182578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::const_iterator it;
183578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
184578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    fprintf(output_stream_, "%" PRIu64 ",", (*it)->count());
185578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
186578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, "\n");
187578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fflush(output_stream_);
188578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
189578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
190578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
191578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::DumpCounterNames() {
192578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Iterate through the counter objects, dumping the counter names to the
193578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // output stream.
194578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::const_iterator it;
195578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
196578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    fprintf(output_stream_, "%s,", (*it)->name());
197578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
198578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, "\n");
199578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fflush(output_stream_);
200578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
201578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
202578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
203578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::HandleInstrumentationEvent(unsigned event) {
204578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  switch (event) {
205578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    case InstrumentStateEnable: Enable(); break;
206578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    case InstrumentStateDisable: Disable(); break;
207578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    default: DumpEventMarker(event);
208578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
209578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
210578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
211578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
212578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::DumpEventMarker(unsigned marker) {
213578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Dumpan event marker to the output stream as a specially formatted comment
214578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // line.
215578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Instruction");
216578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
217578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, "# %c%c @ %" PRId64 "\n", marker & 0xff,
218578645f14e122d2b87d907e298cda7e7d0babf1farmvixl          (marker >> 8) & 0xff, counter->count());
219578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
220578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
221578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
222578645f14e122d2b87d907e298cda7e7d0babf1farmvixlCounter* Instrument::GetCounter(const char* name) {
223578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Get a Counter object by name from the counter list.
224578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::const_iterator it;
225578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
226578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (strcmp((*it)->name(), name) == 0) {
227578645f14e122d2b87d907e298cda7e7d0babf1farmvixl      return *it;
228578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    }
229578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
230578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
231578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // A Counter by that name does not exist: print an error message to stderr
232578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // and the output file, and exit.
233578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static const char* error_message =
234578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    "# Error: Unknown counter \"%s\". Exiting.\n";
235578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(stderr, error_message, name);
236578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, error_message, name);
237578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  exit(1);
238578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
239578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
240578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
241578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::Enable() {
242578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::iterator it;
243578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
244578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    (*it)->Enable();
245578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
246578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
247578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
248578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
249578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::Disable() {
250578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::iterator it;
251578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
252578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    (*it)->Disable();
253578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
254578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
255578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
256578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
25739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitPCRelAddressing(const Instruction* instr) {
258578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
259578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
260578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("PC Addressing");
261578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
262578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
263578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
264578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
26539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitAddSubImmediate(const Instruction* instr) {
266578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
267578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
268578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Add/Sub DP");
269578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
270578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
271578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
272578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
27339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLogicalImmediate(const Instruction* instr) {
274578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
275578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
276578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Logical DP");
277578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
278578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
279578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
280578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
28139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitMoveWideImmediate(const Instruction* instr) {
282578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
283578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Move Immediate");
284578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
285578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (instr->IsMovn() && (instr->Rd() == kZeroRegCode)) {
286578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    unsigned imm = instr->ImmMoveWide();
287578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    HandleInstrumentationEvent(imm);
288578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  } else {
289578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    counter->Increment();
290578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
291578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
292578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
293578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
29439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitBitfield(const Instruction* instr) {
295578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
296578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
297578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
298578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
299578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
300578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
301578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
30239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitExtract(const Instruction* instr) {
303578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
304578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
305578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
306578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
307578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
308578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
309578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
31039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitUnconditionalBranch(const Instruction* instr) {
311578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
312578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
313578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Unconditional Branch");
314578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
315578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
316578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
317578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
31839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitUnconditionalBranchToRegister(const Instruction* instr) {
319578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
320578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
321578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Unconditional Branch");
322578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
323578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
324578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
325578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
32639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitCompareBranch(const Instruction* instr) {
327578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
328578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
329578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Compare and Branch");
330578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
331578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
332578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
333578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
33439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitTestBranch(const Instruction* instr) {
335578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
336578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
337578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Test and Branch");
338578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
339578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
340578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
341578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
34239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitConditionalBranch(const Instruction* instr) {
343578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
344578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
345578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Branch");
346578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
347578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
348578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
349578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
35039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitSystem(const Instruction* instr) {
351578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
352578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
353578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other");
354578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
355578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
356578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
357578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
35839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitException(const Instruction* instr) {
359578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
360578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
361578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other");
362578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
363578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
364578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
365578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
36639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::InstrumentLoadStorePair(const Instruction* instr) {
367578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* load_pair_counter = GetCounter("Load Pair");
368578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* store_pair_counter = GetCounter("Store Pair");
369578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
370578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (instr->Mask(LoadStorePairLBit) != 0) {
371578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    load_pair_counter->Increment();
372578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  } else {
373578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    store_pair_counter->Increment();
374578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
375578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
376578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
377578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
37839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStorePairPostIndex(const Instruction* instr) {
379578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
380578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStorePair(instr);
381578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
382578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
383578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
38439ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStorePairOffset(const Instruction* instr) {
385578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
386578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStorePair(instr);
387578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
388578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
389578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
39039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStorePairPreIndex(const Instruction* instr) {
391578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
392578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStorePair(instr);
393578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
394578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
395578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
39639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStorePairNonTemporal(const Instruction* instr) {
397578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
398578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStorePair(instr);
399578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
400578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
401578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
40239ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStoreExclusive(const Instruction* instr) {
40390b0414b6c794be58f34813f84c2c06e6a15be91armvixl  USE(instr);
40490b0414b6c794be58f34813f84c2c06e6a15be91armvixl  Update();
40590b0414b6c794be58f34813f84c2c06e6a15be91armvixl  static Counter* counter = GetCounter("Other");
40690b0414b6c794be58f34813f84c2c06e6a15be91armvixl  counter->Increment();
40790b0414b6c794be58f34813f84c2c06e6a15be91armvixl}
40890b0414b6c794be58f34813f84c2c06e6a15be91armvixl
40990b0414b6c794be58f34813f84c2c06e6a15be91armvixl
41039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadLiteral(const Instruction* instr) {
411578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
412578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
413578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Load Literal");
414578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
415578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
416578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
417578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
41839ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::InstrumentLoadStore(const Instruction* instr) {
419578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* load_int_counter = GetCounter("Load Integer");
420578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* store_int_counter = GetCounter("Store Integer");
421578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* load_fp_counter = GetCounter("Load FP");
422578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* store_fp_counter = GetCounter("Store FP");
423578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
4240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  switch (instr->Mask(LoadStoreMask)) {
4250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case STRB_w:
4260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case STRH_w:
4270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case STR_w:
4280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      VIXL_FALLTHROUGH();
429578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    case STR_x:     store_int_counter->Increment(); break;
4300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case STR_s:
4310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      VIXL_FALLTHROUGH();
432578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    case STR_d:     store_fp_counter->Increment(); break;
4330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case LDRB_w:
4340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case LDRH_w:
4350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case LDR_w:
4360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case LDR_x:
4370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case LDRSB_x:
4380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case LDRSH_x:
4390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case LDRSW_x:
4400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case LDRSB_w:
4410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      VIXL_FALLTHROUGH();
442578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    case LDRSH_w:   load_int_counter->Increment(); break;
4430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    case LDR_s:
4440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl      VIXL_FALLTHROUGH();
445578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    case LDR_d:     load_fp_counter->Increment(); break;
446578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
447578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
448578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
449578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
45039ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStoreUnscaledOffset(const Instruction* instr) {
451578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
452578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
453578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
454578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
455578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
45639ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStorePostIndex(const Instruction* instr) {
457578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
458578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
459578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
460578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
461578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
462578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
46339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStorePreIndex(const Instruction* instr) {
464578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
465578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
466578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
467578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
468578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
46939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStoreRegisterOffset(const Instruction* instr) {
470578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
471578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
472578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
473578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
474578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
47539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLoadStoreUnsignedOffset(const Instruction* instr) {
476578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
477578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
478578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
479578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
480578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
48139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitLogicalShifted(const Instruction* instr) {
482578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
483578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
484578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Logical DP");
485578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
486578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
487578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
488578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
48939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitAddSubShifted(const Instruction* instr) {
490578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
491578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
492578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Add/Sub DP");
493578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
494578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
495578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
496578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
49739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitAddSubExtended(const Instruction* instr) {
498578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
499578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
500578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Add/Sub DP");
501578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
502578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
503578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
504578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
50539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitAddSubWithCarry(const Instruction* instr) {
506578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
507578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
508578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Add/Sub DP");
509578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
510578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
511578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
512578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
51339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitConditionalCompareRegister(const Instruction* instr) {
514578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
515578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
516578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Compare");
517578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
518578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
519578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
520578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
52139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitConditionalCompareImmediate(const Instruction* instr) {
522578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
523578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
524578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Compare");
525578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
526578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
527578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
528578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
52939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitConditionalSelect(const Instruction* instr) {
530578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
531578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
532578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Select");
533578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
534578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
535578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
536578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
53739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitDataProcessing1Source(const Instruction* instr) {
538578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
539578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
540578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
541578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
542578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
543578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
544578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
54539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitDataProcessing2Source(const Instruction* instr) {
546578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
547578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
548578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
549578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
550578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
551578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
552578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
55339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitDataProcessing3Source(const Instruction* instr) {
554578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
555578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
556578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
557578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
558578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
559578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
560578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
56139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitFPCompare(const Instruction* instr) {
562578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
563578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
564578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
565578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
566578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
567578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
568578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
56939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitFPConditionalCompare(const Instruction* instr) {
570578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
571578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
572578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Compare");
573578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
574578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
575578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
576578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
57739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitFPConditionalSelect(const Instruction* instr) {
578578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
579578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
580578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Select");
581578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
582578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
583578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
584578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
58539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitFPImmediate(const Instruction* instr) {
586578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
587578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
588578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
589578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
590578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
591578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
592578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
59339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitFPDataProcessing1Source(const Instruction* instr) {
594578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
595578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
596578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
597578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
598578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
599578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
600578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
60139ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitFPDataProcessing2Source(const Instruction* instr) {
602578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
603578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
604578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
605578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
606578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
607578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
608578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
60939ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitFPDataProcessing3Source(const Instruction* instr) {
610578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
611578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
612578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
613578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
614578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
615578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
616578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
61739ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitFPIntegerConvert(const Instruction* instr) {
618578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
619578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
620578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
621578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
622578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
623578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
624578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
62539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitFPFixedPointConvert(const Instruction* instr) {
626578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
627578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
628578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
629578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
630578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
631578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
632578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6330cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitCrypto2RegSHA(const Instruction* instr) {
6340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
6350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
6360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("Crypto");
6370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
6380cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6410cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitCrypto3RegSHA(const Instruction* instr) {
6420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
6430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
6440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("Crypto");
6450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
6460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6470cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6490cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitCryptoAES(const Instruction* instr) {
6500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
6510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
6520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("Crypto");
6530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
6540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6550cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6570cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEON2RegMisc(const Instruction* instr) {
6580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
6590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
6600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
6610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
6620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6630cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6650cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEON3Same(const Instruction* instr) {
6660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
6670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
6680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
6690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
6700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6710cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6730cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEON3Different(const Instruction* instr) {
6740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
6750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
6760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
6770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
6780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6790cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6810cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONAcrossLanes(const Instruction* instr) {
6820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
6830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
6840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
6850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
6860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6870cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6890cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONByIndexedElement(const Instruction* instr) {
6900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
6910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
6920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
6930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
6940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
6950cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
6970cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONCopy(const Instruction* instr) {
6980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
6990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7030cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7050cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONExtract(const Instruction* instr) {
7060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7110cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7130cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONLoadStoreMultiStruct(const Instruction* instr) {
7140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7190cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7210cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONLoadStoreMultiStructPostIndex(
7220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    const Instruction* instr) {
7230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7270cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7300cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONLoadStoreSingleStruct(const Instruction* instr) {
7310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7350cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7360cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7370cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7380cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONLoadStoreSingleStructPostIndex(
7390cc8b6ece4b3e757e11a906a81ece292437713abarmvixl    const Instruction* instr) {
7400cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7410cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7420cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7430cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7440cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7450cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7460cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7470cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONModifiedImmediate(const Instruction* instr) {
7480cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7490cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7500cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7510cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7520cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7530cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7540cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7550cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONScalar2RegMisc(const Instruction* instr) {
7560cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7570cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7580cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7590cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7600cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7610cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7620cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7630cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONScalar3Diff(const Instruction* instr) {
7640cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7650cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7660cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7670cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7680cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7690cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7700cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7710cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONScalar3Same(const Instruction* instr) {
7720cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7730cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7740cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7750cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7760cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7770cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7780cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7790cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONScalarByIndexedElement(const Instruction* instr) {
7800cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7810cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7820cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7830cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7840cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7850cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7860cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7870cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONScalarCopy(const Instruction* instr) {
7880cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7890cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7900cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7910cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
7920cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
7930cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7940cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
7950cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONScalarPairwise(const Instruction* instr) {
7960cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
7970cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
7980cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
7990cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
8000cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
8010cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
8020cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
8030cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONScalarShiftImmediate(const Instruction* instr) {
8040cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
8050cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
8060cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
8070cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
8080cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
8090cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
8100cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
8110cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONShiftImmediate(const Instruction* instr) {
8120cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
8130cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
8140cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
8150cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
8160cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
8170cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
8180cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
8190cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONTable(const Instruction* instr) {
8200cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
8210cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
8220cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
8230cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
8240cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
8250cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
8260cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
8270cc8b6ece4b3e757e11a906a81ece292437713abarmvixlvoid Instrument::VisitNEONPerm(const Instruction* instr) {
8280cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  USE(instr);
8290cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  Update();
8300cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  static Counter* counter = GetCounter("NEON");
8310cc8b6ece4b3e757e11a906a81ece292437713abarmvixl  counter->Increment();
8320cc8b6ece4b3e757e11a906a81ece292437713abarmvixl}
8330cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
8340cc8b6ece4b3e757e11a906a81ece292437713abarmvixl
83539ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitUnallocated(const Instruction* instr) {
836578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
837578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
838578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other");
839578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
840578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
841578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
842578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
84339ee1f4b336c7e6b25be0df6375c18dcbd577c09armvixlvoid Instrument::VisitUnimplemented(const Instruction* instr) {
844578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
845578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
846578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other");
847578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
848578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
849578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
850578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
8514a06316541258e3c058792321295ee36d409f419armvixl}  // namespace vixl
852