shithub: furgit

Download patch

ref: 6c605fdf71f8e710de7da10e52f8c58385cc0f80
parent: 20a26c67f53252f643a9f20bac0fd73b3b8be863
author: Runxi Yu <me@runxiyu.org>
date: Sun Feb 22 07:21:14 EST 2026

adler32: Remove sse3 and arm64/neon

I can't maintain it

--- a/internal/adler32/adler32_amd64.go
+++ b/internal/adler32/adler32_amd64.go
@@ -15,7 +15,6 @@
 const Size = 4
 
 var (
-	hasSSE3 = cpu.X86.HasSSE3
 	hasAVX2 = cpu.X86.HasAVX2
 )
 
@@ -27,7 +26,7 @@
 
 // New returns a new hash.Hash32 computing the Adler-32 checksum.
 func New() hash.Hash32 {
-	if !hasSSE3 {
+	if !hasAVX2 {
 		return adler32.New()
 	}
 	d := new(digest)
@@ -58,13 +57,8 @@
 func (d *digest) BlockSize() int { return 4 }
 
 func (d *digest) Write(data []byte) (nn int, err error) {
-	if len(data) >= 64 {
-		var h uint32
-		if hasAVX2 {
-			h = adler32_avx2(uint32(*d), data)
-		} else {
-			h = adler32_sse3(uint32(*d), data)
-		}
+	if hasAVX2 && len(data) >= 64 {
+		h := adler32_avx2(uint32(*d), data)
 		*d = digest(h)
 	} else {
 		h := update(uint32(*d), data)
@@ -82,12 +76,8 @@
 
 // Checksum returns the Adler-32 checksum of data.
 func Checksum(data []byte) uint32 {
-	if !hasSSE3 || len(data) < 64 {
-		return update(1, data)
-	}
-
-	if hasAVX2 {
+	if hasAVX2 && len(data) >= 64 {
 		return adler32_avx2(1, data)
 	}
-	return adler32_sse3(1, data)
+	return adler32.Checksum(data)
 }
--- a/internal/adler32/adler32_arm64.go
+++ /dev/null
@@ -1,73 +1,0 @@
-//go:build arm64 && !purego
-
-package adler32
-
-import (
-	"encoding/binary"
-	"errors"
-	"hash"
-)
-
-// The size of an Adler-32 checksum in bytes.
-const Size = 4
-
-// 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 {
-	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 len(data) >= 64 {
-		h := adler32_neon(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 {
-	s := uint32(*d)
-	return append(in, byte(s>>24), byte(s>>16), byte(s>>8), byte(s))
-}
-
-// Checksum returns the Adler-32 checksum of data.
-func Checksum(data []byte) uint32 {
-	if len(data) >= 64 {
-		return adler32_neon(1, data)
-	}
-	return update(1, data)
-}
--- a/internal/adler32/adler32_fallback.go
+++ b/internal/adler32/adler32_fallback.go
@@ -1,4 +1,4 @@
-//go:build (!arm64 && !amd64) || purego
+//go:build !amd64 || purego
 
 package adler32
 
--- a/internal/adler32/adler32_neon.go
+++ /dev/null
@@ -1,6 +1,0 @@
-//go:build !purego && arm64
-
-package adler32
-
-//go:noescape
-func adler32_neon(in uint32, buf []byte) uint32
--- a/internal/adler32/adler32_neon.s
+++ /dev/null
@@ -1,208 +1,0 @@
-//go:build !purego && arm64
-
-#include "textflag.h"
-
-DATA mult_table<>+0x00(SB)/8, $0x001d001e001f0020
-DATA mult_table<>+0x08(SB)/8, $0x0019001a001b001c
-DATA mult_table<>+0x10(SB)/8, $0x0015001600170018
-DATA mult_table<>+0x18(SB)/8, $0x0011001200130014
-DATA mult_table<>+0x20(SB)/8, $0x000d000e000f0010
-DATA mult_table<>+0x28(SB)/8, $0x0009000a000b000c
-DATA mult_table<>+0x30(SB)/8, $0x0005000600070008
-DATA mult_table<>+0x38(SB)/8, $0x0001000200030004
-GLOBL mult_table<>(SB), (RODATA|NOPTR), $64
-
-TEXT ·adler32_neon(SB), NOSPLIT, $0-36
-	MOVW in+0(FP), R0
-	MOVD buf_base+8(FP), R1
-	MOVD buf_len+16(FP), R2
-	MOVD buf_cap+24(FP), R3
-	NOP                     // (skipped)                            // stp	x29, x30, [sp, #-16]!
-	ANDS $15, R1, R10       // <--                                  // ands	x10, x1, #0xf
-	ANDW $65535, R0, R8     // <--                                  // and	w8, w0, #0xffff
-	LSRW $16, R0, R9        // <--                                  // lsr	w9, w0, #16
-	NOP                     // (skipped)                            // mov	x29, sp
-	BEQ  vector_entry       // <--                                  // b.eq	.vector_entry
-	ADD  $1, R1, R11        // <--                                  // add	x11, x1, #1
-	MOVD R1, R12            // <--                                  // mov	x12, x1
-
-align_prologue_loop:
-	WORD  $0x3840158d       // MOVBU.P 1(R12), R13                  // ldrb	w13, [x12], #1
-	SUB   $1, R2, R2        // <--                                  // sub	x2, x2, #1
-	TST   $15, R11          // <--                                  // tst	x11, #0xf
-	ADD   $1, R11, R11      // <--                                  // add	x11, x11, #1
-	ADDW  R13, R8, R8       // <--                                  // add	w8, w8, w13
-	ADDW  R9, R8, R9        // <--                                  // add	w9, w8, w9
-	BNE   align_prologue_loop            // <--                                  // b.ne	.align_prologue_loop
-	MOVW  $32881, R11       // <--                                  // mov	w11, #32881
-	MOVW  $65521, R13       // <--                                  // mov	w13, #65521
-	MOVKW $(32775<<16), R11 // <--                                  // movk	w11, #32775, lsl #16
-	MOVW  $4294901775, R12  // <--                                  // mov	w12, #-65521
-	MOVW  $65520, R14       // <--                                  // mov	w14, #65520
-	SUB   R10, R1, R10      // <--                                  // sub	x10, x1, x10
-	UMULL R11, R9, R11      // <--                                  // umull	x11, w9, w11
-	ADDW  R12, R8, R12      // <--                                  // add	w12, w8, w12
-	CMPW  R14, R8           // <--                                  // cmp	w8, w14
-	ADD   $16, R10, R1      // <--                                  // add	x1, x10, #16
-	LSR   $47, R11, R11     // <--                                  // lsr	x11, x11, #47
-	CSELW HI, R12, R8, R8   // <--                                  // csel	w8, w12, w8, hi
-	MSUBW R13, R9, R11, R9  // <--                                  // msub	w9, w11, w13, w9
-
-vector_entry:
-	AND   $31, R2, R10                        // <--                                  // and	x10, x2, #0x1f
-	CMP   $32, R2                             // <--                                  // cmp	x2, #32
-	BCC   scalar_entry                        // <--                                  // b.lo	.scalar_entry
-	MOVD  $mult_table<>(SB), R11              // <--                                  // adrp	x11, mult_table
-	ADD   $0, R11, R11                        // <--                                  // add	x11, x11, :lo12:mult_table
-	MOVW  $32881, R14                         // <--                                  // mov	w14, #32881
-	MOVW  $173, R12                           // <--                                  // mov	w12, #173
-	MOVD  $137438953440, R13                  // <--                                  // mov	x13, #137438953440
-	MOVKW $(32775<<16), R14                   // <--                                  // movk	w14, #32775, lsl #16
-	VLD1  (R11), [V0.H8, V1.H8, V2.H8, V3.H8] // <--                                  // ld1	{ v0.8h, v1.8h, v2.8h, v3.8h }, [x11]
-	LSR   $5, R2, R11                         // <--                                  // lsr	x11, x2, #5
-	MOVW  $65521, R15                         // <--                                  // mov	w15, #65521
-	VEXT  $8, V0.B16, V0.B16, V4.B16          // <--                                  // ext	v4.16b, v0.16b, v0.16b, #8
-	VEXT  $8, V1.B16, V1.B16, V5.B16          // <--                                  // ext	v5.16b, v1.16b, v1.16b, #8
-	VEXT  $8, V2.B16, V2.B16, V6.B16          // <--                                  // ext	v6.16b, v2.16b, v2.16b, #8
-	VEXT  $8, V3.B16, V3.B16, V7.B16          // <--                                  // ext	v7.16b, v3.16b, v3.16b, #8
-
-vector_chunk_outer:
-	CMP  $173, R11               // <--                                  // cmp	x11, #173
-	MOVD R1, R2                  // <--                                  // mov	x2, x1
-	CSEL LO, R11, R12, R16       // <--                                  // csel	x16, x11, x12, lo
-	WORD $0x6f00e414             // VMOVI $0, V20.D2                     // movi	v20.2d, #0000000000000000
-	MULW R16, R8, R0             // <--                                  // mul	w0, w8, w16
-	ADD  R16<<5, R13, R17        // <--                                  // add	x17, x13, x16, lsl #5
-	WORD $0x6f00e410             // VMOVI $0, V16.D2                     // movi	v16.2d, #0000000000000000
-	AND  $137438953440, R17, R17 // <--                                  // and	x17, x17, #0x1fffffffe0
-	WORD $0x6f00e412             // VMOVI $0, V18.D2                     // movi	v18.2d, #0000000000000000
-	WORD $0x6f00e413             // VMOVI $0, V19.D2                     // movi	v19.2d, #0000000000000000
-	WORD $0x6f00e415             // VMOVI $0, V21.D2                     // movi	v21.2d, #0000000000000000
-	VMOV R0, V20.S[3]            // <--                                  // mov	v20.s[3], w0
-	MOVW R16, R0                 // <--                                  // mov	w0, w16
-	WORD $0x6f00e411             // VMOVI $0, V17.D2                     // movi	v17.2d, #0000000000000000
-
-vector_chunk_inner:
-	WORD  $0xacc15857                   // FLDPQ.P 32(R2), (F23, F22)           // ldp	q23, q22, [x2], #32
-	SUBSW $1, R0, R0                    // <--                                  // subs	w0, w0, #1
-	VADD  V17.S4, V20.S4, V20.S4        // <--                                  // add	v20.4s, v20.4s, v17.4s
-	WORD  $0x2e3712b5                   // VUADDW V23.B8, V21.H8, V21.H8        // uaddw	v21.8h, v21.8h, v23.8b
-	WORD  $0x6e371273                   // VUADDW2 V23.B16, V19.H8, V19.H8      // uaddw2	v19.8h, v19.8h, v23.16b
-	WORD  $0x6e202ad8                   // VUADDLP V22.B16, V24.H8              // uaddlp	v24.8h, v22.16b
-	WORD  $0x2e361252                   // VUADDW V22.B8, V18.H8, V18.H8        // uaddw	v18.8h, v18.8h, v22.8b
-	WORD  $0x6e361210                   // VUADDW2 V22.B16, V16.H8, V16.H8      // uaddw2	v16.8h, v16.8h, v22.16b
-	WORD  $0x6e206af8                   // VUADALP V23.B16, V24.H8              // uadalp	v24.8h, v23.16b
-	WORD  $0x6e606b11                   // VUADALP V24.H8, V17.S4               // uadalp	v17.4s, v24.8h
-	BNE   vector_chunk_inner            // <--                                  // b.ne	.vector_chunk_inner
-	VSHL  $5, V20.S4, V20.S4            // <--                                  // shl	v20.4s, v20.4s, #5
-	ADD   R17, R1, R17                  // <--                                  // add	x17, x1, x17
-	SUBS  R16, R11, R11                 // <--                                  // subs	x11, x11, x16
-	ADD   $32, R17, R1                  // <--                                  // add	x1, x17, #32
-	WORD  $0x2e6082b4                   // VUMLAL V0.H4, V21.H4, V20.S4         // umlal	v20.4s, v21.4h, v0.4h
-	VEXT  $8, V21.B16, V21.B16, V21.B16 // <--                                  // ext	v21.16b, v21.16b, v21.16b, #8
-	WORD  $0x2e6482b4                   // VUMLAL V4.H4, V21.H4, V20.S4         // umlal	v20.4s, v21.4h, v4.4h
-	VEXT  $8, V19.B16, V19.B16, V21.B16 // <--                                  // ext	v21.16b, v19.16b, v19.16b, #8
-	WORD  $0x2e618274                   // VUMLAL V1.H4, V19.H4, V20.S4         // umlal	v20.4s, v19.4h, v1.4h
-	VEXT  $8, V18.B16, V18.B16, V19.B16 // <--                                  // ext	v19.16b, v18.16b, v18.16b, #8
-	WORD  $0x2e6582b4                   // VUMLAL V5.H4, V21.H4, V20.S4         // umlal	v20.4s, v21.4h, v5.4h
-	WORD  $0x2e628254                   // VUMLAL V2.H4, V18.H4, V20.S4         // umlal	v20.4s, v18.4h, v2.4h
-	WORD  $0x2e668274                   // VUMLAL V6.H4, V19.H4, V20.S4         // umlal	v20.4s, v19.4h, v6.4h
-	WORD  $0x2e638214                   // VUMLAL V3.H4, V16.H4, V20.S4         // umlal	v20.4s, v16.4h, v3.4h
-	VEXT  $8, V16.B16, V16.B16, V16.B16 // <--                                  // ext	v16.16b, v16.16b, v16.16b, #8
-	WORD  $0x2e678214                   // VUMLAL V7.H4, V16.H4, V20.S4         // umlal	v20.4s, v16.4h, v7.4h
-	WORD  $0x4eb1be30                   // VADDP V17.S4, V17.S4, V16.S4         // addp	v16.4s, v17.4s, v17.4s
-	WORD  $0x4eb4be91                   // VADDP V20.S4, V20.S4, V17.S4         // addp	v17.4s, v20.4s, v20.4s
-	WORD  $0x0eb1be10                   // VADDP V17.S2, V16.S2, V16.S2         // addp	v16.2s, v16.2s, v17.2s
-	VMOV  V16.S[1], R0                  // <--                                  // mov	w0, v16.s[1]
-	FMOVS F16, R2                       // <--                                  // fmov	w2, s16
-	ADDW  R8, R2, R8                    // <--                                  // add	w8, w2, w8
-	ADDW  R9, R0, R9                    // <--                                  // add	w9, w0, w9
-	UMULL R14, R8, R0                   // <--                                  // umull	x0, w8, w14
-	UMULL R14, R9, R2                   // <--                                  // umull	x2, w9, w14
-	LSR   $47, R0, R0                   // <--                                  // lsr	x0, x0, #47
-	LSR   $47, R2, R2                   // <--                                  // lsr	x2, x2, #47
-	MSUBW R15, R8, R0, R8               // <--                                  // msub	w8, w0, w15, w8
-	MSUBW R15, R9, R2, R9               // <--                                  // msub	w9, w2, w15, w9
-	BNE   vector_chunk_outer            // <--                                  // b.ne	.vector_chunk_outer
-
-scalar_entry:
-	CBZ  R10, return_final  // <--                                  // cbz	x10, .return_final
-	CMP  $16, R10      // <--                                  // cmp	x10, #16
-	BCC  scalar_byte_loop   // <--                                  // b.lo	.scalar_byte_loop
-	WORD $0x3940002b   // MOVBU (R1), R11                      // ldrb	w11, [x1]
-	SUBS $16, R10, R10 // <--                                  // subs	x10, x10, #16
-	WORD $0x3940042c   // MOVBU 1(R1), R12                     // ldrb	w12, [x1, #1]
-	WORD $0x3940082d   // MOVBU 2(R1), R13                     // ldrb	w13, [x1, #2]
-	ADDW R11, R8, R8   // <--                                  // add	w8, w8, w11
-	WORD $0x39400c2b   // MOVBU 3(R1), R11                     // ldrb	w11, [x1, #3]
-	ADDW R9, R8, R9    // <--                                  // add	w9, w8, w9
-	ADDW R12, R8, R8   // <--                                  // add	w8, w8, w12
-	WORD $0x3940102c   // MOVBU 4(R1), R12                     // ldrb	w12, [x1, #4]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R13, R8, R8   // <--                                  // add	w8, w8, w13
-	WORD $0x3940142d   // MOVBU 5(R1), R13                     // ldrb	w13, [x1, #5]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R11, R8, R8   // <--                                  // add	w8, w8, w11
-	WORD $0x3940182b   // MOVBU 6(R1), R11                     // ldrb	w11, [x1, #6]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R12, R8, R8   // <--                                  // add	w8, w8, w12
-	WORD $0x39401c2c   // MOVBU 7(R1), R12                     // ldrb	w12, [x1, #7]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R13, R8, R8   // <--                                  // add	w8, w8, w13
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R11, R8, R8   // <--                                  // add	w8, w8, w11
-	WORD $0x3940202b   // MOVBU 8(R1), R11                     // ldrb	w11, [x1, #8]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R12, R8, R8   // <--                                  // add	w8, w8, w12
-	WORD $0x3940242c   // MOVBU 9(R1), R12                     // ldrb	w12, [x1, #9]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	WORD $0x3940382d   // MOVBU 14(R1), R13                    // ldrb	w13, [x1, #14]
-	ADDW R11, R8, R8   // <--                                  // add	w8, w8, w11
-	WORD $0x3940282b   // MOVBU 10(R1), R11                    // ldrb	w11, [x1, #10]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R12, R8, R8   // <--                                  // add	w8, w8, w12
-	WORD $0x39402c2c   // MOVBU 11(R1), R12                    // ldrb	w12, [x1, #11]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R11, R8, R8   // <--                                  // add	w8, w8, w11
-	WORD $0x3940302b   // MOVBU 12(R1), R11                    // ldrb	w11, [x1, #12]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R12, R8, R8   // <--                                  // add	w8, w8, w12
-	WORD $0x3940342c   // MOVBU 13(R1), R12                    // ldrb	w12, [x1, #13]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R11, R8, R8   // <--                                  // add	w8, w8, w11
-	WORD $0x39403c2b   // MOVBU 15(R1), R11                    // ldrb	w11, [x1, #15]
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R12, R8, R8   // <--                                  // add	w8, w8, w12
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R13, R8, R8   // <--                                  // add	w8, w8, w13
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	ADDW R11, R8, R8   // <--                                  // add	w8, w8, w11
-	ADDW R8, R9, R9    // <--                                  // add	w9, w9, w8
-	BEQ  scalar_finalize       // <--                                  // b.eq	.scalar_finalize
-	ADD  $16, R1, R1   // <--                                  // add	x1, x1, #16
-
-scalar_byte_loop:
-	WORD $0x3840142b  // MOVBU.P 1(R1), R11                   // ldrb	w11, [x1], #1
-	SUBS $1, R10, R10 // <--                                  // subs	x10, x10, #1
-	ADDW R11, R8, R8  // <--                                  // add	w8, w8, w11
-	ADDW R9, R8, R9   // <--                                  // add	w9, w8, w9
-	BNE  scalar_byte_loop      // <--                                  // b.ne	.scalar_byte_loop
-
-scalar_finalize:
-	MOVW  $32881, R10       // <--                                  // mov	w10, #32881
-	MOVW  $65521, R12       // <--                                  // mov	w12, #65521
-	MOVKW $(32775<<16), R10 // <--                                  // movk	w10, #32775, lsl #16
-	MOVW  $4294901775, R11  // <--                                  // mov	w11, #-65521
-	MOVW  $65520, R13       // <--                                  // mov	w13, #65520
-	ADDW  R11, R8, R11      // <--                                  // add	w11, w8, w11
-	UMULL R10, R9, R10      // <--                                  // umull	x10, w9, w10
-	CMPW  R13, R8           // <--                                  // cmp	w8, w13
-	CSELW HI, R11, R8, R8   // <--                                  // csel	w8, w11, w8, hi
-	LSR   $47, R10, R10     // <--                                  // lsr	x10, x10, #47
-	MSUBW R12, R9, R10, R9  // <--                                  // msub	w9, w10, w12, w9
-
-return_final:
-	ORRW R9<<16, R8, R0 // <--                                  // orr	w0, w8, w9, lsl #16
-	NOP                 // (skipped)                            // ldp	x29, x30, [sp], #16
-	MOVW R0, ret+32(FP) // <--
-	RET                 // <--                                  // ret
--- a/internal/adler32/adler32_sse3.go
+++ /dev/null
@@ -1,6 +1,0 @@
-//go:build !purego && amd64
-
-package adler32
-
-//go:noescape
-func adler32_sse3(in uint32, buf []byte) uint32
--- a/internal/adler32/adler32_sse3.s
+++ /dev/null
@@ -1,214 +1,0 @@
-//go:build !purego && amd64
-
-#include "textflag.h"
-
-DATA LCPI0_0<>+0x00(SB)/8, $0x191a1b1c1d1e1f20
-DATA LCPI0_0<>+0x08(SB)/8, $0x1112131415161718
-GLOBL LCPI0_0<>(SB), (RODATA|NOPTR), $16
-
-DATA LCPI0_1<>+0x00(SB)/8, $0x0001000100010001
-DATA LCPI0_1<>+0x08(SB)/8, $0x0001000100010001
-GLOBL LCPI0_1<>(SB), (RODATA|NOPTR), $16
-
-DATA LCPI0_2<>+0x00(SB)/8, $0x090a0b0c0d0e0f10
-DATA LCPI0_2<>+0x08(SB)/8, $0x0102030405060708
-GLOBL LCPI0_2<>(SB), (RODATA|NOPTR), $16
-
-TEXT ·adler32_sse3(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
-	NOP                         // (skipped)                            // push	rbp
-	NOP                         // (skipped)                            // mov	rbp, rsp
-	NOP                         // (skipped)                            // and	rsp, -8
-	WORD    $0xf889             // MOVL DI, AX                          // mov	eax, edi
-	LONG    $0xc8b70f44         // MOVZX AX, R9                         // movzx	r9d, ax
-	WORD    $0xe8c1; BYTE $0x10 // SHRL $0x10, AX                       // shr	eax, 16
-	WORD    $0xd189             // MOVL DX, CX                          // mov	ecx, edx
-	WORD    $0xe183; BYTE $0x1f // ANDL $0x1f, CX                       // and	ecx, 31
-	CMPQ    DX, $0x20           // <--                                  // cmp	rdx, 32
-	JAE     vector_entry        // <--                                  // jae	.vector_entry
-	WORD    $0x8944; BYTE $0xcf // MOVL R9, DI                          // mov	edi, r9d
-	JMP     scalar_entry        // <--                                  // jmp	.scalar_entry
-
-vector_entry:
-	SHRQ $0x5, DX                  // <--                                  // shr	rdx, 5
-	LONG $0xc0ef0f66               // PXOR X0, X0                          // pxor	xmm0, xmm0
-	MOVO LCPI0_0<>(SB), X1         // <--                                  // movdqa	xmm1, xmmword ptr [rip + .LCPI0_0]
-	MOVO LCPI0_1<>(SB), X2         // <--                                  // movdqa	xmm2, xmmword ptr [rip + .LCPI0_1]
-	MOVO LCPI0_2<>(SB), X3         // <--                                  // movdqa	xmm3, xmmword ptr [rip + .LCPI0_2]
-	LONG $0x8071b841; WORD $0x8007 // MOVL $-0x7ff87f8f, R8                // mov	r8d, 2147975281
-
-vector_chunk_outer:
-	CMPQ DX, $0xad                 // <--                                  // cmp	rdx, 173
-	LONG $0x00adba41; WORD $0x0000 // MOVL $0xad, R10                      // mov	r10d, 173
-	LONG $0xd2420f4c               // CMOVB DX, R10                        // cmovb	r10, rdx
-	WORD $0x8944; BYTE $0xcf       // MOVL R9, DI                          // mov	edi, r9d
-	LONG $0xfaaf0f41               // IMULL R10, DI                        // imul	edi, r10d
-	LONG $0xef6e0f66               // MOVD DI, X5                          // movd	xmm5, edi
-	LONG $0xe06e0f66               // MOVD AX, X4                          // movd	xmm4, eax
-	WORD $0x8944; BYTE $0xd0       // MOVL R10, AX                         // mov	eax, r10d
-	LONG $0xf6ef0f66               // PXOR X6, X6                          // pxor	xmm6, xmm6
-
-vector_chunk_loop:
-	LONG  $0x3e6f0ff3                           // MOVDQU 0(SI), X7                     // movdqu	xmm7, xmmword ptr [rsi]
-	LONG  $0x6f0f4466; BYTE $0xc7               // MOVDQA X7, X8                        // movdqa	xmm8, xmm7
-	LONG  $0x04380f66; BYTE $0xf9               // PMADDUBSW X1, X7                     // pmaddubsw	xmm7, xmm1
-	LONG  $0xfaf50f66                           // PMADDWD X2, X7                       // pmaddwd	xmm7, xmm2
-	LONG  $0xfcfe0f66                           // PADDD X4, X7                         // paddd	xmm7, xmm4
-	LONG  $0x666f0ff3; BYTE $0x10               // MOVDQU 0x10(SI), X4                  // movdqu	xmm4, xmmword ptr [rsi + 16]
-	LONG  $0xeefe0f66                           // PADDD X6, X5                         // paddd	xmm5, xmm6
-	LONG  $0xf60f4466; BYTE $0xc0               // PSADBW X0, X8                        // psadbw	xmm8, xmm0
-	LONG  $0xfe0f4466; BYTE $0xc6               // PADDD X6, X8                         // paddd	xmm8, xmm6
-	LONG  $0xf46f0f66                           // MOVDQA X4, X6                        // movdqa	xmm6, xmm4
-	LONG  $0xf0f60f66                           // PSADBW X0, X6                        // psadbw	xmm6, xmm0
-	LONG  $0xfe0f4166; BYTE $0xf0               // PADDD X8, X6                         // paddd	xmm6, xmm8
-	LONG  $0x04380f66; BYTE $0xe3               // PMADDUBSW X3, X4                     // pmaddubsw	xmm4, xmm3
-	LONG  $0xe2f50f66                           // PMADDWD X2, X4                       // pmaddwd	xmm4, xmm2
-	LONG  $0xe7fe0f66                           // PADDD X7, X4                         // paddd	xmm4, xmm7
-	ADDQ  $0x20, SI                             // <--                                  // add	rsi, 32
-	WORD  $0xc8ff                               // DECL AX                              // dec	eax
-	JNE   vector_chunk_loop                     // <--                                  // jne	.vector_chunk_loop
-	LONG  $0xf5720f66; BYTE $0x05               // PSLLD $0x5, X5                       // pslld	xmm5, 5
-	LONG  $0xe5fe0f66                           // PADDD X5, X4                         // paddd	xmm4, xmm5
-	LONG  $0xee700f66; BYTE $0xb1               // PSHUFD $0xb1, X6, X5                 // pshufd	xmm5, xmm6, 177
-	LONG  $0xeefe0f66                           // PADDD X6, X5                         // paddd	xmm5, xmm6
-	LONG  $0xf5700f66; BYTE $0xee               // PSHUFD $0xee, X5, X6                 // pshufd	xmm6, xmm5, 238
-	LONG  $0xf5fe0f66                           // PADDD X5, X6                         // paddd	xmm6, xmm5
-	LONG  $0xf77e0f66                           // MOVD X6, DI                          // movd	edi, xmm6
-	WORD  $0x0144; BYTE $0xcf                   // ADDL R9, DI                          // add	edi, r9d
-	LONG  $0xec700f66; BYTE $0xb1               // PSHUFD $0xb1, X4, X5                 // pshufd	xmm5, xmm4, 177
-	LONG  $0xecfe0f66                           // PADDD X4, X5                         // paddd	xmm5, xmm4
-	LONG  $0xe5700f66; BYTE $0xee               // PSHUFD $0xee, X5, X4                 // pshufd	xmm4, xmm5, 238
-	LONG  $0xe5fe0f66                           // PADDD X5, X4                         // paddd	xmm4, xmm5
-	LONG  $0xe07e0f66                           // MOVD X4, AX                          // movd	eax, xmm4
-	MOVQ  DI, R9                                // <--                                  // mov	r9, rdi
-	IMULQ R8, R9                                // <--                                  // imul	r9, r8
-	SHRQ  $0x2f, R9                             // <--                                  // shr	r9, 47
-	LONG  $0xf1c96945; WORD $0x00ff; BYTE $0x00 // IMULL $0xfff1, R9, R9                // imul	r9d, r9d, 65521
-	WORD  $0x2944; BYTE $0xcf                   // SUBL R9, DI                          // sub	edi, r9d
-	MOVQ  AX, R9                                // <--                                  // mov	r9, rax
-	IMULQ R8, R9                                // <--                                  // imul	r9, r8
-	SHRQ  $0x2f, R9                             // <--                                  // shr	r9, 47
-	LONG  $0xf1c96945; WORD $0x00ff; BYTE $0x00 // IMULL $0xfff1, R9, R9                // imul	r9d, r9d, 65521
-	WORD  $0x2944; BYTE $0xc8                   // SUBL R9, AX                          // sub	eax, r9d
-	WORD  $0x8941; BYTE $0xf9                   // MOVL DI, R9                          // mov	r9d, edi
-	SUBQ  R10, DX                               // <--                                  // sub	rdx, r10
-	JNE   vector_chunk_outer                    // <--                                  // jne	.vector_chunk_outer
-
-scalar_entry:
-	WORD $0x8548; BYTE $0xc9     // TESTQ CX, CX                         // test	rcx, rcx
-	JE   return_final                 // <--                                  // je	.return_final
-	CMPL CX, $0x10               // <--                                  // cmp	ecx, 16
-	JB   scalar_byte_prelude                 // <--                                  // jb	.scalar_byte_prelude
-	WORD $0xb60f; BYTE $0x16     // MOVZX 0(SI), DX                      // movzx	edx, byte ptr [rsi]
-	WORD $0xd701                 // ADDL DX, DI                          // add	edi, edx
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	LONG $0x0156b60f             // MOVZX 0x1(SI), DX                    // movzx	edx, byte ptr [rsi + 1]
-	WORD $0xfa01                 // ADDL DI, DX                          // add	edx, edi
-	WORD $0xd001                 // ADDL DX, AX                          // add	eax, edx
-	LONG $0x027eb60f             // MOVZX 0x2(SI), DI                    // movzx	edi, byte ptr [rsi + 2]
-	WORD $0xd701                 // ADDL DX, DI                          // add	edi, edx
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	LONG $0x0356b60f             // MOVZX 0x3(SI), DX                    // movzx	edx, byte ptr [rsi + 3]
-	WORD $0xfa01                 // ADDL DI, DX                          // add	edx, edi
-	WORD $0xd001                 // ADDL DX, AX                          // add	eax, edx
-	LONG $0x047eb60f             // MOVZX 0x4(SI), DI                    // movzx	edi, byte ptr [rsi + 4]
-	WORD $0xd701                 // ADDL DX, DI                          // add	edi, edx
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	LONG $0x0556b60f             // MOVZX 0x5(SI), DX                    // movzx	edx, byte ptr [rsi + 5]
-	WORD $0xfa01                 // ADDL DI, DX                          // add	edx, edi
-	WORD $0xd001                 // ADDL DX, AX                          // add	eax, edx
-	LONG $0x067eb60f             // MOVZX 0x6(SI), DI                    // movzx	edi, byte ptr [rsi + 6]
-	WORD $0xd701                 // ADDL DX, DI                          // add	edi, edx
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	LONG $0x0756b60f             // MOVZX 0x7(SI), DX                    // movzx	edx, byte ptr [rsi + 7]
-	WORD $0xfa01                 // ADDL DI, DX                          // add	edx, edi
-	WORD $0xd001                 // ADDL DX, AX                          // add	eax, edx
-	LONG $0x087eb60f             // MOVZX 0x8(SI), DI                    // movzx	edi, byte ptr [rsi + 8]
-	WORD $0xd701                 // ADDL DX, DI                          // add	edi, edx
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	LONG $0x0956b60f             // MOVZX 0x9(SI), DX                    // movzx	edx, byte ptr [rsi + 9]
-	WORD $0xfa01                 // ADDL DI, DX                          // add	edx, edi
-	WORD $0xd001                 // ADDL DX, AX                          // add	eax, edx
-	LONG $0x0a7eb60f             // MOVZX 0xa(SI), DI                    // movzx	edi, byte ptr [rsi + 10]
-	WORD $0xd701                 // ADDL DX, DI                          // add	edi, edx
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	LONG $0x0b56b60f             // MOVZX 0xb(SI), DX                    // movzx	edx, byte ptr [rsi + 11]
-	WORD $0xfa01                 // ADDL DI, DX                          // add	edx, edi
-	WORD $0xd001                 // ADDL DX, AX                          // add	eax, edx
-	LONG $0x0c7eb60f             // MOVZX 0xc(SI), DI                    // movzx	edi, byte ptr [rsi + 12]
-	WORD $0xd701                 // ADDL DX, DI                          // add	edi, edx
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	LONG $0x0d56b60f             // MOVZX 0xd(SI), DX                    // movzx	edx, byte ptr [rsi + 13]
-	WORD $0xfa01                 // ADDL DI, DX                          // add	edx, edi
-	WORD $0xd001                 // ADDL DX, AX                          // add	eax, edx
-	LONG $0x46b60f44; BYTE $0x0e // MOVZX 0xe(SI), R8                    // movzx	r8d, byte ptr [rsi + 14]
-	WORD $0x0141; BYTE $0xd0     // ADDL DX, R8                          // add	r8d, edx
-	WORD $0x0144; BYTE $0xc0     // ADDL R8, AX                          // add	eax, r8d
-	LONG $0x0f7eb60f             // MOVZX 0xf(SI), DI                    // movzx	edi, byte ptr [rsi + 15]
-	WORD $0x0144; BYTE $0xc7     // ADDL R8, DI                          // add	edi, r8d
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	ADDQ $-0x10, CX              // <--                                  // add	rcx, -16
-	JE   scalar_finalize         // <--                                  // je	.scalar_finalize
-	ADDQ $0x10, SI               // <--                                  // add	rsi, 16
-
-scalar_byte_prelude:
-	LEAQ -0x1(CX), DX // <--                                  // lea	rdx, [rcx - 1]
-	MOVQ CX, R9       // <--                                  // mov	r9, rcx
-	ANDQ $0x3, R9     // <--                                  // and	r9, 3
-	JE   scalar_dword_prelude      // <--                                  // je	.scalar_dword_prelude
-	XORL R8, R8       // <--                                  // xor	r8d, r8d
-
-scalar_byte_prelude_loop:
-	LONG $0x14b60f46; BYTE $0x06 // MOVZX 0(SI)(R8*1), R10               // movzx	r10d, byte ptr [rsi + r8]
-	WORD $0x0144; BYTE $0xd7     // ADDL R10, DI                         // add	edi, r10d
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	INCQ R8                      // <--                                  // inc	r8
-	CMPQ R9, R8                  // <--                                  // cmp	r9, r8
-	JNE  scalar_byte_prelude_loop// <--                                  // jne	.scalar_byte_prelude_loop
-	ADDQ R8, SI                  // <--                                  // add	rsi, r8
-	SUBQ R8, CX                  // <--                                  // sub	rcx, r8
-
-scalar_dword_prelude:
-	CMPQ DX, $0x3 // <--                                  // cmp	rdx, 3
-	JB   scalar_finalize  // <--                                  // jb	.scalar_finalize
-	XORL DX, DX   // <--                                  // xor	edx, edx
-
-scalar_dword_loop:
-	LONG $0x04b60f44; BYTE $0x16   // MOVZX 0(SI)(DX*1), R8                // movzx	r8d, byte ptr [rsi + rdx]
-	WORD $0x0141; BYTE $0xf8       // ADDL DI, R8                          // add	r8d, edi
-	WORD $0x0144; BYTE $0xc0       // ADDL R8, AX                          // add	eax, r8d
-	LONG $0x167cb60f; BYTE $0x01   // MOVZX 0x1(SI)(DX*1), DI              // movzx	edi, byte ptr [rsi + rdx + 1]
-	WORD $0x0144; BYTE $0xc7       // ADDL R8, DI                          // add	edi, r8d
-	WORD $0xf801                   // ADDL DI, AX                          // add	eax, edi
-	LONG $0x44b60f44; WORD $0x0216 // MOVZX 0x2(SI)(DX*1), R8              // movzx	r8d, byte ptr [rsi + rdx + 2]
-	WORD $0x0141; BYTE $0xf8       // ADDL DI, R8                          // add	r8d, edi
-	WORD $0x0144; BYTE $0xc0       // ADDL R8, AX                          // add	eax, r8d
-	LONG $0x167cb60f; BYTE $0x03   // MOVZX 0x3(SI)(DX*1), DI              // movzx	edi, byte ptr [rsi + rdx + 3]
-	WORD $0x0144; BYTE $0xc7       // ADDL R8, DI                          // add	edi, r8d
-	WORD $0xf801                   // ADDL DI, AX                          // add	eax, edi
-	ADDQ $0x4, DX                  // <--                                  // add	rdx, 4
-	CMPQ CX, DX                    // <--                                  // cmp	rcx, rdx
-	JNE  scalar_dword_loop         // <--                                  // jne	.scalar_dword_loop
-
-scalar_finalize:
-	LONG  $0x000f8f8d; WORD $0xffff // LEAL -0xfff1(DI), CX                 // lea	ecx, [rdi - 65521]
-	CMPL  DI, $0xfff1               // <--                                  // cmp	edi, 65521
-	WORD  $0x420f; BYTE $0xcf       // CMOVB DI, CX                         // cmovb	ecx, edi
-	WORD  $0xc289                   // MOVL AX, DX                          // mov	edx, eax
-	LONG  $0x078071be; BYTE $0x80   // MOVL $-0x7ff87f8f, SI                // mov	esi, 2147975281
-	IMULQ DX, SI                    // <--                                  // imul	rsi, rdx
-	SHRQ  $0x2f, SI                 // <--                                  // shr	rsi, 47
-	LONG  $0xfff1d669; WORD $0x0000 // IMULL $0xfff1, SI, DX                // imul	edx, esi, 65521
-	WORD  $0xd029                   // SUBL DX, AX                          // sub	eax, edx
-	WORD  $0xcf89                   // MOVL CX, DI                          // mov	edi, ecx
-
-return_final:
-	WORD $0xe0c1; BYTE $0x10 // SHLL $0x10, AX                       // shl	eax, 16
-	WORD $0xf809             // ORL DI, AX                           // or	eax, edi
-	NOP                      // (skipped)                            // mov	rsp, rbp
-	NOP                      // (skipped)                            // pop	rbp
-	MOVL AX, ret+32(FP)      // <--
-	RET                      // <--                                  // ret
--