Merge branch 'asm-arm64' into arm64-merge-2
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cbe85b4..542b91f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml
@@ -15,7 +15,7 @@ steps: - name: Install go - uses: actions/setup-go@v2 + uses: WillAbides/setup-go-faster@v1.5.0 with: go-version: ${{ matrix.go-version }} @@ -38,7 +38,7 @@ steps: - name: Install go - uses: actions/setup-go@v2 + uses: WillAbides/setup-go-faster@v1.5.0 with: go-version: ${{ matrix.go-version }}
diff --git a/bench_test.go b/bench_test.go index 4dfeb91..1633823 100644 --- a/bench_test.go +++ b/bench_test.go
@@ -10,6 +10,7 @@ n int64 }{ {"4B", 4}, + {"16B", 16}, {"100B", 100}, {"4KB", 4e3}, {"10MB", 10e6},
diff --git a/xxhash.go b/xxhash.go index 15c835d..c5f1a39 100644 --- a/xxhash.go +++ b/xxhash.go
@@ -69,21 +69,23 @@ n = len(b) d.total += uint64(n) + memleft := d.mem[d.n&(len(d.mem)-1):] + if d.n+n < 32 { // This new data doesn't even fill the current block. - copy(d.mem[d.n:], b) + copy(memleft, b) d.n += n return } if d.n > 0 { // Finish off the partial block. - copy(d.mem[d.n:], b) + c := copy(memleft, b) d.v1 = round(d.v1, u64(d.mem[0:8])) d.v2 = round(d.v2, u64(d.mem[8:16])) d.v3 = round(d.v3, u64(d.mem[16:24])) d.v4 = round(d.v4, u64(d.mem[24:32])) - b = b[32-d.n:] + b = b[c:] d.n = 0 } @@ -133,21 +135,20 @@ h += d.total - i, end := 0, d.n - for ; i+8 <= end; i += 8 { - k1 := round(0, u64(d.mem[i:i+8])) + b := d.mem[:d.n&(len(d.mem)-1)] + for ; len(b) >= 8; b = b[8:] { + k1 := round(0, u64(b[:8])) h ^= k1 h = rol27(h)*prime1 + prime4 } - if i+4 <= end { - h ^= uint64(u32(d.mem[i:i+4])) * prime1 + if len(b) >= 4 { + h ^= uint64(u32(b[:4])) * prime1 h = rol23(h)*prime2 + prime3 - i += 4 + b = b[4:] } - for i < end { - h ^= uint64(d.mem[i]) * prime5 + for ; len(b) > 0; b = b[1:] { + h ^= uint64(b[0]) * prime5 h = rol11(h) * prime1 - i++ } h ^= h >> 33
diff --git a/xxhash_other.go b/xxhash_other.go index 2deb1ca..e2680b7 100644 --- a/xxhash_other.go +++ b/xxhash_other.go
@@ -37,19 +37,18 @@ h += uint64(n) - i, end := 0, len(b) - for ; i+8 <= end; i += 8 { - k1 := round(0, u64(b[i:i+8:len(b)])) + for ; len(b) >= 8; b = b[8:] { + k1 := round(0, u64(b[:8])) h ^= k1 h = rol27(h)*prime1 + prime4 } - if i+4 <= end { - h ^= uint64(u32(b[i:i+4:len(b)])) * prime1 + if len(b) >= 4 { + h ^= uint64(u32(b[:4])) * prime1 h = rol23(h)*prime2 + prime3 - i += 4 + b = b[4:] } - for ; i < end; i++ { - h ^= uint64(b[i]) * prime5 + for ; len(b) > 0; b = b[1:] { + h ^= uint64(b[0]) * prime5 h = rol11(h) * prime1 }