Switched to passing lfsr_data_t by value again
Thanks to poor compound literal optimization, it's actually cheaper to pass lfsr_data_t by value everywhere, than to make all LFSR_DATA_* macros lvalues: before: 34340 2896 after: 34292 (-0.1%) 2896 (+0.0%) Why are these two design choices linked? If lfsr_data_t is pass-by-address, the rvalue/lvalue disinction is important because we need to take the address of LFSR_DATA_* macros. If lfsr_data_t is pass-by-value, rvalue/lvalue doesn't really matter because we, well, pass by value. To be honest, this is a bit of an excuse for better lfsr_data_t ergonomics. It _is_ generally worse code-size wise to pass lfsr_data_t by value, because most ABI optimizations stop at 2 words and lfsr_data_t requires 3 words. But always passing lfsr_data_t by value even if it is suboptimal makes for more consistent internal interfaces. This also helps side-step a mistake I made earlier where I though cat/fromimm/fromleb128 were the only LFSR_DATA_* macros that needed to be lvalues to be consistent. THERE ARE MANY MORE LFSR_DATA_* macros, every LFSR_DATA_FROMBLAH macro to be specific, and the resulting code cost would be MUCH WORSE. --- This also add lfsr_sprout_t to complement lfsr_bptr_t/lfsr_shrub_t/etc. Unlike lfsr_data_t, lfsr_sprout_t _is_ pass-by-address Actually that's the only difference, haha. lfsr_sprout_t is a typedef. Though to be fair, by being pass-by-addres, lfsr_sprout_t keeps the internal sprout/shrub/bptr/btree inferfaces consistent, and saves a bit of code.
This commit is contained in:
+24
-24
@@ -3226,7 +3226,7 @@ code = '''
|
||||
lfs_size_t weight_;
|
||||
lfsr_data_t data_;
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aaa", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aaa", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_ERR_NOENT;
|
||||
'''
|
||||
|
||||
@@ -3262,7 +3262,7 @@ code = '''
|
||||
lfs_size_t weight_;
|
||||
lfsr_data_t data_;
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aaa", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aaa", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 0);
|
||||
@@ -3270,7 +3270,7 @@ code = '''
|
||||
lfsr_data_read(&lfs, &data_, buffer, 4) => 1;
|
||||
assert(memcmp(buffer, "0", 1) == 0);
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aab", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aab", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_LT;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 0);
|
||||
@@ -3315,7 +3315,7 @@ code = '''
|
||||
lfs_size_t weight_;
|
||||
lfsr_data_t data_;
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aaa", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aaa", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 0);
|
||||
@@ -3323,7 +3323,7 @@ code = '''
|
||||
lfsr_data_read(&lfs, &data_, buffer, 4) => 1;
|
||||
assert(memcmp(buffer, "0", 1) == 0);
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aab", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aab", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 1);
|
||||
@@ -3331,7 +3331,7 @@ code = '''
|
||||
lfsr_data_read(&lfs, &data_, buffer, 4) => 1;
|
||||
assert(memcmp(buffer, "1", 1) == 0);
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aac", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aac", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_LT;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 1);
|
||||
@@ -3380,7 +3380,7 @@ code = '''
|
||||
lfs_size_t weight_;
|
||||
lfsr_data_t data_;
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aaa", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aaa", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 0);
|
||||
@@ -3388,7 +3388,7 @@ code = '''
|
||||
lfsr_data_read(&lfs, &data_, buffer, 4) => 1;
|
||||
assert(memcmp(buffer, "0", 1) == 0);
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aab", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aab", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 1);
|
||||
@@ -3396,7 +3396,7 @@ code = '''
|
||||
lfsr_data_read(&lfs, &data_, buffer, 4) => 1;
|
||||
assert(memcmp(buffer, "1", 1) == 0);
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aac", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aac", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 2);
|
||||
@@ -3404,7 +3404,7 @@ code = '''
|
||||
lfsr_data_read(&lfs, &data_, buffer, 4) => 1;
|
||||
assert(memcmp(buffer, "2", 1) == 0);
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aad", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aad", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_LT;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 2);
|
||||
@@ -3453,7 +3453,7 @@ code = '''
|
||||
lfs_size_t weight_;
|
||||
lfsr_data_t data_;
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aaa", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aaa", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 0);
|
||||
@@ -3461,7 +3461,7 @@ code = '''
|
||||
lfsr_data_read(&lfs, &data_, buffer, 4) => 1;
|
||||
assert(memcmp(buffer, "0", 1) == 0);
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aab", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aab", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 1);
|
||||
@@ -3469,7 +3469,7 @@ code = '''
|
||||
lfsr_data_read(&lfs, &data_, buffer, 4) => 1;
|
||||
assert(memcmp(buffer, "1", 1) == 0);
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aac", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aac", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 2);
|
||||
@@ -3477,7 +3477,7 @@ code = '''
|
||||
lfsr_data_read(&lfs, &data_, buffer, 4) => 1;
|
||||
assert(memcmp(buffer, "2", 1) == 0);
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF("aad", 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF("aad", 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_LT;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == 2);
|
||||
@@ -3549,7 +3549,7 @@ code = '''
|
||||
'a'+((i/26/26) % 26), 'a'+((i/26) % 26), 'a'+(i % 26)
|
||||
};
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF(name, 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF(name, 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == i);
|
||||
@@ -3660,7 +3660,7 @@ code = '''
|
||||
lfs_size_t weight_;
|
||||
lfsr_data_t data_;
|
||||
for (lfs_size_t i = 0; i < sim_size; i++) {
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF(sim_names[i], 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF(sim_names[i], 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == i);
|
||||
@@ -3739,7 +3739,7 @@ code = '''
|
||||
'a'+((i/26/26) % 26), 'a'+((i/26) % 26), 'a'+(i % 26)
|
||||
};
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF(name, 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF(name, 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == i*W+W-1);
|
||||
@@ -3892,7 +3892,7 @@ code = '''
|
||||
weighted_bid += sim_weights[j];
|
||||
}
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF(sim_names[i], 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF(sim_names[i], 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == weighted_bid+sim_weights[i]-1);
|
||||
@@ -3971,7 +3971,7 @@ code = '''
|
||||
lfs_size_t split_bid;
|
||||
lfsr_data_t split_data;
|
||||
lfs_scmp_t cmp = lfsr_btree_namelookup(&lfs, &btree,
|
||||
&LFSR_DATA_BUF(name, 3),
|
||||
LFSR_DATA_BUF(name, 3),
|
||||
&split_bid, NULL, NULL, &split_data);
|
||||
assert(cmp >= 0);
|
||||
assert(cmp != LFS_CMP_EQ);
|
||||
@@ -4065,7 +4065,7 @@ code = '''
|
||||
lfs_size_t weight_;
|
||||
lfsr_data_t data_;
|
||||
for (lfs_size_t i = 0; i < sim_size; i++) {
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF(sim_names[i], 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF(sim_names[i], 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == i);
|
||||
@@ -4156,7 +4156,7 @@ code = '''
|
||||
lfs_size_t split_weight;
|
||||
lfsr_data_t split_data;
|
||||
lfs_scmp_t cmp = lfsr_btree_namelookup(&lfs, &btree,
|
||||
&LFSR_DATA_BUF(name, 3),
|
||||
LFSR_DATA_BUF(name, 3),
|
||||
&split_bid, NULL, &split_weight, &split_data);
|
||||
assert(cmp >= 0);
|
||||
assert(cmp != LFS_CMP_EQ);
|
||||
@@ -4286,7 +4286,7 @@ code = '''
|
||||
weighted_bid += sim_weights[j];
|
||||
}
|
||||
|
||||
lfsr_btree_namelookup(&lfs, &btree, &LFSR_DATA_BUF(sim_names[i], 3),
|
||||
lfsr_btree_namelookup(&lfs, &btree, LFSR_DATA_BUF(sim_names[i], 3),
|
||||
&bid_, &tag_, &weight_, &data_) => LFS_CMP_EQ;
|
||||
assert(tag_ == LFSR_TAG_DATA);
|
||||
assert(bid_ == weighted_bid+sim_weights[i]-1);
|
||||
@@ -4392,7 +4392,7 @@ code = '''
|
||||
printf("traversal: %d 0x%x data %d\n",
|
||||
bid,
|
||||
tinfo.tag,
|
||||
lfsr_data_size(&tinfo.u.data));
|
||||
lfsr_data_size(tinfo.u.data));
|
||||
|
||||
} else {
|
||||
// well this shouldn't happen
|
||||
@@ -4547,7 +4547,7 @@ code = '''
|
||||
printf("traversal: %d 0x%x data %d\n",
|
||||
bid,
|
||||
tinfo.tag,
|
||||
lfsr_data_size(&tinfo.u.data));
|
||||
lfsr_data_size(tinfo.u.data));
|
||||
|
||||
} else {
|
||||
// well this shouldn't happen
|
||||
|
||||
+545
-545
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user