nir: Add a new 64+32-bit address format
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 20 Jan 2021 20:27:32 +0000 (14:27 -0600)
committerMarge Bot <eric+marge@anholt.net>
Wed, 17 Mar 2021 17:49:59 +0000 (17:49 +0000)
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 <kenneth@whitecape.org>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8635>

src/compiler/nir/nir.h
src/compiler/nir/nir_lower_io.c

index 3c85b18..4a43099 100644 (file)
@@ -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;
index 554c0d2..e051548 100644 (file)
@@ -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));