OSDN Git Service

gallium/util: Add u_bit_scan_consecutive_range64.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Wed, 13 Apr 2016 21:30:55 +0000 (23:30 +0200)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Tue, 19 Apr 2016 16:10:30 +0000 (18:10 +0200)
For use by radeonsi.

v2: Make sure that it works for all 64 bits set.

Signed-off-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/auxiliary/util/u_math.h

index d983af3..10f158b 100644 (file)
@@ -529,6 +529,20 @@ u_bit_scan_consecutive_range(unsigned *mask, int *start, int *count)
    *mask &= ~(((1u << *count) - 1) << *start);
 }
 
+static inline void
+u_bit_scan_consecutive_range64(uint64_t *mask, int *start, int *count)
+{
+   if (*mask == ~0llu) {
+      *start = 0;
+      *count = 64;
+      *mask = 0;
+      return;
+   }
+   *start = ffsll(*mask) - 1;
+   *count = ffsll(~(*mask >> *start)) - 1;
+   *mask &= ~(((1llu << *count) - 1) << *start);
+}
+
 /**
  * Return float bits.
  */