1b78f13911bfe6eda303e91ef215c87a165aae8aeAlexandre Rames// Copyright 2014, VIXL authors
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
27b49bdb7996e603555eba4c8b56c7325e3e737ab6Alexandre Rames#include "instrument-aarch64.h"
28578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
29578645f14e122d2b87d907e298cda7e7d0babf1farmvixlnamespace vixl {
3088c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisnamespace aarch64 {
31578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
32578645f14e122d2b87d907e298cda7e7d0babf1farmvixlCounter::Counter(const char* name, CounterType type)
33578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    : count_(0), enabled_(false), type_(type) {
34b0c8ae2a5f0abc58f67322052d39bfd47edb2892armvixl  VIXL_ASSERT(name != NULL);
35578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  strncpy(name_, name, kCounterNameMaxLength);
36578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
37578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
38578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
390f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlvoid Counter::Enable() { enabled_ = true; }
40578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
41578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
420f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlvoid Counter::Disable() { enabled_ = false; }
43578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
44578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
450f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlbool Counter::IsEnabled() { return enabled_; }
46578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
47578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
48578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Counter::Increment() {
49578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (enabled_) {
50578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    count_++;
51578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
52578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
53578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
54578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
5588c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisuint64_t Counter::GetCount() {
56578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  uint64_t result = count_;
57578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (type_ == Gauge) {
58578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    // If the counter is a Gauge, reset the count after reading.
59578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    count_ = 0;
60578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
61578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  return result;
62578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
63578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
64578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6588c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisconst char* Counter::GetName() { return name_; }
66578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
67578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6888c46b84df005638546de5e4e965bdcc31352f48Pierre LangloisCounterType Counter::GetType() { return type_; }
69578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
70578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
715289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlstruct CounterDescriptor {
72578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  const char* name;
73578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  CounterType type;
745289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl};
75578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
76578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
770f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlstatic const CounterDescriptor kCounterList[] = {{"Instruction", Cumulative},
78578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
790f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Move Immediate", Gauge},
800f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Add/Sub DP", Gauge},
810f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Logical DP", Gauge},
820f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Other Int DP", Gauge},
830f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"FP DP", Gauge},
84578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
850f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Conditional Select", Gauge},
860f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Conditional Compare", Gauge},
87578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
880f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Unconditional Branch",
890f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                  Gauge},
900f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Compare and Branch", Gauge},
910f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Test and Branch", Gauge},
920f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Conditional Branch", Gauge},
93578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
940f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Load Integer", Gauge},
950f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Load FP", Gauge},
960f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Load Pair", Gauge},
970f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Load Literal", Gauge},
98578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
990f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Store Integer", Gauge},
1000f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Store FP", Gauge},
1010f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Store Pair", Gauge},
102578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
1030f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"PC Addressing", Gauge},
1040f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Other", Gauge},
1050f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"NEON", Gauge},
1060f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl                                                 {"Crypto", Gauge}};
107578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
108578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
109578645f14e122d2b87d907e298cda7e7d0babf1farmvixlInstrument::Instrument(const char* datafile, uint64_t sample_period)
110578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    : output_stream_(stdout), sample_period_(sample_period) {
111578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Set up the output stream. If datafile is non-NULL, use that file. If it
112578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // can't be opened, or datafile is NULL, use stdout.
113578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (datafile != NULL) {
114578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    output_stream_ = fopen(datafile, "w");
115578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    if (output_stream_ == NULL) {
116578645f14e122d2b87d907e298cda7e7d0babf1farmvixl      printf("Can't open output file %s. Using stdout.\n", datafile);
117578645f14e122d2b87d907e298cda7e7d0babf1farmvixl      output_stream_ = stdout;
118578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    }
119578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
120578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
121578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static const int num_counters =
1220f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      sizeof(kCounterList) / sizeof(CounterDescriptor);
123578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
124578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Dump an instrumentation description comment at the top of the file.
125578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, "# counters=%d\n", num_counters);
126578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, "# sample_period=%" PRIu64 "\n", sample_period_);
127578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
128578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Construct Counter objects from counter description array.
129578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (int i = 0; i < num_counters; i++) {
130578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    Counter* counter = new Counter(kCounterList[i].name, kCounterList[i].type);
131578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    counters_.push_back(counter);
132578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
133578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
134578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  DumpCounterNames();
135578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
136578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
137578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
138578645f14e122d2b87d907e298cda7e7d0babf1farmvixlInstrument::~Instrument() {
139578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Dump any remaining instruction data to the output file.
140578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  DumpCounters();
141578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
142578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Free all the counter objects.
143578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::iterator it;
144578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
145f37fdc0b307fc66239b8b754b0465d36bc0f8aedarmvixl    delete *it;
146578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
147578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
148578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (output_stream_ != stdout) {
149578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    fclose(output_stream_);
150578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
151578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
152578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
153578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
154578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::Update() {
155578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Increment the instruction counter, and dump all counters if a sample period
156578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // has elapsed.
157578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Instruction");
15888c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  VIXL_ASSERT(counter->GetType() == Cumulative);
159578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
160578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
1610f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl  if ((sample_period_ != 0) && counter->IsEnabled() &&
16288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois      (counter->GetCount() % sample_period_) == 0) {
163578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    DumpCounters();
164578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
165578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
166578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
167578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
168578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::DumpCounters() {
169578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Iterate through the counter objects, dumping their values to the output
170578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // stream.
171578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::const_iterator it;
172578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
17388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    fprintf(output_stream_, "%" PRIu64 ",", (*it)->GetCount());
174578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
175578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, "\n");
176578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fflush(output_stream_);
177578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
178578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
179578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
180578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::DumpCounterNames() {
181578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Iterate through the counter objects, dumping the counter names to the
182578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // output stream.
183578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::const_iterator it;
184578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
18588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    fprintf(output_stream_, "%s,", (*it)->GetName());
186578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
187578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, "\n");
188578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fflush(output_stream_);
189578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
190578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
191578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
192578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::HandleInstrumentationEvent(unsigned event) {
193578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  switch (event) {
1940f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl    case InstrumentStateEnable:
1950f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      Enable();
1960f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      break;
1970f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl    case InstrumentStateDisable:
1980f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      Disable();
1990f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      break;
2000f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl    default:
2010f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      DumpEventMarker(event);
202578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
203578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
204578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
205578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
206578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::DumpEventMarker(unsigned marker) {
207578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Dumpan event marker to the output stream as a specially formatted comment
208578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // line.
209578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Instruction");
210578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
2110f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl  fprintf(output_stream_,
2120f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl          "# %c%c @ %" PRId64 "\n",
2130f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl          marker & 0xff,
2140f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl          (marker >> 8) & 0xff,
21588c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois          counter->GetCount());
216578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
217578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
218578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
219578645f14e122d2b87d907e298cda7e7d0babf1farmvixlCounter* Instrument::GetCounter(const char* name) {
220578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // Get a Counter object by name from the counter list.
221578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::const_iterator it;
222578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
22388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    if (strcmp((*it)->GetName(), name) == 0) {
224578645f14e122d2b87d907e298cda7e7d0babf1farmvixl      return *it;
225578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    }
226578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
227578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
228578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // A Counter by that name does not exist: print an error message to stderr
229578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  // and the output file, and exit.
230578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static const char* error_message =
2310f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      "# Error: Unknown counter \"%s\". Exiting.\n";
232578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(stderr, error_message, name);
233578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  fprintf(output_stream_, error_message, name);
234578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  exit(1);
235578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
236578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
237578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
238578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::Enable() {
239578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::iterator it;
240578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
241578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    (*it)->Enable();
242578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
243578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
244578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
245578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
246578645f14e122d2b87d907e298cda7e7d0babf1farmvixlvoid Instrument::Disable() {
247578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  std::list<Counter*>::iterator it;
248578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  for (it = counters_.begin(); it != counters_.end(); it++) {
249578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    (*it)->Disable();
250578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
251578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
252578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
253578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
254c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitPCRelAddressing(const Instruction* instr) {
255578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
256578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
257578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("PC Addressing");
258578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
259578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
260578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
261578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
262c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitAddSubImmediate(const Instruction* instr) {
263578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
264578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
265578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Add/Sub DP");
266578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
267578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
268578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
269578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
270c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLogicalImmediate(const Instruction* instr) {
271578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
272578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
273578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Logical DP");
274578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
275578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
276578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
277578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
278c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitMoveWideImmediate(const Instruction* instr) {
279578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
280578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Move Immediate");
281578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
28288c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois  if (instr->IsMovn() && (instr->GetRd() == kZeroRegCode)) {
28388c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois    unsigned imm = instr->GetImmMoveWide();
284578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    HandleInstrumentationEvent(imm);
285578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  } else {
286578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    counter->Increment();
287578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
288578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
289578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
290578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
291c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitBitfield(const Instruction* instr) {
292578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
293578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
294578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
295578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
296578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
297578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
298578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
299c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitExtract(const Instruction* instr) {
300578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
301578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
302578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
303578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
304578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
305578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
306578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
307c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitUnconditionalBranch(const Instruction* instr) {
308578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
309578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
310578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Unconditional Branch");
311578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
312578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
313578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
314578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
315c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitUnconditionalBranchToRegister(const Instruction* instr) {
316578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
317578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
318578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Unconditional Branch");
319578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
320578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
321578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
322578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
323c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitCompareBranch(const Instruction* instr) {
324578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
325578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
326578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Compare and Branch");
327578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
328578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
329578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
330578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
331c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitTestBranch(const Instruction* instr) {
332578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
333578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
334578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Test and Branch");
335578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
336578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
337578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
338578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
339c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitConditionalBranch(const Instruction* instr) {
340578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
341578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
342578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Branch");
343578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
344578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
345578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
346578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
347c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitSystem(const Instruction* instr) {
348578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
349578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
350578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other");
351578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
352578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
353578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
354578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
355c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitException(const Instruction* instr) {
356578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
357578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
358578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other");
359578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
360578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
361578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
362578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
363c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::InstrumentLoadStorePair(const Instruction* instr) {
364578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* load_pair_counter = GetCounter("Load Pair");
365578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* store_pair_counter = GetCounter("Store Pair");
366578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
367578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  if (instr->Mask(LoadStorePairLBit) != 0) {
368578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    load_pair_counter->Increment();
369578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  } else {
370578645f14e122d2b87d907e298cda7e7d0babf1farmvixl    store_pair_counter->Increment();
371578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
372578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
373578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
374578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
375c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStorePairPostIndex(const Instruction* instr) {
376578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
377578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStorePair(instr);
378578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
379578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
380578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
381c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStorePairOffset(const Instruction* instr) {
382578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
383578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStorePair(instr);
384578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
385578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
386578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
387c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStorePairPreIndex(const Instruction* instr) {
388578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
389578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStorePair(instr);
390578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
391578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
392578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
393c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStorePairNonTemporal(const Instruction* instr) {
394578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
395578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStorePair(instr);
396578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
397578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
398578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
399c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStoreExclusive(const Instruction* instr) {
4004a102baf640077d6794c0b33bb976f94b86c532barmvixl  USE(instr);
4014a102baf640077d6794c0b33bb976f94b86c532barmvixl  Update();
4024a102baf640077d6794c0b33bb976f94b86c532barmvixl  static Counter* counter = GetCounter("Other");
4034a102baf640077d6794c0b33bb976f94b86c532barmvixl  counter->Increment();
4044a102baf640077d6794c0b33bb976f94b86c532barmvixl}
4054a102baf640077d6794c0b33bb976f94b86c532barmvixl
4064a102baf640077d6794c0b33bb976f94b86c532barmvixl
407c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadLiteral(const Instruction* instr) {
408578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
409578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
410578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Load Literal");
411578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
412578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
413578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
414578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
415c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::InstrumentLoadStore(const Instruction* instr) {
416578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* load_int_counter = GetCounter("Load Integer");
417578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* store_int_counter = GetCounter("Store Integer");
418578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* load_fp_counter = GetCounter("Load FP");
419578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* store_fp_counter = GetCounter("Store FP");
420578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
4215289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  switch (instr->Mask(LoadStoreMask)) {
4226e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case STRB_w:
4236e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case STRH_w:
4246e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case STR_w:
4256e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl      VIXL_FALLTHROUGH();
4260f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl    case STR_x:
4270f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      store_int_counter->Increment();
4280f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      break;
4296e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case STR_s:
4306e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl      VIXL_FALLTHROUGH();
4310f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl    case STR_d:
4320f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      store_fp_counter->Increment();
4330f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      break;
4346e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case LDRB_w:
4356e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case LDRH_w:
4366e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case LDR_w:
4376e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case LDR_x:
4386e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case LDRSB_x:
4396e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case LDRSH_x:
4406e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case LDRSW_x:
4416e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case LDRSB_w:
4426e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl      VIXL_FALLTHROUGH();
4430f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl    case LDRSH_w:
4440f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      load_int_counter->Increment();
4450f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      break;
4466e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl    case LDR_s:
4476e2c8275d5f34a531fe1eef7a7aa877601be8558armvixl      VIXL_FALLTHROUGH();
4480f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl    case LDR_d:
4490f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      load_fp_counter->Increment();
4500f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl      break;
451578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  }
452578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
453578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
454578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
455c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStoreUnscaledOffset(const Instruction* instr) {
456578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
457578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
458578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
459578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
460578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
461c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStorePostIndex(const Instruction* instr) {
462578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
463578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
464578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
465578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
466578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
467578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
468c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStorePreIndex(const Instruction* instr) {
469578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
470578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
471578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
472578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
473578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
474c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStoreRegisterOffset(const Instruction* instr) {
475578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
476578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
477578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
478578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
479578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
480c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLoadStoreUnsignedOffset(const Instruction* instr) {
481578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
482578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  InstrumentLoadStore(instr);
483578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
484578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
485578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
486c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitLogicalShifted(const Instruction* instr) {
487578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
488578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
489578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Logical DP");
490578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
491578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
492578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
493578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
494c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitAddSubShifted(const Instruction* instr) {
495578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
496578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
497578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Add/Sub DP");
498578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
499578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
500578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
501578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
502c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitAddSubExtended(const Instruction* instr) {
503578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
504578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
505578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Add/Sub DP");
506578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
507578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
508578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
509578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
510c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitAddSubWithCarry(const Instruction* instr) {
511578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
512578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
513578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Add/Sub DP");
514578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
515578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
516578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
517578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
518c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitConditionalCompareRegister(const Instruction* instr) {
519578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
520578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
521578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Compare");
522578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
523578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
524578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
525578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
526c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitConditionalCompareImmediate(const Instruction* instr) {
527578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
528578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
529578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Compare");
530578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
531578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
532578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
533578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
534c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitConditionalSelect(const Instruction* instr) {
535578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
536578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
537578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Select");
538578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
539578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
540578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
541578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
542c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitDataProcessing1Source(const Instruction* instr) {
543578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
544578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
545578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
546578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
547578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
548578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
549578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
550c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitDataProcessing2Source(const Instruction* instr) {
551578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
552578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
553578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
554578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
555578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
556578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
557578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
558c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitDataProcessing3Source(const Instruction* instr) {
559578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
560578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
561578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other Int DP");
562578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
563578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
564578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
565578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
566c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitFPCompare(const Instruction* instr) {
567578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
568578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
569578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
570578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
571578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
572578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
573578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
574c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitFPConditionalCompare(const Instruction* instr) {
575578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
576578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
577578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Compare");
578578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
579578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
580578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
581578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
582c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitFPConditionalSelect(const Instruction* instr) {
583578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
584578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
585578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Conditional Select");
586578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
587578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
588578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
589578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
590c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitFPImmediate(const Instruction* instr) {
591578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
592578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
593578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
594578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
595578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
596578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
597578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
598c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitFPDataProcessing1Source(const Instruction* instr) {
599578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
600578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
601578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
602578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
603578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
604578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
605578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
606c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitFPDataProcessing2Source(const Instruction* instr) {
607578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
608578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
609578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
610578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
611578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
612578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
613578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
614c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitFPDataProcessing3Source(const Instruction* instr) {
615578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
616578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
617578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
618578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
619578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
620578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
621578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
622c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitFPIntegerConvert(const Instruction* instr) {
623578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
624578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
625578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
626578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
627578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
628578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
629578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
630c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitFPFixedPointConvert(const Instruction* instr) {
631578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
632578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
633578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("FP DP");
634578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
635578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
636578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
637578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
6385289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitCrypto2RegSHA(const Instruction* instr) {
6395289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
6405289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
6415289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("Crypto");
6425289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
6435289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
6445289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6455289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6465289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitCrypto3RegSHA(const Instruction* instr) {
6475289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
6485289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
6495289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("Crypto");
6505289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
6515289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
6525289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6535289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6545289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitCryptoAES(const Instruction* instr) {
6555289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
6565289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
6575289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("Crypto");
6585289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
6595289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
6605289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6615289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6625289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEON2RegMisc(const Instruction* instr) {
6635289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
6645289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
6655289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
6665289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
6675289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
6685289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6695289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6705289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEON3Same(const Instruction* instr) {
6715289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
6725289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
6735289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
6745289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
6755289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
6765289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6775289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6785289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEON3Different(const Instruction* instr) {
6795289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
6805289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
6815289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
6825289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
6835289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
6845289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6855289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6865289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONAcrossLanes(const Instruction* instr) {
6875289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
6885289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
6895289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
6905289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
6915289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
6925289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6935289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
6945289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONByIndexedElement(const Instruction* instr) {
6955289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
6965289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
6975289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
6985289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
6995289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7005289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7015289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7025289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONCopy(const Instruction* instr) {
7035289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7045289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7055289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7065289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7075289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7085289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7095289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7105289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONExtract(const Instruction* instr) {
7115289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7125289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7135289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7145289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7155289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7165289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7175289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7185289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONLoadStoreMultiStruct(const Instruction* instr) {
7195289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7205289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7215289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7225289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7235289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7245289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7255289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7265289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONLoadStoreMultiStructPostIndex(
7275289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl    const Instruction* instr) {
7285289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7295289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7305289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7315289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7325289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7335289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7345289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7355289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONLoadStoreSingleStruct(const Instruction* instr) {
7365289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7375289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7385289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7395289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7405289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7415289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7425289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7435289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONLoadStoreSingleStructPostIndex(
7445289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl    const Instruction* instr) {
7455289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7465289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7475289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7485289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7495289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7505289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7515289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7525289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONModifiedImmediate(const Instruction* instr) {
7535289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7545289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7555289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7565289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7575289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7585289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7595289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7605289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONScalar2RegMisc(const Instruction* instr) {
7615289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7625289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7635289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7645289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7655289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7665289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7675289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7685289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONScalar3Diff(const Instruction* instr) {
7695289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7705289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7715289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7725289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7735289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7745289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7755289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7765289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONScalar3Same(const Instruction* instr) {
7775289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7785289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7795289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7805289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7815289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7825289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7835289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7845289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONScalarByIndexedElement(const Instruction* instr) {
7855289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7865289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7875289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7885289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7895289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7905289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7915289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7925289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONScalarCopy(const Instruction* instr) {
7935289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
7945289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
7955289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
7965289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
7975289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
7985289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
7995289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8005289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONScalarPairwise(const Instruction* instr) {
8015289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
8025289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
8035289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
8045289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
8055289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
8065289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8075289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8085289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONScalarShiftImmediate(const Instruction* instr) {
8095289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
8105289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
8115289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
8125289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
8135289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
8145289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8155289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8165289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONShiftImmediate(const Instruction* instr) {
8175289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
8185289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
8195289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
8205289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
8215289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
8225289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8235289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8245289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONTable(const Instruction* instr) {
8255289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
8265289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
8275289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
8285289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
8295289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
8305289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8315289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8325289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixlvoid Instrument::VisitNEONPerm(const Instruction* instr) {
8335289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  USE(instr);
8345289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  Update();
8355289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  static Counter* counter = GetCounter("NEON");
8365289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl  counter->Increment();
8375289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl}
8385289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
8395289c5900fb214f2f6aa61e2a9263730dcf4cc17armvixl
840c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitUnallocated(const Instruction* instr) {
841578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
842578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
843578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other");
844578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
845578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
846578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
847578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
848c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid Instrument::VisitUnimplemented(const Instruction* instr) {
849578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  USE(instr);
850578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  Update();
851578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  static Counter* counter = GetCounter("Other");
852578645f14e122d2b87d907e298cda7e7d0babf1farmvixl  counter->Increment();
853578645f14e122d2b87d907e298cda7e7d0babf1farmvixl}
854578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
855578645f14e122d2b87d907e298cda7e7d0babf1farmvixl
85688c46b84df005638546de5e4e965bdcc31352f48Pierre Langlois}  // namespace aarch64
857330dc7153e671968beb67f09ed2cb7b5bda334dbarmvixl}  // namespace vixl
858