diff options
author | Chia-I Wu <[email protected]> | 2014-10-11 03:24:48 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2014-10-11 11:55:50 +0800 |
commit | 566d1889eaceaa174f1f16f6ff1553154626be11 (patch) | |
tree | 2cabbdf2e75aeeb3877add83bb141e282d4f8df5 /src/gallium/drivers/ilo/shader | |
parent | 326e303175ab700d59602f0e344e8d84e15f1aa8 (diff) |
ilo: disassemble compacted instructions
Signed-off-by: Chia-I Wu <[email protected]>
Diffstat (limited to 'src/gallium/drivers/ilo/shader')
-rw-r--r-- | src/gallium/drivers/ilo/shader/toy_compiler.h | 10 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/shader/toy_compiler_asm.c | 326 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/shader/toy_compiler_disasm.c | 92 |
3 files changed, 426 insertions, 2 deletions
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; } |