From 1fdcc9039b9a63855734c1ffcfe7269b422d092e Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Thu, 5 Jun 2025 16:38:06 -0700 Subject: [PATCH] brw: Add and use brw_reg_is_arf to test for a specific ARF Reviewed-by: Francisco Jerez Part-of: --- src/intel/compiler/brw_eu_emit.c | 23 +++++++----------- src/intel/compiler/brw_load_reg.cpp | 7 +++--- src/intel/compiler/brw_lower_scoreboard.cpp | 12 ++++------ src/intel/compiler/brw_reg.cpp | 18 -------------- src/intel/compiler/brw_reg.h | 26 +++++++++++++-------- 5 files changed, 31 insertions(+), 55 deletions(-) diff --git a/src/intel/compiler/brw_eu_emit.c b/src/intel/compiler/brw_eu_emit.c index 9fae079e635..b301ea5a263 100644 --- a/src/intel/compiler/brw_eu_emit.c +++ b/src/intel/compiler/brw_eu_emit.c @@ -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); } diff --git a/src/intel/compiler/brw_load_reg.cpp b/src/intel/compiler/brw_load_reg.cpp index bd058968c23..d2d2e6c9595 100644 --- a/src/intel/compiler/brw_load_reg.cpp +++ b/src/intel/compiler/brw_load_reg.cpp @@ -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; } diff --git a/src/intel/compiler/brw_lower_scoreboard.cpp b/src/intel/compiler/brw_lower_scoreboard.cpp index 14c4579fc2c..f234d47062a 100644 --- a/src/intel/compiler/brw_lower_scoreboard.cpp +++ b/src/intel/compiler/brw_lower_scoreboard.cpp @@ -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); } }; diff --git a/src/intel/compiler/brw_reg.cpp b/src/intel/compiler/brw_reg.cpp index b115f03b510..23c27a352ab 100644 --- a/src/intel/compiler/brw_reg.cpp +++ b/src/intel/compiler/brw_reg.cpp @@ -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 { diff --git a/src/intel/compiler/brw_reg.h b/src/intel/compiler/brw_reg.h index 7c241d1040b..9cf3275b883 100644 --- a/src/intel/compiler/brw_reg.h +++ b/src/intel/compiler/brw_reg.h @@ -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: */