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