instr-a3xx.h revision 7e102996
17e102996Smaya/* 27e102996Smaya * Copyright (c) 2013 Rob Clark <robdclark@gmail.com> 37e102996Smaya * 47e102996Smaya * Permission is hereby granted, free of charge, to any person obtaining a 57e102996Smaya * copy of this software and associated documentation files (the "Software"), 67e102996Smaya * to deal in the Software without restriction, including without limitation 77e102996Smaya * the rights to use, copy, modify, merge, publish, distribute, sublicense, 87e102996Smaya * and/or sell copies of the Software, and to permit persons to whom the 97e102996Smaya * Software is furnished to do so, subject to the following conditions: 107e102996Smaya * 117e102996Smaya * The above copyright notice and this permission notice (including the next 127e102996Smaya * paragraph) shall be included in all copies or substantial portions of the 137e102996Smaya * Software. 147e102996Smaya * 157e102996Smaya * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 167e102996Smaya * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 177e102996Smaya * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 187e102996Smaya * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 197e102996Smaya * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 207e102996Smaya * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 217e102996Smaya * SOFTWARE. 227e102996Smaya */ 237e102996Smaya 247e102996Smaya#ifndef INSTR_A3XX_H_ 257e102996Smaya#define INSTR_A3XX_H_ 267e102996Smaya 277e102996Smaya#define PACKED __attribute__((__packed__)) 287e102996Smaya 297e102996Smaya#include <stdint.h> 307e102996Smaya#include <stdio.h> 317e102996Smaya#include <stdbool.h> 327e102996Smaya#include <assert.h> 337e102996Smaya 347e102996Smaya/* size of largest OPC field of all the instruction categories: */ 357e102996Smaya#define NOPC_BITS 6 367e102996Smaya 377e102996Smaya#define _OPC(cat, opc) (((cat) << NOPC_BITS) | opc) 387e102996Smaya 397e102996Smayatypedef enum { 407e102996Smaya /* category 0: */ 417e102996Smaya OPC_NOP = _OPC(0, 0), 427e102996Smaya OPC_BR = _OPC(0, 1), 437e102996Smaya OPC_JUMP = _OPC(0, 2), 447e102996Smaya OPC_CALL = _OPC(0, 3), 457e102996Smaya OPC_RET = _OPC(0, 4), 467e102996Smaya OPC_KILL = _OPC(0, 5), 477e102996Smaya OPC_END = _OPC(0, 6), 487e102996Smaya OPC_EMIT = _OPC(0, 7), 497e102996Smaya OPC_CUT = _OPC(0, 8), 507e102996Smaya OPC_CHMASK = _OPC(0, 9), 517e102996Smaya OPC_CHSH = _OPC(0, 10), 527e102996Smaya OPC_FLOW_REV = _OPC(0, 11), 537e102996Smaya 547e102996Smaya /* category 1: */ 557e102996Smaya OPC_MOV = _OPC(1, 0), 567e102996Smaya 577e102996Smaya /* category 2: */ 587e102996Smaya OPC_ADD_F = _OPC(2, 0), 597e102996Smaya OPC_MIN_F = _OPC(2, 1), 607e102996Smaya OPC_MAX_F = _OPC(2, 2), 617e102996Smaya OPC_MUL_F = _OPC(2, 3), 627e102996Smaya OPC_SIGN_F = _OPC(2, 4), 637e102996Smaya OPC_CMPS_F = _OPC(2, 5), 647e102996Smaya OPC_ABSNEG_F = _OPC(2, 6), 657e102996Smaya OPC_CMPV_F = _OPC(2, 7), 667e102996Smaya /* 8 - invalid */ 677e102996Smaya OPC_FLOOR_F = _OPC(2, 9), 687e102996Smaya OPC_CEIL_F = _OPC(2, 10), 697e102996Smaya OPC_RNDNE_F = _OPC(2, 11), 707e102996Smaya OPC_RNDAZ_F = _OPC(2, 12), 717e102996Smaya OPC_TRUNC_F = _OPC(2, 13), 727e102996Smaya /* 14-15 - invalid */ 737e102996Smaya OPC_ADD_U = _OPC(2, 16), 747e102996Smaya OPC_ADD_S = _OPC(2, 17), 757e102996Smaya OPC_SUB_U = _OPC(2, 18), 767e102996Smaya OPC_SUB_S = _OPC(2, 19), 777e102996Smaya OPC_CMPS_U = _OPC(2, 20), 787e102996Smaya OPC_CMPS_S = _OPC(2, 21), 797e102996Smaya OPC_MIN_U = _OPC(2, 22), 807e102996Smaya OPC_MIN_S = _OPC(2, 23), 817e102996Smaya OPC_MAX_U = _OPC(2, 24), 827e102996Smaya OPC_MAX_S = _OPC(2, 25), 837e102996Smaya OPC_ABSNEG_S = _OPC(2, 26), 847e102996Smaya /* 27 - invalid */ 857e102996Smaya OPC_AND_B = _OPC(2, 28), 867e102996Smaya OPC_OR_B = _OPC(2, 29), 877e102996Smaya OPC_NOT_B = _OPC(2, 30), 887e102996Smaya OPC_XOR_B = _OPC(2, 31), 897e102996Smaya /* 32 - invalid */ 907e102996Smaya OPC_CMPV_U = _OPC(2, 33), 917e102996Smaya OPC_CMPV_S = _OPC(2, 34), 927e102996Smaya /* 35-47 - invalid */ 937e102996Smaya OPC_MUL_U = _OPC(2, 48), 947e102996Smaya OPC_MUL_S = _OPC(2, 49), 957e102996Smaya OPC_MULL_U = _OPC(2, 50), 967e102996Smaya OPC_BFREV_B = _OPC(2, 51), 977e102996Smaya OPC_CLZ_S = _OPC(2, 52), 987e102996Smaya OPC_CLZ_B = _OPC(2, 53), 997e102996Smaya OPC_SHL_B = _OPC(2, 54), 1007e102996Smaya OPC_SHR_B = _OPC(2, 55), 1017e102996Smaya OPC_ASHR_B = _OPC(2, 56), 1027e102996Smaya OPC_BARY_F = _OPC(2, 57), 1037e102996Smaya OPC_MGEN_B = _OPC(2, 58), 1047e102996Smaya OPC_GETBIT_B = _OPC(2, 59), 1057e102996Smaya OPC_SETRM = _OPC(2, 60), 1067e102996Smaya OPC_CBITS_B = _OPC(2, 61), 1077e102996Smaya OPC_SHB = _OPC(2, 62), 1087e102996Smaya OPC_MSAD = _OPC(2, 63), 1097e102996Smaya 1107e102996Smaya /* category 3: */ 1117e102996Smaya OPC_MAD_U16 = _OPC(3, 0), 1127e102996Smaya OPC_MADSH_U16 = _OPC(3, 1), 1137e102996Smaya OPC_MAD_S16 = _OPC(3, 2), 1147e102996Smaya OPC_MADSH_M16 = _OPC(3, 3), /* should this be .s16? */ 1157e102996Smaya OPC_MAD_U24 = _OPC(3, 4), 1167e102996Smaya OPC_MAD_S24 = _OPC(3, 5), 1177e102996Smaya OPC_MAD_F16 = _OPC(3, 6), 1187e102996Smaya OPC_MAD_F32 = _OPC(3, 7), 1197e102996Smaya OPC_SEL_B16 = _OPC(3, 8), 1207e102996Smaya OPC_SEL_B32 = _OPC(3, 9), 1217e102996Smaya OPC_SEL_S16 = _OPC(3, 10), 1227e102996Smaya OPC_SEL_S32 = _OPC(3, 11), 1237e102996Smaya OPC_SEL_F16 = _OPC(3, 12), 1247e102996Smaya OPC_SEL_F32 = _OPC(3, 13), 1257e102996Smaya OPC_SAD_S16 = _OPC(3, 14), 1267e102996Smaya OPC_SAD_S32 = _OPC(3, 15), 1277e102996Smaya 1287e102996Smaya /* category 4: */ 1297e102996Smaya OPC_RCP = _OPC(4, 0), 1307e102996Smaya OPC_RSQ = _OPC(4, 1), 1317e102996Smaya OPC_LOG2 = _OPC(4, 2), 1327e102996Smaya OPC_EXP2 = _OPC(4, 3), 1337e102996Smaya OPC_SIN = _OPC(4, 4), 1347e102996Smaya OPC_COS = _OPC(4, 5), 1357e102996Smaya OPC_SQRT = _OPC(4, 6), 1367e102996Smaya // 7-63 - invalid 1377e102996Smaya 1387e102996Smaya /* category 5: */ 1397e102996Smaya OPC_ISAM = _OPC(5, 0), 1407e102996Smaya OPC_ISAML = _OPC(5, 1), 1417e102996Smaya OPC_ISAMM = _OPC(5, 2), 1427e102996Smaya OPC_SAM = _OPC(5, 3), 1437e102996Smaya OPC_SAMB = _OPC(5, 4), 1447e102996Smaya OPC_SAML = _OPC(5, 5), 1457e102996Smaya OPC_SAMGQ = _OPC(5, 6), 1467e102996Smaya OPC_GETLOD = _OPC(5, 7), 1477e102996Smaya OPC_CONV = _OPC(5, 8), 1487e102996Smaya OPC_CONVM = _OPC(5, 9), 1497e102996Smaya OPC_GETSIZE = _OPC(5, 10), 1507e102996Smaya OPC_GETBUF = _OPC(5, 11), 1517e102996Smaya OPC_GETPOS = _OPC(5, 12), 1527e102996Smaya OPC_GETINFO = _OPC(5, 13), 1537e102996Smaya OPC_DSX = _OPC(5, 14), 1547e102996Smaya OPC_DSY = _OPC(5, 15), 1557e102996Smaya OPC_GATHER4R = _OPC(5, 16), 1567e102996Smaya OPC_GATHER4G = _OPC(5, 17), 1577e102996Smaya OPC_GATHER4B = _OPC(5, 18), 1587e102996Smaya OPC_GATHER4A = _OPC(5, 19), 1597e102996Smaya OPC_SAMGP0 = _OPC(5, 20), 1607e102996Smaya OPC_SAMGP1 = _OPC(5, 21), 1617e102996Smaya OPC_SAMGP2 = _OPC(5, 22), 1627e102996Smaya OPC_SAMGP3 = _OPC(5, 23), 1637e102996Smaya OPC_DSXPP_1 = _OPC(5, 24), 1647e102996Smaya OPC_DSYPP_1 = _OPC(5, 25), 1657e102996Smaya OPC_RGETPOS = _OPC(5, 26), 1667e102996Smaya OPC_RGETINFO = _OPC(5, 27), 1677e102996Smaya 1687e102996Smaya /* category 6: */ 1697e102996Smaya OPC_LDG = _OPC(6, 0), /* load-global */ 1707e102996Smaya OPC_LDL = _OPC(6, 1), 1717e102996Smaya OPC_LDP = _OPC(6, 2), 1727e102996Smaya OPC_STG = _OPC(6, 3), /* store-global */ 1737e102996Smaya OPC_STL = _OPC(6, 4), 1747e102996Smaya OPC_STP = _OPC(6, 5), 1757e102996Smaya OPC_LDIB = _OPC(6, 6), 1767e102996Smaya OPC_G2L = _OPC(6, 7), 1777e102996Smaya OPC_L2G = _OPC(6, 8), 1787e102996Smaya OPC_PREFETCH = _OPC(6, 9), 1797e102996Smaya OPC_LDLW = _OPC(6, 10), 1807e102996Smaya OPC_STLW = _OPC(6, 11), 1817e102996Smaya OPC_RESFMT = _OPC(6, 14), 1827e102996Smaya OPC_RESINFO = _OPC(6, 15), 1837e102996Smaya OPC_ATOMIC_ADD = _OPC(6, 16), 1847e102996Smaya OPC_ATOMIC_SUB = _OPC(6, 17), 1857e102996Smaya OPC_ATOMIC_XCHG = _OPC(6, 18), 1867e102996Smaya OPC_ATOMIC_INC = _OPC(6, 19), 1877e102996Smaya OPC_ATOMIC_DEC = _OPC(6, 20), 1887e102996Smaya OPC_ATOMIC_CMPXCHG = _OPC(6, 21), 1897e102996Smaya OPC_ATOMIC_MIN = _OPC(6, 22), 1907e102996Smaya OPC_ATOMIC_MAX = _OPC(6, 23), 1917e102996Smaya OPC_ATOMIC_AND = _OPC(6, 24), 1927e102996Smaya OPC_ATOMIC_OR = _OPC(6, 25), 1937e102996Smaya OPC_ATOMIC_XOR = _OPC(6, 26), 1947e102996Smaya OPC_LDGB = _OPC(6, 27), 1957e102996Smaya OPC_STGB = _OPC(6, 28), 1967e102996Smaya OPC_STIB = _OPC(6, 29), 1977e102996Smaya OPC_LDC = _OPC(6, 30), 1987e102996Smaya OPC_LDLV = _OPC(6, 31), 1997e102996Smaya 2007e102996Smaya /* category 7: */ 2017e102996Smaya OPC_BAR = _OPC(7, 0), 2027e102996Smaya OPC_FENCE = _OPC(7, 1), 2037e102996Smaya 2047e102996Smaya /* meta instructions (category -1): */ 2057e102996Smaya /* placeholder instr to mark shader inputs: */ 2067e102996Smaya OPC_META_INPUT = _OPC(-1, 0), 2077e102996Smaya /* The "fan-in" and "fan-out" instructions are used for keeping 2087e102996Smaya * track of instructions that write to multiple dst registers 2097e102996Smaya * (fan-out) like texture sample instructions, or read multiple 2107e102996Smaya * consecutive scalar registers (fan-in) (bary.f, texture samp) 2117e102996Smaya */ 2127e102996Smaya OPC_META_FO = _OPC(-1, 2), 2137e102996Smaya OPC_META_FI = _OPC(-1, 3), 2147e102996Smaya 2157e102996Smaya} opc_t; 2167e102996Smaya 2177e102996Smaya#define opc_cat(opc) ((int)((opc) >> NOPC_BITS)) 2187e102996Smaya#define opc_op(opc) ((unsigned)((opc) & ((1 << NOPC_BITS) - 1))) 2197e102996Smaya 2207e102996Smayatypedef enum { 2217e102996Smaya TYPE_F16 = 0, 2227e102996Smaya TYPE_F32 = 1, 2237e102996Smaya TYPE_U16 = 2, 2247e102996Smaya TYPE_U32 = 3, 2257e102996Smaya TYPE_S16 = 4, 2267e102996Smaya TYPE_S32 = 5, 2277e102996Smaya TYPE_U8 = 6, 2287e102996Smaya TYPE_S8 = 7, // XXX I assume? 2297e102996Smaya} type_t; 2307e102996Smaya 2317e102996Smayastatic inline uint32_t type_size(type_t type) 2327e102996Smaya{ 2337e102996Smaya switch (type) { 2347e102996Smaya case TYPE_F32: 2357e102996Smaya case TYPE_U32: 2367e102996Smaya case TYPE_S32: 2377e102996Smaya return 32; 2387e102996Smaya case TYPE_F16: 2397e102996Smaya case TYPE_U16: 2407e102996Smaya case TYPE_S16: 2417e102996Smaya return 16; 2427e102996Smaya case TYPE_U8: 2437e102996Smaya case TYPE_S8: 2447e102996Smaya return 8; 2457e102996Smaya default: 2467e102996Smaya assert(0); /* invalid type */ 2477e102996Smaya return 0; 2487e102996Smaya } 2497e102996Smaya} 2507e102996Smaya 2517e102996Smayastatic inline int type_float(type_t type) 2527e102996Smaya{ 2537e102996Smaya return (type == TYPE_F32) || (type == TYPE_F16); 2547e102996Smaya} 2557e102996Smaya 2567e102996Smayastatic inline int type_uint(type_t type) 2577e102996Smaya{ 2587e102996Smaya return (type == TYPE_U32) || (type == TYPE_U16) || (type == TYPE_U8); 2597e102996Smaya} 2607e102996Smaya 2617e102996Smayastatic inline int type_sint(type_t type) 2627e102996Smaya{ 2637e102996Smaya return (type == TYPE_S32) || (type == TYPE_S16) || (type == TYPE_S8); 2647e102996Smaya} 2657e102996Smaya 2667e102996Smayatypedef union PACKED { 2677e102996Smaya /* normal gpr or const src register: */ 2687e102996Smaya struct PACKED { 2697e102996Smaya uint32_t comp : 2; 2707e102996Smaya uint32_t num : 10; 2717e102996Smaya }; 2727e102996Smaya /* for immediate val: */ 2737e102996Smaya int32_t iim_val : 11; 2747e102996Smaya /* to make compiler happy: */ 2757e102996Smaya uint32_t dummy32; 2767e102996Smaya uint32_t dummy10 : 10; 2777e102996Smaya int32_t idummy10 : 10; 2787e102996Smaya uint32_t dummy11 : 11; 2797e102996Smaya uint32_t dummy12 : 12; 2807e102996Smaya uint32_t dummy13 : 13; 2817e102996Smaya uint32_t dummy8 : 8; 2827e102996Smaya} reg_t; 2837e102996Smaya 2847e102996Smaya/* special registers: */ 2857e102996Smaya#define REG_A0 61 /* address register */ 2867e102996Smaya#define REG_P0 62 /* predicate register */ 2877e102996Smaya 2887e102996Smayastatic inline int reg_special(reg_t reg) 2897e102996Smaya{ 2907e102996Smaya return (reg.num == REG_A0) || (reg.num == REG_P0); 2917e102996Smaya} 2927e102996Smaya 2937e102996Smayatypedef struct PACKED { 2947e102996Smaya /* dword0: */ 2957e102996Smaya union PACKED { 2967e102996Smaya struct PACKED { 2977e102996Smaya int16_t immed : 16; 2987e102996Smaya uint32_t dummy1 : 16; 2997e102996Smaya } a3xx; 3007e102996Smaya struct PACKED { 3017e102996Smaya int32_t immed : 20; 3027e102996Smaya uint32_t dummy1 : 12; 3037e102996Smaya } a4xx; 3047e102996Smaya struct PACKED { 3057e102996Smaya int32_t immed : 32; 3067e102996Smaya } a5xx; 3077e102996Smaya }; 3087e102996Smaya 3097e102996Smaya /* dword1: */ 3107e102996Smaya uint32_t dummy2 : 8; 3117e102996Smaya uint32_t repeat : 3; 3127e102996Smaya uint32_t dummy3 : 1; 3137e102996Smaya uint32_t ss : 1; 3147e102996Smaya uint32_t dummy4 : 7; 3157e102996Smaya uint32_t inv : 1; 3167e102996Smaya uint32_t comp : 2; 3177e102996Smaya uint32_t opc : 4; 3187e102996Smaya uint32_t jmp_tgt : 1; 3197e102996Smaya uint32_t sync : 1; 3207e102996Smaya uint32_t opc_cat : 3; 3217e102996Smaya} instr_cat0_t; 3227e102996Smaya 3237e102996Smayatypedef struct PACKED { 3247e102996Smaya /* dword0: */ 3257e102996Smaya union PACKED { 3267e102996Smaya /* for normal src register: */ 3277e102996Smaya struct PACKED { 3287e102996Smaya uint32_t src : 11; 3297e102996Smaya /* at least low bit of pad must be zero or it will 3307e102996Smaya * look like a address relative src 3317e102996Smaya */ 3327e102996Smaya uint32_t pad : 21; 3337e102996Smaya }; 3347e102996Smaya /* for address relative: */ 3357e102996Smaya struct PACKED { 3367e102996Smaya int32_t off : 10; 3377e102996Smaya uint32_t src_rel_c : 1; 3387e102996Smaya uint32_t src_rel : 1; 3397e102996Smaya uint32_t unknown : 20; 3407e102996Smaya }; 3417e102996Smaya /* for immediate: */ 3427e102996Smaya int32_t iim_val; 3437e102996Smaya uint32_t uim_val; 3447e102996Smaya float fim_val; 3457e102996Smaya }; 3467e102996Smaya 3477e102996Smaya /* dword1: */ 3487e102996Smaya uint32_t dst : 8; 3497e102996Smaya uint32_t repeat : 3; 3507e102996Smaya uint32_t src_r : 1; 3517e102996Smaya uint32_t ss : 1; 3527e102996Smaya uint32_t ul : 1; 3537e102996Smaya uint32_t dst_type : 3; 3547e102996Smaya uint32_t dst_rel : 1; 3557e102996Smaya uint32_t src_type : 3; 3567e102996Smaya uint32_t src_c : 1; 3577e102996Smaya uint32_t src_im : 1; 3587e102996Smaya uint32_t even : 1; 3597e102996Smaya uint32_t pos_inf : 1; 3607e102996Smaya uint32_t must_be_0 : 2; 3617e102996Smaya uint32_t jmp_tgt : 1; 3627e102996Smaya uint32_t sync : 1; 3637e102996Smaya uint32_t opc_cat : 3; 3647e102996Smaya} instr_cat1_t; 3657e102996Smaya 3667e102996Smayatypedef struct PACKED { 3677e102996Smaya /* dword0: */ 3687e102996Smaya union PACKED { 3697e102996Smaya struct PACKED { 3707e102996Smaya uint32_t src1 : 11; 3717e102996Smaya uint32_t must_be_zero1: 2; 3727e102996Smaya uint32_t src1_im : 1; /* immediate */ 3737e102996Smaya uint32_t src1_neg : 1; /* negate */ 3747e102996Smaya uint32_t src1_abs : 1; /* absolute value */ 3757e102996Smaya }; 3767e102996Smaya struct PACKED { 3777e102996Smaya uint32_t src1 : 10; 3787e102996Smaya uint32_t src1_c : 1; /* relative-const */ 3797e102996Smaya uint32_t src1_rel : 1; /* relative address */ 3807e102996Smaya uint32_t must_be_zero : 1; 3817e102996Smaya uint32_t dummy : 3; 3827e102996Smaya } rel1; 3837e102996Smaya struct PACKED { 3847e102996Smaya uint32_t src1 : 12; 3857e102996Smaya uint32_t src1_c : 1; /* const */ 3867e102996Smaya uint32_t dummy : 3; 3877e102996Smaya } c1; 3887e102996Smaya }; 3897e102996Smaya 3907e102996Smaya union PACKED { 3917e102996Smaya struct PACKED { 3927e102996Smaya uint32_t src2 : 11; 3937e102996Smaya uint32_t must_be_zero2: 2; 3947e102996Smaya uint32_t src2_im : 1; /* immediate */ 3957e102996Smaya uint32_t src2_neg : 1; /* negate */ 3967e102996Smaya uint32_t src2_abs : 1; /* absolute value */ 3977e102996Smaya }; 3987e102996Smaya struct PACKED { 3997e102996Smaya uint32_t src2 : 10; 4007e102996Smaya uint32_t src2_c : 1; /* relative-const */ 4017e102996Smaya uint32_t src2_rel : 1; /* relative address */ 4027e102996Smaya uint32_t must_be_zero : 1; 4037e102996Smaya uint32_t dummy : 3; 4047e102996Smaya } rel2; 4057e102996Smaya struct PACKED { 4067e102996Smaya uint32_t src2 : 12; 4077e102996Smaya uint32_t src2_c : 1; /* const */ 4087e102996Smaya uint32_t dummy : 3; 4097e102996Smaya } c2; 4107e102996Smaya }; 4117e102996Smaya 4127e102996Smaya /* dword1: */ 4137e102996Smaya uint32_t dst : 8; 4147e102996Smaya uint32_t repeat : 2; 4157e102996Smaya uint32_t sat : 1; 4167e102996Smaya uint32_t src1_r : 1; /* doubles as nop0 if repeat==0 */ 4177e102996Smaya uint32_t ss : 1; 4187e102996Smaya uint32_t ul : 1; /* dunno */ 4197e102996Smaya uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 4207e102996Smaya uint32_t ei : 1; 4217e102996Smaya uint32_t cond : 3; 4227e102996Smaya uint32_t src2_r : 1; /* doubles as nop1 if repeat==0 */ 4237e102996Smaya uint32_t full : 1; /* not half */ 4247e102996Smaya uint32_t opc : 6; 4257e102996Smaya uint32_t jmp_tgt : 1; 4267e102996Smaya uint32_t sync : 1; 4277e102996Smaya uint32_t opc_cat : 3; 4287e102996Smaya} instr_cat2_t; 4297e102996Smaya 4307e102996Smayatypedef struct PACKED { 4317e102996Smaya /* dword0: */ 4327e102996Smaya union PACKED { 4337e102996Smaya struct PACKED { 4347e102996Smaya uint32_t src1 : 11; 4357e102996Smaya uint32_t must_be_zero1: 2; 4367e102996Smaya uint32_t src2_c : 1; 4377e102996Smaya uint32_t src1_neg : 1; 4387e102996Smaya uint32_t src2_r : 1; /* doubles as nop1 if repeat==0 */ 4397e102996Smaya }; 4407e102996Smaya struct PACKED { 4417e102996Smaya uint32_t src1 : 10; 4427e102996Smaya uint32_t src1_c : 1; 4437e102996Smaya uint32_t src1_rel : 1; 4447e102996Smaya uint32_t must_be_zero : 1; 4457e102996Smaya uint32_t dummy : 3; 4467e102996Smaya } rel1; 4477e102996Smaya struct PACKED { 4487e102996Smaya uint32_t src1 : 12; 4497e102996Smaya uint32_t src1_c : 1; 4507e102996Smaya uint32_t dummy : 3; 4517e102996Smaya } c1; 4527e102996Smaya }; 4537e102996Smaya 4547e102996Smaya union PACKED { 4557e102996Smaya struct PACKED { 4567e102996Smaya uint32_t src3 : 11; 4577e102996Smaya uint32_t must_be_zero2: 2; 4587e102996Smaya uint32_t src3_r : 1; 4597e102996Smaya uint32_t src2_neg : 1; 4607e102996Smaya uint32_t src3_neg : 1; 4617e102996Smaya }; 4627e102996Smaya struct PACKED { 4637e102996Smaya uint32_t src3 : 10; 4647e102996Smaya uint32_t src3_c : 1; 4657e102996Smaya uint32_t src3_rel : 1; 4667e102996Smaya uint32_t must_be_zero : 1; 4677e102996Smaya uint32_t dummy : 3; 4687e102996Smaya } rel2; 4697e102996Smaya struct PACKED { 4707e102996Smaya uint32_t src3 : 12; 4717e102996Smaya uint32_t src3_c : 1; 4727e102996Smaya uint32_t dummy : 3; 4737e102996Smaya } c2; 4747e102996Smaya }; 4757e102996Smaya 4767e102996Smaya /* dword1: */ 4777e102996Smaya uint32_t dst : 8; 4787e102996Smaya uint32_t repeat : 2; 4797e102996Smaya uint32_t sat : 1; 4807e102996Smaya uint32_t src1_r : 1; /* doubles as nop0 if repeat==0 */ 4817e102996Smaya uint32_t ss : 1; 4827e102996Smaya uint32_t ul : 1; 4837e102996Smaya uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 4847e102996Smaya uint32_t src2 : 8; 4857e102996Smaya uint32_t opc : 4; 4867e102996Smaya uint32_t jmp_tgt : 1; 4877e102996Smaya uint32_t sync : 1; 4887e102996Smaya uint32_t opc_cat : 3; 4897e102996Smaya} instr_cat3_t; 4907e102996Smaya 4917e102996Smayastatic inline bool instr_cat3_full(instr_cat3_t *cat3) 4927e102996Smaya{ 4937e102996Smaya switch (_OPC(3, cat3->opc)) { 4947e102996Smaya case OPC_MAD_F16: 4957e102996Smaya case OPC_MAD_U16: 4967e102996Smaya case OPC_MAD_S16: 4977e102996Smaya case OPC_SEL_B16: 4987e102996Smaya case OPC_SEL_S16: 4997e102996Smaya case OPC_SEL_F16: 5007e102996Smaya case OPC_SAD_S16: 5017e102996Smaya case OPC_SAD_S32: // really?? 5027e102996Smaya return false; 5037e102996Smaya default: 5047e102996Smaya return true; 5057e102996Smaya } 5067e102996Smaya} 5077e102996Smaya 5087e102996Smayatypedef struct PACKED { 5097e102996Smaya /* dword0: */ 5107e102996Smaya union PACKED { 5117e102996Smaya struct PACKED { 5127e102996Smaya uint32_t src : 11; 5137e102996Smaya uint32_t must_be_zero1: 2; 5147e102996Smaya uint32_t src_im : 1; /* immediate */ 5157e102996Smaya uint32_t src_neg : 1; /* negate */ 5167e102996Smaya uint32_t src_abs : 1; /* absolute value */ 5177e102996Smaya }; 5187e102996Smaya struct PACKED { 5197e102996Smaya uint32_t src : 10; 5207e102996Smaya uint32_t src_c : 1; /* relative-const */ 5217e102996Smaya uint32_t src_rel : 1; /* relative address */ 5227e102996Smaya uint32_t must_be_zero : 1; 5237e102996Smaya uint32_t dummy : 3; 5247e102996Smaya } rel; 5257e102996Smaya struct PACKED { 5267e102996Smaya uint32_t src : 12; 5277e102996Smaya uint32_t src_c : 1; /* const */ 5287e102996Smaya uint32_t dummy : 3; 5297e102996Smaya } c; 5307e102996Smaya }; 5317e102996Smaya uint32_t dummy1 : 16; /* seem to be ignored */ 5327e102996Smaya 5337e102996Smaya /* dword1: */ 5347e102996Smaya uint32_t dst : 8; 5357e102996Smaya uint32_t repeat : 2; 5367e102996Smaya uint32_t sat : 1; 5377e102996Smaya uint32_t src_r : 1; 5387e102996Smaya uint32_t ss : 1; 5397e102996Smaya uint32_t ul : 1; 5407e102996Smaya uint32_t dst_half : 1; /* or widen/narrow.. ie. dst hrN <-> rN */ 5417e102996Smaya uint32_t dummy2 : 5; /* seem to be ignored */ 5427e102996Smaya uint32_t full : 1; /* not half */ 5437e102996Smaya uint32_t opc : 6; 5447e102996Smaya uint32_t jmp_tgt : 1; 5457e102996Smaya uint32_t sync : 1; 5467e102996Smaya uint32_t opc_cat : 3; 5477e102996Smaya} instr_cat4_t; 5487e102996Smaya 5497e102996Smayatypedef struct PACKED { 5507e102996Smaya /* dword0: */ 5517e102996Smaya union PACKED { 5527e102996Smaya /* normal case: */ 5537e102996Smaya struct PACKED { 5547e102996Smaya uint32_t full : 1; /* not half */ 5557e102996Smaya uint32_t src1 : 8; 5567e102996Smaya uint32_t src2 : 8; 5577e102996Smaya uint32_t dummy1 : 4; /* seem to be ignored */ 5587e102996Smaya uint32_t samp : 4; 5597e102996Smaya uint32_t tex : 7; 5607e102996Smaya } norm; 5617e102996Smaya /* s2en case: */ 5627e102996Smaya struct PACKED { 5637e102996Smaya uint32_t full : 1; /* not half */ 5647e102996Smaya uint32_t src1 : 8; 5657e102996Smaya uint32_t src2 : 11; 5667e102996Smaya uint32_t dummy1 : 1; 5677e102996Smaya uint32_t src3 : 8; 5687e102996Smaya uint32_t dummy2 : 3; 5697e102996Smaya } s2en; 5707e102996Smaya /* same in either case: */ 5717e102996Smaya // XXX I think, confirm this 5727e102996Smaya struct PACKED { 5737e102996Smaya uint32_t full : 1; /* not half */ 5747e102996Smaya uint32_t src1 : 8; 5757e102996Smaya uint32_t pad : 23; 5767e102996Smaya }; 5777e102996Smaya }; 5787e102996Smaya 5797e102996Smaya /* dword1: */ 5807e102996Smaya uint32_t dst : 8; 5817e102996Smaya uint32_t wrmask : 4; /* write-mask */ 5827e102996Smaya uint32_t type : 3; 5837e102996Smaya uint32_t dummy2 : 1; /* seems to be ignored */ 5847e102996Smaya uint32_t is_3d : 1; 5857e102996Smaya 5867e102996Smaya uint32_t is_a : 1; 5877e102996Smaya uint32_t is_s : 1; 5887e102996Smaya uint32_t is_s2en : 1; 5897e102996Smaya uint32_t is_o : 1; 5907e102996Smaya uint32_t is_p : 1; 5917e102996Smaya 5927e102996Smaya uint32_t opc : 5; 5937e102996Smaya uint32_t jmp_tgt : 1; 5947e102996Smaya uint32_t sync : 1; 5957e102996Smaya uint32_t opc_cat : 3; 5967e102996Smaya} instr_cat5_t; 5977e102996Smaya 5987e102996Smaya/* dword0 encoding for src_off: [src1 + off], src2: */ 5997e102996Smayatypedef struct PACKED { 6007e102996Smaya /* dword0: */ 6017e102996Smaya uint32_t mustbe1 : 1; 6027e102996Smaya int32_t off : 13; 6037e102996Smaya uint32_t src1 : 8; 6047e102996Smaya uint32_t src1_im : 1; 6057e102996Smaya uint32_t src2_im : 1; 6067e102996Smaya uint32_t src2 : 8; 6077e102996Smaya 6087e102996Smaya /* dword1: */ 6097e102996Smaya uint32_t dword1; 6107e102996Smaya} instr_cat6a_t; 6117e102996Smaya 6127e102996Smaya/* dword0 encoding for !src_off: [src1], src2 */ 6137e102996Smayatypedef struct PACKED { 6147e102996Smaya /* dword0: */ 6157e102996Smaya uint32_t mustbe0 : 1; 6167e102996Smaya uint32_t src1 : 13; 6177e102996Smaya uint32_t ignore0 : 8; 6187e102996Smaya uint32_t src1_im : 1; 6197e102996Smaya uint32_t src2_im : 1; 6207e102996Smaya uint32_t src2 : 8; 6217e102996Smaya 6227e102996Smaya /* dword1: */ 6237e102996Smaya uint32_t dword1; 6247e102996Smaya} instr_cat6b_t; 6257e102996Smaya 6267e102996Smaya/* dword1 encoding for dst_off: */ 6277e102996Smayatypedef struct PACKED { 6287e102996Smaya /* dword0: */ 6297e102996Smaya uint32_t dword0; 6307e102996Smaya 6317e102996Smaya /* note: there is some weird stuff going on where sometimes 6327e102996Smaya * cat6->a.off is involved.. but that seems like a bug in 6337e102996Smaya * the blob, since it is used even if !cat6->src_off 6347e102996Smaya * It would make sense for there to be some more bits to 6357e102996Smaya * bring us to 11 bits worth of offset, but not sure.. 6367e102996Smaya */ 6377e102996Smaya int32_t off : 8; 6387e102996Smaya uint32_t mustbe1 : 1; 6397e102996Smaya uint32_t dst : 8; 6407e102996Smaya uint32_t pad1 : 15; 6417e102996Smaya} instr_cat6c_t; 6427e102996Smaya 6437e102996Smaya/* dword1 encoding for !dst_off: */ 6447e102996Smayatypedef struct PACKED { 6457e102996Smaya /* dword0: */ 6467e102996Smaya uint32_t dword0; 6477e102996Smaya 6487e102996Smaya uint32_t dst : 8; 6497e102996Smaya uint32_t mustbe0 : 1; 6507e102996Smaya uint32_t idx : 8; 6517e102996Smaya uint32_t pad0 : 15; 6527e102996Smaya} instr_cat6d_t; 6537e102996Smaya 6547e102996Smaya/* ldgb and atomics.. 6557e102996Smaya * 6567e102996Smaya * ldgb: pad0=0, pad3=1 6577e102996Smaya * atomic .g: pad0=1, pad3=1 6587e102996Smaya * .l: pad0=1, pad3=0 6597e102996Smaya */ 6607e102996Smayatypedef struct PACKED { 6617e102996Smaya /* dword0: */ 6627e102996Smaya uint32_t pad0 : 1; 6637e102996Smaya uint32_t src3 : 8; 6647e102996Smaya uint32_t d : 2; 6657e102996Smaya uint32_t typed : 1; 6667e102996Smaya uint32_t type_size : 2; 6677e102996Smaya uint32_t src1 : 8; 6687e102996Smaya uint32_t src1_im : 1; 6697e102996Smaya uint32_t src2_im : 1; 6707e102996Smaya uint32_t src2 : 8; 6717e102996Smaya 6727e102996Smaya /* dword1: */ 6737e102996Smaya uint32_t dst : 8; 6747e102996Smaya uint32_t mustbe0 : 1; 6757e102996Smaya uint32_t src_ssbo : 8; 6767e102996Smaya uint32_t pad2 : 3; // type 6777e102996Smaya uint32_t g : 1; 6787e102996Smaya uint32_t pad3 : 1; 6797e102996Smaya uint32_t pad4 : 10; // opc/jmp_tgt/sync/opc_cat 6807e102996Smaya} instr_cat6ldgb_t; 6817e102996Smaya 6827e102996Smaya/* stgb, pad0=0, pad3=2 6837e102996Smaya */ 6847e102996Smayatypedef struct PACKED { 6857e102996Smaya /* dword0: */ 6867e102996Smaya uint32_t mustbe1 : 1; // ??? 6877e102996Smaya uint32_t src1 : 8; 6887e102996Smaya uint32_t d : 2; 6897e102996Smaya uint32_t typed : 1; 6907e102996Smaya uint32_t type_size : 2; 6917e102996Smaya uint32_t pad0 : 9; 6927e102996Smaya uint32_t src2_im : 1; 6937e102996Smaya uint32_t src2 : 8; 6947e102996Smaya 6957e102996Smaya /* dword1: */ 6967e102996Smaya uint32_t src3 : 8; 6977e102996Smaya uint32_t src3_im : 1; 6987e102996Smaya uint32_t dst_ssbo : 8; 6997e102996Smaya uint32_t pad2 : 3; // type 7007e102996Smaya uint32_t pad3 : 2; 7017e102996Smaya uint32_t pad4 : 10; // opc/jmp_tgt/sync/opc_cat 7027e102996Smaya} instr_cat6stgb_t; 7037e102996Smaya 7047e102996Smayatypedef union PACKED { 7057e102996Smaya instr_cat6a_t a; 7067e102996Smaya instr_cat6b_t b; 7077e102996Smaya instr_cat6c_t c; 7087e102996Smaya instr_cat6d_t d; 7097e102996Smaya instr_cat6ldgb_t ldgb; 7107e102996Smaya instr_cat6stgb_t stgb; 7117e102996Smaya struct PACKED { 7127e102996Smaya /* dword0: */ 7137e102996Smaya uint32_t src_off : 1; 7147e102996Smaya uint32_t pad1 : 31; 7157e102996Smaya 7167e102996Smaya /* dword1: */ 7177e102996Smaya uint32_t pad2 : 8; 7187e102996Smaya uint32_t dst_off : 1; 7197e102996Smaya uint32_t pad3 : 8; 7207e102996Smaya uint32_t type : 3; 7217e102996Smaya uint32_t g : 1; /* or in some cases it means dst immed */ 7227e102996Smaya uint32_t pad4 : 1; 7237e102996Smaya uint32_t opc : 5; 7247e102996Smaya uint32_t jmp_tgt : 1; 7257e102996Smaya uint32_t sync : 1; 7267e102996Smaya uint32_t opc_cat : 3; 7277e102996Smaya }; 7287e102996Smaya} instr_cat6_t; 7297e102996Smaya 7307e102996Smaya/** 7317e102996Smaya * For atomic ops (which return a value): 7327e102996Smaya * 7337e102996Smaya * pad1=1, pad2=c, pad3=0, pad4=3 7347e102996Smaya * src1 - vecN offset/coords 7357e102996Smaya * src2.x - is actually dest register 7367e102996Smaya * src2.y - is 'data' except for cmpxchg where src2.y is 'compare' 7377e102996Smaya * and src2.z is 'data' 7387e102996Smaya * 7397e102996Smaya * For stib (which does not return a value): 7407e102996Smaya * pad1=0, pad2=c, pad3=0, pad4=2 7417e102996Smaya * src1 - vecN offset/coords 7427e102996Smaya * src2 - value to store 7437e102996Smaya * 7447e102996Smaya * For ldib: 7457e102996Smaya * pad1=1, pad2=c, pad3=0, pad4=2 7467e102996Smaya * src1 - vecN offset/coords 7477e102996Smaya * 7487e102996Smaya * for ldc (load from UBO using descriptor): 7497e102996Smaya * pad1=0, pad2=8, pad3=0, pad4=2 7507e102996Smaya */ 7517e102996Smayatypedef struct PACKED { 7527e102996Smaya /* dword0: */ 7537e102996Smaya uint32_t pad1 : 9; 7547e102996Smaya uint32_t d : 2; 7557e102996Smaya uint32_t typed : 1; 7567e102996Smaya uint32_t type_size : 2; 7577e102996Smaya uint32_t opc : 5; 7587e102996Smaya uint32_t pad2 : 5; 7597e102996Smaya uint32_t src1 : 8; /* coordinate/offset */ 7607e102996Smaya 7617e102996Smaya /* dword1: */ 7627e102996Smaya uint32_t src2 : 8; /* or the dst for load instructions */ 7637e102996Smaya uint32_t pad3 : 1; //mustbe0 ?? or zero means imm vs reg for ssbo?? 7647e102996Smaya uint32_t ssbo : 8; /* ssbo/image binding point */ 7657e102996Smaya uint32_t type : 3; 7667e102996Smaya uint32_t pad4 : 7; 7677e102996Smaya uint32_t jmp_tgt : 1; 7687e102996Smaya uint32_t sync : 1; 7697e102996Smaya uint32_t opc_cat : 3; 7707e102996Smaya} instr_cat6_a6xx_t; 7717e102996Smaya 7727e102996Smayatypedef struct PACKED { 7737e102996Smaya /* dword0: */ 7747e102996Smaya uint32_t pad1 : 32; 7757e102996Smaya 7767e102996Smaya /* dword1: */ 7777e102996Smaya uint32_t pad2 : 12; 7787e102996Smaya uint32_t ss : 1; /* maybe in the encoding, but blob only uses (sy) */ 7797e102996Smaya uint32_t pad3 : 6; 7807e102996Smaya uint32_t w : 1; /* write */ 7817e102996Smaya uint32_t r : 1; /* read */ 7827e102996Smaya uint32_t l : 1; /* local */ 7837e102996Smaya uint32_t g : 1; /* global */ 7847e102996Smaya uint32_t opc : 4; /* presumed, but only a couple known OPCs */ 7857e102996Smaya uint32_t jmp_tgt : 1; /* (jp) */ 7867e102996Smaya uint32_t sync : 1; /* (sy) */ 7877e102996Smaya uint32_t opc_cat : 3; 7887e102996Smaya} instr_cat7_t; 7897e102996Smaya 7907e102996Smayatypedef union PACKED { 7917e102996Smaya instr_cat0_t cat0; 7927e102996Smaya instr_cat1_t cat1; 7937e102996Smaya instr_cat2_t cat2; 7947e102996Smaya instr_cat3_t cat3; 7957e102996Smaya instr_cat4_t cat4; 7967e102996Smaya instr_cat5_t cat5; 7977e102996Smaya instr_cat6_t cat6; 7987e102996Smaya instr_cat6_a6xx_t cat6_a6xx; 7997e102996Smaya instr_cat7_t cat7; 8007e102996Smaya struct PACKED { 8017e102996Smaya /* dword0: */ 8027e102996Smaya uint32_t pad1 : 32; 8037e102996Smaya 8047e102996Smaya /* dword1: */ 8057e102996Smaya uint32_t pad2 : 12; 8067e102996Smaya uint32_t ss : 1; /* cat1-cat4 (cat0??) and cat7 (?) */ 8077e102996Smaya uint32_t ul : 1; /* cat2-cat4 (and cat1 in blob.. which may be bug??) */ 8087e102996Smaya uint32_t pad3 : 13; 8097e102996Smaya uint32_t jmp_tgt : 1; 8107e102996Smaya uint32_t sync : 1; 8117e102996Smaya uint32_t opc_cat : 3; 8127e102996Smaya 8137e102996Smaya }; 8147e102996Smaya} instr_t; 8157e102996Smaya 8167e102996Smayastatic inline uint32_t instr_repeat(instr_t *instr) 8177e102996Smaya{ 8187e102996Smaya switch (instr->opc_cat) { 8197e102996Smaya case 0: return instr->cat0.repeat; 8207e102996Smaya case 1: return instr->cat1.repeat; 8217e102996Smaya case 2: return instr->cat2.repeat; 8227e102996Smaya case 3: return instr->cat3.repeat; 8237e102996Smaya case 4: return instr->cat4.repeat; 8247e102996Smaya default: return 0; 8257e102996Smaya } 8267e102996Smaya} 8277e102996Smaya 8287e102996Smayastatic inline bool instr_sat(instr_t *instr) 8297e102996Smaya{ 8307e102996Smaya switch (instr->opc_cat) { 8317e102996Smaya case 2: return instr->cat2.sat; 8327e102996Smaya case 3: return instr->cat3.sat; 8337e102996Smaya case 4: return instr->cat4.sat; 8347e102996Smaya default: return false; 8357e102996Smaya } 8367e102996Smaya} 8377e102996Smaya 8387e102996Smaya/* We can probably drop the gpu_id arg, but keeping it for now so we can 8397e102996Smaya * assert if we see something we think should be new encoding on an older 8407e102996Smaya * gpu. 8417e102996Smaya */ 8427e102996Smayastatic inline bool is_cat6_legacy(instr_t *instr, unsigned gpu_id) 8437e102996Smaya{ 8447e102996Smaya instr_cat6_a6xx_t *cat6 = &instr->cat6_a6xx; 8457e102996Smaya 8467e102996Smaya /* At least one of these two bits is pad in all the possible 8477e102996Smaya * "legacy" cat6 encodings, and a analysis of all the pre-a6xx 8487e102996Smaya * cmdstream traces I have indicates that the pad bit is zero 8497e102996Smaya * in all cases. So we can use this to detect new encoding: 8507e102996Smaya */ 8517e102996Smaya if ((cat6->pad2 & 0x8) && (cat6->pad4 & 0x2)) { 8527e102996Smaya assert(gpu_id >= 600); 8537e102996Smaya assert(instr->cat6.opc == 0); 8547e102996Smaya return false; 8557e102996Smaya } 8567e102996Smaya 8577e102996Smaya return true; 8587e102996Smaya} 8597e102996Smaya 8607e102996Smayastatic inline uint32_t instr_opc(instr_t *instr, unsigned gpu_id) 8617e102996Smaya{ 8627e102996Smaya switch (instr->opc_cat) { 8637e102996Smaya case 0: return instr->cat0.opc; 8647e102996Smaya case 1: return 0; 8657e102996Smaya case 2: return instr->cat2.opc; 8667e102996Smaya case 3: return instr->cat3.opc; 8677e102996Smaya case 4: return instr->cat4.opc; 8687e102996Smaya case 5: return instr->cat5.opc; 8697e102996Smaya case 6: 8707e102996Smaya if (!is_cat6_legacy(instr, gpu_id)) 8717e102996Smaya return instr->cat6_a6xx.opc; 8727e102996Smaya return instr->cat6.opc; 8737e102996Smaya case 7: return instr->cat7.opc; 8747e102996Smaya default: return 0; 8757e102996Smaya } 8767e102996Smaya} 8777e102996Smaya 8787e102996Smayastatic inline bool is_mad(opc_t opc) 8797e102996Smaya{ 8807e102996Smaya switch (opc) { 8817e102996Smaya case OPC_MAD_U16: 8827e102996Smaya case OPC_MAD_S16: 8837e102996Smaya case OPC_MAD_U24: 8847e102996Smaya case OPC_MAD_S24: 8857e102996Smaya case OPC_MAD_F16: 8867e102996Smaya case OPC_MAD_F32: 8877e102996Smaya return true; 8887e102996Smaya default: 8897e102996Smaya return false; 8907e102996Smaya } 8917e102996Smaya} 8927e102996Smaya 8937e102996Smayastatic inline bool is_madsh(opc_t opc) 8947e102996Smaya{ 8957e102996Smaya switch (opc) { 8967e102996Smaya case OPC_MADSH_U16: 8977e102996Smaya case OPC_MADSH_M16: 8987e102996Smaya return true; 8997e102996Smaya default: 9007e102996Smaya return false; 9017e102996Smaya } 9027e102996Smaya} 9037e102996Smaya 9047e102996Smayastatic inline bool is_atomic(opc_t opc) 9057e102996Smaya{ 9067e102996Smaya switch (opc) { 9077e102996Smaya case OPC_ATOMIC_ADD: 9087e102996Smaya case OPC_ATOMIC_SUB: 9097e102996Smaya case OPC_ATOMIC_XCHG: 9107e102996Smaya case OPC_ATOMIC_INC: 9117e102996Smaya case OPC_ATOMIC_DEC: 9127e102996Smaya case OPC_ATOMIC_CMPXCHG: 9137e102996Smaya case OPC_ATOMIC_MIN: 9147e102996Smaya case OPC_ATOMIC_MAX: 9157e102996Smaya case OPC_ATOMIC_AND: 9167e102996Smaya case OPC_ATOMIC_OR: 9177e102996Smaya case OPC_ATOMIC_XOR: 9187e102996Smaya return true; 9197e102996Smaya default: 9207e102996Smaya return false; 9217e102996Smaya } 9227e102996Smaya} 9237e102996Smaya 9247e102996Smayastatic inline bool is_ssbo(opc_t opc) 9257e102996Smaya{ 9267e102996Smaya switch (opc) { 9277e102996Smaya case OPC_RESFMT: 9287e102996Smaya case OPC_RESINFO: 9297e102996Smaya case OPC_LDGB: 9307e102996Smaya case OPC_STGB: 9317e102996Smaya case OPC_STIB: 9327e102996Smaya return true; 9337e102996Smaya default: 9347e102996Smaya return false; 9357e102996Smaya } 9367e102996Smaya} 9377e102996Smaya 9387e102996Smayastatic inline bool is_isam(opc_t opc) 9397e102996Smaya{ 9407e102996Smaya switch (opc) { 9417e102996Smaya case OPC_ISAM: 9427e102996Smaya case OPC_ISAML: 9437e102996Smaya case OPC_ISAMM: 9447e102996Smaya return true; 9457e102996Smaya default: 9467e102996Smaya return false; 9477e102996Smaya } 9487e102996Smaya} 9497e102996Smaya 9507e102996Smayaint disasm_a3xx(uint32_t *dwords, int sizedwords, int level, FILE *out, unsigned gpu_id); 9517e102996Smaya 9527e102996Smaya#endif /* INSTR_A3XX_H_ */ 953