summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFrancisco Jerez <[email protected]>2016-04-28 00:19:14 -0700
committerMatt Turner <[email protected]>2016-05-03 22:32:40 -0700
commit1530e27534831a8d1c82e0a82fe15cd9c70e61e6 (patch)
tree0cc9e88a5cf3e806452b58a27aaa682bcfcebc4a /src
parent1cc7573162a7f0e8346d7abab50890c58a0dce9a (diff)
i965/disasm: Wrap opcode_desc look-up in a function.
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 <[email protected]> [v1] [v2] mattst88: Put brw_opcode_desc() in brw_eu.c instead of moving it there in a later patch. Reviewed-by: Kenneth Graunke <[email protected]> [v2] [v3] mattst88: Return NULL if opcode >= ARRAY_SIZE(opcode_descs) Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_disasm.c24
-rw-r--r--src/mesa/drivers/dri/i965/brw_eu.c16
-rw-r--r--src/mesa/drivers/dri/i965/brw_eu.h6
-rw-r--r--src/mesa/drivers/dri/i965/brw_eu_validate.c6
-rw-r--r--src/mesa/drivers/dri/i965/brw_shader.cpp4
5 files changed, 42 insertions, 14 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c
index 88bd7a499a7..9806c106c5c 100644
--- a/src/mesa/drivers/dri/i965/brw_disasm.c
+++ b/src/mesa/drivers/dri/i965/brw_disasm.c
@@ -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");
diff --git a/src/mesa/drivers/dri/i965/brw_eu.c b/src/mesa/drivers/dri/i965/brw_eu.c
index 6961a88c6a8..279e9571e1a 100644
--- a/src/mesa/drivers/dri/i965/brw_eu.c
+++ b/src/mesa/drivers/dri/i965/brw_eu.c
@@ -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;
+}
diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h
index 89b4e7f9c4b..563a105d9f0 100644
--- a/src/mesa/drivers/dri/i965/brw_eu.h
+++ b/src/mesa/drivers/dri/i965/brw_eu.h
@@ -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 */
diff --git a/src/mesa/drivers/dri/i965/brw_eu_validate.c b/src/mesa/drivers/dri/i965/brw_eu_validate.c
index 2de2ea1babc..75e161b19a5 100644
--- a/src/mesa/drivers/dri/i965/brw_eu_validate.c
+++ b/src/mesa/drivers/dri/i965/brw_eu_validate.c
@@ -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) {
diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp
index d417d3dd4a8..068244b299d 100644
--- a/src/mesa/drivers/dri/i965/brw_shader.cpp
+++ b/src/mesa/drivers/dri/i965/brw_shader.cpp
@@ -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: