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:
+19
-19
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
+1111
-1106
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user