Adopted mask bits for tag lookup/append

This lets us cram in one more mask for potential redund bits:

  name                 tag    mask
  LFSR_TAG_MASK0    0x0000  0x0fff  ---- 1111 1111 1111
  LFSR_TAG_MASK2    0x1000  0x0ffc  ---- 1111 1111 11--
  LFSR_TAG_MASK8    0x2000  0x0f00  ---- 1111 ---- ----
  LFSR_TAG_MASK12   0x3000  0x0000  ---- ---- ---- ----
                                    '.-' '.-' '---.---'
                          mode bits -'    |       |   ^
                            suptype ------'       |   |
                            subtype --------------'   |
                        redund bits ------------------'

I toyed around with a bitwise alternative to the lookup table, but
couldn't come up with anything simpler than these:

- 0xfff & ~((((1<<((i>>1)*8))-1) << ((i&1)*4)) | ((1<<(i*2))-1))
- 0xfff & ~((1 << (((i>>1)*8)+((i&1)<<(1+(i>>1)))))-1)
- 0xfff & ~((1<<(2*i*i))-1) (requires multiply and 32-bit shift)

---

This also replaces the mdir/rbyd/btree/mtree lookup/sublookup/suplookup
functions with a single flexible lookup function that accepts tag masks.

This ended up adding a bit of code/stack (the extra NULL args are
surprisingly pricey), but will hopefully make the redund bits
easier/cheaper to use:

           code          stack          ctx
  before: 35548           2472          636
  after:  35584 (+0.1%)   2480 (+0.3%)  636 (+0.0%)
