bcache: make bset_search_tree() be more understandable
authorColy Li <colyli@suse.de>
Fri, 28 Jun 2019 11:59:41 +0000 (19:59 +0800)
committerJens Axboe <axboe@kernel.dk>
Fri, 28 Jun 2019 13:39:15 +0000 (07:39 -0600)
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>
drivers/md/bcache/bset.c

index 8af9509..0876879 100644 (file)
@@ -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);