i965: Replace reg_type_size[] with a function.
A function is necessary to handle immediate types. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
ada891d472
commit
df0b7bcdfd
|
@ -257,20 +257,6 @@ static const char *const three_source_reg_encoding[] = {
|
||||||
[BRW_3SRC_TYPE_DF] = "DF",
|
[BRW_3SRC_TYPE_DF] = "DF",
|
||||||
};
|
};
|
||||||
|
|
||||||
const int reg_type_size[] = {
|
|
||||||
[BRW_HW_REG_TYPE_UD] = 4,
|
|
||||||
[BRW_HW_REG_TYPE_D] = 4,
|
|
||||||
[BRW_HW_REG_TYPE_UW] = 2,
|
|
||||||
[BRW_HW_REG_TYPE_W] = 2,
|
|
||||||
[BRW_HW_REG_NON_IMM_TYPE_UB] = 1,
|
|
||||||
[BRW_HW_REG_NON_IMM_TYPE_B] = 1,
|
|
||||||
[GEN7_HW_REG_NON_IMM_TYPE_DF] = 8,
|
|
||||||
[BRW_HW_REG_TYPE_F] = 4,
|
|
||||||
[GEN8_HW_REG_TYPE_UQ] = 8,
|
|
||||||
[GEN8_HW_REG_TYPE_Q] = 8,
|
|
||||||
[GEN8_HW_REG_NON_IMM_TYPE_HF] = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *const reg_file[4] = {
|
static const char *const reg_file[4] = {
|
||||||
[0] = "A",
|
[0] = "A",
|
||||||
[1] = "g",
|
[1] = "g",
|
||||||
|
@ -734,6 +720,7 @@ reg(FILE *file, unsigned _reg_file, unsigned _reg_nr)
|
||||||
static int
|
static int
|
||||||
dest(FILE *file, const struct gen_device_info *devinfo, brw_inst *inst)
|
dest(FILE *file, const struct gen_device_info *devinfo, brw_inst *inst)
|
||||||
{
|
{
|
||||||
|
unsigned elem_size = brw_element_size(devinfo, inst, dst);
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
|
if (brw_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
|
||||||
|
@ -744,7 +731,7 @@ dest(FILE *file, const struct gen_device_info *devinfo, brw_inst *inst)
|
||||||
return 0;
|
return 0;
|
||||||
if (brw_inst_dst_da1_subreg_nr(devinfo, inst))
|
if (brw_inst_dst_da1_subreg_nr(devinfo, inst))
|
||||||
format(file, ".%"PRIu64, brw_inst_dst_da1_subreg_nr(devinfo, inst) /
|
format(file, ".%"PRIu64, brw_inst_dst_da1_subreg_nr(devinfo, inst) /
|
||||||
reg_type_size[brw_inst_dst_reg_type(devinfo, inst)]);
|
elem_size);
|
||||||
string(file, "<");
|
string(file, "<");
|
||||||
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);
|
||||||
|
@ -755,7 +742,7 @@ dest(FILE *file, const struct gen_device_info *devinfo, brw_inst *inst)
|
||||||
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))
|
||||||
format(file, ".%"PRIu64, brw_inst_dst_ia_subreg_nr(devinfo, inst) /
|
format(file, ".%"PRIu64, brw_inst_dst_ia_subreg_nr(devinfo, inst) /
|
||||||
reg_type_size[brw_inst_dst_reg_type(devinfo, inst)]);
|
elem_size);
|
||||||
if (brw_inst_dst_ia1_addr_imm(devinfo, inst))
|
if (brw_inst_dst_ia1_addr_imm(devinfo, inst))
|
||||||
format(file, " %d", brw_inst_dst_ia1_addr_imm(devinfo, inst));
|
format(file, " %d", brw_inst_dst_ia1_addr_imm(devinfo, inst));
|
||||||
string(file, "]<");
|
string(file, "]<");
|
||||||
|
@ -772,8 +759,7 @@ dest(FILE *file, const struct gen_device_info *devinfo, brw_inst *inst)
|
||||||
if (err == -1)
|
if (err == -1)
|
||||||
return 0;
|
return 0;
|
||||||
if (brw_inst_dst_da16_subreg_nr(devinfo, inst))
|
if (brw_inst_dst_da16_subreg_nr(devinfo, inst))
|
||||||
format(file, ".%u", 16 /
|
format(file, ".%u", 16 / elem_size);
|
||||||
reg_type_size[brw_inst_dst_reg_type(devinfo, 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);
|
||||||
|
@ -850,8 +836,10 @@ src_da1(FILE *file,
|
||||||
err |= reg(file, _reg_file, reg_num);
|
err |= reg(file, _reg_file, reg_num);
|
||||||
if (err == -1)
|
if (err == -1)
|
||||||
return 0;
|
return 0;
|
||||||
if (sub_reg_num)
|
if (sub_reg_num) {
|
||||||
format(file, ".%d", sub_reg_num / reg_type_size[type]); /* use formal style like spec */
|
unsigned elem_size = brw_hw_reg_type_to_size(devinfo, type, _reg_file);
|
||||||
|
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);
|
err |= control(file, "src reg encoding", reg_encoding, type, NULL);
|
||||||
return err;
|
return err;
|
||||||
|
@ -936,10 +924,14 @@ src_da16(FILE *file,
|
||||||
err |= reg(file, _reg_file, _reg_nr);
|
err |= reg(file, _reg_file, _reg_nr);
|
||||||
if (err == -1)
|
if (err == -1)
|
||||||
return 0;
|
return 0;
|
||||||
if (_subreg_nr)
|
if (_subreg_nr) {
|
||||||
|
unsigned elem_size =
|
||||||
|
brw_hw_reg_type_to_size(devinfo, _reg_type, _reg_file);
|
||||||
|
|
||||||
/* bit4 for subreg number byte addressing. Make this same meaning as
|
/* bit4 for subreg number byte addressing. Make this same meaning as
|
||||||
in da1 case, so output looks consistent. */
|
in da1 case, so output looks consistent. */
|
||||||
format(file, ".%d", 16 / reg_type_size[_reg_type]);
|
format(file, ".%d", 16 / elem_size);
|
||||||
|
}
|
||||||
string(file, "<");
|
string(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, ">");
|
||||||
|
|
|
@ -141,6 +141,57 @@ brw_reg_type_to_hw_type(const struct gen_device_info *devinfo,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the element size given a hardware register type and file.
|
||||||
|
*
|
||||||
|
* The hardware encoding may depend on whether the value is an immediate.
|
||||||
|
*/
|
||||||
|
unsigned
|
||||||
|
brw_hw_reg_type_to_size(const struct gen_device_info *devinfo,
|
||||||
|
unsigned type, enum brw_reg_file file)
|
||||||
|
{
|
||||||
|
if (file == BRW_IMMEDIATE_VALUE) {
|
||||||
|
static const unsigned imm_hw_sizes[] = {
|
||||||
|
[BRW_HW_REG_TYPE_UD] = 4,
|
||||||
|
[BRW_HW_REG_TYPE_D] = 4,
|
||||||
|
[BRW_HW_REG_TYPE_UW] = 2,
|
||||||
|
[BRW_HW_REG_TYPE_W] = 2,
|
||||||
|
[BRW_HW_REG_IMM_TYPE_UV] = 2,
|
||||||
|
[BRW_HW_REG_IMM_TYPE_VF] = 4,
|
||||||
|
[BRW_HW_REG_IMM_TYPE_V] = 2,
|
||||||
|
[BRW_HW_REG_TYPE_F] = 4,
|
||||||
|
[GEN8_HW_REG_TYPE_UQ] = 8,
|
||||||
|
[GEN8_HW_REG_TYPE_Q] = 8,
|
||||||
|
[GEN8_HW_REG_IMM_TYPE_DF] = 8,
|
||||||
|
[GEN8_HW_REG_IMM_TYPE_HF] = 2,
|
||||||
|
};
|
||||||
|
assert(type < ARRAY_SIZE(imm_hw_sizes));
|
||||||
|
assert(devinfo->gen >= 6 || type != BRW_HW_REG_IMM_TYPE_UV);
|
||||||
|
assert(devinfo->gen >= 8 || type <= BRW_HW_REG_TYPE_F);
|
||||||
|
return imm_hw_sizes[type];
|
||||||
|
} else {
|
||||||
|
/* Non-immediate registers */
|
||||||
|
static const unsigned hw_sizes[] = {
|
||||||
|
[BRW_HW_REG_TYPE_UD] = 4,
|
||||||
|
[BRW_HW_REG_TYPE_D] = 4,
|
||||||
|
[BRW_HW_REG_TYPE_UW] = 2,
|
||||||
|
[BRW_HW_REG_TYPE_W] = 2,
|
||||||
|
[BRW_HW_REG_NON_IMM_TYPE_UB] = 1,
|
||||||
|
[BRW_HW_REG_NON_IMM_TYPE_B] = 1,
|
||||||
|
[GEN7_HW_REG_NON_IMM_TYPE_DF] = 8,
|
||||||
|
[BRW_HW_REG_TYPE_F] = 4,
|
||||||
|
[GEN8_HW_REG_TYPE_UQ] = 8,
|
||||||
|
[GEN8_HW_REG_TYPE_Q] = 8,
|
||||||
|
[GEN8_HW_REG_NON_IMM_TYPE_HF] = 2,
|
||||||
|
};
|
||||||
|
assert(type < ARRAY_SIZE(hw_sizes));
|
||||||
|
assert(devinfo->gen >= 7 ||
|
||||||
|
(type < GEN7_HW_REG_NON_IMM_TYPE_DF || type == BRW_HW_REG_TYPE_F));
|
||||||
|
assert(devinfo->gen >= 8 || type <= BRW_HW_REG_TYPE_F);
|
||||||
|
return hw_sizes[type];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
brw_set_dest(struct brw_codegen *p, brw_inst *inst, struct brw_reg dest)
|
brw_set_dest(struct brw_codegen *p, brw_inst *inst, struct brw_reg dest)
|
||||||
{
|
{
|
||||||
|
@ -219,8 +270,6 @@ brw_set_dest(struct brw_codegen *p, brw_inst *inst, struct brw_reg dest)
|
||||||
brw_inst_set_exec_size(devinfo, inst, dest.width);
|
brw_inst_set_exec_size(devinfo, inst, dest.width);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int reg_type_size[];
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
validate_reg(const struct gen_device_info *devinfo,
|
validate_reg(const struct gen_device_info *devinfo,
|
||||||
brw_inst *inst, struct brw_reg reg)
|
brw_inst *inst, struct brw_reg reg)
|
||||||
|
@ -237,8 +286,9 @@ validate_reg(const struct gen_device_info *devinfo,
|
||||||
* destination horiz stride has to be a word.
|
* destination horiz stride has to be a word.
|
||||||
*/
|
*/
|
||||||
if (reg.type == BRW_REGISTER_TYPE_V) {
|
if (reg.type == BRW_REGISTER_TYPE_V) {
|
||||||
|
unsigned elem_size = brw_element_size(devinfo, inst, dst);
|
||||||
assert(hstride_for_reg[brw_inst_dst_hstride(devinfo, inst)] *
|
assert(hstride_for_reg[brw_inst_dst_hstride(devinfo, inst)] *
|
||||||
reg_type_size[brw_inst_dst_reg_type(devinfo, inst)] == 2);
|
elem_size == 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -230,6 +230,14 @@ enum PACKED brw_reg_type {
|
||||||
|
|
||||||
unsigned brw_reg_type_to_hw_type(const struct gen_device_info *devinfo,
|
unsigned brw_reg_type_to_hw_type(const struct gen_device_info *devinfo,
|
||||||
enum brw_reg_type type, enum brw_reg_file file);
|
enum brw_reg_type type, enum brw_reg_file file);
|
||||||
|
|
||||||
|
#define brw_element_size(devinfo, inst, operand) \
|
||||||
|
brw_hw_reg_type_to_size(devinfo, \
|
||||||
|
brw_inst_ ## operand ## _reg_type(devinfo, inst), \
|
||||||
|
brw_inst_ ## operand ## _reg_file(devinfo, inst))
|
||||||
|
unsigned brw_hw_reg_type_to_size(const struct gen_device_info *devinfo,
|
||||||
|
unsigned type, enum brw_reg_file file);
|
||||||
|
|
||||||
const char *brw_reg_type_letters(unsigned brw_reg_type);
|
const char *brw_reg_type_letters(unsigned brw_reg_type);
|
||||||
uint32_t brw_swizzle_immediate(enum brw_reg_type type, uint32_t x, unsigned swz);
|
uint32_t brw_swizzle_immediate(enum brw_reg_type type, uint32_t x, unsigned swz);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue