instr-a3xx.h revision a5ac36a75f7ceda1093dd982a7fc0c07faae7590
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, 1762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_ADD_L = 16, 1772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_SUB_L = 17, 1782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_XCHG_L = 18, 1792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_INC_L = 19, 1802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_DEC_L = 20, 1812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_CMPXCHG_L = 21, 1822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_MIN_L = 22, 1832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_MAX_L = 23, 1842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_AND_L = 24, 1852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_OR_L = 25, 1862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark OPC_ATOMIC_XOR_L = 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): */ 194554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark /* placeholder instr to mark inputs/outputs: */ 195554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark OPC_META_INPUT = 0, 196554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark OPC_META_OUTPUT = 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 /* branches/flow control */ 205554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark OPC_META_FLOW = 4, 206554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark OPC_META_PHI = 5, 207a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark /* relative addressing */ 208a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark OPC_META_DEREF = 6, 209554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark 210554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark 2112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} opc_t; 2122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef enum { 2142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_F16 = 0, 2152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_F32 = 1, 2162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_U16 = 2, 2172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_U32 = 3, 2182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_S16 = 4, 2192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_S32 = 5, 2202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_U8 = 6, 2212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_S8 = 7, // XXX I assume? 2222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} type_t; 2232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline uint32_t type_size(type_t type) 2252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark switch (type) { 2272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_F32: 2282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_U32: 2292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_S32: 2302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 32; 2312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_F16: 2322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_U16: 2332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_S16: 2342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 16; 2352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_U8: 2362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_S8: 2372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 8; 2382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark default: 2392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark assert(0); /* invalid type */ 2402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 2412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 2422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline int type_float(type_t type) 2452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return (type == TYPE_F32) || (type == TYPE_F16); 2472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 249a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clarkstatic inline int type_uint(type_t type) 250a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark{ 251a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark return (type == TYPE_U32) || (type == TYPE_U16) || (type == TYPE_U8); 252a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark} 253a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark 254a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clarkstatic inline int type_sint(type_t type) 255a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark{ 256a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark return (type == TYPE_S32) || (type == TYPE_S16) || (type == TYPE_S8); 257a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark} 258a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark 2592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 2602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* normal gpr or const src register: */ 2612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 2622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t comp : 2; 2634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t num : 10; 2642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 2652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for immediate val: */ 2662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t iim_val : 11; 2672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* to make compiler happy: */ 2682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy32; 2694317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy10 : 10; 2702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy11 : 11; 2714317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy12 : 12; 2724317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy13 : 13; 2732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy8 : 8; 2742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} reg_t; 2752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* special registers: */ 2772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define REG_A0 61 /* address register */ 2782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define REG_P0 62 /* predicate register */ 2792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline int reg_special(reg_t reg) 2812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return (reg.num == REG_A0) || (reg.num == REG_P0); 2832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 2862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 2872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int16_t immed : 16; 2882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 16; 2892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 2912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 8; 2922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 2932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy3 : 1; 2942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 2952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy4 : 7; 2962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t inv : 1; 2972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t comp : 2; 2982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 4; 2992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 3002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 3012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 3022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat0_t; 3032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 3052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 3062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark union PACKED { 3072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for normal src register: */ 3082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 3092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src : 11; 3104317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark /* at least low bit of pad must be zero or it will 3114317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark * look like a address relative src 3124317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark */ 3132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad : 21; 3142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for address relative: */ 3162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 3172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t off : 10; 3184317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel_c : 1; 3194317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel : 1; 3202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t unknown : 20; 3212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for immediate: */ 3232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t iim_val; 3242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark float fim_val; 3252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 3282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 3292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 3302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_r : 1; 3312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 3324317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t ul : 1; 3332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_type : 3; 3342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_rel : 1; 3352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_type : 3; 3362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_c : 1; 3372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_im : 1; 3382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t even : 1; 3392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pos_inf : 1; 3402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t must_be_0 : 2; 3412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 3422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 3432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 3442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat1_t; 3452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 3472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 3484317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 3494317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3504317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 11; 3514317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 3524317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_im : 1; /* immediate */ 3534317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_neg : 1; /* negate */ 3544317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_abs : 1; /* absolute value */ 3554317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3564317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3574317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 10; 3584317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; /* relative-const */ 3594317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_rel : 1; /* relative address */ 3604317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 3614317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3624317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel1; 3634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3644317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 12; 3654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; /* const */ 3664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3674317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c1; 3684317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3704317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 3714317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3724317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 11; 3734317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero2: 2; 3744317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_im : 1; /* immediate */ 3754317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_neg : 1; /* negate */ 3764317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_abs : 1; /* absolute value */ 3774317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3784317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3794317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 10; 3804317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; /* relative-const */ 3814317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_rel : 1; /* relative address */ 3824317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 3834317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3844317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel2; 3854317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3864317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 12; 3874317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; /* const */ 3884317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3894317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c2; 3904317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 3932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 3942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 3952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1_r : 1; 3962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 3972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; /* dunno */ 3982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 3992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ei : 1; 4002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t cond : 3; 4012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2_r : 1; 4022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 4032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 6; 4042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 4052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 4062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 4072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat2_t; 4082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 4102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 4114317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4124317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4134317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 11; 4144317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 4154317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; 4164317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_neg : 1; 4174317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_r : 1; 4184317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4194317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4204317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 10; 4214317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; 4224317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_rel : 1; 4234317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 4244317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4254317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel1; 4264317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4274317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 12; 4284317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; 4294317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4304317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c1; 4314317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4324317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 4334317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4344317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4354317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 11; 4364317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero2: 2; 4374317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_r : 1; 4384317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_neg : 1; 4394317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_neg : 1; 4404317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4414317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4424317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 10; 4434317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_c : 1; 4444317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_rel : 1; 4454317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 4464317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4474317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel2; 4484317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4494317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 12; 4504317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_c : 1; 4514317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4524317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c2; 4534317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 4562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 4572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 4582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1_r : 1; 4592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 4602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; 4612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 4622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 8; 4632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 4; 4642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 4652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 4662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 4672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat3_t; 4682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 469a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clarkstatic inline bool instr_cat3_full(instr_cat3_t *cat3) 470a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark{ 471a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark switch (cat3->opc) { 472a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_F16: 473a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_U16: 474a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_S16: 475a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_B16: 476a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_S16: 477a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_F16: 478a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SAD_S16: 479a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SAD_S32: // really?? 480a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark return false; 481a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark default: 482a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark return true; 483a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark } 484a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark} 485a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark 4862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 4872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 4884317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4894317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4904317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 11; 4914317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 4924317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_im : 1; /* immediate */ 4934317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_neg : 1; /* negate */ 4944317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_abs : 1; /* absolute value */ 4954317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4964317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4974317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 10; 4984317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_c : 1; /* relative-const */ 4994317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel : 1; /* relative address */ 5004317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 5014317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 5024317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel; 5034317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 5044317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 12; 5054317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_c : 1; /* const */ 5064317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 5074317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c; 5084317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 5092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 16; /* seem to be ignored */ 5102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 5122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 5132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 5142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_r : 1; 5152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 5162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; 5172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 5182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 5; /* seem to be ignored */ 5192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 6; 5212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 5222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 5232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 5242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat4_t; 5252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 5282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark union PACKED { 5292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* normal case: */ 5302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 8; 5342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 4; /* seem to be ignored */ 5352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t samp : 4; 5362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t tex : 7; 5372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } norm; 5382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* s2en case: */ 5392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 11; 5432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 1; 5442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src3 : 8; 5452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 3; 5462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } s2en; 5472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* same in either case: */ 5482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark // XXX I think, confirm this 5492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad : 23; 5532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 5542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 5552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 5572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 5582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t wrmask : 4; /* write-mask */ 5592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 5602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 1; /* seems to be ignored */ 5612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_3d : 1; 5622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_a : 1; 5642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_s : 1; 5652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_s2en : 1; 5662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_o : 1; 5672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_p : 1; 5682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 5702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 5712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 5722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 5732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat5_t; 5742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* used for load instructions: */ 5762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 5782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t must_be_one1 : 1; 5792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int16_t off : 13; 5802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src : 8; 5812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 1; 5822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t must_be_one2 : 1; 5832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t iim_val : 8; 5842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 5862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 5872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 9; 5882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 5892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy3 : 2; 5902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 5912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 5922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 5932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 5942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6a_t; 5952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5962855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* used for store instructions: */ 5972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5982855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 5992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t must_be_zero1 : 1; 6002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src : 8; 6012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t off_hi : 5; /* high bits of 'off'... ugly! */ 6022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 9; 6032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t must_be_one1 : 1; 6042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t iim_val : 8; 6052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 6072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint16_t off : 8; 6082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t must_be_one2 : 1; 6092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 6102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 6112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 2; 6122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 6132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 6142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 6152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 6162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6b_t; 6172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 6192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6a_t a; 6202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6b_t b; 6212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 6222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 6232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad1 : 24; 6242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t iim_val : 8; 6252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 6272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad2 : 17; 6282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 6292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad3 : 2; 6302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 6312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 6322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 6332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 6342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 6352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6_t; 6362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 6382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat0_t cat0; 6392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat1_t cat1; 6402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat2_t cat2; 6412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat3_t cat3; 6422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat4_t cat4; 6432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat5_t cat5; 6442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6_t cat6; 6452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 6462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 6472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint64_t pad1 : 40; 6482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; /* cat0-cat4 */ 6492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad2 : 1; 6502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; /* cat1-cat4 (cat0??) */ 6512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; /* cat2-cat4 (and cat1 in blob.. which may be bug??) */ 6522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad3 : 13; 6532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 6542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 6552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 6562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 6582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_t; 6592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 660a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clarkstatic inline uint32_t instr_opc(instr_t *instr) 661a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark{ 662a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark switch (instr->opc_cat) { 663a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 0: return instr->cat0.opc; 664a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 1: return 0; 665a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 2: return instr->cat2.opc; 666a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 3: return instr->cat3.opc; 667a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 4: return instr->cat4.opc; 668a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 5: return instr->cat5.opc; 669a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 6: return instr->cat6.opc; 670a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark default: return 0; 671a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark } 672a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark} 673a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark 674554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clarkstatic inline bool is_mad(opc_t opc) 675554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark{ 676554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark switch (opc) { 677554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_U16: 678554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MADSH_U16: 679554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_S16: 680554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MADSH_M16: 681554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_U24: 682554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_S24: 683554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_F16: 684554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_F32: 685554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark return true; 686554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark default: 687554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark return false; 688554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark } 689554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark} 690554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark 6912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#endif /* INSTR_A3XX_H_ */ 692