[Mesa-dev] [PATCH] i965/fs: Replace subreg_offset with brw_reg's subnr.
Matt Turner
mattst88 at gmail.com
Thu Feb 11 21:49:21 UTC 2016
---
src/mesa/drivers/dri/i965/brw_fs.cpp | 31 +++++++++++-----------
.../drivers/dri/i965/brw_fs_combine_constants.cpp | 13 +++++----
.../drivers/dri/i965/brw_fs_copy_propagation.cpp | 14 +++++-----
src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 2 +-
src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 9 ++-----
src/mesa/drivers/dri/i965/brw_ir_fs.h | 13 +++------
6 files changed, 35 insertions(+), 47 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 41a3f81..6ee590e 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -432,7 +432,6 @@ fs_reg::fs_reg(struct ::brw_reg reg) :
backend_reg(reg)
{
this->reg_offset = 0;
- this->subreg_offset = 0;
this->reladdr = NULL;
this->stride = 1;
if (this->file == IMM &&
@@ -447,7 +446,6 @@ bool
fs_reg::equals(const fs_reg &r) const
{
return (this->backend_reg::equals(r) &&
- subreg_offset == r.subreg_offset &&
!reladdr && !r.reladdr &&
stride == r.stride);
}
@@ -456,7 +454,8 @@ fs_reg &
fs_reg::set_smear(unsigned subreg)
{
assert(file != ARF && file != FIXED_GRF && file != IMM);
- subreg_offset = subreg * type_sz(type);
+ assert(subreg * type_sz(type) < (1 << 5)); /* subnr is 5 bits */
+ subnr = subreg * type_sz(type);
stride = 0;
return *this;
}
@@ -1513,7 +1512,7 @@ fs_visitor::assign_curb_setup()
assert(inst->src[i].stride == 0);
inst->src[i] = byte_offset(
retype(brw_reg, inst->src[i].type),
- inst->src[i].subreg_offset);
+ inst->src[i].subnr);
}
}
}
@@ -1653,7 +1652,7 @@ fs_visitor::convert_attr_sources_to_hw_regs(fs_inst *inst)
unsigned width = inst->src[i].stride == 0 ? 1 : inst->exec_size;
struct brw_reg reg =
stride(byte_offset(retype(brw_vec8_grf(grf, 0), inst->src[i].type),
- inst->src[i].subreg_offset),
+ inst->src[i].subnr),
inst->exec_size * inst->src[i].stride,
width, inst->src[i].stride);
reg.abs = inst->src[i].abs;
@@ -2597,7 +2596,7 @@ fs_visitor::compute_to_mrf()
inst->dst.type != inst->src[0].type ||
inst->src[0].abs || inst->src[0].negate ||
!inst->src[0].is_contiguous() ||
- inst->src[0].subreg_offset)
+ inst->src[0].subnr)
continue;
/* Work out which hardware MRF registers are written by this
@@ -3367,7 +3366,7 @@ fs_visitor::lower_integer_multiplication()
assert(src1_1_w.stride == 1);
src1_1_w.stride = 2;
}
- src1_1_w.subreg_offset += type_sz(BRW_REGISTER_TYPE_UW);
+ src1_1_w.subnr += type_sz(BRW_REGISTER_TYPE_UW);
}
ibld.MUL(low, inst->src[0], src1_0_w);
ibld.MUL(high, inst->src[0], src1_1_w);
@@ -3386,7 +3385,7 @@ fs_visitor::lower_integer_multiplication()
assert(src0_1_w.stride == 1);
src0_1_w.stride = 2;
}
- src0_1_w.subreg_offset += type_sz(BRW_REGISTER_TYPE_UW);
+ src0_1_w.subnr += type_sz(BRW_REGISTER_TYPE_UW);
ibld.MUL(low, src0_0_w, inst->src[1]);
ibld.MUL(high, src0_1_w, inst->src[1]);
@@ -3394,14 +3393,14 @@ fs_visitor::lower_integer_multiplication()
fs_reg dst = inst->dst;
dst.type = BRW_REGISTER_TYPE_UW;
- dst.subreg_offset = 2;
+ dst.subnr = 2;
dst.stride = 2;
high.type = BRW_REGISTER_TYPE_UW;
high.stride = 2;
low.type = BRW_REGISTER_TYPE_UW;
- low.subreg_offset = 2;
+ low.subnr = 2;
low.stride = 2;
ibld.ADD(dst, low, high);
@@ -4642,9 +4641,9 @@ fs_visitor::dump_instruction(backend_instruction *be_inst, FILE *file)
case VGRF:
fprintf(file, "vgrf%d", inst->dst.nr);
if (alloc.sizes[inst->dst.nr] != inst->regs_written ||
- inst->dst.subreg_offset)
+ inst->dst.subnr)
fprintf(file, "+%d.%d",
- inst->dst.reg_offset, inst->dst.subreg_offset);
+ inst->dst.reg_offset, inst->dst.subnr);
break;
case FIXED_GRF:
fprintf(file, "g%d", inst->dst.nr);
@@ -4698,9 +4697,9 @@ fs_visitor::dump_instruction(backend_instruction *be_inst, FILE *file)
case VGRF:
fprintf(file, "vgrf%d", inst->src[i].nr);
if (alloc.sizes[inst->src[i].nr] != (unsigned)inst->regs_read(i) ||
- inst->src[i].subreg_offset)
+ inst->src[i].subnr)
fprintf(file, "+%d.%d", inst->src[i].reg_offset,
- inst->src[i].subreg_offset);
+ inst->src[i].subnr);
break;
case FIXED_GRF:
fprintf(file, "g%d", inst->src[i].nr);
@@ -4715,9 +4714,9 @@ fs_visitor::dump_instruction(backend_instruction *be_inst, FILE *file)
fprintf(file, "u%d", inst->src[i].nr + inst->src[i].reg_offset);
if (inst->src[i].reladdr) {
fprintf(file, "+reladdr");
- } else if (inst->src[i].subreg_offset) {
+ } else if (inst->src[i].subnr) {
fprintf(file, "+%d.%d", inst->src[i].reg_offset,
- inst->src[i].subreg_offset);
+ inst->src[i].subnr);
}
break;
case BAD_FILE:
diff --git a/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp b/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp
index d7a1456..f7c9786 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp
@@ -121,7 +121,7 @@ struct imm {
* The GRF register and subregister number where we've decided to store the
* constant value.
*/
- uint8_t subreg_offset;
+ uint8_t subnr;
uint16_t nr;
/** The number of coissuable instructions using this immediate. */
@@ -281,12 +281,11 @@ fs_visitor::opt_combine_constants()
ibld.MOV(reg, brw_imm_f(imm->val));
imm->nr = reg.nr;
- imm->subreg_offset = reg.subreg_offset;
+ imm->subnr = reg.subnr;
- reg.subreg_offset += sizeof(float);
- if ((unsigned)reg.subreg_offset == 8 * sizeof(float)) {
+ reg.subnr += sizeof(float);
+ if (reg.subnr == 0) {
reg.nr = alloc.allocate(1);
- reg.subreg_offset = 0;
}
}
promoted_constants = table.len;
@@ -297,7 +296,7 @@ fs_visitor::opt_combine_constants()
fs_reg *reg = link->reg;
reg->file = VGRF;
reg->nr = table.imm[i].nr;
- reg->subreg_offset = table.imm[i].subreg_offset;
+ reg->subnr = table.imm[i].subnr;
reg->stride = 0;
reg->negate = signbit(reg->f) != signbit(table.imm[i].val);
assert((isnan(reg->f) && isnan(table.imm[i].val)) ||
@@ -314,7 +313,7 @@ fs_visitor::opt_combine_constants()
imm->val,
imm->block->num,
imm->nr,
- imm->subreg_offset,
+ imm->subnr,
imm->must_promote,
imm->uses_by_coissue,
imm->first_use_ip,
diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
index fd25307..d876d07 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
@@ -352,7 +352,7 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
* that entry is writing.
*/
if (inst->src[arg].reg_offset < entry->dst.reg_offset ||
- (inst->src[arg].reg_offset * 32 + inst->src[arg].subreg_offset +
+ (inst->src[arg].reg_offset * 32 + inst->src[arg].subnr +
inst->regs_read(arg) * inst->src[arg].stride * 32) >
(entry->dst.reg_offset + entry->regs_written) * 32)
return false;
@@ -445,7 +445,7 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
case ARF:
case FIXED_GRF:
inst->src[arg].reg_offset = entry->src.reg_offset;
- inst->src[arg].subreg_offset = entry->src.subreg_offset;
+ inst->src[arg].subnr = entry->src.subnr;
break;
case ATTR:
case VGRF:
@@ -461,15 +461,15 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
*/
/* Compute the offset of inst->src[arg] relative to inst->dst */
- assert(entry->dst.subreg_offset == 0);
+ assert(entry->dst.subnr == 0);
int rel_offset = inst->src[arg].reg_offset - entry->dst.reg_offset;
- int rel_suboffset = inst->src[arg].subreg_offset;
+ int rel_suboffset = inst->src[arg].subnr;
/* Compute the final register offset (in bytes) */
- int offset = entry->src.reg_offset * 32 + entry->src.subreg_offset;
+ int offset = entry->src.reg_offset * 32 + entry->src.subnr;
offset += rel_offset * 32 + rel_suboffset;
inst->src[arg].reg_offset = offset / 32;
- inst->src[arg].subreg_offset = offset % 32;
+ inst->src[arg].subnr = offset % 32;
}
break;
@@ -523,7 +523,7 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry)
* that entry is writing.
*/
if (inst->src[i].reg_offset < entry->dst.reg_offset ||
- (inst->src[i].reg_offset * 32 + inst->src[i].subreg_offset +
+ (inst->src[i].reg_offset * 32 + inst->src[i].subnr +
inst->regs_read(i) * inst->src[i].stride * 32) >
(entry->dst.reg_offset + entry->regs_written) * 32)
continue;
diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
index 1916a99..a2d379e 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
@@ -84,7 +84,7 @@ brw_reg_from_fs_reg(fs_inst *inst, fs_reg *reg, unsigned gen)
}
brw_reg = retype(brw_reg, reg->type);
- brw_reg = byte_offset(brw_reg, reg->subreg_offset);
+ brw_reg = byte_offset(brw_reg, reg->subnr);
brw_reg.abs = reg->abs;
brw_reg.negate = reg->negate;
break;
diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
index 0efb2fa..54c34d4 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
@@ -544,13 +544,13 @@ fs_visitor::optimize_frontfacing_ternary(nir_alu_instr *instr,
}
tmp.type = BRW_REGISTER_TYPE_W;
- tmp.subreg_offset = 2;
+ tmp.subnr = 2;
tmp.stride = 2;
bld.OR(tmp, g0, brw_imm_uw(0x3f80));
tmp.type = BRW_REGISTER_TYPE_D;
- tmp.subreg_offset = 0;
+ tmp.subnr = 0;
tmp.stride = 1;
} else {
/* Bit 31 of g1.6 is 0 if the polygon is front facing. */
@@ -2564,11 +2564,6 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
for (unsigned i = 0; i < instr->num_components; i++) {
packed_consts.set_smear(const_offset->u[0] % 16 / 4 + i);
- /* The std140 packing rules don't allow vectors to cross 16-byte
- * boundaries, and a reg is 32 bytes.
- */
- assert(packed_consts.subreg_offset < 32);
-
bld.MOV(dest, packed_consts);
dest = offset(dest, bld, 1);
}
diff --git a/src/mesa/drivers/dri/i965/brw_ir_fs.h b/src/mesa/drivers/dri/i965/brw_ir_fs.h
index c3eec2e..1841625 100644
--- a/src/mesa/drivers/dri/i965/brw_ir_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_ir_fs.h
@@ -52,12 +52,6 @@ public:
/** Smear a channel of the reg to all channels. */
fs_reg &set_smear(unsigned subreg);
- /**
- * Offset in bytes from the start of the register. Values up to a
- * backend_reg::reg_offset unit are valid.
- */
- int subreg_offset;
-
fs_reg *reladdr;
/** Register region horizontal stride */
@@ -98,7 +92,7 @@ byte_offset(fs_reg reg, unsigned delta)
case UNIFORM:
assert(delta == 0);
}
- reg.subreg_offset += delta % 32;
+ reg.subnr += delta % 32;
return reg;
}
@@ -127,8 +121,9 @@ horiz_offset(fs_reg reg, unsigned delta)
static inline fs_reg
component(fs_reg reg, unsigned idx)
{
- assert(reg.subreg_offset == 0);
- reg.subreg_offset = idx * type_sz(reg.type);
+ assert(reg.subnr == 0);
+ assert(idx * type_sz(reg.type) < (1 << 5)); /* subnr is 5 bits */
+ reg.subnr = idx * type_sz(reg.type);
reg.stride = 0;
return reg;
}
--
2.4.10
More information about the mesa-dev
mailing list