summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2014-10-11 03:24:48 +0800
committerChia-I Wu <[email protected]>2014-10-11 11:55:50 +0800
commit566d1889eaceaa174f1f16f6ff1553154626be11 (patch)
tree2cabbdf2e75aeeb3877add83bb141e282d4f8df5 /src
parent326e303175ab700d59602f0e344e8d84e15f1aa8 (diff)
ilo: disassemble compacted instructions
Signed-off-by: Chia-I Wu <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/ilo/genhw/gen_eu_isa.xml.h27
-rw-r--r--src/gallium/drivers/ilo/shader/toy_compiler.h10
-rw-r--r--src/gallium/drivers/ilo/shader/toy_compiler_asm.c326
-rw-r--r--src/gallium/drivers/ilo/shader/toy_compiler_disasm.c92
4 files changed, 453 insertions, 2 deletions
diff --git a/src/gallium/drivers/ilo/genhw/gen_eu_isa.xml.h b/src/gallium/drivers/ilo/genhw/gen_eu_isa.xml.h
index 5dcd917c6eb..5a253017089 100644
--- a/src/gallium/drivers/ilo/genhw/gen_eu_isa.xml.h
+++ b/src/gallium/drivers/ilo/genhw/gen_eu_isa.xml.h
@@ -357,6 +357,31 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define GEN6_3SRC_SRC_SWIZZLE_X__MASK 0x00000006
#define GEN6_3SRC_SRC_SWIZZLE_X__SHIFT 1
#define GEN6_3SRC_SRC_REPCTRL (0x1 << 0)
+#define GEN6_COMPACT_SRC1_REG__MASK 0xff00000000000000ULL
+#define GEN6_COMPACT_SRC1_REG__SHIFT 56
+#define GEN6_COMPACT_SRC0_REG__MASK 0x00ff000000000000ULL
+#define GEN6_COMPACT_SRC0_REG__SHIFT 48
+#define GEN6_COMPACT_DST_REG__MASK 0x0000ff0000000000ULL
+#define GEN6_COMPACT_DST_REG__SHIFT 40
+#define GEN6_COMPACT_SRC1_INDEX__MASK 0x000000f800000000ULL
+#define GEN6_COMPACT_SRC1_INDEX__SHIFT 35
+#define GEN6_COMPACT_SRC0_INDEX__MASK 0x00000007c0000000ULL
+#define GEN6_COMPACT_SRC0_INDEX__SHIFT 30
+#define GEN6_COMPACT_CMPTCTRL (0x1 << 29)
+#define GEN6_COMPACT_FLAG_SUBREG__MASK 0x10000000
+#define GEN6_COMPACT_FLAG_SUBREG__SHIFT 28
+#define GEN6_COMPACT_CONDMODIFIER__MASK 0x0f000000
+#define GEN6_COMPACT_CONDMODIFIER__SHIFT 24
+#define GEN6_COMPACT_ACCWRCTRL (0x1 << 23)
+#define GEN6_COMPACT_SUBREG_INDEX__MASK 0x007c0000
+#define GEN6_COMPACT_SUBREG_INDEX__SHIFT 18
+#define GEN6_COMPACT_DATATYPE_INDEX__MASK 0x0003e000
+#define GEN6_COMPACT_DATATYPE_INDEX__SHIFT 13
+#define GEN6_COMPACT_CONTROL_INDEX__MASK 0x00001f00
+#define GEN6_COMPACT_CONTROL_INDEX__SHIFT 8
+#define GEN6_COMPACT_DEBUGCTRL (0x1 << 7)
+#define GEN6_COMPACT_OPCODE__MASK 0x0000007f
+#define GEN6_COMPACT_OPCODE__SHIFT 0
@@ -373,4 +398,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define GEN6_3SRC_SRC_0__SHIFT 0
+
+
#endif /* GEN_EU_ISA_XML */
diff --git a/src/gallium/drivers/ilo/shader/toy_compiler.h b/src/gallium/drivers/ilo/shader/toy_compiler.h
index 74004edd5e2..190a9f4b9c6 100644
--- a/src/gallium/drivers/ilo/shader/toy_compiler.h
+++ b/src/gallium/drivers/ilo/shader/toy_compiler.h
@@ -136,6 +136,13 @@ struct toy_inst {
struct list_head list;
};
+struct toy_compaction_table {
+ uint32_t control[32];
+ uint32_t datatype[32];
+ uint32_t subreg[32];
+ uint32_t src[32];
+};
+
/**
* Toy compiler.
*/
@@ -469,6 +476,9 @@ toy_compiler_dump(struct toy_compiler *tc);
void *
toy_compiler_assemble(struct toy_compiler *tc, int *size);
+const struct toy_compaction_table *
+toy_compiler_get_compaction_table(const struct ilo_dev_info *dev);
+
void
toy_compiler_disassemble(const struct ilo_dev_info *dev,
const void *kernel, int size,
diff --git a/src/gallium/drivers/ilo/shader/toy_compiler_asm.c b/src/gallium/drivers/ilo/shader/toy_compiler_asm.c
index cf57a902a78..95ae79255ec 100644
--- a/src/gallium/drivers/ilo/shader/toy_compiler_asm.c
+++ b/src/gallium/drivers/ilo/shader/toy_compiler_asm.c
@@ -65,6 +65,332 @@ struct codegen {
} src[3];
};
+/*
+ * From the Sandy Bridge PRM, volume 4 part 2, page 107-108:
+ *
+ * "(Src0Index) The 5-bit index for source 0. The 12-bit table-look-up
+ * result forms bits [88:77], the source 0 register region fields, of the
+ * 128-bit instruction word."
+ *
+ * "(SubRegIndex) The 5-bit index for sub-register fields. The 15-bit
+ * table-look-up result forms bits [100:96], [68,64] and [52,48] of the
+ * 128-bit instruction word."
+ *
+ * "(DataTypeIndex) The 5-bit index for data type fields. The 18-bit
+ * table-look-up result forms bits [63:61] and [46, 32] of the 128-bit
+ * instruction word."
+ *
+ * "(ControlIndex) The 5-bit index for data type fields. The 17-bit
+ * table-look-up result forms bits[31], and [23, 8] of the 128-bit
+ * instruction word."
+ */
+static const struct toy_compaction_table toy_compaction_table_gen6 = {
+ .control = {
+ [0] = 0x00000, /* 00000000000000000 */
+ [1] = 0x08000, /* 01000000000000000 */
+ [2] = 0x06000, /* 00110000000000000 */
+ [3] = 0x00100, /* 00000000100000000 */
+ [4] = 0x02000, /* 00010000000000000 */
+ [5] = 0x01100, /* 00001000100000000 */
+ [6] = 0x00102, /* 00000000100000010 */
+ [7] = 0x00002, /* 00000000000000010 */
+ [8] = 0x08100, /* 01000000100000000 */
+ [9] = 0x0a000, /* 01010000000000000 */
+ [10] = 0x16000, /* 10110000000000000 */
+ [11] = 0x04000, /* 00100000000000000 */
+ [12] = 0x1a000, /* 11010000000000000 */
+ [13] = 0x18000, /* 11000000000000000 */
+ [14] = 0x09100, /* 01001000100000000 */
+ [15] = 0x08008, /* 01000000000001000 */
+ [16] = 0x08004, /* 01000000000000100 */
+ [17] = 0x00008, /* 00000000000001000 */
+ [18] = 0x00004, /* 00000000000000100 */
+ [19] = 0x01100, /* 00111000100000000 */
+ [20] = 0x01102, /* 00001000100000010 */
+ [21] = 0x06100, /* 00110000100000000 */
+ [22] = 0x06001, /* 00110000000000001 */
+ [23] = 0x04001, /* 00100000000000001 */
+ [24] = 0x06002, /* 00110000000000010 */
+ [25] = 0x06005, /* 00110000000000101 */
+ [26] = 0x06009, /* 00110000000001001 */
+ [27] = 0x06010, /* 00110000000010000 */
+ [28] = 0x06003, /* 00110000000000011 */
+ [29] = 0x06004, /* 00110000000000100 */
+ [30] = 0x06108, /* 00110000100001000 */
+ [31] = 0x04009, /* 00100000000001001 */
+ },
+ .datatype = {
+ [0] = 0x09c00, /* 001001110000000000 */
+ [1] = 0x08c20, /* 001000110000100000 */
+ [2] = 0x09c01, /* 001001110000000001 */
+ [3] = 0x08060, /* 001000000001100000 */
+ [4] = 0x0ad29, /* 001010110100101001 */
+ [5] = 0x081ad, /* 001000000110101101 */
+ [6] = 0x0c62c, /* 001100011000101100 */
+ [7] = 0x0bdad, /* 001011110110101101 */
+ [8] = 0x081ec, /* 001000000111101100 */
+ [9] = 0x08061, /* 001000000001100001 */
+ [10] = 0x08ca5, /* 001000110010100101 */
+ [11] = 0x08041, /* 001000000001000001 */
+ [12] = 0x08231, /* 001000001000110001 */
+ [13] = 0x08229, /* 001000001000101001 */
+ [14] = 0x08020, /* 001000000000100000 */
+ [15] = 0x08232, /* 001000001000110010 */
+ [16] = 0x0a529, /* 001010010100101001 */
+ [17] = 0x0b4a5, /* 001011010010100101 */
+ [18] = 0x081a5, /* 001000000110100101 */
+ [19] = 0x0c629, /* 001100011000101001 */
+ [20] = 0x0b62c, /* 001011011000101100 */
+ [21] = 0x0b5a5, /* 001011010110100101 */
+ [22] = 0x0bda5, /* 001011110110100101 */
+ [23] = 0x0f1bd, /* 001111011110111101 */
+ [24] = 0x0f1bc, /* 001111011110111100 */
+ [25] = 0x0f1bd, /* 001111011110111101 */
+ [26] = 0x0f19d, /* 001111011110011101 */
+ [27] = 0x0f1be, /* 001111011110111110 */
+ [28] = 0x08021, /* 001000000000100001 */
+ [29] = 0x08022, /* 001000000000100010 */
+ [30] = 0x09fdd, /* 001001111111011101 */
+ [31] = 0x083be, /* 001000001110111110 */
+ },
+ .subreg = {
+ [0] = 0x0000, /* 000000000000000 */
+ [1] = 0x0004, /* 000000000000100 */
+ [2] = 0x0180, /* 000000110000000 */
+ [3] = 0x1000, /* 111000000000000 */
+ [4] = 0x3c08, /* 011110000001000 */
+ [5] = 0x0400, /* 000010000000000 */
+ [6] = 0x0010, /* 000000000010000 */
+ [7] = 0x0c0c, /* 000110000001100 */
+ [8] = 0x1000, /* 001000000000000 */
+ [9] = 0x0200, /* 000001000000000 */
+ [10] = 0x0294, /* 000001010010100 */
+ [11] = 0x0056, /* 000000001010110 */
+ [12] = 0x2000, /* 010000000000000 */
+ [13] = 0x6000, /* 110000000000000 */
+ [14] = 0x0800, /* 000100000000000 */
+ [15] = 0x0080, /* 000000010000000 */
+ [16] = 0x0008, /* 000000000001000 */
+ [17] = 0x4000, /* 100000000000000 */
+ [18] = 0x0280, /* 000001010000000 */
+ [19] = 0x1400, /* 001010000000000 */
+ [20] = 0x1800, /* 001100000000000 */
+ [21] = 0x0054, /* 000000001010100 */
+ [22] = 0x5a94, /* 101101010010100 */
+ [23] = 0x2800, /* 010100000000000 */
+ [24] = 0x008f, /* 000000010001111 */
+ [25] = 0x3000, /* 011000000000000 */
+ [26] = 0x1c00, /* 111110000000000 */
+ [27] = 0x5000, /* 101000000000000 */
+ [28] = 0x000f, /* 000000000001111 */
+ [29] = 0x088f, /* 000100010001111 */
+ [30] = 0x108f, /* 001000010001111 */
+ [31] = 0x0c00, /* 000110000000000 */
+ },
+ .src = {
+ [0] = 0x000, /* 000000000000 */
+ [1] = 0x588, /* 010110001000 */
+ [2] = 0x468, /* 010001101000 */
+ [3] = 0x228, /* 001000101000 */
+ [4] = 0x690, /* 011010010000 */
+ [5] = 0x120, /* 000100100000 */
+ [6] = 0x46c, /* 010001101100 */
+ [7] = 0x510, /* 010101110000 */
+ [8] = 0x618, /* 011001111000 */
+ [9] = 0x328, /* 001100101000 */
+ [10] = 0x58c, /* 010110001100 */
+ [11] = 0x220, /* 001000100000 */
+ [12] = 0x58a, /* 010110001010 */
+ [13] = 0x002, /* 000000000010 */
+ [14] = 0x550, /* 010101010000 */
+ [15] = 0x568, /* 010101101000 */
+ [16] = 0xf4c, /* 111101001100 */
+ [17] = 0xf2c, /* 111100101100 */
+ [18] = 0x610, /* 011001110000 */
+ [19] = 0x589, /* 010110001001 */
+ [20] = 0x558, /* 010101011000 */
+ [21] = 0x348, /* 001101001000 */
+ [22] = 0x42c, /* 010000101100 */
+ [23] = 0x400, /* 010000000000 */
+ [24] = 0x310, /* 001101110000 */
+ [25] = 0x310, /* 001100010000 */
+ [26] = 0x300, /* 001100000000 */
+ [27] = 0x46a, /* 010001101010 */
+ [28] = 0x318, /* 001101111000 */
+ [29] = 0x010, /* 000001110000 */
+ [30] = 0x320, /* 001100100000 */
+ [31] = 0x350, /* 001101010000 */
+ },
+};
+
+/*
+ * From the Ivy Bridge PRM, volume 4 part 3, page 128:
+ *
+ * "(Src0Index) Lookup one of 32 12-bit values. That value is used (from
+ * MSB to LSB) for the Src0.AddrMode, Src0.ChanSel[7:4], Src0.HorzStride,
+ * Src0.SrcMod, Src0.VertStride, and Src0.Width bit fields."
+ *
+ * "(SubRegIndex) Lookup one of 32 15-bit values. That value is used (from
+ * MSB to LSB) for various fields for Src1, Src0, and Dst, including
+ * ChanEn/ChanSel, SubRegNum, and AddrImm[4] or AddrImm[4:0], depending
+ * on AddrMode and AccessMode.
+ *
+ * "(DataTypeIndex) Lookup one of 32 18-bit values. That value is used
+ * (from MSB to LSB) for the Dst.AddrMode, Dst.HorzStride, Dst.DstType,
+ * Dst.RegFile, Src0.SrcType, Src0.RegFile, Src1.SrcType, and
+ * Src1.RegType bit fields."
+ *
+ * "(ControlIndex) Lookup one of 32 19-bit values. That value is used
+ * (from MSB to LSB) for the FlagRegNum, FlagSubRegNum, Saturate,
+ * ExecSize, PredInv, PredCtrl, ThreadCtrl, QtrCtrl, DepCtrl, MaskCtrl,
+ * and AccessMode bit fields."
+ */
+static const struct toy_compaction_table toy_compaction_table_gen7 = {
+ .control = {
+ [0] = 0x00002, /* 0000000000000000010 */
+ [1] = 0x04000, /* 0000100000000000000 */
+ [2] = 0x04001, /* 0000100000000000001 */
+ [3] = 0x04002, /* 0000100000000000010 */
+ [4] = 0x04003, /* 0000100000000000011 */
+ [5] = 0x04004, /* 0000100000000000100 */
+ [6] = 0x04005, /* 0000100000000000101 */
+ [7] = 0x04007, /* 0000100000000000111 */
+ [8] = 0x04008, /* 0000100000000001000 */
+ [9] = 0x04009, /* 0000100000000001001 */
+ [10] = 0x0400d, /* 0000100000000001101 */
+ [11] = 0x06000, /* 0000110000000000000 */
+ [12] = 0x06001, /* 0000110000000000001 */
+ [13] = 0x06002, /* 0000110000000000010 */
+ [14] = 0x06003, /* 0000110000000000011 */
+ [15] = 0x06004, /* 0000110000000000100 */
+ [16] = 0x06005, /* 0000110000000000101 */
+ [17] = 0x06007, /* 0000110000000000111 */
+ [18] = 0x06009, /* 0000110000000001001 */
+ [19] = 0x0600d, /* 0000110000000001101 */
+ [20] = 0x06010, /* 0000110000000010000 */
+ [21] = 0x06100, /* 0000110000100000000 */
+ [22] = 0x08000, /* 0001000000000000000 */
+ [23] = 0x08002, /* 0001000000000000010 */
+ [24] = 0x08004, /* 0001000000000000100 */
+ [25] = 0x08100, /* 0001000000100000000 */
+ [26] = 0x16000, /* 0010110000000000000 */
+ [27] = 0x16010, /* 0010110000000010000 */
+ [28] = 0x18000, /* 0011000000000000000 */
+ [29] = 0x18100, /* 0011000000100000000 */
+ [30] = 0x28000, /* 0101000000000000000 */
+ [31] = 0x28100, /* 0101000000100000000 */
+ },
+ .datatype = {
+ [0] = 0x08001, /* 001000000000000001 */
+ [1] = 0x08020, /* 001000000000100000 */
+ [2] = 0x08021, /* 001000000000100001 */
+ [3] = 0x08061, /* 001000000001100001 */
+ [4] = 0x080bd, /* 001000000010111101 */
+ [5] = 0x082fd, /* 001000001011111101 */
+ [6] = 0x083a1, /* 001000001110100001 */
+ [7] = 0x083a5, /* 001000001110100101 */
+ [8] = 0x083bd, /* 001000001110111101 */
+ [9] = 0x08421, /* 001000010000100001 */
+ [10] = 0x08c20, /* 001000110000100000 */
+ [11] = 0x08c21, /* 001000110000100001 */
+ [12] = 0x094a5, /* 001001010010100101 */
+ [13] = 0x09ca4, /* 001001110010100100 */
+ [14] = 0x09ca5, /* 001001110010100101 */
+ [15] = 0x0f3bd, /* 001111001110111101 */
+ [16] = 0x0f79d, /* 001111011110011101 */
+ [17] = 0x0f7bc, /* 001111011110111100 */
+ [18] = 0x0f7bd, /* 001111011110111101 */
+ [19] = 0x0ffbc, /* 001111111110111100 */
+ [20] = 0x0020c, /* 000000001000001100 */
+ [21] = 0x0803d, /* 001000000000111101 */
+ [22] = 0x080a5, /* 001000000010100101 */
+ [23] = 0x08420, /* 001000010000100000 */
+ [24] = 0x094a4, /* 001001010010100100 */
+ [25] = 0x09c84, /* 001001110010000100 */
+ [26] = 0x0a509, /* 001010010100001001 */
+ [27] = 0x0dfbd, /* 001101111110111101 */
+ [28] = 0x0ffbd, /* 001111111110111101 */
+ [29] = 0x0bdac, /* 001011110110101100 */
+ [30] = 0x0a528, /* 001010010100101000 */
+ [31] = 0x0ad28, /* 001010110100101000 */
+ },
+ .subreg = {
+ [0] = 0x0000, /* 000000000000000 */
+ [1] = 0x0001, /* 000000000000001 */
+ [2] = 0x0008, /* 000000000001000 */
+ [3] = 0x000f, /* 000000000001111 */
+ [4] = 0x0010, /* 000000000010000 */
+ [5] = 0x0080, /* 000000010000000 */
+ [6] = 0x0100, /* 000000100000000 */
+ [7] = 0x0180, /* 000000110000000 */
+ [8] = 0x0200, /* 000001000000000 */
+ [9] = 0x0210, /* 000001000010000 */
+ [10] = 0x0280, /* 000001010000000 */
+ [11] = 0x1000, /* 001000000000000 */
+ [12] = 0x1001, /* 001000000000001 */
+ [13] = 0x1081, /* 001000010000001 */
+ [14] = 0x1082, /* 001000010000010 */
+ [15] = 0x1083, /* 001000010000011 */
+ [16] = 0x1084, /* 001000010000100 */
+ [17] = 0x1087, /* 001000010000111 */
+ [18] = 0x1088, /* 001000010001000 */
+ [19] = 0x108e, /* 001000010001110 */
+ [20] = 0x108f, /* 001000010001111 */
+ [21] = 0x1180, /* 001000110000000 */
+ [22] = 0x11e8, /* 001000111101000 */
+ [23] = 0x2000, /* 010000000000000 */
+ [24] = 0x2180, /* 010000110000000 */
+ [25] = 0x3000, /* 011000000000000 */
+ [26] = 0x3c87, /* 011110010000111 */
+ [27] = 0x4000, /* 100000000000000 */
+ [28] = 0x5000, /* 101000000000000 */
+ [29] = 0x6000, /* 110000000000000 */
+ [30] = 0x7000, /* 111000000000000 */
+ [31] = 0x701c, /* 111000000011100 */
+ },
+ .src = {
+ [0] = 0x000, /* 000000000000 */
+ [1] = 0x002, /* 000000000010 */
+ [2] = 0x010, /* 000000010000 */
+ [3] = 0x012, /* 000000010010 */
+ [4] = 0x018, /* 000000011000 */
+ [5] = 0x020, /* 000000100000 */
+ [6] = 0x028, /* 000000101000 */
+ [7] = 0x048, /* 000001001000 */
+ [8] = 0x050, /* 000001010000 */
+ [9] = 0x070, /* 000001110000 */
+ [10] = 0x078, /* 000001111000 */
+ [11] = 0x300, /* 001100000000 */
+ [12] = 0x302, /* 001100000010 */
+ [13] = 0x308, /* 001100001000 */
+ [14] = 0x310, /* 001100010000 */
+ [15] = 0x312, /* 001100010010 */
+ [16] = 0x320, /* 001100100000 */
+ [17] = 0x328, /* 001100101000 */
+ [18] = 0x338, /* 001100111000 */
+ [19] = 0x340, /* 001101000000 */
+ [20] = 0x342, /* 001101000010 */
+ [21] = 0x348, /* 001101001000 */
+ [22] = 0x350, /* 001101010000 */
+ [23] = 0x360, /* 001101100000 */
+ [24] = 0x368, /* 001101101000 */
+ [25] = 0x370, /* 001101110000 */
+ [26] = 0x371, /* 001101110001 */
+ [27] = 0x378, /* 001101111000 */
+ [28] = 0x468, /* 010001101000 */
+ [29] = 0x469, /* 010001101001 */
+ [30] = 0x46a, /* 010001101010 */
+ [31] = 0x588, /* 010110001000 */
+ },
+};
+
+const struct toy_compaction_table *
+toy_compiler_get_compaction_table(const struct ilo_dev_info *dev)
+{
+ return (ilo_dev_gen(dev) >= ILO_GEN(7)) ?
+ &toy_compaction_table_gen7 : &toy_compaction_table_gen6;
+}
+
/**
* Return true if the source operand is null.
*/
diff --git a/src/gallium/drivers/ilo/shader/toy_compiler_disasm.c b/src/gallium/drivers/ilo/shader/toy_compiler_disasm.c
index f70b93d7ccf..94321afdf38 100644
--- a/src/gallium/drivers/ilo/shader/toy_compiler_disasm.c
+++ b/src/gallium/drivers/ilo/shader/toy_compiler_disasm.c
@@ -1414,6 +1414,94 @@ disasm_printer_print_inst(struct disasm_printer *printer,
ilo_printf("%s\n", disasm_printer_get_string(printer));
}
+static void
+disasm_uncompact(const struct ilo_dev_info *dev,
+ uint64_t compact, uint32_t *dw)
+{
+ const struct toy_compaction_table *tbl =
+ toy_compiler_get_compaction_table(dev);
+ bool src_is_imm;
+ uint32_t tmp;
+
+ memset(dw, 0, sizeof(*dw) * 4);
+
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_OPCODE);
+ dw[0] |= GEN_SHIFT32(tmp, GEN6_INST_OPCODE);
+
+ if (ilo_dev_gen(dev) >= ILO_GEN(7) && (compact & GEN6_COMPACT_DEBUGCTRL))
+ dw[0] |= GEN6_INST_DEBUGCTRL;
+
+ /* ControlIndex */
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_CONTROL_INDEX);
+ tmp = tbl->control[tmp];
+
+ dw[0] |= (tmp & 0xffff) << GEN6_INST_ACCESSMODE__SHIFT;
+ if (tmp & 0x10000)
+ dw[0] |= GEN6_INST_SATURATE;
+
+ if (ilo_dev_gen(dev) >= ILO_GEN(7))
+ dw[2] |= (tmp >> 17) << GEN6_INST_FLAG_SUBREG__SHIFT;
+
+ /* DataTypeIndex */
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_DATATYPE_INDEX);
+ tmp = tbl->datatype[tmp];
+
+ dw[1] |= (tmp & 0x7fff) << GEN6_INST_DST_FILE__SHIFT;
+ dw[1] |= (tmp >> 15) << GEN6_INST_DST_HORZSTRIDE__SHIFT;
+
+ /* SubRegIndex */
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_SUBREG_INDEX);
+ tmp = tbl->subreg[tmp];
+
+ dw[1] |= (tmp & 0x1f) << 16;
+ dw[2] |= ((tmp >> 5) & 0x1f);
+ dw[3] |= ((tmp >> 10) & 0x1f);
+
+ if (compact & GEN6_COMPACT_ACCWRCTRL)
+ dw[0] |= GEN6_INST_ACCWRCTRL;
+
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_CONDMODIFIER);
+ dw[0] |= GEN_SHIFT32(tmp, GEN6_INST_CONDMODIFIER);
+
+ if (ilo_dev_gen(dev) == ILO_GEN(6)) {
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_FLAG_SUBREG);
+ dw[2] |= GEN_SHIFT32(compact, GEN6_INST_FLAG_SUBREG);
+ }
+
+ assert(compact & GEN6_COMPACT_CMPTCTRL);
+
+ /* Src0Index */
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_SRC0_INDEX);
+ tmp = tbl->src[tmp];
+ dw[2] |= tmp << 13;
+
+ src_is_imm = (GEN_EXTRACT(dw[1], GEN6_INST_SRC0_FILE) == GEN6_FILE_IMM) ||
+ (GEN_EXTRACT(dw[1], GEN6_INST_SRC1_FILE) == GEN6_FILE_IMM);
+
+ /* Src1Index */
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_SRC1_INDEX);
+ if (src_is_imm) {
+ if (tmp & 0x10)
+ tmp |= 0xfffff0;
+ dw[3] |= tmp << 8;
+ } else {
+ tmp = tbl->src[tmp];
+ dw[3] |= tmp << 13;
+ }
+
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_DST_REG);
+ dw[1] |= GEN_SHIFT32(tmp, GEN6_INST_DST_REG);
+
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_SRC0_REG);
+ dw[2] |= GEN_SHIFT32(tmp, GEN6_INST_SRC_REG);
+
+ tmp = GEN_EXTRACT(compact, GEN6_COMPACT_SRC1_REG);
+ if (src_is_imm)
+ dw[3] |= tmp;
+ else
+ dw[3] |= GEN_SHIFT32(tmp, GEN6_INST_SRC_REG);
+}
+
void
toy_compiler_disassemble(const struct ilo_dev_info *dev,
const void *kernel, int size,
@@ -1437,8 +1525,8 @@ toy_compiler_disassemble(const struct ilo_dev_info *dev,
break;
if (compacted) {
- /* no compaction support yet */
- memset(temp, 0, sizeof(temp));
+ const uint64_t compact = (uint64_t) dw[1] << 32 | dw[0];
+ disasm_uncompact(dev, compact, temp);
dw = temp;
}