1428d7b3dSmrg/* 2428d7b3dSmrg * Copyright © 2008 Keith Packard 3428d7b3dSmrg * 4428d7b3dSmrg * Permission to use, copy, modify, distribute, and sell this software and its 5428d7b3dSmrg * documentation for any purpose is hereby granted without fee, provided that 6428d7b3dSmrg * the above copyright notice appear in all copies and that both that copyright 7428d7b3dSmrg * notice and this permission notice appear in supporting documentation, and 8428d7b3dSmrg * that the name of the copyright holders not be used in advertising or 9428d7b3dSmrg * publicity pertaining to distribution of the software without specific, 10428d7b3dSmrg * written prior permission. The copyright holders make no representations 11428d7b3dSmrg * about the suitability of this software for any purpose. It is provided "as 12428d7b3dSmrg * is" without express or implied warranty. 13428d7b3dSmrg * 14428d7b3dSmrg * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15428d7b3dSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16428d7b3dSmrg * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17428d7b3dSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18428d7b3dSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19428d7b3dSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20428d7b3dSmrg * OF THIS SOFTWARE. 21428d7b3dSmrg */ 22428d7b3dSmrg 23428d7b3dSmrg#include <stdio.h> 24428d7b3dSmrg#include <stdlib.h> 25428d7b3dSmrg#include <string.h> 26428d7b3dSmrg#include <getopt.h> 27428d7b3dSmrg#include <unistd.h> 28428d7b3dSmrg#include <stdarg.h> 29428d7b3dSmrg 30428d7b3dSmrg#include "brw_eu.h" 31428d7b3dSmrg 32428d7b3dSmrgstatic const struct { 33428d7b3dSmrg const char *name; 34428d7b3dSmrg int nsrc; 35428d7b3dSmrg int ndst; 36428d7b3dSmrg} opcode[128] = { 37428d7b3dSmrg [BRW_OPCODE_MOV] = { .name = "mov", .nsrc = 1, .ndst = 1 }, 38428d7b3dSmrg [BRW_OPCODE_FRC] = { .name = "frc", .nsrc = 1, .ndst = 1 }, 39428d7b3dSmrg [BRW_OPCODE_RNDU] = { .name = "rndu", .nsrc = 1, .ndst = 1 }, 40428d7b3dSmrg [BRW_OPCODE_RNDD] = { .name = "rndd", .nsrc = 1, .ndst = 1 }, 41428d7b3dSmrg [BRW_OPCODE_RNDE] = { .name = "rnde", .nsrc = 1, .ndst = 1 }, 42428d7b3dSmrg [BRW_OPCODE_RNDZ] = { .name = "rndz", .nsrc = 1, .ndst = 1 }, 43428d7b3dSmrg [BRW_OPCODE_NOT] = { .name = "not", .nsrc = 1, .ndst = 1 }, 44428d7b3dSmrg [BRW_OPCODE_LZD] = { .name = "lzd", .nsrc = 1, .ndst = 1 }, 45428d7b3dSmrg 46428d7b3dSmrg [BRW_OPCODE_MUL] = { .name = "mul", .nsrc = 2, .ndst = 1 }, 47428d7b3dSmrg [BRW_OPCODE_MAC] = { .name = "mac", .nsrc = 2, .ndst = 1 }, 48428d7b3dSmrg [BRW_OPCODE_MACH] = { .name = "mach", .nsrc = 2, .ndst = 1 }, 49428d7b3dSmrg [BRW_OPCODE_LINE] = { .name = "line", .nsrc = 2, .ndst = 1 }, 50428d7b3dSmrg [BRW_OPCODE_PLN] = { .name = "pln", .nsrc = 2, .ndst = 1 }, 51428d7b3dSmrg [BRW_OPCODE_SAD2] = { .name = "sad2", .nsrc = 2, .ndst = 1 }, 52428d7b3dSmrg [BRW_OPCODE_SADA2] = { .name = "sada2", .nsrc = 2, .ndst = 1 }, 53428d7b3dSmrg [BRW_OPCODE_DP4] = { .name = "dp4", .nsrc = 2, .ndst = 1 }, 54428d7b3dSmrg [BRW_OPCODE_DPH] = { .name = "dph", .nsrc = 2, .ndst = 1 }, 55428d7b3dSmrg [BRW_OPCODE_DP3] = { .name = "dp3", .nsrc = 2, .ndst = 1 }, 56428d7b3dSmrg [BRW_OPCODE_DP2] = { .name = "dp2", .nsrc = 2, .ndst = 1 }, 57428d7b3dSmrg [BRW_OPCODE_MATH] = { .name = "math", .nsrc = 2, .ndst = 1 }, 58428d7b3dSmrg 59428d7b3dSmrg [BRW_OPCODE_AVG] = { .name = "avg", .nsrc = 2, .ndst = 1 }, 60428d7b3dSmrg [BRW_OPCODE_ADD] = { .name = "add", .nsrc = 2, .ndst = 1 }, 61428d7b3dSmrg [BRW_OPCODE_SEL] = { .name = "sel", .nsrc = 2, .ndst = 1 }, 62428d7b3dSmrg [BRW_OPCODE_AND] = { .name = "and", .nsrc = 2, .ndst = 1 }, 63428d7b3dSmrg [BRW_OPCODE_OR] = { .name = "or", .nsrc = 2, .ndst = 1 }, 64428d7b3dSmrg [BRW_OPCODE_XOR] = { .name = "xor", .nsrc = 2, .ndst = 1 }, 65428d7b3dSmrg [BRW_OPCODE_SHR] = { .name = "shr", .nsrc = 2, .ndst = 1 }, 66428d7b3dSmrg [BRW_OPCODE_SHL] = { .name = "shl", .nsrc = 2, .ndst = 1 }, 67428d7b3dSmrg [BRW_OPCODE_ASR] = { .name = "asr", .nsrc = 2, .ndst = 1 }, 68428d7b3dSmrg [BRW_OPCODE_CMP] = { .name = "cmp", .nsrc = 2, .ndst = 1 }, 69428d7b3dSmrg [BRW_OPCODE_CMPN] = { .name = "cmpn", .nsrc = 2, .ndst = 1 }, 70428d7b3dSmrg 71428d7b3dSmrg [BRW_OPCODE_SEND] = { .name = "send", .nsrc = 1, .ndst = 1 }, 72428d7b3dSmrg [BRW_OPCODE_SENDC] = { .name = "sendc", .nsrc = 1, .ndst = 1 }, 73428d7b3dSmrg [BRW_OPCODE_NOP] = { .name = "nop", .nsrc = 0, .ndst = 0 }, 74428d7b3dSmrg [BRW_OPCODE_JMPI] = { .name = "jmpi", .nsrc = 1, .ndst = 0 }, 75428d7b3dSmrg [BRW_OPCODE_IF] = { .name = "if", .nsrc = 2, .ndst = 0 }, 76428d7b3dSmrg [BRW_OPCODE_IFF] = { .name = "iff", .nsrc = 2, .ndst = 1 }, 77428d7b3dSmrg [BRW_OPCODE_WHILE] = { .name = "while", .nsrc = 2, .ndst = 0 }, 78428d7b3dSmrg [BRW_OPCODE_ELSE] = { .name = "else", .nsrc = 2, .ndst = 0 }, 79428d7b3dSmrg [BRW_OPCODE_BREAK] = { .name = "break", .nsrc = 2, .ndst = 0 }, 80428d7b3dSmrg [BRW_OPCODE_CONTINUE] = { .name = "cont", .nsrc = 1, .ndst = 0 }, 81428d7b3dSmrg [BRW_OPCODE_HALT] = { .name = "halt", .nsrc = 1, .ndst = 0 }, 82428d7b3dSmrg [BRW_OPCODE_MSAVE] = { .name = "msave", .nsrc = 1, .ndst = 1 }, 83428d7b3dSmrg [BRW_OPCODE_PUSH] = { .name = "push", .nsrc = 1, .ndst = 1 }, 84428d7b3dSmrg [BRW_OPCODE_MRESTORE] = { .name = "mrest", .nsrc = 1, .ndst = 1 }, 85428d7b3dSmrg [BRW_OPCODE_POP] = { .name = "pop", .nsrc = 2, .ndst = 0 }, 86428d7b3dSmrg [BRW_OPCODE_WAIT] = { .name = "wait", .nsrc = 1, .ndst = 0 }, 87428d7b3dSmrg [BRW_OPCODE_DO] = { .name = "do", .nsrc = 0, .ndst = 0 }, 88428d7b3dSmrg [BRW_OPCODE_ENDIF] = { .name = "endif", .nsrc = 2, .ndst = 0 }, 89428d7b3dSmrg}; 90428d7b3dSmrg 91428d7b3dSmrgstatic const char *conditional_modifier[16] = { 92428d7b3dSmrg [BRW_CONDITIONAL_NONE] = "", 93428d7b3dSmrg [BRW_CONDITIONAL_Z] = ".e", 94428d7b3dSmrg [BRW_CONDITIONAL_NZ] = ".ne", 95428d7b3dSmrg [BRW_CONDITIONAL_G] = ".g", 96428d7b3dSmrg [BRW_CONDITIONAL_GE] = ".ge", 97428d7b3dSmrg [BRW_CONDITIONAL_L] = ".l", 98428d7b3dSmrg [BRW_CONDITIONAL_LE] = ".le", 99428d7b3dSmrg [BRW_CONDITIONAL_R] = ".r", 100428d7b3dSmrg [BRW_CONDITIONAL_O] = ".o", 101428d7b3dSmrg [BRW_CONDITIONAL_U] = ".u", 102428d7b3dSmrg}; 103428d7b3dSmrg 104428d7b3dSmrgstatic const char *negate[2] = { 105428d7b3dSmrg [0] = "", 106428d7b3dSmrg [1] = "-", 107428d7b3dSmrg}; 108428d7b3dSmrg 109428d7b3dSmrgstatic const char *_abs[2] = { 110428d7b3dSmrg [0] = "", 111428d7b3dSmrg [1] = "(abs)", 112428d7b3dSmrg}; 113428d7b3dSmrg 114428d7b3dSmrgstatic const char *vert_stride[16] = { 115428d7b3dSmrg [0] = "0", 116428d7b3dSmrg [1] = "1", 117428d7b3dSmrg [2] = "2", 118428d7b3dSmrg [3] = "4", 119428d7b3dSmrg [4] = "8", 120428d7b3dSmrg [5] = "16", 121428d7b3dSmrg [6] = "32", 122428d7b3dSmrg [15] = "VxH", 123428d7b3dSmrg}; 124428d7b3dSmrg 125428d7b3dSmrgstatic const char *width[8] = { 126428d7b3dSmrg [0] = "1", 127428d7b3dSmrg [1] = "2", 128428d7b3dSmrg [2] = "4", 129428d7b3dSmrg [3] = "8", 130428d7b3dSmrg [4] = "16", 131428d7b3dSmrg}; 132428d7b3dSmrg 133428d7b3dSmrgstatic const char *horiz_stride[4] = { 134428d7b3dSmrg [0] = "0", 135428d7b3dSmrg [1] = "1", 136428d7b3dSmrg [2] = "2", 137428d7b3dSmrg [3] = "4" 138428d7b3dSmrg}; 139428d7b3dSmrg 140428d7b3dSmrgstatic const char *chan_sel[4] = { 141428d7b3dSmrg [0] = "x", 142428d7b3dSmrg [1] = "y", 143428d7b3dSmrg [2] = "z", 144428d7b3dSmrg [3] = "w", 145428d7b3dSmrg}; 146428d7b3dSmrg 147428d7b3dSmrg#if 0 148428d7b3dSmrgstatic const char *dest_condmod[16] = { 149428d7b3dSmrg}; 150428d7b3dSmrg 151428d7b3dSmrgstatic const char *imm_encoding[8] = { 152428d7b3dSmrg [0] = "UD", 153428d7b3dSmrg [1] = "D", 154428d7b3dSmrg [2] = "UW", 155428d7b3dSmrg [3] = "W", 156428d7b3dSmrg [5] = "VF", 157428d7b3dSmrg [6] = "V", 158428d7b3dSmrg [7] = "F" 159428d7b3dSmrg}; 160428d7b3dSmrg#endif 161428d7b3dSmrg 162428d7b3dSmrgstatic const char *debug_ctrl[2] = { 163428d7b3dSmrg [0] = "", 164428d7b3dSmrg [1] = ".breakpoint" 165428d7b3dSmrg}; 166428d7b3dSmrg 167428d7b3dSmrgstatic const char *saturate[2] = { 168428d7b3dSmrg [0] = "", 169428d7b3dSmrg [1] = ".sat" 170428d7b3dSmrg}; 171428d7b3dSmrg 172428d7b3dSmrgstatic const char *accwr[2] = { 173428d7b3dSmrg [0] = "", 174428d7b3dSmrg [1] = "AccWrEnable" 175428d7b3dSmrg}; 176428d7b3dSmrg 177428d7b3dSmrgstatic const char *wectrl[2] = { 178428d7b3dSmrg [0] = "WE_normal", 179428d7b3dSmrg [1] = "WE_all" 180428d7b3dSmrg}; 181428d7b3dSmrg 182428d7b3dSmrgstatic const char *exec_size[8] = { 183428d7b3dSmrg [0] = "1", 184428d7b3dSmrg [1] = "2", 185428d7b3dSmrg [2] = "4", 186428d7b3dSmrg [3] = "8", 187428d7b3dSmrg [4] = "16", 188428d7b3dSmrg [5] = "32" 189428d7b3dSmrg}; 190428d7b3dSmrg 191428d7b3dSmrgstatic const char *pred_inv[2] = { 192428d7b3dSmrg [0] = "+", 193428d7b3dSmrg [1] = "-" 194428d7b3dSmrg}; 195428d7b3dSmrg 196428d7b3dSmrgstatic const char *pred_ctrl_align16[16] = { 197428d7b3dSmrg [1] = "", 198428d7b3dSmrg [2] = ".x", 199428d7b3dSmrg [3] = ".y", 200428d7b3dSmrg [4] = ".z", 201428d7b3dSmrg [5] = ".w", 202428d7b3dSmrg [6] = ".any4h", 203428d7b3dSmrg [7] = ".all4h", 204428d7b3dSmrg}; 205428d7b3dSmrg 206428d7b3dSmrgstatic const char *pred_ctrl_align1[16] = { 207428d7b3dSmrg [1] = "", 208428d7b3dSmrg [2] = ".anyv", 209428d7b3dSmrg [3] = ".allv", 210428d7b3dSmrg [4] = ".any2h", 211428d7b3dSmrg [5] = ".all2h", 212428d7b3dSmrg [6] = ".any4h", 213428d7b3dSmrg [7] = ".all4h", 214428d7b3dSmrg [8] = ".any8h", 215428d7b3dSmrg [9] = ".all8h", 216428d7b3dSmrg [10] = ".any16h", 217428d7b3dSmrg [11] = ".all16h", 218428d7b3dSmrg}; 219428d7b3dSmrg 220428d7b3dSmrgstatic const char *thread_ctrl[4] = { 221428d7b3dSmrg [0] = "", 222428d7b3dSmrg [2] = "switch" 223428d7b3dSmrg}; 224428d7b3dSmrg 225428d7b3dSmrgstatic const char *compr_ctrl[4] = { 226428d7b3dSmrg [0] = "", 227428d7b3dSmrg [1] = "sechalf", 228428d7b3dSmrg [2] = "compr", 229428d7b3dSmrg [3] = "compr4", 230428d7b3dSmrg}; 231428d7b3dSmrg 232428d7b3dSmrgstatic const char *dep_ctrl[4] = { 233428d7b3dSmrg [0] = "", 234428d7b3dSmrg [1] = "NoDDClr", 235428d7b3dSmrg [2] = "NoDDChk", 236428d7b3dSmrg [3] = "NoDDClr,NoDDChk", 237428d7b3dSmrg}; 238428d7b3dSmrg 239428d7b3dSmrgstatic const char *mask_ctrl[4] = { 240428d7b3dSmrg [0] = "", 241428d7b3dSmrg [1] = "nomask", 242428d7b3dSmrg}; 243428d7b3dSmrg 244428d7b3dSmrgstatic const char *access_mode[2] = { 245428d7b3dSmrg [0] = "align1", 246428d7b3dSmrg [1] = "align16", 247428d7b3dSmrg}; 248428d7b3dSmrg 249428d7b3dSmrgstatic const char *reg_encoding[8] = { 250428d7b3dSmrg [0] = "UD", 251428d7b3dSmrg [1] = "D", 252428d7b3dSmrg [2] = "UW", 253428d7b3dSmrg [3] = "W", 254428d7b3dSmrg [4] = "UB", 255428d7b3dSmrg [5] = "B", 256428d7b3dSmrg [7] = "F" 257428d7b3dSmrg}; 258428d7b3dSmrg 259428d7b3dSmrgstatic const int reg_type_size[8] = { 260428d7b3dSmrg [0] = 4, 261428d7b3dSmrg [1] = 4, 262428d7b3dSmrg [2] = 2, 263428d7b3dSmrg [3] = 2, 264428d7b3dSmrg [4] = 1, 265428d7b3dSmrg [5] = 1, 266428d7b3dSmrg [7] = 4 267428d7b3dSmrg}; 268428d7b3dSmrg 269428d7b3dSmrgstatic const char *reg_file[4] = { 270428d7b3dSmrg [0] = "A", 271428d7b3dSmrg [1] = "g", 272428d7b3dSmrg [2] = "m", 273428d7b3dSmrg [3] = "imm", 274428d7b3dSmrg}; 275428d7b3dSmrg 276428d7b3dSmrgstatic const char *writemask[16] = { 277428d7b3dSmrg [0x0] = ".", 278428d7b3dSmrg [0x1] = ".x", 279428d7b3dSmrg [0x2] = ".y", 280428d7b3dSmrg [0x3] = ".xy", 281428d7b3dSmrg [0x4] = ".z", 282428d7b3dSmrg [0x5] = ".xz", 283428d7b3dSmrg [0x6] = ".yz", 284428d7b3dSmrg [0x7] = ".xyz", 285428d7b3dSmrg [0x8] = ".w", 286428d7b3dSmrg [0x9] = ".xw", 287428d7b3dSmrg [0xa] = ".yw", 288428d7b3dSmrg [0xb] = ".xyw", 289428d7b3dSmrg [0xc] = ".zw", 290428d7b3dSmrg [0xd] = ".xzw", 291428d7b3dSmrg [0xe] = ".yzw", 292428d7b3dSmrg [0xf] = "", 293428d7b3dSmrg}; 294428d7b3dSmrg 295428d7b3dSmrgstatic const char *end_of_thread[2] = { 296428d7b3dSmrg [0] = "", 297428d7b3dSmrg [1] = "EOT" 298428d7b3dSmrg}; 299428d7b3dSmrg 300428d7b3dSmrgstatic const char *target_function[16] = { 301428d7b3dSmrg [BRW_SFID_NULL] = "null", 302428d7b3dSmrg [BRW_SFID_MATH] = "math", 303428d7b3dSmrg [BRW_SFID_SAMPLER] = "sampler", 304428d7b3dSmrg [BRW_SFID_MESSAGE_GATEWAY] = "gateway", 305428d7b3dSmrg [BRW_SFID_DATAPORT_READ] = "read", 306428d7b3dSmrg [BRW_SFID_DATAPORT_WRITE] = "write", 307428d7b3dSmrg [BRW_SFID_URB] = "urb", 308428d7b3dSmrg [BRW_SFID_THREAD_SPAWNER] = "thread_spawner" 309428d7b3dSmrg}; 310428d7b3dSmrg 311428d7b3dSmrgstatic const char *target_function_gen6[16] = { 312428d7b3dSmrg [BRW_SFID_NULL] = "null", 313428d7b3dSmrg [BRW_SFID_MATH] = "math", 314428d7b3dSmrg [BRW_SFID_SAMPLER] = "sampler", 315428d7b3dSmrg [BRW_SFID_MESSAGE_GATEWAY] = "gateway", 316428d7b3dSmrg [BRW_SFID_URB] = "urb", 317428d7b3dSmrg [BRW_SFID_THREAD_SPAWNER] = "thread_spawner", 318428d7b3dSmrg [GEN6_SFID_DATAPORT_SAMPLER_CACHE] = "sampler", 319428d7b3dSmrg [GEN6_SFID_DATAPORT_RENDER_CACHE] = "render", 320428d7b3dSmrg [GEN6_SFID_DATAPORT_CONSTANT_CACHE] = "const", 321428d7b3dSmrg [GEN7_SFID_DATAPORT_DATA_CACHE] = "data" 322428d7b3dSmrg}; 323428d7b3dSmrg 324428d7b3dSmrgstatic const char *dp_rc_msg_type_gen6[16] = { 325428d7b3dSmrg [BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ] = "OWORD block read", 326428d7b3dSmrg [GEN6_DATAPORT_READ_MESSAGE_RENDER_UNORM_READ] = "RT UNORM read", 327428d7b3dSmrg [GEN6_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ] = "OWORD dual block read", 328428d7b3dSmrg [GEN6_DATAPORT_READ_MESSAGE_MEDIA_BLOCK_READ] = "media block read", 329428d7b3dSmrg [GEN6_DATAPORT_READ_MESSAGE_OWORD_UNALIGN_BLOCK_READ] = "OWORD unaligned block read", 330428d7b3dSmrg [GEN6_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ] = "DWORD scattered read", 331428d7b3dSmrg [GEN6_DATAPORT_WRITE_MESSAGE_DWORD_ATOMIC_WRITE] = "DWORD atomic write", 332428d7b3dSmrg [GEN6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE] = "OWORD block write", 333428d7b3dSmrg [GEN6_DATAPORT_WRITE_MESSAGE_OWORD_DUAL_BLOCK_WRITE] = "OWORD dual block write", 334428d7b3dSmrg [GEN6_DATAPORT_WRITE_MESSAGE_MEDIA_BLOCK_WRITE] = "media block write", 335428d7b3dSmrg [GEN6_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE] = "DWORD scattered write", 336428d7b3dSmrg [GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE] = "RT write", 337428d7b3dSmrg [GEN6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE] = "streamed VB write", 338428d7b3dSmrg [GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_UNORM_WRITE] = "RT UNORMc write", 339428d7b3dSmrg}; 340428d7b3dSmrg 341428d7b3dSmrgstatic const char *math_function[16] = { 342428d7b3dSmrg [BRW_MATH_FUNCTION_INV] = "inv", 343428d7b3dSmrg [BRW_MATH_FUNCTION_LOG] = "log", 344428d7b3dSmrg [BRW_MATH_FUNCTION_EXP] = "exp", 345428d7b3dSmrg [BRW_MATH_FUNCTION_SQRT] = "sqrt", 346428d7b3dSmrg [BRW_MATH_FUNCTION_RSQ] = "rsq", 347428d7b3dSmrg [BRW_MATH_FUNCTION_SIN] = "sin", 348428d7b3dSmrg [BRW_MATH_FUNCTION_COS] = "cos", 349428d7b3dSmrg [BRW_MATH_FUNCTION_SINCOS] = "sincos", 350428d7b3dSmrg [BRW_MATH_FUNCTION_TAN] = "tan", 351428d7b3dSmrg [BRW_MATH_FUNCTION_POW] = "pow", 352428d7b3dSmrg [BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER] = "intdivmod", 353428d7b3dSmrg [BRW_MATH_FUNCTION_INT_DIV_QUOTIENT] = "intdiv", 354428d7b3dSmrg [BRW_MATH_FUNCTION_INT_DIV_REMAINDER] = "intmod", 355428d7b3dSmrg}; 356428d7b3dSmrg 357428d7b3dSmrgstatic const char *math_saturate[2] = { 358428d7b3dSmrg [0] = "", 359428d7b3dSmrg [1] = "sat" 360428d7b3dSmrg}; 361428d7b3dSmrg 362428d7b3dSmrgstatic const char *math_signed[2] = { 363428d7b3dSmrg [0] = "", 364428d7b3dSmrg [1] = "signed" 365428d7b3dSmrg}; 366428d7b3dSmrg 367428d7b3dSmrgstatic const char *math_scalar[2] = { 368428d7b3dSmrg [0] = "", 369428d7b3dSmrg [1] = "scalar" 370428d7b3dSmrg}; 371428d7b3dSmrg 372428d7b3dSmrgstatic const char *math_precision[2] = { 373428d7b3dSmrg [0] = "", 374428d7b3dSmrg [1] = "partial_precision" 375428d7b3dSmrg}; 376428d7b3dSmrg 377428d7b3dSmrgstatic const char *urb_opcode[2] = { 378428d7b3dSmrg [0] = "urb_write", 379428d7b3dSmrg [1] = "ff_sync", 380428d7b3dSmrg}; 381428d7b3dSmrg 382428d7b3dSmrgstatic const char *urb_swizzle[4] = { 383428d7b3dSmrg [BRW_URB_SWIZZLE_NONE] = "", 384428d7b3dSmrg [BRW_URB_SWIZZLE_INTERLEAVE] = "interleave", 385428d7b3dSmrg [BRW_URB_SWIZZLE_TRANSPOSE] = "transpose", 386428d7b3dSmrg}; 387428d7b3dSmrg 388428d7b3dSmrgstatic const char *urb_allocate[2] = { 389428d7b3dSmrg [0] = "", 390428d7b3dSmrg [1] = "allocate" 391428d7b3dSmrg}; 392428d7b3dSmrg 393428d7b3dSmrgstatic const char *urb_used[2] = { 394428d7b3dSmrg [0] = "", 395428d7b3dSmrg [1] = "used" 396428d7b3dSmrg}; 397428d7b3dSmrg 398428d7b3dSmrgstatic const char *urb_complete[2] = { 399428d7b3dSmrg [0] = "", 400428d7b3dSmrg [1] = "complete" 401428d7b3dSmrg}; 402428d7b3dSmrg 403428d7b3dSmrgstatic const char *sampler_target_format[4] = { 404428d7b3dSmrg [0] = "F", 405428d7b3dSmrg [2] = "UD", 406428d7b3dSmrg [3] = "D" 407428d7b3dSmrg}; 408428d7b3dSmrg 409428d7b3dSmrgstatic int column; 410428d7b3dSmrg 411428d7b3dSmrgstatic int string(FILE *file, const char *str) 412428d7b3dSmrg{ 413428d7b3dSmrg fputs(str, file); 414428d7b3dSmrg column += strlen(str); 415428d7b3dSmrg return 0; 416428d7b3dSmrg} 417428d7b3dSmrg 418428d7b3dSmrg#if defined(__GNUC__) && (__GNUC__ > 2) 419428d7b3dSmrg__attribute__((format(printf, 2, 3))) 420428d7b3dSmrg#endif 421428d7b3dSmrgstatic int format(FILE *f, const char *fmt, ...) 422428d7b3dSmrg{ 423428d7b3dSmrg char buf[1024]; 424428d7b3dSmrg va_list args; 425428d7b3dSmrg 426428d7b3dSmrg va_start(args, fmt); 427428d7b3dSmrg vsnprintf(buf, sizeof(buf) - 1, fmt, args); 428428d7b3dSmrg va_end(args); 429428d7b3dSmrg 430428d7b3dSmrg string(f, buf); 431428d7b3dSmrg return 0; 432428d7b3dSmrg} 433428d7b3dSmrg 434428d7b3dSmrgstatic void newline(FILE *f) 435428d7b3dSmrg{ 436428d7b3dSmrg putc('\n', f); 437428d7b3dSmrg column = 0; 438428d7b3dSmrg} 439428d7b3dSmrg 440428d7b3dSmrgstatic void pad(FILE *f, int c) 441428d7b3dSmrg{ 442428d7b3dSmrg do 443428d7b3dSmrg string(f, " "); 444428d7b3dSmrg while (column < c); 445428d7b3dSmrg} 446428d7b3dSmrg 447428d7b3dSmrgstatic void control(FILE *file, const char *name, const char *ctrl[], unsigned id, int *space) 448428d7b3dSmrg{ 449428d7b3dSmrg if (!ctrl[id]) { 450428d7b3dSmrg fprintf(file, "*** invalid %s value %d ", 451428d7b3dSmrg name, id); 452428d7b3dSmrg assert(0); 453428d7b3dSmrg } 454428d7b3dSmrg if (ctrl[id][0]) { 455428d7b3dSmrg if (space && *space) 456428d7b3dSmrg string(file, " "); 457428d7b3dSmrg string(file, ctrl[id]); 458428d7b3dSmrg if (space) 459428d7b3dSmrg *space = 1; 460428d7b3dSmrg } 461428d7b3dSmrg} 462428d7b3dSmrg 463428d7b3dSmrgstatic void print_opcode(FILE *file, int id) 464428d7b3dSmrg{ 465428d7b3dSmrg if (!opcode[id].name) { 466428d7b3dSmrg format(file, "*** invalid opcode value %d ", id); 467428d7b3dSmrg assert(0); 468428d7b3dSmrg } 469428d7b3dSmrg string(file, opcode[id].name); 470428d7b3dSmrg} 471428d7b3dSmrg 472428d7b3dSmrgstatic int reg(FILE *file, unsigned _reg_file, unsigned _reg_nr) 473428d7b3dSmrg{ 474428d7b3dSmrg /* Clear the Compr4 instruction compression bit. */ 475428d7b3dSmrg if (_reg_file == BRW_MESSAGE_REGISTER_FILE) 476428d7b3dSmrg _reg_nr &= ~(1 << 7); 477428d7b3dSmrg 478428d7b3dSmrg if (_reg_file == BRW_ARCHITECTURE_REGISTER_FILE) { 479428d7b3dSmrg switch (_reg_nr & 0xf0) { 480428d7b3dSmrg case BRW_ARF_NULL: 481428d7b3dSmrg string(file, "null"); 482428d7b3dSmrg return -1; 483428d7b3dSmrg case BRW_ARF_ADDRESS: 484428d7b3dSmrg format(file, "a%d", _reg_nr & 0x0f); 485428d7b3dSmrg break; 486428d7b3dSmrg case BRW_ARF_ACCUMULATOR: 487428d7b3dSmrg format(file, "acc%d", _reg_nr & 0x0f); 488428d7b3dSmrg break; 489428d7b3dSmrg case BRW_ARF_FLAG: 490428d7b3dSmrg format(file, "f%d", _reg_nr & 0x0f); 491428d7b3dSmrg break; 492428d7b3dSmrg case BRW_ARF_MASK: 493428d7b3dSmrg format(file, "mask%d", _reg_nr & 0x0f); 494428d7b3dSmrg break; 495428d7b3dSmrg case BRW_ARF_MASK_STACK: 496428d7b3dSmrg format(file, "msd%d", _reg_nr & 0x0f); 497428d7b3dSmrg break; 498428d7b3dSmrg case BRW_ARF_STATE: 499428d7b3dSmrg format(file, "sr%d", _reg_nr & 0x0f); 500428d7b3dSmrg break; 501428d7b3dSmrg case BRW_ARF_CONTROL: 502428d7b3dSmrg format(file, "cr%d", _reg_nr & 0x0f); 503428d7b3dSmrg break; 504428d7b3dSmrg case BRW_ARF_NOTIFICATION_COUNT: 505428d7b3dSmrg format(file, "n%d", _reg_nr & 0x0f); 506428d7b3dSmrg break; 507428d7b3dSmrg case BRW_ARF_IP: 508428d7b3dSmrg string(file, "ip"); 509428d7b3dSmrg return -1; 510428d7b3dSmrg default: 511428d7b3dSmrg format(file, "ARF%d", _reg_nr); 512428d7b3dSmrg break; 513428d7b3dSmrg } 514428d7b3dSmrg } else { 515428d7b3dSmrg control(file, "src reg file", reg_file, _reg_file, NULL); 516428d7b3dSmrg format(file, "%d", _reg_nr); 517428d7b3dSmrg } 518428d7b3dSmrg return 0; 519428d7b3dSmrg} 520428d7b3dSmrg 521428d7b3dSmrgstatic void dest(FILE *file, const struct brw_instruction *inst) 522428d7b3dSmrg{ 523428d7b3dSmrg if (inst->header.access_mode == BRW_ALIGN_1) { 524428d7b3dSmrg if (inst->bits1.da1.dest_address_mode == BRW_ADDRESS_DIRECT) { 525428d7b3dSmrg if (reg(file, inst->bits1.da1.dest_reg_file, inst->bits1.da1.dest_reg_nr)) 526428d7b3dSmrg return; 527428d7b3dSmrg 528428d7b3dSmrg if (inst->bits1.da1.dest_subreg_nr) 529428d7b3dSmrg format(file, ".%d", inst->bits1.da1.dest_subreg_nr / 530428d7b3dSmrg reg_type_size[inst->bits1.da1.dest_reg_type]); 531428d7b3dSmrg format(file, "<%d>", inst->bits1.da1.dest_horiz_stride); 532428d7b3dSmrg control(file, "dest reg encoding", reg_encoding, inst->bits1.da1.dest_reg_type, NULL); 533428d7b3dSmrg } else { 534428d7b3dSmrg string(file, "g[a0"); 535428d7b3dSmrg if (inst->bits1.ia1.dest_subreg_nr) 536428d7b3dSmrg format(file, ".%d", inst->bits1.ia1.dest_subreg_nr / 537428d7b3dSmrg reg_type_size[inst->bits1.ia1.dest_reg_type]); 538428d7b3dSmrg if (inst->bits1.ia1.dest_indirect_offset) 539428d7b3dSmrg format(file, " %d", inst->bits1.ia1.dest_indirect_offset); 540428d7b3dSmrg string(file, "]"); 541428d7b3dSmrg format(file, "<%d>", inst->bits1.ia1.dest_horiz_stride); 542428d7b3dSmrg control(file, "dest reg encoding", reg_encoding, inst->bits1.ia1.dest_reg_type, NULL); 543428d7b3dSmrg } 544428d7b3dSmrg } else { 545428d7b3dSmrg if (inst->bits1.da16.dest_address_mode == BRW_ADDRESS_DIRECT) { 546428d7b3dSmrg if (reg(file, inst->bits1.da16.dest_reg_file, inst->bits1.da16.dest_reg_nr)) 547428d7b3dSmrg return; 548428d7b3dSmrg 549428d7b3dSmrg if (inst->bits1.da16.dest_subreg_nr) 550428d7b3dSmrg format(file, ".%d", inst->bits1.da16.dest_subreg_nr / 551428d7b3dSmrg reg_type_size[inst->bits1.da16.dest_reg_type]); 552428d7b3dSmrg string(file, "<1>"); 553428d7b3dSmrg control(file, "writemask", writemask, inst->bits1.da16.dest_writemask, NULL); 554428d7b3dSmrg control(file, "dest reg encoding", reg_encoding, inst->bits1.da16.dest_reg_type, NULL); 555428d7b3dSmrg } else { 556428d7b3dSmrg string(file, "Indirect align16 address mode not supported"); 557428d7b3dSmrg } 558428d7b3dSmrg } 559428d7b3dSmrg} 560428d7b3dSmrg 561428d7b3dSmrgstatic void src_align1_region(FILE *file, 562428d7b3dSmrg unsigned _vert_stride, unsigned _width, unsigned _horiz_stride) 563428d7b3dSmrg{ 564428d7b3dSmrg string(file, "<"); 565428d7b3dSmrg control(file, "vert stride", vert_stride, _vert_stride, NULL); 566428d7b3dSmrg string(file, ","); 567428d7b3dSmrg control(file, "width", width, _width, NULL); 568428d7b3dSmrg string(file, ","); 569428d7b3dSmrg control(file, "horiz_stride", horiz_stride, _horiz_stride, NULL); 570428d7b3dSmrg string(file, ">"); 571428d7b3dSmrg} 572428d7b3dSmrg 573428d7b3dSmrgstatic void src_da1(FILE *file, unsigned type, unsigned _reg_file, 574428d7b3dSmrg unsigned _vert_stride, unsigned _width, unsigned _horiz_stride, 575428d7b3dSmrg unsigned reg_num, unsigned sub_reg_num, unsigned __abs, unsigned _negate) 576428d7b3dSmrg{ 577428d7b3dSmrg control(file, "negate", negate, _negate, NULL); 578428d7b3dSmrg control(file, "abs", _abs, __abs, NULL); 579428d7b3dSmrg 580428d7b3dSmrg if (reg(file, _reg_file, reg_num)) 581428d7b3dSmrg return; 582428d7b3dSmrg 583428d7b3dSmrg if (sub_reg_num) 584428d7b3dSmrg format(file, ".%d", sub_reg_num / reg_type_size[type]); /* use formal style like spec */ 585428d7b3dSmrg src_align1_region(file, _vert_stride, _width, _horiz_stride); 586428d7b3dSmrg control(file, "src reg encoding", reg_encoding, type, NULL); 587428d7b3dSmrg} 588428d7b3dSmrg 589428d7b3dSmrgstatic void src_ia1(FILE *file, 590428d7b3dSmrg unsigned type, 591428d7b3dSmrg unsigned _reg_file, 592428d7b3dSmrg int _addr_imm, 593428d7b3dSmrg unsigned _addr_subreg_nr, 594428d7b3dSmrg unsigned _negate, 595428d7b3dSmrg unsigned __abs, 596428d7b3dSmrg unsigned _addr_mode, 597428d7b3dSmrg unsigned _horiz_stride, 598428d7b3dSmrg unsigned _width, 599428d7b3dSmrg unsigned _vert_stride) 600428d7b3dSmrg{ 601428d7b3dSmrg control(file, "negate", negate, _negate, NULL); 602428d7b3dSmrg control(file, "abs", _abs, __abs, NULL); 603428d7b3dSmrg 604428d7b3dSmrg string(file, "g[a0"); 605428d7b3dSmrg if (_addr_subreg_nr) 606428d7b3dSmrg format(file, ".%d", _addr_subreg_nr); 607428d7b3dSmrg if (_addr_imm) 608428d7b3dSmrg format(file, " %d", _addr_imm); 609428d7b3dSmrg string(file, "]"); 610428d7b3dSmrg src_align1_region(file, _vert_stride, _width, _horiz_stride); 611428d7b3dSmrg control(file, "src reg encoding", reg_encoding, type, NULL); 612428d7b3dSmrg} 613428d7b3dSmrg 614428d7b3dSmrgstatic void src_da16(FILE *file, 615428d7b3dSmrg unsigned _reg_type, 616428d7b3dSmrg unsigned _reg_file, 617428d7b3dSmrg unsigned _vert_stride, 618428d7b3dSmrg unsigned _reg_nr, 619428d7b3dSmrg unsigned _subreg_nr, 620428d7b3dSmrg unsigned __abs, 621428d7b3dSmrg unsigned _negate, 622428d7b3dSmrg unsigned swz_x, 623428d7b3dSmrg unsigned swz_y, 624428d7b3dSmrg unsigned swz_z, 625428d7b3dSmrg unsigned swz_w) 626428d7b3dSmrg{ 627428d7b3dSmrg control(file, "negate", negate, _negate, NULL); 628428d7b3dSmrg control(file, "abs", _abs, __abs, NULL); 629428d7b3dSmrg 630428d7b3dSmrg if (reg(file, _reg_file, _reg_nr)) 631428d7b3dSmrg return; 632428d7b3dSmrg 633428d7b3dSmrg if (_subreg_nr) 634428d7b3dSmrg /* bit4 for subreg number byte addressing. Make this same meaning as 635428d7b3dSmrg in da1 case, so output looks consistent. */ 636428d7b3dSmrg format(file, ".%d", 16 / reg_type_size[_reg_type]); 637428d7b3dSmrg string(file, "<"); 638428d7b3dSmrg control(file, "vert stride", vert_stride, _vert_stride, NULL); 639428d7b3dSmrg string(file, ",4,1>"); 640428d7b3dSmrg /* 641428d7b3dSmrg * Three kinds of swizzle display: 642428d7b3dSmrg * identity - nothing printed 643428d7b3dSmrg * 1->all - print the single channel 644428d7b3dSmrg * 1->1 - print the mapping 645428d7b3dSmrg */ 646428d7b3dSmrg if (swz_x == BRW_CHANNEL_X && 647428d7b3dSmrg swz_y == BRW_CHANNEL_Y && 648428d7b3dSmrg swz_z == BRW_CHANNEL_Z && 649428d7b3dSmrg swz_w == BRW_CHANNEL_W) 650428d7b3dSmrg { 651428d7b3dSmrg ; 652428d7b3dSmrg } 653428d7b3dSmrg else if (swz_x == swz_y && swz_x == swz_z && swz_x == swz_w) 654428d7b3dSmrg { 655428d7b3dSmrg string(file, "."); 656428d7b3dSmrg control(file, "channel select", chan_sel, swz_x, NULL); 657428d7b3dSmrg } 658428d7b3dSmrg else 659428d7b3dSmrg { 660428d7b3dSmrg string(file, "."); 661428d7b3dSmrg control(file, "channel select", chan_sel, swz_x, NULL); 662428d7b3dSmrg control(file, "channel select", chan_sel, swz_y, NULL); 663428d7b3dSmrg control(file, "channel select", chan_sel, swz_z, NULL); 664428d7b3dSmrg control(file, "channel select", chan_sel, swz_w, NULL); 665428d7b3dSmrg } 666428d7b3dSmrg control(file, "src da16 reg type", reg_encoding, _reg_type, NULL); 667428d7b3dSmrg} 668428d7b3dSmrg 669428d7b3dSmrgstatic void imm(FILE *file, unsigned type, const struct brw_instruction *inst) 670428d7b3dSmrg{ 671428d7b3dSmrg switch (type) { 672428d7b3dSmrg case BRW_REGISTER_TYPE_UD: 673428d7b3dSmrg format(file, "0x%08xUD", inst->bits3.ud); 674428d7b3dSmrg break; 675428d7b3dSmrg case BRW_REGISTER_TYPE_D: 676428d7b3dSmrg format(file, "%dD", inst->bits3.d); 677428d7b3dSmrg break; 678428d7b3dSmrg case BRW_REGISTER_TYPE_UW: 679428d7b3dSmrg format(file, "0x%04xUW", (uint16_t) inst->bits3.ud); 680428d7b3dSmrg break; 681428d7b3dSmrg case BRW_REGISTER_TYPE_W: 682428d7b3dSmrg format(file, "%dW", (int16_t) inst->bits3.d); 683428d7b3dSmrg break; 684428d7b3dSmrg case BRW_REGISTER_TYPE_UB: 685428d7b3dSmrg format(file, "0x%02xUB", (int8_t) inst->bits3.ud); 686428d7b3dSmrg break; 687428d7b3dSmrg case BRW_REGISTER_TYPE_VF: 688428d7b3dSmrg format(file, "Vector Float"); 689428d7b3dSmrg break; 690428d7b3dSmrg case BRW_REGISTER_TYPE_V: 691428d7b3dSmrg format(file, "0x%08xV", inst->bits3.ud); 692428d7b3dSmrg break; 693428d7b3dSmrg case BRW_REGISTER_TYPE_F: 694428d7b3dSmrg format(file, "%-gF", inst->bits3.f); 695428d7b3dSmrg } 696428d7b3dSmrg} 697428d7b3dSmrg 698428d7b3dSmrgstatic void src0(FILE *file, const struct brw_instruction *inst) 699428d7b3dSmrg{ 700428d7b3dSmrg if (inst->bits1.da1.src0_reg_file == BRW_IMMEDIATE_VALUE) 701428d7b3dSmrg imm(file, inst->bits1.da1.src0_reg_type, inst); 702428d7b3dSmrg else if (inst->header.access_mode == BRW_ALIGN_1) { 703428d7b3dSmrg if (inst->bits2.da1.src0_address_mode == BRW_ADDRESS_DIRECT) { 704428d7b3dSmrg src_da1(file, 705428d7b3dSmrg inst->bits1.da1.src0_reg_type, 706428d7b3dSmrg inst->bits1.da1.src0_reg_file, 707428d7b3dSmrg inst->bits2.da1.src0_vert_stride, 708428d7b3dSmrg inst->bits2.da1.src0_width, 709428d7b3dSmrg inst->bits2.da1.src0_horiz_stride, 710428d7b3dSmrg inst->bits2.da1.src0_reg_nr, 711428d7b3dSmrg inst->bits2.da1.src0_subreg_nr, 712428d7b3dSmrg inst->bits2.da1.src0_abs, 713428d7b3dSmrg inst->bits2.da1.src0_negate); 714428d7b3dSmrg } else { 715428d7b3dSmrg src_ia1(file, 716428d7b3dSmrg inst->bits1.ia1.src0_reg_type, 717428d7b3dSmrg inst->bits1.ia1.src0_reg_file, 718428d7b3dSmrg inst->bits2.ia1.src0_indirect_offset, 719428d7b3dSmrg inst->bits2.ia1.src0_subreg_nr, 720428d7b3dSmrg inst->bits2.ia1.src0_negate, 721428d7b3dSmrg inst->bits2.ia1.src0_abs, 722428d7b3dSmrg inst->bits2.ia1.src0_address_mode, 723428d7b3dSmrg inst->bits2.ia1.src0_horiz_stride, 724428d7b3dSmrg inst->bits2.ia1.src0_width, 725428d7b3dSmrg inst->bits2.ia1.src0_vert_stride); 726428d7b3dSmrg } 727428d7b3dSmrg } else { 728428d7b3dSmrg if (inst->bits2.da16.src0_address_mode == BRW_ADDRESS_DIRECT) { 729428d7b3dSmrg src_da16(file, 730428d7b3dSmrg inst->bits1.da16.src0_reg_type, 731428d7b3dSmrg inst->bits1.da16.src0_reg_file, 732428d7b3dSmrg inst->bits2.da16.src0_vert_stride, 733428d7b3dSmrg inst->bits2.da16.src0_reg_nr, 734428d7b3dSmrg inst->bits2.da16.src0_subreg_nr, 735428d7b3dSmrg inst->bits2.da16.src0_abs, 736428d7b3dSmrg inst->bits2.da16.src0_negate, 737428d7b3dSmrg inst->bits2.da16.src0_swz_x, 738428d7b3dSmrg inst->bits2.da16.src0_swz_y, 739428d7b3dSmrg inst->bits2.da16.src0_swz_z, 740428d7b3dSmrg inst->bits2.da16.src0_swz_w); 741428d7b3dSmrg } else { 742428d7b3dSmrg string(file, "Indirect align16 address mode not supported"); 743428d7b3dSmrg } 744428d7b3dSmrg } 745428d7b3dSmrg} 746428d7b3dSmrg 747428d7b3dSmrgstatic void src1(FILE *file, const struct brw_instruction *inst) 748428d7b3dSmrg{ 749428d7b3dSmrg if (inst->bits1.da1.src1_reg_file == BRW_IMMEDIATE_VALUE) 750428d7b3dSmrg imm(file, inst->bits1.da1.src1_reg_type, inst); 751428d7b3dSmrg else if (inst->header.access_mode == BRW_ALIGN_1) { 752428d7b3dSmrg if (inst->bits3.da1.src1_address_mode == BRW_ADDRESS_DIRECT) { 753428d7b3dSmrg src_da1(file, 754428d7b3dSmrg inst->bits1.da1.src1_reg_type, 755428d7b3dSmrg inst->bits1.da1.src1_reg_file, 756428d7b3dSmrg inst->bits3.da1.src1_vert_stride, 757428d7b3dSmrg inst->bits3.da1.src1_width, 758428d7b3dSmrg inst->bits3.da1.src1_horiz_stride, 759428d7b3dSmrg inst->bits3.da1.src1_reg_nr, 760428d7b3dSmrg inst->bits3.da1.src1_subreg_nr, 761428d7b3dSmrg inst->bits3.da1.src1_abs, 762428d7b3dSmrg inst->bits3.da1.src1_negate); 763428d7b3dSmrg } else { 764428d7b3dSmrg src_ia1(file, 765428d7b3dSmrg inst->bits1.ia1.src1_reg_type, 766428d7b3dSmrg inst->bits1.ia1.src1_reg_file, 767428d7b3dSmrg inst->bits3.ia1.src1_indirect_offset, 768428d7b3dSmrg inst->bits3.ia1.src1_subreg_nr, 769428d7b3dSmrg inst->bits3.ia1.src1_negate, 770428d7b3dSmrg inst->bits3.ia1.src1_abs, 771428d7b3dSmrg inst->bits3.ia1.src1_address_mode, 772428d7b3dSmrg inst->bits3.ia1.src1_horiz_stride, 773428d7b3dSmrg inst->bits3.ia1.src1_width, 774428d7b3dSmrg inst->bits3.ia1.src1_vert_stride); 775428d7b3dSmrg } 776428d7b3dSmrg } else { 777428d7b3dSmrg if (inst->bits3.da16.src1_address_mode == BRW_ADDRESS_DIRECT) { 778428d7b3dSmrg src_da16(file, 779428d7b3dSmrg inst->bits1.da16.src1_reg_type, 780428d7b3dSmrg inst->bits1.da16.src1_reg_file, 781428d7b3dSmrg inst->bits3.da16.src1_vert_stride, 782428d7b3dSmrg inst->bits3.da16.src1_reg_nr, 783428d7b3dSmrg inst->bits3.da16.src1_subreg_nr, 784428d7b3dSmrg inst->bits3.da16.src1_abs, 785428d7b3dSmrg inst->bits3.da16.src1_negate, 786428d7b3dSmrg inst->bits3.da16.src1_swz_x, 787428d7b3dSmrg inst->bits3.da16.src1_swz_y, 788428d7b3dSmrg inst->bits3.da16.src1_swz_z, 789428d7b3dSmrg inst->bits3.da16.src1_swz_w); 790428d7b3dSmrg } else { 791428d7b3dSmrg string(file, "Indirect align16 address mode not supported"); 792428d7b3dSmrg } 793428d7b3dSmrg } 794428d7b3dSmrg} 795428d7b3dSmrg 796428d7b3dSmrgstatic const int esize[6] = { 797428d7b3dSmrg [0] = 1, 798428d7b3dSmrg [1] = 2, 799428d7b3dSmrg [2] = 4, 800428d7b3dSmrg [3] = 8, 801428d7b3dSmrg [4] = 16, 802428d7b3dSmrg [5] = 32, 803428d7b3dSmrg}; 804428d7b3dSmrg 805428d7b3dSmrgstatic int qtr_ctrl(FILE *file, const struct brw_instruction *inst) 806428d7b3dSmrg{ 807428d7b3dSmrg int qtr_ctl = inst->header.compression_control; 808428d7b3dSmrg int size = esize[inst->header.execution_size]; 809428d7b3dSmrg 810428d7b3dSmrg if (size == 8) { 811428d7b3dSmrg switch (qtr_ctl) { 812428d7b3dSmrg case 0: 813428d7b3dSmrg string(file, " 1Q"); 814428d7b3dSmrg break; 815428d7b3dSmrg case 1: 816428d7b3dSmrg string(file, " 2Q"); 817428d7b3dSmrg break; 818428d7b3dSmrg case 2: 819428d7b3dSmrg string(file, " 3Q"); 820428d7b3dSmrg break; 821428d7b3dSmrg case 3: 822428d7b3dSmrg string(file, " 4Q"); 823428d7b3dSmrg break; 824428d7b3dSmrg } 825428d7b3dSmrg } else if (size == 16){ 826428d7b3dSmrg if (qtr_ctl < 2) 827428d7b3dSmrg string(file, " 1H"); 828428d7b3dSmrg else 829428d7b3dSmrg string(file, " 2H"); 830428d7b3dSmrg } 831428d7b3dSmrg return 0; 832428d7b3dSmrg} 833428d7b3dSmrg 834428d7b3dSmrgvoid brw_disasm(FILE *file, const struct brw_instruction *inst, int gen) 835428d7b3dSmrg{ 836428d7b3dSmrg int space = 0; 837428d7b3dSmrg 838428d7b3dSmrg format(file, "%08x %08x %08x %08x\n", 839428d7b3dSmrg ((const uint32_t*)inst)[0], 840428d7b3dSmrg ((const uint32_t*)inst)[1], 841428d7b3dSmrg ((const uint32_t*)inst)[2], 842428d7b3dSmrg ((const uint32_t*)inst)[3]); 843428d7b3dSmrg 844428d7b3dSmrg if (inst->header.predicate_control) { 845428d7b3dSmrg string(file, "("); 846428d7b3dSmrg control(file, "predicate inverse", pred_inv, inst->header.predicate_inverse, NULL); 847428d7b3dSmrg string(file, "f0"); 848428d7b3dSmrg if (inst->bits2.da1.flag_subreg_nr) 849428d7b3dSmrg format(file, ".%d", inst->bits2.da1.flag_subreg_nr); 850428d7b3dSmrg if (inst->header.access_mode == BRW_ALIGN_1) 851428d7b3dSmrg control(file, "predicate control align1", pred_ctrl_align1, 852428d7b3dSmrg inst->header.predicate_control, NULL); 853428d7b3dSmrg else 854428d7b3dSmrg control(file, "predicate control align16", pred_ctrl_align16, 855428d7b3dSmrg inst->header.predicate_control, NULL); 856428d7b3dSmrg string(file, ") "); 857428d7b3dSmrg } 858428d7b3dSmrg 859428d7b3dSmrg print_opcode(file, inst->header.opcode); 860428d7b3dSmrg control(file, "saturate", saturate, inst->header.saturate, NULL); 861428d7b3dSmrg control(file, "debug control", debug_ctrl, inst->header.debug_control, NULL); 862428d7b3dSmrg 863428d7b3dSmrg if (inst->header.opcode == BRW_OPCODE_MATH) { 864428d7b3dSmrg string(file, " "); 865428d7b3dSmrg control(file, "function", math_function, 866428d7b3dSmrg inst->header.destreg__conditionalmod, NULL); 867428d7b3dSmrg } else if (inst->header.opcode != BRW_OPCODE_SEND && 868428d7b3dSmrg inst->header.opcode != BRW_OPCODE_SENDC) 869428d7b3dSmrg control(file, "conditional modifier", conditional_modifier, 870428d7b3dSmrg inst->header.destreg__conditionalmod, NULL); 871428d7b3dSmrg 872428d7b3dSmrg if (inst->header.opcode != BRW_OPCODE_NOP) { 873428d7b3dSmrg string(file, "("); 874428d7b3dSmrg control(file, "execution size", exec_size, inst->header.execution_size, NULL); 875428d7b3dSmrg string(file, ")"); 876428d7b3dSmrg } 877428d7b3dSmrg 878428d7b3dSmrg if (inst->header.opcode == BRW_OPCODE_SEND && gen < 060) 879428d7b3dSmrg format(file, " %d", inst->header.destreg__conditionalmod); 880428d7b3dSmrg 881428d7b3dSmrg if (opcode[inst->header.opcode].ndst > 0) { 882428d7b3dSmrg pad(file, 16); 883428d7b3dSmrg dest(file, inst); 884428d7b3dSmrg } else if (gen >= 060 && 885428d7b3dSmrg (inst->header.opcode == BRW_OPCODE_IF || 886428d7b3dSmrg inst->header.opcode == BRW_OPCODE_ELSE || 887428d7b3dSmrg inst->header.opcode == BRW_OPCODE_ENDIF || 888428d7b3dSmrg inst->header.opcode == BRW_OPCODE_WHILE)) { 889428d7b3dSmrg format(file, " %d", inst->bits1.branch_gen6.jump_count); 890428d7b3dSmrg } 891428d7b3dSmrg 892428d7b3dSmrg if (opcode[inst->header.opcode].nsrc > 0) { 893428d7b3dSmrg pad(file, 32); 894428d7b3dSmrg src0(file, inst); 895428d7b3dSmrg } 896428d7b3dSmrg if (opcode[inst->header.opcode].nsrc > 1) { 897428d7b3dSmrg pad(file, 48); 898428d7b3dSmrg src1(file, inst); 899428d7b3dSmrg } 900428d7b3dSmrg 901428d7b3dSmrg if (inst->header.opcode == BRW_OPCODE_SEND || 902428d7b3dSmrg inst->header.opcode == BRW_OPCODE_SENDC) { 903428d7b3dSmrg enum brw_message_target target; 904428d7b3dSmrg 905428d7b3dSmrg if (gen >= 060) 906428d7b3dSmrg target = inst->header.destreg__conditionalmod; 907428d7b3dSmrg else if (gen >= 050) 908428d7b3dSmrg target = inst->bits2.send_gen5.sfid; 909428d7b3dSmrg else 910428d7b3dSmrg target = inst->bits3.generic.msg_target; 911428d7b3dSmrg 912428d7b3dSmrg newline (file); 913428d7b3dSmrg pad (file, 16); 914428d7b3dSmrg space = 0; 915428d7b3dSmrg 916428d7b3dSmrg if (gen >= 060) { 917428d7b3dSmrg control (file, "target function", target_function_gen6, 918428d7b3dSmrg target, &space); 919428d7b3dSmrg } else { 920428d7b3dSmrg control (file, "target function", target_function, 921428d7b3dSmrg target, &space); 922428d7b3dSmrg } 923428d7b3dSmrg 924428d7b3dSmrg switch (target) { 925428d7b3dSmrg case BRW_SFID_MATH: 926428d7b3dSmrg control (file, "math function", math_function, 927428d7b3dSmrg inst->bits3.math.function, &space); 928428d7b3dSmrg control (file, "math saturate", math_saturate, 929428d7b3dSmrg inst->bits3.math.saturate, &space); 930428d7b3dSmrg control (file, "math signed", math_signed, 931428d7b3dSmrg inst->bits3.math.int_type, &space); 932428d7b3dSmrg control (file, "math scalar", math_scalar, 933428d7b3dSmrg inst->bits3.math.data_type, &space); 934428d7b3dSmrg control (file, "math precision", math_precision, 935428d7b3dSmrg inst->bits3.math.precision, &space); 936428d7b3dSmrg break; 937428d7b3dSmrg case BRW_SFID_SAMPLER: 938428d7b3dSmrg if (gen >= 070) { 939428d7b3dSmrg format (file, " (%d, %d, %d, %d)", 940428d7b3dSmrg inst->bits3.sampler_gen7.binding_table_index, 941428d7b3dSmrg inst->bits3.sampler_gen7.sampler, 942428d7b3dSmrg inst->bits3.sampler_gen7.msg_type, 943428d7b3dSmrg inst->bits3.sampler_gen7.simd_mode); 944428d7b3dSmrg } else if (gen >= 050) { 945428d7b3dSmrg format (file, " (%d, %d, %d, %d)", 946428d7b3dSmrg inst->bits3.sampler_gen5.binding_table_index, 947428d7b3dSmrg inst->bits3.sampler_gen5.sampler, 948428d7b3dSmrg inst->bits3.sampler_gen5.msg_type, 949428d7b3dSmrg inst->bits3.sampler_gen5.simd_mode); 950428d7b3dSmrg } else if (gen >= 045) { 951428d7b3dSmrg format (file, " (%d, %d)", 952428d7b3dSmrg inst->bits3.sampler_g4x.binding_table_index, 953428d7b3dSmrg inst->bits3.sampler_g4x.sampler); 954428d7b3dSmrg } else { 955428d7b3dSmrg format (file, " (%d, %d, ", 956428d7b3dSmrg inst->bits3.sampler.binding_table_index, 957428d7b3dSmrg inst->bits3.sampler.sampler); 958428d7b3dSmrg control (file, "sampler target format", 959428d7b3dSmrg sampler_target_format, 960428d7b3dSmrg inst->bits3.sampler.return_format, NULL); 961428d7b3dSmrg string (file, ")"); 962428d7b3dSmrg } 963428d7b3dSmrg break; 964428d7b3dSmrg case BRW_SFID_DATAPORT_READ: 965428d7b3dSmrg if (gen >= 060) { 966428d7b3dSmrg format (file, " (%d, %d, %d, %d)", 967428d7b3dSmrg inst->bits3.gen6_dp.binding_table_index, 968428d7b3dSmrg inst->bits3.gen6_dp.msg_control, 969428d7b3dSmrg inst->bits3.gen6_dp.msg_type, 970428d7b3dSmrg inst->bits3.gen6_dp.send_commit_msg); 971428d7b3dSmrg } else if (gen >= 045) { 972428d7b3dSmrg format (file, " (%d, %d, %d)", 973428d7b3dSmrg inst->bits3.dp_read_gen5.binding_table_index, 974428d7b3dSmrg inst->bits3.dp_read_gen5.msg_control, 975428d7b3dSmrg inst->bits3.dp_read_gen5.msg_type); 976428d7b3dSmrg } else { 977428d7b3dSmrg format (file, " (%d, %d, %d)", 978428d7b3dSmrg inst->bits3.dp_read.binding_table_index, 979428d7b3dSmrg inst->bits3.dp_read.msg_control, 980428d7b3dSmrg inst->bits3.dp_read.msg_type); 981428d7b3dSmrg } 982428d7b3dSmrg break; 983428d7b3dSmrg 984428d7b3dSmrg case BRW_SFID_DATAPORT_WRITE: 985428d7b3dSmrg if (gen >= 070) { 986428d7b3dSmrg format (file, " ("); 987428d7b3dSmrg 988428d7b3dSmrg control (file, "DP rc message type", 989428d7b3dSmrg dp_rc_msg_type_gen6, 990428d7b3dSmrg inst->bits3.gen7_dp.msg_type, &space); 991428d7b3dSmrg 992428d7b3dSmrg format (file, ", %d, %d, %d)", 993428d7b3dSmrg inst->bits3.gen7_dp.binding_table_index, 994428d7b3dSmrg inst->bits3.gen7_dp.msg_control, 995428d7b3dSmrg inst->bits3.gen7_dp.msg_type); 996428d7b3dSmrg } else if (gen >= 060) { 997428d7b3dSmrg format (file, " ("); 998428d7b3dSmrg 999428d7b3dSmrg control (file, "DP rc message type", 1000428d7b3dSmrg dp_rc_msg_type_gen6, 1001428d7b3dSmrg inst->bits3.gen6_dp.msg_type, &space); 1002428d7b3dSmrg 1003428d7b3dSmrg format (file, ", %d, %d, %d, %d)", 1004428d7b3dSmrg inst->bits3.gen6_dp.binding_table_index, 1005428d7b3dSmrg inst->bits3.gen6_dp.msg_control, 1006428d7b3dSmrg inst->bits3.gen6_dp.msg_type, 1007428d7b3dSmrg inst->bits3.gen6_dp.send_commit_msg); 1008428d7b3dSmrg } else { 1009428d7b3dSmrg format (file, " (%d, %d, %d, %d)", 1010428d7b3dSmrg inst->bits3.dp_write.binding_table_index, 1011428d7b3dSmrg (inst->bits3.dp_write.last_render_target << 3) | 1012428d7b3dSmrg inst->bits3.dp_write.msg_control, 1013428d7b3dSmrg inst->bits3.dp_write.msg_type, 1014428d7b3dSmrg inst->bits3.dp_write.send_commit_msg); 1015428d7b3dSmrg } 1016428d7b3dSmrg break; 1017428d7b3dSmrg 1018428d7b3dSmrg case BRW_SFID_URB: 1019428d7b3dSmrg if (gen >= 050) { 1020428d7b3dSmrg format (file, " %d", inst->bits3.urb_gen5.offset); 1021428d7b3dSmrg } else { 1022428d7b3dSmrg format (file, " %d", inst->bits3.urb.offset); 1023428d7b3dSmrg } 1024428d7b3dSmrg 1025428d7b3dSmrg space = 1; 1026428d7b3dSmrg if (gen >= 050) { 1027428d7b3dSmrg control (file, "urb opcode", urb_opcode, 1028428d7b3dSmrg inst->bits3.urb_gen5.opcode, &space); 1029428d7b3dSmrg } 1030428d7b3dSmrg control (file, "urb swizzle", urb_swizzle, 1031428d7b3dSmrg inst->bits3.urb.swizzle_control, &space); 1032428d7b3dSmrg control (file, "urb allocate", urb_allocate, 1033428d7b3dSmrg inst->bits3.urb.allocate, &space); 1034428d7b3dSmrg control (file, "urb used", urb_used, 1035428d7b3dSmrg inst->bits3.urb.used, &space); 1036428d7b3dSmrg control (file, "urb complete", urb_complete, 1037428d7b3dSmrg inst->bits3.urb.complete, &space); 1038428d7b3dSmrg break; 1039428d7b3dSmrg case BRW_SFID_THREAD_SPAWNER: 1040428d7b3dSmrg break; 1041428d7b3dSmrg case GEN7_SFID_DATAPORT_DATA_CACHE: 1042428d7b3dSmrg format (file, " (%d, %d, %d)", 1043428d7b3dSmrg inst->bits3.gen7_dp.binding_table_index, 1044428d7b3dSmrg inst->bits3.gen7_dp.msg_control, 1045428d7b3dSmrg inst->bits3.gen7_dp.msg_type); 1046428d7b3dSmrg break; 1047428d7b3dSmrg 1048428d7b3dSmrg 1049428d7b3dSmrg default: 1050428d7b3dSmrg format (file, "unsupported target %d", target); 1051428d7b3dSmrg break; 1052428d7b3dSmrg } 1053428d7b3dSmrg if (space) 1054428d7b3dSmrg string (file, " "); 1055428d7b3dSmrg if (gen >= 050) { 1056428d7b3dSmrg format (file, "mlen %d", 1057428d7b3dSmrg inst->bits3.generic_gen5.msg_length); 1058428d7b3dSmrg format (file, " rlen %d", 1059428d7b3dSmrg inst->bits3.generic_gen5.response_length); 1060428d7b3dSmrg } else { 1061428d7b3dSmrg format (file, "mlen %d", 1062428d7b3dSmrg inst->bits3.generic.msg_length); 1063428d7b3dSmrg format (file, " rlen %d", 1064428d7b3dSmrg inst->bits3.generic.response_length); 1065428d7b3dSmrg } 1066428d7b3dSmrg } 1067428d7b3dSmrg pad(file, 64); 1068428d7b3dSmrg if (inst->header.opcode != BRW_OPCODE_NOP) { 1069428d7b3dSmrg string(file, "{"); 1070428d7b3dSmrg space = 1; 1071428d7b3dSmrg control(file, "access mode", access_mode, inst->header.access_mode, &space); 1072428d7b3dSmrg if (gen >= 060) 1073428d7b3dSmrg control(file, "write enable control", wectrl, inst->header.mask_control, &space); 1074428d7b3dSmrg else 1075428d7b3dSmrg control(file, "mask control", mask_ctrl, inst->header.mask_control, &space); 1076428d7b3dSmrg control(file, "dependency control", dep_ctrl, inst->header.dependency_control, &space); 1077428d7b3dSmrg 1078428d7b3dSmrg if (gen >= 060) 1079428d7b3dSmrg qtr_ctrl(file, inst); 1080428d7b3dSmrg else { 1081428d7b3dSmrg if (inst->header.compression_control == BRW_COMPRESSION_COMPRESSED && 1082428d7b3dSmrg opcode[inst->header.opcode].ndst > 0 && 1083428d7b3dSmrg inst->bits1.da1.dest_reg_file == BRW_MESSAGE_REGISTER_FILE && 1084428d7b3dSmrg inst->bits1.da1.dest_reg_nr & (1 << 7)) { 1085428d7b3dSmrg format(file, " compr4"); 1086428d7b3dSmrg } else { 1087428d7b3dSmrg control(file, "compression control", compr_ctrl, 1088428d7b3dSmrg inst->header.compression_control, &space); 1089428d7b3dSmrg } 1090428d7b3dSmrg } 1091428d7b3dSmrg 1092428d7b3dSmrg control(file, "thread control", thread_ctrl, inst->header.thread_control, &space); 1093428d7b3dSmrg if (gen >= 060) 1094428d7b3dSmrg control(file, "acc write control", accwr, inst->header.acc_wr_control, &space); 1095428d7b3dSmrg if (inst->header.opcode == BRW_OPCODE_SEND || 1096428d7b3dSmrg inst->header.opcode == BRW_OPCODE_SENDC) 1097428d7b3dSmrg control(file, "end of thread", end_of_thread, 1098428d7b3dSmrg inst->bits3.generic.end_of_thread, &space); 1099428d7b3dSmrg if (space) 1100428d7b3dSmrg string(file, " "); 1101428d7b3dSmrg string(file, "}"); 1102428d7b3dSmrg } 1103428d7b3dSmrg string(file, ";"); 1104428d7b3dSmrg newline(file); 1105428d7b3dSmrg} 1106