aboutsummaryrefslogtreecommitdiff
path: root/internal/adler32
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-04-02 06:23:30 +0000
committerGravatar Runxi Yu2026-04-02 06:28:39 +0000
commita041d523de389b65b98a5373a8034041db2a8d83 (patch)
tree7b423dc735f463be616045f2c3c2095a7737aca7 /internal/adler32
parentresearch: Add dynamic pack resources (diff)
signatureNo signature
*: Remove
Diffstat (limited to 'internal/adler32')
-rw-r--r--internal/adler32/LICENSE30
-rw-r--r--internal/adler32/LICENSE.ZLIB17
-rw-r--r--internal/adler32/README1
-rw-r--r--internal/adler32/adler32_amd64.go89
-rw-r--r--internal/adler32/adler32_avx2.go6
-rw-r--r--internal/adler32/adler32_avx2.s251
-rw-r--r--internal/adler32/adler32_fallback.go19
-rw-r--r--internal/adler32/adler32_generic.go49
-rw-r--r--internal/adler32/bench_test.go26
-rw-r--r--internal/adler32/doc.go2
10 files changed, 0 insertions, 490 deletions
diff --git a/internal/adler32/LICENSE b/internal/adler32/LICENSE
deleted file mode 100644
index 5cec357a..00000000
--- a/internal/adler32/LICENSE
+++ /dev/null
@@ -1,30 +0,0 @@
-Copyright (c) 2024, Michal Hruby
-Copyright (c) 2017 The Chromium Authors. All rights reserved.
-Copyright (c) 1995-2024 Mark Adler
-Copyright (c) 1995-2024 Jean-loup Gailly
-Copyright (c) 2022 Adam Stylinski
-
-BSD 2-Clause License
-
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
diff --git a/internal/adler32/LICENSE.ZLIB b/internal/adler32/LICENSE.ZLIB
deleted file mode 100644
index c75c1568..00000000
--- a/internal/adler32/LICENSE.ZLIB
+++ /dev/null
@@ -1,17 +0,0 @@
-Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
-
-This software is provided 'as-is', without any express or implied
-warranty. In no event will the authors be held liable for any damages
-arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it
-freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-3. This notice may not be removed or altered from any source distribution.
diff --git a/internal/adler32/README b/internal/adler32/README
deleted file mode 100644
index b80acd00..00000000
--- a/internal/adler32/README
+++ /dev/null
@@ -1 +0,0 @@
-This package was mostly copied from github.com/mhr3/adler32-simd.
diff --git a/internal/adler32/adler32_amd64.go b/internal/adler32/adler32_amd64.go
deleted file mode 100644
index 49ed8b6e..00000000
--- a/internal/adler32/adler32_amd64.go
+++ /dev/null
@@ -1,89 +0,0 @@
-//go:build amd64 && !purego
-
-package adler32
-
-import (
- "encoding/binary"
- "errors"
- "hash"
- "hash/adler32"
-
- "codeberg.org/lindenii/furgit/internal/cpu"
-)
-
-// Size of an Adler-32 checksum in bytes.
-const Size = 4
-
-//nolint:gochecknoglobals
-var hasAVX2 = cpu.X86.HasAVX2
-
-// digest represents the partial evaluation of a checksum.
-// The low 16 bits are s1, the high 16 bits are s2.
-type digest uint32
-
-func (d *digest) Reset() { *d = 1 }
-
-// New returns a new hash.Hash32 computing the Adler-32 checksum.
-func New() hash.Hash32 {
- if !hasAVX2 {
- return adler32.New()
- }
-
- d := new(digest)
- d.Reset()
-
- return d
-}
-
-func (d *digest) MarshalBinary() ([]byte, error) {
- b := make([]byte, 0, marshaledSize)
- b = append(b, magic...)
- b = binary.BigEndian.AppendUint32(b, uint32(*d))
-
- return b, nil
-}
-
-func (d *digest) UnmarshalBinary(b []byte) error {
- if len(b) < len(magic) || string(b[:len(magic)]) != magic {
- return errors.New("hash/adler32: invalid hash state identifier")
- }
-
- if len(b) != marshaledSize {
- return errors.New("hash/adler32: invalid hash state size")
- }
-
- *d = digest(binary.BigEndian.Uint32(b[len(magic):]))
-
- return nil
-}
-
-func (d *digest) Size() int { return Size }
-
-func (d *digest) BlockSize() int { return 4 }
-
-func (d *digest) Write(data []byte) (nn int, err error) {
- if hasAVX2 && len(data) >= 64 {
- h := adler32_avx2(uint32(*d), data)
- *d = digest(h)
- } else {
- h := update(uint32(*d), data)
- *d = digest(h)
- }
-
- return len(data), nil
-}
-
-func (d *digest) Sum32() uint32 { return uint32(*d) }
-
-func (d *digest) Sum(in []byte) []byte {
- return binary.BigEndian.AppendUint32(in, uint32(*d))
-}
-
-// Checksum returns the Adler-32 checksum of data.
-func Checksum(data []byte) uint32 {
- if hasAVX2 && len(data) >= 64 {
- return adler32_avx2(1, data)
- }
-
- return adler32.Checksum(data)
-}
diff --git a/internal/adler32/adler32_avx2.go b/internal/adler32/adler32_avx2.go
deleted file mode 100644
index 042812b8..00000000
--- a/internal/adler32/adler32_avx2.go
+++ /dev/null
@@ -1,6 +0,0 @@
-//go:build !purego && amd64
-
-package adler32
-
-//go:noescape
-func adler32_avx2(in uint32, buf []byte) uint32
diff --git a/internal/adler32/adler32_avx2.s b/internal/adler32/adler32_avx2.s
deleted file mode 100644
index a883e357..00000000
--- a/internal/adler32/adler32_avx2.s
+++ /dev/null
@@ -1,251 +0,0 @@
-//go:build !purego && amd64
-
-#include "textflag.h"
-
-DATA adler32AVX2ByteWeights<>+0x00(SB)/8, $0x191a1b1c1d1e1f20
-DATA adler32AVX2ByteWeights<>+0x08(SB)/8, $0x1112131415161718
-DATA adler32AVX2ByteWeights<>+0x10(SB)/8, $0x090a0b0c0d0e0f10
-DATA adler32AVX2ByteWeights<>+0x18(SB)/8, $0x0102030405060708
-GLOBL adler32AVX2ByteWeights<>(SB), (RODATA|NOPTR), $32
-
-DATA adler32AVX2WordOne<>+0x00(SB)/2, $0x0001
-GLOBL adler32AVX2WordOne<>(SB), (RODATA|NOPTR), $2
-
-TEXT ·adler32_avx2(SB), NOSPLIT, $0-36
- MOVLQZX in+0(FP), DI
- MOVQ buf_base+8(FP), SI
- MOVQ buf_len+16(FP), DX
- MOVQ buf_cap+24(FP), CX
- TESTQ SI, SI
- JE return_one
- MOVL DI, AX
- TESTQ DX, DX
- JE return_current
- MOVL AX, CX
- SHRL $0x10, CX
- MOVWLZX AX, AX
- CMPQ DX, $0x20
- JB scalar_unrolled16
- MOVL $2147975281, DI
- VPXOR X0, X0, X0
- VMOVDQA adler32AVX2ByteWeights<>(SB), Y1
- VPBROADCASTW adler32AVX2WordOne<>(SB), Y2
- JMP vector_outer
-
-vector_tail_init:
- VMOVDQA Y4, Y6
- VPXOR X5, X5, X5
-
-vector_reduce_finalize_chunk:
- SUBQ AX, DX
- VPSLLD $0x05, Y5, Y4
- VPADDD Y3, Y4, Y3
- VEXTRACTI128 $0x1, Y6, X4
- VSHUFPS $0x88, X4, X6, X5
- VPSHUFD $0x88, X4, X4
- VPADDD X4, X5, X4
- VPSHUFD $0x55, X4, X5
- VPADDD X4, X5, X4
- VMOVD X4, AX
- MOVQ AX, CX
- IMULQ DI, CX
- SHRQ $0x2f, CX
- IMULL $0xfff1, CX
- SUBL CX, AX
- VEXTRACTI128 $0x1, Y3, X4
- VPADDD X3, X4, X3
- VPSHUFD $0xee, X3, X4
- VPADDD X4, X3, X3
- VPSHUFD $0x55, X3, X4
- VPADDD X3, X4, X3
- VMOVD X3, CX
- MOVQ CX, R8
- IMULQ DI, R8
- SHRQ $0x2f, R8
- IMULL $0xfff1, R8
- SUBL R8, CX
- CMPQ DX, $0x1f
- JBE scalar_entry
-
-vector_outer:
- VMOVD AX, X4
- VMOVD CX, X3
- CMPQ DX, $0x15b0
- MOVL $0x15b0, R8
- CMOVQCS DX, R8
- MOVL R8, AX
- ANDL $0x1fe0, AX
- JE vector_tail_init
- ADDQ $-0x20, R8
- VPXOR X5, X5, X5
- TESTL $0x20, R8
- JNE vector_block32_check
- VMOVDQU 0(SI), Y5
- ADDQ $0x20, SI
- LEAQ -0x20(AX), CX
- VPSADBW Y0, Y5, Y6
- VPADDD Y4, Y6, Y6
- VPMADDUBSW Y1, Y5, Y5
- VPMADDWD Y2, Y5, Y5
- VPADDD Y3, Y5, Y3
- VMOVDQA Y4, Y5
- VMOVDQA Y6, Y4
- CMPQ R8, $0x20
- JAE vector_block64_loop
- JMP vector_reduce_finalize_chunk
-
-vector_block32_check:
- MOVQ AX, CX
- CMPQ R8, $0x20
- JB vector_reduce_finalize_chunk
-
-vector_block64_loop:
- VMOVDQU 0(SI), Y6
- VMOVDQU 0x20(SI), Y7
- VPSADBW Y0, Y6, Y8
- VPADDD Y4, Y8, Y8
- VPADDD Y4, Y5, Y5
- VPMADDUBSW Y1, Y6, Y4
- VPMADDWD Y2, Y4, Y4
- VPADDD Y3, Y4, Y3
- ADDQ $0x40, SI
- VPSADBW Y0, Y7, Y4
- VPADDD Y4, Y8, Y4
- VPADDD Y5, Y8, Y5
- VPMADDUBSW Y1, Y7, Y6
- VPMADDWD Y2, Y6, Y6
- VPADDD Y3, Y6, Y3
- ADDQ $-0x40, CX
- JNE vector_block64_loop
- VMOVDQA Y4, Y6
- JMP vector_reduce_finalize_chunk
-
-return_one:
- MOVL $0x1, AX
-
-return_current:
- MOVL AX, ret+32(FP)
- RET
-
-scalar_entry:
- TESTQ DX, DX
- JE return_final
-
-scalar_unrolled16:
- CMPQ DX, $0x10
- JB scalar_byte_prelude
- MOVBLZX 0(SI), DI
- ADDL DI, AX
- ADDL AX, CX
- MOVBLZX 0x1(SI), DI
- ADDL AX, DI
- ADDL DI, CX
- MOVBLZX 0x2(SI), AX
- ADDL DI, AX
- ADDL AX, CX
- MOVBLZX 0x3(SI), DI
- ADDL AX, DI
- ADDL DI, CX
- MOVBLZX 0x4(SI), AX
- ADDL DI, AX
- ADDL AX, CX
- MOVBLZX 0x5(SI), DI
- ADDL AX, DI
- ADDL DI, CX
- MOVBLZX 0x6(SI), AX
- ADDL DI, AX
- ADDL AX, CX
- MOVBLZX 0x7(SI), DI
- ADDL AX, DI
- ADDL DI, CX
- MOVBLZX 0x8(SI), AX
- ADDL DI, AX
- ADDL AX, CX
- MOVBLZX 0x9(SI), DI
- ADDL AX, DI
- ADDL DI, CX
- MOVBLZX 0xa(SI), AX
- ADDL DI, AX
- ADDL AX, CX
- MOVBLZX 0xb(SI), DI
- ADDL AX, DI
- ADDL DI, CX
- MOVBLZX 0xc(SI), AX
- ADDL DI, AX
- ADDL AX, CX
- MOVBLZX 0xd(SI), DI
- ADDL AX, DI
- ADDL DI, CX
- MOVBLZX 0xe(SI), R8
- ADDL DI, R8
- ADDL R8, CX
- MOVBLZX 0xf(SI), AX
- ADDL R8, AX
- ADDL AX, CX
- ADDQ $-0x10, DX
- JE scalar_finalize
- ADDQ $0x10, SI
-
-scalar_byte_prelude:
- LEAQ -0x1(DX), DI
- MOVQ DX, R9
- ANDQ $0x3, R9
- JE scalar_dword_prelude
- XORL R8, R8
-
-scalar_byte_prelude_loop:
- MOVBLZX 0(SI)(R8*1), R10
- ADDL R10, AX
- ADDL AX, CX
- INCQ R8
- CMPQ R9, R8
- JNE scalar_byte_prelude_loop
- ADDQ R8, SI
- SUBQ R8, DX
-
-scalar_dword_prelude:
- CMPQ DI, $0x3
- JB scalar_finalize
- XORL DI, DI
-
-scalar_dword_loop:
- MOVBLZX 0(SI)(DI*1), R8
- ADDL AX, R8
- ADDL R8, CX
- MOVBLZX 0x1(SI)(DI*1), AX
- ADDL R8, AX
- ADDL AX, CX
- MOVBLZX 0x2(SI)(DI*1), R8
- ADDL AX, R8
- ADDL R8, CX
- MOVBLZX 0x3(SI)(DI*1), AX
- ADDL R8, AX
- ADDL AX, CX
- ADDQ $0x4, DI
- CMPQ DX, DI
- JNE scalar_dword_loop
-
-scalar_finalize:
- LEAL -0xfff1(AX), DX
- CMPL AX, $0xfff1
- CMOVLCS AX, DX
- MOVL CX, AX
- MOVL $2147975281, SI
- IMULQ AX, SI
- SHRQ $0x2f, SI
- MOVL SI, AX
- IMULL $0xfff1, AX
- SUBL AX, CX
- SHLL $0x10, CX
- ORL DX, CX
- MOVL CX, AX
- VZEROUPPER
- MOVL AX, ret+32(FP)
- RET
-
-return_final:
- SHLL $0x10, CX
- ORL CX, AX
- VZEROUPPER
- MOVL AX, ret+32(FP)
- RET
diff --git a/internal/adler32/adler32_fallback.go b/internal/adler32/adler32_fallback.go
deleted file mode 100644
index 717d860d..00000000
--- a/internal/adler32/adler32_fallback.go
+++ /dev/null
@@ -1,19 +0,0 @@
-//go:build !amd64 || purego
-
-package adler32
-
-import (
- "hash"
- "hash/adler32"
-)
-
-// The size of an Adler-32 checksum in bytes.
-const Size = 4
-
-// New returns a new hash.Hash32 computing the Adler-32 checksum.
-func New() hash.Hash32 {
- return adler32.New()
-}
-
-// Checksum returns the Adler-32 checksum of data.
-func Checksum(data []byte) uint32 { return adler32.Checksum(data) }
diff --git a/internal/adler32/adler32_generic.go b/internal/adler32/adler32_generic.go
deleted file mode 100644
index 56e3ff8b..00000000
--- a/internal/adler32/adler32_generic.go
+++ /dev/null
@@ -1,49 +0,0 @@
-package adler32
-
-const (
- // mod is the largest prime that is less than 65536.
- mod = 65521
- // nmax is the largest n such that
- // 255 * n * (n+1) / 2 + (n+1) * (mod-1) <= 2^32-1.
- // It is mentioned in RFC 1950 (search for "5552").
- nmax = 5552
-
- // binary representation compatible with standard library.
- magic = "adl\x01"
- marshaledSize = len(magic) + 4
-)
-
-// Add p to the running checksum d.
-func update(d uint32, p []byte) uint32 {
- s1, s2 := d&0xffff, d>>16
-
- for len(p) > 0 {
- var q []byte
- if len(p) > nmax {
- p, q = p[:nmax], p[nmax:]
- }
-
- for len(p) >= 4 {
- s1 += uint32(p[0])
- s2 += s1
- s1 += uint32(p[1])
- s2 += s1
- s1 += uint32(p[2])
- s2 += s1
- s1 += uint32(p[3])
- s2 += s1
- p = p[4:]
- }
-
- for _, x := range p {
- s1 += uint32(x)
- s2 += s1
- }
-
- s1 %= mod
- s2 %= mod
- p = q
- }
-
- return s2<<16 | s1
-}
diff --git a/internal/adler32/bench_test.go b/internal/adler32/bench_test.go
deleted file mode 100644
index 1161221a..00000000
--- a/internal/adler32/bench_test.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package adler32_test
-
-import (
- "testing"
-
- "codeberg.org/lindenii/furgit/internal/adler32"
-)
-
-const benchmarkSize = 64 * 1024
-
-//nolint:gochecknoglobals
-var data = make([]byte, benchmarkSize)
-
-func init() { //nolint:gochecknoinits
- for i := range benchmarkSize {
- data[i] = byte(i % 256)
- }
-}
-
-func BenchmarkChecksum(b *testing.B) {
- b.ReportAllocs()
-
- for b.Loop() {
- adler32.Checksum(data)
- }
-}
diff --git a/internal/adler32/doc.go b/internal/adler32/doc.go
deleted file mode 100644
index add30867..00000000
--- a/internal/adler32/doc.go
+++ /dev/null
@@ -1,2 +0,0 @@
-// Package adler32 implements an SIMD-optimized Adler-32 checksum.
-package adler32