Skip to content

Commit

Permalink
bcache: make bset_search_tree() be more understandable
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Coly Li authored and Jens Axboe committed Jun 28, 2019
1 parent 68a53c9 commit 944a4f3
Showing 1 changed file with 11 additions and 19 deletions.
30 changes: 11 additions & 19 deletions drivers/md/bcache/bset.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
else
n = (bkey_cmp(tree_to_bkey(t, j), search) > 0)
? j * 2
: j * 2 + 1;
if (likely(f->exponent != 127)) {
if (f->mantissa >= bfloat_mantissa(search, f))
n = j * 2;
else
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);
Expand Down

0 comments on commit 944a4f3

Please sign in to comment.