brw: Add and use brw_reg_is_arf to test for a specific ARF
Reviewed-by: Francisco Jerez <currojerez@riseup.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35415>
This commit is contained in:
@@ -48,8 +48,7 @@ brw_set_dest(struct brw_codegen *p, brw_eu_inst *inst, struct brw_reg dest)
|
||||
* instruction, the stride must be at least 2, even when the destination
|
||||
* is the NULL register.
|
||||
*/
|
||||
if (dest.file == ARF &&
|
||||
dest.nr == BRW_ARF_NULL &&
|
||||
if (brw_reg_is_arf(dest, BRW_ARF_NULL) &&
|
||||
brw_type_size_bytes(dest.type) == 1 &&
|
||||
dest.hstride == BRW_HORIZONTAL_STRIDE_1) {
|
||||
dest.hstride = BRW_HORIZONTAL_STRIDE_2;
|
||||
@@ -163,7 +162,7 @@ brw_set_src0(struct brw_codegen *p, brw_eu_inst *inst, struct brw_reg reg)
|
||||
brw_eu_inst_set_send_src0_reg_file(devinfo, inst, phys_file(reg));
|
||||
brw_eu_inst_set_src0_da_reg_nr(devinfo, inst, phys_nr(devinfo, reg));
|
||||
|
||||
if (reg.file == ARF && reg.nr == BRW_ARF_SCALAR) {
|
||||
if (brw_reg_is_arf(reg, BRW_ARF_SCALAR)) {
|
||||
assert(reg.subnr % 2 == 0);
|
||||
brw_eu_inst_set_send_src0_subreg_nr(devinfo, inst, reg.subnr / 2);
|
||||
} else {
|
||||
@@ -284,8 +283,7 @@ brw_set_src1(struct brw_codegen *p, brw_eu_inst *inst, struct brw_reg reg)
|
||||
* "Accumulator registers may be accessed explicitly as src0
|
||||
* operands only."
|
||||
*/
|
||||
assert(reg.file != ARF ||
|
||||
(reg.nr & 0xF0) != BRW_ARF_ACCUMULATOR);
|
||||
assert(!brw_reg_is_arf(reg, BRW_ARF_ACCUMULATOR));
|
||||
|
||||
brw_eu_inst_set_src1_file_type(devinfo, inst, phys_file(reg), reg.type);
|
||||
brw_eu_inst_set_src1_abs(devinfo, inst, reg.abs);
|
||||
@@ -602,8 +600,7 @@ brw_alu3(struct brw_codegen *p, unsigned opcode, struct brw_reg dest,
|
||||
|
||||
if (brw_eu_inst_access_mode(devinfo, inst) == BRW_ALIGN_1) {
|
||||
assert(dest.file == FIXED_GRF ||
|
||||
(dest.file == ARF &&
|
||||
(dest.nr & 0xF0) == BRW_ARF_ACCUMULATOR));
|
||||
brw_reg_is_arf(dest, BRW_ARF_ACCUMULATOR));
|
||||
|
||||
brw_eu_inst_set_3src_a1_dst_reg_file(devinfo, inst, phys_file(dest));
|
||||
brw_eu_inst_set_3src_dst_reg_nr(devinfo, inst, phys_nr(devinfo, dest));
|
||||
@@ -665,8 +662,7 @@ brw_alu3(struct brw_codegen *p, unsigned opcode, struct brw_reg dest,
|
||||
assert(src0.file == FIXED_GRF ||
|
||||
src0.file == IMM);
|
||||
assert(src1.file == FIXED_GRF ||
|
||||
(src1.file == ARF &&
|
||||
src1.nr == BRW_ARF_ACCUMULATOR));
|
||||
brw_reg_is_arf(src1, BRW_ARF_ACCUMULATOR));
|
||||
assert(src2.file == FIXED_GRF ||
|
||||
src2.file == IMM);
|
||||
|
||||
@@ -788,8 +784,7 @@ brw_dpas_three_src(struct brw_codegen *p, enum opcode opcode,
|
||||
brw_eu_inst_set_dpas_3src_src2_type(devinfo, inst, src2.type);
|
||||
|
||||
assert(src0.file == FIXED_GRF ||
|
||||
(src0.file == ARF &&
|
||||
src0.nr == BRW_ARF_NULL));
|
||||
brw_reg_is_arf(src0, BRW_ARF_NULL));
|
||||
|
||||
brw_eu_inst_set_dpas_3src_src0_reg_file(devinfo, inst, phys_file(src0));
|
||||
brw_eu_inst_set_dpas_3src_src0_reg_nr(devinfo, inst, phys_nr(devinfo, src0));
|
||||
@@ -987,10 +982,8 @@ brw_MUL(struct brw_codegen *p, struct brw_reg dest,
|
||||
assert(src0.type != BRW_TYPE_D);
|
||||
}
|
||||
|
||||
assert(src0.file != ARF ||
|
||||
src0.nr != BRW_ARF_ACCUMULATOR);
|
||||
assert(src1.file != ARF ||
|
||||
src1.nr != BRW_ARF_ACCUMULATOR);
|
||||
assert(!brw_reg_is_arf(src0, BRW_ARF_ACCUMULATOR));
|
||||
assert(!brw_reg_is_arf(src1, BRW_ARF_ACCUMULATOR));
|
||||
|
||||
return brw_alu2(p, BRW_OPCODE_MUL, dest, src0, src1);
|
||||
}
|
||||
|
||||
@@ -51,10 +51,9 @@ brw_insert_load_reg(brw_shader &s)
|
||||
|
||||
bool bad_source = false;
|
||||
for (int i = 0; i < inst->sources; i++) {
|
||||
if (inst->src[i].file == ARF &&
|
||||
(inst->src[i].nr == BRW_ARF_ADDRESS ||
|
||||
inst->src[i].nr == BRW_ARF_ACCUMULATOR ||
|
||||
inst->src[i].nr == BRW_ARF_FLAG)) {
|
||||
if (brw_reg_is_arf(inst->src[i], BRW_ARF_ADDRESS) ||
|
||||
brw_reg_is_arf(inst->src[i], BRW_ARF_ACCUMULATOR) ||
|
||||
brw_reg_is_arf(inst->src[i], BRW_ARF_FLAG)) {
|
||||
bad_source = true;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -130,8 +130,7 @@ namespace {
|
||||
return TGL_PIPE_FLOAT;
|
||||
else if (devinfo->ver >= 30 &&
|
||||
inst->exec_size == 1 &&
|
||||
inst->dst.file == ARF &&
|
||||
inst->dst.nr == BRW_ARF_SCALAR &&
|
||||
brw_reg_is_arf(inst->dst, BRW_ARF_SCALAR) &&
|
||||
inst->src[0].file == IMM) {
|
||||
/* Scalar pipe has a very narrow usage. See Bspec 56701 (r60146),
|
||||
* in the SWSB description entry.
|
||||
@@ -782,12 +781,9 @@ namespace {
|
||||
reg_offset(r) / REG_SIZE);
|
||||
|
||||
return (r.file == VGRF || r.file == FIXED_GRF ? &grf_deps[reg] :
|
||||
r.file == ARF && reg >= BRW_ARF_ADDRESS &&
|
||||
reg < BRW_ARF_ACCUMULATOR ? &addr_dep :
|
||||
r.file == ARF && reg >= BRW_ARF_ACCUMULATOR &&
|
||||
reg < BRW_ARF_FLAG ? &accum_dep :
|
||||
r.file == ARF && reg >= BRW_ARF_SCALAR &&
|
||||
reg < BRW_ARF_STATE ? &scalar_dep :
|
||||
brw_reg_is_arf(r, BRW_ARF_ADDRESS) ? &addr_dep :
|
||||
brw_reg_is_arf(r, BRW_ARF_ACCUMULATOR) ? &accum_dep :
|
||||
brw_reg_is_arf(r, BRW_ARF_SCALAR) ? &scalar_dep :
|
||||
NULL);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -251,24 +251,6 @@ brw_reg::is_negative_one() const
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
brw_reg::is_null() const
|
||||
{
|
||||
return file == ARF && nr == BRW_ARF_NULL;
|
||||
}
|
||||
|
||||
bool
|
||||
brw_reg::is_accumulator() const
|
||||
{
|
||||
return file == ARF && (nr & 0xF0) == BRW_ARF_ACCUMULATOR;
|
||||
}
|
||||
|
||||
bool
|
||||
brw_reg::is_ip() const
|
||||
{
|
||||
return file == ARF && (nr & 0xF0) == BRW_ARF_IP;
|
||||
}
|
||||
|
||||
bool
|
||||
brw_reg::is_address() const
|
||||
{
|
||||
|
||||
@@ -146,6 +146,9 @@ brw_swizzle_for_mask(unsigned mask)
|
||||
|
||||
uint32_t brw_swizzle_immediate(enum brw_reg_type type, uint32_t x, unsigned swz);
|
||||
|
||||
struct brw_reg;
|
||||
static inline bool brw_reg_is_arf(struct brw_reg reg, unsigned arf);
|
||||
|
||||
#define REG_SIZE (8*4)
|
||||
|
||||
/* These aren't hardware structs, just something useful for us to pass around:
|
||||
@@ -225,9 +228,9 @@ typedef struct brw_reg {
|
||||
bool is_zero() const;
|
||||
bool is_one() const;
|
||||
bool is_negative_one() const;
|
||||
bool is_null() const;
|
||||
bool is_accumulator() const;
|
||||
bool is_ip() const;
|
||||
bool is_null() const { return brw_reg_is_arf(*this, BRW_ARF_NULL); }
|
||||
bool is_accumulator() const { return brw_reg_is_arf(*this, BRW_ARF_ACCUMULATOR); }
|
||||
bool is_ip() const { return brw_reg_is_arf(*this, BRW_ARF_IP); }
|
||||
bool is_address() const;
|
||||
|
||||
unsigned address_slot(unsigned byte_offset) const;
|
||||
@@ -265,9 +268,7 @@ phys_nr(const struct intel_device_info *devinfo, const struct brw_reg reg)
|
||||
return reg.nr / 2;
|
||||
else if (reg.file == ADDRESS)
|
||||
return BRW_ARF_ADDRESS;
|
||||
else if (reg.file == ARF &&
|
||||
reg.nr >= BRW_ARF_ACCUMULATOR &&
|
||||
reg.nr < BRW_ARF_FLAG)
|
||||
else if (brw_reg_is_arf(reg, BRW_ARF_ACCUMULATOR))
|
||||
return BRW_ARF_ACCUMULATOR + (reg.nr - BRW_ARF_ACCUMULATOR) / 2;
|
||||
else
|
||||
return reg.nr;
|
||||
@@ -282,10 +283,7 @@ static inline unsigned
|
||||
phys_subnr(const struct intel_device_info *devinfo, const struct brw_reg reg)
|
||||
{
|
||||
if (devinfo->ver >= 20) {
|
||||
if (reg.file == FIXED_GRF ||
|
||||
(reg.file == ARF &&
|
||||
reg.nr >= BRW_ARF_ACCUMULATOR &&
|
||||
reg.nr < BRW_ARF_FLAG))
|
||||
if (reg.file == FIXED_GRF || brw_reg_is_arf(reg, BRW_ARF_ACCUMULATOR))
|
||||
return (reg.nr & 1) * REG_SIZE + reg.subnr;
|
||||
else
|
||||
return reg.subnr;
|
||||
@@ -1069,6 +1067,14 @@ brw_uniform_reg(unsigned nr, enum brw_reg_type type)
|
||||
return reg;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
brw_reg_is_arf(struct brw_reg reg, unsigned arf)
|
||||
{
|
||||
assert((arf & 0x0f) == 0 && arf <= BRW_ARF_TIMESTAMP);
|
||||
|
||||
return reg.file == ARF && (reg.nr & 0xF0) == arf;
|
||||
}
|
||||
|
||||
/* This is almost always called with a numeric constant argument, so
|
||||
* make things easy to evaluate at compile time:
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user