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