instr-a3xx.h revision 6a33c5c0dffce136bdc95daa2db2d3e9d3c1741f
12855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* 22855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Copyright (c) 2013 Rob Clark <robdclark@gmail.com> 32855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * 42855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Permission is hereby granted, free of charge, to any person obtaining a 52855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * copy of this software and associated documentation files (the "Software"), 62855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * to deal in the Software without restriction, including without limitation 72855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * the rights to use, copy, modify, merge, publish, distribute, sublicense, 82855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * and/or sell copies of the Software, and to permit persons to whom the 92855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Software is furnished to do so, subject to the following conditions: 102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * 112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * The above copyright notice and this permission notice (including the next 122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * paragraph) shall be included in all copies or substantial portions of the 132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * Software. 142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * 152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark * SOFTWARE. 222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark */ 232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#ifndef INSTR_A3XX_H_ 252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define INSTR_A3XX_H_ 262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define PACKED __attribute__((__packed__)) 282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <stdint.h> 302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#include <assert.h> 312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef enum { 332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 0: */ 342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_NOP = 0, 352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_BR = 1, 362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_JUMP = 2, 372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CALL = 3, 382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_RET = 4, 392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_KILL = 5, 402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_END = 6, 412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_EMIT = 7, 422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CUT = 8, 432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CHMASK = 9, 442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CHSH = 10, 452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_FLOW_REV = 11, 462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 1: */ 482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* no opc.. all category 1 are variants of mov */ 492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 2: */ 512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ADD_F = 0, 522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MIN_F = 1, 532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MAX_F = 2, 542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MUL_F = 3, 552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SIGN_F = 4, 562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CMPS_F = 5, 572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ABSNEG_F = 6, 582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CMPV_F = 7, 592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 8 - invalid */ 602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_FLOOR_F = 9, 612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CEIL_F = 10, 622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_RNDNE_F = 11, 632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_RNDAZ_F = 12, 642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_TRUNC_F = 13, 652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 14-15 - invalid */ 662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ADD_U = 16, 672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ADD_S = 17, 682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SUB_U = 18, 692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SUB_S = 19, 702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CMPS_U = 20, 712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CMPS_S = 21, 722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MIN_U = 22, 732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MIN_S = 23, 742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MAX_U = 24, 752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MAX_S = 25, 762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ABSNEG_S = 26, 772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 27 - invalid */ 782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_AND_B = 28, 792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_OR_B = 29, 802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_NOT_B = 30, 812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_XOR_B = 31, 822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 32 - invalid */ 832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CMPV_U = 33, 842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CMPV_S = 34, 852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 35-47 - invalid */ 862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MUL_U = 48, 872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MUL_S = 49, 882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MULL_U = 50, 892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_BFREV_B = 51, 902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CLZ_S = 52, 912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CLZ_B = 53, 922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SHL_B = 54, 932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SHR_B = 55, 942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ASHR_B = 56, 952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_BARY_F = 57, 962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MGEN_B = 58, 972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GETBIT_B = 59, 982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SETRM = 60, 992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CBITS_B = 61, 1002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SHB = 62, 1012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MSAD = 63, 1022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 3: */ 1042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MAD_U16 = 0, 1052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MADSH_U16 = 1, 1062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MAD_S16 = 2, 1072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MADSH_M16 = 3, /* should this be .s16? */ 1082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MAD_U24 = 4, 1092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MAD_S24 = 5, 1102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MAD_F16 = 6, 1112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_MAD_F32 = 7, 1122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SEL_B16 = 8, 1132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SEL_B32 = 9, 1142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SEL_S16 = 10, 1152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SEL_S32 = 11, 1162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SEL_F16 = 12, 1172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SEL_F32 = 13, 1182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAD_S16 = 14, 1192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAD_S32 = 15, 1202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 4: */ 1222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_RCP = 0, 1232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_RSQ = 1, 1242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_LOG2 = 2, 1252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_EXP2 = 3, 1262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SIN = 4, 1272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_COS = 5, 1282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SQRT = 6, 1292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark // 7-63 - invalid 1302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 5: */ 1322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ISAM = 0, 1332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ISAML = 1, 1342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ISAMM = 2, 1352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAM = 3, 1362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAMB = 4, 1372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAML = 5, 1382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAMGQ = 6, 1392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GETLOD = 7, 1402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CONV = 8, 1412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_CONVM = 9, 1422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GETSIZE = 10, 1432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GETBUF = 11, 1442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GETPOS = 12, 1452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GETINFO = 13, 1462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_DSX = 14, 1472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_DSY = 15, 1482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GATHER4R = 16, 1492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GATHER4G = 17, 1502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GATHER4B = 18, 1512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_GATHER4A = 19, 1522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAMGP0 = 20, 1532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAMGP1 = 21, 1542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAMGP2 = 22, 1552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_SAMGP3 = 23, 1562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_DSXPP_1 = 24, 1572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_DSYPP_1 = 25, 1582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_RGETPOS = 26, 1592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_RGETINFO = 27, 1602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 6: */ 1622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_LDG = 0, /* load-global */ 1632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_LDL = 1, 1642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_LDP = 2, 1652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_STG = 3, /* store-global */ 1662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_STL = 4, 1672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_STP = 5, 1682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_STI = 6, 1692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_G2L = 7, 1702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_L2G = 8, 1712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_PREFETCH = 9, 1722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_LDLW = 10, 1732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_STLW = 11, 1742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_RESFMT = 14, 1752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_RESINFO = 15, 176bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_ADD = 16, 177bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_SUB = 17, 178bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_XCHG = 18, 179bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_INC = 19, 180bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_DEC = 20, 181bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_CMPXCHG = 21, 182bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_MIN = 22, 183bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_MAX = 23, 184bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_AND = 24, 185bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_OR = 25, 186bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark OPC_ATOMIC_XOR = 26, 1872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_LDGB_TYPED_4D = 27, 1882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_STGB_4D_4 = 28, 1892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_STIB = 29, 1902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_LDC_4 = 30, 1912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_LDLV = 31, 1922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 193554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark /* meta instructions (category -1): */ 1940f6faa8ff317634ffb75e6040f2de2019dd80d13Rob Clark /* placeholder instr to mark shader inputs: */ 195554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark OPC_META_INPUT = 0, 1960f6faa8ff317634ffb75e6040f2de2019dd80d13Rob Clark OPC_META_PHI = 1, 197554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark /* The "fan-in" and "fan-out" instructions are used for keeping 198554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark * track of instructions that write to multiple dst registers 199554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark * (fan-out) like texture sample instructions, or read multiple 200554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark * consecutive scalar registers (fan-in) (bary.f, texture samp) 201554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark */ 202554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark OPC_META_FO = 2, 203554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark OPC_META_FI = 3, 204554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark 2052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} opc_t; 2062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef enum { 2082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_F16 = 0, 2092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_F32 = 1, 2102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_U16 = 2, 2112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_U32 = 3, 2122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_S16 = 4, 2132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_S32 = 5, 2142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_U8 = 6, 2152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_S8 = 7, // XXX I assume? 2162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} type_t; 2172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline uint32_t type_size(type_t type) 2192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark switch (type) { 2212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_F32: 2222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_U32: 2232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_S32: 2242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 32; 2252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_F16: 2262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_U16: 2272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_S16: 2282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 16; 2292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_U8: 2302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_S8: 2312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 8; 2322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark default: 2332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark assert(0); /* invalid type */ 2342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 2352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 2362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline int type_float(type_t type) 2392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return (type == TYPE_F32) || (type == TYPE_F16); 2412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 243a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clarkstatic inline int type_uint(type_t type) 244a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark{ 245a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark return (type == TYPE_U32) || (type == TYPE_U16) || (type == TYPE_U8); 246a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark} 247a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark 248a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clarkstatic inline int type_sint(type_t type) 249a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark{ 250a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark return (type == TYPE_S32) || (type == TYPE_S16) || (type == TYPE_S8); 251a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark} 252a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark 2532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 2542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* normal gpr or const src register: */ 2552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 2562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t comp : 2; 2574317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t num : 10; 2582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 2592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for immediate val: */ 2602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t iim_val : 11; 2612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* to make compiler happy: */ 2622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy32; 2634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy10 : 10; 2646a33c5c0dffce136bdc95daa2db2d3e9d3c1741fRob Clark int32_t idummy10 : 10; 2652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy11 : 11; 2664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy12 : 12; 2674317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy13 : 13; 2682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy8 : 8; 2692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} reg_t; 2702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* special registers: */ 2722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define REG_A0 61 /* address register */ 2732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define REG_P0 62 /* predicate register */ 2742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline int reg_special(reg_t reg) 2762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return (reg.num == REG_A0) || (reg.num == REG_P0); 2782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 2812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 282660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark union PACKED { 283660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark struct PACKED { 284660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark int16_t immed : 16; 285660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark uint32_t dummy1 : 16; 286660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark } a3xx; 287660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark struct PACKED { 288660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark int32_t immed : 20; 289660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark uint32_t dummy1 : 12; 290660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark } a4xx; 291660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark }; 2922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 2942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 8; 2952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 2962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy3 : 1; 2972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 2982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy4 : 7; 2992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t inv : 1; 3002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t comp : 2; 3012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 4; 3022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 3032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 3042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 3052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat0_t; 3062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 3082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 3092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark union PACKED { 3102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for normal src register: */ 3112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 3122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src : 11; 3134317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark /* at least low bit of pad must be zero or it will 3144317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark * look like a address relative src 3154317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark */ 3162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad : 21; 3172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for address relative: */ 3192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 3202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t off : 10; 3214317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel_c : 1; 3224317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel : 1; 3232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t unknown : 20; 3242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for immediate: */ 326203f37540a698a812f0a66e2f3f1fff954af22abRob Clark int32_t iim_val; 327203f37540a698a812f0a66e2f3f1fff954af22abRob Clark uint32_t uim_val; 328203f37540a698a812f0a66e2f3f1fff954af22abRob Clark float fim_val; 3292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 3322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 3332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 3342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_r : 1; 3352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 3364317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t ul : 1; 3372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_type : 3; 3382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_rel : 1; 3392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_type : 3; 3402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_c : 1; 3412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_im : 1; 3422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t even : 1; 3432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pos_inf : 1; 3442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t must_be_0 : 2; 3452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 3462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 3472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 3482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat1_t; 3492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 3512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 3524317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 3534317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3544317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 11; 3554317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 3564317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_im : 1; /* immediate */ 3574317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_neg : 1; /* negate */ 3584317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_abs : 1; /* absolute value */ 3594317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3604317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3614317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 10; 3624317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; /* relative-const */ 3634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_rel : 1; /* relative address */ 3644317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 3654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel1; 3674317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3684317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 12; 3694317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; /* const */ 3704317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3714317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c1; 3724317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3744317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 3754317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3764317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 11; 3774317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero2: 2; 3784317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_im : 1; /* immediate */ 3794317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_neg : 1; /* negate */ 3804317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_abs : 1; /* absolute value */ 3814317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3824317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3834317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 10; 3844317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; /* relative-const */ 3854317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_rel : 1; /* relative address */ 3864317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 3874317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3884317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel2; 3894317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3904317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 12; 3914317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; /* const */ 3924317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3934317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c2; 3944317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 3972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 3982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 3992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1_r : 1; 4002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 4012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; /* dunno */ 4022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 4032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ei : 1; 4042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t cond : 3; 4052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2_r : 1; 4062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 4072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 6; 4082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 4092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 4102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 4112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat2_t; 4122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 4142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 4154317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4164317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4174317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 11; 4184317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 4194317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; 4204317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_neg : 1; 4214317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_r : 1; 4224317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4234317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4244317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 10; 4254317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; 4264317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_rel : 1; 4274317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 4284317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4294317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel1; 4304317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4314317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 12; 4324317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; 4334317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4344317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c1; 4354317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4364317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 4374317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4384317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4394317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 11; 4404317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero2: 2; 4414317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_r : 1; 4424317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_neg : 1; 4434317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_neg : 1; 4444317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4454317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4464317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 10; 4474317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_c : 1; 4484317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_rel : 1; 4494317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 4504317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4514317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel2; 4524317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4534317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 12; 4544317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_c : 1; 4554317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4564317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c2; 4574317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 4602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 4612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 4622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1_r : 1; 4632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 4642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; 4652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 4662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 8; 4672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 4; 4682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 4692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 4702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 4712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat3_t; 4722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 473a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clarkstatic inline bool instr_cat3_full(instr_cat3_t *cat3) 474a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark{ 475a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark switch (cat3->opc) { 476a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_F16: 477a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_U16: 478a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_S16: 479a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_B16: 480a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_S16: 481a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_F16: 482a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SAD_S16: 483a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SAD_S32: // really?? 484a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark return false; 485a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark default: 486a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark return true; 487a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark } 488a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark} 489a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark 4902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 4912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 4924317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4934317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4944317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 11; 4954317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 4964317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_im : 1; /* immediate */ 4974317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_neg : 1; /* negate */ 4984317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_abs : 1; /* absolute value */ 4994317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 5004317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 5014317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 10; 5024317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_c : 1; /* relative-const */ 5034317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel : 1; /* relative address */ 5044317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 5054317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 5064317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel; 5074317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 5084317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 12; 5094317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_c : 1; /* const */ 5104317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 5114317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c; 5124317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 5132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 16; /* seem to be ignored */ 5142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 5162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 5172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 5182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_r : 1; 5192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 5202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; 5212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 5222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 5; /* seem to be ignored */ 5232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 6; 5252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 5262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 5272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 5282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat4_t; 5292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 5322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark union PACKED { 5332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* normal case: */ 5342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 8; 5382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 4; /* seem to be ignored */ 5392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t samp : 4; 5402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t tex : 7; 5412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } norm; 5422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* s2en case: */ 5432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 11; 5472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 1; 5482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src3 : 8; 5492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 3; 5502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } s2en; 5512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* same in either case: */ 5522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark // XXX I think, confirm this 5532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad : 23; 5572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 5582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 5592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 5612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 5622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t wrmask : 4; /* write-mask */ 5632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 5642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 1; /* seems to be ignored */ 5652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_3d : 1; 5662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_a : 1; 5682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_s : 1; 5692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_s2en : 1; 5702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_o : 1; 5712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_p : 1; 5722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 5742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 5752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 5762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 5772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat5_t; 5782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 579bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword0 encoding for src_off: [src1 + off], src2: */ 5802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 58220b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t mustbe1 : 1; 58320b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark int32_t off : 13; 58420b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src1 : 8; 58520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src1_im : 1; 58620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2_im : 1; 58720b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2 : 8; 5882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 590bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword1; 5912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6a_t; 5922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 593bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword0 encoding for !src_off: [src1], src2 */ 5942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 59620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t mustbe0 : 1; 597bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t src1 : 13; 598bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t ignore0 : 8; 59920b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src1_im : 1; 60020b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2_im : 1; 60120b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2 : 8; 6022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 604bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword1; 6052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6b_t; 6062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 607bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword1 encoding for dst_off: */ 608bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clarktypedef struct PACKED { 609bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* dword0: */ 610bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword0; 611bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 612bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* note: there is some weird stuff going on where sometimes 613bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * cat6->a.off is involved.. but that seems like a bug in 614bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * the blob, since it is used even if !cat6->src_off 615bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * It would make sense for there to be some more bits to 616bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * bring us to 11 bits worth of offset, but not sure.. 617bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark */ 618bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark int32_t off : 8; 619bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t mustbe1 : 1; 620bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dst : 8; 621bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad1 : 15; 622bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark} instr_cat6c_t; 623bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 624bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword1 encoding for !dst_off: */ 625bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clarktypedef struct PACKED { 626bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* dword0: */ 627bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword0; 628bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 629bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dst : 8; 630bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t mustbe0 : 1; 631bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad0 : 23; 632bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark} instr_cat6d_t; 633bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 63420b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark/* I think some of the other cat6 instructions use additional 63520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark * sub-encodings.. 63620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark */ 63720b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark 6382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 6392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6a_t a; 6402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6b_t b; 641bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark instr_cat6c_t c; 642bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark instr_cat6d_t d; 6432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 6442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 645bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t src_off : 1; 64620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t pad1 : 31; 6472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 649bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad2 : 8; 650bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dst_off : 1; 651bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad3 : 8; 6522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 653bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t g : 1; /* or in some cases it means dst immed */ 654bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad4 : 1; 6552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 6562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 6572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 6582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 6592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 6602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6_t; 6612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 6632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat0_t cat0; 6642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat1_t cat1; 6652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat2_t cat2; 6662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat3_t cat3; 6672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat4_t cat4; 6682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat5_t cat5; 6692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6_t cat6; 6702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 6712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 6722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint64_t pad1 : 40; 6732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; /* cat0-cat4 */ 6742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad2 : 1; 6752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; /* cat1-cat4 (cat0??) */ 6762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; /* cat2-cat4 (and cat1 in blob.. which may be bug??) */ 6772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad3 : 13; 6782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 6792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 6802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 6812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 6832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_t; 6842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 685a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clarkstatic inline uint32_t instr_opc(instr_t *instr) 686a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark{ 687a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark switch (instr->opc_cat) { 688a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 0: return instr->cat0.opc; 689a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 1: return 0; 690a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 2: return instr->cat2.opc; 691a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 3: return instr->cat3.opc; 692a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 4: return instr->cat4.opc; 693a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 5: return instr->cat5.opc; 694a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 6: return instr->cat6.opc; 695a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark default: return 0; 696a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark } 697a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark} 698a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark 699554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clarkstatic inline bool is_mad(opc_t opc) 700554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark{ 701554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark switch (opc) { 702554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_U16: 703554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_S16: 704554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_U24: 705554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_S24: 706554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_F16: 707554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_F32: 708554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark return true; 709554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark default: 710554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark return false; 711554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark } 712554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark} 713554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark 714f0e9a632a12798bd727799e396cde665bd960665Rob Clarkstatic inline bool is_madsh(opc_t opc) 715f0e9a632a12798bd727799e396cde665bd960665Rob Clark{ 716f0e9a632a12798bd727799e396cde665bd960665Rob Clark switch (opc) { 717f0e9a632a12798bd727799e396cde665bd960665Rob Clark case OPC_MADSH_U16: 718f0e9a632a12798bd727799e396cde665bd960665Rob Clark case OPC_MADSH_M16: 719f0e9a632a12798bd727799e396cde665bd960665Rob Clark return true; 720f0e9a632a12798bd727799e396cde665bd960665Rob Clark default: 721f0e9a632a12798bd727799e396cde665bd960665Rob Clark return false; 722f0e9a632a12798bd727799e396cde665bd960665Rob Clark } 723f0e9a632a12798bd727799e396cde665bd960665Rob Clark} 724f0e9a632a12798bd727799e396cde665bd960665Rob Clark 7252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#endif /* INSTR_A3XX_H_ */ 726