shithub: furgit

Download patch

ref: 20a26c67f53252f643a9f20bac0fd73b3b8be863
parent: 0bb3530892f42739f04d08e603cc7d7b871df660
author: Runxi Yu <me@runxiyu.org>
date: Sun Feb 22 07:10:09 EST 2026

adler32: Use proper instructions for avx2

--- a/internal/adler32/adler32_avx2.s
+++ b/internal/adler32/adler32_avx2.s
@@ -18,246 +18,240 @@
 GLOBL LCPI0_2<>(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
-	WORD         $0x8548; BYTE $0xf6     // TESTQ SI, SI                         // test	rsi, rsi
-	JE           return_one              // <--                                  // je	.return_one
-	WORD         $0xf889                 // MOVL DI, AX                          // mov	eax, edi
-	WORD         $0x8548; BYTE $0xd2     // TESTQ DX, DX                         // test	rdx, rdx
-	JE           return_current          // <--                                  // je	.return_current
-	NOP                                  // (skipped)                            // push	rbp
-	NOP                                  // (skipped)                            // mov	rbp, rsp
-	NOP                                  // (skipped)                            // and	rsp, -8
-	WORD         $0xc189                 // MOVL AX, CX                          // mov	ecx, eax
-	WORD         $0xe9c1; BYTE $0x10     // SHRL $0x10, CX                       // shr	ecx, 16
-	WORD         $0xb70f; BYTE $0xc0     // MOVZX AX, AX                         // movzx	eax, ax
-	CMPQ         DX, $0x20               // <--                                  // cmp	rdx, 32
-	JB           scalar_unrolled16       // <--                                  // jb	.scalar_unrolled16
-	LONG         $0x078071bf; BYTE $0x80 // MOVL $-0x7ff87f8f, DI                // mov	edi, 2147975281
-	LONG         $0xc0eff9c5             // VPXOR X0, X0, X0                     // vpxor	xmm0, xmm0, xmm0
-	VMOVDQA      LCPI0_0<>(SB), Y1       // <--                                  // vmovdqa	ymm1, ymmword ptr [rip + .LCPI0_0]
-	VPBROADCASTW LCPI0_2<>(SB), Y2       // <--                                  // vpbroadcastw	ymm2, word ptr [rip + .LCPI0_2]
-	JMP          vector_outer            // <--                                  // jmp	.vector_outer
+	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       LCPI0_0<>(SB), Y1
+	VPBROADCASTW  LCPI0_2<>(SB), Y2
+	JMP           vector_outer
 
 vector_tail_init:
-	LONG $0xf46ffdc5 // VMOVDQA Y4, Y6                       // vmovdqa	ymm6, ymm4
-	LONG $0xedefd1c5 // VPXOR X5, X5, X5                     // vpxor	xmm5, xmm5, xmm5
+	VMOVDQA       Y4, Y6
+	VPXOR         X5, X5, X5
 
 vector_reduce_finalize_chunk:
-	SUBQ  AX, DX                                // <--                                  // sub	rdx, rax
-	LONG  $0xf572ddc5; BYTE $0x05               // ?                                    // vpslld	ymm4, ymm5, 5
-	LONG  $0xdbfeddc5                           // VPADDD Y3, Y4, Y3                    // vpaddd	ymm3, ymm4, ymm3
-	LONG  $0x397de3c4; WORD $0x01f4             // VEXTRACTI128 $0x1, Y6, X4            // vextracti128	xmm4, ymm6, 1
-	LONG  $0xecc6c8c5; BYTE $0x88               // VSHUFPS $-0x78, X4, X6, X5           // vshufps	xmm5, xmm6, xmm4, 136
-	LONG  $0xe470f9c5; BYTE $0x88               // VPSHUFD $-0x78, X4, X4               // vpshufd	xmm4, xmm4, 136
-	LONG  $0xe4fed1c5                           // VPADDD X4, X5, X4                    // vpaddd	xmm4, xmm5, xmm4
-	LONG  $0xec70f9c5; BYTE $0x55               // VPSHUFD $0x55, X4, X5                // vpshufd	xmm5, xmm4, 85
-	LONG  $0xe4fed1c5                           // VPADDD X4, X5, X4                    // vpaddd	xmm4, xmm5, xmm4
-	LONG  $0xe07ef9c5                           // VMOVD X4, AX                         // vmovd	eax, xmm4
-	MOVQ  AX, CX                                // <--                                  // mov	rcx, rax
-	IMULQ DI, CX                                // <--                                  // imul	rcx, rdi
-	SHRQ  $0x2f, CX                             // <--                                  // shr	rcx, 47
-	LONG  $0xfff1c969; WORD $0x0000             // IMULL $0xfff1, CX, CX                // imul	ecx, ecx, 65521
-	WORD  $0xc829                               // SUBL CX, AX                          // sub	eax, ecx
-	LONG  $0x397de3c4; WORD $0x01dc             // VEXTRACTI128 $0x1, Y3, X4            // vextracti128	xmm4, ymm3, 1
-	LONG  $0xdbfed9c5                           // VPADDD X3, X4, X3                    // vpaddd	xmm3, xmm4, xmm3
-	LONG  $0xe370f9c5; BYTE $0xee               // VPSHUFD $-0x12, X3, X4               // vpshufd	xmm4, xmm3, 238
-	LONG  $0xdcfee1c5                           // VPADDD X4, X3, X3                    // vpaddd	xmm3, xmm3, xmm4
-	LONG  $0xe370f9c5; BYTE $0x55               // VPSHUFD $0x55, X3, X4                // vpshufd	xmm4, xmm3, 85
-	LONG  $0xdbfed9c5                           // VPADDD X3, X4, X3                    // vpaddd	xmm3, xmm4, xmm3
-	LONG  $0xd97ef9c5                           // VMOVD X3, CX                         // vmovd	ecx, xmm3
-	MOVQ  CX, R8                                // <--                                  // mov	r8, rcx
-	IMULQ DI, R8                                // <--                                  // imul	r8, rdi
-	SHRQ  $0x2f, R8                             // <--                                  // shr	r8, 47
-	LONG  $0xf1c06945; WORD $0x00ff; BYTE $0x00 // IMULL $0xfff1, R8, R8                // imul	r8d, r8d, 65521
-	WORD  $0x2944; BYTE $0xc1                   // SUBL R8, CX                          // sub	ecx, r8d
-	CMPQ  DX, $0x1f                             // <--                                  // cmp	rdx, 31
-	JBE   scalar_entry                          // <--                                  // jbe	.scalar_entry
+	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:
-	LONG $0xe06ef9c5               // VMOVD AX, X4                         // vmovd	xmm4, eax
-	LONG $0xd96ef9c5               // VMOVD CX, X3                         // vmovd	xmm3, ecx
-	CMPQ DX, $0x15b0               // <--                                  // cmp	rdx, 5552
-	LONG $0x15b0b841; WORD $0x0000 // MOVL $0x15b0, R8                     // mov	r8d, 5552
-	LONG $0xc2420f4c               // CMOVB DX, R8                         // cmovb	r8, rdx
-	WORD $0x8944; BYTE $0xc0       // MOVL R8, AX                          // mov	eax, r8d
-	LONG $0x001fe025; BYTE $0x00   // ANDL $0x1fe0, AX                     // and	eax, 8160
-	JE   vector_tail_init          // <--                                  // je	.vector_tail_init
-	ADDQ $-0x20, R8                // <--                                  // add	r8, -32
-	LONG $0xedefd1c5               // VPXOR X5, X5, X5                     // vpxor	xmm5, xmm5, xmm5
-	LONG $0x20c0f641               // TESTL $0x20, R8                      // test	r8b, 32
-	JNE  vector_block32_check      // <--                                  // jne	.vector_block32_check
-	LONG $0x2e6ffec5               // VMOVDQU 0(SI), Y5                    // vmovdqu	ymm5, ymmword ptr [rsi]
-	ADDQ $0x20, SI                 // <--                                  // add	rsi, 32
-	LEAQ -0x20(AX), CX             // <--                                  // lea	rcx, [rax - 32]
-	LONG $0xf0f6d5c5               // VPSADBW Y0, Y5, Y6                   // vpsadbw	ymm6, ymm5, ymm0
-	LONG $0xf4fecdc5               // VPADDD Y4, Y6, Y6                    // vpaddd	ymm6, ymm6, ymm4
-	LONG $0x0455e2c4; BYTE $0xe9   // VPMADDUBSW Y1, Y5, Y5                // vpmaddubsw	ymm5, ymm5, ymm1
-	LONG $0xeaf5d5c5               // VPMADDWD Y2, Y5, Y5                  // vpmaddwd	ymm5, ymm5, ymm2
-	LONG $0xdbfed5c5               // VPADDD Y3, Y5, Y3                    // vpaddd	ymm3, ymm5, ymm3
-	LONG $0xec6ffdc5               // VMOVDQA Y4, Y5                       // vmovdqa	ymm5, ymm4
-	LONG $0xe66ffdc5               // VMOVDQA Y6, Y4                       // vmovdqa	ymm4, ymm6
-	CMPQ R8, $0x20                 // <--                                  // cmp	r8, 32
-	JAE  vector_block64_loop                   // <--                                  // jae	.vector_block64_loop
-	JMP  vector_reduce_finalize_chunk          // <--                                  // jmp	.vector_reduce_finalize_chunk
+	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    // <--                                  // mov	rcx, rax
-	CMPQ R8, $0x20 // <--                                  // cmp	r8, 32
-	JB   vector_reduce_finalize_chunk   // <--                                  // jb	.vector_reduce_finalize_chunk
+	MOVQ          AX, CX
+	CMPQ          R8, $0x20
+	JB            vector_reduce_finalize_chunk
 
 vector_block64_loop:
-	LONG $0x366ffec5             // VMOVDQU 0(SI), Y6                    // vmovdqu	ymm6, ymmword ptr [rsi]
-	LONG $0x7e6ffec5; BYTE $0x20 // VMOVDQU 0x20(SI), Y7                 // vmovdqu	ymm7, ymmword ptr [rsi + 32]
-	LONG $0xc0f64dc5             // VPSADBW Y0, Y6, Y8                   // vpsadbw	ymm8, ymm6, ymm0
-	LONG $0xc4fe3dc5             // VPADDD Y4, Y8, Y8                    // vpaddd	ymm8, ymm8, ymm4
-	LONG $0xecfed5c5             // VPADDD Y4, Y5, Y5                    // vpaddd	ymm5, ymm5, ymm4
-	LONG $0x044de2c4; BYTE $0xe1 // VPMADDUBSW Y1, Y6, Y4                // vpmaddubsw	ymm4, ymm6, ymm1
-	LONG $0xe2f5ddc5             // VPMADDWD Y2, Y4, Y4                  // vpmaddwd	ymm4, ymm4, ymm2
-	LONG $0xdbfeddc5             // VPADDD Y3, Y4, Y3                    // vpaddd	ymm3, ymm4, ymm3
-	ADDQ $0x40, SI               // <--                                  // add	rsi, 64
-	LONG $0xe0f6c5c5             // VPSADBW Y0, Y7, Y4                   // vpsadbw	ymm4, ymm7, ymm0
-	LONG $0xe4febdc5             // VPADDD Y4, Y8, Y4                    // vpaddd	ymm4, ymm8, ymm4
-	LONG $0xedfebdc5             // VPADDD Y5, Y8, Y5                    // vpaddd	ymm5, ymm8, ymm5
-	LONG $0x0445e2c4; BYTE $0xf1 // VPMADDUBSW Y1, Y7, Y6                // vpmaddubsw	ymm6, ymm7, ymm1
-	LONG $0xf2f5cdc5             // VPMADDWD Y2, Y6, Y6                  // vpmaddwd	ymm6, ymm6, ymm2
-	LONG $0xdbfecdc5             // VPADDD Y3, Y6, Y3                    // vpaddd	ymm3, ymm6, ymm3
-	ADDQ $-0x40, CX              // <--                                  // add	rcx, -64
-	JNE  vector_block64_loop     // <--                                  // jne	.vector_block64_loop
-	LONG $0xf46ffdc5             // VMOVDQA Y4, Y6                       // vmovdqa	ymm6, ymm4
-	JMP  vector_reduce_finalize_chunk                 // <--                                  // jmp	.vector_reduce_finalize_chunk
+	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:
-	LONG $0x000001b8; BYTE $0x00 // MOVL $0x1, AX                        // mov	eax, 1
+	MOVL          $0x1, AX
 
 return_current:
-	MOVL AX, ret+32(FP) // <--
-	RET                 // <--                                  // ret
+	MOVL          AX, ret+32(FP)
+	RET
 
 scalar_entry:
-	WORD $0x8548; BYTE $0xd2 // TESTQ DX, DX                         // test	rdx, rdx
-	JE   return_final             // <--                                  // je	.return_final
+	TESTQ         DX, DX
+	JE            return_final
 
 scalar_unrolled16:
-	CMPQ DX, $0x10               // <--                                  // cmp	rdx, 16
-	JB   scalar_byte_prelude     // <--                                  // jb	.scalar_byte_prelude
-	WORD $0xb60f; BYTE $0x3e     // MOVZX 0(SI), DI                      // movzx	edi, byte ptr [rsi]
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	WORD $0xc101                 // ADDL AX, CX                          // add	ecx, eax
-	LONG $0x017eb60f             // MOVZX 0x1(SI), DI                    // movzx	edi, byte ptr [rsi + 1]
-	WORD $0xc701                 // ADDL AX, DI                          // add	edi, eax
-	WORD $0xf901                 // ADDL DI, CX                          // add	ecx, edi
-	LONG $0x0246b60f             // MOVZX 0x2(SI), AX                    // movzx	eax, byte ptr [rsi + 2]
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	WORD $0xc101                 // ADDL AX, CX                          // add	ecx, eax
-	LONG $0x037eb60f             // MOVZX 0x3(SI), DI                    // movzx	edi, byte ptr [rsi + 3]
-	WORD $0xc701                 // ADDL AX, DI                          // add	edi, eax
-	WORD $0xf901                 // ADDL DI, CX                          // add	ecx, edi
-	LONG $0x0446b60f             // MOVZX 0x4(SI), AX                    // movzx	eax, byte ptr [rsi + 4]
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	WORD $0xc101                 // ADDL AX, CX                          // add	ecx, eax
-	LONG $0x057eb60f             // MOVZX 0x5(SI), DI                    // movzx	edi, byte ptr [rsi + 5]
-	WORD $0xc701                 // ADDL AX, DI                          // add	edi, eax
-	WORD $0xf901                 // ADDL DI, CX                          // add	ecx, edi
-	LONG $0x0646b60f             // MOVZX 0x6(SI), AX                    // movzx	eax, byte ptr [rsi + 6]
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	WORD $0xc101                 // ADDL AX, CX                          // add	ecx, eax
-	LONG $0x077eb60f             // MOVZX 0x7(SI), DI                    // movzx	edi, byte ptr [rsi + 7]
-	WORD $0xc701                 // ADDL AX, DI                          // add	edi, eax
-	WORD $0xf901                 // ADDL DI, CX                          // add	ecx, edi
-	LONG $0x0846b60f             // MOVZX 0x8(SI), AX                    // movzx	eax, byte ptr [rsi + 8]
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	WORD $0xc101                 // ADDL AX, CX                          // add	ecx, eax
-	LONG $0x097eb60f             // MOVZX 0x9(SI), DI                    // movzx	edi, byte ptr [rsi + 9]
-	WORD $0xc701                 // ADDL AX, DI                          // add	edi, eax
-	WORD $0xf901                 // ADDL DI, CX                          // add	ecx, edi
-	LONG $0x0a46b60f             // MOVZX 0xa(SI), AX                    // movzx	eax, byte ptr [rsi + 10]
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	WORD $0xc101                 // ADDL AX, CX                          // add	ecx, eax
-	LONG $0x0b7eb60f             // MOVZX 0xb(SI), DI                    // movzx	edi, byte ptr [rsi + 11]
-	WORD $0xc701                 // ADDL AX, DI                          // add	edi, eax
-	WORD $0xf901                 // ADDL DI, CX                          // add	ecx, edi
-	LONG $0x0c46b60f             // MOVZX 0xc(SI), AX                    // movzx	eax, byte ptr [rsi + 12]
-	WORD $0xf801                 // ADDL DI, AX                          // add	eax, edi
-	WORD $0xc101                 // ADDL AX, CX                          // add	ecx, eax
-	LONG $0x0d7eb60f             // MOVZX 0xd(SI), DI                    // movzx	edi, byte ptr [rsi + 13]
-	WORD $0xc701                 // ADDL AX, DI                          // add	edi, eax
-	WORD $0xf901                 // ADDL DI, CX                          // add	ecx, edi
-	LONG $0x46b60f44; BYTE $0x0e // MOVZX 0xe(SI), R8                    // movzx	r8d, byte ptr [rsi + 14]
-	WORD $0x0141; BYTE $0xf8     // ADDL DI, R8                          // add	r8d, edi
-	WORD $0x0144; BYTE $0xc1     // ADDL R8, CX                          // add	ecx, r8d
-	LONG $0x0f46b60f             // MOVZX 0xf(SI), AX                    // movzx	eax, byte ptr [rsi + 15]
-	WORD $0x0144; BYTE $0xc0     // ADDL R8, AX                          // add	eax, r8d
-	WORD $0xc101                 // ADDL AX, CX                          // add	ecx, eax
-	ADDQ $-0x10, DX              // <--                                  // add	rdx, -16
-	JE   scalar_finalize                 // <--                                  // je	.scalar_finalize
-	ADDQ $0x10, SI               // <--                                  // add	rsi, 16
+	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 // <--                                  // lea	rdi, [rdx - 1]
-	MOVQ DX, R9       // <--                                  // mov	r9, rdx
-	ANDQ $0x3, R9     // <--                                  // and	r9, 3
-	JE   scalar_dword_prelude      // <--                                  // je	.scalar_dword_prelude
-	XORL R8, R8       // <--                                  // xor	r8d, r8d
+	LEAQ          -0x1(DX), DI
+	MOVQ          DX, R9
+	ANDQ          $0x3, R9
+	JE            scalar_dword_prelude
+	XORL          R8, R8
 
 scalar_byte_prelude_loop:
-	LONG $0x14b60f46; BYTE $0x06 // MOVZX 0(SI)(R8*1), R10               // movzx	r10d, byte ptr [rsi + r8]
-	WORD $0x0144; BYTE $0xd0     // ADDL R10, AX                         // add	eax, r10d
-	WORD $0xc101                 // ADDL AX, CX                          // add	ecx, eax
-	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, DX                  // <--                                  // sub	rdx, r8
+	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 // <--                                  // cmp	rdi, 3
-	JB   scalar_finalize  // <--                                  // jb	.scalar_finalize
-	XORL DI, DI   // <--                                  // xor	edi, edi
+	CMPQ          DI, $0x3
+	JB            scalar_finalize
+	XORL          DI, DI
 
 scalar_dword_loop:
-	LONG $0x04b60f44; BYTE $0x3e   // MOVZX 0(SI)(DI*1), R8                // movzx	r8d, byte ptr [rsi + rdi]
-	WORD $0x0141; BYTE $0xc0       // ADDL AX, R8                          // add	r8d, eax
-	WORD $0x0144; BYTE $0xc1       // ADDL R8, CX                          // add	ecx, r8d
-	LONG $0x3e44b60f; BYTE $0x01   // MOVZX 0x1(SI)(DI*1), AX              // movzx	eax, byte ptr [rsi + rdi + 1]
-	WORD $0x0144; BYTE $0xc0       // ADDL R8, AX                          // add	eax, r8d
-	WORD $0xc101                   // ADDL AX, CX                          // add	ecx, eax
-	LONG $0x44b60f44; WORD $0x023e // MOVZX 0x2(SI)(DI*1), R8              // movzx	r8d, byte ptr [rsi + rdi + 2]
-	WORD $0x0141; BYTE $0xc0       // ADDL AX, R8                          // add	r8d, eax
-	WORD $0x0144; BYTE $0xc1       // ADDL R8, CX                          // add	ecx, r8d
-	LONG $0x3e44b60f; BYTE $0x03   // MOVZX 0x3(SI)(DI*1), AX              // movzx	eax, byte ptr [rsi + rdi + 3]
-	WORD $0x0144; BYTE $0xc0       // ADDL R8, AX                          // add	eax, r8d
-	WORD $0xc101                   // ADDL AX, CX                          // add	ecx, eax
-	ADDQ $0x4, DI                  // <--                                  // add	rdi, 4
-	CMPQ DX, DI                    // <--                                  // cmp	rdx, rdi
-	JNE  scalar_dword_loop         // <--                                  // jne	.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:
-	LONG  $0x000f908d; WORD $0xffff // LEAL -0xfff1(AX), DX                 // lea	edx, [rax - 65521]
-	CMPL  AX, $0xfff1               // <--                                  // cmp	eax, 65521
-	WORD  $0x420f; BYTE $0xd0       // CMOVB AX, DX                         // cmovb	edx, eax
-	WORD  $0xc889                   // MOVL CX, AX                          // mov	eax, ecx
-	LONG  $0x078071be; BYTE $0x80   // MOVL $-0x7ff87f8f, SI                // mov	esi, 2147975281
-	IMULQ AX, SI                    // <--                                  // imul	rsi, rax
-	SHRQ  $0x2f, SI                 // <--                                  // shr	rsi, 47
-	LONG  $0xfff1c669; WORD $0x0000 // IMULL $0xfff1, SI, AX                // imul	eax, esi, 65521
-	WORD  $0xc129                   // SUBL AX, CX                          // sub	ecx, eax
-	WORD  $0xe1c1; BYTE $0x10       // SHLL $0x10, CX                       // shl	ecx, 16
-	WORD  $0xd109                   // ORL DX, CX                           // or	ecx, edx
-	WORD  $0xc889                   // MOVL CX, AX                          // mov	eax, ecx
-	NOP                             // (skipped)                            // mov	rsp, rbp
-	NOP                             // (skipped)                            // pop	rbp
-	VZEROUPPER                      // <--                                  // vzeroupper
-	MOVL  AX, ret+32(FP)            // <--
-	RET                             // <--                                  // ret
+	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:
-	WORD $0xe1c1; BYTE $0x10 // SHLL $0x10, CX                       // shl	ecx, 16
-	WORD $0xc809             // ORL CX, AX                           // or	eax, ecx
-	NOP                      // (skipped)                            // mov	rsp, rbp
-	NOP                      // (skipped)                            // pop	rbp
-	VZEROUPPER               // <--                                  // vzeroupper
-	MOVL AX, ret+32(FP)      // <--
-	RET                      // <--                                  // ret
+	SHLL          $0x10, CX
+	ORL           CX, AX
+	VZEROUPPER
+	MOVL          AX, ret+32(FP)
+	RET
--