This commit is contained in:
Christopher Haster
2025-04-18 02:51:03 -05:00
parent 8f1ccf089e
commit 200830aafe
6 changed files with 1451 additions and 1502 deletions
+19 -19
View File
@@ -727,7 +727,7 @@ code = '''
// update the tree
lfsr_btree_commit(&lfs, &btree, 0, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
"A", 1))) => 0;
printf("btree: w%d 0x%x.%x\n",
btree.weight,
@@ -776,11 +776,11 @@ code = '''
// update the tree
lfsr_btree_commit(&lfs, &btree, 0, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
"A", 1))) => 0;
lfsr_btree_commit(&lfs, &btree, 1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
"B", 1))) => 0;
printf("btree: w%d 0x%x.%x\n",
btree.weight,
@@ -838,15 +838,15 @@ code = '''
// update the tree
lfsr_btree_commit(&lfs, &btree, 0, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
"A", 1))) => 0;
lfsr_btree_commit(&lfs, &btree, 1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
"B", 1))) => 0;
lfsr_btree_commit(&lfs, &btree, 2, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
"C", 1))) => 0;
printf("btree: w%d 0x%x.%x\n",
btree.weight,
@@ -913,7 +913,7 @@ code = '''
for (lfs_size_t i = 0; i < N; i++) {
lfsr_btree_commit(&lfs, &btree, i, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
&(uint8_t){'A'+(i % 26)}, 1))) => 0;
}
printf("btree: w%d 0x%x.%x\n",
@@ -986,7 +986,7 @@ code = '''
// update btree
lfsr_btree_commit(&lfs, &btree, bid, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
&(uint8_t){'A'+(i % 26)}, 1))) => 0;
// update sim
@@ -1060,7 +1060,7 @@ code = '''
for (lfs_size_t i = 0; i < N; i++) {
lfsr_btree_commit(&lfs, &btree, i*W+W-1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
&(uint8_t){'A'+(i % 26)}, 1))) => 0;
}
printf("btree: w%d 0x%x.%x\n",
@@ -1160,7 +1160,7 @@ code = '''
lfsr_btree_commit(&lfs, &btree,
weighted_bid+sim_weights[bid]-1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
&(uint8_t){'A'+(i % 26)}, 1),
LFSR_RATTR(
LFSR_TAG_GROW, +weight-sim_weights[bid]))) => 0;
@@ -2492,7 +2492,7 @@ code = '''
memset(buf2, 'b', SIZE);
lfsr_btree_commit(&lfs, &btree, 1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
buf2, SIZE))) => 0;
assert(btree.weight == 2);
@@ -2561,7 +2561,7 @@ code = '''
memset(buf2, 'b', SIZE);
lfsr_btree_commit(&lfs, &btree, 1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
buf2, SIZE))) => 0;
assert(btree.weight == 2);
@@ -2698,18 +2698,18 @@ code = '''
memset(buf2, 'b', SIZE);
lfsr_btree_commit(&lfs, &btree, 1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
buf2, SIZE))) => 0;
assert(btree.weight == 2);
// now make both entries small so they should be merged if either compacts
lfsr_btree_commit(&lfs, &btree, 0, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
"a", 1))) => 0;
lfsr_btree_commit(&lfs, &btree, 1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
"b", 1))) => 0;
// force compaction, while removing one entry, this drops the rbyd
@@ -2794,7 +2794,7 @@ code = '''
// update btree
lfsr_btree_commit(&lfs, &btree, bid, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
&(uint8_t){'a'+(i % 26)}, 1))) => 0;
// update sim
@@ -2916,7 +2916,7 @@ code = '''
lfsr_btree_commit(&lfs, &btree,
weighted_bid+sim_weights[bid]-1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
&(uint8_t){'a'+(i % 26)}, 1),
LFSR_RATTR(
LFSR_TAG_GROW, +weight-sim_weights[bid]))) => 0;
@@ -3855,7 +3855,7 @@ code = '''
// update btree
lfsr_btree_commit(&lfs, &btree, bid, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
&(uint8_t){'0'+(i % 10)}, 1))) => 0;
// update sim
@@ -4028,7 +4028,7 @@ code = '''
lfsr_btree_commit(&lfs, &btree,
weighted_bid+sim_weights[bid]-1, LFSR_RATTRS(
LFSR_RATTR_BUF(
LFSR_TAG_SUB | LFSR_TAG_DATA, 0,
LFSR_TAG_MASK8 | LFSR_TAG_DATA, 0,
&(uint8_t){'0'+(i % 10)}, 1),
LFSR_RATTR(
LFSR_TAG_GROW, +weight-sim_weights[bid]))) => 0;
+3 -3
View File
@@ -979,7 +979,7 @@ code = '''
// delete any bshrub/btree
lfsr_mdir_commit(&lfs, &file.b.o.mdir, LFSR_RATTRS(
LFSR_RATTR(
LFSR_TAG_RM | LFSR_TAG_SUB | LFSR_TAG_STRUCT, 0))) => 0;
LFSR_TAG_RM | LFSR_TAG_MASK8 | LFSR_TAG_STRUCT, 0))) => 0;
lfsr_file_close(&lfs, &file) => 0;
@@ -1111,7 +1111,7 @@ code = '''
.rattr_count=1})))) => 0;
lfsr_mdir_commit(&lfs, &file.b.o.mdir, LFSR_RATTRS(
LFSR_RATTR_SHRUB(
LFSR_TAG_SUB | LFSR_TAG_BSHRUB, 0,
LFSR_TAG_MASK8 | LFSR_TAG_BSHRUB, 0,
&file.b.shrub_))) => 0;
lfsr_file_close(&lfs, &file) => 0;
@@ -1234,7 +1234,7 @@ code = '''
LFSR_RATTR(LFSR_TAG_RM, -1))) => 0;
lfsr_mdir_commit(&lfs, &file.b.o.mdir, LFSR_RATTRS(
LFSR_RATTR_BTREE(
LFSR_TAG_SUB | LFSR_TAG_BTREE, 0,
LFSR_TAG_MASK8 | LFSR_TAG_BTREE, 0,
&file.b.shrub))) => 0;
lfsr_file_close(&lfs, &file) => 0;
+1 -1
View File
@@ -1132,7 +1132,7 @@ code = '''
&mdir, NULL, &did) => 0;
lfsr_mdir_commit(&lfs, &mdir, LFSR_RATTRS(
LFSR_RATTR_CAT(
LFSR_TAG_SUB | (LFSR_TAG_NAME + 0x13), 0,
LFSR_TAG_MASK8 | (LFSR_TAG_NAME + 0x13), 0,
lfsr_data_fromleb128(did, (uint8_t[LFSR_LEB128_DSIZE]){0}),
LFSR_DATA_BUF(path, lfsr_path_namelen(path))))) => 0;
lfsr_unmount(&lfs) => 0;
+201 -201
View File
File diff suppressed because it is too large Load Diff
+1111 -1106
View File
File diff suppressed because it is too large Load Diff