mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 13:30:12 +01:00
intel/mi: Add a new gen_mi_store_if() helper.
This performs predicated MI_STORE_REGISTER_MEM commands, assuming that the condition is already loaded into MI_PREDICATE_DATA. Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:
parent
27b5817b6c
commit
74063ee61a
1 changed files with 53 additions and 0 deletions
|
|
@ -503,6 +503,59 @@ gen_mi_memcpy(struct gen_mi_builder *b, __gen_address_type dst,
|
|||
|
||||
#if GEN_GEN >= 8 || GEN_IS_HASWELL
|
||||
|
||||
/**
|
||||
* Perform a predicated store (assuming the condition is already loaded
|
||||
* in the MI_PREDICATE_RESULT register) of the value in src to the memory
|
||||
* location specified by dst. Non-memory destinations are not supported.
|
||||
*
|
||||
* This function consumes one reference for each of src and dst.
|
||||
*/
|
||||
static inline void
|
||||
gen_mi_store_if(struct gen_mi_builder *b,
|
||||
struct gen_mi_value dst,
|
||||
struct gen_mi_value src)
|
||||
{
|
||||
assert(!dst.invert && !src.invert);
|
||||
|
||||
gen_mi_builder_flush_math(b);
|
||||
|
||||
/* We can only predicate MI_STORE_REGISTER_MEM, so restrict the
|
||||
* destination to be memory, and resolve the source to a temporary
|
||||
* register if it isn't in one already.
|
||||
*/
|
||||
assert(dst.type == GEN_MI_VALUE_TYPE_MEM64 ||
|
||||
dst.type == GEN_MI_VALUE_TYPE_MEM32);
|
||||
|
||||
if (src.type != GEN_MI_VALUE_TYPE_REG32 ||
|
||||
src.type != GEN_MI_VALUE_TYPE_REG64) {
|
||||
struct gen_mi_value tmp = gen_mi_new_gpr(b);
|
||||
_gen_mi_copy_no_unref(b, tmp, src);
|
||||
src = tmp;
|
||||
}
|
||||
|
||||
if (dst.type == GEN_MI_VALUE_TYPE_MEM64) {
|
||||
gen_mi_builder_emit(b, GENX(MI_STORE_REGISTER_MEM), srm) {
|
||||
srm.RegisterAddress = src.reg;
|
||||
srm.MemoryAddress = dst.addr;
|
||||
srm.PredicateEnable = true;
|
||||
}
|
||||
gen_mi_builder_emit(b, GENX(MI_STORE_REGISTER_MEM), srm) {
|
||||
srm.RegisterAddress = src.reg + 4;
|
||||
srm.MemoryAddress = __gen_address_offset(dst.addr, 4);
|
||||
srm.PredicateEnable = true;
|
||||
}
|
||||
} else {
|
||||
gen_mi_builder_emit(b, GENX(MI_STORE_REGISTER_MEM), srm) {
|
||||
srm.RegisterAddress = src.reg;
|
||||
srm.MemoryAddress = dst.addr;
|
||||
srm.PredicateEnable = true;
|
||||
}
|
||||
}
|
||||
|
||||
gen_mi_value_unref(b, src);
|
||||
gen_mi_value_unref(b, dst);
|
||||
}
|
||||
|
||||
static inline void
|
||||
_gen_mi_builder_push_math(struct gen_mi_builder *b,
|
||||
const uint32_t *dwords,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue