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
--
⑨