Tweak std/png.decoder.filter_4 wuffs_png_decode_19k_8bpp/clang9 91.8MB/s ± 1% 93.5MB/s ± 0% +1.86% (p=0.008 n=5+5) wuffs_png_decode_40k_24bpp/clang9 115MB/s ± 1% 112MB/s ± 0% -2.74% (p=0.008 n=5+5) wuffs_png_decode_77k_8bpp/clang9 345MB/s ± 0% 351MB/s ± 0% +1.83% (p=0.008 n=5+5) wuffs_png_decode_552k_32bpp/clang9 152MB/s ± 1% 129MB/s ± 1% -15.14% (p=0.008 n=5+5) wuffs_png_decode_4002k_24bpp/clang9 116MB/s ± 0% 115MB/s ± 0% -1.57% (p=0.008 n=5+5) wuffs_png_decode_filter_1_sub/clang9 982MB/s ± 0% 938MB/s ± 0% -4.52% (p=0.008 n=5+5) wuffs_png_decode_filter_2_up/clang9 12.7GB/s ± 0% 13.4GB/s ± 0% +5.28% (p=0.008 n=5+5) wuffs_png_decode_filter_3_average/clang9 757MB/s ± 0% 759MB/s ± 0% +0.29% (p=0.032 n=5+5) wuffs_png_decode_filter_4_paeth/clang9 82.1MB/s ± 0% 108.7MB/s ± 0% +32.41% (p=0.008 n=5+5) wuffs_png_decode_19k_8bpp/gcc10 98.9MB/s ± 0% 99.7MB/s ± 1% +0.87% (p=0.008 n=5+5) wuffs_png_decode_40k_24bpp/gcc10 118MB/s ± 1% 116MB/s ± 0% -1.08% (p=0.008 n=5+5) wuffs_png_decode_77k_8bpp/gcc10 321MB/s ± 0% 322MB/s ± 0% +0.32% (p=0.016 n=4+5) wuffs_png_decode_552k_32bpp/gcc10 144MB/s ± 0% 162MB/s ± 0% +13.03% (p=0.008 n=5+5) wuffs_png_decode_4002k_24bpp/gcc10 118MB/s ± 1% 120MB/s ± 1% +1.32% (p=0.008 n=5+5) wuffs_png_decode_filter_1_sub/gcc10 903MB/s ± 0% 1119MB/s ± 0% +23.96% (p=0.008 n=5+5) wuffs_png_decode_filter_2_up/gcc10 11.0GB/s ± 0% 11.1GB/s ± 0% +0.68% (p=0.008 n=5+5) wuffs_png_decode_filter_3_average/gcc10 749MB/s ± 0% 749MB/s ± 0% ~ (p=1.000 n=5+5) wuffs_png_decode_filter_4_paeth/gcc10 81.8MB/s ± 0% 90.5MB/s ± 1% +10.74% (p=0.008 n=5+5)
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c index 9cfd29a..079f3d4 100644 --- a/release/c/wuffs-unsupported-snapshot.c +++ b/release/c/wuffs-unsupported-snapshot.c
@@ -30103,12 +30103,12 @@ v_pc = (0 - v_pc); } if ((v_pa <= v_pb) && (v_pa <= v_pc)) { - a_curr.ptr[v_i] += ((uint8_t)((v_fa & 255))); } else if (v_pb <= v_pc) { - a_curr.ptr[v_i] += ((uint8_t)((v_fb & 255))); + v_fa = v_fb; } else { - a_curr.ptr[v_i] += ((uint8_t)((v_fc & 255))); + v_fa = v_fc; } + a_curr.ptr[v_i] += ((uint8_t)((v_fa & 255))); v_i += 1; } return wuffs_base__make_empty_struct();
diff --git a/std/png/decode_filter_fallback.wuffs b/std/png/decode_filter_fallback.wuffs index 5e8d6b1..fdc0708 100644 --- a/std/png/decode_filter_fallback.wuffs +++ b/std/png/decode_filter_fallback.wuffs
@@ -71,6 +71,7 @@ i += 1 assert i >= filter_distance via "a >= b: a >= (b + c); 0 <= c"(c: 1) } endwhile + } else { n = args.curr.length().min(a: args.prev.length()) i = 0 @@ -161,12 +162,13 @@ pc = 0 ~mod- pc } if (pa <= pb) and (pa <= pc) { - args.curr[i] ~mod+= (fa & 0xFF) as base.u8 + // No-op. } else if pb <= pc { - args.curr[i] ~mod+= (fb & 0xFF) as base.u8 + fa = fb } else { - args.curr[i] ~mod+= (fc & 0xFF) as base.u8 + fa = fc } + args.curr[i] ~mod+= (fa & 0xFF) as base.u8 i += 1 assert i >= filter_distance via "a >= b: a >= (b + c); 0 <= c"(c: 1) } endwhile