mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 13:58:04 +02:00
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 <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>
This commit is contained in:
parent
1cc7573162
commit
1530e27534
5 changed files with 42 additions and 14 deletions
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue