| | 31 | /* Adapted from Linux. */ |
| | 32 | static inline int BitFindFirstZero(void* array, int size) |
| | 33 | { |
| | 34 | int d0, d1, d2; /* Temporary variables. */ |
| | 35 | int result; |
| | 36 | |
| | 37 | if (!size) |
| | 38 | return 0; |
| | 39 | |
| | 40 | asm volatile( |
| | 41 | "movl $-1,%%eax\n\t" |
| | 42 | "xorl %%edx,%%edx\n\t" |
| | 43 | "repe; scasl\n\t" |
| | 44 | "je 1f\n\t" |
| | 45 | "xorl -4(%%edi),%%eax\n\t" |
| | 46 | "subl $4,%%edi\n\t" |
| | 47 | "bsfl %%eax,%%edx\n" |
| | 48 | "1:\tsubl %%ebx,%%edi\n\t" |
| | 49 | "shll $3,%%edi\n\t" |
| | 50 | "addl %%edi,%%edx" |
| | 51 | :"=d" (result), "=&c" (d0), "=&D" (d1), "=&a" (d2) |
| | 52 | :"1" ((size + 31) >> 5), "2" (array), "b" (array) : "memory"); |
| | 53 | |
| | 54 | return result; |
| | 55 | } |
| | 56 | |