diff options
author | Caio Marcelo de Oliveira Filho <[email protected]> | 2019-05-01 13:24:45 -0700 |
---|---|---|
committer | Caio Marcelo de Oliveira Filho <[email protected]> | 2019-05-20 10:53:38 -0700 |
commit | bdaf41107a24f745fd2cb09df3fd905b5837fe98 (patch) | |
tree | ec526100fdd320898ff656aa80d3dcad3b5e7ea3 | |
parent | 9f61aa3f7534ca06b8b59a03249f51492bc80b2c (diff) |
nir: Add nir_address_format_logical
An address format representing a purely logical addressing model. In
this model, all deref chains must be complete from the dereference
operation to the variable. Cast derefs are not allowed. These
addresses will be 32-bit scalars but the format is immaterial because
you can always chase the chain. E.g. push constants in anv.
Reviewed-by: Jason Ekstrand <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
-rw-r--r-- | src/compiler/nir/nir.h | 11 | ||||
-rw-r--r-- | src/compiler/nir/nir_lower_io.c | 3 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 3e408e20f07..5897f6cea7c 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3112,6 +3112,15 @@ typedef enum { * component is a buffer index and the second is an offset. */ nir_address_format_32bit_index_offset, + + /** + * An address format representing a purely logical addressing model. In + * this model, all deref chains must be complete from the dereference + * operation to the variable. Cast derefs are not allowed. These + * addresses will be 32-bit scalars but the format is immaterial because + * you can always chase the chain. + */ + nir_address_format_logical, } nir_address_format; static inline unsigned @@ -3122,6 +3131,7 @@ nir_address_format_bit_size(nir_address_format addr_format) case nir_address_format_64bit_global: return 64; case nir_address_format_64bit_bounded_global: return 32; case nir_address_format_32bit_index_offset: return 32; + case nir_address_format_logical: return 32; } unreachable("Invalid address format"); } @@ -3134,6 +3144,7 @@ nir_address_format_num_components(nir_address_format addr_format) case nir_address_format_64bit_global: return 1; case nir_address_format_64bit_bounded_global: return 4; case nir_address_format_32bit_index_offset: return 2; + case nir_address_format_logical: return 1; } unreachable("Invalid address format"); } diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index d9642556258..1a7e00bf96a 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -618,6 +618,8 @@ build_addr_iadd(nir_builder *b, nir_ssa_def *addr, assert(addr->num_components == 2); return nir_vec2(b, nir_channel(b, addr, 0), nir_iadd(b, nir_channel(b, addr, 1), offset)); + case nir_address_format_logical: + unreachable("Unsupported address format"); } unreachable("Invalid address format"); } @@ -673,6 +675,7 @@ addr_to_global(nir_builder *b, nir_ssa_def *addr, nir_u2u64(b, nir_channel(b, addr, 3))); case nir_address_format_32bit_index_offset: + case nir_address_format_logical: unreachable("Cannot get a 64-bit address with this address format"); } |