i965/disasm: Wrap opcode_desc look-up in a function.
authorFrancisco Jerez <currojerez@riseup.net>
Thu, 28 Apr 2016 07:19:14 +0000 (00:19 -0700)
committerMatt Turner <mattst88@gmail.com>
Wed, 4 May 2016 05:32:40 +0000 (22:32 -0700)
The function takes a device info struct as argument in addition to the
opcode number in order to disambiguate between multiple opcode_desc
entries for different instructions with the same opcode number.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> [v1]
[v2] mattst88: Put brw_opcode_desc() in brw_eu.c instead of moving it
               there in a later patch.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> [v2]
[v3] mattst88: Return NULL if opcode >= ARRAY_SIZE(opcode_descs)
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_disasm.c
src/mesa/drivers/dri/i965/brw_eu.c
src/mesa/drivers/dri/i965/brw_eu.h
src/mesa/drivers/dri/i965/brw_eu_validate.c
src/mesa/drivers/dri/i965/brw_shader.cpp

index 88bd7a499a71458327540c77b5c744a1b2d5bff6..9806c106c5c6110183ae9681d1fe04b72ac152fc 100644 (file)
@@ -28,6 +28,7 @@
 #include "brw_defines.h"
 #include "brw_reg.h"
 #include "brw_inst.h"
