wavefront.cc revision 11345
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{
5511308Santhony.gutierrez@amd.com    last_trace = 0;
5611308Santhony.gutierrez@amd.com    simdId = p->simdId;
5711308Santhony.gutierrez@amd.com    wfSlotId = p->wf_slot_id;
5811308Santhony.gutierrez@amd.com
5911308Santhony.gutierrez@amd.com    status = S_STOPPED;
6011308Santhony.gutierrez@amd.com    reservedVectorRegs = 0;
6111308Santhony.gutierrez@amd.com    startVgprIndex = 0;
6211308Santhony.gutierrez@amd.com    outstanding_reqs = 0;
6311308Santhony.gutierrez@amd.com    mem_reqs_in_pipe = 0;
6411308Santhony.gutierrez@amd.com    outstanding_reqs_wr_gm = 0;
6511308Santhony.gutierrez@amd.com    outstanding_reqs_wr_lm = 0;
6611308Santhony.gutierrez@amd.com    outstanding_reqs_rd_gm = 0;
6711308Santhony.gutierrez@amd.com    outstanding_reqs_rd_lm = 0;
6811308Santhony.gutierrez@amd.com    rd_lm_reqs_in_pipe = 0;
6911308Santhony.gutierrez@amd.com    rd_gm_reqs_in_pipe = 0;
7011308Santhony.gutierrez@amd.com    wr_lm_reqs_in_pipe = 0;
7111308Santhony.gutierrez@amd.com    wr_gm_reqs_in_pipe = 0;
7211308Santhony.gutierrez@amd.com
7311308Santhony.gutierrez@amd.com    barrier_cnt = 0;
7411308Santhony.gutierrez@amd.com    old_barrier_cnt = 0;
7511308Santhony.gutierrez@amd.com    stalledAtBarrier = false;
7611308Santhony.gutierrez@amd.com
7711308Santhony.gutierrez@amd.com    mem_trace_busy = 0;
7811308Santhony.gutierrez@amd.com    old_vgpr_tcnt = 0xffffffffffffffffll;
7911308Santhony.gutierrez@amd.com    old_dgpr_tcnt = 0xffffffffffffffffll;
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;
8611308Santhony.gutierrez@amd.com}
8711308Santhony.gutierrez@amd.com
8811308Santhony.gutierrez@amd.comvoid
8911308Santhony.gutierrez@amd.comWavefront::regStats()
9011308Santhony.gutierrez@amd.com{
9111308Santhony.gutierrez@amd.com    srcRegOpDist
9211308Santhony.gutierrez@amd.com        .init(0, 4, 2)
9311308Santhony.gutierrez@amd.com        .name(name() + ".src_reg_operand_dist")
9411308Santhony.gutierrez@amd.com        .desc("number of executed instructions with N source register operands")
9511308Santhony.gutierrez@amd.com        ;
9611308Santhony.gutierrez@amd.com
9711308Santhony.gutierrez@amd.com    dstRegOpDist
9811308Santhony.gutierrez@amd.com        .init(0, 3, 2)
9911308Santhony.gutierrez@amd.com        .name(name() + ".dst_reg_operand_dist")
10011308Santhony.gutierrez@amd.com        .desc("number of executed instructions with N destination register "
10111308Santhony.gutierrez@amd.com              "operands")
10211308Santhony.gutierrez@amd.com        ;
10311308Santhony.gutierrez@amd.com
10411308Santhony.gutierrez@amd.com    // FIXME: the name of the WF needs to be unique
10511308Santhony.gutierrez@amd.com    numTimesBlockedDueWAXDependencies
10611308Santhony.gutierrez@amd.com        .name(name() + ".timesBlockedDueWAXDependencies")
10711308Santhony.gutierrez@amd.com        .desc("number of times the wf's instructions are blocked due to WAW "
10811308Santhony.gutierrez@amd.com              "or WAR dependencies")
10911308Santhony.gutierrez@amd.com        ;
11011308Santhony.gutierrez@amd.com
11111308Santhony.gutierrez@amd.com    // FIXME: the name of the WF needs to be unique
11211308Santhony.gutierrez@amd.com    numTimesBlockedDueRAWDependencies
11311308Santhony.gutierrez@amd.com        .name(name() + ".timesBlockedDueRAWDependencies")
11411308Santhony.gutierrez@amd.com        .desc("number of times the wf's instructions are blocked due to RAW "
11511308Santhony.gutierrez@amd.com              "dependencies")
11611308Santhony.gutierrez@amd.com        ;
11711308Santhony.gutierrez@amd.com
11811308Santhony.gutierrez@amd.com    // FIXME: the name of the WF needs to be unique
11911308Santhony.gutierrez@amd.com    numTimesBlockedDueVrfPortAvail
12011308Santhony.gutierrez@amd.com        .name(name() + ".timesBlockedDueVrfPortAvail")
12111308Santhony.gutierrez@amd.com        .desc("number of times instructions are blocked due to VRF port "
12211308Santhony.gutierrez@amd.com              "availability")
12311308Santhony.gutierrez@amd.com        ;
12411308Santhony.gutierrez@amd.com}
12511308Santhony.gutierrez@amd.com
12611308Santhony.gutierrez@amd.comvoid
12711308Santhony.gutierrez@amd.comWavefront::init()
12811308Santhony.gutierrez@amd.com{
12911308Santhony.gutierrez@amd.com    reservedVectorRegs = 0;
13011308Santhony.gutierrez@amd.com    startVgprIndex = 0;
13111308Santhony.gutierrez@amd.com}
13211308Santhony.gutierrez@amd.com
13311308Santhony.gutierrez@amd.comvoid
13411308Santhony.gutierrez@amd.comWavefront::resizeRegFiles(int num_cregs, int num_sregs, int num_dregs)
13511308Santhony.gutierrez@amd.com{
13611308Santhony.gutierrez@amd.com    condRegState->init(num_cregs);
13711308Santhony.gutierrez@amd.com    maxSpVgprs = num_sregs;
13811308Santhony.gutierrez@amd.com    maxDpVgprs = num_dregs;
13911308Santhony.gutierrez@amd.com}
14011308Santhony.gutierrez@amd.com
14111308Santhony.gutierrez@amd.comWavefront::~Wavefront()
14211308Santhony.gutierrez@amd.com{
14311308Santhony.gutierrez@amd.com    if (callArgMem)
14411308Santhony.gutierrez@amd.com        delete callArgMem;
14511308Santhony.gutierrez@amd.com}
14611308Santhony.gutierrez@amd.com
14711308Santhony.gutierrez@amd.comvoid
14811308Santhony.gutierrez@amd.comWavefront::start(uint64_t _wfDynId,uint64_t _base_ptr)
14911308Santhony.gutierrez@amd.com{
15011308Santhony.gutierrez@amd.com    wfDynId = _wfDynId;
15111308Santhony.gutierrez@amd.com    base_ptr = _base_ptr;
15211308Santhony.gutierrez@amd.com    status = S_RUNNING;
15311308Santhony.gutierrez@amd.com}
15411308Santhony.gutierrez@amd.com
15511308Santhony.gutierrez@amd.combool
15611308Santhony.gutierrez@amd.comWavefront::isGmInstruction(GPUDynInstPtr ii)
15711308Santhony.gutierrez@amd.com{
15811308Santhony.gutierrez@amd.com    if (IS_OT_READ_PM(ii->opType()) || IS_OT_WRITE_PM(ii->opType()) ||
15911308Santhony.gutierrez@amd.com        IS_OT_ATOMIC_PM(ii->opType())) {
16011308Santhony.gutierrez@amd.com        return true;
16111308Santhony.gutierrez@amd.com    }
16211308Santhony.gutierrez@amd.com
16311308Santhony.gutierrez@amd.com    if (IS_OT_READ_GM(ii->opType()) || IS_OT_WRITE_GM(ii->opType()) ||
16411308Santhony.gutierrez@amd.com        IS_OT_ATOMIC_GM(ii->opType())) {
16511308Santhony.gutierrez@amd.com        return true;
16611308Santhony.gutierrez@amd.com    }
16711308Santhony.gutierrez@amd.com
16811308Santhony.gutierrez@amd.com    if (IS_OT_FLAT(ii->opType())) {
16911308Santhony.gutierrez@amd.com        return true;
17011308Santhony.gutierrez@amd.com    }
17111308Santhony.gutierrez@amd.com
17211308Santhony.gutierrez@amd.com    return false;
17311308Santhony.gutierrez@amd.com}
17411308Santhony.gutierrez@amd.com
17511308Santhony.gutierrez@amd.combool
17611308Santhony.gutierrez@amd.comWavefront::isLmInstruction(GPUDynInstPtr ii)
17711308Santhony.gutierrez@amd.com{
17811308Santhony.gutierrez@amd.com    if (IS_OT_READ_LM(ii->opType()) || IS_OT_WRITE_LM(ii->opType()) ||
17911308Santhony.gutierrez@amd.com        IS_OT_ATOMIC_LM(ii->opType())) {
18011308Santhony.gutierrez@amd.com        return true;
18111308Santhony.gutierrez@amd.com    }
18211308Santhony.gutierrez@amd.com
18311308Santhony.gutierrez@amd.com    return false;
18411308Santhony.gutierrez@amd.com}
18511308Santhony.gutierrez@amd.com
18611308Santhony.gutierrez@amd.combool
18711308Santhony.gutierrez@amd.comWavefront::isOldestInstALU()
18811308Santhony.gutierrez@amd.com{
18911308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
19011308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
19111308Santhony.gutierrez@amd.com
19211308Santhony.gutierrez@amd.com    if (status != S_STOPPED && (ii->opType() == Enums::OT_NOP ||
19311308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_RET || ii->opType() == Enums::OT_BRANCH ||
19411308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_ALU || IS_OT_LDAS(ii->opType()) ||
19511308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_KERN_READ)) {
19611308Santhony.gutierrez@amd.com        return true;
19711308Santhony.gutierrez@amd.com    }
19811308Santhony.gutierrez@amd.com
19911308Santhony.gutierrez@amd.com    return false;
20011308Santhony.gutierrez@amd.com}
20111308Santhony.gutierrez@amd.com
20211308Santhony.gutierrez@amd.combool
20311308Santhony.gutierrez@amd.comWavefront::isOldestInstBarrier()
20411308Santhony.gutierrez@amd.com{
20511308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
20611308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
20711308Santhony.gutierrez@amd.com
20811308Santhony.gutierrez@amd.com    if (status != S_STOPPED && ii->opType() == Enums::OT_BARRIER) {
20911308Santhony.gutierrez@amd.com        return true;
21011308Santhony.gutierrez@amd.com    }
21111308Santhony.gutierrez@amd.com
21211308Santhony.gutierrez@amd.com    return false;
21311308Santhony.gutierrez@amd.com}
21411308Santhony.gutierrez@amd.com
21511308Santhony.gutierrez@amd.combool
21611308Santhony.gutierrez@amd.comWavefront::isOldestInstGMem()
21711308Santhony.gutierrez@amd.com{
21811308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
21911308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
22011308Santhony.gutierrez@amd.com
22111308Santhony.gutierrez@amd.com    if (status != S_STOPPED && (IS_OT_READ_GM(ii->opType()) ||
22211308Santhony.gutierrez@amd.com        IS_OT_WRITE_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType()))) {
22311308Santhony.gutierrez@amd.com
22411308Santhony.gutierrez@amd.com        return true;
22511308Santhony.gutierrez@amd.com    }
22611308Santhony.gutierrez@amd.com
22711308Santhony.gutierrez@amd.com    return false;
22811308Santhony.gutierrez@amd.com}
22911308Santhony.gutierrez@amd.com
23011308Santhony.gutierrez@amd.combool
23111308Santhony.gutierrez@amd.comWavefront::isOldestInstLMem()
23211308Santhony.gutierrez@amd.com{
23311308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
23411308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
23511308Santhony.gutierrez@amd.com
23611308Santhony.gutierrez@amd.com    if (status != S_STOPPED && (IS_OT_READ_LM(ii->opType()) ||
23711308Santhony.gutierrez@amd.com        IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()))) {
23811308Santhony.gutierrez@amd.com
23911308Santhony.gutierrez@amd.com        return true;
24011308Santhony.gutierrez@amd.com    }
24111308Santhony.gutierrez@amd.com
24211308Santhony.gutierrez@amd.com    return false;
24311308Santhony.gutierrez@amd.com}
24411308Santhony.gutierrez@amd.com
24511308Santhony.gutierrez@amd.combool
24611308Santhony.gutierrez@amd.comWavefront::isOldestInstPrivMem()
24711308Santhony.gutierrez@amd.com{
24811308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
24911308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
25011308Santhony.gutierrez@amd.com
25111308Santhony.gutierrez@amd.com    if (status != S_STOPPED && (IS_OT_READ_PM(ii->opType()) ||
25211308Santhony.gutierrez@amd.com        IS_OT_WRITE_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType()))) {
25311308Santhony.gutierrez@amd.com
25411308Santhony.gutierrez@amd.com        return true;
25511308Santhony.gutierrez@amd.com    }
25611308Santhony.gutierrez@amd.com
25711308Santhony.gutierrez@amd.com    return false;
25811308Santhony.gutierrez@amd.com}
25911308Santhony.gutierrez@amd.com
26011308Santhony.gutierrez@amd.combool
26111308Santhony.gutierrez@amd.comWavefront::isOldestInstFlatMem()
26211308Santhony.gutierrez@amd.com{
26311308Santhony.gutierrez@amd.com    assert(!instructionBuffer.empty());
26411308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
26511308Santhony.gutierrez@amd.com
26611308Santhony.gutierrez@amd.com    if (status != S_STOPPED && IS_OT_FLAT(ii->opType())) {
26711308Santhony.gutierrez@amd.com
26811308Santhony.gutierrez@amd.com        return true;
26911308Santhony.gutierrez@amd.com    }
27011308Santhony.gutierrez@amd.com
27111308Santhony.gutierrez@amd.com    return false;
27211308Santhony.gutierrez@amd.com}
27311308Santhony.gutierrez@amd.com
27411308Santhony.gutierrez@amd.com// Return true if the Wavefront's instruction
27511308Santhony.gutierrez@amd.com// buffer has branch instruction.
27611308Santhony.gutierrez@amd.combool
27711308Santhony.gutierrez@amd.comWavefront::instructionBufferHasBranch()
27811308Santhony.gutierrez@amd.com{
27911308Santhony.gutierrez@amd.com    for (auto it : instructionBuffer) {
28011308Santhony.gutierrez@amd.com        GPUDynInstPtr ii = it;
28111308Santhony.gutierrez@amd.com
28211308Santhony.gutierrez@amd.com        if (ii->opType() == Enums::OT_RET || ii->opType() == Enums::OT_BRANCH) {
28311308Santhony.gutierrez@amd.com            return true;
28411308Santhony.gutierrez@amd.com        }
28511308Santhony.gutierrez@amd.com    }
28611308Santhony.gutierrez@amd.com
28711308Santhony.gutierrez@amd.com    return false;
28811308Santhony.gutierrez@amd.com}
28911308Santhony.gutierrez@amd.com
29011308Santhony.gutierrez@amd.com// Remap HSAIL register to physical VGPR.
29111308Santhony.gutierrez@amd.com// HSAIL register = virtual register assigned to an operand by HLC compiler
29211308Santhony.gutierrez@amd.comuint32_t
29311308Santhony.gutierrez@amd.comWavefront::remap(uint32_t vgprIndex, uint32_t size, uint8_t mode)
29411308Santhony.gutierrez@amd.com{
29511308Santhony.gutierrez@amd.com    assert((vgprIndex < reservedVectorRegs) && (reservedVectorRegs > 0));
29611308Santhony.gutierrez@amd.com    // add the offset from where the VGPRs of the wavefront have been assigned
29711308Santhony.gutierrez@amd.com    uint32_t physicalVgprIndex = startVgprIndex + vgprIndex;
29811308Santhony.gutierrez@amd.com    // HSAIL double precision (DP) register: calculate the physical VGPR index
29911308Santhony.gutierrez@amd.com    // assuming that DP registers are placed after SP ones in the VRF. The DP
30011308Santhony.gutierrez@amd.com    // and SP VGPR name spaces in HSAIL mode are separate so we need to adjust
30111308Santhony.gutierrez@amd.com    // the DP VGPR index before mapping it to the physical VRF address space
30211308Santhony.gutierrez@amd.com    if (mode == 1 && size > 4) {
30311308Santhony.gutierrez@amd.com        physicalVgprIndex = startVgprIndex + maxSpVgprs + (2 * vgprIndex);
30411308Santhony.gutierrez@amd.com    }
30511308Santhony.gutierrez@amd.com
30611308Santhony.gutierrez@amd.com    assert((startVgprIndex <= physicalVgprIndex) &&
30711308Santhony.gutierrez@amd.com           (startVgprIndex + reservedVectorRegs - 1) >= physicalVgprIndex);
30811308Santhony.gutierrez@amd.com
30911308Santhony.gutierrez@amd.com    // calculate absolute physical VGPR index
31011308Santhony.gutierrez@amd.com    return physicalVgprIndex % computeUnit->vrf[simdId]->numRegs();
31111308Santhony.gutierrez@amd.com}
31211308Santhony.gutierrez@amd.com
31311308Santhony.gutierrez@amd.com// Return true if this wavefront is ready
31411308Santhony.gutierrez@amd.com// to execute an instruction of the specified type.
31511308Santhony.gutierrez@amd.comint
31611308Santhony.gutierrez@amd.comWavefront::ready(itype_e type)
31711308Santhony.gutierrez@amd.com{
31811308Santhony.gutierrez@amd.com    // Check to make sure wave is running
31911308Santhony.gutierrez@amd.com    if (status == S_STOPPED || status == S_RETURNING ||
32011308Santhony.gutierrez@amd.com        instructionBuffer.empty()) {
32111308Santhony.gutierrez@amd.com        return 0;
32211308Santhony.gutierrez@amd.com    }
32311308Santhony.gutierrez@amd.com
32411308Santhony.gutierrez@amd.com    // Is the wave waiting at a barrier
32511308Santhony.gutierrez@amd.com    if (stalledAtBarrier) {
32611308Santhony.gutierrez@amd.com        if (!computeUnit->AllAtBarrier(barrier_id,barrier_cnt,
32711308Santhony.gutierrez@amd.com                        computeUnit->getRefCounter(dispatchid, wg_id))) {
32811308Santhony.gutierrez@amd.com            // Are all threads at barrier?
32911308Santhony.gutierrez@amd.com            return 0;
33011308Santhony.gutierrez@amd.com        }
33111308Santhony.gutierrez@amd.com        old_barrier_cnt = barrier_cnt;
33211308Santhony.gutierrez@amd.com        stalledAtBarrier = false;
33311308Santhony.gutierrez@amd.com    }
33411308Santhony.gutierrez@amd.com
33511308Santhony.gutierrez@amd.com    // Read instruction
33611308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
33711308Santhony.gutierrez@amd.com
33811308Santhony.gutierrez@amd.com    bool ready_inst M5_VAR_USED = false;
33911308Santhony.gutierrez@amd.com    bool glbMemBusRdy = false;
34011308Santhony.gutierrez@amd.com    bool glbMemIssueRdy = false;
34111308Santhony.gutierrez@amd.com    if (type == I_GLOBAL || type == I_FLAT || type == I_PRIVATE) {
34211308Santhony.gutierrez@amd.com        for (int j=0; j < computeUnit->numGlbMemUnits; ++j) {
34311308Santhony.gutierrez@amd.com            if (computeUnit->vrfToGlobalMemPipeBus[j].prerdy())
34411308Santhony.gutierrez@amd.com                glbMemBusRdy = true;
34511308Santhony.gutierrez@amd.com            if (computeUnit->wfWait[j].prerdy())
34611308Santhony.gutierrez@amd.com                glbMemIssueRdy = true;
34711308Santhony.gutierrez@amd.com        }
34811308Santhony.gutierrez@amd.com    }
34911308Santhony.gutierrez@amd.com    bool locMemBusRdy = false;
35011308Santhony.gutierrez@amd.com    bool locMemIssueRdy = false;
35111345Sjohn.kalamatianos@amd.com    if (type == I_SHARED || type == I_FLAT) {
35211308Santhony.gutierrez@amd.com        for (int j=0; j < computeUnit->numLocMemUnits; ++j) {
35311308Santhony.gutierrez@amd.com            if (computeUnit->vrfToLocalMemPipeBus[j].prerdy())
35411308Santhony.gutierrez@amd.com                locMemBusRdy = true;
35511308Santhony.gutierrez@amd.com            if (computeUnit->wfWait[j].prerdy())
35611308Santhony.gutierrez@amd.com                locMemIssueRdy = true;
35711308Santhony.gutierrez@amd.com        }
35811308Santhony.gutierrez@amd.com    }
35911308Santhony.gutierrez@amd.com
36011308Santhony.gutierrez@amd.com    // The following code is very error prone and the entire process for
36111308Santhony.gutierrez@amd.com    // checking readiness will be fixed eventually.  In the meantime, let's
36211308Santhony.gutierrez@amd.com    // make sure that we do not silently let an instruction type slip
36311308Santhony.gutierrez@amd.com    // through this logic and always return not ready.
36411308Santhony.gutierrez@amd.com    if (!(ii->opType() == Enums::OT_BARRIER || ii->opType() == Enums::OT_NOP ||
36511308Santhony.gutierrez@amd.com          ii->opType() == Enums::OT_RET || ii->opType() == Enums::OT_BRANCH ||
36611308Santhony.gutierrez@amd.com          ii->opType() == Enums::OT_ALU || IS_OT_LDAS(ii->opType()) ||
36711308Santhony.gutierrez@amd.com          ii->opType() == Enums::OT_KERN_READ ||
36811308Santhony.gutierrez@amd.com          ii->opType() == Enums::OT_ARG ||
36911308Santhony.gutierrez@amd.com          IS_OT_READ_GM(ii->opType()) || IS_OT_WRITE_GM(ii->opType()) ||
37011308Santhony.gutierrez@amd.com          IS_OT_ATOMIC_GM(ii->opType()) || IS_OT_READ_LM(ii->opType()) ||
37111308Santhony.gutierrez@amd.com          IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()) ||
37211308Santhony.gutierrez@amd.com          IS_OT_READ_PM(ii->opType()) || IS_OT_WRITE_PM(ii->opType()) ||
37311308Santhony.gutierrez@amd.com          IS_OT_ATOMIC_PM(ii->opType()) || IS_OT_FLAT(ii->opType()))) {
37411308Santhony.gutierrez@amd.com        panic("next instruction: %s is of unknown type\n", ii->disassemble());
37511308Santhony.gutierrez@amd.com    }
37611308Santhony.gutierrez@amd.com
37711308Santhony.gutierrez@amd.com    DPRINTF(GPUExec, "CU%d: WF[%d][%d]: Checking Read for Inst : %s\n",
37811308Santhony.gutierrez@amd.com            computeUnit->cu_id, simdId, wfSlotId, ii->disassemble());
37911308Santhony.gutierrez@amd.com
38011308Santhony.gutierrez@amd.com    if (type == I_ALU && ii->opType() == Enums::OT_BARRIER) {
38111308Santhony.gutierrez@amd.com        // Here for ALU instruction (barrier)
38211308Santhony.gutierrez@amd.com        if (!computeUnit->wfWait[simdId].prerdy()) {
38311308Santhony.gutierrez@amd.com            // Is wave slot free?
38411308Santhony.gutierrez@amd.com            return 0;
38511308Santhony.gutierrez@amd.com        }
38611308Santhony.gutierrez@amd.com
38711308Santhony.gutierrez@amd.com        // Are there in pipe or outstanding memory requests?
38811308Santhony.gutierrez@amd.com        if ((outstanding_reqs + mem_reqs_in_pipe) > 0) {
38911308Santhony.gutierrez@amd.com            return 0;
39011308Santhony.gutierrez@amd.com        }
39111308Santhony.gutierrez@amd.com
39211308Santhony.gutierrez@amd.com        ready_inst = true;
39311308Santhony.gutierrez@amd.com    } else if (type == I_ALU && ii->opType() == Enums::OT_NOP) {
39411308Santhony.gutierrez@amd.com        // Here for ALU instruction (nop)
39511308Santhony.gutierrez@amd.com        if (!computeUnit->wfWait[simdId].prerdy()) {
39611308Santhony.gutierrez@amd.com            // Is wave slot free?
39711308Santhony.gutierrez@amd.com            return 0;
39811308Santhony.gutierrez@amd.com        }
39911308Santhony.gutierrez@amd.com
40011308Santhony.gutierrez@amd.com        ready_inst = true;
40111308Santhony.gutierrez@amd.com    } else if (type == I_ALU && ii->opType() == Enums::OT_RET) {
40211308Santhony.gutierrez@amd.com        // Here for ALU instruction (return)
40311308Santhony.gutierrez@amd.com        if (!computeUnit->wfWait[simdId].prerdy()) {
40411308Santhony.gutierrez@amd.com            // Is wave slot free?
40511308Santhony.gutierrez@amd.com            return 0;
40611308Santhony.gutierrez@amd.com        }
40711308Santhony.gutierrez@amd.com
40811308Santhony.gutierrez@amd.com        // Are there in pipe or outstanding memory requests?
40911308Santhony.gutierrez@amd.com        if ((outstanding_reqs + mem_reqs_in_pipe) > 0) {
41011308Santhony.gutierrez@amd.com            return 0;
41111308Santhony.gutierrez@amd.com        }
41211308Santhony.gutierrez@amd.com
41311308Santhony.gutierrez@amd.com        ready_inst = true;
41411308Santhony.gutierrez@amd.com    } else if (type == I_ALU && (ii->opType() == Enums::OT_BRANCH ||
41511308Santhony.gutierrez@amd.com               ii->opType() == Enums::OT_ALU || IS_OT_LDAS(ii->opType()) ||
41611308Santhony.gutierrez@amd.com               ii->opType() == Enums::OT_KERN_READ ||
41711308Santhony.gutierrez@amd.com               ii->opType() == Enums::OT_ARG)) {
41811308Santhony.gutierrez@amd.com        // Here for ALU instruction (all others)
41911308Santhony.gutierrez@amd.com        if (!computeUnit->wfWait[simdId].prerdy()) {
42011308Santhony.gutierrez@amd.com            // Is alu slot free?
42111308Santhony.gutierrez@amd.com            return 0;
42211308Santhony.gutierrez@amd.com        }
42311308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
42411308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
42511308Santhony.gutierrez@amd.com            return 0;
42611308Santhony.gutierrez@amd.com        }
42711308Santhony.gutierrez@amd.com
42811308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
42911308Santhony.gutierrez@amd.com            return 0;
43011308Santhony.gutierrez@amd.com        }
43111308Santhony.gutierrez@amd.com        ready_inst = true;
43211308Santhony.gutierrez@amd.com    } else if (type == I_GLOBAL && (IS_OT_READ_GM(ii->opType()) ||
43311308Santhony.gutierrez@amd.com               IS_OT_WRITE_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType()))) {
43411308Santhony.gutierrez@amd.com        // Here Global memory instruction
43511308Santhony.gutierrez@amd.com        if (IS_OT_READ_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType())) {
43611308Santhony.gutierrez@amd.com            // Are there in pipe or outstanding global memory write requests?
43711308Santhony.gutierrez@amd.com            if ((outstanding_reqs_wr_gm + wr_gm_reqs_in_pipe) > 0) {
43811308Santhony.gutierrez@amd.com                return 0;
43911308Santhony.gutierrez@amd.com            }
44011308Santhony.gutierrez@amd.com        }
44111308Santhony.gutierrez@amd.com
44211308Santhony.gutierrez@amd.com        if (IS_OT_WRITE_GM(ii->opType()) || IS_OT_ATOMIC_GM(ii->opType()) ||
44311308Santhony.gutierrez@amd.com            IS_OT_HIST_GM(ii->opType())) {
44411308Santhony.gutierrez@amd.com            // Are there in pipe or outstanding global memory read requests?
44511308Santhony.gutierrez@amd.com            if ((outstanding_reqs_rd_gm + rd_gm_reqs_in_pipe) > 0)
44611308Santhony.gutierrez@amd.com                return 0;
44711308Santhony.gutierrez@amd.com        }
44811308Santhony.gutierrez@amd.com
44911308Santhony.gutierrez@amd.com        if (!glbMemIssueRdy) {
45011308Santhony.gutierrez@amd.com            // Is WV issue slot free?
45111308Santhony.gutierrez@amd.com            return 0;
45211308Santhony.gutierrez@amd.com        }
45311308Santhony.gutierrez@amd.com
45411308Santhony.gutierrez@amd.com        if (!glbMemBusRdy) {
45511308Santhony.gutierrez@amd.com            // Is there an available VRF->Global memory read bus?
45611308Santhony.gutierrez@amd.com            return 0;
45711308Santhony.gutierrez@amd.com        }
45811308Santhony.gutierrez@amd.com
45911308Santhony.gutierrez@amd.com        if (!computeUnit->globalMemoryPipe.
46011308Santhony.gutierrez@amd.com            isGMReqFIFOWrRdy(rd_gm_reqs_in_pipe + wr_gm_reqs_in_pipe)) {
46111308Santhony.gutierrez@amd.com            // Can we insert a new request to the Global Mem Request FIFO?
46211308Santhony.gutierrez@amd.com            return 0;
46311308Santhony.gutierrez@amd.com        }
46411308Santhony.gutierrez@amd.com        // can we schedule source & destination operands on the VRF?
46511308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
46611308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
46711308Santhony.gutierrez@amd.com            return 0;
46811308Santhony.gutierrez@amd.com        }
46911308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
47011308Santhony.gutierrez@amd.com            return 0;
47111308Santhony.gutierrez@amd.com        }
47211308Santhony.gutierrez@amd.com        ready_inst = true;
47311308Santhony.gutierrez@amd.com    } else if (type == I_SHARED && (IS_OT_READ_LM(ii->opType()) ||
47411308Santhony.gutierrez@amd.com               IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()))) {
47511308Santhony.gutierrez@amd.com        // Here for Shared memory instruction
47611308Santhony.gutierrez@amd.com        if (IS_OT_READ_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType())) {
47711308Santhony.gutierrez@amd.com            if ((outstanding_reqs_wr_lm + wr_lm_reqs_in_pipe) > 0) {
47811308Santhony.gutierrez@amd.com                return 0;
47911308Santhony.gutierrez@amd.com            }
48011308Santhony.gutierrez@amd.com        }
48111308Santhony.gutierrez@amd.com
48211308Santhony.gutierrez@amd.com        if (IS_OT_WRITE_LM(ii->opType()) || IS_OT_ATOMIC_LM(ii->opType()) ||
48311308Santhony.gutierrez@amd.com            IS_OT_HIST_LM(ii->opType())) {
48411308Santhony.gutierrez@amd.com            if ((outstanding_reqs_rd_lm + rd_lm_reqs_in_pipe) > 0) {
48511308Santhony.gutierrez@amd.com                return 0;
48611308Santhony.gutierrez@amd.com            }
48711308Santhony.gutierrez@amd.com        }
48811308Santhony.gutierrez@amd.com
48911308Santhony.gutierrez@amd.com        if (!locMemBusRdy) {
49011308Santhony.gutierrez@amd.com            // Is there an available VRF->LDS read bus?
49111308Santhony.gutierrez@amd.com            return 0;
49211308Santhony.gutierrez@amd.com        }
49311308Santhony.gutierrez@amd.com        if (!locMemIssueRdy) {
49411308Santhony.gutierrez@amd.com            // Is wave slot free?
49511308Santhony.gutierrez@amd.com            return 0;
49611308Santhony.gutierrez@amd.com        }
49711308Santhony.gutierrez@amd.com
49811308Santhony.gutierrez@amd.com        if (!computeUnit->localMemoryPipe.
49911308Santhony.gutierrez@amd.com            isLMReqFIFOWrRdy(rd_lm_reqs_in_pipe + wr_lm_reqs_in_pipe)) {
50011308Santhony.gutierrez@amd.com            // Can we insert a new request to the LDS Request FIFO?
50111308Santhony.gutierrez@amd.com            return 0;
50211308Santhony.gutierrez@amd.com        }
50311308Santhony.gutierrez@amd.com        // can we schedule source & destination operands on the VRF?
50411308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
50511308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
50611308Santhony.gutierrez@amd.com            return 0;
50711308Santhony.gutierrez@amd.com        }
50811308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
50911308Santhony.gutierrez@amd.com            return 0;
51011308Santhony.gutierrez@amd.com        }
51111308Santhony.gutierrez@amd.com        ready_inst = true;
51211308Santhony.gutierrez@amd.com    } else if (type == I_PRIVATE && (IS_OT_READ_PM(ii->opType()) ||
51311308Santhony.gutierrez@amd.com               IS_OT_WRITE_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType()))) {
51411308Santhony.gutierrez@amd.com        // Here for Private memory instruction ------------------------    //
51511308Santhony.gutierrez@amd.com        if (IS_OT_READ_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType())) {
51611308Santhony.gutierrez@amd.com            if ((outstanding_reqs_wr_gm + wr_gm_reqs_in_pipe) > 0) {
51711308Santhony.gutierrez@amd.com                return 0;
51811308Santhony.gutierrez@amd.com            }
51911308Santhony.gutierrez@amd.com        }
52011308Santhony.gutierrez@amd.com
52111308Santhony.gutierrez@amd.com        if (IS_OT_WRITE_PM(ii->opType()) || IS_OT_ATOMIC_PM(ii->opType()) ||
52211308Santhony.gutierrez@amd.com            IS_OT_HIST_PM(ii->opType())) {
52311308Santhony.gutierrez@amd.com            if ((outstanding_reqs_rd_gm + rd_gm_reqs_in_pipe) > 0) {
52411308Santhony.gutierrez@amd.com                return 0;
52511308Santhony.gutierrez@amd.com            }
52611308Santhony.gutierrez@amd.com        }
52711308Santhony.gutierrez@amd.com
52811308Santhony.gutierrez@amd.com        if (!glbMemBusRdy) {
52911308Santhony.gutierrez@amd.com            // Is there an available VRF->Global memory read bus?
53011308Santhony.gutierrez@amd.com            return 0;
53111308Santhony.gutierrez@amd.com        }
53211308Santhony.gutierrez@amd.com
53311308Santhony.gutierrez@amd.com        if (!glbMemIssueRdy) {
53411308Santhony.gutierrez@amd.com             // Is wave slot free?
53511308Santhony.gutierrez@amd.com            return 0;
53611308Santhony.gutierrez@amd.com        }
53711308Santhony.gutierrez@amd.com
53811308Santhony.gutierrez@amd.com        if (!computeUnit->globalMemoryPipe.
53911308Santhony.gutierrez@amd.com            isGMReqFIFOWrRdy(rd_gm_reqs_in_pipe + wr_gm_reqs_in_pipe)) {
54011308Santhony.gutierrez@amd.com            // Can we insert a new request to the Global Mem Request FIFO?
54111308Santhony.gutierrez@amd.com            return 0;
54211308Santhony.gutierrez@amd.com        }
54311308Santhony.gutierrez@amd.com        // can we schedule source & destination operands on the VRF?
54411308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
54511308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
54611308Santhony.gutierrez@amd.com            return 0;
54711308Santhony.gutierrez@amd.com        }
54811308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
54911308Santhony.gutierrez@amd.com            return 0;
55011308Santhony.gutierrez@amd.com        }
55111308Santhony.gutierrez@amd.com        ready_inst = true;
55211308Santhony.gutierrez@amd.com    } else if (type == I_FLAT && IS_OT_FLAT(ii->opType())) {
55311308Santhony.gutierrez@amd.com        if (!glbMemBusRdy) {
55411308Santhony.gutierrez@amd.com            // Is there an available VRF->Global memory read bus?
55511308Santhony.gutierrez@amd.com            return 0;
55611308Santhony.gutierrez@amd.com        }
55711308Santhony.gutierrez@amd.com
55811308Santhony.gutierrez@amd.com        if (!locMemBusRdy) {
55911308Santhony.gutierrez@amd.com            // Is there an available VRF->LDS read bus?
56011308Santhony.gutierrez@amd.com            return 0;
56111308Santhony.gutierrez@amd.com        }
56211308Santhony.gutierrez@amd.com
56311308Santhony.gutierrez@amd.com        if (!glbMemIssueRdy) {
56411308Santhony.gutierrez@amd.com            // Is wave slot free?
56511308Santhony.gutierrez@amd.com            return 0;
56611308Santhony.gutierrez@amd.com        }
56711308Santhony.gutierrez@amd.com
56811308Santhony.gutierrez@amd.com        if (!locMemIssueRdy) {
56911308Santhony.gutierrez@amd.com            return 0;
57011308Santhony.gutierrez@amd.com        }
57111308Santhony.gutierrez@amd.com        if (!computeUnit->globalMemoryPipe.
57211308Santhony.gutierrez@amd.com            isGMReqFIFOWrRdy(rd_gm_reqs_in_pipe + wr_gm_reqs_in_pipe)) {
57311308Santhony.gutierrez@amd.com            // Can we insert a new request to the Global Mem Request FIFO?
57411308Santhony.gutierrez@amd.com            return 0;
57511308Santhony.gutierrez@amd.com        }
57611308Santhony.gutierrez@amd.com
57711308Santhony.gutierrez@amd.com        if (!computeUnit->localMemoryPipe.
57811308Santhony.gutierrez@amd.com            isLMReqFIFOWrRdy(rd_lm_reqs_in_pipe + wr_lm_reqs_in_pipe)) {
57911308Santhony.gutierrez@amd.com            // Can we insert a new request to the LDS Request FIFO?
58011308Santhony.gutierrez@amd.com            return 0;
58111308Santhony.gutierrez@amd.com        }
58211308Santhony.gutierrez@amd.com        // can we schedule source & destination operands on the VRF?
58311308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->vrfOperandAccessReady(this, ii,
58411308Santhony.gutierrez@amd.com                    VrfAccessType::RD_WR)) {
58511308Santhony.gutierrez@amd.com            return 0;
58611308Santhony.gutierrez@amd.com        }
58711308Santhony.gutierrez@amd.com        // are all the operands ready? (RAW, WAW and WAR depedencies met?)
58811308Santhony.gutierrez@amd.com        if (!computeUnit->vrf[simdId]->operandsReady(this, ii)) {
58911308Santhony.gutierrez@amd.com            return 0;
59011308Santhony.gutierrez@amd.com        }
59111308Santhony.gutierrez@amd.com        ready_inst = true;
59211308Santhony.gutierrez@amd.com    } else {
59311308Santhony.gutierrez@amd.com        return 0;
59411308Santhony.gutierrez@amd.com    }
59511308Santhony.gutierrez@amd.com
59611308Santhony.gutierrez@amd.com    assert(ready_inst);
59711308Santhony.gutierrez@amd.com
59811308Santhony.gutierrez@amd.com    DPRINTF(GPUExec, "CU%d: WF[%d][%d]: Ready Inst : %s\n", computeUnit->cu_id,
59911308Santhony.gutierrez@amd.com            simdId, wfSlotId, ii->disassemble());
60011308Santhony.gutierrez@amd.com    return 1;
60111308Santhony.gutierrez@amd.com}
60211308Santhony.gutierrez@amd.com
60311308Santhony.gutierrez@amd.comvoid
60411308Santhony.gutierrez@amd.comWavefront::updateResources()
60511308Santhony.gutierrez@amd.com{
60611308Santhony.gutierrez@amd.com    // Get current instruction
60711308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
60811308Santhony.gutierrez@amd.com    assert(ii);
60911308Santhony.gutierrez@amd.com    computeUnit->vrf[simdId]->updateResources(this, ii);
61011308Santhony.gutierrez@amd.com    // Single precision ALU or Branch or Return or Special instruction
61111308Santhony.gutierrez@amd.com    if (ii->opType() == Enums::OT_ALU || ii->opType() == Enums::OT_SPECIAL ||
61211308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_BRANCH || IS_OT_LDAS(ii->opType()) ||
61311308Santhony.gutierrez@amd.com        // FIXME: Kernel argument loads are currently treated as ALU operations
61411308Santhony.gutierrez@amd.com        // since we don't send memory packets at execution. If we fix that then
61511308Santhony.gutierrez@amd.com        // we should map them to one of the memory pipelines
61611308Santhony.gutierrez@amd.com        ii->opType()==Enums::OT_KERN_READ ||
61711308Santhony.gutierrez@amd.com        ii->opType()==Enums::OT_ARG ||
61811308Santhony.gutierrez@amd.com        ii->opType()==Enums::OT_RET) {
61911308Santhony.gutierrez@amd.com        computeUnit->aluPipe[simdId].preset(computeUnit->shader->
62011308Santhony.gutierrez@amd.com                                            ticks(computeUnit->spBypassLength()));
62111308Santhony.gutierrez@amd.com        // this is to enforce a fixed number of cycles per issue slot per SIMD
62211308Santhony.gutierrez@amd.com        computeUnit->wfWait[simdId].preset(computeUnit->shader->
62311308Santhony.gutierrez@amd.com                                           ticks(computeUnit->issuePeriod));
62411308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_BARRIER) {
62511308Santhony.gutierrez@amd.com        computeUnit->wfWait[simdId].preset(computeUnit->shader->
62611308Santhony.gutierrez@amd.com                                           ticks(computeUnit->issuePeriod));
62711308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_FLAT_READ) {
62811308Santhony.gutierrez@amd.com        assert(Enums::SC_NONE != ii->executedAs());
62911308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
63011308Santhony.gutierrez@amd.com        rd_gm_reqs_in_pipe++;
63111308Santhony.gutierrez@amd.com        if ( Enums::SC_SHARED == ii->executedAs() ) {
63211308Santhony.gutierrez@amd.com            computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
63311308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(4));
63411308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->ShrMemUnitId()].
63511308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
63611308Santhony.gutierrez@amd.com        } else {
63711308Santhony.gutierrez@amd.com            computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
63811308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(4));
63911308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->GlbMemUnitId()].
64011308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
64111308Santhony.gutierrez@amd.com        }
64211308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_FLAT_WRITE) {
64311308Santhony.gutierrez@amd.com        assert(Enums::SC_NONE != ii->executedAs());
64411308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
64511308Santhony.gutierrez@amd.com        wr_gm_reqs_in_pipe++;
64611308Santhony.gutierrez@amd.com        if (Enums::SC_SHARED == ii->executedAs()) {
64711308Santhony.gutierrez@amd.com            computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
64811308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(8));
64911308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->ShrMemUnitId()].
65011308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
65111308Santhony.gutierrez@amd.com        } else {
65211308Santhony.gutierrez@amd.com            computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
65311308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(8));
65411308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->GlbMemUnitId()].
65511308Santhony.gutierrez@amd.com                preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
65611308Santhony.gutierrez@amd.com        }
65711308Santhony.gutierrez@amd.com    } else if (IS_OT_READ_GM(ii->opType())) {
65811308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
65911308Santhony.gutierrez@amd.com        rd_gm_reqs_in_pipe++;
66011308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
66111308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(4));
66211308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
66311308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
66411308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_GM(ii->opType())) {
66511308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
66611308Santhony.gutierrez@amd.com        wr_gm_reqs_in_pipe++;
66711308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
66811308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
66911308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
67011308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
67111308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_GM(ii->opType())) {
67211308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
67311308Santhony.gutierrez@amd.com        wr_gm_reqs_in_pipe++;
67411308Santhony.gutierrez@amd.com        rd_gm_reqs_in_pipe++;
67511308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
67611308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
67711308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
67811308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
67911308Santhony.gutierrez@amd.com    } else if (IS_OT_READ_LM(ii->opType())) {
68011308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
68111308Santhony.gutierrez@amd.com        rd_lm_reqs_in_pipe++;
68211308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
68311308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(4));
68411308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
68511308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
68611308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_LM(ii->opType())) {
68711308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
68811308Santhony.gutierrez@amd.com        wr_lm_reqs_in_pipe++;
68911308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
69011308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
69111308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
69211308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
69311308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_LM(ii->opType())) {
69411308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
69511308Santhony.gutierrez@amd.com        wr_lm_reqs_in_pipe++;
69611308Santhony.gutierrez@amd.com        rd_lm_reqs_in_pipe++;
69711308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
69811308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
69911308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
70011308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
70111308Santhony.gutierrez@amd.com    } else if (IS_OT_READ_PM(ii->opType())) {
70211308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
70311308Santhony.gutierrez@amd.com        rd_gm_reqs_in_pipe++;
70411308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
70511308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(4));
70611308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
70711308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
70811308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_PM(ii->opType())) {
70911308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
71011308Santhony.gutierrez@amd.com        wr_gm_reqs_in_pipe++;
71111308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
71211308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
71311308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
71411308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
71511308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_PM(ii->opType())) {
71611308Santhony.gutierrez@amd.com        mem_reqs_in_pipe++;
71711308Santhony.gutierrez@amd.com        wr_gm_reqs_in_pipe++;
71811308Santhony.gutierrez@amd.com        rd_gm_reqs_in_pipe++;
71911308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
72011308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(8));
72111308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
72211308Santhony.gutierrez@amd.com            preset(computeUnit->shader->ticks(computeUnit->issuePeriod));
72311308Santhony.gutierrez@amd.com    }
72411308Santhony.gutierrez@amd.com}
72511308Santhony.gutierrez@amd.com
72611308Santhony.gutierrez@amd.comvoid
72711308Santhony.gutierrez@amd.comWavefront::exec()
72811308Santhony.gutierrez@amd.com{
72911308Santhony.gutierrez@amd.com    // ---- Exit if wavefront is inactive ----------------------------- //
73011308Santhony.gutierrez@amd.com
73111308Santhony.gutierrez@amd.com    if (status == S_STOPPED || status == S_RETURNING ||
73211308Santhony.gutierrez@amd.com        instructionBuffer.empty()) {
73311308Santhony.gutierrez@amd.com        return;
73411308Santhony.gutierrez@amd.com    }
73511308Santhony.gutierrez@amd.com
73611308Santhony.gutierrez@amd.com    // Get current instruction
73711308Santhony.gutierrez@amd.com
73811308Santhony.gutierrez@amd.com    GPUDynInstPtr ii = instructionBuffer.front();
73911308Santhony.gutierrez@amd.com
74011308Santhony.gutierrez@amd.com    const uint32_t old_pc = pc();
74111308Santhony.gutierrez@amd.com    DPRINTF(GPUExec, "CU%d: WF[%d][%d]: wave[%d] Executing inst: %s "
74211308Santhony.gutierrez@amd.com            "(pc: %i)\n", computeUnit->cu_id, simdId, wfSlotId, wfDynId,
74311308Santhony.gutierrez@amd.com            ii->disassemble(), old_pc);
74411308Santhony.gutierrez@amd.com    ii->execute();
74511308Santhony.gutierrez@amd.com    // access the VRF
74611308Santhony.gutierrez@amd.com    computeUnit->vrf[simdId]->exec(ii, this);
74711308Santhony.gutierrez@amd.com    srcRegOpDist.sample(ii->numSrcRegOperands());
74811308Santhony.gutierrez@amd.com    dstRegOpDist.sample(ii->numDstRegOperands());
74911308Santhony.gutierrez@amd.com    computeUnit->numInstrExecuted++;
75011308Santhony.gutierrez@amd.com    computeUnit->execRateDist.sample(computeUnit->totalCycles.value() -
75111308Santhony.gutierrez@amd.com                                     computeUnit->lastExecCycle[simdId]);
75211308Santhony.gutierrez@amd.com    computeUnit->lastExecCycle[simdId] = computeUnit->totalCycles.value();
75311308Santhony.gutierrez@amd.com    if (pc() == old_pc) {
75411308Santhony.gutierrez@amd.com        uint32_t new_pc = old_pc + 1;
75511308Santhony.gutierrez@amd.com        // PC not modified by instruction, proceed to next or pop frame
75611308Santhony.gutierrez@amd.com        pc(new_pc);
75711308Santhony.gutierrez@amd.com        if (new_pc == rpc()) {
75811308Santhony.gutierrez@amd.com            popFromReconvergenceStack();
75911308Santhony.gutierrez@amd.com            discardFetch();
76011308Santhony.gutierrez@amd.com        } else {
76111308Santhony.gutierrez@amd.com            instructionBuffer.pop_front();
76211308Santhony.gutierrez@amd.com        }
76311308Santhony.gutierrez@amd.com    }
76411308Santhony.gutierrez@amd.com
76511308Santhony.gutierrez@amd.com    if (computeUnit->shader->hsail_mode==Shader::SIMT) {
76611308Santhony.gutierrez@amd.com        const int num_active_lanes = execMask().count();
76711308Santhony.gutierrez@amd.com        computeUnit->controlFlowDivergenceDist.sample(num_active_lanes);
76811308Santhony.gutierrez@amd.com        computeUnit->numVecOpsExecuted += num_active_lanes;
76911308Santhony.gutierrez@amd.com        if (isGmInstruction(ii)) {
77011308Santhony.gutierrez@amd.com            computeUnit->activeLanesPerGMemInstrDist.sample(num_active_lanes);
77111308Santhony.gutierrez@amd.com        } else if (isLmInstruction(ii)) {
77211308Santhony.gutierrez@amd.com            computeUnit->activeLanesPerLMemInstrDist.sample(num_active_lanes);
77311308Santhony.gutierrez@amd.com        }
77411308Santhony.gutierrez@amd.com    }
77511308Santhony.gutierrez@amd.com
77611308Santhony.gutierrez@amd.com    // ---- Update Vector ALU pipeline and other resources ------------------ //
77711308Santhony.gutierrez@amd.com    // Single precision ALU or Branch or Return or Special instruction
77811308Santhony.gutierrez@amd.com    if (ii->opType() == Enums::OT_ALU || ii->opType() == Enums::OT_SPECIAL ||
77911308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_BRANCH || IS_OT_LDAS(ii->opType()) ||
78011308Santhony.gutierrez@amd.com        // FIXME: Kernel argument loads are currently treated as ALU operations
78111308Santhony.gutierrez@amd.com        // since we don't send memory packets at execution. If we fix that then
78211308Santhony.gutierrez@amd.com        // we should map them to one of the memory pipelines
78311308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_KERN_READ ||
78411308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_ARG ||
78511308Santhony.gutierrez@amd.com        ii->opType() == Enums::OT_RET) {
78611308Santhony.gutierrez@amd.com        computeUnit->aluPipe[simdId].set(computeUnit->shader->
78711308Santhony.gutierrez@amd.com                                         ticks(computeUnit->spBypassLength()));
78811308Santhony.gutierrez@amd.com
78911308Santhony.gutierrez@amd.com        // this is to enforce a fixed number of cycles per issue slot per SIMD
79011308Santhony.gutierrez@amd.com        computeUnit->wfWait[simdId].set(computeUnit->shader->
79111308Santhony.gutierrez@amd.com                                        ticks(computeUnit->issuePeriod));
79211308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_BARRIER) {
79311308Santhony.gutierrez@amd.com        computeUnit->wfWait[simdId].set(computeUnit->shader->
79411308Santhony.gutierrez@amd.com                                        ticks(computeUnit->issuePeriod));
79511308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_FLAT_READ) {
79611308Santhony.gutierrez@amd.com        assert(Enums::SC_NONE != ii->executedAs());
79711308Santhony.gutierrez@amd.com
79811308Santhony.gutierrez@amd.com        if (Enums::SC_SHARED == ii->executedAs()) {
79911308Santhony.gutierrez@amd.com            computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
80011308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(4));
80111308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->ShrMemUnitId()].
80211308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(computeUnit->issuePeriod));
80311308Santhony.gutierrez@amd.com        } else {
80411308Santhony.gutierrez@amd.com            computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
80511308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(4));
80611308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->GlbMemUnitId()].
80711308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(computeUnit->issuePeriod));
80811308Santhony.gutierrez@amd.com        }
80911308Santhony.gutierrez@amd.com    } else if (ii->opType() == Enums::OT_FLAT_WRITE) {
81011308Santhony.gutierrez@amd.com        assert(Enums::SC_NONE != ii->executedAs());
81111308Santhony.gutierrez@amd.com        if (Enums::SC_SHARED == ii->executedAs()) {
81211308Santhony.gutierrez@amd.com            computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
81311308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(8));
81411308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->ShrMemUnitId()].
81511308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(computeUnit->issuePeriod));
81611308Santhony.gutierrez@amd.com        } else {
81711308Santhony.gutierrez@amd.com            computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
81811308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(8));
81911308Santhony.gutierrez@amd.com            computeUnit->wfWait[computeUnit->GlbMemUnitId()].
82011308Santhony.gutierrez@amd.com                set(computeUnit->shader->ticks(computeUnit->issuePeriod));
82111308Santhony.gutierrez@amd.com        }
82211308Santhony.gutierrez@amd.com    } else if (IS_OT_READ_GM(ii->opType())) {
82311308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
82411308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(4));
82511308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
82611308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
82711308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_GM(ii->opType())) {
82811308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
82911308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(8));
83011308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->GlbMemUnitId()].
83111308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
83211308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_GM(ii->opType())) {
83311308Santhony.gutierrez@amd.com        computeUnit->vrfToGlobalMemPipeBus[computeUnit->nextGlbRdBus()].
83411308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(8));
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_READ_LM(ii->opType())) {
83811308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
83911308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(4));
84011308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
84111308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
84211308Santhony.gutierrez@amd.com    } else if (IS_OT_WRITE_LM(ii->opType())) {
84311308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
84411308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(8));
84511308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
84611308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
84711308Santhony.gutierrez@amd.com    } else if (IS_OT_ATOMIC_LM(ii->opType())) {
84811308Santhony.gutierrez@amd.com        computeUnit->vrfToLocalMemPipeBus[computeUnit->nextLocRdBus()].
84911308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(8));
85011308Santhony.gutierrez@amd.com        computeUnit->wfWait[computeUnit->ShrMemUnitId()].
85111308Santhony.gutierrez@amd.com            set(computeUnit->shader->ticks(computeUnit->issuePeriod));
85211308Santhony.gutierrez@amd.com    }
85311308Santhony.gutierrez@amd.com}
85411308Santhony.gutierrez@amd.com
85511308Santhony.gutierrez@amd.combool
85611308Santhony.gutierrez@amd.comWavefront::waitingAtBarrier(int lane)
85711308Santhony.gutierrez@amd.com{
85811308Santhony.gutierrez@amd.com    return bar_cnt[lane] < max_bar_cnt;
85911308Santhony.gutierrez@amd.com}
86011308Santhony.gutierrez@amd.com
86111308Santhony.gutierrez@amd.comvoid
86211308Santhony.gutierrez@amd.comWavefront::pushToReconvergenceStack(uint32_t pc, uint32_t rpc,
86311308Santhony.gutierrez@amd.com                                    const VectorMask& mask)
86411308Santhony.gutierrez@amd.com{
86511308Santhony.gutierrez@amd.com    assert(mask.count());
86611308Santhony.gutierrez@amd.com    reconvergenceStack.emplace(new ReconvergenceStackEntry(pc, rpc, mask));
86711308Santhony.gutierrez@amd.com}
86811308Santhony.gutierrez@amd.com
86911308Santhony.gutierrez@amd.comvoid
87011308Santhony.gutierrez@amd.comWavefront::popFromReconvergenceStack()
87111308Santhony.gutierrez@amd.com{
87211308Santhony.gutierrez@amd.com    assert(!reconvergenceStack.empty());
87311308Santhony.gutierrez@amd.com
87411308Santhony.gutierrez@amd.com    DPRINTF(WavefrontStack, "[%2d, %2d, %2d, %2d] %s %3i => ",
87511308Santhony.gutierrez@amd.com            computeUnit->cu_id, simdId, wfSlotId, wfDynId,
87611308Santhony.gutierrez@amd.com            execMask().to_string<char, std::string::traits_type,
87711308Santhony.gutierrez@amd.com            std::string::allocator_type>().c_str(), pc());
87811308Santhony.gutierrez@amd.com
87911308Santhony.gutierrez@amd.com    reconvergenceStack.pop();
88011308Santhony.gutierrez@amd.com
88111308Santhony.gutierrez@amd.com    DPRINTF(WavefrontStack, "%3i %s\n", pc(),
88211308Santhony.gutierrez@amd.com            execMask().to_string<char, std::string::traits_type,
88311308Santhony.gutierrez@amd.com            std::string::allocator_type>().c_str());
88411308Santhony.gutierrez@amd.com
88511308Santhony.gutierrez@amd.com}
88611308Santhony.gutierrez@amd.com
88711308Santhony.gutierrez@amd.comvoid
88811308Santhony.gutierrez@amd.comWavefront::discardFetch()
88911308Santhony.gutierrez@amd.com{
89011308Santhony.gutierrez@amd.com    instructionBuffer.clear();
89111308Santhony.gutierrez@amd.com    dropFetch |=pendingFetch;
89211308Santhony.gutierrez@amd.com}
89311308Santhony.gutierrez@amd.com
89411308Santhony.gutierrez@amd.comuint32_t
89511308Santhony.gutierrez@amd.comWavefront::pc() const
89611308Santhony.gutierrez@amd.com{
89711308Santhony.gutierrez@amd.com    return reconvergenceStack.top()->pc;
89811308Santhony.gutierrez@amd.com}
89911308Santhony.gutierrez@amd.com
90011308Santhony.gutierrez@amd.comuint32_t
90111308Santhony.gutierrez@amd.comWavefront::rpc() const
90211308Santhony.gutierrez@amd.com{
90311308Santhony.gutierrez@amd.com    return reconvergenceStack.top()->rpc;
90411308Santhony.gutierrez@amd.com}
90511308Santhony.gutierrez@amd.com
90611308Santhony.gutierrez@amd.comVectorMask
90711308Santhony.gutierrez@amd.comWavefront::execMask() const
90811308Santhony.gutierrez@amd.com{
90911308Santhony.gutierrez@amd.com    return reconvergenceStack.top()->execMask;
91011308Santhony.gutierrez@amd.com}
91111308Santhony.gutierrez@amd.com
91211308Santhony.gutierrez@amd.combool
91311308Santhony.gutierrez@amd.comWavefront::execMask(int lane) const
91411308Santhony.gutierrez@amd.com{
91511308Santhony.gutierrez@amd.com    return reconvergenceStack.top()->execMask[lane];
91611308Santhony.gutierrez@amd.com}
91711308Santhony.gutierrez@amd.com
91811308Santhony.gutierrez@amd.com
91911308Santhony.gutierrez@amd.comvoid
92011308Santhony.gutierrez@amd.comWavefront::pc(uint32_t new_pc)
92111308Santhony.gutierrez@amd.com{
92211308Santhony.gutierrez@amd.com    reconvergenceStack.top()->pc = new_pc;
92311308Santhony.gutierrez@amd.com}
924