Use history_available in decode_huffman_fast
name old speed new speed delta
wuffs_deflate_decode_1k_full_init/clang5 134MB/s ± 1% 137MB/s ± 0% +1.74% (p=0.000 n=10+10)
wuffs_deflate_decode_1k_part_init/clang5 162MB/s ± 1% 165MB/s ± 0% +1.79% (p=0.000 n=10+10)
wuffs_deflate_decode_10k_full_init/clang5 220MB/s ± 0% 226MB/s ± 0% +2.76% (p=0.000 n=10+9)
wuffs_deflate_decode_10k_part_init/clang5 225MB/s ± 0% 232MB/s ± 1% +2.77% (p=0.000 n=9+9)
wuffs_deflate_decode_100k_just_one_read/clang5 270MB/s ± 0% 265MB/s ± 0% -1.93% (p=0.000 n=10+10)
wuffs_deflate_decode_100k_many_big_reads/clang5 225MB/s ± 0% 223MB/s ± 0% -1.04% (p=0.000 n=10+9)
wuffs_deflate_decode_1k_full_init/gcc7 151MB/s ± 1% 151MB/s ± 0% ~ (p=0.277 n=9+8)
wuffs_deflate_decode_1k_part_init/gcc7 186MB/s ± 1% 186MB/s ± 0% ~ (p=0.696 n=10+8)
wuffs_deflate_decode_10k_full_init/gcc7 256MB/s ± 1% 253MB/s ± 1% -0.98% (p=0.001 n=10+9)
wuffs_deflate_decode_10k_part_init/gcc7 264MB/s ± 1% 261MB/s ± 0% -1.11% (p=0.000 n=10+9)
wuffs_deflate_decode_100k_just_one_read/gcc7 310MB/s ± 1% 312MB/s ± 0% +0.43% (p=0.013 n=10+9)
wuffs_deflate_decode_100k_many_big_reads/gcc7 247MB/s ± 0% 251MB/s ± 0% +1.47% (p=0.000 n=10+9)
diff --git a/lang/check/bounds.go b/lang/check/bounds.go
index a2d36ef..6e3c7d9 100644
--- a/lang/check/bounds.go
+++ b/lang/check/bounds.go
@@ -1113,10 +1113,10 @@
}
func (q *checker) canCopyNFromHistoryFast(recv *a.Expr, args []*a.Node) error {
- // As per cgen's base-private.h, there are three pre-conditions:
+ // As per cgen's io-private.h, there are three pre-conditions:
// - n <= this.available()
// - distance > 0
- // - distance <= this.since_mark().length()
+ // - distance <= this.history_available()
if len(args) != 2 {
return fmt.Errorf("check: internal error: inconsistent copy_n_from_history_fast arguments")
@@ -1174,7 +1174,7 @@
return fmt.Errorf("check: could not prove distance > 0")
}
- // Check "distance <= this.since_mark().length()".
+ // Check "distance <= this.history_available()".
check2:
for {
for _, x := range q.facts {
@@ -1192,22 +1192,18 @@
continue
}
- // Check that the RHS is "recv.since_mark().length()".
+ // Check that the RHS is "recv.history_available()".
y, method, yArgs := splitReceiverMethodArgs(x.RHS().AsExpr())
- if method != t.IDLength || len(yArgs) != 0 {
+ if method != t.IDHistoryAvailable || len(yArgs) != 0 {
continue
}
- z, method, zArgs := splitReceiverMethodArgs(y)
- if method != t.IDSinceMark || len(zArgs) != 0 {
- continue
- }
- if !z.Eq(recv) {
+ if !y.Eq(recv) {
continue
}
break check2
}
- return fmt.Errorf("check: could not prove distance <= %s.since_mark().length()", recv.Str(q.tm))
+ return fmt.Errorf("check: could not prove distance <= %s.history_available()", recv.Str(q.tm))
}
return nil
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index e0a0e06..41ab2b0 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -7709,11 +7709,11 @@
v_n_copied = 0;
while (true) {
if (((uint64_t)((v_dist_minus_1 + 1))) >
- ((uint64_t)(iop_a_dst - a_dst.private_impl.mark))) {
+ ((uint64_t)(iop_a_dst - a_dst.private_impl.buf->data.ptr))) {
v_hlen = 0;
- v_hdist =
- ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1))) -
- ((uint64_t)(iop_a_dst - a_dst.private_impl.mark)))));
+ v_hdist = ((uint32_t)(
+ (((uint64_t)((v_dist_minus_1 + 1))) -
+ ((uint64_t)(iop_a_dst - a_dst.private_impl.buf->data.ptr)))));
if (v_length > v_hdist) {
v_length -= v_hdist;
v_hlen = v_hdist;
@@ -7747,7 +7747,7 @@
goto label_0_continue;
}
if (((uint64_t)((v_dist_minus_1 + 1))) >
- ((uint64_t)(iop_a_dst - a_dst.private_impl.mark))) {
+ ((uint64_t)(iop_a_dst - a_dst.private_impl.buf->data.ptr))) {
status = wuffs_deflate__error__internal_error_inconsistent_distance;
goto exit;
}
diff --git a/std/deflate/decode_huffman_fast.wuffs b/std/deflate/decode_huffman_fast.wuffs
index d98af1c..6fa3c5f 100644
--- a/std/deflate/decode_huffman_fast.wuffs
+++ b/std/deflate/decode_huffman_fast.wuffs
@@ -292,12 +292,12 @@
pre args.dst.available() >= 258,
{
// Copy from this.history.
- if ((dist_minus_1 + 1) as base.u64) > args.dst.since_mark().length() {
+ if ((dist_minus_1 + 1) as base.u64) > args.dst.history_available() {
// Set (hlen, hdist) to be the length-distance pair to copy
// from this.history, and (length, distance) to be the
// remaining length-distance pair to copy from args.dst.
hlen = 0
- hdist = (((dist_minus_1 + 1) as base.u64) - args.dst.since_mark().length()) as base.u32
+ hdist = (((dist_minus_1 + 1) as base.u64) - args.dst.history_available()) as base.u32
if length > hdist {
assert hdist < length via "a < b: b > a"()
assert hdist < 0x8000 via "a < b: a < c; c <= b"(c:length)
@@ -345,12 +345,12 @@
continue:loop
}
- if ((dist_minus_1 + 1) as base.u64) > args.dst.since_mark().length() {
+ if ((dist_minus_1 + 1) as base.u64) > args.dst.history_available() {
return "#internal error: inconsistent distance"
}
}
// Once again, redundant but explicit assertions.
- assert ((dist_minus_1 + 1) as base.u64) <= args.dst.since_mark().length()
+ assert ((dist_minus_1 + 1) as base.u64) <= args.dst.history_available()
assert args.dst.available() >= 258
// We can therefore prove: