More mid-related function cleanup

Reverted to one set of signed lfsr_mid_rid/bid functions, and tried to
make their usage more consistent.

We have two ways to compare mdirs now, lfsr_mdir_cmp (compares block
addresses) and lfsr_mdir_bid (compares mids), and it's not very clear
when to use which one. lfsr_mdir_cmp is a bit more robust in weird mid
cases (mainly inlined mdirs when mroot mid=-1), so currently preferring
that.

Also did some bit twiddling to preserve mid=-1 => bid=-1 and rid=-1,
this save a bit of code:

            code          stack
  before:  31056           2488
  after:   30972 (-0.3%)   2496 (+0.3%)
This commit is contained in:
Christopher Haster
2023-11-25 19:48:50 -06:00
parent 41b9caf25d
commit f4af2b407e
2 changed files with 53 additions and 77 deletions
+30 -48
View File
@@ -1711,20 +1711,14 @@ static inline lfsr_mid_t lfsr_mweight(lfs_t *lfs) {
return 1 << lfs->mbits;
}
static inline lfsr_bid_t lfsr_mid_bid(lfs_t *lfs, lfsr_mid_t mid) {
static inline lfsr_sbid_t lfsr_mid_bid(lfs_t *lfs, lfsr_smid_t mid) {
return mid | ((1 << lfs->mbits) - 1);
}
static inline lfsr_rid_t lfsr_mid_rid(lfs_t *lfs, lfsr_mid_t mid) {
return mid & ((1 << lfs->mbits) - 1);
}
static inline lfsr_bid_t lfsr_mid_cbid(lfs_t *lfs, lfsr_smid_t mid) {
return lfsr_mid_bid(lfs, lfs_smax32(mid, 0));
}
static inline lfsr_srid_t lfsr_mid_crid(lfs_t *lfs, lfsr_smid_t mid) {
return (mid < 0) ? -1 : (lfsr_srid_t)lfsr_mid_rid(lfs, mid);
static inline lfsr_srid_t lfsr_mid_rid(lfs_t *lfs, lfsr_smid_t mid) {
// note this maps mid=-1 => rid=-1 via sign extension
return (mid >> (8*sizeof(lfsr_smid_t)-1))
| (mid & ((1 << lfs->mbits) - 1));
}
// we use the root's bookmark at 0.0 to represent root
@@ -5035,22 +5029,14 @@ static inline void lfsr_mdir_unerase(lfsr_mdir_t *mdir) {
lfsr_rbyd_unerase(&mdir->u.rbyd);
}
static inline lfsr_bid_t lfsr_mdir_bid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
static inline lfsr_sbid_t lfsr_mdir_bid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
return lfsr_mid_bid(lfs, mdir->mid);
}
static inline lfsr_rid_t lfsr_mdir_rid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
static inline lfsr_srid_t lfsr_mdir_rid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
return lfsr_mid_rid(lfs, mdir->mid);
}
static inline lfsr_bid_t lfsr_mdir_cbid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
return lfsr_mid_cbid(lfs, mdir->mid);
}
static inline lfsr_rid_t lfsr_mdir_crid(lfs_t *lfs, const lfsr_mdir_t *mdir) {
return lfsr_mid_crid(lfs, mdir->mid);
}
static inline bool lfsr_mdir_isroot(const lfsr_mdir_t *mdir) {
return lfsr_mid_isroot(mdir->mid);
}
@@ -5142,7 +5128,7 @@ static int lfsr_mdir_lookupnext(lfs_t *lfs, const lfsr_mdir_t *mdir,
lfsr_smid_t mid_;
lfsr_tag_t tag__;
int err = lfsr_rbyd_lookupnext(lfs, &mdir->u.rbyd,
lfsr_mid_crid(lfs, mid), tag,
lfsr_mid_rid(lfs, mid), tag,
&mid_, &tag__, NULL, data_);
if (err) {
return err;
@@ -5150,7 +5136,7 @@ static int lfsr_mdir_lookupnext(lfs_t *lfs, const lfsr_mdir_t *mdir,
// this is very similar to lfsr_rbyd_lookupnext, but we error if
// lookupnext would change mids
if (mid_ != lfsr_mid_crid(lfs, mid)) {
if (mid_ != lfsr_mid_rid(lfs, mid)) {
return LFS_ERR_NOENT;
}
@@ -5164,7 +5150,7 @@ static int lfsr_mdir_lookup(lfs_t *lfs, const lfsr_mdir_t *mdir,
lfsr_smid_t mid, lfsr_tag_t tag,
lfsr_tag_t *tag_, lfsr_data_t *data_) {
return lfsr_rbyd_lookup(lfs, &mdir->u.rbyd,
lfsr_mid_crid(lfs, mid), tag,
lfsr_mid_rid(lfs, mid), tag,
tag_, data_);
}
@@ -5250,7 +5236,7 @@ static int lfsr_mtree_lookup(lfs_t *lfs, lfsr_smid_t mid,
if (err) {
return err;
}
LFS_ASSERT(bid == lfsr_mid_bid(lfs, mid));
LFS_ASSERT((lfsr_sbid_t)bid == lfsr_mid_bid(lfs, mid));
LFS_ASSERT(tag == LFSR_TAG_MDIR);
// decode mdir
@@ -5426,7 +5412,7 @@ static int lfsr_mdir_commit__(lfs_t *lfs, lfsr_mdir_t *mdir,
lfsr_mdir_unerase(mdir);
for (lfs_size_t i = 0; i < attr_count; i++) {
// calculate adjusted rid
lfsr_srid_t rid = lfsr_mid_crid(lfs, attrs[i].rid);
lfsr_srid_t rid = lfsr_mid_rid(lfs, attrs[i].rid);
// don't write tags outside of the requested range
if (rid >= start_rid
@@ -5556,7 +5542,7 @@ static int lfsr_mdir_commit__(lfs_t *lfs, lfsr_mdir_t *mdir,
// upper layers.
if (mdir_.u.m.weight == 0
// unless we are an mroot
&& !(mdir_.mid == -1 || lfsr_mtree_isnull(lfs))) {
&& !(mdir_.mid == -1 || lfsr_mdir_cmp(&mdir_, &lfs->mroot) == 0)) {
// mark weight as zero, but note! we can not longer read from this mdir
// as our pcache may get clobbered
mdir->u.m.weight = 0;
@@ -5735,8 +5721,9 @@ static int lfsr_mdir_compact__(lfs_t *lfs, lfsr_mdir_t *mdir_,
// belongs to our mdir?
if (lfsr_file_isunsynced(file)
&& lfsr_mdir_cmp(&file->m.mdir, mdir) == 0
&& (lfsr_srid_t)lfsr_mdir_rid(lfs, &file->m.mdir) >= start_rid
&& lfsr_mdir_rid(lfs, &file->m.mdir) < (lfsr_rid_t)end_rid) {
&& lfsr_mdir_rid(lfs, &file->m.mdir) >= start_rid
&& (lfsr_rid_t)lfsr_mdir_rid(lfs, &file->m.mdir)
< (lfsr_rid_t)end_rid) {
// inlined sprout?
if (lfsr_file_isbsprout(file)) {
// write the data as a shrub tag
@@ -6262,8 +6249,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
LFS_ASSERT(mdir->mid == -1
|| lfsr_mtree_isnull(lfs)
|| mdir->u.m.weight > 0);
LFS_ASSERT(mdir->mid == -1
|| lfsr_mdir_rid(lfs, mdir) <= (lfsr_rid_t)mdir->u.m.weight);
LFS_ASSERT(lfsr_mdir_rid(lfs, mdir) <= mdir->u.m.weight);
// parse out any pending gstate, these will get automatically xored
// with on-disk gdeltas in lower-level functions
@@ -6362,8 +6348,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
}
// compact into new mdir tags < split_rid
err = lfsr_mdir_alloc(lfs, &mdir_,
lfs_smax32(mdir->mid, 0));
err = lfsr_mdir_alloc(lfs, &mdir_, lfs_smax32(mdir->mid, 0));
if (err) {
return err;
}
@@ -6382,8 +6367,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
}
// compact into new mdir tags >= split_rid
err = lfsr_mdir_alloc(lfs, &msibling_,
lfs_smax32(mdir->mid, 0));
err = lfsr_mdir_alloc(lfs, &msibling_, lfs_smax32(mdir->mid, 0));
if (err) {
return err;
}
@@ -6470,9 +6454,9 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// fix our grm
for (int j = 0; j < 2; j++) {
if (lfsr_mid_bid(lfs, grm->rms[j])
== lfsr_mdir_cbid(lfs, mdir)) {
== lfsr_mid_bid(lfs, lfs_smax32(mdir->mid, 0))) {
if (lfsr_mid_rid(lfs, grm->rms[j])
>= (lfsr_rid_t)mdir_.u.m.weight) {
>= mdir_.u.m.weight) {
grm->rms[j] += lfsr_mweight(lfs)
- mdir_.u.m.weight;
}
@@ -6609,7 +6593,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// need to relocate?
} else if (lfsr_mdir_cmp(mdir, &mdir_) != 0
&& !(mdir->mid == -1 || lfsr_mtree_isnull(lfs))) {
&& lfsr_mdir_cmp(&mdir_, &lfs->mroot) != 0) {
LFS_DEBUG("Relocating mdir %"PRId32" "
"0x{%"PRIx32",%"PRIx32"} -> 0x{%"PRIx32",%"PRIx32"}",
mdir->mid >> lfs->mbits,
@@ -6682,8 +6666,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// first play out any attrs that change our rid
for (lfs_size_t i = 0; i < attr_count; i++) {
// adjust opened mdirs?
if (lfsr_mdir_bid(lfs, &opened->mdir)
== lfsr_mdir_cbid(lfs, mdir)
if (lfsr_mdir_cmp(&opened->mdir, mdir) == 0
&& opened->mdir.mid >= attrs[i].rid) {
// removed?
if (opened->mdir.mid < attrs[i].rid - attrs[i].delta) {
@@ -6715,7 +6698,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
if (lfsr_mdir_cmp(&opened->mdir, mdir) == 0) {
if (mdelta > 0
&& lfsr_mdir_rid(lfs, &opened->mdir)
>= (lfsr_rid_t)mdir_.u.m.weight) {
>= mdir_.u.m.weight) {
opened->mdir.mid += lfsr_mweight(lfs)
- mdir_.u.m.weight;
opened->mdir.u.m = msibling_.u.m;
@@ -6734,7 +6717,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
// TODO clean this up a bit?
// adjust opened mdirs?
if (lfsr_mid_bid(lfs, dir->bookmark)
== lfsr_mdir_cbid(lfs, mdir)
== lfsr_mid_bid(lfs, lfs_smax32(mdir->mid, 0))
&& dir->bookmark >= attrs[i].rid) {
// removed?
if (dir->bookmark < attrs[i].rid - attrs[i].delta) {
@@ -6754,10 +6737,10 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
}
if (lfsr_mid_bid(lfs, dir->bookmark)
== lfsr_mdir_cbid(lfs, mdir)) {
== lfsr_mid_bid(lfs, lfs_smax32(mdir->mid, 0))) {
if (mdelta > 0
&& lfsr_mid_rid(lfs, dir->bookmark)
>= (lfsr_rid_t)mdir_.u.m.weight) {
>= mdir_.u.m.weight) {
dir->bookmark += lfsr_mweight(lfs)
- mdir_.u.m.weight;
}
@@ -6773,7 +6756,7 @@ static int lfsr_mdir_commit(lfs_t *lfs, lfsr_mdir_t *mdir,
if (mdir->mid == -1) {
mdir->u.m = lfs->mroot.u.m;
} else if (mdelta > 0
&& lfsr_mdir_rid(lfs, mdir) >= (lfsr_rid_t)mdir_.u.m.weight) {
&& lfsr_mdir_rid(lfs, mdir) >= mdir_.u.m.weight) {
mdir->mid += lfsr_mweight(lfs) - mdir_.u.m.weight;
mdir->u.m = msibling_.u.m;
} else {
@@ -7323,7 +7306,7 @@ static int lfsr_traversal_read(lfs_t *lfs, lfsr_traversal_t *traversal,
// return to mtree traversal
if (!lfsr_traversal_isall(traversal)
|| lfsr_mdir_rid(lfs, &traversal->mdir)
>= (lfsr_rid_t)traversal->mdir.u.m.weight) {
>= traversal->mdir.u.m.weight) {
traversal->state = LFSR_TRAVERSAL_MTREE;
continue;
}
@@ -8378,8 +8361,7 @@ static int lfsr_fs_fixgrm(lfs_t *lfs) {
}
// remove the rid while also updating our grm
LFS_ASSERT(lfsr_mid_rid(lfs, lfs->grm.rms[0])
< (lfsr_rid_t)mdir.u.m.weight);
LFS_ASSERT(lfsr_mid_rid(lfs, lfs->grm.rms[0]) < mdir.u.m.weight);
err = lfsr_mdir_commit(lfs, &mdir, LFSR_ATTRS(
LFSR_ATTR(mdir.mid, RM, -1, NULL),
LFSR_ATTR(-1, GRM, 0, GRM(&grm))));
+23 -29
View File
@@ -450,7 +450,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -476,7 +476,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -554,7 +554,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -584,7 +584,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -1322,7 +1322,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -1348,7 +1348,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -1410,7 +1410,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -1449,7 +1449,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -1476,7 +1476,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -1523,12 +1523,9 @@ code = '''
mdir.mid = lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1)
+ (mdir.mid % (mdir.u.m.weight+1));
// choose to create or delete, note we make sure to never delete to zero
uint8_t op = (lfsr_mdir_rid(&lfs, &mdir)
== (lfsr_rid_t)mdir.u.m.weight
|| (lfsr_mdir_rid(&lfs, &mdir)
== (lfsr_rid_t)mdir.u.m.weight-1
&& lfsr_mtree_weight(&lfs)
== lfsr_mweight(&lfs))
uint8_t op = (lfsr_mdir_rid(&lfs, &mdir) == mdir.u.m.weight
|| (lfsr_mdir_rid(&lfs, &mdir) == mdir.u.m.weight-1
&& lfsr_mtree_weight(&lfs) == lfsr_mweight(&lfs))
? 0
: TEST_PRNG(&prng) % 2);
@@ -1576,7 +1573,7 @@ code = '''
// drop should make sure we never have empty mdirs
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -1610,7 +1607,7 @@ code = '''
// drop should make sure we never have empty mdirs
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -2609,12 +2606,9 @@ code = '''
mdir.mid = lfsr_mdir_bid(&lfs, &mdir)-(lfsr_mweight(&lfs)-1)
+ (mdir.mid % (mdir.u.m.weight+1));
// choose to create or delete, note we make sure to never delete to zero
uint8_t op = (lfsr_mdir_rid(&lfs, &mdir)
== (lfsr_rid_t)mdir.u.m.weight
|| (lfsr_mdir_rid(&lfs, &mdir)
== (lfsr_rid_t)mdir.u.m.weight-1
&& lfsr_mtree_weight(&lfs)
== lfsr_mweight(&lfs))
uint8_t op = (lfsr_mdir_rid(&lfs, &mdir) == mdir.u.m.weight
|| (lfsr_mdir_rid(&lfs, &mdir) == mdir.u.m.weight-1
&& lfsr_mtree_weight(&lfs) == lfsr_mweight(&lfs))
? 0
: TEST_PRNG(&prng) % 3);
@@ -2675,7 +2669,7 @@ code = '''
// drop should make sure we never have empty mdirs
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -2709,7 +2703,7 @@ code = '''
// drop should make sure we never have empty mdirs
assert(lfsr_mtree_ismptr(&lfs) || mdir.u.m.weight > 0);
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -3966,7 +3960,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -4042,7 +4036,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -4120,7 +4114,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,
@@ -4201,7 +4195,7 @@ code = '''
mid += lfsr_mweight(&lfs)) {
lfsr_mdir_t mdir;
lfsr_mtree_lookup(&lfs, mid, &mdir) => 0;
for (; lfsr_mdir_rid(&lfs, &mdir) < (lfsr_rid_t)mdir.u.m.weight;
for (; lfsr_mdir_rid(&lfs, &mdir) < mdir.u.m.weight;
mdir.mid += 1) {
uint8_t buffer[4];
lfsr_mdir_get(&lfs, &mdir, mdir.mid, LFSR_TAG_REG,