110381Sdam.sunwoo@arm.com/* 210381Sdam.sunwoo@arm.com * Copyright (c) 2012-2014 ARM Limited 310381Sdam.sunwoo@arm.com * All rights reserved. 410381Sdam.sunwoo@arm.com * 510381Sdam.sunwoo@arm.com * The license below extends only to copyright in the software and shall 610381Sdam.sunwoo@arm.com * not be construed as granting a license to any other intellectual 710381Sdam.sunwoo@arm.com * property including but not limited to intellectual property relating 810381Sdam.sunwoo@arm.com * to a hardware implementation of the functionality of the software 910381Sdam.sunwoo@arm.com * licensed hereunder. You may use the software subject to the license 1010381Sdam.sunwoo@arm.com * terms below provided that you ensure that this notice is replicated 1110381Sdam.sunwoo@arm.com * unmodified and in its entirety in all distributions of the software, 1210381Sdam.sunwoo@arm.com * modified or unmodified, in source code or in binary form. 1310381Sdam.sunwoo@arm.com * 1410381Sdam.sunwoo@arm.com * Redistribution and use in source and binary forms, with or without 1510381Sdam.sunwoo@arm.com * modification, are permitted provided that the following conditions are 1610381Sdam.sunwoo@arm.com * met: redistributions of source code must retain the above copyright 1710381Sdam.sunwoo@arm.com * notice, this list of conditions and the following disclaimer; 1810381Sdam.sunwoo@arm.com * redistributions in binary form must reproduce the above copyright 1910381Sdam.sunwoo@arm.com * notice, this list of conditions and the following disclaimer in the 2010381Sdam.sunwoo@arm.com * documentation and/or other materials provided with the distribution; 2110381Sdam.sunwoo@arm.com * neither the name of the copyright holders nor the names of its 2210381Sdam.sunwoo@arm.com * contributors may be used to endorse or promote products derived from 2310381Sdam.sunwoo@arm.com * this software without specific prior written permission. 2410381Sdam.sunwoo@arm.com * 2510381Sdam.sunwoo@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610381Sdam.sunwoo@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710381Sdam.sunwoo@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810381Sdam.sunwoo@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910381Sdam.sunwoo@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010381Sdam.sunwoo@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110381Sdam.sunwoo@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210381Sdam.sunwoo@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310381Sdam.sunwoo@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410381Sdam.sunwoo@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510381Sdam.sunwoo@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610381Sdam.sunwoo@arm.com * 3710381Sdam.sunwoo@arm.com * Authors: Dam Sunwoo 3810381Sdam.sunwoo@arm.com * Curtis Dunham 3910381Sdam.sunwoo@arm.com */ 4010381Sdam.sunwoo@arm.com 4110381Sdam.sunwoo@arm.com#ifndef __CPU_SIMPLE_PROBES_SIMPOINT_HH__ 4210381Sdam.sunwoo@arm.com#define __CPU_SIMPLE_PROBES_SIMPOINT_HH__ 4310381Sdam.sunwoo@arm.com 4411168Sandreas.hansson@arm.com#include <unordered_map> 4511168Sandreas.hansson@arm.com 4611359Sandreas@sandberg.pp.se#include "base/output.hh" 4710381Sdam.sunwoo@arm.com#include "cpu/simple_thread.hh" 4810381Sdam.sunwoo@arm.com#include "params/SimPoint.hh" 4910381Sdam.sunwoo@arm.com#include "sim/probe/probe.hh" 5010381Sdam.sunwoo@arm.com 5110381Sdam.sunwoo@arm.com/** 5210381Sdam.sunwoo@arm.com * Probe for SimPoints BBV generation 5310381Sdam.sunwoo@arm.com */ 5410381Sdam.sunwoo@arm.com 5510381Sdam.sunwoo@arm.com/** 5610381Sdam.sunwoo@arm.com * Start and end address of basic block for SimPoint profiling. 5710381Sdam.sunwoo@arm.com * This structure is used to look up the hash table of BBVs. 5810381Sdam.sunwoo@arm.com * - first: PC of first inst in basic block 5910381Sdam.sunwoo@arm.com * - second: PC of last inst in basic block 6010381Sdam.sunwoo@arm.com */ 6110381Sdam.sunwoo@arm.comtypedef std::pair<Addr, Addr> BasicBlockRange; 6210381Sdam.sunwoo@arm.com 6310381Sdam.sunwoo@arm.com/** Overload hash function for BasicBlockRange type */ 6411168Sandreas.hansson@arm.comnamespace std { 6510381Sdam.sunwoo@arm.comtemplate <> 6610381Sdam.sunwoo@arm.comstruct hash<BasicBlockRange> 6710381Sdam.sunwoo@arm.com{ 6810381Sdam.sunwoo@arm.com public: 6910381Sdam.sunwoo@arm.com size_t operator()(const BasicBlockRange &bb) const { 7010381Sdam.sunwoo@arm.com return hash<Addr>()(bb.first + bb.second); 7110381Sdam.sunwoo@arm.com } 7210381Sdam.sunwoo@arm.com}; 7311168Sandreas.hansson@arm.com} 7410381Sdam.sunwoo@arm.com 7510381Sdam.sunwoo@arm.comclass SimPoint : public ProbeListenerObject 7610381Sdam.sunwoo@arm.com{ 7710381Sdam.sunwoo@arm.com public: 7810381Sdam.sunwoo@arm.com SimPoint(const SimPointParams *params); 7910381Sdam.sunwoo@arm.com virtual ~SimPoint(); 8010381Sdam.sunwoo@arm.com 8110381Sdam.sunwoo@arm.com virtual void init(); 8210381Sdam.sunwoo@arm.com 8310381Sdam.sunwoo@arm.com virtual void regProbeListeners(); 8410381Sdam.sunwoo@arm.com 8510381Sdam.sunwoo@arm.com /** 8610381Sdam.sunwoo@arm.com * Profile basic blocks for SimPoints. 8710381Sdam.sunwoo@arm.com * Called at every macro inst to increment basic block inst counts and 8810381Sdam.sunwoo@arm.com * to profile block if end of block. 8910381Sdam.sunwoo@arm.com */ 9010381Sdam.sunwoo@arm.com void profile(const std::pair<SimpleThread*, StaticInstPtr>&); 9110381Sdam.sunwoo@arm.com 9210381Sdam.sunwoo@arm.com private: 9310381Sdam.sunwoo@arm.com /** SimPoint profiling interval size in instructions */ 9410381Sdam.sunwoo@arm.com const uint64_t intervalSize; 9510381Sdam.sunwoo@arm.com 9610381Sdam.sunwoo@arm.com /** Inst count in current basic block */ 9710381Sdam.sunwoo@arm.com uint64_t intervalCount; 9810381Sdam.sunwoo@arm.com /** Excess inst count from previous interval*/ 9910381Sdam.sunwoo@arm.com uint64_t intervalDrift; 10010381Sdam.sunwoo@arm.com /** Pointer to SimPoint BBV output stream */ 10111359Sandreas@sandberg.pp.se OutputStream *simpointStream; 10210381Sdam.sunwoo@arm.com 10310381Sdam.sunwoo@arm.com /** Basic Block information */ 10410381Sdam.sunwoo@arm.com struct BBInfo { 10510381Sdam.sunwoo@arm.com /** Unique ID */ 10610381Sdam.sunwoo@arm.com uint64_t id; 10710381Sdam.sunwoo@arm.com /** Num of static insts in BB */ 10810381Sdam.sunwoo@arm.com uint64_t insts; 10910381Sdam.sunwoo@arm.com /** Accumulated dynamic inst count executed by BB */ 11010381Sdam.sunwoo@arm.com uint64_t count; 11110381Sdam.sunwoo@arm.com }; 11210381Sdam.sunwoo@arm.com 11310381Sdam.sunwoo@arm.com /** Hash table containing all previously seen basic blocks */ 11411168Sandreas.hansson@arm.com std::unordered_map<BasicBlockRange, BBInfo> bbMap; 11510381Sdam.sunwoo@arm.com /** Currently executing basic block */ 11610381Sdam.sunwoo@arm.com BasicBlockRange currentBBV; 11710381Sdam.sunwoo@arm.com /** inst count in current basic block */ 11810381Sdam.sunwoo@arm.com uint64_t currentBBVInstCount; 11910381Sdam.sunwoo@arm.com}; 12010381Sdam.sunwoo@arm.com 12110381Sdam.sunwoo@arm.com#endif // __CPU_SIMPLE_PROBES_SIMPOINT_HH__ 122