i965: Add brw_hw_reg_type_to_letters() and use it in brw_disasm.c
Reviewed-by: Scott D Phillips <scott.d.phillips@intel.com>
This commit is contained in:
@@ -237,21 +237,6 @@ static const char *const access_mode[2] = {
|
|||||||
[1] = "align16",
|
[1] = "align16",
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const reg_encoding[] = {
|
|
||||||
[BRW_HW_REG_TYPE_UD] = "UD",
|
|
||||||
[BRW_HW_REG_TYPE_D] = "D",
|
|
||||||
[BRW_HW_REG_TYPE_UW] = "UW",
|
|
||||||
[BRW_HW_REG_TYPE_W] = "W",
|
|
||||||
[BRW_HW_REG_TYPE_F] = "F",
|
|
||||||
[GEN8_HW_REG_TYPE_UQ] = "UQ",
|
|
||||||
[GEN8_HW_REG_TYPE_Q] = "Q",
|
|
||||||
|
|
||||||
[BRW_HW_REG_TYPE_UB] = "UB",
|
|
||||||
[BRW_HW_REG_TYPE_B] = "B",
|
|
||||||
[GEN7_HW_REG_TYPE_DF] = "DF",
|
|
||||||
[GEN8_HW_REG_TYPE_HF] = "HF",
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *const three_source_reg_encoding[] = {
|
static const char *const three_source_reg_encoding[] = {
|
||||||
[BRW_3SRC_TYPE_F] = "F",
|
[BRW_3SRC_TYPE_F] = "F",
|
||||||
[BRW_3SRC_TYPE_D] = "D",
|
[BRW_3SRC_TYPE_D] = "D",
|
||||||
@@ -738,8 +723,10 @@ dest(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst)
|
|||||||
err |= control(file, "horiz stride", horiz_stride,
|
err |= control(file, "horiz stride", horiz_stride,
|
||||||
brw_inst_dst_hstride(devinfo, inst), NULL);
|
brw_inst_dst_hstride(devinfo, inst), NULL);
|
||||||
string(file, ">");
|
string(file, ">");
|
||||||
err |= control(file, "dest reg encoding", reg_encoding,
|
string(file,
|
||||||
brw_inst_dst_reg_hw_type(devinfo, inst), NULL);
|
brw_hw_reg_type_to_letters(devinfo,
|
||||||
|
brw_inst_dst_reg_file(devinfo, inst),
|
||||||
|
brw_inst_dst_reg_hw_type(devinfo, inst)));
|
||||||
} else {
|
} else {
|
||||||
string(file, "g[a0");
|
string(file, "g[a0");
|
||||||
if (brw_inst_dst_ia_subreg_nr(devinfo, inst))
|
if (brw_inst_dst_ia_subreg_nr(devinfo, inst))
|
||||||
@@ -751,8 +738,10 @@ dest(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst)
|
|||||||
err |= control(file, "horiz stride", horiz_stride,
|
err |= control(file, "horiz stride", horiz_stride,
|
||||||
brw_inst_dst_hstride(devinfo, inst), NULL);
|
brw_inst_dst_hstride(devinfo, inst), NULL);
|
||||||
string(file, ">");
|
string(file, ">");
|
||||||
err |= control(file, "dest reg encoding", reg_encoding,
|
string(file,
|
||||||
brw_inst_dst_reg_hw_type(devinfo, inst), NULL);
|
brw_hw_reg_type_to_letters(devinfo,
|
||||||
|
brw_inst_dst_reg_file(devinfo, inst),
|
||||||
|
brw_inst_dst_reg_hw_type(devinfo, inst)));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (brw_inst_dst_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
|
if (brw_inst_dst_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
|
||||||
@@ -765,8 +754,10 @@ dest(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst)
|
|||||||
string(file, "<1>");
|
string(file, "<1>");
|
||||||
err |= control(file, "writemask", writemask,
|
err |= control(file, "writemask", writemask,
|
||||||
brw_inst_da16_writemask(devinfo, inst), NULL);
|
brw_inst_da16_writemask(devinfo, inst), NULL);
|
||||||
err |= control(file, "dest reg encoding", reg_encoding,
|
string(file,
|
||||||
brw_inst_dst_reg_hw_type(devinfo, inst), NULL);
|
brw_hw_reg_type_to_letters(devinfo,
|
||||||
|
brw_inst_dst_reg_file(devinfo, inst),
|
||||||
|
brw_inst_dst_reg_hw_type(devinfo, inst)));
|
||||||
} else {
|
} else {
|
||||||
err = 1;
|
err = 1;
|
||||||
string(file, "Indirect align16 address mode not supported");
|
string(file, "Indirect align16 address mode not supported");
|
||||||
@@ -843,7 +834,7 @@ src_da1(FILE *file,
|
|||||||
format(file, ".%d", sub_reg_num / elem_size); /* use formal style like spec */
|
format(file, ".%d", sub_reg_num / elem_size); /* use formal style like spec */
|
||||||
}
|
}
|
||||||
src_align1_region(file, _vert_stride, _width, _horiz_stride);
|
src_align1_region(file, _vert_stride, _width, _horiz_stride);
|
||||||
err |= control(file, "src reg encoding", reg_encoding, type, NULL);
|
string(file, brw_hw_reg_type_to_letters(devinfo, _reg_file, type));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -875,7 +866,7 @@ src_ia1(FILE *file,
|
|||||||
format(file, " %d", _addr_imm);
|
format(file, " %d", _addr_imm);
|
||||||
string(file, "]");
|
string(file, "]");
|
||||||
src_align1_region(file, _vert_stride, _width, _horiz_stride);
|
src_align1_region(file, _vert_stride, _width, _horiz_stride);
|
||||||
err |= control(file, "src reg encoding", reg_encoding, type, NULL);
|
string(file, brw_hw_reg_type_to_letters(devinfo, _reg_file, type));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -938,7 +929,7 @@ src_da16(FILE *file,
|
|||||||
err |= control(file, "vert stride", vert_stride, _vert_stride, NULL);
|
err |= control(file, "vert stride", vert_stride, _vert_stride, NULL);
|
||||||
string(file, ">");
|
string(file, ">");
|
||||||
err |= src_swizzle(file, BRW_SWIZZLE4(swz_x, swz_y, swz_z, swz_w));
|
err |= src_swizzle(file, BRW_SWIZZLE4(swz_x, swz_y, swz_z, swz_w));
|
||||||
err |= control(file, "src da16 reg type", reg_encoding, _reg_type, NULL);
|
string(file, brw_hw_reg_type_to_letters(devinfo, _reg_file, _reg_type));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1025,50 +1016,53 @@ src2_3src(FILE *file, const struct gen_device_info *devinfo, const brw_inst *ins
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
imm(FILE *file, const struct gen_device_info *devinfo, enum hw_imm_type type,
|
imm(FILE *file, const struct gen_device_info *devinfo, enum brw_reg_type type,
|
||||||
const brw_inst *inst)
|
const brw_inst *inst)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case GEN8_HW_IMM_TYPE_UQ:
|
case BRW_REGISTER_TYPE_UQ:
|
||||||
format(file, "0x%16lxUD", brw_inst_imm_uq(devinfo, inst));
|
format(file, "0x%16lxUD", brw_inst_imm_uq(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case GEN8_HW_IMM_TYPE_Q:
|
case BRW_REGISTER_TYPE_Q:
|
||||||
format(file, "%ldD", brw_inst_imm_uq(devinfo, inst));
|
format(file, "%ldD", brw_inst_imm_uq(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case BRW_HW_IMM_TYPE_UD:
|
case BRW_REGISTER_TYPE_UD:
|
||||||
format(file, "0x%08xUD", brw_inst_imm_ud(devinfo, inst));
|
format(file, "0x%08xUD", brw_inst_imm_ud(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case BRW_HW_IMM_TYPE_D:
|
case BRW_REGISTER_TYPE_D:
|
||||||
format(file, "%dD", brw_inst_imm_d(devinfo, inst));
|
format(file, "%dD", brw_inst_imm_d(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case BRW_HW_IMM_TYPE_UW:
|
case BRW_REGISTER_TYPE_UW:
|
||||||
format(file, "0x%04xUW", (uint16_t) brw_inst_imm_ud(devinfo, inst));
|
format(file, "0x%04xUW", (uint16_t) brw_inst_imm_ud(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case BRW_HW_IMM_TYPE_W:
|
case BRW_REGISTER_TYPE_W:
|
||||||
format(file, "%dW", (int16_t) brw_inst_imm_d(devinfo, inst));
|
format(file, "%dW", (int16_t) brw_inst_imm_d(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case BRW_HW_IMM_TYPE_UV:
|
case BRW_REGISTER_TYPE_UV:
|
||||||
format(file, "0x%08xUV", brw_inst_imm_ud(devinfo, inst));
|
format(file, "0x%08xUV", brw_inst_imm_ud(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case BRW_HW_IMM_TYPE_VF:
|
case BRW_REGISTER_TYPE_VF:
|
||||||
format(file, "[%-gF, %-gF, %-gF, %-gF]VF",
|
format(file, "[%-gF, %-gF, %-gF, %-gF]VF",
|
||||||
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst)),
|
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst)),
|
||||||
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 8),
|
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 8),
|
||||||
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 16),
|
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 16),
|
||||||
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 24));
|
brw_vf_to_float(brw_inst_imm_ud(devinfo, inst) >> 24));
|
||||||
break;
|
break;
|
||||||
case BRW_HW_IMM_TYPE_V:
|
case BRW_REGISTER_TYPE_V:
|
||||||
format(file, "0x%08xV", brw_inst_imm_ud(devinfo, inst));
|
format(file, "0x%08xV", brw_inst_imm_ud(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case BRW_HW_IMM_TYPE_F:
|
case BRW_REGISTER_TYPE_F:
|
||||||
format(file, "%-gF", brw_inst_imm_f(devinfo, inst));
|
format(file, "%-gF", brw_inst_imm_f(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case GEN8_HW_IMM_TYPE_DF:
|
case BRW_REGISTER_TYPE_DF:
|
||||||
format(file, "%-gDF", brw_inst_imm_df(devinfo, inst));
|
format(file, "%-gDF", brw_inst_imm_df(devinfo, inst));
|
||||||
break;
|
break;
|
||||||
case GEN8_HW_IMM_TYPE_HF:
|
case BRW_REGISTER_TYPE_HF:
|
||||||
string(file, "Half Float IMM");
|
string(file, "Half Float IMM");
|
||||||
break;
|
break;
|
||||||
|
case BRW_REGISTER_TYPE_UB:
|
||||||
|
case BRW_REGISTER_TYPE_B:
|
||||||
|
format(file, "*** invalid immediate type %d ", type);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1077,7 +1071,7 @@ static int
|
|||||||
src0(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst)
|
src0(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst)
|
||||||
{
|
{
|
||||||
if (brw_inst_src0_reg_file(devinfo, inst) == BRW_IMMEDIATE_VALUE) {
|
if (brw_inst_src0_reg_file(devinfo, inst) == BRW_IMMEDIATE_VALUE) {
|
||||||
return imm(file, devinfo, brw_inst_src0_reg_hw_type(devinfo, inst), inst);
|
return imm(file, devinfo, brw_inst_src0_type(devinfo, inst), inst);
|
||||||
} else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
|
} else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
|
||||||
if (brw_inst_src0_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
|
if (brw_inst_src0_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
|
||||||
return src_da1(file,
|
return src_da1(file,
|
||||||
@@ -1133,7 +1127,7 @@ static int
|
|||||||
src1(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst)
|
src1(FILE *file, const struct gen_device_info *devinfo, const brw_inst *inst)
|
||||||
{
|
{
|
||||||
if (brw_inst_src1_reg_file(devinfo, inst) == BRW_IMMEDIATE_VALUE) {
|
if (brw_inst_src1_reg_file(devinfo, inst) == BRW_IMMEDIATE_VALUE) {
|
||||||
return imm(file, devinfo, brw_inst_src1_reg_hw_type(devinfo, inst), inst);
|
return imm(file, devinfo, brw_inst_src1_type(devinfo, inst), inst);
|
||||||
} else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
|
} else if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
|
||||||
if (brw_inst_src1_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
|
if (brw_inst_src1_address_mode(devinfo, inst) == BRW_ADDRESS_DIRECT) {
|
||||||
return src_da1(file,
|
return src_da1(file,
|
||||||
|
@@ -154,3 +154,11 @@ brw_reg_type_to_letters(enum brw_reg_type type)
|
|||||||
assert(type < ARRAY_SIZE(letters));
|
assert(type < ARRAY_SIZE(letters));
|
||||||
return letters[type];
|
return letters[type];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
brw_hw_reg_type_to_letters(const struct gen_device_info *devinfo,
|
||||||
|
enum brw_reg_file file, unsigned hw_type)
|
||||||
|
{
|
||||||
|
enum brw_reg_type type = brw_hw_type_to_reg_type(devinfo, file, hw_type);
|
||||||
|
return brw_reg_type_to_letters(type);
|
||||||
|
}
|
||||||
|
@@ -78,6 +78,10 @@ brw_hw_reg_type_to_size(const struct gen_device_info *devinfo,
|
|||||||
const char *
|
const char *
|
||||||
brw_reg_type_to_letters(enum brw_reg_type type);
|
brw_reg_type_to_letters(enum brw_reg_type type);
|
||||||
|
|
||||||
|
const char *
|
||||||
|
brw_hw_reg_type_to_letters(const struct gen_device_info *devinfo,
|
||||||
|
enum brw_reg_file file, unsigned hw_type);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user