ilo: disassemble compacted instructions
authorChia-I Wu <olvaffe@gmail.com>
Fri, 10 Oct 2014 19:24:48 +0000 (03:24 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Sat, 11 Oct 2014 03:55:50 +0000 (11:55 +0800)
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
src/gallium/drivers/ilo/genhw/gen_eu_isa.xml.h
src/gallium/drivers/ilo/shader/toy_compiler.h
src/gallium/drivers/ilo/shader/toy_compiler_asm.c
src/gallium/drivers/ilo/shader/toy_compiler_disasm.c

index 5dcd917c6ebcc4d6e9aa0cc4fe97620a434ee925..5a25301708985849dd3ab88d88723e47655efd65 100644 (file)
@@ -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 */
index 74004edd5e28897030b06f6edebacc127b2e83f4..190a9f4b9c67608bf656072183ab6dd2049e8881 100644 (file)
@@ -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,
index cf57a902a78a77bf78fa329771ae5b76842fbc70..95ae79255ecba9bbe481d0c93a89ff5f8e6c9953 100644 (file)
@@ -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.
  */
index f70b93d7ccf4a6844107b0d289b8130b04ed9f00..94321afdf38358f015026aa40ce8aded7739567a 100644 (file)
@@ -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;
       }