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