+#include "brw_eu.h"
 
 const struct opcode_desc opcode_descs[128] = {
    [BRW_OPCODE_MOV]      = { .name = "mov",     .nsrc = 1, .ndst = 1 },
@@ -705,13 +706,15 @@ control(FILE *file, const char *name, const char *const ctrl[],
 }
 
 static int
-print_opcode(FILE *file, int id)
+print_opcode(FILE *file, const struct brw_device_info *devinfo,
+             enum opcode id)
 {
-   if (!opcode_descs[id].name) {
+   const struct opcode_desc *desc = brw_opcode_desc(devinfo, id);
+   if (!desc) {
       format(file, "*** invalid opcode value %d ", id);
       return 1;
    }
-   string(file, opcode_descs[id].name);
+   string(file, desc->name);
    return 0;
 }
 
@@ -1277,6 +1280,7 @@ brw_disassemble_inst(FILE *file, const struct brw_device_info *devinfo,
    int space = 0;
 
    const enum opcode opcode = brw_inst_opcode(devinfo, inst);
+   const struct opcode_desc *desc = brw_opcode_desc(devinfo, opcode);
 
    if (brw_inst_pred_control(devinfo, inst)) {
       string(file, "(");
@@ -1295,7 +1299,7 @@ brw_disassemble_inst(FILE *file, const struct brw_device_info *devinfo,
       string(file, ") ");
    }
 
-   err |= print_opcode(file, opcode);
+   err |= print_opcode(file, devinfo, opcode);
    err |= control(file, "saturate", saturate, brw_inst_saturate(devinfo, inst),
                   NULL);
 
@@ -1366,7 +1370,7 @@ brw_disassemble_inst(FILE *file, const struct brw_device_info *devinfo,
    } else if (opcode == BRW_OPCODE_JMPI) {
       pad(file, 16);
       err |= src1(file, devinfo, inst);
-   } else if (opcode_descs[opcode].nsrc == 3) {
+   } else if (desc && desc->nsrc == 3) {
       pad(file, 16);
       err |= dest_3src(file, devinfo, inst);
 
@@ -1378,18 +1382,18 @@ brw_disassemble_inst(FILE *file, const struct brw_device_info *devinfo,
 
       pad(file, 64);
       err |= src2_3src(file, devinfo, inst);
-   } else {
-      if (opcode_descs[opcode].ndst > 0) {
+   } else if (desc) {
+      if (desc->ndst > 0) {
          pad(file, 16);
          err |= dest(file, devinfo, inst);
       }
 
-      if (opcode_descs[opcode].nsrc > 0) {
+      if (desc->nsrc > 0) {
          pad(file, 32);
          err |= src0(file, devinfo, inst);
       }
 
-      if (opcode_descs[opcode].nsrc > 1) {
+      if (desc->nsrc > 1) {
          pad(file, 48);
          err |= src1(file, devinfo, inst);
       }
@@ -1659,7 +1663,7 @@ brw_disassemble_inst(FILE *file, const struct brw_device_info *devinfo,
          err |= qtr_ctrl(file, devinfo, inst);
       else {
          if (brw_inst_qtr_control(devinfo, inst) == BRW_COMPRESSION_COMPRESSED &&
-             opcode_descs[opcode].ndst > 0 &&
+             desc && desc->ndst > 0 &&
              brw_inst_dst_reg_file(devinfo, inst) == BRW_MESSAGE_REGISTER_FILE &&
              brw_inst_dst_da_reg_nr(devinfo, inst) & BRW_MRF_COMPR4) {
             format(file, " compr4");
index 6961a88c6a8318c45b48e002aa2051ca0cb2d83f..279e9571e1acd10e92a2c4800302ad3d51894107 100644 (file)
@@ -339,3 +339,19 @@ brw_disassemble(const struct brw_device_info *devinfo,
       brw_disassemble_inst(out, devinfo, insn, compacted);
    }
 }
+
+/* Return the matching opcode_desc for the specified opcode number and
+ * hardware generation, or NULL if the opcode is not supported by the device.
+ * XXX -- Actually check whether the opcode is supported.
+ */
+const struct opcode_desc *
+brw_opcode_desc(const struct brw_device_info *devinfo, enum opcode opcode)
+{
+   if (opcode >= ARRAY_SIZE(opcode_descs))
+      return NULL;
+
+   if (opcode_descs[opcode].name)
+      return &opcode_descs[opcode];
+   else
+      return NULL;
+}
index 89b4e7f9c4b3c6e284bc880c6c51df09a6b8bb13..563a105d9f0721202c9581924ccacc4bd9678396 100644 (file)
@@ -545,10 +545,14 @@ next_offset(const struct brw_device_info *devinfo, void *store, int offset)
       return offset + 16;
 }
 
+const struct opcode_desc *
+brw_opcode_desc(const struct brw_device_info *devinfo, enum opcode opcode);
+
 static inline bool
 is_3src(const struct brw_device_info *devinfo, enum opcode opcode)
 {
-   return opcode_descs[opcode].nsrc == 3;
+   const struct opcode_desc *desc = brw_opcode_desc(devinfo, opcode);
+   return desc && desc->nsrc == 3;
 }
 
 /** Maximum SEND message length */
index 2de2ea1babc3ef26004cadd4bc667a275993e5fb..75e161b19a550be75be4ffb33f3a19b528be3086 100644 (file)
@@ -300,6 +300,8 @@ static unsigned
 num_sources_from_inst(const struct brw_device_info *devinfo,
                       const brw_inst *inst)
 {
+   const struct opcode_desc *desc =
+      brw_opcode_desc(devinfo, brw_inst_opcode(devinfo, inst));
    unsigned math_function;
 
    if (brw_inst_opcode(devinfo, inst) == BRW_OPCODE_MATH) {
@@ -314,8 +316,10 @@ num_sources_from_inst(const struct brw_device_info *devinfo,
           */
          return 0;
       }
+   } else if (desc) {
+      return desc->nsrc;
    } else {
-      return opcode_descs[brw_inst_opcode(devinfo, inst)].nsrc;
+      return 0;
    }
 
    switch (math_function) {
index d417d3dd4a8bd889d7ea9d1533ae82b7fa739dc5..068244b299d0bcf4ab2a44075b782f08a665fc1f 100644 (file)
@@ -167,8 +167,8 @@ brw_instruction_name(const struct brw_device_info *devinfo, enum opcode op)
 {
    switch (op) {
    case BRW_OPCODE_ILLEGAL ... BRW_OPCODE_NOP:
-      assert(opcode_descs[op].name);
-      return opcode_descs[op].name;
+      assert(brw_opcode_desc(devinfo, op)->name);
+      return brw_opcode_desc(devinfo, op)->name;
    case FS_OPCODE_FB_WRITE:
       return "fb_write";
    case FS_OPCODE_FB_WRITE_LOGICAL: