1064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe#ifndef FIO_FFZ_H 2064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe#define FIO_FFZ_H 3064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe 4eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#include <inttypes.h> 5eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 6eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic inline int ffs64(uint64_t word) 7064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe{ 80917444531866c9facb0f731eff5e4e28c7c65d3Jens Axboe int r = 0; 9064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe 100ce8b119b65849e537cab628a176a0ec4238aab0Jens Axboe if ((word & 0xffffffff) == 0) { 110ce8b119b65849e537cab628a176a0ec4238aab0Jens Axboe r += 32; 120ce8b119b65849e537cab628a176a0ec4238aab0Jens Axboe word >>= 32; 130ce8b119b65849e537cab628a176a0ec4238aab0Jens Axboe } 14064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe if (!(word & 0xffff)) { 15064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe word >>= 16; 16064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe r += 16; 17064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe } 18064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe if (!(word & 0xff)) { 19064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe word >>= 8; 20064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe r += 8; 21064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe } 22064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe if (!(word & 0xf)) { 23064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe word >>= 4; 24064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe r += 4; 25064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe } 26064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe if (!(word & 3)) { 27064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe word >>= 2; 28064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe r += 2; 29064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe } 30064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe if (!(word & 1)) { 31064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe word >>= 1; 32064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe r += 1; 33064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe } 34064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe 35064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe return r; 36064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe} 37064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe 38eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#ifndef ARCH_HAVE_FFZ 39eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 400ce8b119b65849e537cab628a176a0ec4238aab0Jens Axboestatic inline int ffz(unsigned long bitmask) 41064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe{ 42eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return ffs64(~bitmask); 43eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes} 44eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 45eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#else 46eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#define ffz(bitmask) arch_ffz(bitmask) 47eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#endif 48eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 49eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic inline int ffz64(uint64_t bitmask) 50eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{ 51eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return ffs64(~bitmask); 52064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe} 53064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe 54064c636d364fab601a908e040d3aa5eaf2775694Jens Axboe#endif 55