111308Santhony.gutierrez@amd.com/*
212697Santhony.gutierrez@amd.com * Copyright (c) 2015-2017 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 *
1712697Santhony.gutierrez@amd.com * 3. Neither the name of the copyright holder nor the names of its
1812697Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from this
1912697Santhony.gutierrez@amd.com * software 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 *
3312697Santhony.gutierrez@amd.com * Authors: John Kalamatianos,
3412697Santhony.gutierrez@amd.com *          Mark Wyse
3511308Santhony.gutierrez@amd.com */
3611308Santhony.gutierrez@amd.com
3711308Santhony.gutierrez@amd.com#ifndef __VECTOR_REGISTER_FILE_HH__
3811308Santhony.gutierrez@amd.com#define __VECTOR_REGISTER_FILE_HH__
3911308Santhony.gutierrez@amd.com
4011308Santhony.gutierrez@amd.com#include <list>
4111308Santhony.gutierrez@amd.com
4211308Santhony.gutierrez@amd.com#include "base/statistics.hh"
4311800Sbrandon.potter@amd.com#include "base/trace.hh"
4411308Santhony.gutierrez@amd.com#include "base/types.hh"
4511642Salexandru.dutu@amd.com#include "debug/GPUVRF.hh"
4611308Santhony.gutierrez@amd.com#include "gpu-compute/vector_register_state.hh"
4711308Santhony.gutierrez@amd.com#include "sim/sim_object.hh"
4811308Santhony.gutierrez@amd.com
4911308Santhony.gutierrez@amd.comclass ComputeUnit;
5011308Santhony.gutierrez@amd.comclass Shader;
5111308Santhony.gutierrez@amd.comclass SimplePoolManager;
5211308Santhony.gutierrez@amd.comclass Wavefront;
5311308Santhony.gutierrez@amd.com
5411308Santhony.gutierrez@amd.comstruct VectorRegisterFileParams;
5511308Santhony.gutierrez@amd.com
5611308Santhony.gutierrez@amd.comenum class VrfAccessType : uint8_t
5711308Santhony.gutierrez@amd.com{
5811308Santhony.gutierrez@amd.com    READ = 0x01,
5911308Santhony.gutierrez@amd.com    WRITE = 0x02,
6011308Santhony.gutierrez@amd.com    RD_WR = READ | WRITE
6111308Santhony.gutierrez@amd.com};
6211308Santhony.gutierrez@amd.com
6311308Santhony.gutierrez@amd.com// Vector Register File
6411308Santhony.gutierrez@amd.comclass VectorRegisterFile : public SimObject
6511308Santhony.gutierrez@amd.com{
6611308Santhony.gutierrez@amd.com  public:
6711308Santhony.gutierrez@amd.com    VectorRegisterFile(const VectorRegisterFileParams *p);
6811308Santhony.gutierrez@amd.com
6911308Santhony.gutierrez@amd.com    void setParent(ComputeUnit *_computeUnit);
7011308Santhony.gutierrez@amd.com
7111308Santhony.gutierrez@amd.com    // Read a register
7211308Santhony.gutierrez@amd.com    template<typename T>
7311308Santhony.gutierrez@amd.com    T
7411308Santhony.gutierrez@amd.com    read(int regIdx, int threadId=0)
7511308Santhony.gutierrez@amd.com    {
7611308Santhony.gutierrez@amd.com        T p0 = vgprState->read<T>(regIdx, threadId);
7711642Salexandru.dutu@amd.com        DPRINTF(GPUVRF, "reading vreg[%d][%d] = %u\n", regIdx, threadId, (uint64_t)p0);
7811308Santhony.gutierrez@amd.com
7911308Santhony.gutierrez@amd.com        return p0;
8011308Santhony.gutierrez@amd.com    }
8111308Santhony.gutierrez@amd.com
8211308Santhony.gutierrez@amd.com    // Write a register
8311308Santhony.gutierrez@amd.com    template<typename T>
8411308Santhony.gutierrez@amd.com    void
8511308Santhony.gutierrez@amd.com    write(int regIdx, T value, int threadId=0)
8611308Santhony.gutierrez@amd.com    {
8711642Salexandru.dutu@amd.com        DPRINTF(GPUVRF, "writing vreg[%d][%d] = %u\n", regIdx, threadId, (uint64_t)value);
8811308Santhony.gutierrez@amd.com        vgprState->write<T>(regIdx, value, threadId);
8911308Santhony.gutierrez@amd.com    }
9011308Santhony.gutierrez@amd.com
9111308Santhony.gutierrez@amd.com    uint8_t regBusy(int idx, uint32_t operandSize) const;
9211308Santhony.gutierrez@amd.com    uint8_t regNxtBusy(int idx, uint32_t operandSize) const;
9311308Santhony.gutierrez@amd.com
9411308Santhony.gutierrez@amd.com    int numRegs() const { return numRegsPerSimd; }
9511308Santhony.gutierrez@amd.com
9611308Santhony.gutierrez@amd.com    void markReg(int regIdx, uint32_t operandSize, uint8_t value);
9711308Santhony.gutierrez@amd.com    void preMarkReg(int regIdx, uint32_t operandSize, uint8_t value);
9811308Santhony.gutierrez@amd.com
9911308Santhony.gutierrez@amd.com    virtual void exec(GPUDynInstPtr ii, Wavefront *w);
10011308Santhony.gutierrez@amd.com
10111308Santhony.gutierrez@amd.com    virtual int exec(uint64_t dynamic_id, Wavefront *w,
10211308Santhony.gutierrez@amd.com                     std::vector<uint32_t> &regVec, uint32_t operandSize,
10311308Santhony.gutierrez@amd.com                     uint64_t timestamp);
10411308Santhony.gutierrez@amd.com
10511308Santhony.gutierrez@amd.com    bool operandsReady(Wavefront *w, GPUDynInstPtr ii) const;
10611308Santhony.gutierrez@amd.com    virtual void updateEvents() { }
10711308Santhony.gutierrez@amd.com    virtual void updateResources(Wavefront *w, GPUDynInstPtr ii);
10811308Santhony.gutierrez@amd.com
10911308Santhony.gutierrez@amd.com    virtual bool
11011308Santhony.gutierrez@amd.com    isReadConflict(int memWfId, int exeWfId) const
11111308Santhony.gutierrez@amd.com    {
11211308Santhony.gutierrez@amd.com        return false;
11311308Santhony.gutierrez@amd.com    }
11411308Santhony.gutierrez@amd.com
11511308Santhony.gutierrez@amd.com    virtual bool
11611308Santhony.gutierrez@amd.com    isWriteConflict(int memWfId, int exeWfId) const
11711308Santhony.gutierrez@amd.com    {
11811308Santhony.gutierrez@amd.com        return false;
11911308Santhony.gutierrez@amd.com    }
12011308Santhony.gutierrez@amd.com
12111308Santhony.gutierrez@amd.com    virtual bool vrfOperandAccessReady(uint64_t dynamic_id, Wavefront *w,
12211308Santhony.gutierrez@amd.com                                       GPUDynInstPtr ii,
12311308Santhony.gutierrez@amd.com                                       VrfAccessType accessType);
12411308Santhony.gutierrez@amd.com
12511308Santhony.gutierrez@amd.com    virtual bool vrfOperandAccessReady(Wavefront *w, GPUDynInstPtr ii,
12611308Santhony.gutierrez@amd.com                                       VrfAccessType accessType);
12711308Santhony.gutierrez@amd.com
12811308Santhony.gutierrez@amd.com    SimplePoolManager *manager;
12911308Santhony.gutierrez@amd.com
13011308Santhony.gutierrez@amd.com  protected:
13111308Santhony.gutierrez@amd.com    ComputeUnit* computeUnit;
13211308Santhony.gutierrez@amd.com    int simdId;
13311308Santhony.gutierrez@amd.com
13411308Santhony.gutierrez@amd.com    // flag indicating if a register is busy
13511308Santhony.gutierrez@amd.com    std::vector<uint8_t> busy;
13611308Santhony.gutierrez@amd.com    // flag indicating if a register will be busy (by instructions
13711308Santhony.gutierrez@amd.com    // in the SIMD pipeline)
13811308Santhony.gutierrez@amd.com    std::vector<uint8_t> nxtBusy;
13911308Santhony.gutierrez@amd.com
14011308Santhony.gutierrez@amd.com    // numer of registers (bank size) per simd unit (bank)
14111308Santhony.gutierrez@amd.com    int numRegsPerSimd;
14211308Santhony.gutierrez@amd.com
14311308Santhony.gutierrez@amd.com    // vector register state
14411308Santhony.gutierrez@amd.com    VecRegisterState *vgprState;
14511308Santhony.gutierrez@amd.com};
14611308Santhony.gutierrez@amd.com
14711308Santhony.gutierrez@amd.com#endif // __VECTOR_REGISTER_FILE_HH__
148