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