Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

zstd: bump avo pin, regenerate arm64 asm with BMI2 lowering#1167

Merged
klauspost merged 2 commits into
klauspost:masterklauspost/compress:masterfrom
honeycombio:lizf.zstd-arm64-bmi2-avo-bumphoneycombio/compress:lizf.zstd-arm64-bmi2-avo-bumpCopy head branch name to clipboard
Jul 10, 2026
Merged

zstd: bump avo pin, regenerate arm64 asm with BMI2 lowering#1167
klauspost merged 2 commits into
klauspost:masterklauspost/compress:masterfrom
honeycombio:lizf.zstd-arm64-bmi2-avo-bumphoneycombio/compress:lizf.zstd-arm64-bmi2-avo-bumpCopy head branch name to clipboard

Conversation

@lizthegrey

@lizthegrey lizthegrey commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Follow-up to #1160. Bumps the pinned avo commit (mmcloughlin/avo#486, still open upstream) past a few fixes made since the pin was cut, and regenerates seqdec_arm64.s/fse_decoder_arm64.s.

What changed in avo

  • Fixed a flag-liveness bug: a flag-transparent MOV between a flag producer and the Jcc/CMOV consuming it could leave the branch reading stale flags. Fixed with a backward dataflow scan instead of a single-instruction lookahead.
  • Fixed 32-bit CMPL/TESTL folding to a 64-bit compare (reads garbage from unproven upper bits). Now lowered natively at 32-bit width.
  • Extended the same class of fix to CMPW/CMPB/TESTW/TESTB for the narrow case where every consumer is EQ/NE only — equality doesn't depend on sign, so zero-extending both operands before a full-width compare is correct regardless of the surrounding dataflow. buildDtable's newState == uint16(u) check needs this; ordering consumers still fail loud.
  • arm64 now prefers a function's BMI2 twin over its generic twin when both exist (arm64 has native flag-free equivalents for the BMI2 shift/bit-field idioms), so seqdec_arm64.s now lowers sequenceDecs_decode_bmi2/decodeSync_bmi2 instead of the generic _amd64 variants. Symbol names are unaffected.

Each fix has an executable differential test (amd64 native as reference, arm64 native/qemu under test) in avo's tests/arm64lower/.

Did this affect already-shipped v1.19.0?

I checked whether the sub-word compare fold (the general form of which avo now refuses to lower) actually produced wrong output in the currently-shipped fse_decoder_arm64.s. It didn't, in any of the three places it's used:

  • v == -1: the source was already sign-extended via a MOVH load, so the old 64-bit CMN was comparing an already-correct value.
  • nBits == 0 self-test: the source was already zero-extended via MOVBU, so the old 64-bit TST was equivalent to the intended 8-bit self-test.
  • newState == u: both operands are provably ≤ tableSize by that point (the immediately preceding bounds check, and u being a small loop counter), so the 64-bit compare and a correct 16-bit compare agree.

I also isolated the flag-liveness and CMPL/TESTL fixes by regenerating against an intermediate avo commit with only those two fixes: seqdec_arm64.s came out byte-identical to what's shipping, and neither generator uses CMPL/TESTL at all. So none of today's avo fixes changed actual decoder behavior — the risky pattern was real but happened to be safe everywhere it was actually used, which is exactly why the stricter check is worth having going forward rather than relying on that being true forever.

Validation

  • go vet and go test ./zstd/... pass natively on arm64 (darwin/arm64).
  • FuzzDecodeAll: 26.4M execs, 0 crashers.
  • FuzzDecoder: 9.6M execs, 0 crashers.
  • FuzzDecAllNoBMI2: pass.
  • Symbol names in the regenerated .s confirmed to still match the //go:noescape declarations in seqdec_arm64.go/fse_decoder_asm.go.

avo#486 is still open upstream; this bump points at the honeycombio/avo fork the same way #1160 did.

Summary by CodeRabbit

  • Bug Fixes
    • Improved arm64 decompression reliability by tightening internal validation during decoding table setup.
    • Reduced the chance of decoding errors in edge cases.
  • Chores
    • Updated the bundled code-generation dependency to a newer version.

