i965/vec4: Make with_writemask() non-static.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_disasm.c
index b18676df7a733e963df0442ceedabbc6301afaf4..18e6c9d78fc0ecf481aa4489ddf9ab23e942ea9e 100644 (file)
@@ -41,6 +41,12 @@ const struct opcode_desc opcode_descs[128] = {
     [BRW_OPCODE_RNDZ] = { .name = "rndz", .nsrc = 1, .ndst = 1 },
     [BRW_OPCODE_NOT] = { .name = "not", .nsrc = 1, .ndst = 1 },
     [BRW_OPCODE_LZD] = { .name = "lzd", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_F32TO16] = { .name = "f32to16", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_F16TO32] = { .name = "f16to32", .nsrc = 1, .ndst = 1 },
+    [BRW_OPCODE_BFREV] = { .name = "bfrev", .nsrc = 1, .ndst = 1},
+    [BRW_OPCODE_FBH] = { .name = "fbh", .nsrc = 1, .ndst = 1},
+    [BRW_OPCODE_FBL] = { .name = "fbl", .nsrc = 1, .ndst = 1},
+    [BRW_OPCODE_CBIT] = { .name = "cbit", .nsrc = 1, .ndst = 1},
 
     [BRW_OPCODE_MUL] = { .name = "mul", .nsrc = 2, .ndst = 1 },
     [BRW_OPCODE_MAC] = { .name = "mac", .nsrc = 2, .ndst = 1 },
@@ -48,6 +54,7 @@ const struct opcode_desc opcode_descs[128] = {
     [BRW_OPCODE_LINE] = { .name = "line", .nsrc = 2, .ndst = 1 },
     [BRW_OPCODE_PLN] = { .name = "pln", .nsrc = 2, .ndst = 1 },
     [BRW_OPCODE_MAD] = { .name = "mad", .nsrc = 3, .ndst = 1 },
+    [BRW_OPCODE_LRP] = { .name = "lrp", .nsrc = 3, .ndst = 1 },
     [BRW_OPCODE_SAD2] = { .name = "sad2", .nsrc = 2, .ndst = 1 },
     [BRW_OPCODE_SADA2] = { .name = "sada2", .nsrc = 2, .ndst = 1 },
     [BRW_OPCODE_DP4] = { .name = "dp4", .nsrc = 2, .ndst = 1 },
@@ -67,6 +74,9 @@ const struct opcode_desc opcode_descs[128] = {
     [BRW_OPCODE_ASR] = { .name = "asr", .nsrc = 2, .ndst = 1 },
     [BRW_OPCODE_CMP] = { .name = "cmp", .nsrc = 2, .ndst = 1 },
     [BRW_OPCODE_CMPN] = { .name = "cmpn", .nsrc = 2, .ndst = 1 },
+    [BRW_OPCODE_BFE] = { .name = "bfe", .nsrc = 3, .ndst = 1},
+    [BRW_OPCODE_BFI1] = { .name = "bfe1", .nsrc = 2, .ndst = 1},
+    [BRW_OPCODE_BFI2] = { .name = "bfe2", .nsrc = 3, .ndst = 1},
 
     [BRW_OPCODE_SEND] = { .name = "send", .nsrc = 1, .ndst = 1 },
     [BRW_OPCODE_SENDC] = { .name = "sendc", .nsrc = 1, .ndst = 1 },
@@ -333,7 +343,7 @@ static const char * const math_function[16] = {
     [BRW_MATH_FUNCTION_SIN] = "sin",
     [BRW_MATH_FUNCTION_COS] = "cos",
     [BRW_MATH_FUNCTION_SINCOS] = "sincos",
-    [BRW_MATH_FUNCTION_TAN] = "tan",
+    [BRW_MATH_FUNCTION_FDIV] = "fdiv",
     [BRW_MATH_FUNCTION_POW] = "pow",
     [BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER] = "intdivmod",
     [BRW_MATH_FUNCTION_INT_DIV_QUOTIENT] = "intdiv",
@@ -458,6 +468,19 @@ static int print_opcode (FILE *file, int id)
     return 0;
 }
 
+static int three_source_type_to_reg_type(int three_source_type)
+{
+   switch (three_source_type) {
+   case BRW_3SRC_TYPE_F:
+      return BRW_REGISTER_TYPE_F;
+   case BRW_3SRC_TYPE_D:
+      return BRW_REGISTER_TYPE_D;
+   case BRW_3SRC_TYPE_UD:
+      return BRW_REGISTER_TYPE_UD;
+   }
+   return -1;
+}
+
 static int reg (FILE *file, GLuint _reg_file, GLuint _reg_nr)
 {
     int        err = 0;
@@ -524,7 +547,9 @@ static int dest (FILE *file, struct brw_instruction *inst)
            if (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);
+           string (file, "<");
+           err |= control (file, "horiz stride", horiz_stride, inst->bits1.da1.dest_horiz_stride, NULL);
+           string (file, ">");
            err |= control (file, "dest reg encoding", reg_encoding, inst->bits1.da1.dest_reg_type, NULL);
        }
        else
@@ -535,8 +560,9 @@ static int dest (FILE *file, struct brw_instruction *inst)
                                        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, "]");
-           format (file, "<%d>", inst->bits1.ia1.dest_horiz_stride);
+           string (file, "]<");
+           err |= control (file, "horiz stride", horiz_stride, inst->bits1.ia1.dest_horiz_stride, NULL);
+           string (file, ">");
            err |= control (file, "dest reg encoding", reg_encoding, inst->bits1.ia1.dest_reg_type, NULL);
        }
     }
