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:
Ian Romanick
2025-06-05 16:38:06 -07:00
committed by Marge Bot
parent a06e1e81e0
commit 1fdcc9039b
5 changed files with 31 additions and 55 deletions
+8 -15
View File
@@ -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);
}
+3 -4
View File
@@ -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;
}
+4 -8
View File
@@ -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);
}
};
-18
View File
@@ -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
{
+16 -10
View File
@@ -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:
*/