gpu_static_inst.hh revision 11690
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 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: Anthony Gutierrez 3411308Santhony.gutierrez@amd.com */ 3511308Santhony.gutierrez@amd.com 3611308Santhony.gutierrez@amd.com#ifndef __GPU_STATIC_INST_HH__ 3711308Santhony.gutierrez@amd.com#define __GPU_STATIC_INST_HH__ 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.com/* 4011308Santhony.gutierrez@amd.com * @file gpu_static_inst.hh 4111308Santhony.gutierrez@amd.com * 4211308Santhony.gutierrez@amd.com * Defines the base class representing static instructions for the GPU. The 4311308Santhony.gutierrez@amd.com * instructions are "static" because they contain no dynamic instruction 4411308Santhony.gutierrez@amd.com * information. GPUStaticInst corresponds to the StaticInst class for the CPU 4511308Santhony.gutierrez@amd.com * models. 4611308Santhony.gutierrez@amd.com */ 4711308Santhony.gutierrez@amd.com 4811308Santhony.gutierrez@amd.com#include <cstdint> 4911308Santhony.gutierrez@amd.com#include <string> 5011308Santhony.gutierrez@amd.com 5111308Santhony.gutierrez@amd.com#include "enums/OpType.hh" 5211308Santhony.gutierrez@amd.com#include "enums/StorageClassType.hh" 5311308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_dyn_inst.hh" 5411308Santhony.gutierrez@amd.com#include "gpu-compute/misc.hh" 5511308Santhony.gutierrez@amd.com 5611308Santhony.gutierrez@amd.comclass BaseOperand; 5711308Santhony.gutierrez@amd.comclass BaseRegOperand; 5811308Santhony.gutierrez@amd.comclass Wavefront; 5911308Santhony.gutierrez@amd.com 6011308Santhony.gutierrez@amd.comclass GPUStaticInst 6111308Santhony.gutierrez@amd.com{ 6211308Santhony.gutierrez@amd.com public: 6311308Santhony.gutierrez@amd.com GPUStaticInst(const std::string &opcode); 6411308Santhony.gutierrez@amd.com 6511308Santhony.gutierrez@amd.com void instNum(int num) { _instNum = num; } 6611308Santhony.gutierrez@amd.com 6711308Santhony.gutierrez@amd.com int instNum() { return _instNum; } 6811308Santhony.gutierrez@amd.com 6911308Santhony.gutierrez@amd.com void ipdInstNum(int num) { _ipdInstNum = num; } 7011308Santhony.gutierrez@amd.com 7111308Santhony.gutierrez@amd.com int ipdInstNum() const { return _ipdInstNum; } 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com virtual void execute(GPUDynInstPtr gpuDynInst) = 0; 7411308Santhony.gutierrez@amd.com virtual void generateDisassembly() = 0; 7511308Santhony.gutierrez@amd.com virtual const std::string &disassemble() = 0; 7611308Santhony.gutierrez@amd.com virtual int getNumOperands() = 0; 7711308Santhony.gutierrez@amd.com virtual bool isCondRegister(int operandIndex) = 0; 7811308Santhony.gutierrez@amd.com virtual bool isScalarRegister(int operandIndex) = 0; 7911308Santhony.gutierrez@amd.com virtual bool isVectorRegister(int operandIndex) = 0; 8011308Santhony.gutierrez@amd.com virtual bool isSrcOperand(int operandIndex) = 0; 8111308Santhony.gutierrez@amd.com virtual bool isDstOperand(int operandIndex) = 0; 8211308Santhony.gutierrez@amd.com virtual int getOperandSize(int operandIndex) = 0; 8311308Santhony.gutierrez@amd.com virtual int getRegisterIndex(int operandIndex) = 0; 8411308Santhony.gutierrez@amd.com virtual int numDstRegOperands() = 0; 8511308Santhony.gutierrez@amd.com virtual int numSrcRegOperands() = 0; 8611308Santhony.gutierrez@amd.com 8711690Santhony.gutierrez@amd.com virtual bool isValid() const = 0; 8811690Santhony.gutierrez@amd.com 8911308Santhony.gutierrez@amd.com /* 9011308Santhony.gutierrez@amd.com * Most instructions (including all HSAIL instructions) 9111308Santhony.gutierrez@amd.com * are vector ops, so _scalarOp will be false by default. 9211308Santhony.gutierrez@amd.com * Derived instruction objects that are scalar ops must 9311308Santhony.gutierrez@amd.com * set _scalarOp to true in their constructors. 9411308Santhony.gutierrez@amd.com */ 9511308Santhony.gutierrez@amd.com bool scalarOp() const { return _scalarOp; } 9611308Santhony.gutierrez@amd.com 9711308Santhony.gutierrez@amd.com virtual bool isLocalMem() const 9811308Santhony.gutierrez@amd.com { 9911308Santhony.gutierrez@amd.com fatal("calling isLocalMem() on non-memory instruction.\n"); 10011308Santhony.gutierrez@amd.com 10111308Santhony.gutierrez@amd.com return false; 10211308Santhony.gutierrez@amd.com } 10311308Santhony.gutierrez@amd.com 10411308Santhony.gutierrez@amd.com bool isArgLoad() { return false; } 10511308Santhony.gutierrez@amd.com virtual uint32_t instSize() = 0; 10611308Santhony.gutierrez@amd.com 10711308Santhony.gutierrez@amd.com // only used for memory instructions 10811308Santhony.gutierrez@amd.com virtual void 10911308Santhony.gutierrez@amd.com initiateAcc(GPUDynInstPtr gpuDynInst) 11011308Santhony.gutierrez@amd.com { 11111308Santhony.gutierrez@amd.com fatal("calling initiateAcc() on a non-memory instruction.\n"); 11211308Santhony.gutierrez@amd.com } 11311308Santhony.gutierrez@amd.com 11411690Santhony.gutierrez@amd.com // only used for memory instructions 11511690Santhony.gutierrez@amd.com virtual void 11611690Santhony.gutierrez@amd.com completeAcc(GPUDynInstPtr gpuDynInst) 11711690Santhony.gutierrez@amd.com { 11811690Santhony.gutierrez@amd.com fatal("calling completeAcc() on a non-memory instruction.\n"); 11911690Santhony.gutierrez@amd.com } 12011690Santhony.gutierrez@amd.com 12111308Santhony.gutierrez@amd.com virtual uint32_t getTargetPc() { return 0; } 12211308Santhony.gutierrez@amd.com 12311308Santhony.gutierrez@amd.com /** 12411308Santhony.gutierrez@amd.com * Query whether the instruction is an unconditional jump i.e., the jump 12511308Santhony.gutierrez@amd.com * is always executed because there is no condition to be evaluated. 12611308Santhony.gutierrez@amd.com * 12711308Santhony.gutierrez@amd.com * If the instruction is not of branch type, the result is always false. 12811308Santhony.gutierrez@amd.com * 12911308Santhony.gutierrez@amd.com * @return True if the instruction is an unconditional jump. 13011308Santhony.gutierrez@amd.com */ 13111308Santhony.gutierrez@amd.com virtual bool unconditionalJumpInstruction() { return false; } 13211308Santhony.gutierrez@amd.com 13311308Santhony.gutierrez@amd.com static uint64_t dynamic_id_count; 13411308Santhony.gutierrez@amd.com 13511308Santhony.gutierrez@amd.com Enums::OpType o_type; 13611308Santhony.gutierrez@amd.com // For flat memory accesses 13711308Santhony.gutierrez@amd.com Enums::StorageClassType executed_as; 13811308Santhony.gutierrez@amd.com 13911308Santhony.gutierrez@amd.com protected: 14011308Santhony.gutierrez@amd.com virtual void 14111308Santhony.gutierrez@amd.com execLdAcq(GPUDynInstPtr gpuDynInst) 14211308Santhony.gutierrez@amd.com { 14311308Santhony.gutierrez@amd.com fatal("calling execLdAcq() on a non-load instruction.\n"); 14411308Santhony.gutierrez@amd.com } 14511308Santhony.gutierrez@amd.com 14611308Santhony.gutierrez@amd.com virtual void 14711308Santhony.gutierrez@amd.com execSt(GPUDynInstPtr gpuDynInst) 14811308Santhony.gutierrez@amd.com { 14911308Santhony.gutierrez@amd.com fatal("calling execLdAcq() on a non-load instruction.\n"); 15011308Santhony.gutierrez@amd.com } 15111308Santhony.gutierrez@amd.com 15211308Santhony.gutierrez@amd.com virtual void 15311308Santhony.gutierrez@amd.com execAtomic(GPUDynInstPtr gpuDynInst) 15411308Santhony.gutierrez@amd.com { 15511308Santhony.gutierrez@amd.com fatal("calling execAtomic() on a non-atomic instruction.\n"); 15611308Santhony.gutierrez@amd.com } 15711308Santhony.gutierrez@amd.com 15811308Santhony.gutierrez@amd.com virtual void 15911308Santhony.gutierrez@amd.com execAtomicAcq(GPUDynInstPtr gpuDynInst) 16011308Santhony.gutierrez@amd.com { 16111308Santhony.gutierrez@amd.com fatal("calling execAtomicAcq() on a non-atomic instruction.\n"); 16211308Santhony.gutierrez@amd.com } 16311308Santhony.gutierrez@amd.com 16411308Santhony.gutierrez@amd.com const std::string opcode; 16511308Santhony.gutierrez@amd.com std::string disassembly; 16611308Santhony.gutierrez@amd.com int _instNum; 16711308Santhony.gutierrez@amd.com /** 16811308Santhony.gutierrez@amd.com * Identifier of the immediate post-dominator instruction. 16911308Santhony.gutierrez@amd.com */ 17011308Santhony.gutierrez@amd.com int _ipdInstNum; 17111308Santhony.gutierrez@amd.com 17211308Santhony.gutierrez@amd.com bool _scalarOp; 17311308Santhony.gutierrez@amd.com}; 17411308Santhony.gutierrez@amd.com 17511308Santhony.gutierrez@amd.com#endif // __GPU_STATIC_INST_HH__ 176