Messages in this thread | | | Date | Sun, 6 Apr 2008 10:03:43 -0700 (PDT) | From | dean gaudet <> | Subject | Re: [PATCH] x86: generic versions of find_first_(zero_)bit, convert i386 |
| |
fwiw there's a way to do ffz / ntz which can do lg(n) conditional moves in parallel... i'm not sure what (non-x86) architectures this might be best on, but it might be a good choice for the generic code... although maybe the large number of constants required will be a burden on RISC processors.
take a look at figure 5-17 here http://hackersdelight.org/revisions.pdf
int ntz(unsigned x) { unsigned y, bz, b4, b3, b2, b1, b0; y = x & -x; // Isolate rightmost 1-bit. bz = y ? 0 : 1; // 1 if y = 0. b4 = (y & 0x0000FFFF) ? 0 : 16; b3 = (y & 0x00FF00FF) ? 0 : 8; b2 = (y & 0x0F0F0F0F) ? 0 : 4; b1 = (y & 0x33333333) ? 0 : 2; b0 = (y & 0x55555555) ? 0 : 1; return bz + b4 + b3 + b2 + b1 + b0; }
-dean
| |