mem_impl.hh revision 11645
111308Santhony.gutierrez@amd.com/*
211308Santhony.gutierrez@amd.com * Copyright (c) 2012-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: Steve Reinhardt
3411308Santhony.gutierrez@amd.com */
3511308Santhony.gutierrez@amd.com
3611308Santhony.gutierrez@amd.com#include "arch/hsail/generic_types.hh"
3711308Santhony.gutierrez@amd.com#include "gpu-compute/hsail_code.hh"
3811308Santhony.gutierrez@amd.com
3911308Santhony.gutierrez@amd.com// defined in code.cc, but not worth sucking in all of code.h for this
4011308Santhony.gutierrez@amd.com// at this point
4111308Santhony.gutierrez@amd.comextern const char *segmentNames[];
4211308Santhony.gutierrez@amd.com
4311308Santhony.gutierrez@amd.comnamespace HsailISA
4411308Santhony.gutierrez@amd.com{
4511308Santhony.gutierrez@amd.com    template<typename DestDataType, typename AddrRegOperandType>
4611308Santhony.gutierrez@amd.com    void
4711308Santhony.gutierrez@amd.com    LdaInst<DestDataType, AddrRegOperandType>::generateDisassembly()
4811308Santhony.gutierrez@amd.com    {
4911308Santhony.gutierrez@amd.com        this->disassembly = csprintf("%s_%s %s,%s", this->opcode,
5011308Santhony.gutierrez@amd.com                                     DestDataType::label,
5111308Santhony.gutierrez@amd.com                                     this->dest.disassemble(),
5211308Santhony.gutierrez@amd.com                                     this->addr.disassemble());
5311308Santhony.gutierrez@amd.com    }
5411308Santhony.gutierrez@amd.com
5511308Santhony.gutierrez@amd.com    template<typename DestDataType, typename AddrRegOperandType>
5611308Santhony.gutierrez@amd.com    void
5711308Santhony.gutierrez@amd.com    LdaInst<DestDataType, AddrRegOperandType>::execute(GPUDynInstPtr gpuDynInst)
5811308Santhony.gutierrez@amd.com    {
5911308Santhony.gutierrez@amd.com        Wavefront *w = gpuDynInst->wavefront();
6011308Santhony.gutierrez@amd.com
6111308Santhony.gutierrez@amd.com        typedef typename DestDataType::CType CType M5_VAR_USED;
6211639Salexandru.dutu@amd.com        const VectorMask &mask = w->getPred();
6311534Sjohn.kalamatianos@amd.com        std::vector<Addr> addr_vec;
6411534Sjohn.kalamatianos@amd.com        addr_vec.resize(w->computeUnit->wfSize(), (Addr)0);
6511308Santhony.gutierrez@amd.com        this->addr.calcVector(w, addr_vec);
6611308Santhony.gutierrez@amd.com
6711534Sjohn.kalamatianos@amd.com        for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
6811308Santhony.gutierrez@amd.com            if (mask[lane]) {
6911308Santhony.gutierrez@amd.com                this->dest.set(w, lane, addr_vec[lane]);
7011308Santhony.gutierrez@amd.com            }
7111308Santhony.gutierrez@amd.com        }
7211534Sjohn.kalamatianos@amd.com        addr_vec.clear();
7311308Santhony.gutierrez@amd.com    }
7411308Santhony.gutierrez@amd.com
7511308Santhony.gutierrez@amd.com    template<typename MemDataType, typename DestDataType,
7611308Santhony.gutierrez@amd.com             typename AddrRegOperandType>
7711308Santhony.gutierrez@amd.com    void
7811308Santhony.gutierrez@amd.com    LdInst<MemDataType, DestDataType, AddrRegOperandType>::generateDisassembly()
7911308Santhony.gutierrez@amd.com    {
8011308Santhony.gutierrez@amd.com        switch (num_dest_operands) {
8111308Santhony.gutierrez@amd.com          case 1:
8211308Santhony.gutierrez@amd.com            this->disassembly = csprintf("%s_%s_%s %s,%s", this->opcode,
8311308Santhony.gutierrez@amd.com                                         segmentNames[this->segment],
8411308Santhony.gutierrez@amd.com                                         MemDataType::label,
8511308Santhony.gutierrez@amd.com                                         this->dest.disassemble(),
8611308Santhony.gutierrez@amd.com                                         this->addr.disassemble());
8711308Santhony.gutierrez@amd.com            break;
8811308Santhony.gutierrez@amd.com          case 2:
8911308Santhony.gutierrez@amd.com            this->disassembly = csprintf("%s_%s_%s (%s,%s), %s", this->opcode,
9011308Santhony.gutierrez@amd.com                                         segmentNames[this->segment],
9111308Santhony.gutierrez@amd.com                                         MemDataType::label,
9211308Santhony.gutierrez@amd.com                                         this->dest_vect[0].disassemble(),
9311308Santhony.gutierrez@amd.com                                         this->dest_vect[1].disassemble(),
9411308Santhony.gutierrez@amd.com                                         this->addr.disassemble());
9511308Santhony.gutierrez@amd.com            break;
9611645Salexandru.dutu@amd.com          case 3:
9711645Salexandru.dutu@amd.com            this->disassembly = csprintf("%s_%s_%s (%s,%s,%s), %s", this->opcode,
9811645Salexandru.dutu@amd.com                                         segmentNames[this->segment],
9911645Salexandru.dutu@amd.com                                         MemDataType::label,
10011645Salexandru.dutu@amd.com                                         this->dest_vect[0].disassemble(),
10111645Salexandru.dutu@amd.com                                         this->dest_vect[1].disassemble(),
10211645Salexandru.dutu@amd.com                                         this->dest_vect[2].disassemble(),
10311645Salexandru.dutu@amd.com                                         this->addr.disassemble());
10411645Salexandru.dutu@amd.com            break;
10511308Santhony.gutierrez@amd.com          case 4:
10611308Santhony.gutierrez@amd.com            this->disassembly = csprintf("%s_%s_%s (%s,%s,%s,%s), %s",
10711308Santhony.gutierrez@amd.com                                         this->opcode,
10811308Santhony.gutierrez@amd.com                                         segmentNames[this->segment],
10911308Santhony.gutierrez@amd.com                                         MemDataType::label,
11011308Santhony.gutierrez@amd.com                                         this->dest_vect[0].disassemble(),
11111308Santhony.gutierrez@amd.com                                         this->dest_vect[1].disassemble(),
11211308Santhony.gutierrez@amd.com                                         this->dest_vect[2].disassemble(),
11311308Santhony.gutierrez@amd.com                                         this->dest_vect[3].disassemble(),
11411308Santhony.gutierrez@amd.com                                         this->addr.disassemble());
11511308Santhony.gutierrez@amd.com            break;
11611308Santhony.gutierrez@amd.com          default:
11711308Santhony.gutierrez@amd.com            fatal("Bad ld register dest operand, num vector operands: %d \n",
11811308Santhony.gutierrez@amd.com                  num_dest_operands);
11911308Santhony.gutierrez@amd.com            break;
12011308Santhony.gutierrez@amd.com        }
12111308Santhony.gutierrez@amd.com    }
12211308Santhony.gutierrez@amd.com
12311308Santhony.gutierrez@amd.com    static Addr
12411308Santhony.gutierrez@amd.com    calcPrivAddr(Addr addr, Wavefront *w, int lane, GPUStaticInst *i)
12511308Santhony.gutierrez@amd.com    {
12611308Santhony.gutierrez@amd.com        // what is the size of the object we are accessing??
12711308Santhony.gutierrez@amd.com        // NOTE: the compiler doesn't generate enough information
12811308Santhony.gutierrez@amd.com        // to do this yet..have to just line up all the private
12911308Santhony.gutierrez@amd.com        // work-item spaces back to back for now
13011308Santhony.gutierrez@amd.com        /*
13111308Santhony.gutierrez@amd.com        StorageElement* se =
13211308Santhony.gutierrez@amd.com            i->parent->findSymbol(Brig::BrigPrivateSpace, addr);
13311308Santhony.gutierrez@amd.com        assert(se);
13411308Santhony.gutierrez@amd.com
13511534Sjohn.kalamatianos@amd.com        return w->wfSlotId * w->privSizePerItem * w->computeUnit->wfSize() +
13611534Sjohn.kalamatianos@amd.com            se->offset * w->computeUnit->wfSize() +
13711308Santhony.gutierrez@amd.com            lane * se->size;
13811308Santhony.gutierrez@amd.com        */
13911308Santhony.gutierrez@amd.com
14011308Santhony.gutierrez@amd.com        // addressing strategy: interleave the private spaces of
14111308Santhony.gutierrez@amd.com        // work-items in a wave-front on 8 byte granularity.
14211308Santhony.gutierrez@amd.com        // this won't be perfect coalescing like the spill space
14311308Santhony.gutierrez@amd.com        // strategy, but it's better than nothing. The spill space
14411308Santhony.gutierrez@amd.com        // strategy won't work with private because the same address
14511308Santhony.gutierrez@amd.com        // may be accessed by different sized loads/stores.
14611308Santhony.gutierrez@amd.com
14711308Santhony.gutierrez@amd.com        // Note: I'm assuming that the largest load/store to private
14811308Santhony.gutierrez@amd.com        // is 8 bytes. If it is larger, the stride will have to increase
14911308Santhony.gutierrez@amd.com
15011308Santhony.gutierrez@amd.com        Addr addr_div8 = addr / 8;
15111308Santhony.gutierrez@amd.com        Addr addr_mod8 = addr % 8;
15211308Santhony.gutierrez@amd.com
15311534Sjohn.kalamatianos@amd.com        Addr ret = addr_div8 * 8 * w->computeUnit->wfSize() + lane * 8 +
15411534Sjohn.kalamatianos@amd.com            addr_mod8 + w->privBase;
15511308Santhony.gutierrez@amd.com
15611534Sjohn.kalamatianos@amd.com        assert(ret < w->privBase +
15711534Sjohn.kalamatianos@amd.com               (w->privSizePerItem * w->computeUnit->wfSize()));
15811308Santhony.gutierrez@amd.com
15911308Santhony.gutierrez@amd.com        return ret;
16011308Santhony.gutierrez@amd.com    }
16111308Santhony.gutierrez@amd.com
16211308Santhony.gutierrez@amd.com    template<typename MemDataType, typename DestDataType,
16311308Santhony.gutierrez@amd.com             typename AddrRegOperandType>
16411308Santhony.gutierrez@amd.com    void
16511308Santhony.gutierrez@amd.com    LdInst<MemDataType, DestDataType,
16611308Santhony.gutierrez@amd.com           AddrRegOperandType>::execute(GPUDynInstPtr gpuDynInst)
16711308Santhony.gutierrez@amd.com    {
16811308Santhony.gutierrez@amd.com        Wavefront *w = gpuDynInst->wavefront();
16911308Santhony.gutierrez@amd.com
17011308Santhony.gutierrez@amd.com        typedef typename MemDataType::CType MemCType;
17111639Salexandru.dutu@amd.com        const VectorMask &mask = w->getPred();
17211308Santhony.gutierrez@amd.com
17311308Santhony.gutierrez@amd.com        // Kernarg references are handled uniquely for now (no Memory Request
17411308Santhony.gutierrez@amd.com        // is used), so special-case them up front.  Someday we should
17511308Santhony.gutierrez@amd.com        // make this more realistic, at which we should get rid of this
17611308Santhony.gutierrez@amd.com        // block and fold this case into the switch below.
17711308Santhony.gutierrez@amd.com        if (this->segment == Brig::BRIG_SEGMENT_KERNARG) {
17811308Santhony.gutierrez@amd.com            MemCType val;
17911308Santhony.gutierrez@amd.com
18011308Santhony.gutierrez@amd.com            // I assume no vector ld for kernargs
18111308Santhony.gutierrez@amd.com            assert(num_dest_operands == 1);
18211308Santhony.gutierrez@amd.com
18311308Santhony.gutierrez@amd.com            // assuming for the moment that we'll never do register
18411308Santhony.gutierrez@amd.com            // offsets into kernarg space... just to make life simpler
18511308Santhony.gutierrez@amd.com            uint64_t address = this->addr.calcUniform();
18611308Santhony.gutierrez@amd.com
18711308Santhony.gutierrez@amd.com            val = *(MemCType*)&w->kernelArgs[address];
18811308Santhony.gutierrez@amd.com
18911308Santhony.gutierrez@amd.com            DPRINTF(HSAIL, "ld_kernarg [%d] -> %d\n", address, val);
19011308Santhony.gutierrez@amd.com
19111534Sjohn.kalamatianos@amd.com            for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
19211308Santhony.gutierrez@amd.com                if (mask[lane]) {
19311308Santhony.gutierrez@amd.com                    this->dest.set(w, lane, val);
19411308Santhony.gutierrez@amd.com                }
19511308Santhony.gutierrez@amd.com            }
19611308Santhony.gutierrez@amd.com
19711308Santhony.gutierrez@amd.com            return;
19811308Santhony.gutierrez@amd.com        } else if (this->segment == Brig::BRIG_SEGMENT_ARG) {
19911308Santhony.gutierrez@amd.com            uint64_t address = this->addr.calcUniform();
20011534Sjohn.kalamatianos@amd.com            for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
20111308Santhony.gutierrez@amd.com                if (mask[lane]) {
20211308Santhony.gutierrez@amd.com                    MemCType val = w->readCallArgMem<MemCType>(lane, address);
20311308Santhony.gutierrez@amd.com
20411308Santhony.gutierrez@amd.com                    DPRINTF(HSAIL, "ld_arg [%d] -> %llu\n", address,
20511308Santhony.gutierrez@amd.com                            (unsigned long long)val);
20611308Santhony.gutierrez@amd.com
20711308Santhony.gutierrez@amd.com                    this->dest.set(w, lane, val);
20811308Santhony.gutierrez@amd.com                }
20911308Santhony.gutierrez@amd.com            }
21011308Santhony.gutierrez@amd.com
21111308Santhony.gutierrez@amd.com            return;
21211308Santhony.gutierrez@amd.com        }
21311308Santhony.gutierrez@amd.com
21411308Santhony.gutierrez@amd.com        GPUDynInstPtr m = gpuDynInst;
21511308Santhony.gutierrez@amd.com
21611308Santhony.gutierrez@amd.com        this->addr.calcVector(w, m->addr);
21711308Santhony.gutierrez@amd.com
21811308Santhony.gutierrez@amd.com        m->m_op = Enums::MO_LD;
21911308Santhony.gutierrez@amd.com        m->m_type = MemDataType::memType;
22011308Santhony.gutierrez@amd.com        m->v_type = DestDataType::vgprType;
22111308Santhony.gutierrez@amd.com
22211308Santhony.gutierrez@amd.com        m->exec_mask = w->execMask();
22311308Santhony.gutierrez@amd.com        m->statusBitVector = 0;
22411308Santhony.gutierrez@amd.com        m->equiv = this->equivClass;
22511308Santhony.gutierrez@amd.com        m->memoryOrder = getGenericMemoryOrder(this->memoryOrder);
22611308Santhony.gutierrez@amd.com
22711308Santhony.gutierrez@amd.com        m->scope = getGenericMemoryScope(this->memoryScope);
22811308Santhony.gutierrez@amd.com
22911308Santhony.gutierrez@amd.com        if (num_dest_operands == 1) {
23011308Santhony.gutierrez@amd.com            m->dst_reg = this->dest.regIndex();
23111308Santhony.gutierrez@amd.com            m->n_reg = 1;
23211308Santhony.gutierrez@amd.com        } else {
23311308Santhony.gutierrez@amd.com            m->n_reg = num_dest_operands;
23411308Santhony.gutierrez@amd.com            for (int i = 0; i < num_dest_operands; ++i) {
23511308Santhony.gutierrez@amd.com                m->dst_reg_vec[i] = this->dest_vect[i].regIndex();
23611308Santhony.gutierrez@amd.com            }
23711308Santhony.gutierrez@amd.com        }
23811308Santhony.gutierrez@amd.com
23911308Santhony.gutierrez@amd.com        m->simdId = w->simdId;
24011308Santhony.gutierrez@amd.com        m->wfSlotId = w->wfSlotId;
24111308Santhony.gutierrez@amd.com        m->wfDynId = w->wfDynId;
24211639Salexandru.dutu@amd.com        m->kern_id = w->kernId;
24311308Santhony.gutierrez@amd.com        m->cu_id = w->computeUnit->cu_id;
24411308Santhony.gutierrez@amd.com        m->latency.init(&w->computeUnit->shader->tick_cnt);
24511308Santhony.gutierrez@amd.com
24611308Santhony.gutierrez@amd.com        switch (this->segment) {
24711308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_GLOBAL:
24811308Santhony.gutierrez@amd.com            m->s_type = SEG_GLOBAL;
24911308Santhony.gutierrez@amd.com            m->pipeId = GLBMEM_PIPE;
25011308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(1));
25111308Santhony.gutierrez@amd.com
25211308Santhony.gutierrez@amd.com            // this is a complete hack to get around a compiler bug
25311308Santhony.gutierrez@amd.com            // (the compiler currently generates global access for private
25411308Santhony.gutierrez@amd.com            //  addresses (starting from 0). We need to add the private offset)
25511534Sjohn.kalamatianos@amd.com            for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
25611308Santhony.gutierrez@amd.com                if (m->addr[lane] < w->privSizePerItem) {
25711308Santhony.gutierrez@amd.com                    if (mask[lane]) {
25811308Santhony.gutierrez@amd.com                        // what is the size of the object we are accessing?
25911308Santhony.gutierrez@amd.com                        // find base for for this wavefront
26011308Santhony.gutierrez@amd.com
26111308Santhony.gutierrez@amd.com                        // calcPrivAddr will fail if accesses are unaligned
26211308Santhony.gutierrez@amd.com                        assert(!((sizeof(MemCType) - 1) & m->addr[lane]));
26311308Santhony.gutierrez@amd.com
26411308Santhony.gutierrez@amd.com                        Addr privAddr = calcPrivAddr(m->addr[lane], w, lane,
26511308Santhony.gutierrez@amd.com                                                     this);
26611308Santhony.gutierrez@amd.com
26711308Santhony.gutierrez@amd.com                        m->addr[lane] = privAddr;
26811308Santhony.gutierrez@amd.com                    }
26911308Santhony.gutierrez@amd.com                }
27011308Santhony.gutierrez@amd.com            }
27111308Santhony.gutierrez@amd.com
27211308Santhony.gutierrez@amd.com            w->computeUnit->globalMemoryPipe.getGMReqFIFO().push(m);
27311639Salexandru.dutu@amd.com            w->outstandingReqsRdGm++;
27411639Salexandru.dutu@amd.com            w->rdGmReqsInPipe--;
27511308Santhony.gutierrez@amd.com            break;
27611308Santhony.gutierrez@amd.com
27711308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_SPILL:
27811308Santhony.gutierrez@amd.com            assert(num_dest_operands == 1);
27911308Santhony.gutierrez@amd.com            m->s_type = SEG_SPILL;
28011308Santhony.gutierrez@amd.com            m->pipeId = GLBMEM_PIPE;
28111308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(1));
28211308Santhony.gutierrez@amd.com            {
28311534Sjohn.kalamatianos@amd.com                for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
28411308Santhony.gutierrez@amd.com                    //  note: this calculation will NOT WORK if the compiler
28511308Santhony.gutierrez@amd.com                    //  ever generates loads/stores to the same address with
28611308Santhony.gutierrez@amd.com                    //  different widths (e.g., a ld_u32 addr and a ld_u16 addr)
28711308Santhony.gutierrez@amd.com                    if (mask[lane]) {
28811308Santhony.gutierrez@amd.com                        assert(m->addr[lane] < w->spillSizePerItem);
28911308Santhony.gutierrez@amd.com
29011308Santhony.gutierrez@amd.com                        m->addr[lane] = m->addr[lane] * w->spillWidth +
29111308Santhony.gutierrez@amd.com                                        lane * sizeof(MemCType) + w->spillBase;
29211308Santhony.gutierrez@amd.com
29311639Salexandru.dutu@amd.com                        w->lastAddr[lane] = m->addr[lane];
29411308Santhony.gutierrez@amd.com                    }
29511308Santhony.gutierrez@amd.com                }
29611308Santhony.gutierrez@amd.com            }
29711308Santhony.gutierrez@amd.com
29811308Santhony.gutierrez@amd.com            w->computeUnit->globalMemoryPipe.getGMReqFIFO().push(m);
29911639Salexandru.dutu@amd.com            w->outstandingReqsRdGm++;
30011639Salexandru.dutu@amd.com            w->rdGmReqsInPipe--;
30111308Santhony.gutierrez@amd.com            break;
30211308Santhony.gutierrez@amd.com
30311308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_GROUP:
30411308Santhony.gutierrez@amd.com            m->s_type = SEG_SHARED;
30511308Santhony.gutierrez@amd.com            m->pipeId = LDSMEM_PIPE;
30611308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(24));
30711308Santhony.gutierrez@amd.com            w->computeUnit->localMemoryPipe.getLMReqFIFO().push(m);
30811639Salexandru.dutu@amd.com            w->outstandingReqsRdLm++;
30911639Salexandru.dutu@amd.com            w->rdLmReqsInPipe--;
31011308Santhony.gutierrez@amd.com            break;
31111308Santhony.gutierrez@amd.com
31211308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_READONLY:
31311308Santhony.gutierrez@amd.com            m->s_type = SEG_READONLY;
31411308Santhony.gutierrez@amd.com            m->pipeId = GLBMEM_PIPE;
31511308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(1));
31611308Santhony.gutierrez@amd.com
31711534Sjohn.kalamatianos@amd.com            for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
31811308Santhony.gutierrez@amd.com                if (mask[lane]) {
31911308Santhony.gutierrez@amd.com                    assert(m->addr[lane] + sizeof(MemCType) <= w->roSize);
32011308Santhony.gutierrez@amd.com                    m->addr[lane] += w->roBase;
32111308Santhony.gutierrez@amd.com                }
32211308Santhony.gutierrez@amd.com            }
32311308Santhony.gutierrez@amd.com
32411308Santhony.gutierrez@amd.com            w->computeUnit->globalMemoryPipe.getGMReqFIFO().push(m);
32511639Salexandru.dutu@amd.com            w->outstandingReqsRdGm++;
32611639Salexandru.dutu@amd.com            w->rdGmReqsInPipe--;
32711308Santhony.gutierrez@amd.com            break;
32811308Santhony.gutierrez@amd.com
32911308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_PRIVATE:
33011308Santhony.gutierrez@amd.com            m->s_type = SEG_PRIVATE;
33111308Santhony.gutierrez@amd.com            m->pipeId = GLBMEM_PIPE;
33211308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(1));
33311308Santhony.gutierrez@amd.com            {
33411534Sjohn.kalamatianos@amd.com                for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
33511308Santhony.gutierrez@amd.com                    if (mask[lane]) {
33611308Santhony.gutierrez@amd.com                        assert(m->addr[lane] < w->privSizePerItem);
33711308Santhony.gutierrez@amd.com
33811308Santhony.gutierrez@amd.com                        m->addr[lane] = m->addr[lane] +
33911308Santhony.gutierrez@amd.com                            lane * sizeof(MemCType) + w->privBase;
34011308Santhony.gutierrez@amd.com                    }
34111308Santhony.gutierrez@amd.com                }
34211308Santhony.gutierrez@amd.com            }
34311308Santhony.gutierrez@amd.com            w->computeUnit->globalMemoryPipe.getGMReqFIFO().push(m);
34411639Salexandru.dutu@amd.com            w->outstandingReqsRdGm++;
34511639Salexandru.dutu@amd.com            w->rdGmReqsInPipe--;
34611308Santhony.gutierrez@amd.com            break;
34711308Santhony.gutierrez@amd.com
34811308Santhony.gutierrez@amd.com          default:
34911308Santhony.gutierrez@amd.com            fatal("Load to unsupported segment %d %llxe\n", this->segment,
35011308Santhony.gutierrez@amd.com                  m->addr[0]);
35111308Santhony.gutierrez@amd.com        }
35211308Santhony.gutierrez@amd.com
35311639Salexandru.dutu@amd.com        w->outstandingReqs++;
35411639Salexandru.dutu@amd.com        w->memReqsInPipe--;
35511308Santhony.gutierrez@amd.com    }
35611308Santhony.gutierrez@amd.com
35711308Santhony.gutierrez@amd.com    template<typename OperationType, typename SrcDataType,
35811308Santhony.gutierrez@amd.com             typename AddrRegOperandType>
35911308Santhony.gutierrez@amd.com    void
36011308Santhony.gutierrez@amd.com    StInst<OperationType, SrcDataType,
36111308Santhony.gutierrez@amd.com           AddrRegOperandType>::execute(GPUDynInstPtr gpuDynInst)
36211308Santhony.gutierrez@amd.com    {
36311308Santhony.gutierrez@amd.com        Wavefront *w = gpuDynInst->wavefront();
36411308Santhony.gutierrez@amd.com
36511308Santhony.gutierrez@amd.com        typedef typename OperationType::CType CType;
36611308Santhony.gutierrez@amd.com
36711639Salexandru.dutu@amd.com        const VectorMask &mask = w->getPred();
36811308Santhony.gutierrez@amd.com
36911308Santhony.gutierrez@amd.com        // arg references are handled uniquely for now (no Memory Request
37011308Santhony.gutierrez@amd.com        // is used), so special-case them up front.  Someday we should
37111308Santhony.gutierrez@amd.com        // make this more realistic, at which we should get rid of this
37211308Santhony.gutierrez@amd.com        // block and fold this case into the switch below.
37311308Santhony.gutierrez@amd.com        if (this->segment == Brig::BRIG_SEGMENT_ARG) {
37411308Santhony.gutierrez@amd.com            uint64_t address = this->addr.calcUniform();
37511308Santhony.gutierrez@amd.com
37611534Sjohn.kalamatianos@amd.com            for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
37711308Santhony.gutierrez@amd.com                if (mask[lane]) {
37811308Santhony.gutierrez@amd.com                    CType data = this->src.template get<CType>(w, lane);
37911308Santhony.gutierrez@amd.com                    DPRINTF(HSAIL, "st_arg [%d] <- %d\n", address, data);
38011308Santhony.gutierrez@amd.com                    w->writeCallArgMem<CType>(lane, address, data);
38111308Santhony.gutierrez@amd.com                }
38211308Santhony.gutierrez@amd.com            }
38311308Santhony.gutierrez@amd.com
38411308Santhony.gutierrez@amd.com            return;
38511308Santhony.gutierrez@amd.com        }
38611308Santhony.gutierrez@amd.com
38711308Santhony.gutierrez@amd.com        GPUDynInstPtr m = gpuDynInst;
38811308Santhony.gutierrez@amd.com
38911308Santhony.gutierrez@amd.com        m->exec_mask = w->execMask();
39011308Santhony.gutierrez@amd.com
39111308Santhony.gutierrez@amd.com        this->addr.calcVector(w, m->addr);
39211308Santhony.gutierrez@amd.com
39311308Santhony.gutierrez@amd.com        if (num_src_operands == 1) {
39411534Sjohn.kalamatianos@amd.com            for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
39511308Santhony.gutierrez@amd.com                if (mask[lane]) {
39611308Santhony.gutierrez@amd.com                    ((CType*)m->d_data)[lane] =
39711308Santhony.gutierrez@amd.com                        this->src.template get<CType>(w, lane);
39811308Santhony.gutierrez@amd.com                }
39911308Santhony.gutierrez@amd.com            }
40011308Santhony.gutierrez@amd.com        } else {
40111308Santhony.gutierrez@amd.com            for (int k= 0; k < num_src_operands; ++k) {
40211534Sjohn.kalamatianos@amd.com                for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
40311308Santhony.gutierrez@amd.com                    if (mask[lane]) {
40411534Sjohn.kalamatianos@amd.com                        ((CType*)m->d_data)[k * w->computeUnit->wfSize() + lane] =
40511308Santhony.gutierrez@amd.com                            this->src_vect[k].template get<CType>(w, lane);
40611308Santhony.gutierrez@amd.com                    }
40711308Santhony.gutierrez@amd.com                }
40811308Santhony.gutierrez@amd.com            }
40911308Santhony.gutierrez@amd.com        }
41011308Santhony.gutierrez@amd.com
41111308Santhony.gutierrez@amd.com        m->m_op = Enums::MO_ST;
41211308Santhony.gutierrez@amd.com        m->m_type = OperationType::memType;
41311308Santhony.gutierrez@amd.com        m->v_type = OperationType::vgprType;
41411308Santhony.gutierrez@amd.com
41511308Santhony.gutierrez@amd.com        m->statusBitVector = 0;
41611308Santhony.gutierrez@amd.com        m->equiv = this->equivClass;
41711308Santhony.gutierrez@amd.com
41811308Santhony.gutierrez@amd.com        if (num_src_operands == 1) {
41911308Santhony.gutierrez@amd.com            m->n_reg = 1;
42011308Santhony.gutierrez@amd.com        } else {
42111308Santhony.gutierrez@amd.com            m->n_reg = num_src_operands;
42211308Santhony.gutierrez@amd.com        }
42311308Santhony.gutierrez@amd.com
42411308Santhony.gutierrez@amd.com        m->memoryOrder = getGenericMemoryOrder(this->memoryOrder);
42511308Santhony.gutierrez@amd.com
42611308Santhony.gutierrez@amd.com        m->scope = getGenericMemoryScope(this->memoryScope);
42711308Santhony.gutierrez@amd.com
42811308Santhony.gutierrez@amd.com        m->simdId = w->simdId;
42911308Santhony.gutierrez@amd.com        m->wfSlotId = w->wfSlotId;
43011308Santhony.gutierrez@amd.com        m->wfDynId = w->wfDynId;
43111639Salexandru.dutu@amd.com        m->kern_id = w->kernId;
43211308Santhony.gutierrez@amd.com        m->cu_id = w->computeUnit->cu_id;
43311308Santhony.gutierrez@amd.com        m->latency.init(&w->computeUnit->shader->tick_cnt);
43411308Santhony.gutierrez@amd.com
43511308Santhony.gutierrez@amd.com        switch (this->segment) {
43611308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_GLOBAL:
43711308Santhony.gutierrez@amd.com            m->s_type = SEG_GLOBAL;
43811308Santhony.gutierrez@amd.com            m->pipeId = GLBMEM_PIPE;
43911308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(1));
44011308Santhony.gutierrez@amd.com
44111308Santhony.gutierrez@amd.com            // this is a complete hack to get around a compiler bug
44211308Santhony.gutierrez@amd.com            // (the compiler currently generates global access for private
44311308Santhony.gutierrez@amd.com            //  addresses (starting from 0). We need to add the private offset)
44411534Sjohn.kalamatianos@amd.com            for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
44511308Santhony.gutierrez@amd.com                if (mask[lane]) {
44611308Santhony.gutierrez@amd.com                    if (m->addr[lane] < w->privSizePerItem) {
44711308Santhony.gutierrez@amd.com
44811308Santhony.gutierrez@amd.com                        // calcPrivAddr will fail if accesses are unaligned
44911308Santhony.gutierrez@amd.com                        assert(!((sizeof(CType)-1) & m->addr[lane]));
45011308Santhony.gutierrez@amd.com
45111308Santhony.gutierrez@amd.com                        Addr privAddr = calcPrivAddr(m->addr[lane], w, lane,
45211308Santhony.gutierrez@amd.com                                                     this);
45311308Santhony.gutierrez@amd.com
45411308Santhony.gutierrez@amd.com                        m->addr[lane] = privAddr;
45511308Santhony.gutierrez@amd.com                    }
45611308Santhony.gutierrez@amd.com                }
45711308Santhony.gutierrez@amd.com            }
45811308Santhony.gutierrez@amd.com
45911308Santhony.gutierrez@amd.com            w->computeUnit->globalMemoryPipe.getGMReqFIFO().push(m);
46011639Salexandru.dutu@amd.com            w->outstandingReqsWrGm++;
46111639Salexandru.dutu@amd.com            w->wrGmReqsInPipe--;
46211308Santhony.gutierrez@amd.com            break;
46311308Santhony.gutierrez@amd.com
46411308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_SPILL:
46511308Santhony.gutierrez@amd.com            assert(num_src_operands == 1);
46611308Santhony.gutierrez@amd.com            m->s_type = SEG_SPILL;
46711308Santhony.gutierrez@amd.com            m->pipeId = GLBMEM_PIPE;
46811308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(1));
46911308Santhony.gutierrez@amd.com            {
47011534Sjohn.kalamatianos@amd.com                for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
47111308Santhony.gutierrez@amd.com                    if (mask[lane]) {
47211308Santhony.gutierrez@amd.com                        assert(m->addr[lane] < w->spillSizePerItem);
47311308Santhony.gutierrez@amd.com
47411308Santhony.gutierrez@amd.com                        m->addr[lane] = m->addr[lane] * w->spillWidth +
47511308Santhony.gutierrez@amd.com                                        lane * sizeof(CType) + w->spillBase;
47611308Santhony.gutierrez@amd.com                    }
47711308Santhony.gutierrez@amd.com                }
47811308Santhony.gutierrez@amd.com            }
47911308Santhony.gutierrez@amd.com
48011308Santhony.gutierrez@amd.com            w->computeUnit->globalMemoryPipe.getGMReqFIFO().push(m);
48111639Salexandru.dutu@amd.com            w->outstandingReqsWrGm++;
48211639Salexandru.dutu@amd.com            w->wrGmReqsInPipe--;
48311308Santhony.gutierrez@amd.com            break;
48411308Santhony.gutierrez@amd.com
48511308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_GROUP:
48611308Santhony.gutierrez@amd.com            m->s_type = SEG_SHARED;
48711308Santhony.gutierrez@amd.com            m->pipeId = LDSMEM_PIPE;
48811308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(24));
48911308Santhony.gutierrez@amd.com            w->computeUnit->localMemoryPipe.getLMReqFIFO().push(m);
49011639Salexandru.dutu@amd.com            w->outstandingReqsWrLm++;
49111639Salexandru.dutu@amd.com            w->wrLmReqsInPipe--;
49211308Santhony.gutierrez@amd.com            break;
49311308Santhony.gutierrez@amd.com
49411308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_PRIVATE:
49511308Santhony.gutierrez@amd.com            m->s_type = SEG_PRIVATE;
49611308Santhony.gutierrez@amd.com            m->pipeId = GLBMEM_PIPE;
49711308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(1));
49811308Santhony.gutierrez@amd.com            {
49911534Sjohn.kalamatianos@amd.com                for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
50011308Santhony.gutierrez@amd.com                    if (mask[lane]) {
50111308Santhony.gutierrez@amd.com                        assert(m->addr[lane] < w->privSizePerItem);
50211308Santhony.gutierrez@amd.com                        m->addr[lane] = m->addr[lane] + lane *
50311308Santhony.gutierrez@amd.com                            sizeof(CType)+w->privBase;
50411308Santhony.gutierrez@amd.com                    }
50511308Santhony.gutierrez@amd.com                }
50611308Santhony.gutierrez@amd.com            }
50711308Santhony.gutierrez@amd.com
50811308Santhony.gutierrez@amd.com            w->computeUnit->globalMemoryPipe.getGMReqFIFO().push(m);
50911639Salexandru.dutu@amd.com            w->outstandingReqsWrGm++;
51011639Salexandru.dutu@amd.com            w->wrGmReqsInPipe--;
51111308Santhony.gutierrez@amd.com            break;
51211308Santhony.gutierrez@amd.com
51311308Santhony.gutierrez@amd.com          default:
51411308Santhony.gutierrez@amd.com            fatal("Store to unsupported segment %d\n", this->segment);
51511308Santhony.gutierrez@amd.com        }
51611308Santhony.gutierrez@amd.com
51711639Salexandru.dutu@amd.com        w->outstandingReqs++;
51811639Salexandru.dutu@amd.com        w->memReqsInPipe--;
51911308Santhony.gutierrez@amd.com    }
52011308Santhony.gutierrez@amd.com
52111308Santhony.gutierrez@amd.com    template<typename OperationType, typename SrcDataType,
52211308Santhony.gutierrez@amd.com             typename AddrRegOperandType>
52311308Santhony.gutierrez@amd.com    void
52411308Santhony.gutierrez@amd.com    StInst<OperationType, SrcDataType,
52511308Santhony.gutierrez@amd.com           AddrRegOperandType>::generateDisassembly()
52611308Santhony.gutierrez@amd.com    {
52711308Santhony.gutierrez@amd.com        switch (num_src_operands) {
52811308Santhony.gutierrez@amd.com          case 1:
52911308Santhony.gutierrez@amd.com            this->disassembly = csprintf("%s_%s_%s %s,%s", this->opcode,
53011308Santhony.gutierrez@amd.com                                         segmentNames[this->segment],
53111308Santhony.gutierrez@amd.com                                         OperationType::label,
53211308Santhony.gutierrez@amd.com                                         this->src.disassemble(),
53311308Santhony.gutierrez@amd.com                                         this->addr.disassemble());
53411308Santhony.gutierrez@amd.com            break;
53511308Santhony.gutierrez@amd.com          case 2:
53611308Santhony.gutierrez@amd.com            this->disassembly = csprintf("%s_%s_%s (%s,%s), %s", this->opcode,
53711308Santhony.gutierrez@amd.com                                         segmentNames[this->segment],
53811308Santhony.gutierrez@amd.com                                         OperationType::label,
53911308Santhony.gutierrez@amd.com                                         this->src_vect[0].disassemble(),
54011308Santhony.gutierrez@amd.com                                         this->src_vect[1].disassemble(),
54111308Santhony.gutierrez@amd.com                                         this->addr.disassemble());
54211308Santhony.gutierrez@amd.com            break;
54311308Santhony.gutierrez@amd.com          case 4:
54411308Santhony.gutierrez@amd.com            this->disassembly = csprintf("%s_%s_%s (%s,%s,%s,%s), %s",
54511308Santhony.gutierrez@amd.com                                         this->opcode,
54611308Santhony.gutierrez@amd.com                                         segmentNames[this->segment],
54711308Santhony.gutierrez@amd.com                                         OperationType::label,
54811308Santhony.gutierrez@amd.com                                         this->src_vect[0].disassemble(),
54911308Santhony.gutierrez@amd.com                                         this->src_vect[1].disassemble(),
55011308Santhony.gutierrez@amd.com                                         this->src_vect[2].disassemble(),
55111308Santhony.gutierrez@amd.com                                         this->src_vect[3].disassemble(),
55211308Santhony.gutierrez@amd.com                                         this->addr.disassemble());
55311308Santhony.gutierrez@amd.com            break;
55411308Santhony.gutierrez@amd.com          default: fatal("Bad ld register src operand, num vector operands: "
55511308Santhony.gutierrez@amd.com                         "%d \n", num_src_operands);
55611308Santhony.gutierrez@amd.com            break;
55711308Santhony.gutierrez@amd.com        }
55811308Santhony.gutierrez@amd.com    }
55911308Santhony.gutierrez@amd.com
56011308Santhony.gutierrez@amd.com    template<typename DataType, typename AddrRegOperandType, int NumSrcOperands,
56111308Santhony.gutierrez@amd.com             bool HasDst>
56211308Santhony.gutierrez@amd.com    void
56311308Santhony.gutierrez@amd.com    AtomicInst<DataType, AddrRegOperandType, NumSrcOperands,
56411308Santhony.gutierrez@amd.com        HasDst>::execute(GPUDynInstPtr gpuDynInst)
56511308Santhony.gutierrez@amd.com    {
56611308Santhony.gutierrez@amd.com        typedef typename DataType::CType CType;
56711308Santhony.gutierrez@amd.com
56811308Santhony.gutierrez@amd.com        Wavefront *w = gpuDynInst->wavefront();
56911308Santhony.gutierrez@amd.com
57011308Santhony.gutierrez@amd.com        GPUDynInstPtr m = gpuDynInst;
57111308Santhony.gutierrez@amd.com
57211308Santhony.gutierrez@amd.com        this->addr.calcVector(w, m->addr);
57311308Santhony.gutierrez@amd.com
57411534Sjohn.kalamatianos@amd.com        for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
57511308Santhony.gutierrez@amd.com            ((CType *)m->a_data)[lane] =
57611308Santhony.gutierrez@amd.com                this->src[0].template get<CType>(w, lane);
57711308Santhony.gutierrez@amd.com        }
57811308Santhony.gutierrez@amd.com
57911308Santhony.gutierrez@amd.com        // load second source operand for CAS
58011308Santhony.gutierrez@amd.com        if (NumSrcOperands > 1) {
58111534Sjohn.kalamatianos@amd.com            for (int lane = 0; lane < w->computeUnit->wfSize(); ++lane) {
58211308Santhony.gutierrez@amd.com                ((CType*)m->x_data)[lane] =
58311308Santhony.gutierrez@amd.com                    this->src[1].template get<CType>(w, lane);
58411308Santhony.gutierrez@amd.com            }
58511308Santhony.gutierrez@amd.com        }
58611308Santhony.gutierrez@amd.com
58711308Santhony.gutierrez@amd.com        assert(NumSrcOperands <= 2);
58811308Santhony.gutierrez@amd.com
58911308Santhony.gutierrez@amd.com        m->m_op = this->opType;
59011308Santhony.gutierrez@amd.com        m->m_type = DataType::memType;
59111308Santhony.gutierrez@amd.com        m->v_type = DataType::vgprType;
59211308Santhony.gutierrez@amd.com
59311308Santhony.gutierrez@amd.com        m->exec_mask = w->execMask();
59411308Santhony.gutierrez@amd.com        m->statusBitVector = 0;
59511308Santhony.gutierrez@amd.com        m->equiv = 0;  // atomics don't have an equivalence class operand
59611308Santhony.gutierrez@amd.com        m->n_reg = 1;
59711308Santhony.gutierrez@amd.com        m->memoryOrder = getGenericMemoryOrder(this->memoryOrder);
59811308Santhony.gutierrez@amd.com
59911308Santhony.gutierrez@amd.com        m->scope = getGenericMemoryScope(this->memoryScope);
60011308Santhony.gutierrez@amd.com
60111308Santhony.gutierrez@amd.com        if (HasDst) {
60211308Santhony.gutierrez@amd.com            m->dst_reg = this->dest.regIndex();
60311308Santhony.gutierrez@amd.com        }
60411308Santhony.gutierrez@amd.com
60511308Santhony.gutierrez@amd.com        m->simdId = w->simdId;
60611308Santhony.gutierrez@amd.com        m->wfSlotId = w->wfSlotId;
60711308Santhony.gutierrez@amd.com        m->wfDynId = w->wfDynId;
60811639Salexandru.dutu@amd.com        m->kern_id = w->kernId;
60911308Santhony.gutierrez@amd.com        m->cu_id = w->computeUnit->cu_id;
61011308Santhony.gutierrez@amd.com        m->latency.init(&w->computeUnit->shader->tick_cnt);
61111308Santhony.gutierrez@amd.com
61211308Santhony.gutierrez@amd.com        switch (this->segment) {
61311308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_GLOBAL:
61411308Santhony.gutierrez@amd.com            m->s_type = SEG_GLOBAL;
61511308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(64));
61611308Santhony.gutierrez@amd.com            m->pipeId = GLBMEM_PIPE;
61711308Santhony.gutierrez@amd.com
61811308Santhony.gutierrez@amd.com            w->computeUnit->globalMemoryPipe.getGMReqFIFO().push(m);
61911639Salexandru.dutu@amd.com            w->outstandingReqsWrGm++;
62011639Salexandru.dutu@amd.com            w->wrGmReqsInPipe--;
62111639Salexandru.dutu@amd.com            w->outstandingReqsRdGm++;
62211639Salexandru.dutu@amd.com            w->rdGmReqsInPipe--;
62311308Santhony.gutierrez@amd.com            break;
62411308Santhony.gutierrez@amd.com
62511308Santhony.gutierrez@amd.com          case Brig::BRIG_SEGMENT_GROUP:
62611308Santhony.gutierrez@amd.com            m->s_type = SEG_SHARED;
62711308Santhony.gutierrez@amd.com            m->pipeId = LDSMEM_PIPE;
62811308Santhony.gutierrez@amd.com            m->latency.set(w->computeUnit->shader->ticks(24));
62911308Santhony.gutierrez@amd.com            w->computeUnit->localMemoryPipe.getLMReqFIFO().push(m);
63011639Salexandru.dutu@amd.com            w->outstandingReqsWrLm++;
63111639Salexandru.dutu@amd.com            w->wrLmReqsInPipe--;
63211639Salexandru.dutu@amd.com            w->outstandingReqsRdLm++;
63311639Salexandru.dutu@amd.com            w->rdLmReqsInPipe--;
63411308Santhony.gutierrez@amd.com            break;
63511308Santhony.gutierrez@amd.com
63611308Santhony.gutierrez@amd.com          default:
63711308Santhony.gutierrez@amd.com            fatal("Atomic op to unsupported segment %d\n",
63811308Santhony.gutierrez@amd.com                  this->segment);
63911308Santhony.gutierrez@amd.com        }
64011308Santhony.gutierrez@amd.com
64111639Salexandru.dutu@amd.com        w->outstandingReqs++;
64211639Salexandru.dutu@amd.com        w->memReqsInPipe--;
64311308Santhony.gutierrez@amd.com    }
64411308Santhony.gutierrez@amd.com
64511308Santhony.gutierrez@amd.com    const char* atomicOpToString(Brig::BrigAtomicOperation atomicOp);
64611308Santhony.gutierrez@amd.com
64711308Santhony.gutierrez@amd.com    template<typename DataType, typename AddrRegOperandType, int NumSrcOperands,
64811308Santhony.gutierrez@amd.com             bool HasDst>
64911308Santhony.gutierrez@amd.com    void
65011308Santhony.gutierrez@amd.com    AtomicInst<DataType, AddrRegOperandType, NumSrcOperands,
65111308Santhony.gutierrez@amd.com               HasDst>::generateDisassembly()
65211308Santhony.gutierrez@amd.com    {
65311308Santhony.gutierrez@amd.com        if (HasDst) {
65411308Santhony.gutierrez@amd.com            this->disassembly =
65511308Santhony.gutierrez@amd.com                csprintf("%s_%s_%s_%s %s,%s", this->opcode,
65611308Santhony.gutierrez@amd.com                         atomicOpToString(this->atomicOperation),
65711308Santhony.gutierrez@amd.com                         segmentNames[this->segment],
65811308Santhony.gutierrez@amd.com                         DataType::label, this->dest.disassemble(),
65911308Santhony.gutierrez@amd.com                         this->addr.disassemble());
66011308Santhony.gutierrez@amd.com        } else {
66111308Santhony.gutierrez@amd.com            this->disassembly =
66211308Santhony.gutierrez@amd.com                csprintf("%s_%s_%s_%s %s", this->opcode,
66311308Santhony.gutierrez@amd.com                         atomicOpToString(this->atomicOperation),
66411308Santhony.gutierrez@amd.com                         segmentNames[this->segment],
66511308Santhony.gutierrez@amd.com                         DataType::label, this->addr.disassemble());
66611308Santhony.gutierrez@amd.com        }
66711308Santhony.gutierrez@amd.com
66811308Santhony.gutierrez@amd.com        for (int i = 0; i < NumSrcOperands; ++i) {
66911308Santhony.gutierrez@amd.com            this->disassembly += ",";
67011308Santhony.gutierrez@amd.com            this->disassembly += this->src[i].disassemble();
67111308Santhony.gutierrez@amd.com        }
67211308Santhony.gutierrez@amd.com    }
67311308Santhony.gutierrez@amd.com} // namespace HsailISA
674