Merge remote branch 'origin/master' into lp-setup-llvm
[mesa.git] / src / mesa / drivers / dri / i965 / brw_disasm.c
index c148dbc087ae9ab8f1c4cac1122842fbe539a8c3..12b8f2e46787c79b52f3e6765624f2fd66502579 100644 (file)
@@ -159,6 +159,16 @@ char *saturate[2] = {
     [1] = ".sat"
 };
 
+char *accwr[2] = {
+    [0] = "",
+    [1] = "AccWrEnable"
+};
+
+char *wectrl[2] = {
+    [0] = "WE_normal",
+    [1] = "WE_all"
+};
+
 char *exec_size[8] = {
     [0] = "1",
     [1] = "2",
@@ -236,6 +246,16 @@ char *reg_encoding[8] = {
     [7] = "F"
 };
 
+int reg_type_size[8] = {
+    [0] = 4,
+    [1] = 4,
+    [2] = 2,
+    [3] = 2,
+    [4] = 1,
+    [5] = 1,
+    [7] = 4
+};
+
 char *imm_encoding[8] = {
     [0] = "UD",
     [1] = "D",
@@ -482,7 +502,8 @@ static int dest (FILE *file, struct brw_instruction *inst)
            if (err == -1)
                return 0;
            if (inst->bits1.da1.dest_subreg_nr)
-               format (file, ".%d", inst->bits1.da1.dest_subreg_nr);
+               format (file, ".%d", inst->bits1.da1.dest_subreg_nr /
+                                    reg_type_size[inst->bits1.da1.dest_reg_type]);
            format (file, "<%d>", inst->bits1.da1.dest_horiz_stride);
            err |= control (file, "dest reg encoding", reg_encoding, inst->bits1.da1.dest_reg_type, NULL);
        }
@@ -490,7 +511,8 @@ static int dest (FILE *file, struct brw_instruction *inst)
        {
            string (file, "g[a0");
            if (inst->bits1.ia1.dest_subreg_nr)
-               format (file, ".%d", inst->bits1.ia1.dest_subreg_nr);
+               format (file, ".%d", inst->bits1.ia1.dest_subreg_nr /
+                                       reg_type_size[inst->bits1.ia1.dest_reg_type]);
            if (inst->bits1.ia1.dest_indirect_offset)
                format (file, " %d", inst->bits1.ia1.dest_indirect_offset);
            string (file, "]");
@@ -506,7 +528,8 @@ static int dest (FILE *file, struct brw_instruction *inst)
            if (err == -1)
                return 0;
            if (inst->bits1.da16.dest_subreg_nr)
-               format (file, ".%d", inst->bits1.da16.dest_subreg_nr);
+               format (file, ".%d", inst->bits1.da16.dest_subreg_nr /
+                                    reg_type_size[inst->bits1.da16.dest_reg_type]);
            string (file, "<1>");
            err |= control (file, "writemask", writemask, inst->bits1.da16.dest_writemask, NULL);
            err |= control (file, "dest reg encoding", reg_encoding, inst->bits1.da16.dest_reg_type, NULL);
@@ -547,7 +570,7 @@ static int src_da1 (FILE *file, GLuint type, GLuint _reg_file,
     if (err == -1)
        return 0;
     if (sub_reg_num)
-       format (file, ".%d", sub_reg_num);
+       format (file, ".%d", sub_reg_num / reg_type_size[type]); /* use formal style like spec */
     src_align1_region (file, _vert_stride, _width, _horiz_stride);
     err |= control (file, "src reg encoding", reg_encoding, type, NULL);
     return err;
@@ -601,11 +624,12 @@ static int src_da16 (FILE *file,
     if (err == -1)
        return 0;
     if (_subreg_nr)
-       format (file, ".%d", _subreg_nr);
+       /* bit4 for subreg number byte addressing. Make this same meaning as
+          in da1 case, so output looks consistent. */
+       format (file, ".%d", 16 / reg_type_size[_reg_type]);
     string (file, "<");
     err |= control (file, "vert stride", vert_stride, _vert_stride, NULL);
     string (file, ",4,1>");
-    err |= control (file, "src da16 reg type", reg_encoding, _reg_type, NULL);
     /*
      * Three kinds of swizzle display:
      *  identity - nothing printed
@@ -632,6 +656,7 @@ static int src_da16 (FILE *file,
        err |= control (file, "channel select", chan_sel, swz_z, NULL);
        err |= control (file, "channel select", chan_sel, swz_w, NULL);
     }
+    err |= control (file, "src da16 reg type", reg_encoding, _reg_type, NULL);
     return err;
 }
 
@@ -785,6 +810,44 @@ static int src1 (FILE *file, struct brw_instruction *inst)
     }
 }
 
+int esize[6] = {
+       [0] = 1,
+       [1] = 2,
+       [2] = 4,
+       [3] = 8,
+       [4] = 16,
+       [5] = 32,
+};
+
+static int qtr_ctrl(FILE *file, struct brw_instruction *inst)
+{
+    int qtr_ctl = inst->header.compression_control;
+    int exec_size = esize[inst->header.execution_size];
+
+    if (exec_size == 8) {
+       switch (qtr_ctl) {
+       case 0:
+           string (file, " 1Q");
+           break;
+       case 1:
+           string (file, " 2Q");
+           break;
+       case 2:
+           string (file, " 3Q");
+           break;
+       case 3:
+           string (file, " 4Q");
+           break;
+       }
+    } else if (exec_size == 16){
+       if (qtr_ctl < 2)
+           string (file, " 1H");
+       else
+           string (file, " 2H");
+    }
+    return 0;
+}
+
 int brw_disasm (FILE *file, struct brw_instruction *inst, int gen)
 {
     int        err = 0;
@@ -823,13 +886,18 @@ int brw_disasm (FILE *file, struct brw_instruction *inst, int gen)
        string (file, ")");
     }
 
-    if (inst->header.opcode == BRW_OPCODE_SEND)
+    if (inst->header.opcode == BRW_OPCODE_SEND && gen < 6)
        format (file, " %d", inst->header.destreg__conditionalmod);
 
     if (opcode[inst->header.opcode].ndst > 0) {
        pad (file, 16);
        err |= dest (file, inst);
+    } else if (gen >= 6 && (inst->header.opcode == BRW_OPCODE_IF ||
+                           inst->header.opcode == BRW_OPCODE_ELSE ||
+                           inst->header.opcode == BRW_OPCODE_ENDIF)) {
+       format (file, " %d", inst->bits1.branch_gen6.jump_count);
     }
+
     if (opcode[inst->header.opcode].nsrc > 0) {
        pad (file, 32);
        err |= src0 (file, inst);
@@ -869,12 +937,25 @@ int brw_disasm (FILE *file, struct brw_instruction *inst, int gen)
                            inst->bits3.math.precision, &space);
            break;
        case BRW_MESSAGE_TARGET_SAMPLER:
-           format (file, " (%d, %d, ",
-                   inst->bits3.sampler.binding_table_index,
-                   inst->bits3.sampler.sampler);
-           err |= control (file, "sampler target format", sampler_target_format,
-                           inst->bits3.sampler.return_format, NULL);
-           string (file, ")");
+           if (gen >= 5) {
+               format (file, " (%d, %d, %d, %d)",
+                       inst->bits3.sampler_gen5.binding_table_index,
+                       inst->bits3.sampler_gen5.sampler,
+                       inst->bits3.sampler_gen5.msg_type,
+                       inst->bits3.sampler_gen5.simd_mode);
+           } else if (0 /* FINISHME: is_g4x */) {
+               format (file, " (%d, %d)",
+                       inst->bits3.sampler_g4x.binding_table_index,
+                       inst->bits3.sampler_g4x.sampler);
+           } else {
+               format (file, " (%d, %d, ",
+                       inst->bits3.sampler.binding_table_index,
+                       inst->bits3.sampler.sampler);
+               err |= control (file, "sampler target format",
+                               sampler_target_format,
+                               inst->bits3.sampler.return_format, NULL);
+               string (file, ")");
+           }
            break;
        case BRW_MESSAGE_TARGET_DATAPORT_READ:
            if (gen >= 6) {
@@ -935,6 +1016,11 @@ int brw_disasm (FILE *file, struct brw_instruction *inst, int gen)
                            inst->bits3.urb.used, &space);
            err |= control (file, "urb complete", urb_complete,
                            inst->bits3.urb.complete, &space);
+           if (gen >= 5) {
+               format (file, " mlen %d, rlen %d\n",
+                       inst->bits3.urb_gen5.msg_length,
+                       inst->bits3.urb_gen5.response_length);
+           }
            break;
        case BRW_MESSAGE_TARGET_THREAD_SPAWNER:
            break;
@@ -961,19 +1047,29 @@ int brw_disasm (FILE *file, struct brw_instruction *inst, int gen)
        string (file, "{");
        space = 1;
        err |= control(file, "access mode", access_mode, inst->header.access_mode, &space);
-       err |= control (file, "mask control", mask_ctrl, inst->header.mask_control, &space);
+       if (gen >= 6)
+           err |= control (file, "write enable control", wectrl, inst->header.mask_control, &space);
+       else
+           err |= control (file, "mask control", mask_ctrl, inst->header.mask_control, &space);
        err |= control (file, "dependency control", dep_ctrl, inst->header.dependency_control, &space);
 
-       if (inst->header.compression_control == BRW_COMPRESSION_COMPRESSED &&
-           opcode[inst->header.opcode].ndst > 0 &&
-           inst->bits1.da1.dest_reg_file == BRW_MESSAGE_REGISTER_FILE &&
-           inst->bits1.da1.dest_reg_nr & (1 << 7)) {
-          format (file, " compr4");
-       } else {
-          err |= control (file, "compression control", compr_ctrl,
-                          inst->header.compression_control, &space);
+       if (gen >= 6)
+           err |= qtr_ctrl (file, inst);
+       else {
+           if (inst->header.compression_control == BRW_COMPRESSION_COMPRESSED &&
+               opcode[inst->header.opcode].ndst > 0 &&
+               inst->bits1.da1.dest_reg_file == BRW_MESSAGE_REGISTER_FILE &&
+               inst->bits1.da1.dest_reg_nr & (1 << 7)) {
+               format (file, " compr4");
+           } else {
+               err |= control (file, "compression control", compr_ctrl,
+                               inst->header.compression_control, &space);
+           }
        }
+
        err |= control (file, "thread control", thread_ctrl, inst->header.thread_control, &space);
+       if (gen >= 6)
+           err |= control (file, "acc write control", accwr, inst->header.acc_wr_control, &space);
        if (inst->header.opcode == BRW_OPCODE_SEND)
            err |= control (file, "end of thread", end_of_thread,
                            inst->bits3.generic.end_of_thread, &space);