111308Santhony.gutierrez@amd.com/*
212697Santhony.gutierrez@amd.com * Copyright (c) 2015-2017 Advanced Micro Devices, Inc.
311308Santhony.gutierrez@amd.com * All rights reserved.
411308Santhony.gutierrez@amd.com *
511308Santhony.gutierrez@amd.com * For use for simulation and test purposes only
611308Santhony.gutierrez@amd.com *
711308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without
811308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are met:
911308Santhony.gutierrez@amd.com *
1011308Santhony.gutierrez@amd.com * 1. Redistributions of source code must retain the above copyright notice,
1111308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer.
1211308Santhony.gutierrez@amd.com *
1311308Santhony.gutierrez@amd.com * 2. Redistributions in binary form must reproduce the above copyright notice,
1411308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer in the documentation
1511308Santhony.gutierrez@amd.com * and/or other materials provided with the distribution.
1611308Santhony.gutierrez@amd.com *
1712697Santhony.gutierrez@amd.com * 3. Neither the name of the copyright holder nor the names of its
1812697Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from this
1912697Santhony.gutierrez@amd.com * software without specific prior written permission.
2011308Santhony.gutierrez@amd.com *
2111308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2211308Santhony.gutierrez@amd.com * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2311308Santhony.gutierrez@amd.com * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2411308Santhony.gutierrez@amd.com * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
2511308Santhony.gutierrez@amd.com * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2611308Santhony.gutierrez@amd.com * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2711308Santhony.gutierrez@amd.com * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2811308Santhony.gutierrez@amd.com * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2911308Santhony.gutierrez@amd.com * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3011308Santhony.gutierrez@amd.com * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3111308Santhony.gutierrez@amd.com * POSSIBILITY OF SUCH DAMAGE.
3211308Santhony.gutierrez@amd.com *
3312697Santhony.gutierrez@amd.com * Authors: Anthony Gutierrez
3411308Santhony.gutierrez@amd.com */
3511308Santhony.gutierrez@amd.com
3611308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_dyn_inst.hh"
3711308Santhony.gutierrez@amd.com
3811308Santhony.gutierrez@amd.com#include "debug/GPUMem.hh"
3911308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_static_inst.hh"
4011308Santhony.gutierrez@amd.com#include "gpu-compute/shader.hh"
4111308Santhony.gutierrez@amd.com#include "gpu-compute/wavefront.hh"
4211308Santhony.gutierrez@amd.com
4311308Santhony.gutierrez@amd.comGPUDynInst::GPUDynInst(ComputeUnit *_cu, Wavefront *_wf,
4411692Santhony.gutierrez@amd.com                       GPUStaticInst *static_inst, uint64_t instSeqNum)
4511534Sjohn.kalamatianos@amd.com    : GPUExecContext(_cu, _wf), addr(computeUnit()->wfSize(), (Addr)0),
4611692Santhony.gutierrez@amd.com      n_reg(0), useContinuation(false),
4711692Santhony.gutierrez@amd.com      statusBitVector(0), _staticInst(static_inst), _seqNum(instSeqNum)
4811308Santhony.gutierrez@amd.com{
4911534Sjohn.kalamatianos@amd.com    tlbHitLevel.assign(computeUnit()->wfSize(), -1);
5011534Sjohn.kalamatianos@amd.com    d_data = new uint8_t[computeUnit()->wfSize() * 16];
5111534Sjohn.kalamatianos@amd.com    a_data = new uint8_t[computeUnit()->wfSize() * 8];
5211534Sjohn.kalamatianos@amd.com    x_data = new uint8_t[computeUnit()->wfSize() * 8];
5311534Sjohn.kalamatianos@amd.com    for (int i = 0; i < (computeUnit()->wfSize() * 8); ++i) {
5411534Sjohn.kalamatianos@amd.com        a_data[i] = 0;
5511534Sjohn.kalamatianos@amd.com        x_data[i] = 0;
5611534Sjohn.kalamatianos@amd.com    }
5711534Sjohn.kalamatianos@amd.com    for (int i = 0; i < (computeUnit()->wfSize() * 16); ++i) {
5811534Sjohn.kalamatianos@amd.com        d_data[i] = 0;
5911534Sjohn.kalamatianos@amd.com    }
6011534Sjohn.kalamatianos@amd.com}
6111534Sjohn.kalamatianos@amd.com
6211534Sjohn.kalamatianos@amd.comGPUDynInst::~GPUDynInst()
6311534Sjohn.kalamatianos@amd.com{
6411534Sjohn.kalamatianos@amd.com    delete[] d_data;
6511534Sjohn.kalamatianos@amd.com    delete[] a_data;
6611534Sjohn.kalamatianos@amd.com    delete[] x_data;
6711308Santhony.gutierrez@amd.com}
6811308Santhony.gutierrez@amd.com
6911308Santhony.gutierrez@amd.comvoid
7011692Santhony.gutierrez@amd.comGPUDynInst::execute(GPUDynInstPtr gpuDynInst)
7111308Santhony.gutierrez@amd.com{
7211692Santhony.gutierrez@amd.com    _staticInst->execute(gpuDynInst);
7311308Santhony.gutierrez@amd.com}
7411308Santhony.gutierrez@amd.com
7511308Santhony.gutierrez@amd.comint
7611308Santhony.gutierrez@amd.comGPUDynInst::numSrcRegOperands()
7711308Santhony.gutierrez@amd.com{
7811692Santhony.gutierrez@amd.com    return _staticInst->numSrcRegOperands();
7911308Santhony.gutierrez@amd.com}
8011308Santhony.gutierrez@amd.com
8111308Santhony.gutierrez@amd.comint
8211308Santhony.gutierrez@amd.comGPUDynInst::numDstRegOperands()
8311308Santhony.gutierrez@amd.com{
8411692Santhony.gutierrez@amd.com    return _staticInst->numDstRegOperands();
8511308Santhony.gutierrez@amd.com}
8611308Santhony.gutierrez@amd.com
8711308Santhony.gutierrez@amd.comint
8811308Santhony.gutierrez@amd.comGPUDynInst::getNumOperands()
8911308Santhony.gutierrez@amd.com{
9011692Santhony.gutierrez@amd.com    return _staticInst->getNumOperands();
9111308Santhony.gutierrez@amd.com}
9211308Santhony.gutierrez@amd.com
9311308Santhony.gutierrez@amd.combool
9411308Santhony.gutierrez@amd.comGPUDynInst::isVectorRegister(int operandIdx)
9511308Santhony.gutierrez@amd.com{
9611692Santhony.gutierrez@amd.com    return _staticInst->isVectorRegister(operandIdx);
9711308Santhony.gutierrez@amd.com}
9811308Santhony.gutierrez@amd.com
9911308Santhony.gutierrez@amd.combool
10011308Santhony.gutierrez@amd.comGPUDynInst::isScalarRegister(int operandIdx)
10111308Santhony.gutierrez@amd.com{
10211692Santhony.gutierrez@amd.com    return _staticInst->isScalarRegister(operandIdx);
10311308Santhony.gutierrez@amd.com}
10411308Santhony.gutierrez@amd.com
10511699Santhony.gutierrez@amd.combool
10611699Santhony.gutierrez@amd.comGPUDynInst::isCondRegister(int operandIdx)
10711699Santhony.gutierrez@amd.com{
10811699Santhony.gutierrez@amd.com    return _staticInst->isCondRegister(operandIdx);
10911699Santhony.gutierrez@amd.com}
11011699Santhony.gutierrez@amd.com
11111308Santhony.gutierrez@amd.comint
11211699Santhony.gutierrez@amd.comGPUDynInst::getRegisterIndex(int operandIdx, GPUDynInstPtr gpuDynInst)
11311308Santhony.gutierrez@amd.com{
11411699Santhony.gutierrez@amd.com    return _staticInst->getRegisterIndex(operandIdx, gpuDynInst);
11511308Santhony.gutierrez@amd.com}
11611308Santhony.gutierrez@amd.com
11711308Santhony.gutierrez@amd.comint
11811308Santhony.gutierrez@amd.comGPUDynInst::getOperandSize(int operandIdx)
11911308Santhony.gutierrez@amd.com{
12011692Santhony.gutierrez@amd.com    return _staticInst->getOperandSize(operandIdx);
12111308Santhony.gutierrez@amd.com}
12211308Santhony.gutierrez@amd.com
12311308Santhony.gutierrez@amd.combool
12411308Santhony.gutierrez@amd.comGPUDynInst::isDstOperand(int operandIdx)
12511308Santhony.gutierrez@amd.com{
12611692Santhony.gutierrez@amd.com    return _staticInst->isDstOperand(operandIdx);
12711308Santhony.gutierrez@amd.com}
12811308Santhony.gutierrez@amd.com
12911308Santhony.gutierrez@amd.combool
13011308Santhony.gutierrez@amd.comGPUDynInst::isSrcOperand(int operandIdx)
13111308Santhony.gutierrez@amd.com{
13211692Santhony.gutierrez@amd.com    return _staticInst->isSrcOperand(operandIdx);
13311308Santhony.gutierrez@amd.com}
13411308Santhony.gutierrez@amd.com
13511308Santhony.gutierrez@amd.comconst std::string&
13611308Santhony.gutierrez@amd.comGPUDynInst::disassemble() const
13711308Santhony.gutierrez@amd.com{
13811692Santhony.gutierrez@amd.com    return _staticInst->disassemble();
13911308Santhony.gutierrez@amd.com}
14011308Santhony.gutierrez@amd.com
14111308Santhony.gutierrez@amd.comuint64_t
14211308Santhony.gutierrez@amd.comGPUDynInst::seqNum() const
14311308Santhony.gutierrez@amd.com{
14411308Santhony.gutierrez@amd.com    return _seqNum;
14511308Santhony.gutierrez@amd.com}
14611308Santhony.gutierrez@amd.com
14711308Santhony.gutierrez@amd.comEnums::StorageClassType
14811308Santhony.gutierrez@amd.comGPUDynInst::executedAs()
14911308Santhony.gutierrez@amd.com{
15011692Santhony.gutierrez@amd.com    return _staticInst->executed_as;
15111308Santhony.gutierrez@amd.com}
15211308Santhony.gutierrez@amd.com
15311308Santhony.gutierrez@amd.com// Process a memory instruction and (if necessary) submit timing request
15411308Santhony.gutierrez@amd.comvoid
15511308Santhony.gutierrez@amd.comGPUDynInst::initiateAcc(GPUDynInstPtr gpuDynInst)
15611308Santhony.gutierrez@amd.com{
15711308Santhony.gutierrez@amd.com    DPRINTF(GPUMem, "CU%d: WF[%d][%d]: mempacket status bitvector=%#x\n",
15811308Santhony.gutierrez@amd.com            cu->cu_id, simdId, wfSlotId, exec_mask);
15911308Santhony.gutierrez@amd.com
16011692Santhony.gutierrez@amd.com    _staticInst->initiateAcc(gpuDynInst);
16111308Santhony.gutierrez@amd.com    time = 0;
16211308Santhony.gutierrez@amd.com}
16311308Santhony.gutierrez@amd.com
16411693Santhony.gutierrez@amd.comvoid
16511693Santhony.gutierrez@amd.comGPUDynInst::completeAcc(GPUDynInstPtr gpuDynInst)
16611693Santhony.gutierrez@amd.com{
16711693Santhony.gutierrez@amd.com    _staticInst->completeAcc(gpuDynInst);
16811693Santhony.gutierrez@amd.com}
16911693Santhony.gutierrez@amd.com
17011692Santhony.gutierrez@amd.com/**
17111692Santhony.gutierrez@amd.com * accessor methods for the attributes of
17211692Santhony.gutierrez@amd.com * the underlying GPU static instruction
17311692Santhony.gutierrez@amd.com */
17411308Santhony.gutierrez@amd.combool
17511692Santhony.gutierrez@amd.comGPUDynInst::isALU() const
17611308Santhony.gutierrez@amd.com{
17711692Santhony.gutierrez@amd.com    return _staticInst->isALU();
17811692Santhony.gutierrez@amd.com}
17911692Santhony.gutierrez@amd.com
18011692Santhony.gutierrez@amd.combool
18111692Santhony.gutierrez@amd.comGPUDynInst::isBranch() const
18211692Santhony.gutierrez@amd.com{
18311692Santhony.gutierrez@amd.com    return _staticInst->isBranch();
18411692Santhony.gutierrez@amd.com}
18511692Santhony.gutierrez@amd.com
18611692Santhony.gutierrez@amd.combool
18711692Santhony.gutierrez@amd.comGPUDynInst::isNop() const
18811692Santhony.gutierrez@amd.com{
18911692Santhony.gutierrez@amd.com    return _staticInst->isNop();
19011692Santhony.gutierrez@amd.com}
19111692Santhony.gutierrez@amd.com
19211692Santhony.gutierrez@amd.combool
19311692Santhony.gutierrez@amd.comGPUDynInst::isReturn() const
19411692Santhony.gutierrez@amd.com{
19511692Santhony.gutierrez@amd.com    return _staticInst->isReturn();
19611692Santhony.gutierrez@amd.com}
19711692Santhony.gutierrez@amd.com
19811692Santhony.gutierrez@amd.combool
19911692Santhony.gutierrez@amd.comGPUDynInst::isUnconditionalJump() const
20011692Santhony.gutierrez@amd.com{
20111692Santhony.gutierrez@amd.com    return _staticInst->isUnconditionalJump();
20211692Santhony.gutierrez@amd.com}
20311692Santhony.gutierrez@amd.com
20411692Santhony.gutierrez@amd.combool
20511692Santhony.gutierrez@amd.comGPUDynInst::isSpecialOp() const
20611692Santhony.gutierrez@amd.com{
20711692Santhony.gutierrez@amd.com    return _staticInst->isSpecialOp();
20811692Santhony.gutierrez@amd.com}
20911692Santhony.gutierrez@amd.com
21011692Santhony.gutierrez@amd.combool
21111692Santhony.gutierrez@amd.comGPUDynInst::isWaitcnt() const
21211692Santhony.gutierrez@amd.com{
21311692Santhony.gutierrez@amd.com    return _staticInst->isWaitcnt();
21411692Santhony.gutierrez@amd.com}
21511692Santhony.gutierrez@amd.com
21611692Santhony.gutierrez@amd.combool
21711692Santhony.gutierrez@amd.comGPUDynInst::isBarrier() const
21811692Santhony.gutierrez@amd.com{
21911692Santhony.gutierrez@amd.com    return _staticInst->isBarrier();
22011692Santhony.gutierrez@amd.com}
22111692Santhony.gutierrez@amd.com
22211692Santhony.gutierrez@amd.combool
22311692Santhony.gutierrez@amd.comGPUDynInst::isMemFence() const
22411692Santhony.gutierrez@amd.com{
22511692Santhony.gutierrez@amd.com    return _staticInst->isMemFence();
22611692Santhony.gutierrez@amd.com}
22711692Santhony.gutierrez@amd.com
22811692Santhony.gutierrez@amd.combool
22911692Santhony.gutierrez@amd.comGPUDynInst::isMemRef() const
23011692Santhony.gutierrez@amd.com{
23111692Santhony.gutierrez@amd.com    return _staticInst->isMemRef();
23211692Santhony.gutierrez@amd.com}
23311692Santhony.gutierrez@amd.com
23411692Santhony.gutierrez@amd.combool
23511692Santhony.gutierrez@amd.comGPUDynInst::isFlat() const
23611692Santhony.gutierrez@amd.com{
23711692Santhony.gutierrez@amd.com    return _staticInst->isFlat();
23811692Santhony.gutierrez@amd.com}
23911692Santhony.gutierrez@amd.com
24011692Santhony.gutierrez@amd.combool
24111692Santhony.gutierrez@amd.comGPUDynInst::isLoad() const
24211692Santhony.gutierrez@amd.com{
24311692Santhony.gutierrez@amd.com    return _staticInst->isLoad();
24411692Santhony.gutierrez@amd.com}
24511692Santhony.gutierrez@amd.com
24611692Santhony.gutierrez@amd.combool
24711692Santhony.gutierrez@amd.comGPUDynInst::isStore() const
24811692Santhony.gutierrez@amd.com{
24911692Santhony.gutierrez@amd.com    return _staticInst->isStore();
25011692Santhony.gutierrez@amd.com}
25111692Santhony.gutierrez@amd.com
25211692Santhony.gutierrez@amd.combool
25311692Santhony.gutierrez@amd.comGPUDynInst::isAtomic() const
25411692Santhony.gutierrez@amd.com{
25511692Santhony.gutierrez@amd.com    return _staticInst->isAtomic();
25611692Santhony.gutierrez@amd.com}
25711692Santhony.gutierrez@amd.com
25811692Santhony.gutierrez@amd.combool
25911692Santhony.gutierrez@amd.comGPUDynInst::isAtomicNoRet() const
26011692Santhony.gutierrez@amd.com{
26111692Santhony.gutierrez@amd.com    return _staticInst->isAtomicNoRet();
26211692Santhony.gutierrez@amd.com}
26311692Santhony.gutierrez@amd.com
26411692Santhony.gutierrez@amd.combool
26511692Santhony.gutierrez@amd.comGPUDynInst::isAtomicRet() const
26611692Santhony.gutierrez@amd.com{
26711692Santhony.gutierrez@amd.com    return _staticInst->isAtomicRet();
26811692Santhony.gutierrez@amd.com}
26911692Santhony.gutierrez@amd.com
27011692Santhony.gutierrez@amd.combool
27111692Santhony.gutierrez@amd.comGPUDynInst::isScalar() const
27211692Santhony.gutierrez@amd.com{
27311692Santhony.gutierrez@amd.com    return _staticInst->isScalar();
27411692Santhony.gutierrez@amd.com}
27511692Santhony.gutierrez@amd.com
27611692Santhony.gutierrez@amd.combool
27711692Santhony.gutierrez@amd.comGPUDynInst::readsSCC() const
27811692Santhony.gutierrez@amd.com{
27911692Santhony.gutierrez@amd.com    return _staticInst->readsSCC();
28011692Santhony.gutierrez@amd.com}
28111692Santhony.gutierrez@amd.com
28211692Santhony.gutierrez@amd.combool
28311692Santhony.gutierrez@amd.comGPUDynInst::writesSCC() const
28411692Santhony.gutierrez@amd.com{
28511692Santhony.gutierrez@amd.com    return _staticInst->writesSCC();
28611692Santhony.gutierrez@amd.com}
28711692Santhony.gutierrez@amd.com
28811692Santhony.gutierrez@amd.combool
28911692Santhony.gutierrez@amd.comGPUDynInst::readsVCC() const
29011692Santhony.gutierrez@amd.com{
29111692Santhony.gutierrez@amd.com    return _staticInst->readsVCC();
29211692Santhony.gutierrez@amd.com}
29311692Santhony.gutierrez@amd.com
29411692Santhony.gutierrez@amd.combool
29511692Santhony.gutierrez@amd.comGPUDynInst::writesVCC() const
29611692Santhony.gutierrez@amd.com{
29711692Santhony.gutierrez@amd.com    return _staticInst->writesVCC();
29811692Santhony.gutierrez@amd.com}
29911692Santhony.gutierrez@amd.com
30011692Santhony.gutierrez@amd.combool
30111692Santhony.gutierrez@amd.comGPUDynInst::isAtomicAnd() const
30211692Santhony.gutierrez@amd.com{
30311692Santhony.gutierrez@amd.com    return _staticInst->isAtomicAnd();
30411692Santhony.gutierrez@amd.com}
30511692Santhony.gutierrez@amd.com
30611692Santhony.gutierrez@amd.combool
30711692Santhony.gutierrez@amd.comGPUDynInst::isAtomicOr() const
30811692Santhony.gutierrez@amd.com{
30911692Santhony.gutierrez@amd.com    return _staticInst->isAtomicOr();
31011692Santhony.gutierrez@amd.com}
31111692Santhony.gutierrez@amd.com
31211692Santhony.gutierrez@amd.combool
31311692Santhony.gutierrez@amd.comGPUDynInst::isAtomicXor() const
31411692Santhony.gutierrez@amd.com{
31511692Santhony.gutierrez@amd.com    return _staticInst->isAtomicXor();
31611692Santhony.gutierrez@amd.com}
31711692Santhony.gutierrez@amd.com
31811692Santhony.gutierrez@amd.combool
31911692Santhony.gutierrez@amd.comGPUDynInst::isAtomicCAS() const
32011692Santhony.gutierrez@amd.com{
32111692Santhony.gutierrez@amd.com    return _staticInst->isAtomicCAS();
32211692Santhony.gutierrez@amd.com}
32311692Santhony.gutierrez@amd.com
32411692Santhony.gutierrez@amd.combool GPUDynInst::isAtomicExch() const
32511692Santhony.gutierrez@amd.com{
32611692Santhony.gutierrez@amd.com    return _staticInst->isAtomicExch();
32711692Santhony.gutierrez@amd.com}
32811692Santhony.gutierrez@amd.com
32911692Santhony.gutierrez@amd.combool
33011692Santhony.gutierrez@amd.comGPUDynInst::isAtomicAdd() const
33111692Santhony.gutierrez@amd.com{
33211692Santhony.gutierrez@amd.com    return _staticInst->isAtomicAdd();
33311692Santhony.gutierrez@amd.com}
33411692Santhony.gutierrez@amd.com
33511692Santhony.gutierrez@amd.combool
33611692Santhony.gutierrez@amd.comGPUDynInst::isAtomicSub() const
33711692Santhony.gutierrez@amd.com{
33811692Santhony.gutierrez@amd.com    return _staticInst->isAtomicSub();
33911692Santhony.gutierrez@amd.com}
34011692Santhony.gutierrez@amd.com
34111692Santhony.gutierrez@amd.combool
34211692Santhony.gutierrez@amd.comGPUDynInst::isAtomicInc() const
34311692Santhony.gutierrez@amd.com{
34411692Santhony.gutierrez@amd.com    return _staticInst->isAtomicInc();
34511692Santhony.gutierrez@amd.com}
34611692Santhony.gutierrez@amd.com
34711692Santhony.gutierrez@amd.combool
34811692Santhony.gutierrez@amd.comGPUDynInst::isAtomicDec() const
34911692Santhony.gutierrez@amd.com{
35011692Santhony.gutierrez@amd.com    return _staticInst->isAtomicDec();
35111692Santhony.gutierrez@amd.com}
35211692Santhony.gutierrez@amd.com
35311692Santhony.gutierrez@amd.combool
35411692Santhony.gutierrez@amd.comGPUDynInst::isAtomicMax() const
35511692Santhony.gutierrez@amd.com{
35611692Santhony.gutierrez@amd.com    return _staticInst->isAtomicMax();
35711692Santhony.gutierrez@amd.com}
35811692Santhony.gutierrez@amd.com
35911692Santhony.gutierrez@amd.combool
36011692Santhony.gutierrez@amd.comGPUDynInst::isAtomicMin() const
36111692Santhony.gutierrez@amd.com{
36211692Santhony.gutierrez@amd.com    return _staticInst->isAtomicMin();
36311692Santhony.gutierrez@amd.com}
36411692Santhony.gutierrez@amd.com
36511692Santhony.gutierrez@amd.combool
36611692Santhony.gutierrez@amd.comGPUDynInst::isArgLoad() const
36711692Santhony.gutierrez@amd.com{
36811692Santhony.gutierrez@amd.com    return _staticInst->isArgLoad();
36911692Santhony.gutierrez@amd.com}
37011692Santhony.gutierrez@amd.com
37111692Santhony.gutierrez@amd.combool
37211692Santhony.gutierrez@amd.comGPUDynInst::isGlobalMem() const
37311692Santhony.gutierrez@amd.com{
37411692Santhony.gutierrez@amd.com    return _staticInst->isGlobalMem();
37511692Santhony.gutierrez@amd.com}
37611692Santhony.gutierrez@amd.com
37711692Santhony.gutierrez@amd.combool
37811692Santhony.gutierrez@amd.comGPUDynInst::isLocalMem() const
37911692Santhony.gutierrez@amd.com{
38011692Santhony.gutierrez@amd.com    return _staticInst->isLocalMem();
38111692Santhony.gutierrez@amd.com}
38211692Santhony.gutierrez@amd.com
38311692Santhony.gutierrez@amd.combool
38411692Santhony.gutierrez@amd.comGPUDynInst::isArgSeg() const
38511692Santhony.gutierrez@amd.com{
38611692Santhony.gutierrez@amd.com    return _staticInst->isArgSeg();
38711692Santhony.gutierrez@amd.com}
38811692Santhony.gutierrez@amd.com
38911692Santhony.gutierrez@amd.combool
39011692Santhony.gutierrez@amd.comGPUDynInst::isGlobalSeg() const
39111692Santhony.gutierrez@amd.com{
39211692Santhony.gutierrez@amd.com    return _staticInst->isGlobalSeg();
39311692Santhony.gutierrez@amd.com}
39411692Santhony.gutierrez@amd.com
39511692Santhony.gutierrez@amd.combool
39611692Santhony.gutierrez@amd.comGPUDynInst::isGroupSeg() const
39711692Santhony.gutierrez@amd.com{
39811692Santhony.gutierrez@amd.com    return _staticInst->isGroupSeg();
39911692Santhony.gutierrez@amd.com}
40011692Santhony.gutierrez@amd.com
40111692Santhony.gutierrez@amd.combool
40211692Santhony.gutierrez@amd.comGPUDynInst::isKernArgSeg() const
40311692Santhony.gutierrez@amd.com{
40411692Santhony.gutierrez@amd.com    return _staticInst->isKernArgSeg();
40511692Santhony.gutierrez@amd.com}
40611692Santhony.gutierrez@amd.com
40711692Santhony.gutierrez@amd.combool
40811692Santhony.gutierrez@amd.comGPUDynInst::isPrivateSeg() const
40911692Santhony.gutierrez@amd.com{
41011692Santhony.gutierrez@amd.com    return _staticInst->isPrivateSeg();
41111692Santhony.gutierrez@amd.com}
41211692Santhony.gutierrez@amd.com
41311692Santhony.gutierrez@amd.combool
41411692Santhony.gutierrez@amd.comGPUDynInst::isReadOnlySeg() const
41511692Santhony.gutierrez@amd.com{
41611692Santhony.gutierrez@amd.com    return _staticInst->isReadOnlySeg();
41711692Santhony.gutierrez@amd.com}
41811692Santhony.gutierrez@amd.com
41911692Santhony.gutierrez@amd.combool
42011692Santhony.gutierrez@amd.comGPUDynInst::isSpillSeg() const
42111692Santhony.gutierrez@amd.com{
42211692Santhony.gutierrez@amd.com    return _staticInst->isSpillSeg();
42311692Santhony.gutierrez@amd.com}
42411692Santhony.gutierrez@amd.com
42511692Santhony.gutierrez@amd.combool
42611692Santhony.gutierrez@amd.comGPUDynInst::isWorkitemScope() const
42711692Santhony.gutierrez@amd.com{
42811692Santhony.gutierrez@amd.com    return _staticInst->isWorkitemScope();
42911692Santhony.gutierrez@amd.com}
43011692Santhony.gutierrez@amd.com
43111692Santhony.gutierrez@amd.combool
43211692Santhony.gutierrez@amd.comGPUDynInst::isWavefrontScope() const
43311692Santhony.gutierrez@amd.com{
43411692Santhony.gutierrez@amd.com    return _staticInst->isWavefrontScope();
43511692Santhony.gutierrez@amd.com}
43611692Santhony.gutierrez@amd.com
43711692Santhony.gutierrez@amd.combool
43811692Santhony.gutierrez@amd.comGPUDynInst::isWorkgroupScope() const
43911692Santhony.gutierrez@amd.com{
44011692Santhony.gutierrez@amd.com    return _staticInst->isWorkgroupScope();
44111692Santhony.gutierrez@amd.com}
44211692Santhony.gutierrez@amd.com
44311692Santhony.gutierrez@amd.combool
44411692Santhony.gutierrez@amd.comGPUDynInst::isDeviceScope() const
44511692Santhony.gutierrez@amd.com{
44611692Santhony.gutierrez@amd.com    return _staticInst->isDeviceScope();
44711692Santhony.gutierrez@amd.com}
44811692Santhony.gutierrez@amd.com
44911692Santhony.gutierrez@amd.combool
45011692Santhony.gutierrez@amd.comGPUDynInst::isSystemScope() const
45111692Santhony.gutierrez@amd.com{
45211692Santhony.gutierrez@amd.com    return _staticInst->isSystemScope();
45311692Santhony.gutierrez@amd.com}
45411692Santhony.gutierrez@amd.com
45511692Santhony.gutierrez@amd.combool
45611692Santhony.gutierrez@amd.comGPUDynInst::isNoScope() const
45711692Santhony.gutierrez@amd.com{
45811692Santhony.gutierrez@amd.com    return _staticInst->isNoScope();
45911692Santhony.gutierrez@amd.com}
46011692Santhony.gutierrez@amd.com
46111692Santhony.gutierrez@amd.combool
46211692Santhony.gutierrez@amd.comGPUDynInst::isRelaxedOrder() const
46311692Santhony.gutierrez@amd.com{
46411692Santhony.gutierrez@amd.com    return _staticInst->isRelaxedOrder();
46511692Santhony.gutierrez@amd.com}
46611692Santhony.gutierrez@amd.com
46711692Santhony.gutierrez@amd.combool
46811692Santhony.gutierrez@amd.comGPUDynInst::isAcquire() const
46911692Santhony.gutierrez@amd.com{
47011692Santhony.gutierrez@amd.com    return _staticInst->isAcquire();
47111692Santhony.gutierrez@amd.com}
47211692Santhony.gutierrez@amd.com
47311692Santhony.gutierrez@amd.combool
47411692Santhony.gutierrez@amd.comGPUDynInst::isRelease() const
47511692Santhony.gutierrez@amd.com{
47611692Santhony.gutierrez@amd.com    return _staticInst->isRelease();
47711692Santhony.gutierrez@amd.com}
47811692Santhony.gutierrez@amd.com
47911692Santhony.gutierrez@amd.combool
48011692Santhony.gutierrez@amd.comGPUDynInst::isAcquireRelease() const
48111692Santhony.gutierrez@amd.com{
48211692Santhony.gutierrez@amd.com    return _staticInst->isAcquireRelease();
48311692Santhony.gutierrez@amd.com}
48411692Santhony.gutierrez@amd.com
48511692Santhony.gutierrez@amd.combool
48611692Santhony.gutierrez@amd.comGPUDynInst::isNoOrder() const
48711692Santhony.gutierrez@amd.com{
48811692Santhony.gutierrez@amd.com    return _staticInst->isNoOrder();
48911692Santhony.gutierrez@amd.com}
49011692Santhony.gutierrez@amd.com
49111692Santhony.gutierrez@amd.combool
49211692Santhony.gutierrez@amd.comGPUDynInst::isGloballyCoherent() const
49311692Santhony.gutierrez@amd.com{
49411692Santhony.gutierrez@amd.com    return _staticInst->isGloballyCoherent();
49511692Santhony.gutierrez@amd.com}
49611692Santhony.gutierrez@amd.com
49711692Santhony.gutierrez@amd.combool
49811692Santhony.gutierrez@amd.comGPUDynInst::isSystemCoherent() const
49911692Santhony.gutierrez@amd.com{
50011692Santhony.gutierrez@amd.com    return _staticInst->isSystemCoherent();
50111308Santhony.gutierrez@amd.com}
50211308Santhony.gutierrez@amd.com
50311308Santhony.gutierrez@amd.comvoid
50411308Santhony.gutierrez@amd.comGPUDynInst::updateStats()
50511308Santhony.gutierrez@amd.com{
50611692Santhony.gutierrez@amd.com    if (_staticInst->isLocalMem()) {
50711308Santhony.gutierrez@amd.com        // access to LDS (shared) memory
50811308Santhony.gutierrez@amd.com        cu->dynamicLMemInstrCnt++;
50911308Santhony.gutierrez@amd.com    } else {
51011308Santhony.gutierrez@amd.com        // access to global memory
51111308Santhony.gutierrez@amd.com
51211308Santhony.gutierrez@amd.com        // update PageDivergence histogram
51311308Santhony.gutierrez@amd.com        int number_pages_touched = cu->pagesTouched.size();
51411308Santhony.gutierrez@amd.com        assert(number_pages_touched);
51511308Santhony.gutierrez@amd.com        cu->pageDivergenceDist.sample(number_pages_touched);
51611308Santhony.gutierrez@amd.com
51711308Santhony.gutierrez@amd.com        std::pair<ComputeUnit::pageDataStruct::iterator, bool> ret;
51811308Santhony.gutierrez@amd.com
51911308Santhony.gutierrez@amd.com        for (auto it : cu->pagesTouched) {
52011308Santhony.gutierrez@amd.com            // see if this page has been touched before. if not, this also
52111308Santhony.gutierrez@amd.com            // inserts the page into the table.
52211308Santhony.gutierrez@amd.com            ret = cu->pageAccesses
52311308Santhony.gutierrez@amd.com                .insert(ComputeUnit::pageDataStruct::value_type(it.first,
52411308Santhony.gutierrez@amd.com                        std::make_pair(1, it.second)));
52511308Santhony.gutierrez@amd.com
52611308Santhony.gutierrez@amd.com            // if yes, then update the stats
52711308Santhony.gutierrez@amd.com            if (!ret.second) {
52811308Santhony.gutierrez@amd.com                ret.first->second.first++;
52911308Santhony.gutierrez@amd.com                ret.first->second.second += it.second;
53011308Santhony.gutierrez@amd.com            }
53111308Santhony.gutierrez@amd.com        }
53211308Santhony.gutierrez@amd.com
53311308Santhony.gutierrez@amd.com        cu->pagesTouched.clear();
53411308Santhony.gutierrez@amd.com
53511308Santhony.gutierrez@amd.com        // total number of memory instructions (dynamic)
53611308Santhony.gutierrez@amd.com        // Atomics are counted as a single memory instruction.
53711308Santhony.gutierrez@amd.com        // this is # memory instructions per wavefronts, not per workitem
53811308Santhony.gutierrez@amd.com        cu->dynamicGMemInstrCnt++;
53911308Santhony.gutierrez@amd.com    }
54011308Santhony.gutierrez@amd.com}
541