util_math.h 875 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. /*
  2. * SPDX-FileCopyrightText: 2014 Advanced Micro Devices, Inc.
  3. * SPDX-License-Identifier: MIT
  4. */
  5. #ifndef _UTIL_MATH_H_
  6. #define _UTIL_MATH_H_
  7. #include <stdint.h>
  8. #define MIN2( A, B ) ( (A)<(B) ? (A) : (B) )
  9. #define MAX2( A, B ) ( (A)>(B) ? (A) : (B) )
  10. #define MAX3( A, B, C ) ((A) > (B) ? MAX2(A, C) : MAX2(B, C))
  11. #define __align_mask(value, mask) (((value) + (mask)) & ~(mask))
  12. #define ALIGN(value, alignment) __align_mask(value, (__typeof__(value))((alignment) - 1))
  13. static inline unsigned
  14. util_last_bit64(uint64_t u)
  15. {
  16. #if defined(HAVE___BUILTIN_CLZLL)
  17. return u == 0 ? 0 : 64 - __builtin_clzll(u);
  18. #elif defined(_MSC_VER) && (_M_AMD64 || _M_ARM64 || _M_IA64)
  19. unsigned long index;
  20. if (_BitScanReverse64(&index, u))
  21. return index + 1;
  22. else
  23. return 0;
  24. #else
  25. unsigned r = 0;
  26. while (u) {
  27. r++;
  28. u >>= 1;
  29. }
  30. return r;
  31. #endif
  32. }
  33. #endif /*_UTIL_MATH_H_*/