instr-a3xx.h revision bc5e2bec303acd7fd962996bf369be5ce0e15cd2
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; 2642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy11 : 11; 2654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy12 : 12; 2664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy13 : 13; 2672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy8 : 8; 2682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} reg_t; 2692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* special registers: */ 2712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define REG_A0 61 /* address register */ 2722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define REG_P0 62 /* predicate register */ 2732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline int reg_special(reg_t reg) 2752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return (reg.num == REG_A0) || (reg.num == REG_P0); 2772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 2802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 281660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark union PACKED { 282660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark struct PACKED { 283660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark int16_t immed : 16; 284660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark uint32_t dummy1 : 16; 285660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark } a3xx; 286660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark struct PACKED { 287660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark int32_t immed : 20; 288660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark uint32_t dummy1 : 12; 289660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark } a4xx; 290660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark }; 2912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 2932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 8; 2942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 2952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy3 : 1; 2962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 2972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy4 : 7; 2982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t inv : 1; 2992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t comp : 2; 3002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 4; 3012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 3022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 3032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 3042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat0_t; 3052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 3072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 3082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark union PACKED { 3092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for normal src register: */ 3102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 3112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src : 11; 3124317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark /* at least low bit of pad must be zero or it will 3134317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark * look like a address relative src 3144317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark */ 3152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad : 21; 3162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for address relative: */ 3182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 3192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t off : 10; 3204317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel_c : 1; 3214317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel : 1; 3222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t unknown : 20; 3232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for immediate: */ 325203f37540a698a812f0a66e2f3f1fff954af22abRob Clark int32_t iim_val; 326203f37540a698a812f0a66e2f3f1fff954af22abRob Clark uint32_t uim_val; 327203f37540a698a812f0a66e2f3f1fff954af22abRob Clark float fim_val; 3282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 3312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 3322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 3332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_r : 1; 3342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 3354317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t ul : 1; 3362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_type : 3; 3372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_rel : 1; 3382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_type : 3; 3392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_c : 1; 3402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_im : 1; 3412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t even : 1; 3422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pos_inf : 1; 3432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t must_be_0 : 2; 3442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 3452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 3462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 3472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat1_t; 3482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 3502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 3514317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 3524317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3534317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 11; 3544317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 3554317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_im : 1; /* immediate */ 3564317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_neg : 1; /* negate */ 3574317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_abs : 1; /* absolute value */ 3584317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3594317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3604317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 10; 3614317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; /* relative-const */ 3624317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_rel : 1; /* relative address */ 3634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 3644317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel1; 3664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3674317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 12; 3684317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; /* const */ 3694317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3704317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c1; 3714317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3734317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 3744317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3754317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 11; 3764317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero2: 2; 3774317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_im : 1; /* immediate */ 3784317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_neg : 1; /* negate */ 3794317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_abs : 1; /* absolute value */ 3804317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3814317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3824317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 10; 3834317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; /* relative-const */ 3844317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_rel : 1; /* relative address */ 3854317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 3864317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3874317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel2; 3884317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3894317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 12; 3904317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; /* const */ 3914317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3924317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c2; 3934317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 3962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 3972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 3982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1_r : 1; 3992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 4002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; /* dunno */ 4012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 4022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ei : 1; 4032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t cond : 3; 4042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2_r : 1; 4052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 4062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 6; 4072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 4082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 4092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 4102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat2_t; 4112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 4132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 4144317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4154317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4164317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 11; 4174317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 4184317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; 4194317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_neg : 1; 4204317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_r : 1; 4214317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4224317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4234317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 10; 4244317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; 4254317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_rel : 1; 4264317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 4274317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4284317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel1; 4294317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4304317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 12; 4314317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; 4324317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4334317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c1; 4344317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4354317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 4364317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4374317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4384317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 11; 4394317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero2: 2; 4404317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_r : 1; 4414317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_neg : 1; 4424317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_neg : 1; 4434317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4444317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4454317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 10; 4464317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_c : 1; 4474317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_rel : 1; 4484317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 4494317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4504317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel2; 4514317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4524317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 12; 4534317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_c : 1; 4544317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4554317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c2; 4564317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 4592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 4602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 4612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1_r : 1; 4622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 4632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; 4642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 4652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 8; 4662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 4; 4672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 4682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 4692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 4702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat3_t; 4712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 472a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clarkstatic inline bool instr_cat3_full(instr_cat3_t *cat3) 473a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark{ 474a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark switch (cat3->opc) { 475a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_F16: 476a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_U16: 477a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_S16: 478a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_B16: 479a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_S16: 480a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_F16: 481a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SAD_S16: 482a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SAD_S32: // really?? 483a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark return false; 484a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark default: 485a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark return true; 486a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark } 487a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark} 488a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark 4892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 4902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 4914317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4924317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4934317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 11; 4944317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 4954317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_im : 1; /* immediate */ 4964317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_neg : 1; /* negate */ 4974317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_abs : 1; /* absolute value */ 4984317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4994317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 5004317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 10; 5014317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_c : 1; /* relative-const */ 5024317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel : 1; /* relative address */ 5034317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 5044317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 5054317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel; 5064317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 5074317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 12; 5084317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_c : 1; /* const */ 5094317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 5104317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c; 5114317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 5122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 16; /* seem to be ignored */ 5132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 5152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 5162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 5172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_r : 1; 5182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 5192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; 5202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 5212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 5; /* seem to be ignored */ 5222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 6; 5242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 5252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 5262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 5272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat4_t; 5282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 5312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark union PACKED { 5322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* normal case: */ 5332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 8; 5372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 4; /* seem to be ignored */ 5382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t samp : 4; 5392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t tex : 7; 5402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } norm; 5412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* s2en case: */ 5422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 11; 5462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 1; 5472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src3 : 8; 5482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 3; 5492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } s2en; 5502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* same in either case: */ 5512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark // XXX I think, confirm this 5522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad : 23; 5562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 5572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 5582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 5602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 5612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t wrmask : 4; /* write-mask */ 5622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 5632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 1; /* seems to be ignored */ 5642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_3d : 1; 5652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_a : 1; 5672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_s : 1; 5682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_s2en : 1; 5692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_o : 1; 5702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_p : 1; 5712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 5732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 5742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 5752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 5762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat5_t; 5772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 578bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword0 encoding for src_off: [src1 + off], src2: */ 5792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 58120b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t mustbe1 : 1; 58220b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark int32_t off : 13; 58320b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src1 : 8; 58420b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src1_im : 1; 58520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2_im : 1; 58620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2 : 8; 5872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 589bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword1; 5902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6a_t; 5912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 592bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword0 encoding for !src_off: [src1], src2 */ 5932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 59520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t mustbe0 : 1; 596bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t src1 : 13; 597bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t ignore0 : 8; 59820b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src1_im : 1; 59920b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2_im : 1; 60020b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2 : 8; 6012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 603bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword1; 6042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6b_t; 6052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 606bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword1 encoding for dst_off: */ 607bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clarktypedef struct PACKED { 608bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* dword0: */ 609bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword0; 610bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 611bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* note: there is some weird stuff going on where sometimes 612bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * cat6->a.off is involved.. but that seems like a bug in 613bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * the blob, since it is used even if !cat6->src_off 614bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * It would make sense for there to be some more bits to 615bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * bring us to 11 bits worth of offset, but not sure.. 616bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark */ 617bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark int32_t off : 8; 618bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t mustbe1 : 1; 619bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dst : 8; 620bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad1 : 15; 621bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark} instr_cat6c_t; 622bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 623bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword1 encoding for !dst_off: */ 624bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clarktypedef struct PACKED { 625bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* dword0: */ 626bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword0; 627bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 628bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dst : 8; 629bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t mustbe0 : 1; 630bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad0 : 23; 631bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark} instr_cat6d_t; 632bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 63320b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark/* I think some of the other cat6 instructions use additional 63420b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark * sub-encodings.. 63520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark */ 63620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark 6372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 6382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6a_t a; 6392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6b_t b; 640bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark instr_cat6c_t c; 641bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark instr_cat6d_t d; 6422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 6432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 644bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t src_off : 1; 64520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t pad1 : 31; 6462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 648bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad2 : 8; 649bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dst_off : 1; 650bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad3 : 8; 6512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 652bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t g : 1; /* or in some cases it means dst immed */ 653bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad4 : 1; 6542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 6552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 6562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 6572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 6582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 6592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6_t; 6602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 6622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat0_t cat0; 6632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat1_t cat1; 6642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat2_t cat2; 6652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat3_t cat3; 6662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat4_t cat4; 6672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat5_t cat5; 6682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6_t cat6; 6692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 6702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 6712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint64_t pad1 : 40; 6722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; /* cat0-cat4 */ 6732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad2 : 1; 6742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; /* cat1-cat4 (cat0??) */ 6752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; /* cat2-cat4 (and cat1 in blob.. which may be bug??) */ 6762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad3 : 13; 6772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 6782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 6792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 6802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 6822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_t; 6832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 684a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clarkstatic inline uint32_t instr_opc(instr_t *instr) 685a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark{ 686a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark switch (instr->opc_cat) { 687a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 0: return instr->cat0.opc; 688a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 1: return 0; 689a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 2: return instr->cat2.opc; 690a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 3: return instr->cat3.opc; 691a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 4: return instr->cat4.opc; 692a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 5: return instr->cat5.opc; 693a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 6: return instr->cat6.opc; 694a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark default: return 0; 695a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark } 696a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark} 697a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark 698554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clarkstatic inline bool is_mad(opc_t opc) 699554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark{ 700554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark switch (opc) { 701554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_U16: 702554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_S16: 703554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_U24: 704554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_S24: 705554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_F16: 706554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_F32: 707554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark return true; 708554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark default: 709554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark return false; 710554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark } 711554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark} 712554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark 713f0e9a632a12798bd727799e396cde665bd960665Rob Clarkstatic inline bool is_madsh(opc_t opc) 714f0e9a632a12798bd727799e396cde665bd960665Rob Clark{ 715f0e9a632a12798bd727799e396cde665bd960665Rob Clark switch (opc) { 716f0e9a632a12798bd727799e396cde665bd960665Rob Clark case OPC_MADSH_U16: 717f0e9a632a12798bd727799e396cde665bd960665Rob Clark case OPC_MADSH_M16: 718f0e9a632a12798bd727799e396cde665bd960665Rob Clark return true; 719f0e9a632a12798bd727799e396cde665bd960665Rob Clark default: 720f0e9a632a12798bd727799e396cde665bd960665Rob Clark return false; 721f0e9a632a12798bd727799e396cde665bd960665Rob Clark } 722f0e9a632a12798bd727799e396cde665bd960665Rob Clark} 723f0e9a632a12798bd727799e396cde665bd960665Rob Clark 7242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#endif /* INSTR_A3XX_H_ */ 725