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#ifndef __HSAIL_CODE_HH__ 3711308Santhony.gutierrez@amd.com#define __HSAIL_CODE_HH__ 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.com#include <cassert> 4011308Santhony.gutierrez@amd.com#include <list> 4111308Santhony.gutierrez@amd.com#include <map> 4211308Santhony.gutierrez@amd.com#include <string> 4311308Santhony.gutierrez@amd.com#include <vector> 4411308Santhony.gutierrez@amd.com 4511308Santhony.gutierrez@amd.com#include "arch/gpu_decoder.hh" 4611308Santhony.gutierrez@amd.com#include "arch/hsail/Brig.h" 4711308Santhony.gutierrez@amd.com#include "base/addr_range_map.hh" 4811308Santhony.gutierrez@amd.com#include "base/intmath.hh" 4911308Santhony.gutierrez@amd.com#include "config/the_gpu_isa.hh" 5011308Santhony.gutierrez@amd.com#include "gpu-compute/hsa_code.hh" 5111308Santhony.gutierrez@amd.com#include "gpu-compute/hsa_kernel_info.hh" 5211308Santhony.gutierrez@amd.com#include "gpu-compute/misc.hh" 5311308Santhony.gutierrez@amd.com 5411308Santhony.gutierrez@amd.comclass BrigObject; 5511308Santhony.gutierrez@amd.comclass GPUStaticInst; 5611308Santhony.gutierrez@amd.com 5711308Santhony.gutierrez@amd.cominline int 5811308Santhony.gutierrez@amd.compopcount(uint64_t src, int sz) 5911308Santhony.gutierrez@amd.com{ 6011308Santhony.gutierrez@amd.com int cnt = 0; 6111308Santhony.gutierrez@amd.com 6211308Santhony.gutierrez@amd.com for (int i = 0; i < sz; ++i) { 6311308Santhony.gutierrez@amd.com if (src & 1) 6411308Santhony.gutierrez@amd.com ++cnt; 6511308Santhony.gutierrez@amd.com src >>= 1; 6611308Santhony.gutierrez@amd.com } 6711308Santhony.gutierrez@amd.com 6811308Santhony.gutierrez@amd.com return cnt; 6911308Santhony.gutierrez@amd.com} 7011308Santhony.gutierrez@amd.com 7111308Santhony.gutierrez@amd.cominline int 7211308Santhony.gutierrez@amd.comfirstbit(uint64_t src, int sz) 7311308Santhony.gutierrez@amd.com{ 7411308Santhony.gutierrez@amd.com int i; 7511308Santhony.gutierrez@amd.com 7611308Santhony.gutierrez@amd.com for (i = 0; i < sz; ++i) { 7711308Santhony.gutierrez@amd.com if (src & 1) 7811308Santhony.gutierrez@amd.com break; 7911308Santhony.gutierrez@amd.com src >>= 1; 8011308Santhony.gutierrez@amd.com } 8111308Santhony.gutierrez@amd.com 8211308Santhony.gutierrez@amd.com return i; 8311308Santhony.gutierrez@amd.com} 8411308Santhony.gutierrez@amd.com 8511308Santhony.gutierrez@amd.cominline int 8611308Santhony.gutierrez@amd.comlastbit(uint64_t src, int sz) 8711308Santhony.gutierrez@amd.com{ 8811308Santhony.gutierrez@amd.com int i0 = -1; 8911308Santhony.gutierrez@amd.com 9011308Santhony.gutierrez@amd.com for (int i = 0; i < sz; ++i) { 9111308Santhony.gutierrez@amd.com if (src & 1) 9211308Santhony.gutierrez@amd.com i0 = i; 9311308Santhony.gutierrez@amd.com src >>= 1; 9411308Santhony.gutierrez@amd.com } 9511308Santhony.gutierrez@amd.com 9611308Santhony.gutierrez@amd.com return i0; 9711308Santhony.gutierrez@amd.com} 9811308Santhony.gutierrez@amd.com 9911308Santhony.gutierrez@amd.cominline int 10011308Santhony.gutierrez@amd.comsignbit(uint64_t src, int sz) 10111308Santhony.gutierrez@amd.com{ 10211308Santhony.gutierrez@amd.com int i0 = -1; 10311308Santhony.gutierrez@amd.com 10411308Santhony.gutierrez@amd.com if (src & (1 << (sz - 1))) { 10511308Santhony.gutierrez@amd.com for (int i = 0; i < sz - 1; ++i) { 10611308Santhony.gutierrez@amd.com if (!(src & 1)) 10711308Santhony.gutierrez@amd.com i0 = i; 10811308Santhony.gutierrez@amd.com src >>= 1; 10911308Santhony.gutierrez@amd.com } 11011308Santhony.gutierrez@amd.com } else { 11111308Santhony.gutierrez@amd.com for (int i = 0; i < sz - 1; ++i) { 11211308Santhony.gutierrez@amd.com if (src & 1) 11311308Santhony.gutierrez@amd.com i0 = i; 11411308Santhony.gutierrez@amd.com src >>= 1; 11511308Santhony.gutierrez@amd.com } 11611308Santhony.gutierrez@amd.com } 11711308Santhony.gutierrez@amd.com 11811308Santhony.gutierrez@amd.com return i0; 11911308Santhony.gutierrez@amd.com} 12011308Santhony.gutierrez@amd.com 12111308Santhony.gutierrez@amd.cominline uint64_t 12211308Santhony.gutierrez@amd.combitrev(uint64_t src, int sz) 12311308Santhony.gutierrez@amd.com{ 12411308Santhony.gutierrez@amd.com uint64_t r = 0; 12511308Santhony.gutierrez@amd.com 12611308Santhony.gutierrez@amd.com for (int i = 0; i < sz; ++i) { 12711308Santhony.gutierrez@amd.com r <<= 1; 12811308Santhony.gutierrez@amd.com if (src & 1) 12911308Santhony.gutierrez@amd.com r |= 1; 13011308Santhony.gutierrez@amd.com src >>= 1; 13111308Santhony.gutierrez@amd.com } 13211308Santhony.gutierrez@amd.com 13311308Santhony.gutierrez@amd.com return r; 13411308Santhony.gutierrez@amd.com} 13511308Santhony.gutierrez@amd.com 13611308Santhony.gutierrez@amd.cominline uint64_t 13711308Santhony.gutierrez@amd.commul_hi(uint32_t a, uint32_t b) 13811308Santhony.gutierrez@amd.com{ 13911308Santhony.gutierrez@amd.com return ((uint64_t)a * (uint64_t)b) >> 32; 14011308Santhony.gutierrez@amd.com} 14111308Santhony.gutierrez@amd.com 14211308Santhony.gutierrez@amd.cominline uint64_t 14311308Santhony.gutierrez@amd.commul_hi(int32_t a, int32_t b) 14411308Santhony.gutierrez@amd.com{ 14511308Santhony.gutierrez@amd.com return ((int64_t)a * (int64_t)b) >> 32; 14611308Santhony.gutierrez@amd.com} 14711308Santhony.gutierrez@amd.com 14811308Santhony.gutierrez@amd.cominline uint64_t 14911308Santhony.gutierrez@amd.commul_hi(uint64_t a, uint64_t b) 15011308Santhony.gutierrez@amd.com{ 15111308Santhony.gutierrez@amd.com return ((uint64_t)a * (uint64_t)b) >> 32; 15211308Santhony.gutierrez@amd.com} 15311308Santhony.gutierrez@amd.com 15411308Santhony.gutierrez@amd.cominline uint64_t 15511308Santhony.gutierrez@amd.commul_hi(int64_t a, int64_t b) 15611308Santhony.gutierrez@amd.com{ 15711308Santhony.gutierrez@amd.com return ((int64_t)a * (int64_t)b) >> 32; 15811308Santhony.gutierrez@amd.com} 15911308Santhony.gutierrez@amd.com 16011308Santhony.gutierrez@amd.cominline uint64_t 16111308Santhony.gutierrez@amd.commul_hi(double a, double b) 16211308Santhony.gutierrez@amd.com{ 16311308Santhony.gutierrez@amd.com return 0; 16411308Santhony.gutierrez@amd.com} 16511308Santhony.gutierrez@amd.com 16611308Santhony.gutierrez@amd.comclass Label 16711308Santhony.gutierrez@amd.com{ 16811308Santhony.gutierrez@amd.com public: 16911308Santhony.gutierrez@amd.com std::string name; 17011308Santhony.gutierrez@amd.com int value; 17111308Santhony.gutierrez@amd.com 17211308Santhony.gutierrez@amd.com Label() : value(-1) 17311308Santhony.gutierrez@amd.com { 17411308Santhony.gutierrez@amd.com } 17511308Santhony.gutierrez@amd.com 17611308Santhony.gutierrez@amd.com bool defined() { return value != -1; } 17711308Santhony.gutierrez@amd.com 17811308Santhony.gutierrez@amd.com void 17911308Santhony.gutierrez@amd.com checkName(std::string &_name) 18011308Santhony.gutierrez@amd.com { 18111308Santhony.gutierrez@amd.com if (name.empty()) { 18211308Santhony.gutierrez@amd.com name = _name; 18311308Santhony.gutierrez@amd.com } else { 18411308Santhony.gutierrez@amd.com assert(name == _name); 18511308Santhony.gutierrez@amd.com } 18611308Santhony.gutierrez@amd.com } 18711308Santhony.gutierrez@amd.com 18811308Santhony.gutierrez@amd.com void 18911308Santhony.gutierrez@amd.com define(std::string &_name, int _value) 19011308Santhony.gutierrez@amd.com { 19111308Santhony.gutierrez@amd.com assert(!defined()); 19211308Santhony.gutierrez@amd.com assert(_value != -1); 19311308Santhony.gutierrez@amd.com value = _value; 19411308Santhony.gutierrez@amd.com checkName(_name); 19511308Santhony.gutierrez@amd.com } 19611308Santhony.gutierrez@amd.com 19711308Santhony.gutierrez@amd.com int 19811308Santhony.gutierrez@amd.com get() 19911308Santhony.gutierrez@amd.com { 20011308Santhony.gutierrez@amd.com assert(defined()); 20111308Santhony.gutierrez@amd.com return value; 20211308Santhony.gutierrez@amd.com } 20311308Santhony.gutierrez@amd.com}; 20411308Santhony.gutierrez@amd.com 20511308Santhony.gutierrez@amd.comclass LabelMap 20611308Santhony.gutierrez@amd.com{ 20711308Santhony.gutierrez@amd.com std::map<std::string, Label> map; 20811308Santhony.gutierrez@amd.com 20911308Santhony.gutierrez@amd.com public: 21011308Santhony.gutierrez@amd.com LabelMap() { } 21111308Santhony.gutierrez@amd.com 21211308Santhony.gutierrez@amd.com void addLabel(const Brig::BrigDirectiveLabel *lbl, int inst_index, 21311308Santhony.gutierrez@amd.com const BrigObject *obj); 21411308Santhony.gutierrez@amd.com 21511308Santhony.gutierrez@amd.com Label *refLabel(const Brig::BrigDirectiveLabel *lbl, 21611308Santhony.gutierrez@amd.com const BrigObject *obj); 21711308Santhony.gutierrez@amd.com}; 21811308Santhony.gutierrez@amd.com 21911308Santhony.gutierrez@amd.comconst int NumSegments = Brig::BRIG_SEGMENT_AMD_GCN; 22011308Santhony.gutierrez@amd.com 22111308Santhony.gutierrez@amd.comextern const char *segmentNames[]; 22211308Santhony.gutierrez@amd.com 22311308Santhony.gutierrez@amd.comclass StorageElement 22411308Santhony.gutierrez@amd.com{ 22511308Santhony.gutierrez@amd.com public: 22611308Santhony.gutierrez@amd.com std::string name; 22711308Santhony.gutierrez@amd.com uint64_t offset; 22811308Santhony.gutierrez@amd.com 22911308Santhony.gutierrez@amd.com uint64_t size; 23011308Santhony.gutierrez@amd.com const Brig::BrigDirectiveVariable *brigSymbol; 23111308Santhony.gutierrez@amd.com StorageElement(const char *_name, uint64_t _offset, int _size, 23211308Santhony.gutierrez@amd.com const Brig::BrigDirectiveVariable *sym) 23311308Santhony.gutierrez@amd.com : name(_name), offset(_offset), size(_size), brigSymbol(sym) 23411308Santhony.gutierrez@amd.com { 23511308Santhony.gutierrez@amd.com } 23611308Santhony.gutierrez@amd.com}; 23711308Santhony.gutierrez@amd.com 23811308Santhony.gutierrez@amd.comclass StorageSpace 23911308Santhony.gutierrez@amd.com{ 24011308Santhony.gutierrez@amd.com typedef std::map<const Brig::BrigDirectiveVariable*, StorageElement*> 24111308Santhony.gutierrez@amd.com DirVarToSE_map; 24211308Santhony.gutierrez@amd.com 24311308Santhony.gutierrez@amd.com std::list<StorageElement*> elements; 24411308Santhony.gutierrez@amd.com AddrRangeMap<StorageElement*> elements_by_addr; 24511308Santhony.gutierrez@amd.com DirVarToSE_map elements_by_brigptr; 24611308Santhony.gutierrez@amd.com 24711308Santhony.gutierrez@amd.com uint64_t nextOffset; 24811308Santhony.gutierrez@amd.com 24911308Santhony.gutierrez@amd.com public: 25012603Sgabeblack@google.com StorageSpace(Brig::BrigSegment _class) : nextOffset(0) 25111308Santhony.gutierrez@amd.com { 25211308Santhony.gutierrez@amd.com } 25311308Santhony.gutierrez@amd.com 25411308Santhony.gutierrez@amd.com StorageElement *addSymbol(const Brig::BrigDirectiveVariable *sym, 25511308Santhony.gutierrez@amd.com const BrigObject *obj); 25611308Santhony.gutierrez@amd.com 25711308Santhony.gutierrez@amd.com StorageElement* findSymbol(std::string name); 25811308Santhony.gutierrez@amd.com StorageElement* findSymbol(uint64_t addr); 25911308Santhony.gutierrez@amd.com StorageElement* findSymbol(const Brig::BrigDirectiveVariable *brigptr); 26011308Santhony.gutierrez@amd.com 26111308Santhony.gutierrez@amd.com int getSize() { return nextOffset; } 26211308Santhony.gutierrez@amd.com void resetOffset() { nextOffset = 0; } 26311308Santhony.gutierrez@amd.com}; 26411308Santhony.gutierrez@amd.com 26511308Santhony.gutierrez@amd.comclass StorageMap 26611308Santhony.gutierrez@amd.com{ 26711308Santhony.gutierrez@amd.com StorageMap *outerScopeMap; 26811308Santhony.gutierrez@amd.com StorageSpace *space[NumSegments]; 26911308Santhony.gutierrez@amd.com 27011308Santhony.gutierrez@amd.com public: 27111308Santhony.gutierrez@amd.com StorageMap(StorageMap *outerScope = nullptr); 27211308Santhony.gutierrez@amd.com 27311308Santhony.gutierrez@amd.com StorageElement *addSymbol(const Brig::BrigDirectiveVariable *sym, 27411308Santhony.gutierrez@amd.com const BrigObject *obj); 27511308Santhony.gutierrez@amd.com 27611308Santhony.gutierrez@amd.com StorageElement* findSymbol(Brig::BrigSegment segment, std::string name); 27711308Santhony.gutierrez@amd.com StorageElement* findSymbol(Brig::BrigSegment segment, uint64_t addr); 27811308Santhony.gutierrez@amd.com 27911308Santhony.gutierrez@amd.com StorageElement* findSymbol(Brig::BrigSegment segment, 28011308Santhony.gutierrez@amd.com const Brig::BrigDirectiveVariable *brigptr); 28111308Santhony.gutierrez@amd.com 28211308Santhony.gutierrez@amd.com // overloaded version to avoid casting 28311308Santhony.gutierrez@amd.com StorageElement* 28411308Santhony.gutierrez@amd.com findSymbol(Brig::BrigSegment8_t segment, std::string name) 28511308Santhony.gutierrez@amd.com { 28611308Santhony.gutierrez@amd.com return findSymbol((Brig::BrigSegment)segment, name); 28711308Santhony.gutierrez@amd.com } 28811308Santhony.gutierrez@amd.com 28911308Santhony.gutierrez@amd.com int getSize(Brig::BrigSegment segment); 29011308Santhony.gutierrez@amd.com void resetOffset(Brig::BrigSegment segment); 29111308Santhony.gutierrez@amd.com}; 29211308Santhony.gutierrez@amd.com 29311308Santhony.gutierrez@amd.comtypedef enum 29411308Santhony.gutierrez@amd.com{ 29511308Santhony.gutierrez@amd.com BT_DEFAULT, 29611308Santhony.gutierrez@amd.com BT_B8, 29711308Santhony.gutierrez@amd.com BT_U8, 29811308Santhony.gutierrez@amd.com BT_U16, 29911308Santhony.gutierrez@amd.com BT_U32, 30011308Santhony.gutierrez@amd.com BT_U64, 30111308Santhony.gutierrez@amd.com BT_S8, 30211308Santhony.gutierrez@amd.com BT_S16, 30311308Santhony.gutierrez@amd.com BT_S32, 30411308Santhony.gutierrez@amd.com BT_S64, 30511308Santhony.gutierrez@amd.com BT_F16, 30611308Santhony.gutierrez@amd.com BT_F32, 30711308Santhony.gutierrez@amd.com BT_F64, 30811308Santhony.gutierrez@amd.com BT_NULL 30911308Santhony.gutierrez@amd.com} base_type_e; 31011308Santhony.gutierrez@amd.com 31111308Santhony.gutierrez@amd.com/* @class HsailCode 31211308Santhony.gutierrez@amd.com * the HsailCode class is used to store information 31311308Santhony.gutierrez@amd.com * about HSA kernels stored in the BRIG format. it holds 31411308Santhony.gutierrez@amd.com * all information about a kernel, function, or variable 31511308Santhony.gutierrez@amd.com * symbol and provides methods for accessing that 31611308Santhony.gutierrez@amd.com * information. 31711308Santhony.gutierrez@amd.com */ 31811308Santhony.gutierrez@amd.com 31911308Santhony.gutierrez@amd.comclass HsailCode final : public HsaCode 32011308Santhony.gutierrez@amd.com{ 32111308Santhony.gutierrez@amd.com public: 32211308Santhony.gutierrez@amd.com TheGpuISA::Decoder decoder; 32311308Santhony.gutierrez@amd.com 32411308Santhony.gutierrez@amd.com StorageMap *storageMap; 32511308Santhony.gutierrez@amd.com LabelMap labelMap; 32611308Santhony.gutierrez@amd.com uint32_t kernarg_start; 32711308Santhony.gutierrez@amd.com uint32_t kernarg_end; 32811308Santhony.gutierrez@amd.com int32_t private_size; 32911308Santhony.gutierrez@amd.com 33011308Santhony.gutierrez@amd.com int32_t readonly_size; 33111308Santhony.gutierrez@amd.com 33211308Santhony.gutierrez@amd.com // We track the maximum register index used for each register 33311308Santhony.gutierrez@amd.com // class when we load the code so we can size the register files 33411308Santhony.gutierrez@amd.com // appropriately (i.e., one more than the max index). 33511308Santhony.gutierrez@amd.com uint32_t max_creg; // maximum c-register index 33611308Santhony.gutierrez@amd.com uint32_t max_sreg; // maximum s-register index 33711308Santhony.gutierrez@amd.com uint32_t max_dreg; // maximum d-register index 33811308Santhony.gutierrez@amd.com 33911308Santhony.gutierrez@amd.com HsailCode(const std::string &name_str, 34011308Santhony.gutierrez@amd.com const Brig::BrigDirectiveExecutable *code_dir, 34111308Santhony.gutierrez@amd.com const BrigObject *obj, 34211308Santhony.gutierrez@amd.com StorageMap *objStorageMap); 34311308Santhony.gutierrez@amd.com 34411308Santhony.gutierrez@amd.com // this version is used to create a placeholder when 34511308Santhony.gutierrez@amd.com // we encounter a kernel-related directive before the 34611308Santhony.gutierrez@amd.com // kernel itself 34711308Santhony.gutierrez@amd.com HsailCode(const std::string &name_str); 34811308Santhony.gutierrez@amd.com 34911308Santhony.gutierrez@amd.com void init(const Brig::BrigDirectiveExecutable *code_dir, 35011308Santhony.gutierrez@amd.com const BrigObject *obj, StorageMap *objStorageMap); 35111308Santhony.gutierrez@amd.com 35211308Santhony.gutierrez@amd.com void 35311308Santhony.gutierrez@amd.com generateHsaKernelInfo(HsaKernelInfo *hsaKernelInfo) const 35411308Santhony.gutierrez@amd.com { 35511308Santhony.gutierrez@amd.com hsaKernelInfo->sRegCount = max_sreg + 1; 35611308Santhony.gutierrez@amd.com hsaKernelInfo->dRegCount = max_dreg + 1; 35711308Santhony.gutierrez@amd.com hsaKernelInfo->cRegCount = max_creg + 1; 35811308Santhony.gutierrez@amd.com 35911308Santhony.gutierrez@amd.com hsaKernelInfo->static_lds_size = getSize(Brig::BRIG_SEGMENT_GROUP); 36011308Santhony.gutierrez@amd.com 36111308Santhony.gutierrez@amd.com hsaKernelInfo->private_mem_size = 36211308Santhony.gutierrez@amd.com roundUp(getSize(Brig::BRIG_SEGMENT_PRIVATE), 8); 36311308Santhony.gutierrez@amd.com 36411308Santhony.gutierrez@amd.com hsaKernelInfo->spill_mem_size = 36511308Santhony.gutierrez@amd.com roundUp(getSize(Brig::BRIG_SEGMENT_SPILL), 8); 36611308Santhony.gutierrez@amd.com } 36711308Santhony.gutierrez@amd.com 36811308Santhony.gutierrez@amd.com int 36911308Santhony.gutierrez@amd.com getSize(MemorySegment segment) const 37011308Santhony.gutierrez@amd.com { 37111308Santhony.gutierrez@amd.com Brig::BrigSegment brigSeg; 37211308Santhony.gutierrez@amd.com 37311308Santhony.gutierrez@amd.com switch (segment) { 37411308Santhony.gutierrez@amd.com case MemorySegment::NONE: 37511308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_NONE; 37611308Santhony.gutierrez@amd.com break; 37711308Santhony.gutierrez@amd.com case MemorySegment::FLAT: 37811308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_FLAT; 37911308Santhony.gutierrez@amd.com break; 38011308Santhony.gutierrez@amd.com case MemorySegment::GLOBAL: 38111308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_GLOBAL; 38211308Santhony.gutierrez@amd.com break; 38311308Santhony.gutierrez@amd.com case MemorySegment::READONLY: 38411308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_READONLY; 38511308Santhony.gutierrez@amd.com break; 38611308Santhony.gutierrez@amd.com case MemorySegment::KERNARG: 38711308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_KERNARG; 38811308Santhony.gutierrez@amd.com break; 38911308Santhony.gutierrez@amd.com case MemorySegment::GROUP: 39011308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_GROUP; 39111308Santhony.gutierrez@amd.com break; 39211308Santhony.gutierrez@amd.com case MemorySegment::PRIVATE: 39311308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_PRIVATE; 39411308Santhony.gutierrez@amd.com break; 39511308Santhony.gutierrez@amd.com case MemorySegment::SPILL: 39611308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_SPILL; 39711308Santhony.gutierrez@amd.com break; 39811308Santhony.gutierrez@amd.com case MemorySegment::ARG: 39911308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_ARG; 40011308Santhony.gutierrez@amd.com break; 40111308Santhony.gutierrez@amd.com case MemorySegment::EXTSPACE0: 40211308Santhony.gutierrez@amd.com brigSeg = Brig::BRIG_SEGMENT_AMD_GCN; 40311308Santhony.gutierrez@amd.com break; 40411308Santhony.gutierrez@amd.com default: 40511308Santhony.gutierrez@amd.com fatal("Unknown BrigSegment type.\n"); 40611308Santhony.gutierrez@amd.com } 40711308Santhony.gutierrez@amd.com 40811308Santhony.gutierrez@amd.com return getSize(brigSeg); 40911308Santhony.gutierrez@amd.com } 41011308Santhony.gutierrez@amd.com 41111308Santhony.gutierrez@amd.com private: 41211308Santhony.gutierrez@amd.com int 41311308Santhony.gutierrez@amd.com getSize(Brig::BrigSegment segment) const 41411308Santhony.gutierrez@amd.com { 41511308Santhony.gutierrez@amd.com if (segment == Brig::BRIG_SEGMENT_PRIVATE) { 41611308Santhony.gutierrez@amd.com // with the code generated by new HSA compiler the assertion 41711308Santhony.gutierrez@amd.com // does not hold anymore.. 41811308Santhony.gutierrez@amd.com //assert(private_size != -1); 41911308Santhony.gutierrez@amd.com return private_size; 42011308Santhony.gutierrez@amd.com } else { 42111308Santhony.gutierrez@amd.com return storageMap->getSize(segment); 42211308Santhony.gutierrez@amd.com } 42311308Santhony.gutierrez@amd.com } 42411308Santhony.gutierrez@amd.com 42511308Santhony.gutierrez@amd.com public: 42611308Santhony.gutierrez@amd.com StorageElement* 42711308Santhony.gutierrez@amd.com findSymbol(Brig::BrigSegment segment, uint64_t addr) 42811308Santhony.gutierrez@amd.com { 42911308Santhony.gutierrez@amd.com return storageMap->findSymbol(segment, addr); 43011308Santhony.gutierrez@amd.com } 43111308Santhony.gutierrez@amd.com 43211308Santhony.gutierrez@amd.com void 43311308Santhony.gutierrez@amd.com setPrivateSize(int32_t _private_size) 43411308Santhony.gutierrez@amd.com { 43511308Santhony.gutierrez@amd.com private_size = _private_size; 43611308Santhony.gutierrez@amd.com } 43711308Santhony.gutierrez@amd.com 43811308Santhony.gutierrez@amd.com Label* 43911308Santhony.gutierrez@amd.com refLabel(const Brig::BrigDirectiveLabel *lbl, const BrigObject *obj) 44011308Santhony.gutierrez@amd.com { 44111308Santhony.gutierrez@amd.com return labelMap.refLabel(lbl, obj); 44211308Santhony.gutierrez@amd.com } 44311308Santhony.gutierrez@amd.com}; 44411308Santhony.gutierrez@amd.com 44511308Santhony.gutierrez@amd.com#endif // __HSAIL_CODE_HH__ 446