intel/compiler: use bitset instead of opencoding a 32-bit bitset. (v2)
authorDave Airlie <airlied@redhat.com>
Fri, 3 May 2019 00:17:54 +0000 (10:17 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 14 May 2019 21:10:34 +0000 (07:10 +1000)
In the future I want to expand this to 128-bits, for vec16 support, so
lets just put the code in place to use bitset ranges now.

v2: just declare the bitset to be the max of what we should ever see
and change assert to reflect it.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/intel/compiler/brw_nir_lower_mem_access_bit_sizes.c

index 2ec47b38999884d3363f91b5025272c62bf1f907..342cf9ede87449a5f5ca7fa4fa311b6078ca1432 100644 (file)
@@ -180,20 +180,23 @@ lower_mem_store_bit_size(nir_builder *b, nir_intrinsic_instr *intrin)
       offset_is_const ? nir_src_as_uint(*offset_src) : 0;
 
    const unsigned byte_size = bit_size / 8;
-   assert(num_components * byte_size <= 32);
-   uint32_t byte_mask = 0;
+   assert(byte_size <= sizeof(uint64_t));
+
+   BITSET_DECLARE(mask, NIR_MAX_VEC_COMPONENTS * sizeof(uint64_t));
+   BITSET_ZERO(mask);
+
    for (unsigned i = 0; i < num_components; i++) {
       if (writemask & (1u << i))
-         byte_mask |= ((1 << byte_size) - 1) << i * byte_size;
+         BITSET_SET_RANGE(mask, i * byte_size, ((i + 1) * byte_size) - 1);
    }
 
-   while (byte_mask) {
-      const int start = ffs(byte_mask) - 1;
+   while (BITSET_FFS(mask) != 0) {
+      const int start = BITSET_FFS(mask) - 1;
       assert(start % byte_size == 0);
 
       int end;
       for (end = start + 1; end < bytes_written; end++) {
-         if (!(byte_mask & (1 << end)))
+         if (!(BITSET_TEST(mask, end)))
             break;
       }
       /* The size of the current contiguous chunk in bytes */
@@ -233,7 +236,7 @@ lower_mem_store_bit_size(nir_builder *b, nir_intrinsic_instr *intrin)
       dup_mem_intrinsic(b, intrin, packed, start,
                         store_comps, store_bit_size, store_align);
 
-      byte_mask &= ~(((1u << store_bytes) - 1) << start);
+      BITSET_CLEAR_RANGE(mask, start, (start + store_bytes - 1));
    }
 
    nir_instr_remove(&intrin->instr);