bcache: make bset_search_tree() be more understandable
The purpose of following code in bset_search_tree() is to avoid a branch instruction, 994 if (likely(f->exponent != 127)) 995 n = j * 2 + (((unsigned int) 996 (f->mantissa - 997 bfloat_mantissa(search, f))) >> 31); 998 else 999 n = (bkey_cmp(tree_to_bkey(t, j), search) > 0) 1000 ? j * 2 1001 : j * 2 + 1; This piece of code is not very clear to understand, even when I tried to add code comment for it, I made mistake. This patch removes the implict bit operation and uses explicit branch to calculate next location in binary tree search. Signed-off-by: Coly Li <colyli@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
68a53c95a0
commit
944a4f340a
|
@ -975,25 +975,17 @@ static struct bset_search_iter bset_search_tree(struct bset_tree *t,
|
|||
j = n;
|
||||
f = &t->tree[j];
|
||||
|
||||
/*
|
||||
* Similar bit trick, use subtract operation to avoid a branch
|
||||
* instruction.
|
||||
*
|
||||
* n = (f->mantissa > bfloat_mantissa())
|
||||
* ? j * 2
|
||||
* : j * 2 + 1;
|
||||
*
|
||||
* We need to subtract 1 from f->mantissa for the sign bit trick
|
||||
* to work - that's done in make_bfloat()
|
||||
*/
|
||||
if (likely(f->exponent != 127))
|
||||
n = j * 2 + (((unsigned int)
|
||||
(f->mantissa -
|
||||
bfloat_mantissa(search, f))) >> 31);
|
||||
if (likely(f->exponent != 127)) {
|
||||
if (f->mantissa >= bfloat_mantissa(search, f))
|
||||
n = j * 2;
|
||||
else
|
||||
n = (bkey_cmp(tree_to_bkey(t, j), search) > 0)
|
||||
? j * 2
|
||||
: j * 2 + 1;
|
||||
n = j * 2 + 1;
|
||||
} else {
|
||||
if (bkey_cmp(tree_to_bkey(t, j), search) > 0)
|
||||
n = j * 2;
|
||||
else
|
||||
n = j * 2 + 1;
|
||||
}
|
||||
} while (n < t->size);
|
||||
|
||||
inorder = to_inorder(j, t);
|
||||
|
|
Loading…
Reference in New Issue