From 93a3f187195aad44624451a2929f5803be619fe2 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 20 Jan 2021 14:27:32 -0600 Subject: [PATCH] nir: Add a new 64+32-bit address format This is a global address format where you have a 64-bit base pointer and a 32-bit offset. It's intentionally identical to 64bit_bounded_global except nir_lower_explicit_io does no bounds checking with it. Reviewed-by: Kenneth Graunke Reviewed-by: Caio Marcelo de Oliveira Filho Part-of: --- src/compiler/nir/nir.h | 13 +++++++++++++ src/compiler/nir/nir_lower_io.c | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 3c85b18..4a43099 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -4409,6 +4409,17 @@ typedef enum { nir_address_format_64bit_global, /** + * An address format which is a 64-bit global base address and a 32-bit + * offset. + * + * The address is comprised as a 32-bit vec4 where .xy are a uint64_t base + * address stored with the low bits in .x and high bits in .y, .z is + * undefined, and .w is an offset. This is intended to match + * 64bit_bounded_global but without the bounds checking. + */ + nir_address_format_64bit_global_32bit_offset, + + /** * An address format which is a bounds-checked 64-bit global GPU address. * * The address is comprised as a 32-bit vec4 where .xy are a uint64_t base @@ -4482,6 +4493,7 @@ nir_address_format_bit_size(nir_address_format addr_format) switch (addr_format) { case nir_address_format_32bit_global: return 32; case nir_address_format_64bit_global: return 64; + case nir_address_format_64bit_global_32bit_offset: return 32; case nir_address_format_64bit_bounded_global: return 32; case nir_address_format_32bit_index_offset: return 32; case nir_address_format_32bit_index_offset_pack64: return 64; @@ -4500,6 +4512,7 @@ nir_address_format_num_components(nir_address_format addr_format) switch (addr_format) { case nir_address_format_32bit_global: return 1; case nir_address_format_64bit_global: return 1; + case nir_address_format_64bit_global_32bit_offset: return 4; case nir_address_format_64bit_bounded_global: return 4; case nir_address_format_32bit_index_offset: return 2; case nir_address_format_32bit_index_offset_pack64: return 1; diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index 554c0d2..e051548 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -786,6 +786,7 @@ build_addr_iadd(nir_builder *b, nir_ssa_def *addr, assert(offset->bit_size == 32); return nir_u2u64(b, nir_iadd(b, nir_u2u32(b, addr), offset)); + case nir_address_format_64bit_global_32bit_offset: case nir_address_format_64bit_bounded_global: assert(addr->num_components == 4); assert(addr->bit_size == offset->bit_size); @@ -1008,6 +1009,7 @@ addr_format_is_global(nir_address_format addr_format, return addr_format == nir_address_format_32bit_global || addr_format == nir_address_format_64bit_global || + addr_format == nir_address_format_64bit_global_32bit_offset || addr_format == nir_address_format_64bit_bounded_global; } @@ -1033,6 +1035,7 @@ addr_to_global(nir_builder *b, nir_ssa_def *addr, assert(addr->num_components == 1); return addr; + case nir_address_format_64bit_global_32bit_offset: case nir_address_format_64bit_bounded_global: assert(addr->num_components == 4); return nir_iadd(b, nir_pack_64_2x32(b, nir_channels(b, addr, 0x3)), @@ -2507,6 +2510,7 @@ nir_address_format_null_value(nir_address_format addr_format) const static nir_const_value null_values[][NIR_MAX_VEC_COMPONENTS] = { [nir_address_format_32bit_global] = {{0}}, [nir_address_format_64bit_global] = {{0}}, + [nir_address_format_64bit_global_32bit_offset] = {{0}}, [nir_address_format_64bit_bounded_global] = {{0}}, [nir_address_format_32bit_index_offset] = {{.u32 = ~0}, {.u32 = ~0}}, [nir_address_format_32bit_index_offset_pack64] = {{.u64 = ~0ull}}, @@ -2535,6 +2539,10 @@ nir_build_addr_ieq(nir_builder *b, nir_ssa_def *addr0, nir_ssa_def *addr1, case nir_address_format_62bit_generic: return nir_ball_iequal(b, addr0, addr1); + case nir_address_format_64bit_global_32bit_offset: + return nir_ball_iequal(b, nir_channels(b, addr0, 0xb), + nir_channels(b, addr1, 0xb)); + case nir_address_format_32bit_offset_as_64bit: assert(addr0->num_components == 1 && addr1->num_components == 1); return nir_ieq(b, nir_u2u32(b, addr0), nir_u2u32(b, addr1)); @@ -2569,6 +2577,7 @@ nir_build_addr_isub(nir_builder *b, nir_ssa_def *addr0, nir_ssa_def *addr1, assert(addr1->num_components == 1); return nir_u2u64(b, nir_isub(b, nir_u2u32(b, addr0), nir_u2u32(b, addr1))); + case nir_address_format_64bit_global_32bit_offset: case nir_address_format_64bit_bounded_global: return nir_isub(b, addr_to_global(b, addr0, addr_format), addr_to_global(b, addr1, addr_format)); -- 2.7.4