Bumps the pinned avo commit (honeycombio/avo) past today's fixes: a
flag-liveness bug and a 32-bit CMPL/TESTL fold bug (neither actually reachable
from this codebase - seqdec's generated output is byte-identical without
them, and CMPL/TESTL aren't used here at all), plus a new EQ/NE-only
sub-32-bit CMPW/TESTB lowering that fse_decoder's buildDtable needs.

Checked whether the sub-word compare/test fold (the general form of which the
new avo now refuses to lower) actually produced wrong output in the
already-shipped fse_decoder_arm64.s: it didn't. All three call sites happened
to operate on registers already clean above the compared width (via an
upstream sign/zero-extending load, or a preceding bounds check), verified by
tracing register provenance by hand. Real risk, but mitigated by accident
rather than by design - which is exactly why the stricter check is worth
having going forward.

The new avo also prefers the BMI2 twin over the generic one when lowering to
arm64 (arm64 has native flag-free equivalents for the BMI2 idioms), so
seqdec_arm64.s now lowers sequenceDecs_decode_bmi2/decodeSync_bmi2 instead of
the generic variants. Symbol names are unaffected (arm64Name strips the
_bmi2/_amd64 suffix either way).

Validated: go vet and go test ./zstd/... pass natively on arm64; FuzzDecodeAll
(26.4M execs), FuzzDecoder (9.6M execs), and FuzzDecAllNoBMI2 pass with zero
crashers.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: b9a7eba5-4ecc-44a1-9fa9-273727f220c9

📥 Commits

Reviewing files that changed from the base of the PR and between bce7d60 and 0792647.

⛔ Files ignored due to path filters (1)
  • zstd/_generate/go.sum is excluded by !**/*.sum
📒 Files selected for processing (2)
  • zstd/_generate/go.mod
  • zstd/seqdec_arm64.s
💤 Files with no reviewable changes (1)
  • zstd/seqdec_arm64.s
✅ Files skipped from review due to trivial changes (1)
  • zstd/_generate/go.mod

📝 Walkthrough

Walkthrough

This PR updates arm64 FSE decoder comparison logic, changes generated arm64 BMI2 skip annotations, and adjusts the generator module’s avo dependency and replace target.

Changes

ARM64 FSE Decoder Fix

Layer / File(s) Summary
Masked comparison rework in buildDtable_asm
zstd/fse_decoder_arm64.s
Replaces a CMN $1, R9-based check with 16-bit masking of R9/R16 followed by CMP, and reworks build_table_check1_ok to mask R1, R6, and R7 before TST/CMP comparisons.

ARM64 BMI2 Skip Annotation Update

Layer / File(s) Summary
Updated BMI2 skip annotations
zstd/seqdec_arm64.s
Updates the generated BMI2 skip comments for the arm64 decoder, sync decoder, and safe sync decoder to say the generic twin is preferred on arm64.

Code Generator Dependency Update

Layer / File(s) Summary
Dependency and replace directive update
zstd/_generate/go.mod
Adds a direct require entry for github.com/mmcloughlin/avo at a newer pseudo-version and updates the replace directive to use github.com/honeycombio/avo at a newer pseudo-version.

Estimated code review effort: 2 (Simple) | ~15 minutes

Possibly related PRs

  • klauspost/compress#1160: Updates the same arm64 FSE decoder assembly area in zstd/fse_decoder_arm64.s, including buildDtable_asm.

Suggested reviewers: klauspost

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately captures the main changes: bumping the avo pin and regenerating arm64 assembly with updated BMI2-related lowering.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@klauspost klauspost left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How does the changes affect performance?

lizthegrey added a commit to honeycombio/avo that referenced this pull request Jul 9, 2026
… generic

Benchmarking klauspost/compress#1167 on real hardware (Apple M4 and Cortex-A72)
showed the unconditional "prefer BMI2" policy is a real regression, not the
win its doc comment assumed: seqdec_decode/decodeSync are 13-50% slower with
the BMI2 twin lowered, on both chips. BMI2 x86 code is tuned for x86 (BEXTR
packs into one instruction what arm64 needs two UBFX to unpack; the
flag-free shifts avoid an x86 partial-register stall arm64 doesn't have), so
mechanically lowering it is not reliably faster once ported.

BMI2 lowering support itself isn't wrong to have -- a generator may only emit
a BMI2 variant with no generic twin, and that still needs to lower correctly.
What was wrong was defaulting to prefer it whenever a choice exists without
measuring. Add Config.ARM64PreferBMI2 (default false) so a caller who HAS
measured a win for their case can opt in; a function with only one variant is
unaffected either way.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Benchmarking the BMI2-preferred seqdec on real hardware (Apple M4, Cortex-A72)
showed it's 13-50% slower than the generic twin, not faster as assumed -- see
the follow-up avo commit for why. Bump past that fix; avo's arm64 lowering now
defaults to the generic twin (ARM64PreferBMI2 defaults false), which this repo
doesn't override. seqdec_arm64.s is now byte-identical to what klauspost#1160 shipped,
aside from the skip-reason comment text; fse_decoder_arm64.s is unchanged
(the CMPW/TESTB fix has no BMI2 twin to choose between).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@lizthegrey

Copy link
Copy Markdown
Contributor Author

Performance

Good question to ask — it caught a real regression. This was mostly a correctness fix, but it also switched seqdec to prefer the BMI2 twin on arm64. Benchmarked before/after (#1160 baseline vs. this PR) on Apple M4 and a Cortex-A72 box:

With BMI2 preferred, seqdec_decode/decodeSync were 13-50% slower on both, not faster as assumed. I've flagged that back off (avo's arm64 lowering now takes it as a config, default off). With BMI2 off, seqdec is back at parity; BuildDtable is +4-14% slower, which is the real, measured cost of the correctness fix itself (masking operands before the affected compares).

M4: with BMI2 preferred (reverted)
goos: darwin
goarch: arm64
pkg: github.com/klauspost/compress/zstd
cpu: Apple M4
                                                                                      │   old.txt   │               bmi2.txt               │
                                                                                      │   sec/op    │    sec/op     vs base                │
BuildDtable/litLength-10                                                                163.9n ± 2%    171.1n ± 2%   +4.39% (p=0.001 n=10)
BuildDtable/offset-10                                                                   121.5n ± 2%    129.7n ± 3%   +6.66% (p=0.000 n=10)
BuildDtable/matchLength-10                                                              173.6n ± 2%    189.4n ± 1%   +9.13% (p=0.000 n=10)
_seqdec_decode/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-10          61.97µ ± 0%    73.47µ ± 1%  +18.55% (p=0.000 n=10)
_seqdec_decode/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-10         56.45µ ± 1%    67.66µ ± 0%  +19.86% (p=0.000 n=10)
_seqdec_decode/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-10                 58.14µ ± 3%    87.37µ ± 1%  +50.27% (p=0.000 n=10)
_seqdec_decode/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-10          6.823µ ± 0%    8.170µ ± 1%  +19.75% (p=0.000 n=10)
_seqdec_decode/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-10          17.41µ ± 3%    20.78µ ± 3%  +19.41% (p=0.000 n=10)
_seqdec_decode/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-10           42.64µ ± 1%    50.41µ ± 2%  +18.22% (p=0.000 n=10)
_seqdec_decode/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-10                    4.985µ ± 1%    5.924µ ± 1%  +18.85% (p=0.000 n=10)
_seqdec_decode/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-10       79.95µ ± 2%    91.90µ ± 1%  +14.95% (p=0.000 n=10)
_seqdec_decode/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-10                     25.36n ± 1%    26.73n ± 1%   +5.40% (p=0.000 n=10)
_seqdec_decode/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-10                      400.6n ± 0%    492.1n ± 1%  +22.86% (p=0.000 n=10)
_seqdec_decode/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-10                  4.506µ ± 1%    5.491µ ± 0%  +21.85% (p=0.000 n=10)
_seqdec_decode/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-10                     14.66µ ± 1%    17.03µ ± 0%  +16.16% (p=0.000 n=10)
_seqdec_decode/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-10                20.29µ ± 1%    24.12µ ± 3%  +18.90% (p=0.000 n=10)
_seqdec_decode/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-10                      41.31µ ± 1%    47.83µ ± 1%  +15.77% (p=0.000 n=10)
_seqdec_execute/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-10         24.23µ ± 2%    24.25µ ± 2%        ~ (p=0.912 n=10)
_seqdec_execute/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-10        23.69µ ± 1%    23.31µ ± 1%   -1.61% (p=0.000 n=10)
_seqdec_execute/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-10                16.98µ ± 1%    16.97µ ± 1%        ~ (p=0.631 n=10)
_seqdec_execute/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-10         8.504µ ± 0%    8.546µ ± 2%   +0.50% (p=0.011 n=10)
_seqdec_execute/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-10         9.995µ ± 1%   10.188µ ± 7%   +1.94% (p=0.045 n=10)
_seqdec_execute/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-10          18.01µ ± 1%    17.97µ ± 1%        ~ (p=0.063 n=10)
_seqdec_execute/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-10                   4.398µ ± 1%    4.315µ ± 0%   -1.89% (p=0.000 n=10)
_seqdec_execute/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-10      21.58µ ± 0%    21.71µ ± 1%   +0.61% (p=0.003 n=10)
_seqdec_execute/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-10                    2.144µ ± 1%    2.109µ ± 2%   -1.66% (p=0.007 n=10)
_seqdec_execute/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-10                     2.732µ ± 0%    2.627µ ± 2%   -3.83% (p=0.001 n=10)
_seqdec_execute/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-10                 4.123µ ± 1%    4.106µ ± 1%   -0.42% (p=0.034 n=10)
_seqdec_execute/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-10                    7.949µ ± 0%    8.037µ ± 2%   +1.10% (p=0.000 n=10)
_seqdec_execute/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-10               10.21µ ± 3%    10.11µ ± 5%   -1.01% (p=0.041 n=10)
_seqdec_execute/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-10                     15.38µ ± 1%    15.13µ ± 1%   -1.61% (p=0.000 n=10)
_seqdec_decodeSync/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-10      79.27µ ± 4%    79.71µ ± 2%        ~ (p=0.123 n=10)
_seqdec_decodeSync/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-10     78.45µ ± 3%    79.62µ ± 1%        ~ (p=0.060 n=10)
_seqdec_decodeSync/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-10             84.92µ ± 1%    97.46µ ± 5%  +14.76% (p=0.000 n=10)
_seqdec_decodeSync/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-10      15.08µ ± 1%    15.30µ ± 2%   +1.43% (p=0.000 n=10)
_seqdec_decodeSync/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-10      24.84µ ± 1%    25.40µ ± 1%   +2.27% (p=0.000 n=10)
_seqdec_decodeSync/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-10       51.20µ ± 1%    54.87µ ± 0%   +7.17% (p=0.000 n=10)
_seqdec_decodeSync/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-10                8.337µ ± 0%    8.710µ ± 2%   +4.48% (p=0.000 n=10)
_seqdec_decodeSync/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-10   93.24µ ± 4%   102.61µ ± 3%  +10.05% (p=0.000 n=10)
_seqdec_decodeSync/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-10                 2.151µ ± 0%    2.155µ ± 1%        ~ (p=0.060 n=10)
_seqdec_decodeSync/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-10                  3.042µ ± 0%    2.988µ ± 1%   -1.78% (p=0.000 n=10)
_seqdec_decodeSync/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-10              8.525µ ± 0%    9.150µ ± 6%   +7.33% (p=0.000 n=10)
_seqdec_decodeSync/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-10                 19.28µ ± 3%    21.19µ ± 1%   +9.91% (p=0.000 n=10)
_seqdec_decodeSync/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-10            25.91µ ± 1%    29.62µ ± 3%  +14.32% (p=0.000 n=10)
_seqdec_decodeSync/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-10                  46.52µ ± 2%    55.76µ ± 1%  +19.88% (p=0.000 n=10)
geomean                                                                                 9.768µ         10.56µ        +8.09%
M4: this PR (BMI2 off) vs #1160
goos: darwin
goarch: arm64
pkg: github.com/klauspost/compress/zstd
cpu: Apple M4
                                                                                      │   old.txt   │              fixed.txt              │
                                                                                      │   sec/op    │   sec/op     vs base                │
BuildDtable/litLength-10                                                                163.9n ± 2%   172.4n ± 2%   +5.22% (p=0.001 n=10)
BuildDtable/offset-10                                                                   121.5n ± 2%   126.6n ± 2%   +4.15% (p=0.000 n=10)
BuildDtable/matchLength-10                                                              173.6n ± 2%   183.1n ± 2%   +5.50% (p=0.000 n=10)
_seqdec_decode/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-10          61.97µ ± 0%   61.83µ ± 0%   -0.22% (p=0.004 n=10)
_seqdec_decode/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-10         56.45µ ± 1%   55.75µ ± 1%   -1.23% (p=0.003 n=10)
_seqdec_decode/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-10                 58.14µ ± 3%   57.19µ ± 0%   -1.64% (p=0.000 n=10)
_seqdec_decode/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-10          6.823µ ± 0%   6.781µ ± 1%   -0.62% (p=0.002 n=10)
_seqdec_decode/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-10          17.41µ ± 3%   17.26µ ± 0%   -0.83% (p=0.000 n=10)
_seqdec_decode/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-10           42.64µ ± 1%   42.32µ ± 0%   -0.74% (p=0.001 n=10)
_seqdec_decode/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-10                    4.985µ ± 1%   4.924µ ± 0%   -1.21% (p=0.000 n=10)
_seqdec_decode/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-10       79.95µ ± 2%   79.41µ ± 0%   -0.68% (p=0.000 n=10)
_seqdec_decode/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-10                     25.36n ± 1%   25.16n ± 0%   -0.75% (p=0.017 n=10)
_seqdec_decode/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-10                      400.6n ± 0%   397.4n ± 0%   -0.77% (p=0.000 n=10)
_seqdec_decode/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-10                  4.506µ ± 1%   4.455µ ± 0%   -1.14% (p=0.000 n=10)
_seqdec_decode/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-10                     14.66µ ± 1%   14.36µ ± 1%   -2.08% (p=0.001 n=10)
_seqdec_decode/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-10                20.29µ ± 1%   19.97µ ± 0%   -1.59% (p=0.000 n=10)
_seqdec_decode/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-10                      41.31µ ± 1%   40.87µ ± 0%   -1.09% (p=0.000 n=10)
_seqdec_execute/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-10         24.23µ ± 2%   23.96µ ± 0%   -1.12% (p=0.000 n=10)
_seqdec_execute/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-10        23.69µ ± 1%   23.46µ ± 1%   -0.97% (p=0.001 n=10)
_seqdec_execute/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-10                16.98µ ± 1%   16.97µ ± 0%        ~ (p=0.493 n=10)
_seqdec_execute/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-10         8.504µ ± 0%   8.512µ ± 0%        ~ (p=0.403 n=10)
_seqdec_execute/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-10         9.995µ ± 1%   9.964µ ± 1%        ~ (p=0.218 n=10)
_seqdec_execute/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-10          18.01µ ± 1%   17.90µ ± 0%   -0.62% (p=0.005 n=10)
_seqdec_execute/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-10                   4.398µ ± 1%   4.484µ ± 0%   +1.96% (p=0.000 n=10)
_seqdec_execute/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-10      21.58µ ± 0%   21.42µ ± 0%   -0.75% (p=0.000 n=10)
_seqdec_execute/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-10                    2.144µ ± 1%   2.152µ ± 0%        ~ (p=0.380 n=10)
_seqdec_execute/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-10                     2.732µ ± 0%   2.721µ ± 3%        ~ (p=0.446 n=10)
_seqdec_execute/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-10                 4.123µ ± 1%   4.075µ ± 1%   -1.16% (p=0.004 n=10)
_seqdec_execute/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-10                    7.949µ ± 0%   7.922µ ± 1%        ~ (p=0.239 n=10)
_seqdec_execute/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-10               10.21µ ± 3%   10.07µ ± 3%   -1.37% (p=0.041 n=10)
_seqdec_execute/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-10                     15.38µ ± 1%   15.14µ ± 3%   -1.57% (p=0.018 n=10)
_seqdec_decodeSync/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-10      79.27µ ± 4%   87.62µ ± 5%  +10.54% (p=0.000 n=10)
_seqdec_decodeSync/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-10     78.45µ ± 3%   81.60µ ± 3%   +4.02% (p=0.001 n=10)
_seqdec_decodeSync/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-10             84.92µ ± 1%   84.28µ ± 0%   -0.75% (p=0.001 n=10)
_seqdec_decodeSync/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-10      15.08µ ± 1%   14.89µ ± 0%   -1.28% (p=0.000 n=10)
_seqdec_decodeSync/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-10      24.84µ ± 1%   24.47µ ± 1%   -1.48% (p=0.000 n=10)
_seqdec_decodeSync/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-10       51.20µ ± 1%   50.66µ ± 0%   -1.05% (p=0.009 n=10)
_seqdec_decodeSync/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-10                8.337µ ± 0%   8.312µ ± 1%        ~ (p=0.289 n=10)
_seqdec_decodeSync/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-10   93.24µ ± 4%   95.96µ ± 5%        ~ (p=0.218 n=10)
_seqdec_decodeSync/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-10                 2.151µ ± 0%   2.152µ ± 0%        ~ (p=0.810 n=10)
_seqdec_decodeSync/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-10                  3.042µ ± 0%   2.995µ ± 0%   -1.56% (p=0.000 n=10)
_seqdec_decodeSync/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-10              8.525µ ± 0%   8.476µ ± 0%   -0.57% (p=0.000 n=10)
_seqdec_decodeSync/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-10                 19.28µ ± 3%   18.85µ ± 0%   -2.20% (p=0.000 n=10)
_seqdec_decodeSync/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-10            25.91µ ± 1%   25.34µ ± 0%   -2.21% (p=0.000 n=10)
_seqdec_decodeSync/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-10                  46.52µ ± 2%   45.96µ ± 1%   -1.19% (p=0.009 n=10)
geomean                                                                                 9.768µ        9.763µ        -0.05%
Cortex-A72: with BMI2 preferred (reverted)
goos: linux
goarch: arm64
pkg: github.com/klauspost/compress/zstd
cpu: Cortex-A72
                                                                                      │ daisy-old.txt │            daisy-bmi2.txt            │
                                                                                      │    sec/op     │    sec/op     vs base                │
BuildDtable/matchLength-16                                                                1.007µ ± 0%    1.145µ ± 0%  +13.76% (p=0.000 n=10)
BuildDtable/litLength-16                                                                  985.6n ± 0%   1025.0n ± 0%   +4.00% (p=0.000 n=10)
BuildDtable/offset-16                                                                     666.2n ± 0%    744.5n ± 0%  +11.76% (p=0.000 n=10)
_seqdec_decode/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-16            333.4µ ± 0%    426.8µ ± 0%  +28.00% (p=0.000 n=10)
_seqdec_decode/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-16           322.5µ ± 0%    411.8µ ± 0%  +27.66% (p=0.000 n=10)
_seqdec_decode/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-16                   377.2µ ± 0%    503.4µ ± 1%  +33.47% (p=0.000 n=10)
_seqdec_decode/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-16            45.41µ ± 0%    52.74µ ± 0%  +16.14% (p=0.000 n=10)
_seqdec_decode/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-16            107.6µ ± 0%    124.7µ ± 0%  +15.86% (p=0.000 n=10)
_seqdec_decode/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-16             236.0µ ± 0%    302.6µ ± 0%  +28.23% (p=0.000 n=10)
_seqdec_decode/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-16                      31.29µ ± 0%    36.55µ ± 0%  +16.81% (p=0.000 n=10)
_seqdec_decode/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-16         430.8µ ± 0%    543.3µ ± 0%  +26.12% (p=0.000 n=10)
_seqdec_decode/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-16                       163.2n ± 0%    178.5n ± 0%   +9.38% (p=0.000 n=10)
_seqdec_decode/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-16                        2.620µ ± 0%    3.199µ ± 0%  +22.10% (p=0.000 n=10)
_seqdec_decode/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-16                    29.55µ ± 0%    35.84µ ± 0%  +21.29% (p=0.000 n=10)
_seqdec_decode/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-16                       92.79µ ± 0%   108.05µ ± 0%  +16.45% (p=0.000 n=10)
_seqdec_decode/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-16                  130.1µ ± 0%    147.2µ ± 0%  +13.10% (p=0.000 n=10)
_seqdec_decode/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-16                        226.8µ ± 0%    284.9µ ± 0%  +25.58% (p=0.000 n=10)
_seqdec_execute/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-16           257.3µ ± 6%    206.3µ ± 0%  -19.83% (p=0.000 n=10)
_seqdec_execute/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-16          207.6µ ± 0%    207.2µ ± 0%   -0.21% (p=0.001 n=10)
_seqdec_execute/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-16                  116.2µ ± 0%    113.7µ ± 0%   -2.14% (p=0.000 n=10)
_seqdec_execute/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-16           50.28µ ± 0%    50.20µ ± 0%        ~ (p=0.256 n=10)
_seqdec_execute/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-16           80.05µ ± 0%    80.34µ ± 0%        ~ (p=0.052 n=10)
_seqdec_execute/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-16            152.2µ ± 0%    152.1µ ± 0%        ~ (p=0.796 n=10)
_seqdec_execute/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-16                     24.62µ ± 1%    24.83µ ± 0%   +0.88% (p=0.002 n=10)
_seqdec_execute/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-16        172.6µ ± 1%    173.9µ ± 1%   +0.79% (p=0.015 n=10)
_seqdec_execute/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-16                      13.34µ ± 1%    13.36µ ± 0%        ~ (p=0.100 n=10)
_seqdec_execute/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-16                       14.88µ ± 0%    13.97µ ± 0%   -6.07% (p=0.000 n=10)
_seqdec_execute/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-16                   37.69µ ± 1%    36.46µ ± 1%   -3.25% (p=0.000 n=10)
_seqdec_execute/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-16                      61.66µ ± 0%    61.27µ ± 0%   -0.63% (p=0.000 n=10)
_seqdec_execute/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-16                 81.19µ ± 1%    80.34µ ± 1%   -1.05% (p=0.001 n=10)
_seqdec_execute/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-16                       125.0µ ± 1%    125.0µ ± 1%        ~ (p=0.912 n=10)
_seqdec_decodeSync/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-16        670.3µ ± 0%    775.8µ ± 0%  +15.74% (p=0.000 n=10)
_seqdec_decodeSync/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-16       634.1µ ± 0%    745.5µ ± 0%  +17.57% (p=0.000 n=10)
_seqdec_decodeSync/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-16               575.5µ ± 0%    712.4µ ± 0%  +23.80% (p=0.000 n=10)
_seqdec_decodeSync/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-16        101.2µ ± 0%    115.0µ ± 0%  +13.65% (p=0.000 n=10)
_seqdec_decodeSync/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-16        208.6µ ± 0%    237.2µ ± 0%  +13.69% (p=0.000 n=10)
_seqdec_decodeSync/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-16         446.3µ ± 0%    514.5µ ± 0%  +15.29% (p=0.000 n=10)
_seqdec_decodeSync/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-16                  58.88µ ± 0%    66.60µ ± 0%  +13.12% (p=0.000 n=10)
_seqdec_decodeSync/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-16     776.2µ ± 0%    908.6µ ± 0%  +17.07% (p=0.000 n=10)
_seqdec_decodeSync/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-16                   13.47µ ± 1%    13.60µ ± 1%   +0.96% (p=0.011 n=10)
_seqdec_decodeSync/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-16                    17.77µ ± 0%    17.43µ ± 0%   -1.90% (p=0.000 n=10)
_seqdec_decodeSync/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-16                56.40µ ± 0%    61.70µ ± 0%   +9.40% (p=0.000 n=10)
_seqdec_decodeSync/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-16                   158.6µ ± 0%    179.2µ ± 0%  +13.04% (p=0.000 n=10)
_seqdec_decodeSync/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-16              221.5µ ± 0%    253.1µ ± 0%  +14.26% (p=0.000 n=10)
_seqdec_decodeSync/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-16                    407.4µ ± 0%    475.1µ ± 0%  +16.64% (p=0.000 n=10)
geomean                                                                                   67.59µ         74.42µ       +10.10%
Cortex-A72: this PR (BMI2 off) vs #1160
goos: linux
goarch: arm64
pkg: github.com/klauspost/compress/zstd
cpu: Cortex-A72
                                                                                      │ daisy-old.txt │           daisy-fixed.txt            │
                                                                                      │    sec/op     │    sec/op     vs base                │
BuildDtable/matchLength-16                                                                1.007µ ± 0%    1.145µ ± 0%  +13.76% (p=0.000 n=10)
BuildDtable/litLength-16                                                                  985.6n ± 0%   1025.0n ± 0%   +4.00% (p=0.000 n=10)
BuildDtable/offset-16                                                                     666.2n ± 0%    744.8n ± 0%  +11.79% (p=0.000 n=10)
_seqdec_decode/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-16            333.4µ ± 0%    336.9µ ± 0%   +1.04% (p=0.000 n=10)
_seqdec_decode/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-16           322.5µ ± 0%    322.3µ ± 0%   -0.09% (p=0.000 n=10)
_seqdec_decode/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-16                   377.2µ ± 0%    380.1µ ± 0%   +0.78% (p=0.000 n=10)
_seqdec_decode/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-16            45.41µ ± 0%    45.50µ ± 1%   +0.19% (p=0.037 n=10)
_seqdec_decode/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-16            107.6µ ± 0%    108.3µ ± 0%   +0.69% (p=0.000 n=10)
_seqdec_decode/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-16             236.0µ ± 0%    236.0µ ± 0%        ~ (p=0.912 n=10)
_seqdec_decode/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-16                      31.29µ ± 0%    31.35µ ± 0%   +0.19% (p=0.000 n=10)
_seqdec_decode/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-16         430.8µ ± 0%    426.6µ ± 0%   -0.97% (p=0.000 n=10)
_seqdec_decode/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-16                       163.2n ± 0%    163.2n ± 0%        ~ (p=0.990 n=10)
_seqdec_decode/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-16                        2.620µ ± 0%    2.617µ ± 0%        ~ (p=0.066 n=10)
_seqdec_decode/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-16                    29.55µ ± 0%    29.48µ ± 0%   -0.23% (p=0.000 n=10)
_seqdec_decode/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-16                       92.79µ ± 0%    93.38µ ± 0%   +0.63% (p=0.000 n=10)
_seqdec_decode/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-16                  130.1µ ± 0%    127.3µ ± 0%   -2.22% (p=0.000 n=10)
_seqdec_decode/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-16                        226.8µ ± 0%    229.0µ ± 0%   +0.94% (p=0.000 n=10)
_seqdec_execute/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-16           257.3µ ± 6%    205.8µ ± 1%  -20.01% (p=0.000 n=10)
_seqdec_execute/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-16          207.6µ ± 0%    207.4µ ± 0%   -0.12% (p=0.011 n=10)
_seqdec_execute/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-16                  116.2µ ± 0%    114.2µ ± 0%   -1.76% (p=0.000 n=10)
_seqdec_execute/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-16           50.28µ ± 0%    55.49µ ± 0%  +10.36% (p=0.000 n=10)
_seqdec_execute/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-16           80.05µ ± 0%    81.05µ ± 0%   +1.25% (p=0.000 n=10)
_seqdec_execute/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-16            152.2µ ± 0%    295.1µ ± 2%  +93.90% (p=0.000 n=10)
_seqdec_execute/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-16                     24.62µ ± 1%    25.01µ ± 0%   +1.59% (p=0.000 n=10)
_seqdec_execute/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-16        172.6µ ± 1%    172.3µ ± 1%        ~ (p=0.579 n=10)
_seqdec_execute/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-16                      13.34µ ± 1%    13.38µ ± 0%   +0.26% (p=0.033 n=10)
_seqdec_execute/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-16                       14.88µ ± 0%    14.02µ ± 0%   -5.74% (p=0.000 n=10)
_seqdec_execute/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-16                   37.69µ ± 1%    37.73µ ± 1%        ~ (p=0.529 n=10)
_seqdec_execute/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-16                      61.66µ ± 0%    61.50µ ± 0%   -0.26% (p=0.030 n=10)
_seqdec_execute/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-16                 81.19µ ± 1%    77.98µ ± 0%   -3.96% (p=0.000 n=10)
_seqdec_execute/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-16                       125.0µ ± 1%    126.1µ ± 1%   +0.88% (p=0.029 n=10)
_seqdec_decodeSync/n-12286-lits-13914-prev-9869-1990358-3296656-win-4194304.blk-16        670.3µ ± 0%    667.4µ ± 1%        ~ (p=0.063 n=10)
_seqdec_decodeSync/n-12485-lits-6960-prev-976039-2250252-2463561-win-4194304.blk-16       634.1µ ± 0%    633.8µ ± 0%        ~ (p=0.247 n=10)
_seqdec_decodeSync/n-14746-lits-14461-prev-209-8-1379909-win-4194304.blk-16               575.5µ ± 0%    569.3µ ± 0%   -1.07% (p=0.000 n=10)
_seqdec_decodeSync/n-1525-lits-1498-prev-2009476-797934-2994405-win-4194304.blk-16        101.2µ ± 0%    101.1µ ± 1%        ~ (p=0.912 n=10)
_seqdec_decodeSync/n-3478-lits-3628-prev-895243-2104056-2119329-win-4194304.blk-16        208.6µ ± 0%    208.9µ ± 0%   +0.12% (p=0.002 n=10)
_seqdec_decodeSync/n-8422-lits-5840-prev-168095-2298675-433830-win-4194304.blk-16         446.3µ ± 0%    440.1µ ± 0%   -1.37% (p=0.000 n=10)
_seqdec_decodeSync/n-1000-lits-1057-prev-21887-92-217-win-8388608.blk-16                  58.88µ ± 0%    59.08µ ± 0%   +0.34% (p=0.034 n=10)
_seqdec_decodeSync/n-15134-lits-20798-prev-4882976-4884216-4474622-win-8388608.blk-16     776.2µ ± 0%    775.3µ ± 0%   -0.11% (p=0.001 n=10)
_seqdec_decodeSync/n-2-lits-0-prev-620601-689171-848-win-8388608.blk-16                   13.47µ ± 1%    13.59µ ± 1%   +0.88% (p=0.034 n=10)
_seqdec_decodeSync/n-90-lits-67-prev-19498-23-19710-win-8388608.blk-16                    17.77µ ± 0%    16.65µ ± 0%   -6.28% (p=0.000 n=10)
_seqdec_decodeSync/n-931-lits-1179-prev-36502-1526-1518-win-8388608.blk-16                56.40µ ± 0%    56.30µ ± 1%   -0.17% (p=0.015 n=10)
_seqdec_decodeSync/n-2898-lits-4062-prev-335-386-751-win-8388608.blk-16                   158.6µ ± 0%    158.3µ ± 0%   -0.18% (p=0.019 n=10)
_seqdec_decodeSync/n-4056-lits-12419-prev-10792-66-309849-win-8388608.blk-16              221.5µ ± 0%    222.4µ ± 0%   +0.40% (p=0.005 n=10)
_seqdec_decodeSync/n-8028-lits-4568-prev-917-65-920-win-8388608.blk-16                    407.4µ ± 0%    408.2µ ± 1%        ~ (p=0.086 n=10)
geomean                                                                                   67.59µ         68.60µ        +1.48%

@klauspost
klauspost merged commit c0bbc84 into klauspost:master Jul 10, 2026
27 checks passed
@lizthegrey

Copy link
Copy Markdown
Contributor Author

Thanks. For changelog note PR title is deceptive, I didn't fix it in time.

@klauspost

Copy link
Copy Markdown
Owner

Ah, yeah, I fixed the title when merging only. No biggie.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

Morty Proxy This is a proxified and sanitized view of the page, visit original site.