mirror of
				https://github.com/RaySollium99/picodrive.git
				synced 2025-10-27 00:29:39 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			44 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #define DRC_TCACHE_SIZE         (4*1024*1024)
 | |
| 
 | |
| extern u8 *tcache;
 | |
| 
 | |
| void drc_cmn_init(void);
 | |
| void drc_cmn_cleanup(void);
 | |
| 
 | |
| #define BITMASK1(v0) (1 << (v0))
 | |
| #define BITMASK2(v0,v1) ((1 << (v0)) | (1 << (v1)))
 | |
| #define BITMASK3(v0,v1,v2) (BITMASK2(v0,v1) | (1 << (v2)))
 | |
| #define BITMASK4(v0,v1,v2,v3) (BITMASK3(v0,v1,v2) | (1 << (v3)))
 | |
| #define BITMASK5(v0,v1,v2,v3,v4) (BITMASK4(v0,v1,v2,v3) | (1 << (v4)))
 | |
| #define BITMASK6(v0,v1,v2,v3,v4,v5) (BITMASK5(v0,v1,v2,v3,v4) | (1 << (v5)))
 | |
| #define BITRANGE(v0,v1) (BITMASK1(v1+1)-BITMASK1(v0)) // set with v0..v1
 | |
| 
 | |
| // binary search approach, since we don't have CLZ on ARM920T
 | |
| #define FOR_ALL_BITS_SET_DO(mask, bit, code) { \
 | |
|   u32 __mask = mask; \
 | |
|   for (bit = 31; bit >= 0 && mask; bit--, __mask <<= 1) { \
 | |
|     if (!(__mask & (0xffff << 16))) \
 | |
|       bit -= 16, __mask <<= 16; \
 | |
|     if (!(__mask & (0xff << 24))) \
 | |
|       bit -= 8, __mask <<= 8; \
 | |
|     if (!(__mask & (0xf << 28))) \
 | |
|       bit -= 4, __mask <<= 4; \
 | |
|     if (!(__mask & (0x3 << 30))) \
 | |
|       bit -= 2, __mask <<= 2; \
 | |
|     if (!(__mask & (0x1 << 31))) \
 | |
|       bit -= 1, __mask <<= 1; \
 | |
|     if (__mask & (0x1 << 31)) { \
 | |
|       code; \
 | |
|     } \
 | |
|   } \
 | |
| }
 | |
| 
 | |
| // inspired by https://graphics.stanford.edu/~seander/bithacks.html
 | |
| static inline int count_bits(unsigned val)
 | |
| {
 | |
|        val = val - ((val >> 1) & 0x55555555);
 | |
|        val = (val & 0x33333333) + ((val >> 2) & 0x33333333);
 | |
|        return (((val + (val >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
 | |
| }
 | |
| 
 | 
