summaryrefslogtreecommitdiff
path: root/src/intel/compiler/brw_disasm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/intel/compiler/brw_disasm.c')
-rw-r--r--src/intel/compiler/brw_disasm.c1149
1 files changed, 652 insertions, 497 deletions
diff --git a/src/intel/compiler/brw_disasm.c b/src/intel/compiler/brw_disasm.c
index 1ce0ea27154..6cab08cfc97 100644
--- a/src/intel/compiler/brw_disasm.c
+++ b/src/intel/compiler/brw_disasm.c
@@ -1,5 +1,6 @@
/*
* Copyright © 2008 Keith Packard
+ * Copyright © 2014 Intel Corporation
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
@@ -20,24 +21,24 @@
* OF THIS SOFTWARE.
*/
+#include <inttypes.h>
+#include <stdarg.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
-#include <stdarg.h>
+#include "brw_disasm.h"
+#include "brw_disasm_info.h"
#include "brw_eu_defines.h"
+#include "brw_eu.h"
#include "brw_inst.h"
-#include "brw_shader.h"
+#include "brw_isa_info.h"
#include "brw_reg.h"
-#include "brw_inst.h"
-#include "brw_eu.h"
#include "util/half_float.h"
bool
brw_has_jip(const struct intel_device_info *devinfo, enum opcode opcode)
{
- if (devinfo->ver < 6)
- return false;
-
return opcode == BRW_OPCODE_IF ||
opcode == BRW_OPCODE_ELSE ||
opcode == BRW_OPCODE_ENDIF ||
@@ -50,11 +51,8 @@ brw_has_jip(const struct intel_device_info *devinfo, enum opcode opcode)
bool
brw_has_uip(const struct intel_device_info *devinfo, enum opcode opcode)
{
- if (devinfo->ver < 6)
- return false;
-
- return (devinfo->ver >= 7 && opcode == BRW_OPCODE_IF) ||
- (devinfo->ver >= 8 && opcode == BRW_OPCODE_ELSE) ||
+ return opcode == BRW_OPCODE_IF ||
+ opcode == BRW_OPCODE_ELSE ||
opcode == BRW_OPCODE_BREAK ||
opcode == BRW_OPCODE_CONTINUE ||
opcode == BRW_OPCODE_HALT;
@@ -63,12 +61,8 @@ brw_has_uip(const struct intel_device_info *devinfo, enum opcode opcode)
static bool
has_branch_ctrl(const struct intel_device_info *devinfo, enum opcode opcode)
{
- if (devinfo->ver < 8)
- return false;
-
return opcode == BRW_OPCODE_IF ||
opcode == BRW_OPCODE_ELSE;
- /* opcode == BRW_OPCODE_GOTO; */
}
static bool
@@ -227,19 +221,18 @@ static const char *const pred_ctrl_align1[16] = {
[BRW_PREDICATE_ALIGN1_ALL32H] = ".all32h",
};
+static const char *const xe2_pred_ctrl[4] = {
+ [BRW_PREDICATE_NORMAL] = "",
+ [XE2_PREDICATE_ANY] = ".any",
+ [XE2_PREDICATE_ALL] = ".all",
+};
+
static const char *const thread_ctrl[4] = {
[BRW_THREAD_NORMAL] = "",
[BRW_THREAD_ATOMIC] = "atomic",
[BRW_THREAD_SWITCH] = "switch",
};
-static const char *const compr_ctrl[4] = {
- [0] = "",
- [1] = "sechalf",
- [2] = "compr",
- [3] = "compr4",
-};
-
static const char *const dep_ctrl[4] = {
[0] = "",
[1] = "NoDDClr",
@@ -247,11 +240,6 @@ static const char *const dep_ctrl[4] = {
[3] = "NoDDClr,NoDDChk",
};
-static const char *const mask_ctrl[4] = {
- [0] = "",
- [1] = "nomask",
-};
-
static const char *const access_mode[2] = {
[0] = "align1",
[1] = "align16",
@@ -288,22 +276,8 @@ static const char *const end_of_thread[2] = {
[1] = "EOT"
};
-/* SFIDs on Gfx4-5 */
-static const char *const gfx4_sfid[16] = {
- [BRW_SFID_NULL] = "null",
- [BRW_SFID_MATH] = "math",
- [BRW_SFID_SAMPLER] = "sampler",
- [BRW_SFID_MESSAGE_GATEWAY] = "gateway",
- [BRW_SFID_DATAPORT_READ] = "read",
- [BRW_SFID_DATAPORT_WRITE] = "write",
- [BRW_SFID_URB] = "urb",
- [BRW_SFID_THREAD_SPAWNER] = "thread_spawner",
- [BRW_SFID_VME] = "vme",
-};
-
static const char *const gfx6_sfid[16] = {
[BRW_SFID_NULL] = "null",
- [BRW_SFID_MATH] = "math",
[BRW_SFID_SAMPLER] = "sampler",
[BRW_SFID_MESSAGE_GATEWAY] = "gateway",
[BRW_SFID_URB] = "urb",
@@ -331,63 +305,6 @@ static const char *const gfx7_gateway_subfuncid[8] = {
[BRW_MESSAGE_GATEWAY_SFID_MMIO_READ_WRITE] = "mmio read/write",
};
-static const char *const gfx4_dp_read_port_msg_type[4] = {
- [0b00] = "OWord Block Read",
- [0b01] = "OWord Dual Block Read",
- [0b10] = "Media Block Read",
- [0b11] = "DWord Scattered Read",
-};
-
-static const char *const g45_dp_read_port_msg_type[8] = {
- [0b000] = "OWord Block Read",
- [0b010] = "OWord Dual Block Read",
- [0b100] = "Media Block Read",
- [0b110] = "DWord Scattered Read",
- [0b001] = "Render Target UNORM Read",
- [0b011] = "AVC Loop Filter Read",
-};
-
-static const char *const dp_write_port_msg_type[8] = {
- [0b000] = "OWord block write",
- [0b001] = "OWord dual block write",
- [0b010] = "media block write",
- [0b011] = "DWord scattered write",
- [0b100] = "RT write",
- [0b101] = "streamed VB write",
- [0b110] = "RT UNORM write", /* G45+ */
- [0b111] = "flush render cache",
-};
-
-static const char *const dp_rc_msg_type_gfx6[16] = {
- [BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ] = "OWORD block read",
- [GFX6_DATAPORT_READ_MESSAGE_RENDER_UNORM_READ] = "RT UNORM read",
- [GFX6_DATAPORT_READ_MESSAGE_OWORD_DUAL_BLOCK_READ] = "OWORD dual block read",
- [GFX6_DATAPORT_READ_MESSAGE_MEDIA_BLOCK_READ] = "media block read",
- [GFX6_DATAPORT_READ_MESSAGE_OWORD_UNALIGN_BLOCK_READ] =
- "OWORD unaligned block read",
- [GFX6_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ] = "DWORD scattered read",
- [GFX6_DATAPORT_WRITE_MESSAGE_DWORD_ATOMIC_WRITE] = "DWORD atomic write",
- [GFX6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE] = "OWORD block write",
- [GFX6_DATAPORT_WRITE_MESSAGE_OWORD_DUAL_BLOCK_WRITE] =
- "OWORD dual block write",
- [GFX6_DATAPORT_WRITE_MESSAGE_MEDIA_BLOCK_WRITE] = "media block write",
- [GFX6_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE] =
- "DWORD scattered write",
- [GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE] = "RT write",
- [GFX6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE] = "streamed VB write",
- [GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_UNORM_WRITE] = "RT UNORM write",
-};
-
-static const char *const dp_rc_msg_type_gfx7[16] = {
- [GFX7_DATAPORT_RC_MEDIA_BLOCK_READ] = "media block read",
- [GFX7_DATAPORT_RC_TYPED_SURFACE_READ] = "typed surface read",
- [GFX7_DATAPORT_RC_TYPED_ATOMIC_OP] = "typed atomic op",
- [GFX7_DATAPORT_RC_MEMORY_FENCE] = "memory fence",
- [GFX7_DATAPORT_RC_MEDIA_BLOCK_WRITE] = "media block write",
- [GFX7_DATAPORT_RC_RENDER_TARGET_WRITE] = "RT write",
- [GFX7_DATAPORT_RC_TYPED_SURFACE_WRITE] = "typed surface write"
-};
-
static const char *const dp_rc_msg_type_gfx9[16] = {
[GFX9_DATAPORT_RC_RENDER_TARGET_WRITE] = "RT write",
[GFX9_DATAPORT_RC_RENDER_TARGET_READ] = "RT read"
@@ -396,10 +313,7 @@ static const char *const dp_rc_msg_type_gfx9[16] = {
static const char *const *
dp_rc_msg_type(const struct intel_device_info *devinfo)
{
- return (devinfo->ver >= 9 ? dp_rc_msg_type_gfx9 :
- devinfo->ver >= 7 ? dp_rc_msg_type_gfx7 :
- devinfo->ver >= 6 ? dp_rc_msg_type_gfx6 :
- dp_write_port_msg_type);
+ return dp_rc_msg_type_gfx9;
}
static const char *const m_rt_write_subtype[] = {
@@ -412,6 +326,16 @@ static const char *const m_rt_write_subtype[] = {
[0b111] = "SIMD16/RepData-111", /* no idea how this is different than 1 */
};
+static const char *const m_rt_write_subtype_xe2[] = {
+ [0b000] = "SIMD16",
+ [0b001] = "SIMD32",
+ [0b010] = "SIMD16/DualSrc",
+ [0b011] = "invalid",
+ [0b100] = "invalid",
+ [0b101] = "invalid",
+ [0b111] = "invalid",
+};
+
static const char *const dp_dc0_msg_type_gfx7[16] = {
[GFX7_DATAPORT_DC_OWORD_BLOCK_READ] = "DC OWORD block read",
[GFX7_DATAPORT_DC_UNALIGNED_OWORD_BLOCK_READ] =
@@ -509,7 +433,6 @@ static const char *const math_function[16] = {
[BRW_MATH_FUNCTION_RSQ] = "rsq",
[BRW_MATH_FUNCTION_SIN] = "sin",
[BRW_MATH_FUNCTION_COS] = "cos",
- [BRW_MATH_FUNCTION_SINCOS] = "sincos",
[BRW_MATH_FUNCTION_FDIV] = "fdiv",
[BRW_MATH_FUNCTION_POW] = "pow",
[BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER] = "intdivmod",
@@ -523,46 +446,19 @@ static const char *const sync_function[16] = {
[TGL_SYNC_NOP] = "nop",
[TGL_SYNC_ALLRD] = "allrd",
[TGL_SYNC_ALLWR] = "allwr",
+ [TGL_SYNC_FENCE] = "fence",
[TGL_SYNC_BAR] = "bar",
[TGL_SYNC_HOST] = "host",
};
-static const char *const math_saturate[2] = {
- [0] = "",
- [1] = "sat"
-};
-
-static const char *const math_signed[2] = {
- [0] = "",
- [1] = "signed"
-};
-
-static const char *const math_scalar[2] = {
- [0] = "",
- [1] = "scalar"
-};
-
-static const char *const math_precision[2] = {
- [0] = "",
- [1] = "partial_precision"
-};
-
-static const char *const gfx5_urb_opcode[] = {
- [0] = "urb_write",
- [1] = "ff_sync",
-};
-
static const char *const gfx7_urb_opcode[] = {
- [BRW_URB_OPCODE_WRITE_HWORD] = "write HWord",
- [BRW_URB_OPCODE_WRITE_OWORD] = "write OWord",
- [BRW_URB_OPCODE_READ_HWORD] = "read HWord",
- [BRW_URB_OPCODE_READ_OWORD] = "read OWord",
[GFX7_URB_OPCODE_ATOMIC_MOV] = "atomic mov", /* Gfx7+ */
[GFX7_URB_OPCODE_ATOMIC_INC] = "atomic inc", /* Gfx7+ */
[GFX8_URB_OPCODE_ATOMIC_ADD] = "atomic add", /* Gfx8+ */
[GFX8_URB_OPCODE_SIMD8_WRITE] = "SIMD8 write", /* Gfx8+ */
[GFX8_URB_OPCODE_SIMD8_READ] = "SIMD8 read", /* Gfx8+ */
- /* [9-15] - reserved */
+ [GFX125_URB_OPCODE_FENCE] = "fence", /* Gfx12.5+ */
+ /* [10-15] - reserved */
};
static const char *const urb_swizzle[4] = {
@@ -571,21 +467,6 @@ static const char *const urb_swizzle[4] = {
[BRW_URB_SWIZZLE_TRANSPOSE] = "transpose",
};
-static const char *const urb_allocate[2] = {
- [0] = "",
- [1] = "allocate"
-};
-
-static const char *const urb_used[2] = {
- [0] = "",
- [1] = "used"
-};
-
-static const char *const urb_complete[2] = {
- [0] = "",
- [1] = "complete"
-};
-
static const char *const gfx5_sampler_msg_type[] = {
[GFX5_SAMPLER_MESSAGE_SAMPLE] = "sample",
[GFX5_SAMPLER_MESSAGE_SAMPLE_BIAS] = "sample_b",
@@ -612,17 +493,55 @@ static const char *const gfx5_sampler_msg_type[] = {
[GFX7_SAMPLER_MESSAGE_SAMPLE_LD2DSS] = "ld2dss",
};
-static const char *const gfx5_sampler_simd_mode[4] = {
+static const char *const xe2_sampler_msg_type[] = {
+ [GFX5_SAMPLER_MESSAGE_SAMPLE] = "sample",
+ [GFX5_SAMPLER_MESSAGE_SAMPLE_BIAS] = "sample_b",
+ [GFX5_SAMPLER_MESSAGE_SAMPLE_LOD] = "sample_l",
+ [GFX5_SAMPLER_MESSAGE_SAMPLE_COMPARE] = "sample_c",
+ [GFX5_SAMPLER_MESSAGE_SAMPLE_DERIVS] = "sample_d",
+ [GFX5_SAMPLER_MESSAGE_SAMPLE_BIAS_COMPARE] = "sample_b_c",
+ [GFX5_SAMPLER_MESSAGE_SAMPLE_LOD_COMPARE] = "sample_l_c",
+ [GFX5_SAMPLER_MESSAGE_SAMPLE_LD] = "ld",
+ [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4] = "gather4",
+ [GFX5_SAMPLER_MESSAGE_LOD] = "lod",
+ [GFX5_SAMPLER_MESSAGE_SAMPLE_RESINFO] = "resinfo",
+ [GFX6_SAMPLER_MESSAGE_SAMPLE_SAMPLEINFO] = "sampleinfo",
+ [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4_C] = "gather4_c",
+ [GFX7_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO] = "gather4_po",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_MLOD] = "sample_mlod",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_COMPARE_MLOD] = "sample_c_mlod",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_I] = "gather4_i",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_L] = "gather4_l",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_B] = "gather4_b",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_I_C] = "gather4_i_c",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_L_C] = "gather4_l_c",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_L] = "gather4_po_l",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_L_C] = "gather4_po_l_c",
+ [XE2_SAMPLER_MESSAGE_SAMPLE_GATHER4_PO_B] = "gather4_po_b",
+ [HSW_SAMPLER_MESSAGE_SAMPLE_DERIV_COMPARE] = "sample_d_c",
+ [GFX9_SAMPLER_MESSAGE_SAMPLE_LZ] = "sample_lz",
+ [GFX9_SAMPLER_MESSAGE_SAMPLE_C_LZ] = "sample_c_lz",
+ [GFX9_SAMPLER_MESSAGE_SAMPLE_LD_LZ] = "ld_lz",
+ [GFX9_SAMPLER_MESSAGE_SAMPLE_LD2DMS_W] = "ld2dms_w",
+ [GFX7_SAMPLER_MESSAGE_SAMPLE_LD_MCS] = "ld_mcs",
+ [GFX7_SAMPLER_MESSAGE_SAMPLE_LD2DMS] = "ld2dms",
+ [GFX7_SAMPLER_MESSAGE_SAMPLE_LD2DSS] = "ld2dss",
+};
+
+static const char *const gfx5_sampler_simd_mode[7] = {
[BRW_SAMPLER_SIMD_MODE_SIMD4X2] = "SIMD4x2",
[BRW_SAMPLER_SIMD_MODE_SIMD8] = "SIMD8",
[BRW_SAMPLER_SIMD_MODE_SIMD16] = "SIMD16",
[BRW_SAMPLER_SIMD_MODE_SIMD32_64] = "SIMD32/64",
+ [GFX10_SAMPLER_SIMD_MODE_SIMD8H] = "SIMD8H",
+ [GFX10_SAMPLER_SIMD_MODE_SIMD16H] = "SIMD16H",
};
-static const char *const sampler_target_format[4] = {
- [0] = "F",
- [2] = "UD",
- [3] = "D"
+static const char *const xe2_sampler_simd_mode[7] = {
+ [XE2_SAMPLER_SIMD_MODE_SIMD16] = "SIMD16",
+ [XE2_SAMPLER_SIMD_MODE_SIMD32] = "SIMD32",
+ [XE2_SAMPLER_SIMD_MODE_SIMD16H] = "SIMD16H",
+ [XE2_SAMPLER_SIMD_MODE_SIMD32H] = "SIMD32H",
};
static const char *const lsc_operation[] = {
@@ -676,6 +595,7 @@ static const char* const lsc_flush_type[] = {
[LSC_FLUSH_TYPE_DISCARD] = "discard",
[LSC_FLUSH_TYPE_CLEAN] = "clean",
[LSC_FLUSH_TYPE_L3ONLY] = "l3only",
+ [LSC_FLUSH_TYPE_NONE_6] = "none_6",
};
static const char* const lsc_addr_size[] = {
@@ -750,6 +670,37 @@ static const char* const lsc_cache_store[] = {
[LSC_CACHE_STORE_L1WB_L3WB] = "L1WB_L3WB",
};
+static const char* const xe2_lsc_cache_load[] = {
+ [XE2_LSC_CACHE_LOAD_L1STATE_L3MOCS] = "L1STATE_L3MOCS",
+ [XE2_LSC_CACHE_LOAD_L1UC_L3UC] = "L1UC_L3UC",
+ [XE2_LSC_CACHE_LOAD_L1UC_L3C] = "L1UC_L3C",
+ [XE2_LSC_CACHE_LOAD_L1UC_L3CC] = "L1UC_L3CC",
+ [XE2_LSC_CACHE_LOAD_L1C_L3UC] = "L1C_L3UC",
+ [XE2_LSC_CACHE_LOAD_L1C_L3C] = "L1C_L3C",
+ [XE2_LSC_CACHE_LOAD_L1C_L3CC] = "L1C_L3CC",
+ [XE2_LSC_CACHE_LOAD_L1S_L3UC] = "L1S_L3UC",
+ [XE2_LSC_CACHE_LOAD_L1S_L3C] = "L1S_L3C",
+ [XE2_LSC_CACHE_LOAD_L1IAR_L3IAR] = "L1IAR_L3IAR",
+};
+
+static const char* const xe2_lsc_cache_store[] = {
+ [XE2_LSC_CACHE_STORE_L1STATE_L3MOCS] = "L1STATE_L3MOCS",
+ [XE2_LSC_CACHE_STORE_L1UC_L3UC] = "L1UC_L3UC",
+ [XE2_LSC_CACHE_STORE_L1UC_L3WB] = "L1UC_L3WB",
+ [XE2_LSC_CACHE_STORE_L1WT_L3UC] = "L1WT_L3UC",
+ [XE2_LSC_CACHE_STORE_L1WT_L3WB] = "L1WT_L3WB",
+ [XE2_LSC_CACHE_STORE_L1S_L3UC] = "L1S_L3UC",
+ [XE2_LSC_CACHE_STORE_L1S_L3WB] = "L1S_L3WB",
+ [XE2_LSC_CACHE_STORE_L1WB_L3WB] = "L1WB_L3WB",
+};
+
+static const char* const dpas_systolic_depth[4] = {
+ [0] = "16",
+ [1] = "2",
+ [2] = "4",
+ [3] = "8"
+};
+
static int column;
static int
@@ -812,10 +763,10 @@ control(FILE *file, const char *name, const char *const ctrl[],
}
static int
-print_opcode(FILE *file, const struct intel_device_info *devinfo,
+print_opcode(FILE *file, const struct brw_isa_info *isa,
enum opcode id)
{
- const struct opcode_desc *desc = brw_opcode_desc(devinfo, id);
+ const struct opcode_desc *desc = brw_opcode_desc(isa, id);
if (!desc) {
format(file, "*** invalid opcode value %d ", id);
return 1;
@@ -829,10 +780,6 @@ reg(FILE *file, unsigned _reg_file, unsigned _reg_nr)
{
int err = 0;
- /* Clear the Compr4 instruction compression bit. */
- if (_reg_file == BRW_MESSAGE_REGISTER_FILE)
- _reg_nr &= ~BRW_MRF_COMPR4;
-
if (_reg_file == BRW_ARCHITECTURE_REGISTER_FILE) {
switch (_reg_nr & 0xf0) {
case BRW_ARF_NULL:
@@ -887,15 +834,16 @@ reg(FILE *file, unsigned _reg_file, unsigned _reg_nr)
}
static int
-dest(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
+dest(FILE *file, const struct brw_isa_info *isa, const brw_inst *inst)
{
+ const struct intel_device_info *devinfo = isa->devinfo;
enum brw_reg_type type = brw_inst_dst_type(devinfo, inst);
- unsigned elem_size = brw_reg_type_to_size(type);
+ unsigned elem_size = brw_type_size_bytes(type);
int err = 0;
- if (is_split_send(devinfo, brw_inst_opcode(devinfo, inst))) {
+ if (is_split_send(devinfo, brw_inst_opcode(isa, inst))) {
/* These are fixed for split sends */
- type = BRW_REGISTER_TYPE_UD;
+ type = BRW_TYPE_UD;
elem_size = 4;
if (devinfo->ver >= 12) {
err |= reg(file, brw_inst_send_dst_reg_file(devinfo, inst),
@@ -979,9 +927,7 @@ dest_3src(FILE *file, const struct intel_device_info *devinfo,
if (devinfo->ver < 10 && is_align1)
return 0;
- if (devinfo->ver == 6 && brw_inst_3src_a16_dst_reg_file(devinfo, inst))
- reg_file = BRW_MESSAGE_REGISTER_FILE;
- else if (devinfo->ver >= 12)
+ if (devinfo->ver >= 12)
reg_file = brw_inst_3src_a1_dst_reg_file(devinfo, inst);
else if (is_align1 && brw_inst_3src_a1_dst_reg_file(devinfo, inst))
reg_file = BRW_ARCHITECTURE_REGISTER_FILE;
@@ -999,7 +945,7 @@ dest_3src(FILE *file, const struct intel_device_info *devinfo,
type = brw_inst_3src_a16_dst_type(devinfo, inst);
subreg_nr = brw_inst_3src_a16_dst_subreg_nr(devinfo, inst) * 4;
}
- subreg_nr /= brw_reg_type_to_size(type);
+ subreg_nr /= brw_type_size_bytes(type);
if (subreg_nr)
format(file, ".%u", subreg_nr);
@@ -1015,6 +961,27 @@ dest_3src(FILE *file, const struct intel_device_info *devinfo,
}
static int
+dest_dpas_3src(FILE *file, const struct intel_device_info *devinfo,
+ const brw_inst *inst)
+{
+ uint32_t reg_file = brw_inst_dpas_3src_dst_reg_file(devinfo, inst);
+
+ if (reg(file, reg_file, brw_inst_dpas_3src_dst_reg_nr(devinfo, inst)) == -1)
+ return 0;
+
+ enum brw_reg_type type = brw_inst_dpas_3src_dst_type(devinfo, inst);
+ unsigned subreg_nr = brw_inst_dpas_3src_dst_subreg_nr(devinfo, inst);
+
+ if (subreg_nr)
+ format(file, ".%u", subreg_nr);
+ string(file, "<1>");
+
+ string(file, brw_reg_type_to_letters(type));
+
+ return 0;
+}
+
+static int
src_align1_region(FILE *file,
unsigned _vert_stride, unsigned _width,
unsigned _horiz_stride)
@@ -1041,7 +1008,7 @@ src_da1(FILE *file,
{
int err = 0;
- if (devinfo->ver >= 8 && is_logic_instruction(opcode))
+ if (is_logic_instruction(opcode))
err |= control(file, "bitnot", m_bitnot, _negate, NULL);
else
err |= control(file, "negate", m_negate, _negate, NULL);
@@ -1052,7 +1019,7 @@ src_da1(FILE *file,
if (err == -1)
return 0;
if (sub_reg_num) {
- unsigned elem_size = brw_reg_type_to_size(type);
+ unsigned elem_size = brw_type_size_bytes(type);
format(file, ".%d", sub_reg_num / elem_size); /* use formal style like spec */
}
src_align1_region(file, _vert_stride, _width, _horiz_stride);
@@ -1073,7 +1040,7 @@ src_ia1(FILE *file,
{
int err = 0;
- if (devinfo->ver >= 8 && is_logic_instruction(opcode))
+ if (is_logic_instruction(opcode))
err |= control(file, "bitnot", m_bitnot, _negate, NULL);
else
err |= control(file, "negate", m_negate, _negate, NULL);
@@ -1128,7 +1095,7 @@ src_da16(FILE *file,
{
int err = 0;
- if (devinfo->ver >= 8 && is_logic_instruction(opcode))
+ if (is_logic_instruction(opcode))
err |= control(file, "bitnot", m_bitnot, _negate, NULL);
else
err |= control(file, "negate", m_negate, _negate, NULL);
@@ -1139,7 +1106,7 @@ src_da16(FILE *file,
if (err == -1)
return 0;
if (_subreg_nr) {
- unsigned elem_size = brw_reg_type_to_size(type);
+ unsigned elem_size = brw_type_size_bytes(type);
/* bit4 for subreg number byte addressing. Make this same meaning as
in da1 case, so output looks consistent. */
@@ -1212,6 +1179,7 @@ implied_width(enum brw_vertical_stride _vert_stride,
/* "2. Width is equal to vertical stride when Horizontal Stride is zero." */
} else if (_horiz_stride == BRW_HORIZONTAL_STRIDE_0) {
switch (_vert_stride) {
+ case BRW_VERTICAL_STRIDE_1: return BRW_WIDTH_1;
case BRW_VERTICAL_STRIDE_2: return BRW_WIDTH_2;
case BRW_VERTICAL_STRIDE_4: return BRW_WIDTH_4;
case BRW_VERTICAL_STRIDE_8: return BRW_WIDTH_8;
@@ -1261,19 +1229,16 @@ src0_3src(FILE *file, const struct intel_device_info *devinfo,
} else if (brw_inst_3src_a1_src0_reg_file(devinfo, inst) ==
BRW_ALIGN1_3SRC_GENERAL_REGISTER_FILE) {
_file = BRW_GENERAL_REGISTER_FILE;
- } else if (brw_inst_3src_a1_src0_type(devinfo, inst) ==
- BRW_REGISTER_TYPE_NF) {
- _file = BRW_ARCHITECTURE_REGISTER_FILE;
} else {
_file = BRW_IMMEDIATE_VALUE;
uint16_t imm_val = brw_inst_3src_a1_src0_imm(devinfo, inst);
enum brw_reg_type type = brw_inst_3src_a1_src0_type(devinfo, inst);
- if (type == BRW_REGISTER_TYPE_W) {
+ if (type == BRW_TYPE_W) {
format(file, "%dW", imm_val);
- } else if (type == BRW_REGISTER_TYPE_UW) {
+ } else if (type == BRW_TYPE_UW) {
format(file, "0x%04xUW", imm_val);
- } else if (type == BRW_REGISTER_TYPE_HF) {
+ } else if (type == BRW_TYPE_HF) {
format(file, "0x%04xHF", imm_val);
}
return 0;
@@ -1307,7 +1272,7 @@ src0_3src(FILE *file, const struct intel_device_info *devinfo,
_width == BRW_WIDTH_1 &&
_horiz_stride == BRW_HORIZONTAL_STRIDE_0;
- subreg_nr /= brw_reg_type_to_size(type);
+ subreg_nr /= brw_type_size_bytes(type);
err |= control(file, "negate", m_negate,
brw_inst_3src_src0_negate(devinfo, inst), NULL);
@@ -1381,7 +1346,7 @@ src1_3src(FILE *file, const struct intel_device_info *devinfo,
_width == BRW_WIDTH_1 &&
_horiz_stride == BRW_HORIZONTAL_STRIDE_0;
- subreg_nr /= brw_reg_type_to_size(type);
+ subreg_nr /= brw_type_size_bytes(type);
err |= control(file, "negate", m_negate,
brw_inst_3src_src1_negate(devinfo, inst), NULL);
@@ -1427,11 +1392,11 @@ src2_3src(FILE *file, const struct intel_device_info *devinfo,
uint16_t imm_val = brw_inst_3src_a1_src2_imm(devinfo, inst);
enum brw_reg_type type = brw_inst_3src_a1_src2_type(devinfo, inst);
- if (type == BRW_REGISTER_TYPE_W) {
+ if (type == BRW_TYPE_W) {
format(file, "%dW", imm_val);
- } else if (type == BRW_REGISTER_TYPE_UW) {
+ } else if (type == BRW_TYPE_UW) {
format(file, "0x%04xUW", imm_val);
- } else if (type == BRW_REGISTER_TYPE_HF) {
+ } else if (type == BRW_TYPE_HF) {
format(file, "0x%04xHF", imm_val);
}
return 0;
@@ -1469,7 +1434,7 @@ src2_3src(FILE *file, const struct intel_device_info *devinfo,
_width == BRW_WIDTH_1 &&
_horiz_stride == BRW_HORIZONTAL_STRIDE_0;
- subreg_nr /= brw_reg_type_to_size(type);
+ subreg_nr /= brw_type_size_bytes(type);
err |= control(file, "negate", m_negate,
brw_inst_3src_src2_negate(devinfo, inst), NULL);
@@ -1488,32 +1453,106 @@ src2_3src(FILE *file, const struct intel_device_info *devinfo,
}
static int
-imm(FILE *file, const struct intel_device_info *devinfo, enum brw_reg_type type,
+src0_dpas_3src(FILE *file, const struct intel_device_info *devinfo,
+ const brw_inst *inst)
+{
+ uint32_t reg_file = brw_inst_dpas_3src_src0_reg_file(devinfo, inst);
+
+ if (reg(file, reg_file, brw_inst_dpas_3src_src0_reg_nr(devinfo, inst)) == -1)
+ return 0;
+
+ unsigned subreg_nr = brw_inst_dpas_3src_src0_subreg_nr(devinfo, inst);
+ enum brw_reg_type type = brw_inst_dpas_3src_src0_type(devinfo, inst);
+
+ if (subreg_nr)
+ format(file, ".%d", subreg_nr);
+ src_align1_region(file,
+ BRW_VERTICAL_STRIDE_1,
+ BRW_WIDTH_1,
+ BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_0);
+
+ string(file, brw_reg_type_to_letters(type));
+
+ return 0;
+}
+
+static int
+src1_dpas_3src(FILE *file, const struct intel_device_info *devinfo,
+ const brw_inst *inst)
+{
+ uint32_t reg_file = brw_inst_dpas_3src_src1_reg_file(devinfo, inst);
+
+ if (reg(file, reg_file, brw_inst_dpas_3src_src1_reg_nr(devinfo, inst)) == -1)
+ return 0;
+
+ unsigned subreg_nr = brw_inst_dpas_3src_src1_subreg_nr(devinfo, inst);
+ enum brw_reg_type type = brw_inst_dpas_3src_src1_type(devinfo, inst);
+
+ if (subreg_nr)
+ format(file, ".%d", subreg_nr);
+ src_align1_region(file,
+ BRW_VERTICAL_STRIDE_1,
+ BRW_WIDTH_1,
+ BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_0);
+
+ string(file, brw_reg_type_to_letters(type));
+
+ return 0;
+}
+
+static int
+src2_dpas_3src(FILE *file, const struct intel_device_info *devinfo,
+ const brw_inst *inst)
+{
+ uint32_t reg_file = brw_inst_dpas_3src_src2_reg_file(devinfo, inst);
+
+ if (reg(file, reg_file, brw_inst_dpas_3src_src2_reg_nr(devinfo, inst)) == -1)
+ return 0;
+
+ unsigned subreg_nr = brw_inst_dpas_3src_src2_subreg_nr(devinfo, inst);
+ enum brw_reg_type type = brw_inst_dpas_3src_src2_type(devinfo, inst);
+
+ if (subreg_nr)
+ format(file, ".%d", subreg_nr);
+ src_align1_region(file,
+ BRW_VERTICAL_STRIDE_1,
+ BRW_WIDTH_1,
+ BRW_ALIGN1_3SRC_SRC_HORIZONTAL_STRIDE_0);
+
+ string(file, brw_reg_type_to_letters(type));
+
+ return 0;
+}
+
+static int
+imm(FILE *file, const struct brw_isa_info *isa, enum brw_reg_type type,
const brw_inst *inst)
{
+ const struct intel_device_info *devinfo = isa->devinfo;
+
switch (type) {
- case BRW_REGISTER_TYPE_UQ:
+ case BRW_TYPE_UQ:
format(file, "0x%016"PRIx64"UQ", brw_inst_imm_uq(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_Q:
+ case BRW_TYPE_Q:
format(file, "0x%016"PRIx64"Q", brw_inst_imm_uq(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_UD:
+ case BRW_TYPE_UD:
format(file, "0x%08xUD", brw_inst_imm_ud(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_D:
+ case BRW_TYPE_D:
format(file, "%dD", brw_inst_imm_d(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_UW:
+ case BRW_TYPE_UW:
format(file, "0x%04xUW", (uint16_t) brw_inst_imm_ud(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_W:
+ case BRW_TYPE_W:
format(file, "%dW", (int16_t) brw_inst_imm_d(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_UV:
+ case BRW_TYPE_UV:
format(file, "0x%08xUV", brw_inst_imm_ud(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_VF:
+ case BRW_TYPE_VF:
format(file, "0x%"PRIx64"VF", brw_inst_bits(inst, 127, 96));
pad(file, 48);
format(file, "/* [%-gF, %-gF, %-gF, %-gF]VF */",
@@ -1522,34 +1561,32 @@ imm(FILE *file, const struct intel_device_info *devinfo, enum brw_reg_type type,
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 16),
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 24));
break;
- case BRW_REGISTER_TYPE_V:
+ case BRW_TYPE_V:
format(file, "0x%08xV", brw_inst_imm_ud(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_F:
+ case BRW_TYPE_F:
/* The DIM instruction's src0 uses an F type but contains a
* 64-bit immediate
*/
- if (brw_inst_opcode(devinfo, inst) == BRW_OPCODE_DIM) {
- format(file, "0x%"PRIx64"F", brw_inst_bits(inst, 127, 64));
- pad(file, 48);
- format(file, "/* %-gF */", brw_inst_imm_df(devinfo, inst));
- } else {
- format(file, "0x%"PRIx64"F", brw_inst_bits(inst, 127, 96));
- pad(file, 48);
- format(file, " /* %-gF */", brw_inst_imm_f(devinfo, inst));
- }
+ format(file, "0x%"PRIx64"F", brw_inst_bits(inst, 127, 96));
+ pad(file, 48);
+ format(file, " /* %-gF */", brw_inst_imm_f(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_DF:
- format(file, "0x%016"PRIx64"DF", brw_inst_bits(inst, 127, 64));
+ case BRW_TYPE_DF:
+ format(file, "0x%016"PRIx64"DF", brw_inst_imm_uq(devinfo, inst));
pad(file, 48);
format(file, "/* %-gDF */", brw_inst_imm_df(devinfo, inst));
break;
- case BRW_REGISTER_TYPE_HF:
- string(file, "Half Float IMM");
+ case BRW_TYPE_HF:
+ format(file, "0x%04xHF",
+ (uint16_t) brw_inst_imm_ud(devinfo, inst));
+ pad(file, 48);
+ format(file, "/* %-gHF */",
+ _mesa_half_to_float((uint16_t) brw_inst_imm_ud(devinfo, inst)));
break;
- case BRW_REGISTER_TYPE_NF:
- case BRW_REGISTER_TYPE_UB:
- case BRW_REGISTER_TYPE_B:
+ case BRW_TYPE_UB:
+ case BRW_TYPE_B:
+ default:
format(file, "*** invalid immediate type %d ", type);
}
return 0;
@@ -1607,37 +1644,39 @@ src_send_desc_ia(FILE *file,
}
static int
-src0(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
+src0(FILE *file, const struct brw_isa_info *isa, const brw_inst *inst)
{
- if (is_split_send(devinfo, brw_inst_opcode(devinfo, inst))) {
+ const struct intel_device_info *devinfo = isa->devinfo;
+
+ if (is_split_send(devinfo, brw_inst_opcode(isa, inst))) {
if (devinfo->ver >= 12) {
return src_sends_da(file,
devinfo,
- BRW_REGISTER_TYPE_UD,
+ BRW_TYPE_UD,
brw_inst_send_src0_reg_file(devinfo, inst),
brw_inst_src0_da_reg_nr(devinfo, inst),
0);
} else if (brw_inst_send_src0_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
return src_sends_da(file,
devinfo,
- BRW_REGISTER_TYPE_UD,
+ BRW_TYPE_UD,
BRW_GENERAL_REGISTER_FILE,
brw_inst_src0_da_reg_nr(devinfo, inst),
brw_inst_src0_da16_subreg_nr(devinfo, inst));
} else {
return src_sends_ia(file,
devinfo,
- BRW_REGISTER_TYPE_UD,
+ BRW_TYPE_UD,
brw_inst_send_src0_ia16_addr_imm(devinfo, inst),
brw_inst_src0_ia_subreg_nr(devinfo, inst));
}
} else if (brw_inst_src0_reg_file(devinfo, inst) == BRW_IMMEDIATE_VALUE) {
- return imm(file, devinfo, brw_inst_src0_type(devinfo, inst), inst);
+ return imm(file, isa, brw_inst_src0_type(devinfo, inst), inst);
} else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
if (brw_inst_src0_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
return src_da1(file,
devinfo,
- brw_inst_opcode(devinfo, inst),
+ brw_inst_opcode(isa, inst),
brw_inst_src0_type(devinfo, inst),
brw_inst_src0_reg_file(devinfo, inst),
brw_inst_src0_vstride(devinfo, inst),
@@ -1650,7 +1689,7 @@ src0(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
} else {
return src_ia1(file,
devinfo,
- brw_inst_opcode(devinfo, inst),
+ brw_inst_opcode(isa, inst),
brw_inst_src0_type(devinfo, inst),
brw_inst_src0_ia1_addr_imm(devinfo, inst),
brw_inst_src0_ia_subreg_nr(devinfo, inst),
@@ -1664,7 +1703,7 @@ src0(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
if (brw_inst_src0_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
return src_da16(file,
devinfo,
- brw_inst_opcode(devinfo, inst),
+ brw_inst_opcode(isa, inst),
brw_inst_src0_type(devinfo, inst),
brw_inst_src0_reg_file(devinfo, inst),
brw_inst_src0_vstride(devinfo, inst),
@@ -1684,22 +1723,24 @@ src0(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
}
static int
-src1(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
+src1(FILE *file, const struct brw_isa_info *isa, const brw_inst *inst)
{
- if (is_split_send(devinfo, brw_inst_opcode(devinfo, inst))) {
+ const struct intel_device_info *devinfo = isa->devinfo;
+
+ if (is_split_send(devinfo, brw_inst_opcode(isa, inst))) {
return src_sends_da(file,
devinfo,
- BRW_REGISTER_TYPE_UD,
+ BRW_TYPE_UD,
brw_inst_send_src1_reg_file(devinfo, inst),
brw_inst_send_src1_reg_nr(devinfo, inst),
0 /* subreg_nr */);
} else if (brw_inst_src1_reg_file(devinfo, inst) == BRW_IMMEDIATE_VALUE) {
- return imm(file, devinfo, brw_inst_src1_type(devinfo, inst), inst);
+ return imm(file, isa, brw_inst_src1_type(devinfo, inst), inst);
} else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
if (brw_inst_src1_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
return src_da1(file,
devinfo,
- brw_inst_opcode(devinfo, inst),
+ brw_inst_opcode(isa, inst),
brw_inst_src1_type(devinfo, inst),
brw_inst_src1_reg_file(devinfo, inst),
brw_inst_src1_vstride(devinfo, inst),
@@ -1712,7 +1753,7 @@ src1(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
} else {
return src_ia1(file,
devinfo,
- brw_inst_opcode(devinfo, inst),
+ brw_inst_opcode(isa, inst),
brw_inst_src1_type(devinfo, inst),
brw_inst_src1_ia1_addr_imm(devinfo, inst),
brw_inst_src1_ia_subreg_nr(devinfo, inst),
@@ -1726,7 +1767,7 @@ src1(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
if (brw_inst_src1_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
return src_da16(file,
devinfo,
- brw_inst_opcode(devinfo, inst),
+ brw_inst_opcode(isa, inst),
brw_inst_src1_type(devinfo, inst),
brw_inst_src1_reg_file(devinfo, inst),
brw_inst_src1_vstride(devinfo, inst),
@@ -1751,7 +1792,7 @@ qtr_ctrl(FILE *file, const struct intel_device_info *devinfo,
{
int qtr_ctl = brw_inst_qtr_control(devinfo, inst);
int exec_size = 1 << brw_inst_exec_size(devinfo, inst);
- const unsigned nib_ctl = devinfo->ver < 7 ? 0 :
+ const unsigned nib_ctl = devinfo->ver >= 20 ? 0 :
brw_inst_nib_control(devinfo, inst);
if (exec_size < 8 || nib_ctl) {
@@ -1780,18 +1821,51 @@ qtr_ctrl(FILE *file, const struct intel_device_info *devinfo,
return 0;
}
+static bool
+inst_has_type(const struct brw_isa_info *isa,
+ const brw_inst *inst,
+ enum brw_reg_type type)
+{
+ const struct intel_device_info *devinfo = isa->devinfo;
+ const unsigned num_sources = brw_num_sources_from_inst(isa, inst);
+
+ if (brw_inst_dst_type(devinfo, inst) == type)
+ return true;
+
+ if (num_sources >= 3) {
+ if (brw_inst_3src_access_mode(devinfo, inst) == BRW_ALIGN_1)
+ return brw_inst_3src_a1_src0_type(devinfo, inst) == type ||
+ brw_inst_3src_a1_src1_type(devinfo, inst) == type ||
+ brw_inst_3src_a1_src2_type(devinfo, inst) == type;
+ else
+ return brw_inst_3src_a16_src_type(devinfo, inst) == type;
+ } else if (num_sources == 2) {
+ return brw_inst_src0_type(devinfo, inst) == type ||
+ brw_inst_src1_type(devinfo, inst) == type;
+ } else {
+ return brw_inst_src0_type(devinfo, inst) == type;
+ }
+}
+
static int
-swsb(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
+swsb(FILE *file, const struct brw_isa_info *isa, const brw_inst *inst)
{
- const enum opcode opcode = brw_inst_opcode(devinfo, inst);
- const uint8_t x = brw_inst_swsb(devinfo, inst);
- const struct tgl_swsb swsb = tgl_swsb_decode(devinfo, opcode, x);
+ const struct intel_device_info *devinfo = isa->devinfo;
+ const enum opcode opcode = brw_inst_opcode(isa, inst);
+ const uint32_t x = brw_inst_swsb(devinfo, inst);
+ const bool is_unordered =
+ opcode == BRW_OPCODE_SEND || opcode == BRW_OPCODE_SENDC ||
+ opcode == BRW_OPCODE_MATH || opcode == BRW_OPCODE_DPAS ||
+ (devinfo->has_64bit_float_via_math_pipe &&
+ inst_has_type(isa, inst, BRW_TYPE_DF));
+ const struct tgl_swsb swsb = tgl_swsb_decode(devinfo, is_unordered, x);
if (swsb.regdist)
format(file, " %s@%d",
(swsb.pipe == TGL_PIPE_FLOAT ? "F" :
swsb.pipe == TGL_PIPE_INT ? "I" :
swsb.pipe == TGL_PIPE_LONG ? "L" :
- swsb.pipe == TGL_PIPE_ALL ? "A" : "" ),
+ swsb.pipe == TGL_PIPE_ALL ? "A" :
+ swsb.pipe == TGL_PIPE_MATH ? "M" : "" ),
swsb.regdist);
if (swsb.mode)
format(file, " $%d%s", swsb.sbid,
@@ -1800,15 +1874,15 @@ swsb(FILE *file, const struct intel_device_info *devinfo, const brw_inst *inst)
return 0;
}
-#ifdef DEBUG
+#if MESA_DEBUG
static __attribute__((__unused__)) int
-brw_disassemble_imm(const struct intel_device_info *devinfo,
+brw_disassemble_imm(const struct brw_isa_info *isa,
uint32_t dw3, uint32_t dw2, uint32_t dw1, uint32_t dw0)
{
brw_inst inst;
inst.data[0] = (((uint64_t) dw1) << 32) | ((uint64_t) dw0);
inst.data[1] = (((uint64_t) dw3) << 32) | ((uint64_t) dw2);
- return brw_disassemble_inst(stderr, devinfo, &inst, false, 0, NULL);
+ return brw_disassemble_inst(stderr, isa, &inst, false, 0, NULL);
}
#endif
@@ -1836,18 +1910,18 @@ lsc_disassemble_ex_desc(const struct intel_device_info *devinfo,
const unsigned addr_type = lsc_msg_desc_addr_type(devinfo, imm_desc);
switch (addr_type) {
case LSC_ADDR_SURFTYPE_FLAT:
- format(file, "base_offset %u ",
+ format(file, " base_offset %u ",
lsc_flat_ex_desc_base_offset(devinfo, imm_ex_desc));
break;
case LSC_ADDR_SURFTYPE_BSS:
case LSC_ADDR_SURFTYPE_SS:
- format(file, "surface_state_index %u ",
+ format(file, " surface_state_index %u ",
lsc_bss_ex_desc_index(devinfo, imm_ex_desc));
break;
case LSC_ADDR_SURFTYPE_BTI:
- format(file, "BTI %u ",
+ format(file, " BTI %u ",
lsc_bti_ex_desc_index(devinfo, imm_ex_desc));
- format(file, "base_offset %u ",
+ format(file, " base_offset %u ",
lsc_bti_ex_desc_base_offset(devinfo, imm_ex_desc));
break;
default:
@@ -1872,24 +1946,29 @@ brw_sfid_is_lsc(unsigned sfid)
}
int
-brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
+brw_disassemble_inst(FILE *file, const struct brw_isa_info *isa,
const brw_inst *inst, bool is_compacted,
int offset, const struct brw_label *root_label)
{
+ const struct intel_device_info *devinfo = isa->devinfo;
+
int err = 0;
int space = 0;
- const enum opcode opcode = brw_inst_opcode(devinfo, inst);
- const struct opcode_desc *desc = brw_opcode_desc(devinfo, opcode);
+ const enum opcode opcode = brw_inst_opcode(isa, inst);
+ const struct opcode_desc *desc = brw_opcode_desc(isa, opcode);
if (brw_inst_pred_control(devinfo, inst)) {
string(file, "(");
err |= control(file, "predicate inverse", pred_inv,
brw_inst_pred_inv(devinfo, inst), NULL);
format(file, "f%"PRIu64".%"PRIu64,
- devinfo->ver >= 7 ? brw_inst_flag_reg_nr(devinfo, inst) : 0,
+ brw_inst_flag_reg_nr(devinfo, inst),
brw_inst_flag_subreg_nr(devinfo, inst));
- if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
+ if (devinfo->ver >= 20) {
+ err |= control(file, "predicate control", xe2_pred_ctrl,
+ brw_inst_pred_control(devinfo, inst), NULL);
+ } else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
err |= control(file, "predicate control align1", pred_ctrl_align1,
brw_inst_pred_control(devinfo, inst), NULL);
} else {
@@ -1899,7 +1978,7 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
string(file, ") ");
}
- err |= print_opcode(file, devinfo, opcode);
+ err |= print_opcode(file, isa, opcode);
if (!is_send(opcode))
err |= control(file, "saturate", saturate, brw_inst_saturate(devinfo, inst),
@@ -1918,7 +1997,19 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
err |= control(file, "function", sync_function,
brw_inst_cond_modifier(devinfo, inst), NULL);
- } else if (!is_send(opcode)) {
+ } else if (opcode == BRW_OPCODE_DPAS) {
+ string(file, ".");
+
+ err |= control(file, "systolic depth", dpas_systolic_depth,
+ brw_inst_dpas_3src_sdepth(devinfo, inst), NULL);
+
+ const unsigned rcount = brw_inst_dpas_3src_rcount(devinfo, inst) + 1;
+
+ format(file, "x%d", rcount);
+ } else if (!is_send(opcode) &&
+ (devinfo->ver < 12 ||
+ brw_inst_src0_reg_file(devinfo, inst) != BRW_IMMEDIATE_VALUE ||
+ brw_type_size_bytes(brw_inst_src0_type(devinfo, inst)) < 8)) {
err |= control(file, "conditional modifier", conditional_modifier,
brw_inst_cond_modifier(devinfo, inst), NULL);
@@ -1927,26 +2018,23 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
* control flow doesn't update flags.
*/
if (brw_inst_cond_modifier(devinfo, inst) &&
- (devinfo->ver < 6 || (opcode != BRW_OPCODE_SEL &&
- opcode != BRW_OPCODE_CSEL &&
- opcode != BRW_OPCODE_IF &&
- opcode != BRW_OPCODE_WHILE))) {
+ (opcode != BRW_OPCODE_SEL &&
+ opcode != BRW_OPCODE_CSEL &&
+ opcode != BRW_OPCODE_IF &&
+ opcode != BRW_OPCODE_WHILE)) {
format(file, ".f%"PRIu64".%"PRIu64,
- devinfo->ver >= 7 ? brw_inst_flag_reg_nr(devinfo, inst) : 0,
+ brw_inst_flag_reg_nr(devinfo, inst),
brw_inst_flag_subreg_nr(devinfo, inst));
}
}
- if (opcode != BRW_OPCODE_NOP && opcode != BRW_OPCODE_NENOP) {
+ if (opcode != BRW_OPCODE_NOP) {
string(file, "(");
err |= control(file, "execution size", exec_size,
brw_inst_exec_size(devinfo, inst), NULL);
string(file, ")");
}
- if (opcode == BRW_OPCODE_SEND && devinfo->ver < 6)
- format(file, " %"PRIu64, brw_inst_base_mrf(devinfo, inst));
-
if (brw_has_uip(devinfo, opcode)) {
/* Instructions that have UIP also have JIP. */
pad(file, 16);
@@ -1957,35 +2045,27 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
string(file, "UIP: ");
write_label(file, devinfo, root_label, offset, brw_inst_uip(devinfo, inst));
} else if (brw_has_jip(devinfo, opcode)) {
- int jip;
- if (devinfo->ver >= 7) {
- jip = brw_inst_jip(devinfo, inst);
- } else {
- jip = brw_inst_gfx6_jump_count(devinfo, inst);
- }
+ int jip = brw_inst_jip(devinfo, inst);
pad(file, 16);
string(file, "JIP: ");
write_label(file, devinfo, root_label, offset, jip);
- } else if (devinfo->ver < 6 && (opcode == BRW_OPCODE_BREAK ||
- opcode == BRW_OPCODE_CONTINUE ||
- opcode == BRW_OPCODE_ELSE)) {
- pad(file, 16);
- format(file, "Jump: %d", brw_inst_gfx4_jump_count(devinfo, inst));
- pad(file, 32);
- format(file, "Pop: %"PRIu64, brw_inst_gfx4_pop_count(devinfo, inst));
- } else if (devinfo->ver < 6 && (opcode == BRW_OPCODE_IF ||
- opcode == BRW_OPCODE_IFF ||
- opcode == BRW_OPCODE_HALT ||
- opcode == BRW_OPCODE_WHILE)) {
- pad(file, 16);
- format(file, "Jump: %d", brw_inst_gfx4_jump_count(devinfo, inst));
- } else if (devinfo->ver < 6 && opcode == BRW_OPCODE_ENDIF) {
- pad(file, 16);
- format(file, "Pop: %"PRIu64, brw_inst_gfx4_pop_count(devinfo, inst));
} else if (opcode == BRW_OPCODE_JMPI) {
pad(file, 16);
- err |= src1(file, devinfo, inst);
+ err |= src1(file, isa, inst);
+ } else if (opcode == BRW_OPCODE_DPAS) {
+ pad(file, 16);
+ err |= dest_dpas_3src(file, devinfo, inst);
+
+ pad(file, 32);
+ err |= src0_dpas_3src(file, devinfo, inst);
+
+ pad(file, 48);
+ err |= src1_dpas_3src(file, devinfo, inst);
+
+ pad(file, 64);
+ err |= src2_dpas_3src(file, devinfo, inst);
+
} else if (desc && desc->nsrc == 3) {
pad(file, 16);
err |= dest_3src(file, devinfo, inst);
@@ -2001,17 +2081,17 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
} else if (desc) {
if (desc->ndst > 0) {
pad(file, 16);
- err |= dest(file, devinfo, inst);
+ err |= dest(file, isa, inst);
}
if (desc->nsrc > 0) {
pad(file, 32);
- err |= src0(file, devinfo, inst);
+ err |= src0(file, isa, inst);
}
if (desc->nsrc > 1) {
pad(file, 48);
- err |= src1(file, devinfo, inst);
+ err |= src1(file, isa, inst);
}
}
@@ -2045,7 +2125,7 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
if (brw_inst_src1_reg_file(devinfo, inst) != BRW_IMMEDIATE_VALUE) {
/* show the indirect descriptor source */
pad(file, 48);
- err |= src1(file, devinfo, inst);
+ err |= src1(file, isa, inst);
pad(file, 64);
} else {
has_imm_desc = true;
@@ -2062,8 +2142,7 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
space = 0;
fprintf(file, " ");
- err |= control(file, "SFID", devinfo->ver >= 6 ? gfx6_sfid : gfx4_sfid,
- sfid, &space);
+ err |= control(file, "SFID", gfx6_sfid, sfid, &space);
string(file, " MsgDesc:");
if (!has_imm_desc) {
@@ -2071,96 +2150,69 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
} else {
bool unsupported = false;
switch (sfid) {
- case BRW_SFID_MATH:
- err |= control(file, "math function", math_function,
- brw_inst_math_msg_function(devinfo, inst), &space);
- err |= control(file, "math saturate", math_saturate,
- brw_inst_math_msg_saturate(devinfo, inst), &space);
- err |= control(file, "math signed", math_signed,
- brw_inst_math_msg_signed_int(devinfo, inst), &space);
- err |= control(file, "math scalar", math_scalar,
- brw_inst_math_msg_data_type(devinfo, inst), &space);
- err |= control(file, "math precision", math_precision,
- brw_inst_math_msg_precision(devinfo, inst), &space);
- break;
case BRW_SFID_SAMPLER:
- if (devinfo->ver >= 5) {
- err |= control(file, "sampler message", gfx5_sampler_msg_type,
+ if (devinfo->ver >= 20) {
+ err |= control(file, "sampler message", xe2_sampler_msg_type,
brw_sampler_desc_msg_type(devinfo, imm_desc),
&space);
- err |= control(file, "sampler simd mode", gfx5_sampler_simd_mode,
+ err |= control(file, "sampler simd mode", xe2_sampler_simd_mode,
brw_sampler_desc_simd_mode(devinfo, imm_desc),
&space);
+ if (brw_sampler_desc_return_format(devinfo, imm_desc)) {
+ string(file, " HP");
+ }
format(file, " Surface = %u Sampler = %u",
brw_sampler_desc_binding_table_index(devinfo, imm_desc),
brw_sampler_desc_sampler(devinfo, imm_desc));
} else {
- format(file, " (bti %u, sampler %u, msg_type %u, ",
- brw_sampler_desc_binding_table_index(devinfo, imm_desc),
- brw_sampler_desc_sampler(devinfo, imm_desc),
- brw_sampler_desc_msg_type(devinfo, imm_desc));
- if (!devinfo->is_g4x) {
- err |= control(file, "sampler target format",
- sampler_target_format,
- brw_sampler_desc_return_format(devinfo, imm_desc),
- NULL);
+ err |= control(file, "sampler message", gfx5_sampler_msg_type,
+ brw_sampler_desc_msg_type(devinfo, imm_desc),
+ &space);
+ err |= control(file, "sampler simd mode",
+ devinfo->ver >= 20 ? xe2_sampler_simd_mode :
+ gfx5_sampler_simd_mode,
+ brw_sampler_desc_simd_mode(devinfo, imm_desc),
+ &space);
+ if (brw_sampler_desc_return_format(devinfo, imm_desc)) {
+ string(file, " HP");
}
- string(file, ")");
+ format(file, " Surface = %u Sampler = %u",
+ brw_sampler_desc_binding_table_index(devinfo, imm_desc),
+ brw_sampler_desc_sampler(devinfo, imm_desc));
}
break;
case GFX6_SFID_DATAPORT_SAMPLER_CACHE:
case GFX6_SFID_DATAPORT_CONSTANT_CACHE:
- /* aka BRW_SFID_DATAPORT_READ on Gfx4-5 */
- if (devinfo->ver >= 6) {
- format(file, " (bti %u, msg_ctrl %u, msg_type %u, write_commit %u)",
- brw_dp_desc_binding_table_index(devinfo, imm_desc),
- brw_dp_desc_msg_control(devinfo, imm_desc),
- brw_dp_desc_msg_type(devinfo, imm_desc),
- devinfo->ver >= 7 ? 0u :
- brw_dp_write_desc_write_commit(devinfo, imm_desc));
- } else {
- bool is_965 = devinfo->ver == 4 && !devinfo->is_g4x;
- err |= control(file, "DP read message type",
- is_965 ? gfx4_dp_read_port_msg_type :
- g45_dp_read_port_msg_type,
- brw_dp_read_desc_msg_type(devinfo, imm_desc),
- &space);
-
- format(file, " MsgCtrl = 0x%u",
- brw_dp_read_desc_msg_control(devinfo, imm_desc));
-
- format(file, " Surface = %u",
- brw_dp_desc_binding_table_index(devinfo, imm_desc));
- }
+ format(file, " (bti %u, msg_ctrl %u, msg_type %u)",
+ brw_dp_desc_binding_table_index(devinfo, imm_desc),
+ brw_dp_desc_msg_control(devinfo, imm_desc),
+ brw_dp_desc_msg_type(devinfo, imm_desc));
break;
case GFX6_SFID_DATAPORT_RENDER_CACHE: {
/* aka BRW_SFID_DATAPORT_WRITE on Gfx4-5 */
- unsigned msg_type = brw_fb_write_desc_msg_type(devinfo, imm_desc);
+ unsigned msg_type = brw_fb_desc_msg_type(devinfo, imm_desc);
err |= control(file, "DP rc message type",
dp_rc_msg_type(devinfo), msg_type, &space);
bool is_rt_write = msg_type ==
- (devinfo->ver >= 6 ? GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE
- : BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE);
+ GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
if (is_rt_write) {
- err |= control(file, "RT message type", m_rt_write_subtype,
+ err |= control(file, "RT message type",
+ devinfo->ver >= 20 ? m_rt_write_subtype_xe2 : m_rt_write_subtype,
brw_inst_rt_message_type(devinfo, inst), &space);
- if (devinfo->ver >= 6 && brw_inst_rt_slot_group(devinfo, inst))
+ if (brw_inst_rt_slot_group(devinfo, inst))
string(file, " Hi");
if (brw_fb_write_desc_last_render_target(devinfo, imm_desc))
string(file, " LastRT");
if (devinfo->ver >= 10 &&
brw_fb_write_desc_coarse_write(devinfo, imm_desc))
string(file, " CoarseWrite");
- if (devinfo->ver < 7 &&
- brw_fb_write_desc_write_commit(devinfo, imm_desc))
- string(file, " WriteCommit");
} else {
format(file, " MsgCtrl = 0x%u",
- brw_fb_write_desc_msg_control(devinfo, imm_desc));
+ brw_fb_desc_msg_control(devinfo, imm_desc));
}
format(file, " Surface = %u",
@@ -2169,41 +2221,84 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
}
case BRW_SFID_URB: {
- unsigned opcode = brw_inst_urb_opcode(devinfo, inst);
+ if (devinfo->ver >= 20) {
+ format(file, " (");
+ const enum lsc_opcode op = lsc_msg_desc_opcode(devinfo, imm_desc);
+ err |= control(file, "operation", lsc_operation,
+ op, &space);
+ format(file, ",");
+ err |= control(file, "addr_size", lsc_addr_size,
+ lsc_msg_desc_addr_size(devinfo, imm_desc),
+ &space);
+
+ format(file, ",");
+ err |= control(file, "data_size", lsc_data_size,
+ lsc_msg_desc_data_size(devinfo, imm_desc),
+ &space);
+ format(file, ",");
+ if (lsc_opcode_has_cmask(op)) {
+ err |= control(file, "component_mask",
+ lsc_cmask_str,
+ lsc_msg_desc_cmask(devinfo, imm_desc),
+ &space);
+ } else {
+ err |= control(file, "vector_size",
+ lsc_vect_size_str,
+ lsc_msg_desc_vect_size(devinfo, imm_desc),
+ &space);
+ if (lsc_msg_desc_transpose(devinfo, imm_desc))
+ format(file, ", transpose");
+ }
+ switch(op) {
+ case LSC_OP_LOAD_CMASK:
+ case LSC_OP_LOAD:
+ format(file, ",");
+ err |= control(file, "cache_load",
+ lsc_cache_load,
+ lsc_msg_desc_cache_ctrl(devinfo, imm_desc),
+ &space);
+ break;
+ default:
+ format(file, ",");
+ err |= control(file, "cache_store",
+ lsc_cache_store,
+ lsc_msg_desc_cache_ctrl(devinfo, imm_desc),
+ &space);
+ break;
+ }
- format(file, " offset %"PRIu64, brw_inst_urb_global_offset(devinfo, inst));
+ format(file, " dst_len = %u,",
+ brw_message_desc_rlen(devinfo, imm_desc) / reg_unit(devinfo));
+ format(file, " src0_len = %u,",
+ brw_message_desc_mlen(devinfo, imm_desc) / reg_unit(devinfo));
+ format(file, " src1_len = %d",
+ brw_message_ex_desc_ex_mlen(devinfo, imm_ex_desc) / reg_unit(devinfo));
+ err |= control(file, "address_type", lsc_addr_surface_type,
+ lsc_msg_desc_addr_type(devinfo, imm_desc), &space);
+ format(file, " )");
+ } else {
+ unsigned urb_opcode = brw_inst_urb_opcode(devinfo, inst);
- space = 1;
+ format(file, " offset %"PRIu64, brw_inst_urb_global_offset(devinfo, inst));
- err |= control(file, "urb opcode",
- devinfo->ver >= 7 ? gfx7_urb_opcode
- : gfx5_urb_opcode,
- opcode, &space);
+ space = 1;
- if (devinfo->ver >= 7 &&
- brw_inst_urb_per_slot_offset(devinfo, inst)) {
- string(file, " per-slot");
- }
+ err |= control(file, "urb opcode",
+ gfx7_urb_opcode, urb_opcode, &space);
- if (opcode == GFX8_URB_OPCODE_SIMD8_WRITE ||
- opcode == GFX8_URB_OPCODE_SIMD8_READ) {
- if (brw_inst_urb_channel_mask_present(devinfo, inst))
- string(file, " masked");
- } else {
- err |= control(file, "urb swizzle", urb_swizzle,
- brw_inst_urb_swizzle_control(devinfo, inst),
- &space);
- }
+ if (brw_inst_urb_per_slot_offset(devinfo, inst)) {
+ string(file, " per-slot");
+ }
- if (devinfo->ver < 7) {
- err |= control(file, "urb allocate", urb_allocate,
- brw_inst_urb_allocate(devinfo, inst), &space);
- err |= control(file, "urb used", urb_used,
- brw_inst_urb_used(devinfo, inst), &space);
- }
- if (devinfo->ver < 8) {
- err |= control(file, "urb complete", urb_complete,
- brw_inst_urb_complete(devinfo, inst), &space);
+ if (urb_opcode == GFX8_URB_OPCODE_SIMD8_WRITE ||
+ urb_opcode == GFX8_URB_OPCODE_SIMD8_READ) {
+ if (brw_inst_urb_channel_mask_present(devinfo, inst))
+ string(file, " masked");
+ } else if (urb_opcode != GFX125_URB_OPCODE_FENCE) {
+ err |= control(file, "urb swizzle", urb_swizzle,
+ brw_inst_urb_swizzle_control(devinfo, inst),
+ &space);
+ }
}
break;
}
@@ -2266,6 +2361,8 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
case LSC_OP_LOAD:
format(file, ",");
err |= control(file, "cache_load",
+ devinfo->ver >= 20 ?
+ xe2_lsc_cache_load :
lsc_cache_load,
lsc_msg_desc_cache_ctrl(devinfo, imm_desc),
&space);
@@ -2273,15 +2370,23 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
default:
format(file, ",");
err |= control(file, "cache_store",
+ devinfo->ver >= 20 ?
+ xe2_lsc_cache_store :
lsc_cache_store,
lsc_msg_desc_cache_ctrl(devinfo, imm_desc),
&space);
break;
}
}
- format(file, " dst_len = %u,", lsc_msg_desc_dest_len(devinfo, imm_desc));
- format(file, " src0_len = %u,", lsc_msg_desc_src0_len(devinfo, imm_desc));
- format(file, " src1_len = %d", brw_message_ex_desc_ex_mlen(devinfo, imm_ex_desc));
+ format(file, " dst_len = %u,",
+ brw_message_desc_rlen(devinfo, imm_desc) / reg_unit(devinfo));
+ format(file, " src0_len = %u,",
+ brw_message_desc_mlen(devinfo, imm_desc) / reg_unit(devinfo));
+
+ if (!brw_inst_send_sel_reg32_ex_desc(devinfo, inst))
+ format(file, " src1_len = %d",
+ brw_message_ex_desc_ex_mlen(devinfo, imm_ex_desc) / reg_unit(devinfo));
+
err |= control(file, "address_type", lsc_addr_surface_type,
lsc_msg_desc_addr_type(devinfo, imm_desc), &space);
format(file, " )");
@@ -2289,111 +2394,99 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
}
case GFX7_SFID_DATAPORT_DATA_CACHE:
- if (devinfo->ver >= 7) {
- format(file, " (");
- space = 0;
-
- err |= control(file, "DP DC0 message type",
- dp_dc0_msg_type_gfx7,
- brw_dp_desc_msg_type(devinfo, imm_desc), &space);
-
- format(file, ", bti %u, ",
- brw_dp_desc_binding_table_index(devinfo, imm_desc));
-
- switch (brw_inst_dp_msg_type(devinfo, inst)) {
- case GFX7_DATAPORT_DC_UNTYPED_ATOMIC_OP:
- control(file, "atomic op", aop,
- brw_dp_desc_msg_control(devinfo, imm_desc) & 0xf,
- &space);
- break;
- case GFX7_DATAPORT_DC_OWORD_BLOCK_READ:
- case GFX7_DATAPORT_DC_OWORD_BLOCK_WRITE: {
- unsigned msg_ctrl = brw_dp_desc_msg_control(devinfo, imm_desc);
- assert(dp_oword_block_rw[msg_ctrl & 7]);
- format(file, "owords = %s, aligned = %d",
- dp_oword_block_rw[msg_ctrl & 7], (msg_ctrl >> 3) & 3);
- break;
- }
- default:
- format(file, "%u",
- brw_dp_desc_msg_control(devinfo, imm_desc));
- }
- format(file, ")");
- } else {
- unsupported = true;
+ format(file, " (");
+ space = 0;
+
+ err |= control(file, "DP DC0 message type",
+ dp_dc0_msg_type_gfx7,
+ brw_dp_desc_msg_type(devinfo, imm_desc), &space);
+
+ format(file, ", bti %u, ",
+ brw_dp_desc_binding_table_index(devinfo, imm_desc));
+
+ switch (brw_inst_dp_msg_type(devinfo, inst)) {
+ case GFX7_DATAPORT_DC_UNTYPED_ATOMIC_OP:
+ control(file, "atomic op", aop,
+ brw_dp_desc_msg_control(devinfo, imm_desc) & 0xf,
+ &space);
+ break;
+ case GFX7_DATAPORT_DC_OWORD_BLOCK_READ:
+ case GFX7_DATAPORT_DC_OWORD_BLOCK_WRITE: {
+ unsigned msg_ctrl = brw_dp_desc_msg_control(devinfo, imm_desc);
+ assert(dp_oword_block_rw[msg_ctrl & 7]);
+ format(file, "owords = %s, aligned = %d",
+ dp_oword_block_rw[msg_ctrl & 7], (msg_ctrl >> 3) & 3);
+ break;
+ }
+ default:
+ format(file, "%u",
+ brw_dp_desc_msg_control(devinfo, imm_desc));
}
+ format(file, ")");
break;
case HSW_SFID_DATAPORT_DATA_CACHE_1: {
- if (devinfo->ver >= 7) {
- format(file, " (");
- space = 0;
-
- unsigned msg_ctrl = brw_dp_desc_msg_control(devinfo, imm_desc);
-
- err |= control(file, "DP DC1 message type",
- dp_dc1_msg_type_hsw,
- brw_dp_desc_msg_type(devinfo, imm_desc), &space);
-
- format(file, ", Surface = %u, ",
- brw_dp_desc_binding_table_index(devinfo, imm_desc));
-
- switch (brw_inst_dp_msg_type(devinfo, inst)) {
- case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP:
- case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP:
- case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP:
- format(file, "SIMD%d,", (msg_ctrl & (1 << 4)) ? 8 : 16);
- FALLTHROUGH;
- case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2:
- case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2:
- case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP_SIMD4X2:
- case GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_OP:
- case GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_INT_OP:
- control(file, "atomic op", aop, msg_ctrl & 0xf, &space);
- break;
- case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ:
- case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE:
- case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ:
- case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE:
- case GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_WRITE:
- case GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_READ: {
- static const char *simd_modes[] = { "4x2", "16", "8" };
- format(file, "SIMD%s, Mask = 0x%x",
- simd_modes[msg_ctrl >> 4], msg_ctrl & 0xf);
- break;
- }
- case GFX9_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_FLOAT_OP:
- case GFX9_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_FLOAT_OP:
- case GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_FLOAT_OP:
- format(file, "SIMD%d,", (msg_ctrl & (1 << 4)) ? 8 : 16);
- control(file, "atomic float op", aop_float, msg_ctrl & 0xf,
- &space);
- break;
- case GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_WRITE:
- case GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_READ:
- assert(dp_oword_block_rw[msg_ctrl & 7]);
- format(file, "owords = %s, aligned = %d",
- dp_oword_block_rw[msg_ctrl & 7], (msg_ctrl >> 3) & 3);
- break;
- default:
- format(file, "0x%x", msg_ctrl);
- }
- format(file, ")");
- } else {
- unsupported = true;
+ format(file, " (");
+ space = 0;
+
+ unsigned msg_ctrl = brw_dp_desc_msg_control(devinfo, imm_desc);
+
+ err |= control(file, "DP DC1 message type",
+ dp_dc1_msg_type_hsw,
+ brw_dp_desc_msg_type(devinfo, imm_desc), &space);
+
+ format(file, ", Surface = %u, ",
+ brw_dp_desc_binding_table_index(devinfo, imm_desc));
+
+ switch (brw_inst_dp_msg_type(devinfo, inst)) {
+ case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP:
+ case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP:
+ case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP:
+ format(file, "SIMD%d,", (msg_ctrl & (1 << 4)) ? 8 : 16);
+ FALLTHROUGH;
+ case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2:
+ case HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2:
+ case HSW_DATAPORT_DC_PORT1_ATOMIC_COUNTER_OP_SIMD4X2:
+ case GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_OP:
+ case GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_INT_OP:
+ control(file, "atomic op", aop, msg_ctrl & 0xf, &space);
+ break;
+ case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ:
+ case HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE:
+ case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ:
+ case HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE:
+ case GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_WRITE:
+ case GFX8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_READ: {
+ static const char *simd_modes[] = { "4x2", "16", "8" };
+ format(file, "SIMD%s, Mask = 0x%x",
+ simd_modes[msg_ctrl >> 4], msg_ctrl & 0xf);
+ break;
+ }
+ case GFX9_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_FLOAT_OP:
+ case GFX9_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_FLOAT_OP:
+ case GFX12_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_HALF_FLOAT_OP:
+ format(file, "SIMD%d,", (msg_ctrl & (1 << 4)) ? 8 : 16);
+ control(file, "atomic float op", aop_float, msg_ctrl & 0xf,
+ &space);
+ break;
+ case GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_WRITE:
+ case GFX9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_READ:
+ assert(dp_oword_block_rw[msg_ctrl & 7]);
+ format(file, "owords = %s, aligned = %d",
+ dp_oword_block_rw[msg_ctrl & 7], (msg_ctrl >> 3) & 3);
+ break;
+ default:
+ format(file, "0x%x", msg_ctrl);
}
+ format(file, ")");
break;
}
case GFX7_SFID_PIXEL_INTERPOLATOR:
- if (devinfo->ver >= 7) {
- format(file, " (%s, %s, 0x%02"PRIx64")",
- brw_inst_pi_nopersp(devinfo, inst) ? "linear" : "persp",
- pixel_interpolator_msg_types[brw_inst_pi_message_type(devinfo, inst)],
- brw_inst_pi_message_data(devinfo, inst));
- } else {
- unsupported = true;
- }
+ format(file, " (%s, %s, 0x%02"PRIx64")",
+ brw_inst_pi_nopersp(devinfo, inst) ? "linear" : "persp",
+ pixel_interpolator_msg_types[brw_inst_pi_message_type(devinfo, inst)],
+ brw_inst_pi_message_data(devinfo, inst));
break;
case GEN_RT_SFID_RAY_TRACE_ACCELERATOR:
@@ -2416,32 +2509,36 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
if (space)
string(file, " ");
}
- if (brw_sfid_is_lsc(sfid)) {
+ if (devinfo->verx10 >= 125 &&
+ brw_inst_send_sel_reg32_ex_desc(devinfo, inst) &&
+ brw_inst_send_ex_bso(devinfo, inst)) {
+ format(file, " src1_len = %u",
+ (unsigned) brw_inst_send_src1_len(devinfo, inst));
+
+ format(file, " ex_bso");
+ }
+ if (brw_sfid_is_lsc(sfid) ||
+ (sfid == BRW_SFID_URB && devinfo->ver >= 20)) {
lsc_disassemble_ex_desc(devinfo, imm_desc, imm_ex_desc, file);
} else {
if (has_imm_desc)
- format(file, "mlen %u", brw_message_desc_mlen(devinfo, imm_desc));
+ format(file, " mlen %u", brw_message_desc_mlen(devinfo, imm_desc) / reg_unit(devinfo));
if (has_imm_ex_desc) {
format(file, " ex_mlen %u",
- brw_message_ex_desc_ex_mlen(devinfo, imm_ex_desc));
+ brw_message_ex_desc_ex_mlen(devinfo, imm_ex_desc) / reg_unit(devinfo));
}
if (has_imm_desc)
- format(file, " rlen %u", brw_message_desc_rlen(devinfo, imm_desc));
+ format(file, " rlen %u", brw_message_desc_rlen(devinfo, imm_desc) / reg_unit(devinfo));
}
}
pad(file, 64);
- if (opcode != BRW_OPCODE_NOP && opcode != BRW_OPCODE_NENOP) {
+ if (opcode != BRW_OPCODE_NOP) {
string(file, "{");
space = 1;
err |= control(file, "access mode", access_mode,
brw_inst_access_mode(devinfo, inst), &space);
- if (devinfo->ver >= 6) {
- err |= control(file, "write enable control", wectrl,
- brw_inst_mask_control(devinfo, inst), &space);
- } else {
- err |= control(file, "mask control", mask_ctrl,
- brw_inst_mask_control(devinfo, inst), &space);
- }
+ err |= control(file, "write enable control", wectrl,
+ brw_inst_mask_control(devinfo, inst), &space);
if (devinfo->ver < 12) {
err |= control(file, "dependency control", dep_ctrl,
@@ -2449,22 +2546,10 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
brw_inst_no_dd_clear(devinfo, inst)), &space);
}
- if (devinfo->ver >= 6)
- err |= qtr_ctrl(file, devinfo, inst);
- else {
- if (brw_inst_qtr_control(devinfo, inst) == BRW_COMPRESSION_COMPRESSED &&
- desc && desc->ndst > 0 &&
- brw_inst_dst_reg_file(devinfo, inst) == BRW_MESSAGE_REGISTER_FILE &&
- brw_inst_dst_da_reg_nr(devinfo, inst) & BRW_MRF_COMPR4) {
- format(file, " compr4");
- } else {
- err |= control(file, "compression control", compr_ctrl,
- brw_inst_qtr_control(devinfo, inst), &space);
- }
- }
+ err |= qtr_ctrl(file, devinfo, inst);
if (devinfo->ver >= 12)
- err |= swsb(file, devinfo, inst);
+ err |= swsb(file, isa, inst);
err |= control(file, "compaction", cmpt_ctrl, is_compacted, &space);
err |= control(file, "thread control", thread_ctrl,
@@ -2474,7 +2559,7 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
if (has_branch_ctrl(devinfo, opcode)) {
err |= control(file, "branch ctrl", branch_ctrl,
brw_inst_branch_control(devinfo, inst), &space);
- } else if (devinfo->ver >= 6) {
+ } else if (devinfo->ver < 20) {
err |= control(file, "acc write control", accwr,
brw_inst_acc_wr_control(devinfo, inst), &space);
}
@@ -2489,3 +2574,73 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
newline(file);
return err;
}
+
+int
+brw_disassemble_find_end(const struct brw_isa_info *isa,
+ const void *assembly, int start)
+{
+ const struct intel_device_info *devinfo = isa->devinfo;
+ int offset = start;
+
+ /* This loop exits when send-with-EOT or when opcode is 0 */
+ while (true) {
+ const brw_inst *insn = assembly + offset;
+
+ if (brw_inst_cmpt_control(devinfo, insn)) {
+ offset += 8;
+ } else {
+ offset += 16;
+ }
+
+ /* Simplistic, but efficient way to terminate disasm */
+ uint32_t opcode = brw_inst_opcode(isa, insn);
+ if (opcode == 0 || (is_send(opcode) && brw_inst_eot(devinfo, insn))) {
+ break;
+ }
+ }
+
+ return offset;
+}
+
+void
+brw_disassemble_with_errors(const struct brw_isa_info *isa,
+ const void *assembly, int start, FILE *out)
+{
+ int end = brw_disassemble_find_end(isa, assembly, start);
+
+ /* Make a dummy disasm structure that brw_validate_instructions
+ * can work from.
+ */
+ struct disasm_info *disasm_info = disasm_initialize(isa, NULL);
+ disasm_new_inst_group(disasm_info, start);
+ disasm_new_inst_group(disasm_info, end);
+
+ brw_validate_instructions(isa, assembly, start, end, disasm_info);
+
+ void *mem_ctx = ralloc_context(NULL);
+ const struct brw_label *root_label =
+ brw_label_assembly(isa, assembly, start, end, mem_ctx);
+
+ foreach_list_typed(struct inst_group, group, link,
+ &disasm_info->group_list) {
+ struct exec_node *next_node = exec_node_get_next(&group->link);
+ if (exec_node_is_tail_sentinel(next_node))
+ break;
+
+ struct inst_group *next =
+ exec_node_data(struct inst_group, next_node, link);
+
+ int start_offset = group->offset;
+ int end_offset = next->offset;
+
+ brw_disassemble(isa, assembly, start_offset, end_offset,
+ root_label, out);
+
+ if (group->error) {
+ fputs(group->error, out);
+ }
+ }
+
+ ralloc_free(mem_ctx);
+ ralloc_free(disasm_info);
+}