From f4af2b407e28bc492057aedf32f661db61e9ec7c Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sat, 25 Nov 2023 19:48:50 -0600 Subject: [PATCH] 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%) --- lfs.c | 78 +++++++++++++++++-------------------------- tests/test_mtree.toml | 52 +++++++++++++---------------- 2 files changed, 53 insertions(+), 77 deletions(-) diff --git a/lfs.c b/lfs.c index f8089e94..0f7781b9 100644 --- a/lfs.c +++ b/lfs.c @@ -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)))); diff --git a/tests/test_mtree.toml b/tests/test_mtree.toml index 7076f0dd..2fbf8c8b 100644 --- a/tests/test_mtree.toml +++ b/tests/test_mtree.toml @@ -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,