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 3270735643f4cf660dc3022f40f853a138aea738c2Rob Clark/* size of largest OPC field of all the instruction categories: */ 3370735643f4cf660dc3022f40f853a138aea738c2Rob Clark#define NOPC_BITS 6 3470735643f4cf660dc3022f40f853a138aea738c2Rob Clark 3570735643f4cf660dc3022f40f853a138aea738c2Rob Clark#define _OPC(cat, opc) (((cat) << NOPC_BITS) | opc) 3670735643f4cf660dc3022f40f853a138aea738c2Rob Clark 372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef enum { 382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 0: */ 3970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_NOP = _OPC(0, 0), 4070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_BR = _OPC(0, 1), 4170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_JUMP = _OPC(0, 2), 4270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CALL = _OPC(0, 3), 4370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_RET = _OPC(0, 4), 4470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_KILL = _OPC(0, 5), 4570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_END = _OPC(0, 6), 4670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_EMIT = _OPC(0, 7), 4770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CUT = _OPC(0, 8), 4870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CHMASK = _OPC(0, 9), 4970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CHSH = _OPC(0, 10), 5070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_FLOW_REV = _OPC(0, 11), 512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 1: */ 5370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MOV = _OPC(1, 0), 542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 2: */ 5670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ADD_F = _OPC(2, 0), 5770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MIN_F = _OPC(2, 1), 5870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MAX_F = _OPC(2, 2), 5970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MUL_F = _OPC(2, 3), 6070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SIGN_F = _OPC(2, 4), 6170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CMPS_F = _OPC(2, 5), 6270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ABSNEG_F = _OPC(2, 6), 6370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CMPV_F = _OPC(2, 7), 642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 8 - invalid */ 6570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_FLOOR_F = _OPC(2, 9), 6670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CEIL_F = _OPC(2, 10), 6770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_RNDNE_F = _OPC(2, 11), 6870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_RNDAZ_F = _OPC(2, 12), 6970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_TRUNC_F = _OPC(2, 13), 702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 14-15 - invalid */ 7170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ADD_U = _OPC(2, 16), 7270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ADD_S = _OPC(2, 17), 7370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SUB_U = _OPC(2, 18), 7470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SUB_S = _OPC(2, 19), 7570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CMPS_U = _OPC(2, 20), 7670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CMPS_S = _OPC(2, 21), 7770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MIN_U = _OPC(2, 22), 7870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MIN_S = _OPC(2, 23), 7970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MAX_U = _OPC(2, 24), 8070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MAX_S = _OPC(2, 25), 8170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ABSNEG_S = _OPC(2, 26), 822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 27 - invalid */ 8370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_AND_B = _OPC(2, 28), 8470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_OR_B = _OPC(2, 29), 8570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_NOT_B = _OPC(2, 30), 8670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_XOR_B = _OPC(2, 31), 872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 32 - invalid */ 8870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CMPV_U = _OPC(2, 33), 8970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CMPV_S = _OPC(2, 34), 902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* 35-47 - invalid */ 9170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MUL_U = _OPC(2, 48), 9270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MUL_S = _OPC(2, 49), 9370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MULL_U = _OPC(2, 50), 9470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_BFREV_B = _OPC(2, 51), 9570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CLZ_S = _OPC(2, 52), 9670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CLZ_B = _OPC(2, 53), 9770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SHL_B = _OPC(2, 54), 9870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SHR_B = _OPC(2, 55), 9970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ASHR_B = _OPC(2, 56), 10070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_BARY_F = _OPC(2, 57), 10170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MGEN_B = _OPC(2, 58), 10270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GETBIT_B = _OPC(2, 59), 10370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SETRM = _OPC(2, 60), 10470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CBITS_B = _OPC(2, 61), 10570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SHB = _OPC(2, 62), 10670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MSAD = _OPC(2, 63), 1072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 3: */ 10970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MAD_U16 = _OPC(3, 0), 11070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MADSH_U16 = _OPC(3, 1), 11170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MAD_S16 = _OPC(3, 2), 11270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MADSH_M16 = _OPC(3, 3), /* should this be .s16? */ 11370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MAD_U24 = _OPC(3, 4), 11470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MAD_S24 = _OPC(3, 5), 11570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MAD_F16 = _OPC(3, 6), 11670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_MAD_F32 = _OPC(3, 7), 11770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SEL_B16 = _OPC(3, 8), 11870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SEL_B32 = _OPC(3, 9), 11970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SEL_S16 = _OPC(3, 10), 12070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SEL_S32 = _OPC(3, 11), 12170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SEL_F16 = _OPC(3, 12), 12270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SEL_F32 = _OPC(3, 13), 12370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAD_S16 = _OPC(3, 14), 12470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAD_S32 = _OPC(3, 15), 1252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 4: */ 12770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_RCP = _OPC(4, 0), 12870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_RSQ = _OPC(4, 1), 12970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_LOG2 = _OPC(4, 2), 13070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_EXP2 = _OPC(4, 3), 13170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SIN = _OPC(4, 4), 13270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_COS = _OPC(4, 5), 13370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SQRT = _OPC(4, 6), 1342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark // 7-63 - invalid 1352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 5: */ 13770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ISAM = _OPC(5, 0), 13870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ISAML = _OPC(5, 1), 13970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ISAMM = _OPC(5, 2), 14070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAM = _OPC(5, 3), 14170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAMB = _OPC(5, 4), 14270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAML = _OPC(5, 5), 14370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAMGQ = _OPC(5, 6), 14470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GETLOD = _OPC(5, 7), 14570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CONV = _OPC(5, 8), 14670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_CONVM = _OPC(5, 9), 14770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GETSIZE = _OPC(5, 10), 14870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GETBUF = _OPC(5, 11), 14970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GETPOS = _OPC(5, 12), 15070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GETINFO = _OPC(5, 13), 15170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_DSX = _OPC(5, 14), 15270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_DSY = _OPC(5, 15), 15370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GATHER4R = _OPC(5, 16), 15470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GATHER4G = _OPC(5, 17), 15570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GATHER4B = _OPC(5, 18), 15670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_GATHER4A = _OPC(5, 19), 15770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAMGP0 = _OPC(5, 20), 15870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAMGP1 = _OPC(5, 21), 15970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAMGP2 = _OPC(5, 22), 16070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_SAMGP3 = _OPC(5, 23), 16170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_DSXPP_1 = _OPC(5, 24), 16270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_DSYPP_1 = _OPC(5, 25), 16370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_RGETPOS = _OPC(5, 26), 16470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_RGETINFO = _OPC(5, 27), 1652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 1662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* category 6: */ 16770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_LDG = _OPC(6, 0), /* load-global */ 16870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_LDL = _OPC(6, 1), 16970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_LDP = _OPC(6, 2), 17070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_STG = _OPC(6, 3), /* store-global */ 17170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_STL = _OPC(6, 4), 17270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_STP = _OPC(6, 5), 17370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_STI = _OPC(6, 6), 17470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_G2L = _OPC(6, 7), 17570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_L2G = _OPC(6, 8), 17670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_PREFETCH = _OPC(6, 9), 17770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_LDLW = _OPC(6, 10), 17870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_STLW = _OPC(6, 11), 17970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_RESFMT = _OPC(6, 14), 18070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_RESINFO = _OPC(6, 15), 18170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_ADD = _OPC(6, 16), 18270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_SUB = _OPC(6, 17), 18370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_XCHG = _OPC(6, 18), 18470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_INC = _OPC(6, 19), 18570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_DEC = _OPC(6, 20), 18670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_CMPXCHG = _OPC(6, 21), 18770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_MIN = _OPC(6, 22), 18870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_MAX = _OPC(6, 23), 18970735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_AND = _OPC(6, 24), 19070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_OR = _OPC(6, 25), 19170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_ATOMIC_XOR = _OPC(6, 26), 19270735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_LDGB_TYPED_4D = _OPC(6, 27), 19370735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_STGB_4D_4 = _OPC(6, 28), 19470735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_STIB = _OPC(6, 29), 19570735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_LDC_4 = _OPC(6, 30), 19670735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_LDLV = _OPC(6, 31), 1972855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 198554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark /* meta instructions (category -1): */ 1990f6faa8ff317634ffb75e6040f2de2019dd80d13Rob Clark /* placeholder instr to mark shader inputs: */ 20070735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_META_INPUT = _OPC(-1, 0), 20170735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_META_PHI = _OPC(-1, 1), 202554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark /* The "fan-in" and "fan-out" instructions are used for keeping 203554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark * track of instructions that write to multiple dst registers 204554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark * (fan-out) like texture sample instructions, or read multiple 205554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark * consecutive scalar registers (fan-in) (bary.f, texture samp) 206554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark */ 20770735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_META_FO = _OPC(-1, 2), 20870735643f4cf660dc3022f40f853a138aea738c2Rob Clark OPC_META_FI = _OPC(-1, 3), 209554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark 2102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} opc_t; 2112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 21270735643f4cf660dc3022f40f853a138aea738c2Rob Clark#define opc_cat(opc) ((int)((opc) >> NOPC_BITS)) 21370735643f4cf660dc3022f40f853a138aea738c2Rob Clark#define opc_op(opc) ((unsigned)((opc) & ((1 << NOPC_BITS) - 1))) 21470735643f4cf660dc3022f40f853a138aea738c2Rob Clark 2152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef enum { 2162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_F16 = 0, 2172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_F32 = 1, 2182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_U16 = 2, 2192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_U32 = 3, 2202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_S16 = 4, 2212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_S32 = 5, 2222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_U8 = 6, 2232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark TYPE_S8 = 7, // XXX I assume? 2242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} type_t; 2252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline uint32_t type_size(type_t type) 2272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark switch (type) { 2292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_F32: 2302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_U32: 2312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_S32: 2322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 32; 2332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_F16: 2342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_U16: 2352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_S16: 2362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 16; 2372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_U8: 2382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark case TYPE_S8: 2392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 8; 2402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark default: 2412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark assert(0); /* invalid type */ 2422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return 0; 2432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } 2442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline int type_float(type_t type) 2472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return (type == TYPE_F32) || (type == TYPE_F16); 2492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 251a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clarkstatic inline int type_uint(type_t type) 252a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark{ 253a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark return (type == TYPE_U32) || (type == TYPE_U16) || (type == TYPE_U8); 254a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark} 255a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark 256a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clarkstatic inline int type_sint(type_t type) 257a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark{ 258a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark return (type == TYPE_S32) || (type == TYPE_S16) || (type == TYPE_S8); 259a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark} 260a5ac36a75f7ceda1093dd982a7fc0c07faae7590Rob Clark 2612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 2622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* normal gpr or const src register: */ 2632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 2642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t comp : 2; 2654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t num : 10; 2662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 2672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for immediate val: */ 2682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t iim_val : 11; 2692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* to make compiler happy: */ 2702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy32; 2714317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy10 : 10; 2726a33c5c0dffce136bdc95daa2db2d3e9d3c1741fRob Clark int32_t idummy10 : 10; 2732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy11 : 11; 2744317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy12 : 12; 2754317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy13 : 13; 2762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy8 : 8; 2772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} reg_t; 2782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark/* special registers: */ 2802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define REG_A0 61 /* address register */ 2812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#define REG_P0 62 /* predicate register */ 2822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarkstatic inline int reg_special(reg_t reg) 2842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark{ 2852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark return (reg.num == REG_A0) || (reg.num == REG_P0); 2862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} 2872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 2882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 2892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 290660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark union PACKED { 291660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark struct PACKED { 292660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark int16_t immed : 16; 293660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark uint32_t dummy1 : 16; 294660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark } a3xx; 295660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark struct PACKED { 296660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark int32_t immed : 20; 297660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark uint32_t dummy1 : 12; 298660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark } a4xx; 29945eef9af03639a409ef54b136bb4902b9825864bRob Clark struct PACKED { 30045eef9af03639a409ef54b136bb4902b9825864bRob Clark uint32_t immed : 32; 30145eef9af03639a409ef54b136bb4902b9825864bRob Clark } a5xx; 302660d5c1646f5d63f9626b24beabc9cfc318849d4Rob Clark }; 3032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3042855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 3052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 8; 3062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 3072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy3 : 1; 3082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 3092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy4 : 7; 3102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t inv : 1; 3112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t comp : 2; 3122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 4; 3132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 3142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 3152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 3162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat0_t; 3172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 3192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 3202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark union PACKED { 3212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for normal src register: */ 3222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 3232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src : 11; 3244317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark /* at least low bit of pad must be zero or it will 3254317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark * look like a address relative src 3264317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark */ 3272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad : 21; 3282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for address relative: */ 3302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 3312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark int32_t off : 10; 3324317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel_c : 1; 3334317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel : 1; 3342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t unknown : 20; 3352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* for immediate: */ 337203f37540a698a812f0a66e2f3f1fff954af22abRob Clark int32_t iim_val; 338203f37540a698a812f0a66e2f3f1fff954af22abRob Clark uint32_t uim_val; 339203f37540a698a812f0a66e2f3f1fff954af22abRob Clark float fim_val; 3402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 3412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 3432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 3442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 3452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_r : 1; 3462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 3474317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t ul : 1; 3482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_type : 3; 3492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_rel : 1; 3502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_type : 3; 3512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_c : 1; 3522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_im : 1; 3532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t even : 1; 3542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pos_inf : 1; 3552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t must_be_0 : 2; 3562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 3572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 3582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 3592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat1_t; 3602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 3622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 3634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 3644317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 11; 3664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 3674317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_im : 1; /* immediate */ 3684317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_neg : 1; /* negate */ 3694317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_abs : 1; /* absolute value */ 3704317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3714317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3724317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 10; 3734317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; /* relative-const */ 3744317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_rel : 1; /* relative address */ 3754317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 3764317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3774317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel1; 3784317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3794317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 12; 3804317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; /* const */ 3814317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3824317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c1; 3834317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 3854317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 3864317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3874317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 11; 3884317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero2: 2; 3894317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_im : 1; /* immediate */ 3904317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_neg : 1; /* negate */ 3914317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_abs : 1; /* absolute value */ 3924317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 3934317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 3944317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 10; 3954317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; /* relative-const */ 3964317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_rel : 1; /* relative address */ 3974317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 3984317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 3994317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel2; 4004317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4014317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2 : 12; 4024317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; /* const */ 4034317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4044317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c2; 4054317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4072855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 4082855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 4092855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 4102855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1_r : 1; 4112855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 4122855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; /* dunno */ 4132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 4142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ei : 1; 4152855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t cond : 3; 4162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2_r : 1; 4172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 4182855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 6; 4192855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 4202855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 4212855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 4222855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat2_t; 4232855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 4252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 4264317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4274317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4284317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 11; 4294317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 4304317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_c : 1; 4314317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_neg : 1; 4324317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_r : 1; 4334317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4344317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4354317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 10; 4364317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; 4374317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_rel : 1; 4384317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 4394317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4404317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel1; 4414317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4424317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1 : 12; 4434317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src1_c : 1; 4444317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4454317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c1; 4464317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4474317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark 4484317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 4494317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4504317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 11; 4514317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero2: 2; 4524317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_r : 1; 4534317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src2_neg : 1; 4544317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_neg : 1; 4554317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4564317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4574317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 10; 4584317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_c : 1; 4594317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_rel : 1; 4604317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 4614317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4624317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel2; 4634317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 4644317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3 : 12; 4654317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src3_c : 1; 4664317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 4674317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c2; 4684317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 4692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 4702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 4712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 4722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 4732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1_r : 1; 4742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 4752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; 4762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 4772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 8; 4782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 4; 4792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 4802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 4812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 4822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat3_t; 4832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 484a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clarkstatic inline bool instr_cat3_full(instr_cat3_t *cat3) 485a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark{ 48670735643f4cf660dc3022f40f853a138aea738c2Rob Clark switch (_OPC(3, cat3->opc)) { 487a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_F16: 488a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_U16: 489a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_MAD_S16: 490a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_B16: 491a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_S16: 492a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SEL_F16: 493a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SAD_S16: 494a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case OPC_SAD_S32: // really?? 495a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark return false; 496a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark default: 497a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark return true; 498a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark } 499a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark} 500a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark 5012855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 5034317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark union PACKED { 5044317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 5054317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 11; 5064317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero1: 2; 5074317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_im : 1; /* immediate */ 5084317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_neg : 1; /* negate */ 5094317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_abs : 1; /* absolute value */ 5104317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 5114317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 5124317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 10; 5134317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_c : 1; /* relative-const */ 5144317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_rel : 1; /* relative address */ 5154317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t must_be_zero : 1; 5164317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 5174317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } rel; 5184317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark struct PACKED { 5194317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src : 12; 5204317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t src_c : 1; /* const */ 5214317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark uint32_t dummy : 3; 5224317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark } c; 5234317c4e6e05f84a985ff76a7f66e506681d8e37fRob Clark }; 5242855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 16; /* seem to be ignored */ 5252855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5262855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 5272855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 5282855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; 5292855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src_r : 1; 5302855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; 5312855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; 5322855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 5332855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 5; /* seem to be ignored */ 5342855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5352855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 6; 5362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 5372855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 5382855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 5392855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat4_t; 5402855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5412855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5422855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 5432855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark union PACKED { 5442855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* normal case: */ 5452855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5462855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5472855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5482855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 8; 5492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 4; /* seem to be ignored */ 5502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t samp : 4; 5512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t tex : 7; 5522855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } norm; 5532855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* s2en case: */ 5542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5562855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5572855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src2 : 11; 5582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy1 : 1; 5592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src3 : 8; 5602855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 3; 5612855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark } s2en; 5622855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* same in either case: */ 5632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark // XXX I think, confirm this 5642855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 5652855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t full : 1; /* not half */ 5662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t src1 : 8; 5672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad : 23; 5682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 5692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 5702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 5722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dst : 8; 5732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t wrmask : 4; /* write-mask */ 5742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 5752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t dummy2 : 1; /* seems to be ignored */ 5762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_3d : 1; 5772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_a : 1; 5792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_s : 1; 5802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_s2en : 1; 5812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_o : 1; 5822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t is_p : 1; 5832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 5842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 5852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 5862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 5872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 5882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat5_t; 5892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 590bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword0 encoding for src_off: [src1 + off], src2: */ 5912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 5922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 59320b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t mustbe1 : 1; 59420b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark int32_t off : 13; 59520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src1 : 8; 59620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src1_im : 1; 59720b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2_im : 1; 59820b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2 : 8; 5992855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6002855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 601bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword1; 6022855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6a_t; 6032855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 604bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword0 encoding for !src_off: [src1], src2 */ 6052855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef struct PACKED { 6062855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 60720b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t mustbe0 : 1; 608bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t src1 : 13; 609bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t ignore0 : 8; 61020b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src1_im : 1; 61120b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2_im : 1; 61220b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t src2 : 8; 6132855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6142855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 615bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword1; 6162855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6b_t; 6172855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 618bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword1 encoding for dst_off: */ 619bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clarktypedef struct PACKED { 620bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* dword0: */ 621bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword0; 622bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 623bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* note: there is some weird stuff going on where sometimes 624bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * cat6->a.off is involved.. but that seems like a bug in 625bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * the blob, since it is used even if !cat6->src_off 626bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * It would make sense for there to be some more bits to 627bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark * bring us to 11 bits worth of offset, but not sure.. 628bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark */ 629bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark int32_t off : 8; 630bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t mustbe1 : 1; 631bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dst : 8; 632bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad1 : 15; 633bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark} instr_cat6c_t; 634bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 635bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark/* dword1 encoding for !dst_off: */ 636bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clarktypedef struct PACKED { 637bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark /* dword0: */ 638bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dword0; 639bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 640bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dst : 8; 641bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t mustbe0 : 1; 642bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad0 : 23; 643bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark} instr_cat6d_t; 644bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark 64520b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark/* I think some of the other cat6 instructions use additional 64620b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark * sub-encodings.. 64720b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark */ 64820b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark 6492855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 6502855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6a_t a; 6512855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6b_t b; 652bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark instr_cat6c_t c; 653bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark instr_cat6d_t d; 6542855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 6552855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 656bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t src_off : 1; 65720b50a071271e2caf8a4c3d4fd72f877af8a18d9Rob Clark uint32_t pad1 : 31; 6582855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6592855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword1: */ 660bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad2 : 8; 661bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t dst_off : 1; 662bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad3 : 8; 6632855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t type : 3; 664bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t g : 1; /* or in some cases it means dst immed */ 665bc5e2bec303acd7fd962996bf369be5ce0e15cd2Rob Clark uint32_t pad4 : 1; 6662855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc : 5; 6672855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 6682855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 6692855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 6702855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 6712855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_cat6_t; 6722855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6732855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clarktypedef union PACKED { 6742855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat0_t cat0; 6752855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat1_t cat1; 6762855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat2_t cat2; 6772855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat3_t cat3; 6782855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat4_t cat4; 6792855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat5_t cat5; 6802855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark instr_cat6_t cat6; 6812855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark struct PACKED { 6822855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark /* dword0: */ 6832855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint64_t pad1 : 40; 6842855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t repeat : 3; /* cat0-cat4 */ 6852855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad2 : 1; 6862855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ss : 1; /* cat1-cat4 (cat0??) */ 6872855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t ul : 1; /* cat2-cat4 (and cat1 in blob.. which may be bug??) */ 6882855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t pad3 : 13; 6892855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t jmp_tgt : 1; 6902855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t sync : 1; 6912855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark uint32_t opc_cat : 3; 6922855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 6932855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark }; 6942855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark} instr_t; 6952855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark 696a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clarkstatic inline uint32_t instr_opc(instr_t *instr) 697a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark{ 698a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark switch (instr->opc_cat) { 699a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 0: return instr->cat0.opc; 700a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 1: return 0; 701a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 2: return instr->cat2.opc; 702a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 3: return instr->cat3.opc; 703a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 4: return instr->cat4.opc; 704a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 5: return instr->cat5.opc; 705a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark case 6: return instr->cat6.opc; 706a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark default: return 0; 707a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark } 708a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark} 709a418573c4d7fc7f896e7077378d2b4daf98d5217Rob Clark 710554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clarkstatic inline bool is_mad(opc_t opc) 711554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark{ 712554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark switch (opc) { 713554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_U16: 714554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_S16: 715554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_U24: 716554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_S24: 717554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_F16: 718554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark case OPC_MAD_F32: 719554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark return true; 720554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark default: 721554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark return false; 722554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark } 723554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark} 724554f1ac00c43f4503b923e1a129c0039468dcb82Rob Clark 725f0e9a632a12798bd727799e396cde665bd960665Rob Clarkstatic inline bool is_madsh(opc_t opc) 726f0e9a632a12798bd727799e396cde665bd960665Rob Clark{ 727f0e9a632a12798bd727799e396cde665bd960665Rob Clark switch (opc) { 728f0e9a632a12798bd727799e396cde665bd960665Rob Clark case OPC_MADSH_U16: 729f0e9a632a12798bd727799e396cde665bd960665Rob Clark case OPC_MADSH_M16: 730f0e9a632a12798bd727799e396cde665bd960665Rob Clark return true; 731f0e9a632a12798bd727799e396cde665bd960665Rob Clark default: 732f0e9a632a12798bd727799e396cde665bd960665Rob Clark return false; 733f0e9a632a12798bd727799e396cde665bd960665Rob Clark } 734f0e9a632a12798bd727799e396cde665bd960665Rob Clark} 735f0e9a632a12798bd727799e396cde665bd960665Rob Clark 7362855f3f7bcd9b36a275e942c9c7d0eb8e485c16fRob Clark#endif /* INSTR_A3XX_H_ */ 737