Files
gem5/src/arch/amdgpu/gcn3/ast_objects.py
Kyle Roarty de134bae21 arch-gcn3: Modify directory structure as prep for adding vega isa
Change-Id: I7c5f4a3a9d82ca4550e833dec2cd576dbe333627
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/42203
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Matt Sinclair <mattdsinclair@gmail.com>
Maintainer: Matt Sinclair <mattdsinclair@gmail.com>
2021-03-29 21:21:35 +00:00

866 lines
29 KiB
Python

# Copyright (c) 2015-2021 Advanced Micro Devices, Inc.
# All rights reserved.
#
# For use for simulation and test purposes only
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from this
# software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
class Statement(object):
def __init__(self):
self.keyword = ''
class ImportStatement(Statement):
def __init__(self):
self.keyword = 'import'
self.what = ''
self.name = ''
class FlagBlock(Statement):
def __init__(self):
self.keyword = 'flag'
self.name = ''
self.desc = []
def update(self, ref):
if ref.tag == 'name':
self.name = ref.name
elif ref.tag == 'desc':
self.desc = ref.desc
elif ref.tag == 'desc+':
self.desc = self.desc + ref.desc
else:
assert (False), 'error: unexpected FlagBlock.tag' + ref.tag
self.tag = 'updated'
class FlagsField(object):
def __init__(self):
self.tag = ''
self.name = ''
self.private = 0
self.desc = []
self.group = ''
def update(self, ref):
if ref.tag == 'name':
self.name = ref.name
elif ref.tag == 'private':
self.private = ref.private
elif ref.tag == 'desc':
self.desc = ref.desc
elif ref.tag == 'desc+':
self.desc = self.desc + ref.desc
elif ref.tag == 'group':
self.group = ref.group
else:
assert (False), 'error: unexpected FlagsField.tag ' + ref.tag
self.tag = 'updated'
class FlagsBlock(Statement):
def __init__(self):
self.keyword = 'flags'
self.clauses = []
class OpInfo(object):
def __init__(self):
self.tag = ''
self.opr = ''
self.index = -1
self.iseq = ''
self.name = ''
self.fmt = ''
self.size = -1
self.inout = -1
def __repr__(self):
text = '\n [\n'
text += '\topr: ' + repr(self.opr) + ',\n'
text += '\tindex: ' + repr(self.index) + ',\n'
text += '\tiseq: ' + repr(self.iseq) + ',\n'
text += '\tname: ' + repr(self.name) + ',\n'
text += '\tfmt: ' + repr(self.fmt) + ',\n'
text += '\tsize: ' + repr(self.size) + ',\n'
text += '\tinout: ' + repr(self.inout) + '\n'
text += '\n ]\n'
return text
def update(self, ref):
if ref.tag == 'dst':
self.opr = ref.opr
self.index = ref.index
self.iseq = ref.iseq
elif ref.tag == 'src':
self.opr = ref.opr
self.index = ref.index
self.iseq = ref.iseq
elif ref.tag == 'name':
self.name = ref.name
elif ref.tag == 'fmt':
self.fmt = ref.fmt
elif ref.tag == 'size':
self.size = ref.size
elif ref.tag == 'inout':
self.inout = ref.inout
else:
assert (False), 'error: unexpected OpInfo.tag ' + ref.tag
self.tag = 'updated'
def match(self, ref):
if self.opr != ref.opr:
return False
if self.index != ref.index:
return False
return True
def override(self, ref):
if ref.iseq:
self.iseq = ref.iseq
if ref.name:
self.name = ref.name
if ref.fmt:
self.fmt = ref.fmt
if ref.size >= 0:
self.size = ref.size
if ref.inout >= 0:
self.inout = ref.inout
class Operand(object):
def __init__(self):
self.tag = ''
self.num_dst = -1
self.num_src = -1
self.parent_enc = ''
self.sub_enc = ''
self.flags = []
self.dst = []
self.src = []
self.when = []
self.operands = []
def __repr__(self):
text = '\tnum_dst: ' + repr(self.num_dst) + ',\n'
text += '\tnum_src: ' + repr(self.num_src) + ',\n'
text += '\tparent_enc: ' + repr(self.parent_enc) + ',\n'
text += '\tsub_enc: ' + repr(self.sub_enc) + ',\n'
text += '\tflags: ' + repr(self.flags) + ',\n'
text += '\tdst: ' + repr(self.dst) + ',\n'
text += '\tsrc: ' + repr(self.src) + ',\n'
text += '\twhen: ' + repr(self.when) + ',\n'
text += '\toperands: ' + repr(self.operands) + '\n'
return text
def update(self, ref):
if ref.tag == 'num_dst':
self.num_dst = ref.num_dst
elif ref.tag == 'num_src':
self.num_src = ref.num_src
elif ref.tag == 'parent_enc':
self.parent_enc = ref.parent_enc
elif ref.tag == 'sub_enc':
self.sub_enc = ref.sub_enc
elif ref.tag == 'flags':
self.flags = self.flags + ref.flags
elif ref.tag == 'dst':
self.dst = self.dst + ref.dst
elif ref.tag == 'src':
self.src = self.src + ref.src
elif ref.tag == 'when':
self.when = self.when + ref.when
elif ref.tag == 'operands':
self.operands = self.operands + ref.operands
else:
assert (False), 'error: unexpected Operand.tag ' + ref.tag
self.tag = 'updated'
def override(self, ref):
if ref.num_dst > 0:
self.num_dst = ref.num_dst
if ref.num_src > 0:
self.num_src = ref.num_src
for r in ref.dst:
for s in self.dst:
if s.match(r):
s.override(r)
for r in ref.src:
for s in self.src:
if s.match(r):
s.override(r)
class WhenBlock(object):
def __init__(self):
self.left = ''
self.right = []
self.operand = None
class EncodingBlock(Statement):
def __init__(self):
self.keyword = 'encoding'
self.tag = ''
self.name = ''
self.bits = ''
self.size = -1
self.desc = []
self.operands = []
def update(self, ref):
if ref.tag == 'name':
self.name = ref.name
elif ref.tag == 'bits':
self.bits = ref.bits
elif ref.tag == 'size':
self.size = ref.size
elif ref.tag == 'desc':
self.desc = self.desc + ref.desc
elif ref.tag == 'operands':
self.operands = self.operands + ref.operands
else:
assert (False), 'error: unexpected EncodingBlock.tag ' + ref.tag
self.tag = 'updated'
class ConstClause(object):
def __init__(self):
self.name = ''
self.value = 0
class ConstBlock(Statement):
def __init__(self):
self.keyword = 'const'
self.clauses = []
class TypeClause(object):
def __init__(self):
self.tag = ''
self.name = ''
self.v_max = 0
self.value = 0
self.dp_only = 0
self.size = -1
self.var = False
self.desc = []
self.flags = []
self.src_flags = ''
self.sp3_desc = []
self.sp3_name = ''
self.sp3_ncomp = 0
self.sp3_num = ''
self.parent_enc = ''
self.sub_enc = ''
self.op_type = ''
self.fmt = ''
self.type = ''
self.range = []
self.size_bits = -1
def update(self, ref):
if ref.tag == 'id_range':
self.name = ref.name
self.v_max = ref.v_max
self.value = ref.value
elif ref.tag == 'id_number':
self.name = ref.name
self.value = ref.value
elif ref.tag == 'id_var_number':
self.name = ref.name
self.value = ref.value
self.var = ref.var
elif ref.tag == 'desc':
self.desc = ref.desc + self.desc
elif ref.tag == 'desc+':
self.desc = self.desc + ref.desc
elif ref.tag == 'flags':
self.flags = ref.flags + self.flags
elif ref.tag == 'flags+':
self.flags = self.flags + ref.flags
elif ref.tag == 'src_flags':
self.src_flags = ref.src_flags
elif ref.tag == 'sp3_desc':
self.sp3_desc = ref.sp3_desc + self.sp3_desc
elif ref.tag == 'sp3_desc+':
self.sp3_desc = self.sp3_desc + ref.sp3_desc
elif ref.tag == 'sp3_name':
self.sp3_name = ref.sp3_name
elif ref.tag == 'sp3_ncomp':
self.sp3_ncomp = ref.sp3_ncomp
elif ref.tag == 'sp3_num':
self.sp3_num = ref.sp3_num
elif ref.tag == 'parent_enc':
self.parent_enc = ref.parent_enc
elif ref.tag == 'sub_enc':
self.sub_enc = ref.sub_enc
elif ref.tag == 'op_type':
self.op_type = ref.op_type
elif ref.tag == 'dp_only':
self.dp_only = ref.dp_only
elif ref.tag == 'size':
self.size = ref.size
elif ref.tag == 'fmt':
self.fmt = ref.fmt
elif ref.tag == 'type':
self.type = ref.type
elif ref.tag == 'range':
self.range = ref.range
else:
assert (False), 'error: unexpected TypeClause.tag ' + ref.tag
self.tag = 'updated'
class TypeBlock(Statement):
def __init__(self):
self.keyword = 'type'
self.name = ''
self.clauses = []
class InstField(object):
def __init__(self):
self.tag = ''
self.name = ''
self.v_max = 0
self.value = 0
self.desc = ''
self.type = ''
self.enc = ''
def update(self, ref):
if ref.tag == 'id_range':
self.name = ref.name
self.v_max = ref.v_max
self.value = ref.value
elif ref.tag == 'id_number':
self.name = ref.name
self.value = ref.value
elif ref.tag == 'desc':
self.desc = ref.desc
elif ref.tag == 'type':
self.type = ref.type
elif ref.tag == 'enc':
self.enc = ref.enc
else:
assert (False), 'error: unexpected InstField.tag ' + ref.tag
self.tag = 'updated'
class InstBlock(Statement):
def __init__(self):
self.keyword = 'inst'
self.tag = ''
self.name = ''
self.desc = ''
self.fields = []
def update(self, ref):
if ref.tag == 'name':
self.name = ref.name
elif ref.tag == 'desc':
self.desc = ref.desc
elif ref.tag == 'fields':
self.fields = ref.fields
else:
assert (False), 'error: unexpected InstBlock.tag ' + ref.tag
self.tag = 'updated'
FmtToDetails = {
'NUM_B8' : ( 'SregU8', 8 ),
'NUM_I8' : ( 'SregI8', 8 ),
'NUM_B16' : ( 'SregU16', 16 ),
'NUM_F16' : ( 'SregF16', 16 ),
'NUM_B32' : ( 'SregU32', 32 ),
'NUM_F32' : ( 'SregF32', 32 ),
'NUM_I32' : ( 'SregI32', 32 ),
'NUM_U32' : ( 'SregU32', 32 ),
'NUM_B64' : ( 'SregU64', 64 ),
'NUM_I64' : ( 'SregI64', 64 ),
'NUM_F64' : ( 'SregF64', 64 ),
'NUM_U64' : ( 'SregU64', 64 ),
'BUF' : ( 'SregU64', 64 ),
'NUM_B96' : ( 'SregU96', 96 ),
'NUM_B128' : ( 'SregU128', 128 ),
'RSRC_SCRATCH' : ( 'SregU128', 128 ),
'RSRC_SCALAR' : ( 'SregU128', 128 ),
'IMG' : ( 'SregU256', 256 ),
}
# which get method is used to retrieve
# or set data
TypeToAccessMethod = {
# scalar reg file get
'SregU8' : 'ScalarReg',
'SregI8' : 'ScalarReg',
'SregU16' : 'ScalarReg',
'SregI16' : 'ScalarReg',
'SregU32' : 'ScalarReg',
'SregI32' : 'ScalarReg',
'SregU64' : 'ScalarReg',
'SregI64' : 'ScalarReg',
'SregU96' : 'ScalarReg',
'SregU128' : 'ScalarReg',
'SregU256' : 'ScalarReg',
'SregU512' : 'ScalarReg',
'SregF16' : 'ScalarReg',
'SregF32' : 'ScalarReg',
'SregF64' : 'ScalarReg',
# vector reg file get
'VregU8' : 'VectorReg',
'VregI8' : 'VectorReg',
'VregU16' : 'VectorReg',
'VregI16' : 'VectorReg',
'VregU32' : 'VectorReg',
'VregI32' : 'VectorReg',
'VregU64' : 'VectorReg',
'VregI64' : 'VectorReg',
'VregU96' : 'VectorReg',
'VregU128' : 'VectorReg',
'VregU256' : 'VectorReg',
'VregU512' : 'VectorReg',
'VregF16' : 'VectorReg',
'VregF32' : 'VectorReg',
'VregF64' : 'VectorReg',
}
SpecialCtx = {
'SRC_NOLIT' : 'SrcReg',
'SRC' : 'SrcReg',
'SRC_NOLDS' : 'SrcReg',
'SRC_SIMPLE' : 'SrcReg',
'EXEC' : 'SpecialReg',
'VCC' : 'SpecialReg',
'SCC' : 'SpecialReg',
'PC' : 'SpecialReg',
'PRIV' : 'SpecialReg',
'INST_ATC' : 'SpecialReg',
'M0' : 'SpecialReg',
'VSKIP' : 'SpecialReg',
'PI' : 'SpecialReg',
'NAN' : 'SpecialReg',
'INF' : 'SpecialReg',
'P0' : 'SpecialReg',
'P10' : 'SpecialReg',
'P20' : 'SpecialReg',
'TBA' : 'SpecialReg',
}
# for DS fixup
SuffixToFmt = {
'_I8' : 'NUM_I8',
'I32' : 'NUM_I32',
'I64' : 'NUM_I64'
}
EncRegInfoToField = {
'DS:ADDR:VGPR:vgpr_a' : 'ADDR',
'MUBUF:ADDR:VGPR:vgpr_a' : 'VADDR',
'MIMG:ADDR:VGPR:vgpr_a' : 'VADDR',
}
RegInfoToField = {
'D:SDST:sdst' : 'SDST',
'D:SREG:sdst' : 'SDST',
'S0:SDST:ssrc' : 'SDST',
'S:SSRC:ssrc' : 'SSRC0',
'S0:SREG:ssrc' : 'SSRC0',
'S0:SSRC:ssrc' : 'SSRC0',
'S0:SSRC:ssrc_0' : 'SSRC0',
'S1:SSRC:ssrc_1' : 'SSRC1',
'SGPR:SREG:sgpr' : '',
'D:VGPR:vdst' : 'VDST',
'D:VGPR:vgpr_dst' : 'VDST',
'S0:SRC:src' : 'SRC0',
'S0:SRC:src_0' : 'SRC0',
'S0:SRC_NOLDS:src_0' : 'SRC0',
'S0:SRC_NOLIT:src_0' : 'SRC0',
'S0:SRC_NOLIT:src' : 'SRC0',
'S0:SRC_VGPR:src' : 'SRC0',
'S:SRC:src' : 'SRC0',
'S:SRC_NOLIT:src' : 'SRC0',
'S0:SRC_SIMPLE:src_0' : 'SRC0',
'S1:SRC_SIMPLE:src_1' : 'SRC1',
'S2:SRC_SIMPLE:src_2' : 'SRC2',
'S1:VGPR:src_1' : 'VSRC1',
'S:VGPR:vgpr_ij' : 'VSRC',
'S:SRC_VGPR:vgpr_ij' : 'SRC0',
'S0:SRC_VGPR:vgpr_ij' : 'SRC0',
'S2:SRC_VGPR:vgpr_add' : 'SRC2',
'S2:VGPR:src_2' : 'VSRC1',
'VGPR:VGPR:vgpr' : '',
'VGPR:SRC:vgpr' : '',
'VGPR:SRC_VGPR:vgpr' : '',
'VGPR:SRC_NOLIT:vgpr' : '',
'MEM:MEM:Mem()' : '',
'A:VGPR:vgpr_a' : '',
'B:VGPR:vgpr_a' : '',
'ADDR:SREG:sgpr_base' : 'SBASE',
'DATA:SMWR_OFFSET:offset' : 'OFFSET',
'DATA:SREG:sgpr_data' : 'SDATA',
'RETURN_DATA:SREG:sgpr_data' : 'SDATA',
'ADDR_BASE:VGPR:vgpr_a' : 'ADDR',
'DATA:VGPR:vgpr_d0' : 'DATA0',
'DATA_0:VGPR:vgpr_d0' : 'DATA0',
'DATA_1:VGPR:vgpr_d0' : 'DATA0',
'DATA_2:VGPR:vgpr_d0' : 'DATA0',
'RETURN_DATA:VGPR:vgpr_rtn' : 'VDST',
'RETURN_DATA_0:VGPR:vgpr_rtn' : 'VDST',
'RETURN_DATA_1:VGPR:vgpr_rtn' : 'VDST',
'DATA2:VGPR:vgpr_d1' : 'DATA1',
'DATA:SREG:sgpr_r' : 'SRSRC',
'DATA_0:SREG:sgpr_r' : 'SRSRC',
'DATA_1:SREG:sgpr_r' : 'SRSRC',
'DATA_2:SREG:sgpr_r' : 'SRSRC',
'DATA:SREG:sgpr_dst' : 'SDATA',
'DATA:VGPR:vgpr_d' : 'VDATA',
'DATA_0:VGPR:vgpr_d' : 'VDATA',
'DATA_1:VGPR:vgpr_d' : 'VDATA',
'DATA_2:VGPR:vgpr_d' : 'VDATA',
'RETURN_DATA:VGPR:vgpr_d' : 'VDATA',
'RETURN_DATA_0:VGPR:vgpr_d' : 'VDATA',
'RETURN_DATA_1:VGPR:vgpr_d' : 'VDATA',
'ADDR:VGPR:vgpr_addr' : 'ADDR',
'ADDR:VGPR:vgpr_src' : 'ADDR',
'DATA:VGPR:vgpr_src' : 'DATA',
'DATA_0:VGPR:vgpr_src' : 'DATA',
'DATA_1:VGPR:vgpr_src' : 'DATA',
'DATA_2:VGPR:vgpr_src' : 'DATA',
'DATA:VGPR:vgpr_dst' : 'VDST',
'DATA_0:VGPR:vgpr_dst' : 'VDST',
'DATA_1:VGPR:vgpr_dst' : 'VDST',
'DATA_2:VGPR:vgpr_dst' : 'VDST',
'RETURN_DATA:VGPR:vgpr_dst' : 'VDST',
'RETURN_DATA_0:VGPR:vgpr_dst' : 'VDST',
'RETURN_DATA_1:VGPR:vgpr_dst' : 'VDST',
'D:VCC:vcc' : '-VCC',
}
DataRegisters = ['DATA', 'DATA_0', 'DATA_1', 'DATA_2', 'RETURN_DATA',
'RETURN_DATA_0', 'RETURN_DATA_1']
SpecRegToDetails = {
'SCC' : ['SCC', '', 'scc', 'SregU32', '', ''],
'M0' : ['M0', '', 'm0', 'SregU32', '', ''],
'PRIV' : ['PRIV', '', 'priv', 'SregU32', '', ''],
'VSKIP' : ['VSKIP', '', 'vskip', 'SregU32', '', ''],
'INST_ATC' : ['INST_ATC', '', 'atc', 'SregU32', '', ''],
'VCC' : ['VCC', '', 'vcc', 'SregU64', '', ''],
'PC' : ['PC', '', 'pc', 'SregU64', '', ''],
'TBA' : ['TBA', '', 'tba', 'SregU64', '', ''],
'EXEC' : ['EXEC', '', 'exec', 'SregU64', '', ''],
'PI' : ['PI', '', 'pi', 'SregF32', '', ''],
'INF' : ['INF', '', 'inf', 'SregF32', '', ''],
'NAN' : ['NAN', '', 'nan', 'SregF32', '', ''],
'P0' : ['P0', '', 'p0', 'SregF32', '', ''],
'P10' : ['P10', '', 'p10', 'SregF32', '', ''],
'P20' : ['P20', '', 'p20', 'SregF32', '', ''],
'offset0' : ['', 'instData.OFFSET0', 'offset0', 'SregU16', '', ''],
'OFFSET0' : ['', 'instData.OFFSET0', 'offset0', 'SregU16', '', ''],
'offset1' : ['', 'instData.OFFSET1', 'offset1', 'SregU16', '', ''],
'OFFSET1' : ['', 'instData.OFFSET1', 'offset1', 'SregU16', '', ''],
'SIMM16' : ['', 'instData.SIMM16', 'simm16', 'SregI16', '', ''],
'SIMM4' : ['', 'instData.SSRC1', 'simm4', 'SregU16', '', ''],
'threadID' : ['', '', 't', 'SregU32', '', ''],
'cmp' : ['', '', 'cmp', 'SregU64', '', ''],
'src' : ['', '', 'src', 'SregU64', '', ''],
'tmp' : ['', '', 'tmp', 'SregU64', '', ''],
'attr_word' : ['ATTR', '', 'attr_word', 'SregU32', '', ''],
'K' : ['', 'extData.imm_u32', 'k', 'SregU32', '', '']
}
CoreMethodMap = {
'getSRC_NOLDS_U32' : 'getSRC_U32',
'getSRC_NOLDS_I32' : 'getSRC_I32',
'getSRC_NOLDS_F16' : 'getSRC_F16',
'getSRC_NOLDS_U16' : 'getSRC_U16',
'getSRC_NOLIT_F16' : 'getSRC_F16',
'getSRC_SIMPLE_F16' : 'getSRC_F16',
'getSRC_NOLIT_F32' : 'getSRC_F32',
'getSRC_SIMPLE_F32' : 'getSRC_F32',
'getSRC_NOLIT_F64' : 'getSRC_F64',
'getSRC_SIMPLE_F64' : 'getSRC_F64',
'getSRC_NOLIT_U16' : 'getSRC_U16',
'getSRC_SIMPLE_U16' : 'getSRC_U16',
'getSRC_NOLIT_U32' : 'getSRC_U32',
'getSRC_SIMPLE_U32' : 'getSRC_U32',
'getSRC_NOLIT_U64' : 'getSRC_U64',
'getSRC_SIMPLE_U64' : 'getSRC_U64',
'getSRC_NOLIT_I32' : 'getSRC_I32',
'getSRC_SIMPLE_I32' : 'getSRC_I32',
'getSRC_VGPR_F32' : 'getSRC_F32',
'getSRC_SIMPLE_I64' : 'getSRC_I64'
}
KnownExceptions = [
'Inst_SOP2__S_CBRANCH_G_FORK',
'Inst_SOPK__S_ADDK_I32',
'Inst_SOPK__S_CBRANCH_I_FORK',
'Inst_SOPK__S_GETREG_B32',
'Inst_SOP1__S_CBRANCH_JOIN',
'Inst_SOPP__S_CBRANCH_CDBGSYS',
'Inst_SOPP__S_CBRANCH_CDBGUSER',
'Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER',
'Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER',
'Inst_SOPP__S_SET_GPR_IDX_MODE',
'Inst_VOP1__V_CVT_OFF_F32_I4',
'Inst_VOP1__V_FFBH_U32',
'Inst_VOP1__V_FFBL_B32',
'Inst_VOP1__V_FFBH_I32',
'Inst_VOPC__V_CMP_CLASS_F32',
'Inst_VOPC__V_CMPX_CLASS_F32',
'Inst_VOPC__V_CMP_CLASS_F64',
'Inst_VOPC__V_CMPX_CLASS_F64',
'Inst_VOPC__V_CMP_CLASS_F16',
'Inst_VOPC__V_CMPX_CLASS_F16',
'Inst_VINTRP__V_INTERP_MOV_F32',
'Inst_VOP3__V_CMP_CLASS_F32',
'Inst_VOP3__V_CMPX_CLASS_F32',
'Inst_VOP3__V_CMP_CLASS_F64',
'Inst_VOP3__V_CMPX_CLASS_F64',
'Inst_VOP3__V_CMP_CLASS_F16',
'Inst_VOP3__V_CMPX_CLASS_F16',
'Inst_VOP3__V_CVT_OFF_F32_I4',
'Inst_VOP3__V_FFBH_U32',
'Inst_VOP3__V_FFBL_B32',
'Inst_VOP3__V_FFBH_I32',
'Inst_VOP3__V_CUBEID_F32',
'Inst_VOP3__V_CUBESC_F32',
'Inst_VOP3__V_CUBETC_F32',
'Inst_VOP3__V_CUBEMA_F32',
'Inst_VOP3__V_DIV_FIXUP_F32',
'Inst_VOP3__V_DIV_FIXUP_F64',
'Inst_VOP3__V_DIV_SCALE_F32',
'Inst_VOP3__V_DIV_SCALE_F64',
'Inst_VOP3__V_DIV_FMAS_F32',
'Inst_VOP3__V_DIV_FMAS_F64',
'Inst_VOP3__V_MSAD_U8',
'Inst_VOP3__V_QSAD_PK_U16_U8',
'Inst_VOP3__V_MQSAD_PK_U16_U8',
'Inst_VOP3__V_MQSAD_U32_U8',
'Inst_VOP3__V_PERM_B32',
'Inst_VOP3__V_DIV_FIXUP_F16',
'Inst_VOP3__V_CVT_PKACCUM_U8_F32',
'Inst_VOP3__V_INTERP_MOV_F32',
'Inst_VOP3__V_INTERP_P1LV_F16',
'Inst_VOP3__V_MBCNT_LO_U32_B32',
'Inst_VOP3__V_MBCNT_HI_U32_B32',
'Inst_VOP3__V_TRIG_PREOP_F64',
'Inst_VOP3__V_CVT_PKNORM_I16_F32',
'Inst_VOP3__V_CVT_PKNORM_U16_F32',
'Inst_VOP3__V_CVT_PKRTZ_F16_F32',
'Inst_VOP3__V_CVT_PK_U16_U32',
'Inst_VOP3__V_CVT_PK_I16_I32',
'Inst_DS__DS_READ_U8',
'Inst_DS__DS_READ_U16',
'Inst_DS__DS_SWIZZLE_B32',
'Inst_DS__DS_GWS_BARRIER',
'Inst_DS__DS_CONSUME',
'Inst_DS__DS_APPEND',
'Inst_DS__DS_ORDERED_COUNT',
'Inst_MIMG__IMAGE_GATHER4',
'Inst_MIMG__IMAGE_GATHER4_CL',
'Inst_MIMG__IMAGE_GATHER4_L',
'Inst_MIMG__IMAGE_GATHER4_B',
'Inst_MIMG__IMAGE_GATHER4_B_CL',
'Inst_MIMG__IMAGE_GATHER4_LZ',
'Inst_MIMG__IMAGE_GATHER4_C',
'Inst_MIMG__IMAGE_GATHER4_C_CL',
'Inst_MIMG__IMAGE_GATHER4_C_L',
'Inst_MIMG__IMAGE_GATHER4_C_B',
'Inst_MIMG__IMAGE_GATHER4_C_B_CL',
'Inst_MIMG__IMAGE_GATHER4_C_LZ'
]
KnownEmpty = [
'Inst_SOPK__S_SETREG_B32',
'Inst_SOPK__S_SETREG_IMM32_B32',
'Inst_SOPP__S_WAKEUP',
'Inst_SOPP__S_BARRIER',
'Inst_SOPP__S_SETKILL',
'Inst_SOPP__S_WAITCNT',
'Inst_SOPP__S_SETHALT',
'Inst_SOPP__S_SLEEP',
'Inst_SOPP__S_SETPRIO',
'Inst_SOPP__S_SENDMSG',
'Inst_SOPP__S_SENDMSGHALT',
'Inst_SOPP__S_ICACHE_INV',
'Inst_SOPP__S_INCPERFLEVEL',
'Inst_SOPP__S_DECPERFLEVEL',
'Inst_SOPP__S_TTRACEDATA',
'Inst_SOPP__S_SET_GPR_IDX_OFF',
'Inst_SMEM__S_DCACHE_INV',
'Inst_SMEM__S_DCACHE_WB',
'Inst_SMEM__S_DCACHE_INV_VOL',
'Inst_SMEM__S_DCACHE_WB_VOL',
'Inst_SMEM__S_MEMTIME',
'Inst_SMEM__S_MEMREALTIME',
'Inst_SMEM__S_ATC_PROBE',
'Inst_SMEM__S_ATC_PROBE_BUFFER',
'Inst_VOP1__V_READFIRSTLANE_B32',
'Inst_VOP1__V_FREXP_EXP_I32_F64',
'Inst_VOP1__V_FREXP_MANT_F64',
'Inst_VOP1__V_FRACT_F64',
'Inst_VOP1__V_CLREXCP',
'Inst_VOP1__V_RCP_F16',
'Inst_VOP1__V_SQRT_F16',
'Inst_VOP1__V_RSQ_F16',
'Inst_VOP1__V_LOG_F16',
'Inst_VOP1__V_EXP_F16',
'Inst_VOP1__V_FREXP_MANT_F16',
'Inst_VOP1__V_FREXP_EXP_I16_F16',
'Inst_VOP3__V_FREXP_EXP_I32_F64',
'Inst_VOP3__V_FREXP_MANT_F64',
'Inst_VOP3__V_FRACT_F64',
'Inst_VOP3__V_CLREXCP',
'Inst_VOP3__V_RCP_F16',
'Inst_VOP3__V_SQRT_F16',
'Inst_VOP3__V_RSQ_F16',
'Inst_VOP3__V_LOG_F16',
'Inst_VOP3__V_EXP_F16',
'Inst_VOP3__V_FREXP_MANT_F16',
'Inst_VOP3__V_FREXP_EXP_I16_F16',
'Inst_VOP3__V_READLANE_B32',
'Inst_VOP3__V_WRITELANE_B32',
'Inst_DS__DS_WRXCHG2_RTN_B32',
'Inst_DS__DS_WRXCHG2ST64_RTN_B32',
'Inst_DS__DS_PERMUTE_B32',
'Inst_DS__DS_BPERMUTE_B32',
'Inst_DS__DS_WRXCHG2_RTN_B64',
'Inst_DS__DS_WRXCHG2ST64_RTN_B64',
'Inst_DS__DS_CONDXCHG32_RTN_B64',
'Inst_DS__DS_GWS_SEMA_RELEASE_ALL',
'Inst_DS__DS_GWS_INIT',
'Inst_DS__DS_GWS_SEMA_V',
'Inst_DS__DS_GWS_SEMA_BR',
'Inst_DS__DS_GWS_SEMA_P',
'Inst_DS__DS_READ_B96',
'Inst_DS__DS_READ_B128',
'Inst_MUBUF__BUFFER_LOAD_FORMAT_X',
'Inst_MUBUF__BUFFER_LOAD_FORMAT_XY',
'Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZ',
'Inst_MUBUF__BUFFER_LOAD_FORMAT_XYZW',
'Inst_MUBUF__BUFFER_STORE_FORMAT_X',
'Inst_MUBUF__BUFFER_STORE_FORMAT_XY',
'Inst_MUBUF__BUFFER_STORE_FORMAT_XYZ',
'Inst_MUBUF__BUFFER_STORE_FORMAT_XYZW',
'Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_X',
'Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XY',
'Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZ',
'Inst_MUBUF__BUFFER_LOAD_FORMAT_D16_XYZW',
'Inst_MUBUF__BUFFER_STORE_FORMAT_D16_X',
'Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XY',
'Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZ',
'Inst_MUBUF__BUFFER_STORE_FORMAT_D16_XYZW',
'Inst_MUBUF__BUFFER_LOAD_UBYTE',
'Inst_MUBUF__BUFFER_LOAD_SBYTE',
'Inst_MUBUF__BUFFER_LOAD_USHORT',
'Inst_MUBUF__BUFFER_LOAD_SSHORT',
'Inst_MUBUF__BUFFER_STORE_BYTE',
'Inst_MUBUF__BUFFER_STORE_SHORT',
'Inst_MUBUF__BUFFER_STORE_LDS_DWORD',
'Inst_MUBUF__BUFFER_WBINVL1',
'Inst_MUBUF__BUFFER_WBINVL1_VOL',
'Inst_MTBUF__TBUFFER_LOAD_FORMAT_X',
'Inst_MTBUF__TBUFFER_LOAD_FORMAT_XY',
'Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZ',
'Inst_MTBUF__TBUFFER_LOAD_FORMAT_XYZW',
'Inst_MTBUF__TBUFFER_STORE_FORMAT_X',
'Inst_MTBUF__TBUFFER_STORE_FORMAT_XY',
'Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZ',
'Inst_MTBUF__TBUFFER_STORE_FORMAT_XYZW',
'Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_X',
'Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XY',
'Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZ',
'Inst_MTBUF__TBUFFER_LOAD_FORMAT_D16_XYZW',
'Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_X',
'Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XY',
'Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZ',
'Inst_MTBUF__TBUFFER_STORE_FORMAT_D16_XYZW',
'Inst_MIMG__IMAGE_LOAD',
'Inst_MIMG__IMAGE_LOAD_MIP',
'Inst_MIMG__IMAGE_LOAD_PCK',
'Inst_MIMG__IMAGE_LOAD_PCK_SGN',
'Inst_MIMG__IMAGE_LOAD_MIP_PCK',
'Inst_MIMG__IMAGE_LOAD_MIP_PCK_SGN',
'Inst_MIMG__IMAGE_STORE',
'Inst_MIMG__IMAGE_STORE_MIP',
'Inst_MIMG__IMAGE_STORE_PCK',
'Inst_MIMG__IMAGE_STORE_MIP_PCK',
'Inst_MIMG__IMAGE_GET_RESINFO',
'Inst_MIMG__IMAGE_SAMPLE',
'Inst_MIMG__IMAGE_SAMPLE_CL',
'Inst_MIMG__IMAGE_SAMPLE_D',
'Inst_MIMG__IMAGE_SAMPLE_D_CL',
'Inst_MIMG__IMAGE_SAMPLE_L',
'Inst_MIMG__IMAGE_SAMPLE_B',
'Inst_MIMG__IMAGE_SAMPLE_B_CL',
'Inst_MIMG__IMAGE_SAMPLE_LZ',
'Inst_MIMG__IMAGE_SAMPLE_C',
'Inst_MIMG__IMAGE_SAMPLE_C_CL',
'Inst_MIMG__IMAGE_SAMPLE_C_D',
'Inst_MIMG__IMAGE_SAMPLE_C_D_CL',
'Inst_MIMG__IMAGE_SAMPLE_C_L',
'Inst_MIMG__IMAGE_SAMPLE_C_B',
'Inst_MIMG__IMAGE_SAMPLE_C_B_CL',
'Inst_MIMG__IMAGE_SAMPLE_C_LZ',
'Inst_MIMG__IMAGE_SAMPLE_O',
'Inst_MIMG__IMAGE_SAMPLE_CL_O',
'Inst_MIMG__IMAGE_SAMPLE_D_O',
'Inst_MIMG__IMAGE_SAMPLE_D_CL_O',
'Inst_MIMG__IMAGE_SAMPLE_L_O',
'Inst_MIMG__IMAGE_SAMPLE_B_O',
'Inst_MIMG__IMAGE_SAMPLE_B_CL_O',
'Inst_MIMG__IMAGE_SAMPLE_LZ_O',
'Inst_MIMG__IMAGE_SAMPLE_C_O',
'Inst_MIMG__IMAGE_SAMPLE_C_CL_O',
'Inst_MIMG__IMAGE_SAMPLE_C_D_O',
'Inst_MIMG__IMAGE_SAMPLE_C_D_CL_O',
'Inst_MIMG__IMAGE_SAMPLE_C_L_O',
'Inst_MIMG__IMAGE_SAMPLE_C_B_O',
'Inst_MIMG__IMAGE_SAMPLE_C_B_CL_O',
'Inst_MIMG__IMAGE_SAMPLE_C_LZ_O',
'Inst_MIMG__IMAGE_GATHER4_O',
'Inst_MIMG__IMAGE_GATHER4_CL_O',
'Inst_MIMG__IMAGE_GATHER4_L_O',
'Inst_MIMG__IMAGE_GATHER4_B_O',
'Inst_MIMG__IMAGE_GATHER4_B_CL_O',
'Inst_MIMG__IMAGE_GATHER4_LZ_O',
'Inst_MIMG__IMAGE_GATHER4_C_O',
'Inst_MIMG__IMAGE_GATHER4_C_CL_O',
'Inst_MIMG__IMAGE_GATHER4_C_L_O',
'Inst_MIMG__IMAGE_GATHER4_C_B_O',
'Inst_MIMG__IMAGE_GATHER4_C_B_CL_O',
'Inst_MIMG__IMAGE_GATHER4_C_LZ_O',
'Inst_MIMG__IMAGE_GET_LOD',
'Inst_MIMG__IMAGE_SAMPLE_CD',
'Inst_MIMG__IMAGE_SAMPLE_CD_CL',
'Inst_MIMG__IMAGE_SAMPLE_C_CD',
'Inst_MIMG__IMAGE_SAMPLE_C_CD_CL',
'Inst_MIMG__IMAGE_SAMPLE_CD_O',
'Inst_MIMG__IMAGE_SAMPLE_CD_CL_O',
'Inst_MIMG__IMAGE_SAMPLE_C_CD_O',
'Inst_MIMG__IMAGE_SAMPLE_C_CD_CL_O',
'Inst_EXP__EXP',
'Inst_FLAT__FLAT_LOAD_UBYTE',
'Inst_FLAT__FLAT_LOAD_SBYTE',
'Inst_FLAT__FLAT_LOAD_USHORT',
'Inst_FLAT__FLAT_LOAD_SSHORT',
'Inst_FLAT__FLAT_STORE_BYTE',
'Inst_FLAT__FLAT_STORE_SHORT',
]