@@ -581,7 +607,9 @@ static int dest_3src (FILE *file, struct brw_instruction *inst)
        format (file, ".%d", inst->bits1.da3src.dest_subreg_nr);
     string (file, "<1>");
     err |= control (file, "writemask", writemask, inst->bits1.da3src.dest_writemask, NULL);
-    err |= control (file, "dest reg encoding", reg_encoding, BRW_REGISTER_TYPE_F, NULL);
+    err |= control (file, "dest reg encoding", reg_encoding,
+                    three_source_type_to_reg_type(inst->bits1.da3src.dst_type),
+                    NULL);
 
     return 0;
 }
@@ -720,7 +748,8 @@ static int src0_3src (FILE *file, struct brw_instruction *inst)
        format (file, ".%d", inst->bits2.da3src.src0_subreg_nr);
     string (file, "<4,1,1>");
     err |= control (file, "src da16 reg type", reg_encoding,
-                   BRW_REGISTER_TYPE_F, NULL);
+                    three_source_type_to_reg_type(inst->bits1.da3src.src_type),
+                    NULL);
     /*
      * Three kinds of swizzle display:
      *  identity - nothing printed
@@ -772,7 +801,8 @@ static int src1_3src (FILE *file, struct brw_instruction *inst)
        format (file, ".%d", src1_subreg_nr);
     string (file, "<4,1,1>");
     err |= control (file, "src da16 reg type", reg_encoding,
-                   BRW_REGISTER_TYPE_F, NULL);
+                    three_source_type_to_reg_type(inst->bits1.da3src.src_type),
+                    NULL);
     /*
      * Three kinds of swizzle display:
      *  identity - nothing printed
@@ -823,7 +853,8 @@ static int src2_3src (FILE *file, struct brw_instruction *inst)
        format (file, ".%d", inst->bits3.da3src.src2_subreg_nr);
     string (file, "<4,1,1>");
     err |= control (file, "src da16 reg type", reg_encoding,
-                   BRW_REGISTER_TYPE_F, NULL);
+                    three_source_type_to_reg_type(inst->bits1.da3src.src_type),
+                    NULL);
     /*
      * Three kinds of swizzle display:
      *  identity - nothing printed
@@ -1069,10 +1100,24 @@ int brw_disasm (FILE *file, struct brw_instruction *inst, int gen)
        err |= control (file, "function", math_function,
                        inst->header.destreg__conditionalmod, NULL);
     } else if (inst->header.opcode != BRW_OPCODE_SEND &&
-              inst->header.opcode != BRW_OPCODE_SENDC)
+              inst->header.opcode != BRW_OPCODE_SENDC) {
        err |= control (file, "conditional modifier", conditional_modifier,
                        inst->header.destreg__conditionalmod, NULL);
 
+        /* If we're using the conditional modifier, print which flags reg is
+         * used for it.  Note that on gen6+, the embedded-condition SEL and
+         * control flow doesn't update flags.
+         */
+       if (inst->header.destreg__conditionalmod &&
+            (gen < 6 || (inst->header.opcode != BRW_OPCODE_SEL &&
+                         inst->header.opcode != BRW_OPCODE_IF &&
+                         inst->header.opcode != BRW_OPCODE_WHILE))) {
+           format (file, ".f%d", gen >= 7 ? inst->bits2.da1.flag_reg_nr : 0);
+           if (inst->bits2.da1.flag_subreg_nr)
+               format (file, ".%d", inst->bits2.da1.flag_subreg_nr);
+        }
+    }
+
     if (inst->header.opcode != BRW_OPCODE_NOP) {
        string (file, "(");
        err |= control (file, "execution size", exec_size, inst->header.execution_size, NULL);
@@ -1098,14 +1143,19 @@ int brw_disasm (FILE *file, struct brw_instruction *inst, int gen)
        if (opcode[inst->header.opcode].ndst > 0) {
          pad (file, 16);
          err |= dest (file, inst);
-       } else if (gen >= 6 && (inst->header.opcode == BRW_OPCODE_IF ||
+       } else if (gen == 7 && (inst->header.opcode == BRW_OPCODE_ELSE ||
+                              inst->header.opcode == BRW_OPCODE_ENDIF ||
+                              inst->header.opcode == BRW_OPCODE_WHILE)) {
+         format (file, " %d", inst->bits3.break_cont.jip);
+       } else if (gen == 6 && (inst->header.opcode == BRW_OPCODE_IF ||
                               inst->header.opcode == BRW_OPCODE_ELSE ||
                               inst->header.opcode == BRW_OPCODE_ENDIF ||
                               inst->header.opcode == BRW_OPCODE_WHILE)) {
          format (file, " %d", inst->bits1.branch_gen6.jump_count);
-       } else if (gen >= 6 && (inst->header.opcode == BRW_OPCODE_BREAK ||
-                              inst->header.opcode == BRW_OPCODE_CONTINUE ||
-                              inst->header.opcode == BRW_OPCODE_HALT)) {
+       } else if ((gen >= 6 && (inst->header.opcode == BRW_OPCODE_BREAK ||
+                                inst->header.opcode == BRW_OPCODE_CONTINUE ||
+                                inst->header.opcode == BRW_OPCODE_HALT)) ||
+                  (gen == 7 && inst->header.opcode == BRW_OPCODE_IF)) {
          format (file, " %d %d", inst->bits3.break_cont.uip, inst->bits3.break_cont.jip);
        } else if (inst->header.opcode == BRW_OPCODE_JMPI) {
          format (file, " %d", inst->bits3.d);