cmn.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #define DRC_TCACHE_SIZE (4*1024*1024)
  2. extern u8 *tcache;
  3. void drc_cmn_init(void);
  4. void drc_cmn_cleanup(void);
  5. #define BITMASK1(v0) (1 << (v0))
  6. #define BITMASK2(v0,v1) ((1 << (v0)) | (1 << (v1)))
  7. #define BITMASK3(v0,v1,v2) (BITMASK2(v0,v1) | (1 << (v2)))
  8. #define BITMASK4(v0,v1,v2,v3) (BITMASK3(v0,v1,v2) | (1 << (v3)))
  9. #define BITMASK5(v0,v1,v2,v3,v4) (BITMASK4(v0,v1,v2,v3) | (1 << (v4)))
  10. #define BITMASK6(v0,v1,v2,v3,v4,v5) (BITMASK5(v0,v1,v2,v3,v4) | (1 << (v5)))
  11. #define BITRANGE(v0,v1) (BITMASK1(v1+1)-BITMASK1(v0)) // set with v0..v1
  12. // binary search approach, since we don't have CLZ on ARM920T
  13. #define FOR_ALL_BITS_SET_DO(mask, bit, code) { \
  14. u32 __mask = mask; \
  15. for (bit = 0; bit < 32 && mask; bit++, __mask >>= 1) { \
  16. if (!(__mask & 0xffff)) \
  17. bit += 16,__mask >>= 16; \
  18. if (!(__mask & 0xff)) \
  19. bit += 8, __mask >>= 8; \
  20. if (!(__mask & 0xf)) \
  21. bit += 4, __mask >>= 4; \
  22. if (!(__mask & 0x3)) \
  23. bit += 2, __mask >>= 2; \
  24. if (!(__mask & 0x1)) \
  25. bit += 1, __mask >>= 1; \
  26. if (__mask & 0x1) { \
  27. code; \
  28. } \
  29. } \
  30. }
  31. // inspired by https://graphics.stanford.edu/~seander/bithacks.html
  32. static inline int count_bits(unsigned val)
  33. {
  34. val = val - ((val >> 1) & 0x55555555);
  35. val = (val & 0x33333333) + ((val >> 2) & 0x33333333);
  36. return (((val + (val >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
  37. }