wavefront.cc revision 11641
111308Santhony.gutierrez@amd.com/*
211308Santhony.gutierrez@amd.com * Copyright (c) 2011-2015 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 *
1711308Santhony.gutierrez@amd.com * 3. Neither the name of the copyright holder nor the names of its contributors
1811308Santhony.gutierrez@amd.com * may be used to endorse or promote products derived from this software
1911308Santhony.gutierrez@amd.com * 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 *
3311308Santhony.gutierrez@amd.com * Author: Lisa Hsu
3411308Santhony.gutierrez@amd.com */
3511308Santhony.gutierrez@amd.com
3611308Santhony.gutierrez@amd.com#include "gpu-compute/wavefront.hh"
3711308Santhony.gutierrez@amd.com
3811308Santhony.gutierrez@amd.com#include "debug/GPUExec.hh"
3911308Santhony.gutierrez@amd.com#include "debug/WavefrontStack.hh"
4011308Santhony.gutierrez@amd.com#include "gpu-compute/code_enums.hh"
4111308Santhony.gutierrez@amd.com#include "gpu-compute/compute_unit.hh"
4211308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_dyn_inst.hh"
4311308Santhony.gutierrez@amd.com#include "gpu-compute/shader.hh"
4411308Santhony.gutierrez@amd.com#include "gpu-compute/vector_register_file.hh"
4511308Santhony.gutierrez@amd.com
4611308Santhony.gutierrez@amd.comWavefront*
4711308Santhony.gutierrez@amd.comWavefrontParams::create()
4811308Santhony.gutierrez@amd.com{
4911308Santhony.gutierrez@amd.com    return new Wavefront(this);
5011308Santhony.gutierrez@amd.com}
5111308Santhony.gutierrez@amd.com
5211308Santhony.gutierrez@amd.comWavefront::Wavefront(const Params *p)
5311308Santhony.gutierrez@amd.com  : SimObject(p), callArgMem(nullptr)
5411308Santhony.gutierrez@amd.com{
5511639Salexandru.dutu@amd.com    lastTrace = 0;
5611308Santhony.gutierrez@amd.com    simdId = p->simdId;
5711308Santhony.gutierrez@amd.com    wfSlotId = p->wf_slot_id;
5811308Santhony.gutierrez@amd.com    status = S_STOPPED;
5911308Santhony.gutierrez@amd.com    reservedVectorRegs = 0;
6011308Santhony.gutierrez@amd.com    startVgprIndex = 0;
6111639Salexandru.dutu@amd.com    outstandingReqs = 0;
6211639Salexandru.dutu@amd.com    memReqsInPipe = 0;
6311639Salexandru.dutu@amd.com    outstandingReqsWrGm = 0;
6411639Salexandru.dutu@amd.com    outstandingReqsWrLm = 0;
6511639Salexandru.dutu@amd.com    outstandingReqsRdGm = 0;
6611639Salexandru.dutu@amd.com    outstandingReqsRdLm = 0;
6711639Salexandru.dutu@amd.com    rdLmReqsInPipe = 0;
6811639Salexandru.dutu@amd.com    rdGmReqsInPipe = 0;
6911639Salexandru.dutu@amd.com    wrLmReqsInPipe = 0;
7011639Salexandru.dutu@amd.com    wrGmReqsInPipe = 0;
7111308Santhony.gutierrez@amd.com
7211639Salexandru.dutu@amd.com    barrierCnt = 0;
7311639Salexandru.dutu@amd.com    oldBarrierCnt = 0;
7411308Santhony.gutierrez@amd.com    stalledAtBarrier = false;
7511308Santhony.gutierrez@amd.com
7611639Salexandru.dutu@amd.com    memTraceBusy = 0;
7711639Salexandru.dutu@amd.com    oldVgprTcnt = 0xffffffffffffffffll;
7811639Salexandru.dutu@amd.com    oldDgprTcnt = 0xffffffffffffffffll;
7911639Salexandru.dutu@amd.com    oldVgpr.resize(p->wfSize);
8011308Santhony.gutierrez@amd.com
8111308Santhony.gutierrez@amd.com    pendingFetch = false;
8211308Santhony.gutierrez@amd.com    dropFetch = false;
8311308Santhony.gutierrez@amd.com    condRegState = new ConditionRegisterState();
8411308Santhony.gutierrez@amd.com    maxSpVgprs = 0;
8511308Santhony.gutierrez@amd.com    maxDpVgprs = 0;
8611639Salexandru.dutu@amd.com    lastAddr.resize(p->wfSize);
8711639Salexandru.dutu@amd.com    workItemFlatId.resize(p->wfSize);
8811639Salexandru.dutu@amd.com    oldDgpr.resize(p->wfSize);
8911639Salexandru.dutu@amd.com    barCnt.resize(p->wfSize);
9011534Sjohn.kalamatianos@amd.com    for (int i = 0; i < 3; ++i) {
9111639Salexandru.dutu@amd.com        workItemId[i].resize(p->wfSize);
9211534Sjohn.kalamatianos@amd.com    }
9311308Santhony.gutierrez@amd.com}
9411308Santhony.gutierrez@amd.com
9511308Santhony.gutierrez@amd.comvoid
9611308Santhony.gutierrez@amd.comWavefront::regStats()
9711308Santhony.gutierrez@amd.com{
9811523Sdavid.guillen@arm.com    SimObject::regStats();
9911523Sdavid.guillen@arm.com
10011308Santhony.gutierrez@amd.com    srcRegOpDist
10111308Santhony.gutierrez@amd.com        .init(0, 4, 2)
10211308Santhony.gutierrez@amd.com        .name(name() + ".src_reg_operand_dist")
10311308Santhony.gutierrez@amd.com        .desc("number of executed instructions with N source register operands")
10411308Santhony.gutierrez@amd.com        ;
10511308Santhony.gutierrez@amd.com
10611308Santhony.gutierrez@amd.com    dstRegOpDist
10711308Santhony.gutierrez@amd.com        .init(0, 3, 2)
10811308Santhony.gutierrez@amd.com        .name(name() + ".dst_reg_operand_dist")
10911308Santhony.gutierrez@amd.com        .desc("number of executed instructions with N destination register "
11011308Santhony.gutierrez@amd.com              "operands")
11111308Santhony.gutierrez@amd.com        ;
11211308Santhony.gutierrez@amd.com
11311308Santhony.gutierrez@amd.com    // FIXME: the name of the WF needs to be unique
11411308Santhony.gutierrez@amd.com    numTimesBlockedDueWAXDependencies
11511308Santhony.gutierrez@amd.com        .name(name() + ".timesBlockedDueWAXDependencies")
11611308Santhony.gutierrez@amd.com        .desc("number of times the wf's instructions are blocked due to WAW "
11711308Santhony.gutierrez@amd.com              "or WAR dependencies")
11811308Santhony.gutierrez@amd.com        ;
11911308Santhony.gutierrez@amd.com
12011308Santhony.gutierrez@amd.com    // FIXME: the name of the WF needs to be unique
12111308Santhony.gutierrez@amd.com    numTimesBlockedDueRAWDependencies
12211308Santhony.gutierrez@amd.com        .name(name() + ".timesBlockedDueRAWDependencies")
12311308Santhony.gutierrez@amd.com        .desc("number of times the wf's instructions are blocked due to RAW "
12411308Santhony.gutierrez@amd.com              "dependencies")
12511308Santhony.gutierrez@amd.com        ;
12611308Santhony.gutierrez@amd.com
12711308Santhony.gutierrez@amd.com    // FIXME: the name of the WF needs to be unique
12811308Santhony.gutierrez@amd.com    numTimesBlockedDueVrfPortAvail
12911308Santhony.gutierrez@amd.com        .name(name() + ".timesBlockedDueVrfPortAvail")
13011308Santhony.gutierrez@amd.com        .desc("number of times instructions are blocked due to VRF port "
13111308Santhony.gutierrez@amd.com              "availability")
13211308Santhony.gutierrez@amd.com        ;
13311308Santhony.gutierrez@amd.com}
13411308Santhony.gutierrez@amd.com
13511308Santhony.gutierrez@amd.comvoid
13611308Santhony.gutierrez@amd.comWavefront::init()
13711308Santhony.gutierrez@amd.com{
13811308Santhony.gutierrez@amd.com    reservedVectorRegs = 0;
13911308Santhony.gutierrez@amd.com    startVgprIndex = 0;
14011308Santhony.gutierrez@amd.com}
14111308Santhony.gutierrez@amd.com
14211308Santhony.gutierrez@amd.comvoid
14311308Santhony.gutierrez@amd.comWavefront::resizeRegFiles(int num_cregs, int num_sregs, int num_dregs)
14411308Santhony.gutierrez@amd.com{
14511308Santhony.gutierrez@amd.com    condRegState->init(num_cregs);
14611308Santhony.gutierrez@amd.com    maxSpVgprs = num_sregs;
14711308Santhony.gutierrez@amd.com    maxDpVgprs = num_dregs;
14811308Santhony.gutierrez@amd.com}
14911308Santhony.gutierrez@amd.com
15011308Santhony.gutierrez@amd.comWavefront::~Wavefront()
15111308Santhony.gutierrez@amd.com{
15211308Santhony.gutierrez@amd.com    if (callArgMem)
15311308Santhony.gutierrez@amd.com        delete callArgMem;
15411534Sjohn.kalamatianos@amd.com    delete condRegState;
15511308Santhony.gutierrez@amd.com}
15611308Santhony.gutierrez@amd.com
15711308Santhony.gutierrez@amd.comvoid
15811640Salexandru.dutu@amd.comWavefront::start(uint64_t _wf_dyn_id,uint64_t _base_ptr)
15911308Santhony.gutierrez@amd.com{
16011640Salexandru.dutu@amd.com    wfDynId = _wf_dyn_id;
16111639Salexandru.dutu@amd.com    basePtr = _base_ptr;
16211308Santhony.gutierrez@amd.com    status = S_RUNNING;
16311308Santhony.gutierrez@amd.com}
16411308Santhony.gutierrez@amd.com
16511308Santhony.gutierrez@amd.combool
16611308Santhony.gutierrez@amd.comWavefront::isGmInstruction(GPUDynInstPtr ii)
16711308Santhony.gutierrez@amd.com{
16811308Santhony.gutierrez@amd.com    if (IS_OT_READ_PM(ii->opType()) || IS_OT_WRITE_PM(ii->opType()) ||
16911308Santhony.gutierrez@amd.com        IS_OT_ATOMIC_PM(ii->opType())) {
17011308Santhony.gutierrez@amd.com        return true;
17111308Santhony.gutierrez@amd.com    }
17211308Santhony.gutierrez@amd.com
17311308Santhony.gutierrez@amd.com    if (IS_OT_READ_GM(ii->opType()) || IS_OT_WRITE_GM(ii->opType()) ||
17411308Santhony.gutierrez@amd.com        IS_OT_ATOMIC_GM(ii->opType())) {
17511308Santhony.gutierrez@amd.com        return true;
17611308Santhony.gutierrez@amd.com    }
17711308Santhony.gutierrez@amd.com
17811308Santhony.gutierrez@amd.com    if (IS_OT_FLAT(ii->opType())) {
17911308Santhony.gutierrez@amd.com        return true;
18011308Santhony.gutierrez@amd.com    }
18111308Santhony.gutierrez@amd.com
18211308Santhony.gutierrez@amd.com    return false;
18311308Santhony.gutierrez@amd.com}
18411308Santhony.gutierrez@amd.com
18511308Santhony.gutierrez@amd.combool
18611308Santhony.gutierrez@amd.comWavefront::isLmInstruction(GPUDynInstPtr ii)
18711308Santhony.gutierrez@amd.com{
18811308Santhony.gutierrez@amd.com    if (IS_OT_READ_LM(ii->opType()) || IS_OT_WRITE_LM(ii->opType()) ||
18911308Santhony.gutierrez@amd.com        IS_OT_ATOMIC_LM(ii->opType())) {
19011308Santhony.gutierrez@amd.com        return true;
19111308Santhony.gutierrez@amd.com    }
19211308Santhony.gutierrez@amd.com
19311308Santhony.gutierrez@amd.com    return false;
19411308Santhony.gutierrez@amd.com}
19511308Santhony.gutierrez@amd.com
19611308Santhony.gutierrez@amd.combool
19711308Santhony.gutierrez@amd.comWavefront::isOldestInstALU()
19811308Santhony.gutierrez@amd.com{
19911308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
20011308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
20111308Santhony.gutierrez@amd.com
20211308Santhony.gutierrez@amd.com    if (status != S_STOPPED && (ii->opType() == Enums::OT_NOP ||
20311308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_RET || ii->opType() == Enums::OT_BRANCH ||
20411308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_ALU || IS_OT_LDAS(ii->opType()) ||
20511308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_KERN_READ)) {
20611308Santhony.gutierrez@amd.com        return true;
20711308Santhony.gutierrez@amd.com    }
20811308Santhony.gutierrez@amd.com
20911308Santhony.gutierrez@amd.com    return false;
21011308Santhony.gutierrez@amd.com}
21111308Santhony.gutierrez@amd.com
21211308Santhony.gutierrez@amd.combool
21311308Santhony.gutierrez@amd.comWavefront::isOldestInstBarrier()
21411308Santhony.gutierrez@amd.com{
21511308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
21611308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
21711308Santhony.gutierrez@amd.com
21811308Santhony.gutierrez@amd.com    if (status != S_STOPPED && ii->opType() == Enums::OT_BARRIER) {
21911308Santhony.gutierrez@amd.com        return true;
22011308Santhony.gutierrez@amd.com    }
22111308Santhony.gutierrez@amd.com
22211308Santhony.gutierrez@amd.com    return false;
22311308Santhony.gutierrez@amd.com}
22411308Santhony.gutierrez@amd.com
22511308Santhony.gutierrez@amd.combool
22611308Santhony.gutierrez@amd.comWavefront::isOldestInstGMem()
22711308Santhony.gutierrez@amd.com{
22811308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
22911308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
23011308Santhony.gutierrez@amd.com
23111308Santhony.gutierrez@amd.com    if (status != S_STOPPED && (IS_OT_READ_GM(ii->opType()) ||
23211308Santhony.gutierrez@amd.com        IS_OT_WRITE_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType()))) {
23311308Santhony.gutierrez@amd.com
23411308Santhony.gutierrez@amd.com        return true;
23511308Santhony.gutierrez@amd.com    }
23611308Santhony.gutierrez@amd.com
23711308Santhony.gutierrez@amd.com    return false;
23811308Santhony.gutierrez@amd.com}
23911308Santhony.gutierrez@amd.com
24011308Santhony.gutierrez@amd.combool
24111308Santhony.gutierrez@amd.comWavefront::isOldestInstLMem()
24211308Santhony.gutierrez@amd.com{
24311308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
24411308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
24511308Santhony.gutierrez@amd.com
24611308Santhony.gutierrez@amd.com    if (status != S_STOPPED && (IS_OT_READ_LM(ii->opType()) ||
24711308Santhony.gutierrez@amd.com        IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()))) {
24811308Santhony.gutierrez@amd.com
24911308Santhony.gutierrez@amd.com        return true;
25011308Santhony.gutierrez@amd.com    }
25111308Santhony.gutierrez@amd.com
25211308Santhony.gutierrez@amd.com    return false;
25311308Santhony.gutierrez@amd.com}
25411308Santhony.gutierrez@amd.com
25511308Santhony.gutierrez@amd.combool
25611308Santhony.gutierrez@amd.comWavefront::isOldestInstPrivMem()
25711308Santhony.gutierrez@amd.com{
25811308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
25911308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
26011308Santhony.gutierrez@amd.com
26111308Santhony.gutierrez@amd.com    if (status != S_STOPPED && (IS_OT_READ_PM(ii->opType()) ||
26211308Santhony.gutierrez@amd.com        IS_OT_WRITE_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType()))) {
26311308Santhony.gutierrez@amd.com
26411308Santhony.gutierrez@amd.com        return true;
26511308Santhony.gutierrez@amd.com    }
26611308Santhony.gutierrez@amd.com
26711308Santhony.gutierrez@amd.com    return false;
26811308Santhony.gutierrez@amd.com}
26911308Santhony.gutierrez@amd.com
27011308Santhony.gutierrez@amd.combool
27111308Santhony.gutierrez@amd.comWavefront::isOldestInstFlatMem()
27211308Santhony.gutierrez@amd.com{
27311308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
27411308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
27511308Santhony.gutierrez@amd.com
27611308Santhony.gutierrez@amd.com    if (status != S_STOPPED && IS_OT_FLAT(ii->opType())) {
27711308Santhony.gutierrez@amd.com
27811308Santhony.gutierrez@amd.com        return true;
27911308Santhony.gutierrez@amd.com    }
28011308Santhony.gutierrez@amd.com
28111308Santhony.gutierrez@amd.com    return false;
28211308Santhony.gutierrez@amd.com}
28311308Santhony.gutierrez@amd.com
28411308Santhony.gutierrez@amd.com// Return true if the Wavefront's instruction
28511308Santhony.gutierrez@amd.com// buffer has branch instruction.
28611308Santhony.gutierrez@amd.combool
28711308Santhony.gutierrez@amd.comWavefront::instructionBufferHasBranch()
28811308Santhony.gutierrez@amd.com{
28911308Santhony.gutierrez@amd.com    for (auto it : instructionBuffer) {
29011308Santhony.gutierrez@amd.com        GPUDynInstPtr ii = it;
29111308Santhony.gutierrez@amd.com
29211308Santhony.gutierrez@amd.com        if (ii->opType() == Enums::OT_RET || ii->opType() == Enums::OT_BRANCH) {
29311308Santhony.gutierrez@amd.com            return true;
29411308Santhony.gutierrez@amd.com        }
29511308Santhony.gutierrez@amd.com    }
29611308Santhony.gutierrez@amd.com
29711308Santhony.gutierrez@amd.com    return false;
29811308Santhony.gutierrez@amd.com}
29911308Santhony.gutierrez@amd.com
30011308Santhony.gutierrez@amd.com// Remap HSAIL register to physical VGPR.
30111308Santhony.gutierrez@amd.com// HSAIL register = virtual register assigned to an operand by HLC compiler
30211308Santhony.gutierrez@amd.comuint32_t
30311308Santhony.gutierrez@amd.comWavefront::remap(uint32_t vgprIndex, uint32_t size, uint8_t mode)
30411308Santhony.gutierrez@amd.com{
30511308Santhony.gutierrez@amd.com    assert((vgprIndex < reservedVectorRegs) && (reservedVectorRegs > 0));
30611308Santhony.gutierrez@amd.com    // add the offset from where the VGPRs of the wavefront have been assigned
30711308Santhony.gutierrez@amd.com    uint32_t physicalVgprIndex = startVgprIndex + vgprIndex;
30811308Santhony.gutierrez@amd.com    // HSAIL double precision (DP) register: calculate the physical VGPR index
30911308Santhony.gutierrez@amd.com    // assuming that DP registers are placed after SP ones in the VRF. The DP
31011308Santhony.gutierrez@amd.com    // and SP VGPR name spaces in HSAIL mode are separate so we need to adjust
31111308Santhony.gutierrez@amd.com    // the DP VGPR index before mapping it to the physical VRF address space
31211308Santhony.gutierrez@amd.com    if (mode == 1 && size > 4) {
31311308Santhony.gutierrez@amd.com        physicalVgprIndex = startVgprIndex + maxSpVgprs + (2 * vgprIndex);
31411308Santhony.gutierrez@amd.com    }
31511308Santhony.gutierrez@amd.com
31611308Santhony.gutierrez@amd.com    assert((startVgprIndex <= physicalVgprIndex) &&
31711308Santhony.gutierrez@amd.com           (startVgprIndex + reservedVectorRegs - 1) >= physicalVgprIndex);
31811308Santhony.gutierrez@amd.com
31911308Santhony.gutierrez@amd.com    // calculate absolute physical VGPR index
32011308Santhony.gutierrez@amd.com    return physicalVgprIndex % computeUnit->vrf[simdId]->numRegs();
32111308Santhony.gutierrez@amd.com}
32211308Santhony.gutierrez@amd.com
32311308Santhony.gutierrez@amd.com// Return true if this wavefront is ready
32411308Santhony.gutierrez@amd.com// to execute an instruction of the specified type.
32511308Santhony.gutierrez@amd.comint
32611308Santhony.gutierrez@amd.comWavefront::ready(itype_e type)
32711308Santhony.gutierrez@amd.com{
32811308Santhony.gutierrez@amd.com    // Check to make sure wave is running
32911308Santhony.gutierrez@amd.com    if (status == S_STOPPED || status == S_RETURNING ||
33011308Santhony.gutierrez@amd.com        instructionBuffer.empty()) {
33111308Santhony.gutierrez@amd.com        return 0;
33211308Santhony.gutierrez@amd.com    }
33311308Santhony.gutierrez@amd.com
33411308Santhony.gutierrez@amd.com    // Is the wave waiting at a barrier
33511308Santhony.gutierrez@amd.com    if (stalledAtBarrier) {
33611639Salexandru.dutu@amd.com        if (!computeUnit->AllAtBarrier(barrierId,barrierCnt,
33711639Salexandru.dutu@amd.com                        computeUnit->getRefCounter(dispatchId, wgId))) {
33811308Santhony.gutierrez@amd.com            // Are all threads at barrier?
33911308Santhony.gutierrez@amd.com            return 0;
34011308Santhony.gutierrez@amd.com        }
34111639Salexandru.dutu@amd.com        oldBarrierCnt = barrierCnt;
34211308Santhony.gutierrez@amd.com        stalledAtBarrier = false;
34311308Santhony.gutierrez@amd.com    }
34411308Santhony.gutierrez@amd.com
34511308Santhony.gutierrez@amd.com    // Read instruction
34611308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
34711308Santhony.gutierrez@amd.com
34811308Santhony.gutierrez@amd.com    bool ready_inst M5_VAR_USED = false;
34911308Santhony.gutierrez@amd.com    bool glbMemBusRdy = false;
35011308Santhony.gutierrez@amd.com    bool glbMemIssueRdy = false;
35111308Santhony.gutierrez@amd.com    if (type == I_GLOBAL || type == I_FLAT || type == I_PRIVATE) {
35211308Santhony.gutierrez@amd.com        for (int j=0; j < computeUnit->numGlbMemUnits; ++j) {
35311308Santhony.gutierrez@amd.com            if (computeUnit->vrfToGlobalMemPipeBus[j].prerdy())
35411308Santhony.gutierrez@amd.com                glbMemBusRdy = true;
35511308Santhony.gutierrez@amd.com            if (computeUnit->wfWait[j].prerdy())
35611308Santhony.gutierrez@amd.com                glbMemIssueRdy = true;
35711308Santhony.gutierrez@amd.com        }
35811308Santhony.gutierrez@amd.com    }
35911308Santhony.gutierrez@amd.com    bool locMemBusRdy = false;
36011308Santhony.gutierrez@amd.com    bool locMemIssueRdy = false;
36111345Sjohn.kalamatianos@amd.com    if (type == I_SHARED || type == I_FLAT) {
36211308Santhony.gutierrez@amd.com        for (int j=0; j < computeUnit->numLocMemUnits; ++j) {
36311308Santhony.gutierrez@amd.com            if (computeUnit->vrfToLocalMemPipeBus[j].prerdy())
36411308Santhony.gutierrez@amd.com                locMemBusRdy = true;
36511308Santhony.gutierrez@amd.com            if (computeUnit->wfWait[j].prerdy())
36611308Santhony.gutierrez@amd.com                locMemIssueRdy = true;
36711308Santhony.gutierrez@amd.com        }
36811308Santhony.gutierrez@amd.com    }
36911308Santhony.gutierrez@amd.com
37011308Santhony.gutierrez@amd.com    // The following code is very error prone and the entire process for
37111308Santhony.gutierrez@amd.com    // checking readiness will be fixed eventually.  In the meantime, let's
37211308Santhony.gutierrez@amd.com    // make sure that we do not silently let an instruction type slip
37311308Santhony.gutierrez@amd.com    // through this logic and always return not ready.
37411308Santhony.gutierrez@amd.com    if (!(ii->opType() == Enums::OT_BARRIER || ii->opType() == Enums::OT_NOP ||
37511308Santhony.gutierrez@amd.com          ii->opType() == Enums::OT_RET || ii->opType() == Enums::OT_BRANCH ||
37611308Santhony.gutierrez@amd.com          ii->opType() == Enums::OT_ALU || IS_OT_LDAS(ii->opType()) ||
37711308Santhony.gutierrez@amd.com          ii->opType() == Enums::OT_KERN_READ ||
37811308Santhony.gutierrez@amd.com          ii->opType() == Enums::OT_ARG ||
37911308Santhony.gutierrez@amd.com          IS_OT_READ_GM(ii->opType()) || IS_OT_WRITE_GM(ii->opType()) ||
38011308Santhony.gutierrez@amd.com          IS_OT_ATOMIC_GM(ii->opType()) || IS_OT_READ_LM(ii->opType()) ||
38111308Santhony.gutierrez@amd.com          IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()) ||
38211308Santhony.gutierrez@amd.com          IS_OT_READ_PM(ii->opType()) || IS_OT_WRITE_PM(ii->opType()) ||
38311308Santhony.gutierrez@amd.com          IS_OT_ATOMIC_PM(ii->opType()) || IS_OT_FLAT(ii->opType()))) {
38411308Santhony.gutierrez@amd.com        panic("next instruction: %s is of unknown type\n", ii->disassemble());
38511308Santhony.gutierrez@amd.com    }
38611308Santhony.gutierrez@amd.com
38711308Santhony.gutierrez@amd.com    DPRINTF(GPUExec, "CU%d: WF[%d][%d]: Checking Read for Inst : %s\n",
38811308Santhony.gutierrez@amd.com            computeUnit->cu_id, simdId, wfSlotId, ii->disassemble());
38911308Santhony.gutierrez@amd.com
39011308Santhony.gutierrez@amd.com    if (type == I_ALU && ii->opType() == Enums::OT_BARRIER) {
39111308Santhony.gutierrez@amd.com        // Here for ALU instruction (barrier)
39211308Santhony.gutierrez@amd.com        if (!computeUnit->wfWait[simdId].prerdy()) {
39311308Santhony.gutierrez@amd.com            // Is wave slot free?
39411308Santhony.gutierrez@amd.com            return 0;
39511308Santhony.gutierrez@amd.com        }
39611308Santhony.gutierrez@amd.com
39711308Santhony.gutierrez@amd.com        // Are there in pipe or outstanding memory requests?
39811639Salexandru.dutu@amd.com        if ((outstandingReqs + memReqsInPipe) > 0) {
39911308Santhony.gutierrez@amd.com            return 0;
40011308Santhony.gutierrez@amd.com        }
40111308Santhony.gutierrez@amd.com
40211308Santhony.gutierrez@amd.com        ready_inst = true;
40311308Santhony.gutierrez@amd.com    } else if (type == I_ALU && ii->opType() == Enums::OT_NOP) {
40411308Santhony.gutierrez@amd.com        // Here for ALU instruction (nop)
40511308Santhony.gutierrez@amd.com        if (!computeUnit->wfWait[simdId].prerdy()) {
40611308Santhony.gutierrez@amd.com            // Is wave slot free?
40711308Santhony.gutierrez@amd.com            return 0;
40811308Santhony.gutierrez@amd.com        }
40911308Santhony.gutierrez@amd.com
41011308Santhony.gutierrez@amd.com        ready_inst = true;
41111308Santhony.gutierrez@amd.com    } else if (type == I_ALU && ii->opType() == Enums::OT_RET) {
41211308Santhony.gutierrez@amd.com        // Here for ALU instruction (return)
41311308Santhony.gutierrez@amd.com        if (!computeUnit->wfWait[simdId].prerdy()) {
41411308Santhony.gutierrez@amd.com            // Is wave slot free?
41511308Santhony.gutierrez@amd.com            return 0;
41611308Santhony.gutierrez@amd.com        }
41711308Santhony.gutierrez@amd.com
41811308Santhony.gutierrez@amd.com        // Are there in pipe or outstanding memory requests?
41911639Salexandru.dutu@amd.com        if ((outstandingReqs + memReqsInPipe) > 0) {
42011308Santhony.gutierrez@amd.com            return 0;
42111308Santhony.gutierrez@amd.com        }
42211308Santhony.gutierrez@amd.com
42311308Santhony.gutierrez@amd.com        ready_inst = true;
42411308Santhony.gutierrez@amd.com    } else if (type == I_ALU && (ii->opType() == Enums::OT_BRANCH ||
42511308Santhony.gutierrez@amd.com               ii->opType() == Enums::OT_ALU || IS_OT_LDAS(ii->opType()) ||
42611308Santhony.gutierrez@amd.com               ii->opType() == Enums::OT_KERN_READ ||
42711308Santhony.gutierrez@amd.com               ii->opType() == Enums::OT_ARG)) {
42811308Santhony.gutierrez@amd.com        // Here for ALU instruction (all others)
42911308Santhony.gutierrez@amd.com        if (!computeUnit->wfWait[simdId].prerdy()) {
43011308Santhony.gutierrez@amd.com            // Is alu slot free?
43111308Santhony.gutierrez@amd.com            return 0;
43211308Santhony.gutierrez@amd.com        }
43311308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
43411308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
43511308Santhony.gutierrez@amd.com            return 0;
43611308Santhony.gutierrez@amd.com        }
43711308Santhony.gutierrez@amd.com
43811308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
43911308Santhony.gutierrez@amd.com            return 0;
44011308Santhony.gutierrez@amd.com        }
44111308Santhony.gutierrez@amd.com        ready_inst = true;
44211308Santhony.gutierrez@amd.com    } else if (type == I_GLOBAL && (IS_OT_READ_GM(ii->opType()) ||
44311308Santhony.gutierrez@amd.com               IS_OT_WRITE_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType()))) {
44411308Santhony.gutierrez@amd.com        // Here Global memory instruction
44511308Santhony.gutierrez@amd.com        if (IS_OT_READ_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType())) {
44611308Santhony.gutierrez@amd.com            // Are there in pipe or outstanding global memory write requests?
44711639Salexandru.dutu@amd.com            if ((outstandingReqsWrGm + wrGmReqsInPipe) > 0) {
44811308Santhony.gutierrez@amd.com                return 0;
44911308Santhony.gutierrez@amd.com            }
45011308Santhony.gutierrez@amd.com        }
45111308Santhony.gutierrez@amd.com
45211308Santhony.gutierrez@amd.com        if (IS_OT_WRITE_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType()) ||
45311308Santhony.gutierrez@amd.com            IS_OT_HIST_GM(ii->opType())) {
45411308Santhony.gutierrez@amd.com            // Are there in pipe or outstanding global memory read requests?
45511639Salexandru.dutu@amd.com            if ((outstandingReqsRdGm + rdGmReqsInPipe) > 0)
45611308Santhony.gutierrez@amd.com                return 0;
45711308Santhony.gutierrez@amd.com        }
45811308Santhony.gutierrez@amd.com
45911308Santhony.gutierrez@amd.com        if (!glbMemIssueRdy) {
46011308Santhony.gutierrez@amd.com            // Is WV issue slot free?
46111308Santhony.gutierrez@amd.com            return 0;
46211308Santhony.gutierrez@amd.com        }
46311308Santhony.gutierrez@amd.com
46411308Santhony.gutierrez@amd.com        if (!glbMemBusRdy) {
46511308Santhony.gutierrez@amd.com            // Is there an available VRF->Global memory read bus?
46611308Santhony.gutierrez@amd.com            return 0;
46711308Santhony.gutierrez@amd.com        }
46811308Santhony.gutierrez@amd.com
46911308Santhony.gutierrez@amd.com        if (!computeUnit->globalMemoryPipe.
47011639Salexandru.dutu@amd.com            isGMReqFIFOWrRdy(rdGmReqsInPipe + wrGmReqsInPipe)) {
47111308Santhony.gutierrez@amd.com            // Can we insert a new request to the Global Mem Request FIFO?
47211308Santhony.gutierrez@amd.com            return 0;
47311308Santhony.gutierrez@amd.com        }
47411308Santhony.gutierrez@amd.com        // can we schedule source & destination operands on the VRF?
47511308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
47611308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
47711308Santhony.gutierrez@amd.com            return 0;
47811308Santhony.gutierrez@amd.com        }
47911308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
48011308Santhony.gutierrez@amd.com            return 0;
48111308Santhony.gutierrez@amd.com        }
48211308Santhony.gutierrez@amd.com        ready_inst = true;
48311308Santhony.gutierrez@amd.com    } else if (type == I_SHARED && (IS_OT_READ_LM(ii->opType()) ||
48411308Santhony.gutierrez@amd.com               IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()))) {
48511308Santhony.gutierrez@amd.com        // Here for Shared memory instruction
48611308Santhony.gutierrez@amd.com        if (IS_OT_READ_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType())) {
48711639Salexandru.dutu@amd.com            if ((outstandingReqsWrLm + wrLmReqsInPipe) > 0) {
48811308Santhony.gutierrez@amd.com                return 0;
48911308Santhony.gutierrez@amd.com            }
49011308Santhony.gutierrez@amd.com        }
49111308Santhony.gutierrez@amd.com
49211308Santhony.gutierrez@amd.com        if (IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()) ||
49311308Santhony.gutierrez@amd.com            IS_OT_HIST_LM(ii->opType())) {
49411639Salexandru.dutu@amd.com            if ((outstandingReqsRdLm + rdLmReqsInPipe) > 0) {
49511308Santhony.gutierrez@amd.com                return 0;
49611308Santhony.gutierrez@amd.com            }
49711308Santhony.gutierrez@amd.com        }
49811308Santhony.gutierrez@amd.com
49911308Santhony.gutierrez@amd.com        if (!locMemBusRdy) {
50011308Santhony.gutierrez@amd.com            // Is there an available VRF->LDS read bus?
50111308Santhony.gutierrez@amd.com            return 0;
50211308Santhony.gutierrez@amd.com        }
50311308Santhony.gutierrez@amd.com        if (!locMemIssueRdy) {
50411308Santhony.gutierrez@amd.com            // Is wave slot free?
50511308Santhony.gutierrez@amd.com            return 0;
50611308Santhony.gutierrez@amd.com        }
50711308Santhony.gutierrez@amd.com
50811308Santhony.gutierrez@amd.com        if (!computeUnit->localMemoryPipe.
50911639Salexandru.dutu@amd.com            isLMReqFIFOWrRdy(rdLmReqsInPipe + wrLmReqsInPipe)) {
51011308Santhony.gutierrez@amd.com            // Can we insert a new request to the LDS Request FIFO?
51111308Santhony.gutierrez@amd.com            return 0;
51211308Santhony.gutierrez@amd.com        }
51311308Santhony.gutierrez@amd.com        // can we schedule source & destination operands on the VRF?
51411308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
51511308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
51611308Santhony.gutierrez@amd.com            return 0;
51711308Santhony.gutierrez@amd.com        }
51811308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
51911308Santhony.gutierrez@amd.com            return 0;
52011308Santhony.gutierrez@amd.com        }
52111308Santhony.gutierrez@amd.com        ready_inst = true;
52211308Santhony.gutierrez@amd.com    } else if (type == I_PRIVATE && (IS_OT_READ_PM(ii->opType()) ||
52311308Santhony.gutierrez@amd.com               IS_OT_WRITE_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType()))) {
52411308Santhony.gutierrez@amd.com        // Here for Private memory instruction ------------------------    //
52511308Santhony.gutierrez@amd.com        if (IS_OT_READ_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType())) {
52611639Salexandru.dutu@amd.com            if ((outstandingReqsWrGm + wrGmReqsInPipe) > 0) {
52711308Santhony.gutierrez@amd.com                return 0;
52811308Santhony.gutierrez@amd.com            }
52911308Santhony.gutierrez@amd.com        }
53011308Santhony.gutierrez@amd.com
53111308Santhony.gutierrez@amd.com        if (IS_OT_WRITE_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType()) ||
53211308Santhony.gutierrez@amd.com            IS_OT_HIST_PM(ii->opType())) {
53311639Salexandru.dutu@amd.com            if ((outstandingReqsRdGm + rdGmReqsInPipe) > 0) {
53411308Santhony.gutierrez@amd.com                return 0;
53511308Santhony.gutierrez@amd.com            }
53611308Santhony.gutierrez@amd.com        }
53711308Santhony.gutierrez@amd.com
53811308Santhony.gutierrez@amd.com        if (!glbMemBusRdy) {
53911308Santhony.gutierrez@amd.com            // Is there an available VRF->Global memory read bus?
54011308Santhony.gutierrez@amd.com            return 0;
54111308Santhony.gutierrez@amd.com        }
54211308Santhony.gutierrez@amd.com
54311308Santhony.gutierrez@amd.com        if (!glbMemIssueRdy) {
54411308Santhony.gutierrez@amd.com             // Is wave slot free?
54511308Santhony.gutierrez@amd.com            return 0;
54611308Santhony.gutierrez@amd.com        }
54711308Santhony.gutierrez@amd.com
54811308Santhony.gutierrez@amd.com        if (!computeUnit->globalMemoryPipe.
54911639Salexandru.dutu@amd.com            isGMReqFIFOWrRdy(rdGmReqsInPipe + wrGmReqsInPipe)) {
55011308Santhony.gutierrez@amd.com            // Can we insert a new request to the Global Mem Request FIFO?
55111308Santhony.gutierrez@amd.com            return 0;
55211308Santhony.gutierrez@amd.com        }
55311308Santhony.gutierrez@amd.com        // can we schedule source & destination operands on the VRF?
55411308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
55511308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
55611308Santhony.gutierrez@amd.com            return 0;
55711308Santhony.gutierrez@amd.com        }
55811308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
55911308Santhony.gutierrez@amd.com            return 0;
56011308Santhony.gutierrez@amd.com        }
56111308Santhony.gutierrez@amd.com        ready_inst = true;
56211308Santhony.gutierrez@amd.com    } else if (type == I_FLAT && IS_OT_FLAT(ii->opType())) {
56311308Santhony.gutierrez@amd.com        if (!glbMemBusRdy) {
56411308Santhony.gutierrez@amd.com            // Is there an available VRF->Global memory read bus?
56511308Santhony.gutierrez@amd.com            return 0;
56611308Santhony.gutierrez@amd.com        }
56711308Santhony.gutierrez@amd.com
56811308Santhony.gutierrez@amd.com        if (!locMemBusRdy) {
56911308Santhony.gutierrez@amd.com            // Is there an available VRF->LDS read bus?
57011308Santhony.gutierrez@amd.com            return 0;
57111308Santhony.gutierrez@amd.com        }
57211308Santhony.gutierrez@amd.com
57311308Santhony.gutierrez@amd.com        if (!glbMemIssueRdy) {
57411308Santhony.gutierrez@amd.com            // Is wave slot free?
57511308Santhony.gutierrez@amd.com            return 0;
57611308Santhony.gutierrez@amd.com        }
57711308Santhony.gutierrez@amd.com
57811308Santhony.gutierrez@amd.com        if (!locMemIssueRdy) {
57911308Santhony.gutierrez@amd.com            return 0;
58011308Santhony.gutierrez@amd.com        }
58111308Santhony.gutierrez@amd.com        if (!computeUnit->globalMemoryPipe.
58211639Salexandru.dutu@amd.com            isGMReqFIFOWrRdy(rdGmReqsInPipe + wrGmReqsInPipe)) {
58311308Santhony.gutierrez@amd.com            // Can we insert a new request to the Global Mem Request FIFO?
58411308Santhony.gutierrez@amd.com            return 0;
58511308Santhony.gutierrez@amd.com        }
58611308Santhony.gutierrez@amd.com
58711308Santhony.gutierrez@amd.com        if (!computeUnit->localMemoryPipe.
58811639Salexandru.dutu@amd.com            isLMReqFIFOWrRdy(rdLmReqsInPipe + wrLmReqsInPipe)) {
58911308Santhony.gutierrez@amd.com            // Can we insert a new request to the LDS Request FIFO?
59011308Santhony.gutierrez@amd.com            return 0;
59111308Santhony.gutierrez@amd.com        }
59211308Santhony.gutierrez@amd.com        // can we schedule source & destination operands on the VRF?
59311308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
59411308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
59511308Santhony.gutierrez@amd.com            return 0;
59611308Santhony.gutierrez@amd.com        }
59711308Santhony.gutierrez@amd.com        // are all the operands ready? (RAW, WAW and WAR depedencies met?)
59811308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
59911308Santhony.gutierrez@amd.com            return 0;
60011308Santhony.gutierrez@amd.com        }
60111308Santhony.gutierrez@amd.com        ready_inst = true;
60211308Santhony.gutierrez@amd.com    } else {
60311308Santhony.gutierrez@amd.com        return 0;
60411308Santhony.gutierrez@amd.com    }
60511308Santhony.gutierrez@amd.com
60611308Santhony.gutierrez@amd.com    assert(ready_inst);
60711308Santhony.gutierrez@amd.com
60811308Santhony.gutierrez@amd.com    DPRINTF(GPUExec, "CU%d: WF[%d][%d]: Ready Inst : %s\n", computeUnit->cu_id,
60911308Santhony.gutierrez@amd.com            simdId, wfSlotId, ii->disassemble());
61011308Santhony.gutierrez@amd.com    return 1;
61111308Santhony.gutierrez@amd.com}
61211308Santhony.gutierrez@amd.com
61311308Santhony.gutierrez@amd.comvoid
61411308Santhony.gutierrez@amd.comWavefront::updateResources()
61511308Santhony.gutierrez@amd.com{
61611308Santhony.gutierrez@amd.com    // Get current instruction
61711308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
61811308Santhony.gutierrez@amd.com    assert(ii);
61911308Santhony.gutierrez@amd.com    computeUnit->vrf[simdId]->updateResources(this, ii);
62011308Santhony.gutierrez@amd.com    // Single precision ALU or Branch or Return or Special instruction
62111308Santhony.gutierrez@amd.com    if (ii->opType() == Enums::OT_ALU || ii->opType() == Enums::OT_SPECIAL ||
62211308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_BRANCH || IS_OT_LDAS(ii->opType()) ||
62311308Santhony.gutierrez@amd.com        // FIXME: Kernel argument loads are currently treated as ALU operations
62411308Santhony.gutierrez@amd.com        // since we don't send memory packets at execution. If we fix that then
62511308Santhony.gutierrez@amd.com        // we should map them to one of the memory pipelines
62611308Santhony.gutierrez@amd.com        ii->opType()==Enums::OT_KERN_READ ||
62711308Santhony.gutierrez@amd.com        ii->opType()==Enums::OT_ARG ||
62811308Santhony.gutierrez@amd.com        ii->opType()==Enums::OT_RET) {
62911308Santhony.gutierrez@amd.com        computeUnit->aluPipe[simdId].preset(computeUnit->shader->
63011308Santhony.gutierrez@amd.com                                            ticks(computeUnit->spBypassLength()));
63111308Santhony.gutierrez@amd.com        // this is to enforce a fixed number of cycles per issue slot per SIMD
63211308Santhony.gutierrez@amd.com        computeUnit->wfWait[simdId].preset(computeUnit->shader->
63311308Santhony.gutierrez@amd.com                                           ticks(computeUnit->issuePeriod));
63411308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_BARRIER) {
63511308Santhony.gutierrez@amd.com        computeUnit->wfWait[simdId].preset(computeUnit->shader->
63611308Santhony.gutierrez@amd.com                                           ticks(computeUnit->issuePeriod));
63711308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_FLAT_READ) {
63811308Santhony.gutierrez@amd.com        assert(Enums::SC_NONE != ii->executedAs());
63911639Salexandru.dutu@amd.com        memReqsInPipe++;
64011639Salexandru.dutu@amd.com        rdGmReqsInPipe++;
64111308Santhony.gutierrez@amd.com        if ( Enums::SC_SHARED == ii->executedAs() ) {
64211308Santhony.gutierrez@amd.com            computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
64311308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(4));
64411308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->ShrMemUnitId()].
64511308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
64611308Santhony.gutierrez@amd.com        } else {
64711308Santhony.gutierrez@amd.com            computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
64811308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(4));
64911308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->GlbMemUnitId()].
65011308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
65111308Santhony.gutierrez@amd.com        }
65211308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_FLAT_WRITE) {
65311308Santhony.gutierrez@amd.com        assert(Enums::SC_NONE != ii->executedAs());
65411639Salexandru.dutu@amd.com        memReqsInPipe++;
65511639Salexandru.dutu@amd.com        wrGmReqsInPipe++;
65611308Santhony.gutierrez@amd.com        if (Enums::SC_SHARED == ii->executedAs()) {
65711308Santhony.gutierrez@amd.com            computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
65811308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(8));
65911308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->ShrMemUnitId()].
66011308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
66111308Santhony.gutierrez@amd.com        } else {
66211308Santhony.gutierrez@amd.com            computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
66311308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(8));
66411308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->GlbMemUnitId()].
66511308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
66611308Santhony.gutierrez@amd.com        }
66711308Santhony.gutierrez@amd.com    } else if (IS_OT_READ_GM(ii->opType())) {
66811639Salexandru.dutu@amd.com        memReqsInPipe++;
66911639Salexandru.dutu@amd.com        rdGmReqsInPipe++;
67011308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
67111308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(4));
67211308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
67311308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
67411308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_GM(ii->opType())) {
67511639Salexandru.dutu@amd.com        memReqsInPipe++;
67611639Salexandru.dutu@amd.com        wrGmReqsInPipe++;
67711308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
67811308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
67911308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
68011308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
68111308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_GM(ii->opType())) {
68211639Salexandru.dutu@amd.com        memReqsInPipe++;
68311639Salexandru.dutu@amd.com        wrGmReqsInPipe++;
68411639Salexandru.dutu@amd.com        rdGmReqsInPipe++;
68511308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
68611308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
68711308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
68811308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
68911308Santhony.gutierrez@amd.com    } else if (IS_OT_READ_LM(ii->opType())) {
69011639Salexandru.dutu@amd.com        memReqsInPipe++;
69111639Salexandru.dutu@amd.com        rdLmReqsInPipe++;
69211308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
69311308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(4));
69411308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
69511308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
69611308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_LM(ii->opType())) {
69711639Salexandru.dutu@amd.com        memReqsInPipe++;
69811639Salexandru.dutu@amd.com        wrLmReqsInPipe++;
69911308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
70011308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
70111308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
70211308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
70311308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_LM(ii->opType())) {
70411639Salexandru.dutu@amd.com        memReqsInPipe++;
70511639Salexandru.dutu@amd.com        wrLmReqsInPipe++;
70611639Salexandru.dutu@amd.com        rdLmReqsInPipe++;
70711308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
70811308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
70911308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
71011308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
71111308Santhony.gutierrez@amd.com    } else if (IS_OT_READ_PM(ii->opType())) {
71211639Salexandru.dutu@amd.com        memReqsInPipe++;
71311639Salexandru.dutu@amd.com        rdGmReqsInPipe++;
71411308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
71511308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(4));
71611308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
71711308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
71811308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_PM(ii->opType())) {
71911639Salexandru.dutu@amd.com        memReqsInPipe++;
72011639Salexandru.dutu@amd.com        wrGmReqsInPipe++;
72111308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
72211308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
72311308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
72411308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
72511308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_PM(ii->opType())) {
72611639Salexandru.dutu@amd.com        memReqsInPipe++;
72711639Salexandru.dutu@amd.com        wrGmReqsInPipe++;
72811639Salexandru.dutu@amd.com        rdGmReqsInPipe++;
72911308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
73011308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
73111308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
73211308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
73311308Santhony.gutierrez@amd.com    }
73411308Santhony.gutierrez@amd.com}
73511308Santhony.gutierrez@amd.com
73611308Santhony.gutierrez@amd.comvoid
73711308Santhony.gutierrez@amd.comWavefront::exec()
73811308Santhony.gutierrez@amd.com{
73911308Santhony.gutierrez@amd.com    // ---- Exit if wavefront is inactive ----------------------------- //
74011308Santhony.gutierrez@amd.com
74111308Santhony.gutierrez@amd.com    if (status == S_STOPPED || status == S_RETURNING ||
74211308Santhony.gutierrez@amd.com        instructionBuffer.empty()) {
74311308Santhony.gutierrez@amd.com        return;
74411308Santhony.gutierrez@amd.com    }
74511308Santhony.gutierrez@amd.com
74611308Santhony.gutierrez@amd.com    // Get current instruction
74711308Santhony.gutierrez@amd.com
74811308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
74911308Santhony.gutierrez@amd.com
75011308Santhony.gutierrez@amd.com    const uint32_t old_pc = pc();
75111308Santhony.gutierrez@amd.com    DPRINTF(GPUExec, "CU%d: WF[%d][%d]: wave[%d] Executing inst: %s "
75211308Santhony.gutierrez@amd.com            "(pc: %i)\n", computeUnit->cu_id, simdId, wfSlotId, wfDynId,
75311308Santhony.gutierrez@amd.com            ii->disassemble(), old_pc);
75411308Santhony.gutierrez@amd.com    ii->execute();
75511308Santhony.gutierrez@amd.com    // access the VRF
75611308Santhony.gutierrez@amd.com    computeUnit->vrf[simdId]->exec(ii, this);
75711308Santhony.gutierrez@amd.com    srcRegOpDist.sample(ii->numSrcRegOperands());
75811308Santhony.gutierrez@amd.com    dstRegOpDist.sample(ii->numDstRegOperands());
75911308Santhony.gutierrez@amd.com    computeUnit->numInstrExecuted++;
76011308Santhony.gutierrez@amd.com    computeUnit->execRateDist.sample(computeUnit->totalCycles.value() -
76111308Santhony.gutierrez@amd.com                                     computeUnit->lastExecCycle[simdId]);
76211308Santhony.gutierrez@amd.com    computeUnit->lastExecCycle[simdId] = computeUnit->totalCycles.value();
76311308Santhony.gutierrez@amd.com    if (pc() == old_pc) {
76411308Santhony.gutierrez@amd.com        uint32_t new_pc = old_pc + 1;
76511308Santhony.gutierrez@amd.com        // PC not modified by instruction, proceed to next or pop frame
76611308Santhony.gutierrez@amd.com        pc(new_pc);
76711308Santhony.gutierrez@amd.com        if (new_pc == rpc()) {
76811308Santhony.gutierrez@amd.com            popFromReconvergenceStack();
76911308Santhony.gutierrez@amd.com            discardFetch();
77011308Santhony.gutierrez@amd.com        } else {
77111308Santhony.gutierrez@amd.com            instructionBuffer.pop_front();
77211308Santhony.gutierrez@amd.com        }
77311308Santhony.gutierrez@amd.com    }
77411308Santhony.gutierrez@amd.com
77511308Santhony.gutierrez@amd.com    if (computeUnit->shader->hsail_mode==Shader::SIMT) {
77611308Santhony.gutierrez@amd.com        const int num_active_lanes = execMask().count();
77711308Santhony.gutierrez@amd.com        computeUnit->controlFlowDivergenceDist.sample(num_active_lanes);
77811308Santhony.gutierrez@amd.com        computeUnit->numVecOpsExecuted += num_active_lanes;
77911308Santhony.gutierrez@amd.com        if (isGmInstruction(ii)) {
78011308Santhony.gutierrez@amd.com            computeUnit->activeLanesPerGMemInstrDist.sample(num_active_lanes);
78111308Santhony.gutierrez@amd.com        } else if (isLmInstruction(ii)) {
78211308Santhony.gutierrez@amd.com            computeUnit->activeLanesPerLMemInstrDist.sample(num_active_lanes);
78311308Santhony.gutierrez@amd.com        }
78411308Santhony.gutierrez@amd.com    }
78511308Santhony.gutierrez@amd.com
78611308Santhony.gutierrez@amd.com    // ---- Update Vector ALU pipeline and other resources ------------------ //
78711308Santhony.gutierrez@amd.com    // Single precision ALU or Branch or Return or Special instruction
78811308Santhony.gutierrez@amd.com    if (ii->opType() == Enums::OT_ALU || ii->opType() == Enums::OT_SPECIAL ||
78911308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_BRANCH || IS_OT_LDAS(ii->opType()) ||
79011308Santhony.gutierrez@amd.com        // FIXME: Kernel argument loads are currently treated as ALU operations
79111308Santhony.gutierrez@amd.com        // since we don't send memory packets at execution. If we fix that then
79211308Santhony.gutierrez@amd.com        // we should map them to one of the memory pipelines
79311308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_KERN_READ ||
79411308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_ARG ||
79511308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_RET) {
79611308Santhony.gutierrez@amd.com        computeUnit->aluPipe[simdId].set(computeUnit->shader->
79711308Santhony.gutierrez@amd.com                                         ticks(computeUnit->spBypassLength()));
79811308Santhony.gutierrez@amd.com
79911308Santhony.gutierrez@amd.com        // this is to enforce a fixed number of cycles per issue slot per SIMD
80011308Santhony.gutierrez@amd.com        computeUnit->wfWait[simdId].set(computeUnit->shader->
80111308Santhony.gutierrez@amd.com                                        ticks(computeUnit->issuePeriod));
80211308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_BARRIER) {
80311308Santhony.gutierrez@amd.com        computeUnit->wfWait[simdId].set(computeUnit->shader->
80411308Santhony.gutierrez@amd.com                                        ticks(computeUnit->issuePeriod));
80511308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_FLAT_READ) {
80611308Santhony.gutierrez@amd.com        assert(Enums::SC_NONE != ii->executedAs());
80711308Santhony.gutierrez@amd.com
80811308Santhony.gutierrez@amd.com        if (Enums::SC_SHARED == ii->executedAs()) {
80911308Santhony.gutierrez@amd.com            computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
81011308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(4));
81111308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->ShrMemUnitId()].
81211308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(computeUnit->issuePeriod));
81311308Santhony.gutierrez@amd.com        } else {
81411308Santhony.gutierrez@amd.com            computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
81511308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(4));
81611308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->GlbMemUnitId()].
81711308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(computeUnit->issuePeriod));
81811308Santhony.gutierrez@amd.com        }
81911308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_FLAT_WRITE) {
82011308Santhony.gutierrez@amd.com        assert(Enums::SC_NONE != ii->executedAs());
82111308Santhony.gutierrez@amd.com        if (Enums::SC_SHARED == ii->executedAs()) {
82211308Santhony.gutierrez@amd.com            computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
82311308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(8));
82411308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->ShrMemUnitId()].
82511308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(computeUnit->issuePeriod));
82611308Santhony.gutierrez@amd.com        } else {
82711308Santhony.gutierrez@amd.com            computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
82811308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(8));
82911308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->GlbMemUnitId()].
83011308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(computeUnit->issuePeriod));
83111308Santhony.gutierrez@amd.com        }
83211308Santhony.gutierrez@amd.com    } else if (IS_OT_READ_GM(ii->opType())) {
83311308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
83411308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(4));
83511308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
83611308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
83711308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_GM(ii->opType())) {
83811308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
83911308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(8));
84011308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
84111308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
84211308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_GM(ii->opType())) {
84311308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
84411308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(8));
84511308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
84611308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
84711308Santhony.gutierrez@amd.com    } else if (IS_OT_READ_LM(ii->opType())) {
84811308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
84911308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(4));
85011308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
85111308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
85211308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_LM(ii->opType())) {
85311308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
85411308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(8));
85511308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
85611308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
85711308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_LM(ii->opType())) {
85811308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
85911308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(8));
86011308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
86111308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
86211308Santhony.gutierrez@amd.com    }
86311308Santhony.gutierrez@amd.com}
86411308Santhony.gutierrez@amd.com
86511308Santhony.gutierrez@amd.combool
86611308Santhony.gutierrez@amd.comWavefront::waitingAtBarrier(int lane)
86711308Santhony.gutierrez@amd.com{
86811639Salexandru.dutu@amd.com    return barCnt[lane] < maxBarCnt;
86911308Santhony.gutierrez@amd.com}
87011308Santhony.gutierrez@amd.com
87111308Santhony.gutierrez@amd.comvoid
87211308Santhony.gutierrez@amd.comWavefront::pushToReconvergenceStack(uint32_t pc, uint32_t rpc,
87311308Santhony.gutierrez@amd.com                                    const VectorMask& mask)
87411308Santhony.gutierrez@amd.com{
87511308Santhony.gutierrez@amd.com    assert(mask.count());
87611641Salexandru.dutu@amd.com    reconvergenceStack.emplace_back(new ReconvergenceStackEntry{pc, rpc, mask});
87711308Santhony.gutierrez@amd.com}
87811308Santhony.gutierrez@amd.com
87911308Santhony.gutierrez@amd.comvoid
88011308Santhony.gutierrez@amd.comWavefront::popFromReconvergenceStack()
88111308Santhony.gutierrez@amd.com{
88211308Santhony.gutierrez@amd.com    assert(!reconvergenceStack.empty());
88311308Santhony.gutierrez@amd.com
88411308Santhony.gutierrez@amd.com    DPRINTF(WavefrontStack, "[%2d, %2d, %2d, %2d] %s %3i => ",
88511308Santhony.gutierrez@amd.com            computeUnit->cu_id, simdId, wfSlotId, wfDynId,
88611308Santhony.gutierrez@amd.com            execMask().to_string<char, std::string::traits_type,
88711308Santhony.gutierrez@amd.com            std::string::allocator_type>().c_str(), pc());
88811308Santhony.gutierrez@amd.com
88911641Salexandru.dutu@amd.com    reconvergenceStack.pop_back();
89011308Santhony.gutierrez@amd.com
89111308Santhony.gutierrez@amd.com    DPRINTF(WavefrontStack, "%3i %s\n", pc(),
89211308Santhony.gutierrez@amd.com            execMask().to_string<char, std::string::traits_type,
89311308Santhony.gutierrez@amd.com            std::string::allocator_type>().c_str());
89411308Santhony.gutierrez@amd.com
89511308Santhony.gutierrez@amd.com}
89611308Santhony.gutierrez@amd.com
89711308Santhony.gutierrez@amd.comvoid
89811308Santhony.gutierrez@amd.comWavefront::discardFetch()
89911308Santhony.gutierrez@amd.com{
90011308Santhony.gutierrez@amd.com    instructionBuffer.clear();
90111308Santhony.gutierrez@amd.com    dropFetch |=pendingFetch;
90211308Santhony.gutierrez@amd.com}
90311308Santhony.gutierrez@amd.com
90411308Santhony.gutierrez@amd.comuint32_t
90511308Santhony.gutierrez@amd.comWavefront::pc() const
90611308Santhony.gutierrez@amd.com{
90711641Salexandru.dutu@amd.com    return reconvergenceStack.back()->pc;
90811308Santhony.gutierrez@amd.com}
90911308Santhony.gutierrez@amd.com
91011308Santhony.gutierrez@amd.comuint32_t
91111308Santhony.gutierrez@amd.comWavefront::rpc() const
91211308Santhony.gutierrez@amd.com{
91311641Salexandru.dutu@amd.com    return reconvergenceStack.back()->rpc;
91411308Santhony.gutierrez@amd.com}
91511308Santhony.gutierrez@amd.com
91611308Santhony.gutierrez@amd.comVectorMask
91711308Santhony.gutierrez@amd.comWavefront::execMask() const
91811308Santhony.gutierrez@amd.com{
91911641Salexandru.dutu@amd.com    return reconvergenceStack.back()->execMask;
92011308Santhony.gutierrez@amd.com}
92111308Santhony.gutierrez@amd.com
92211308Santhony.gutierrez@amd.combool
92311308Santhony.gutierrez@amd.comWavefront::execMask(int lane) const
92411308Santhony.gutierrez@amd.com{
92511641Salexandru.dutu@amd.com    return reconvergenceStack.back()->execMask[lane];
92611308Santhony.gutierrez@amd.com}
92711308Santhony.gutierrez@amd.com
92811308Santhony.gutierrez@amd.com
92911308Santhony.gutierrez@amd.comvoid
93011308Santhony.gutierrez@amd.comWavefront::pc(uint32_t new_pc)
93111308Santhony.gutierrez@amd.com{
93211641Salexandru.dutu@amd.com    reconvergenceStack.back()->pc = new_pc;
93311308Santhony.gutierrez@amd.com}
93411640Salexandru.dutu@amd.com
93511640Salexandru.dutu@amd.comuint32_t
93611640Salexandru.dutu@amd.comWavefront::getStaticContextSize() const
93711640Salexandru.dutu@amd.com{
93811640Salexandru.dutu@amd.com    return barCnt.size() * sizeof(int) + sizeof(dynWaveId) + sizeof(maxBarCnt) +
93911640Salexandru.dutu@amd.com           sizeof(oldBarrierCnt) + sizeof(barrierCnt) + sizeof(wgId) +
94011640Salexandru.dutu@amd.com           sizeof(computeUnit->cu_id) + sizeof(barrierId) + sizeof(initMask) +
94111640Salexandru.dutu@amd.com           sizeof(privBase) + sizeof(spillBase) + sizeof(ldsChunk) +
94211640Salexandru.dutu@amd.com           computeUnit->wfSize() * sizeof(ReconvergenceStackEntry);
94311640Salexandru.dutu@amd.com}
944