// Code generated by command: go run asm.go -out md5x16.s -stubs stub.go. DO NOT EDIT.

#include "textflag.h"

DATA consts<>+0(SB)/4, $0xd76aa478
DATA consts<>+4(SB)/4, $0xe8c7b756
DATA consts<>+8(SB)/4, $0x242070db
DATA consts<>+12(SB)/4, $0xc1bdceee
DATA consts<>+16(SB)/4, $0xf57c0faf
DATA consts<>+20(SB)/4, $0x4787c62a
DATA consts<>+24(SB)/4, $0xa8304613
DATA consts<>+28(SB)/4, $0xfd469501
DATA consts<>+32(SB)/4, $0x698098d8
DATA consts<>+36(SB)/4, $0x8b44f7af
DATA consts<>+40(SB)/4, $0xffff5bb1
DATA consts<>+44(SB)/4, $0x895cd7be
DATA consts<>+48(SB)/4, $0x6b901122
DATA consts<>+52(SB)/4, $0xfd987193
DATA consts<>+56(SB)/4, $0xa679438e
DATA consts<>+60(SB)/4, $0x49b40821
DATA consts<>+64(SB)/4, $0xf61e2562
DATA consts<>+68(SB)/4, $0xc040b340
DATA consts<>+72(SB)/4, $0x265e5a51
DATA consts<>+76(SB)/4, $0xe9b6c7aa
DATA consts<>+80(SB)/4, $0xd62f105d
DATA consts<>+84(SB)/4, $0x02441453
DATA consts<>+88(SB)/4, $0xd8a1e681
DATA consts<>+92(SB)/4, $0xe7d3fbc8
DATA consts<>+96(SB)/4, $0x21e1cde6
DATA consts<>+100(SB)/4, $0xc33707d6
DATA consts<>+104(SB)/4, $0xf4d50d87
DATA consts<>+108(SB)/4, $0x455a14ed
DATA consts<>+112(SB)/4, $0xa9e3e905
DATA consts<>+116(SB)/4, $0xfcefa3f8
DATA consts<>+120(SB)/4, $0x676f02d9
DATA consts<>+124(SB)/4, $0x8d2a4c8a
DATA consts<>+128(SB)/4, $0xfffa3942
DATA consts<>+132(SB)/4, $0x8771f681
DATA consts<>+136(SB)/4, $0x6d9d6122
DATA consts<>+140(SB)/4, $0xfde5380c
DATA consts<>+144(SB)/4, $0xa4beea44
DATA consts<>+148(SB)/4, $0x4bdecfa9
DATA consts<>+152(SB)/4, $0xf6bb4b60
DATA consts<>+156(SB)/4, $0xbebfbc70
DATA consts<>+160(SB)/4, $0x289b7ec6
DATA consts<>+164(SB)/4, $0xeaa127fa
DATA consts<>+168(SB)/4, $0xd4ef3085
DATA consts<>+172(SB)/4, $0x04881d05
DATA consts<>+176(SB)/4, $0xd9d4d039
DATA consts<>+180(SB)/4, $0xe6db99e5
DATA consts<>+184(SB)/4, $0x1fa27cf8
DATA consts<>+188(SB)/4, $0xc4ac5665
DATA consts<>+192(SB)/4, $0xf4292244
DATA consts<>+196(SB)/4, $0x432aff97
DATA consts<>+200(SB)/4, $0xab9423a7
DATA consts<>+204(SB)/4, $0xfc93a039
DATA consts<>+208(SB)/4, $0x655b59c3
DATA consts<>+212(SB)/4, $0x8f0ccc92
DATA consts<>+216(SB)/4, $0xffeff47d
DATA consts<>+220(SB)/4, $0x85845dd1
DATA consts<>+224(SB)/4, $0x6fa87e4f
DATA consts<>+228(SB)/4, $0xfe2ce6e0
DATA consts<>+232(SB)/4, $0xa3014314
DATA consts<>+236(SB)/4, $0x4e0811a1
DATA consts<>+240(SB)/4, $0xf7537e82
DATA consts<>+244(SB)/4, $0xbd3af235
DATA consts<>+248(SB)/4, $0x2ad7d2bb
DATA consts<>+252(SB)/4, $0xeb86d391
GLOBL consts<>(SB), RODATA|NOPTR, $256

// func block(h *[4][16]uint32, base uintptr, offsets *[16]uint32, mask uint16)
// Requires: AVX, AVX512F
TEXT ·block(SB), $0-26
	MOVQ  h+0(FP), AX
	MOVQ  base+8(FP), CX
	MOVQ  offsets+16(FP), DX
	KMOVW mask+24(FP), K1

	// Load offsets.
	VMOVUPD (DX), Z0

	// Load initial hash.
	VMOVUPD (AX), Z1
	VMOVUPD 64(AX), Z2
	VMOVUPD 128(AX), Z3
	VMOVUPD 192(AX), Z4

	// Initialize registers.
	VMOVUPD Z1, Z5
	VMOVUPD Z2, Z6
	VMOVUPD Z3, Z7
	VMOVUPD Z4, Z8

	// Round 0.
	KMOVW       K1, K2
	VPGATHERDD  (CX)(Z0*1), K2, Z9
	VPADDD      Z9, Z5, Z5
	VPADDD.BCST consts<>+0(SB), Z5, Z5
	VMOVUPD     Z8, Z25
	VPTERNLOGD  $0xd8, Z6, Z7, Z25
	VPADDD      Z25, Z5, Z5
	VPROLD      $0x07, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 1.
	KMOVW       K1, K2
	VPGATHERDD  4(CX)(Z0*1), K2, Z10
	VPADDD      Z10, Z8, Z8
	VPADDD.BCST consts<>+4(SB), Z8, Z8
	VMOVUPD     Z7, Z25
	VPTERNLOGD  $0xd8, Z5, Z6, Z25
	VPADDD      Z25, Z8, Z8
	VPROLD      $0x0c, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 2.
	KMOVW       K1, K2
	VPGATHERDD  8(CX)(Z0*1), K2, Z11
	VPADDD      Z11, Z7, Z7
	VPADDD.BCST consts<>+8(SB), Z7, Z7
	VMOVUPD     Z6, Z25
	VPTERNLOGD  $0xd8, Z8, Z5, Z25
	VPADDD      Z25, Z7, Z7
	VPROLD      $0x11, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 3.
	KMOVW       K1, K2
	VPGATHERDD  12(CX)(Z0*1), K2, Z12
	VPADDD      Z12, Z6, Z6
	VPADDD.BCST consts<>+12(SB), Z6, Z6
	VMOVUPD     Z5, Z25
	VPTERNLOGD  $0xd8, Z7, Z8, Z25
	VPADDD      Z25, Z6, Z6
	VPROLD      $0x16, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 4.
	KMOVW       K1, K2
	VPGATHERDD  16(CX)(Z0*1), K2, Z13
	VPADDD      Z13, Z5, Z5
	VPADDD.BCST consts<>+16(SB), Z5, Z5
	VMOVUPD     Z8, Z25
	VPTERNLOGD  $0xd8, Z6, Z7, Z25
	VPADDD      Z25, Z5, Z5
	VPROLD      $0x07, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 5.
	KMOVW       K1, K2
	VPGATHERDD  20(CX)(Z0*1), K2, Z14
	VPADDD      Z14, Z8, Z8
	VPADDD.BCST consts<>+20(SB), Z8, Z8
	VMOVUPD     Z7, Z25
	VPTERNLOGD  $0xd8, Z5, Z6, Z25
	VPADDD      Z25, Z8, Z8
	VPROLD      $0x0c, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 6.
	KMOVW       K1, K2
	VPGATHERDD  24(CX)(Z0*1), K2, Z15
	VPADDD      Z15, Z7, Z7
	VPADDD.BCST consts<>+24(SB), Z7, Z7
	VMOVUPD     Z6, Z25
	VPTERNLOGD  $0xd8, Z8, Z5, Z25
	VPADDD      Z25, Z7, Z7
	VPROLD      $0x11, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 7.
	KMOVW       K1, K2
	VPGATHERDD  28(CX)(Z0*1), K2, Z16
	VPADDD      Z16, Z6, Z6
	VPADDD.BCST consts<>+28(SB), Z6, Z6
	VMOVUPD     Z5, Z25
	VPTERNLOGD  $0xd8, Z7, Z8, Z25
	VPADDD      Z25, Z6, Z6
	VPROLD      $0x16, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 8.
	KMOVW       K1, K2
	VPGATHERDD  32(CX)(Z0*1), K2, Z17
	VPADDD      Z17, Z5, Z5
	VPADDD.BCST consts<>+32(SB), Z5, Z5
	VMOVUPD     Z8, Z25
	VPTERNLOGD  $0xd8, Z6, Z7, Z25
	VPADDD      Z25, Z5, Z5
	VPROLD      $0x07, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 9.
	KMOVW       K1, K2
	VPGATHERDD  36(CX)(Z0*1), K2, Z18
	VPADDD      Z18, Z8, Z8
	VPADDD.BCST consts<>+36(SB), Z8, Z8
	VMOVUPD     Z7, Z25
	VPTERNLOGD  $0xd8, Z5, Z6, Z25
	VPADDD      Z25, Z8, Z8
	VPROLD      $0x0c, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 10.
	KMOVW       K1, K2
	VPGATHERDD  40(CX)(Z0*1), K2, Z19
	VPADDD      Z19, Z7, Z7
	VPADDD.BCST consts<>+40(SB), Z7, Z7
	VMOVUPD     Z6, Z25
	VPTERNLOGD  $0xd8, Z8, Z5, Z25
	VPADDD      Z25, Z7, Z7
	VPROLD      $0x11, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 11.
	KMOVW       K1, K2
	VPGATHERDD  44(CX)(Z0*1), K2, Z20
	VPADDD      Z20, Z6, Z6
	VPADDD.BCST consts<>+44(SB), Z6, Z6
	VMOVUPD     Z5, Z25
	VPTERNLOGD  $0xd8, Z7, Z8, Z25
	VPADDD      Z25, Z6, Z6
	VPROLD      $0x16, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 12.
	KMOVW       K1, K2
	VPGATHERDD  48(CX)(Z0*1), K2, Z21
	VPADDD      Z21, Z5, Z5
	VPADDD.BCST consts<>+48(SB), Z5, Z5
	VMOVUPD     Z8, Z25
	VPTERNLOGD  $0xd8, Z6, Z7, Z25
	VPADDD      Z25, Z5, Z5
	VPROLD      $0x07, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 13.
	KMOVW       K1, K2
	VPGATHERDD  52(CX)(Z0*1), K2, Z22
	VPADDD      Z22, Z8, Z8
	VPADDD.BCST consts<>+52(SB), Z8, Z8
	VMOVUPD     Z7, Z25
	VPTERNLOGD  $0xd8, Z5, Z6, Z25
	VPADDD      Z25, Z8, Z8
	VPROLD      $0x0c, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 14.
	KMOVW       K1, K2
	VPGATHERDD  56(CX)(Z0*1), K2, Z23
	VPADDD      Z23, Z7, Z7
	VPADDD.BCST consts<>+56(SB), Z7, Z7
	VMOVUPD     Z6, Z25
	VPTERNLOGD  $0xd8, Z8, Z5, Z25
	VPADDD      Z25, Z7, Z7
	VPROLD      $0x11, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 15.
	KMOVW       K1, K1
	VPGATHERDD  60(CX)(Z0*1), K1, Z24
	VPADDD      Z24, Z6, Z6
	VPADDD.BCST consts<>+60(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0xd8, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x16, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 16.
	VPADDD      Z10, Z5, Z5
	VPADDD.BCST consts<>+64(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0xac, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x05, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 17.
	VPADDD      Z15, Z8, Z8
	VPADDD.BCST consts<>+68(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0xac, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x09, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 18.
	VPADDD      Z20, Z7, Z7
	VPADDD.BCST consts<>+72(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0xac, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x0e, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 19.
	VPADDD      Z9, Z6, Z6
	VPADDD.BCST consts<>+76(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0xac, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x14, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 20.
	VPADDD      Z14, Z5, Z5
	VPADDD.BCST consts<>+80(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0xac, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x05, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 21.
	VPADDD      Z19, Z8, Z8
	VPADDD.BCST consts<>+84(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0xac, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x09, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 22.
	VPADDD      Z24, Z7, Z7
	VPADDD.BCST consts<>+88(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0xac, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x0e, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 23.
	VPADDD      Z13, Z6, Z6
	VPADDD.BCST consts<>+92(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0xac, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x14, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 24.
	VPADDD      Z18, Z5, Z5
	VPADDD.BCST consts<>+96(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0xac, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x05, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 25.
	VPADDD      Z23, Z8, Z8
	VPADDD.BCST consts<>+100(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0xac, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x09, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 26.
	VPADDD      Z12, Z7, Z7
	VPADDD.BCST consts<>+104(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0xac, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x0e, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 27.
	VPADDD      Z17, Z6, Z6
	VPADDD.BCST consts<>+108(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0xac, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x14, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 28.
	VPADDD      Z22, Z5, Z5
	VPADDD.BCST consts<>+112(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0xac, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x05, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 29.
	VPADDD      Z11, Z8, Z8
	VPADDD.BCST consts<>+116(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0xac, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x09, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 30.
	VPADDD      Z16, Z7, Z7
	VPADDD.BCST consts<>+120(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0xac, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x0e, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 31.
	VPADDD      Z21, Z6, Z6
	VPADDD.BCST consts<>+124(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0xac, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x14, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 32.
	VPADDD      Z14, Z5, Z5
	VPADDD.BCST consts<>+128(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0x96, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x04, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 33.
	VPADDD      Z17, Z8, Z8
	VPADDD.BCST consts<>+132(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0x96, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x0b, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 34.
	VPADDD      Z20, Z7, Z7
	VPADDD.BCST consts<>+136(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0x96, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x10, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 35.
	VPADDD      Z23, Z6, Z6
	VPADDD.BCST consts<>+140(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0x96, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x17, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 36.
	VPADDD      Z10, Z5, Z5
	VPADDD.BCST consts<>+144(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0x96, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x04, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 37.
	VPADDD      Z13, Z8, Z8
	VPADDD.BCST consts<>+148(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0x96, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x0b, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 38.
	VPADDD      Z16, Z7, Z7
	VPADDD.BCST consts<>+152(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0x96, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x10, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 39.
	VPADDD      Z19, Z6, Z6
	VPADDD.BCST consts<>+156(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0x96, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x17, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 40.
	VPADDD      Z22, Z5, Z5
	VPADDD.BCST consts<>+160(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0x96, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x04, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 41.
	VPADDD      Z9, Z8, Z8
	VPADDD.BCST consts<>+164(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0x96, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x0b, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 42.
	VPADDD      Z12, Z7, Z7
	VPADDD.BCST consts<>+168(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0x96, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x10, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 43.
	VPADDD      Z15, Z6, Z6
	VPADDD.BCST consts<>+172(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0x96, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x17, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 44.
	VPADDD      Z18, Z5, Z5
	VPADDD.BCST consts<>+176(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0x96, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x04, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 45.
	VPADDD      Z21, Z8, Z8
	VPADDD.BCST consts<>+180(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0x96, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x0b, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 46.
	VPADDD      Z24, Z7, Z7
	VPADDD.BCST consts<>+184(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0x96, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x10, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 47.
	VPADDD      Z11, Z6, Z6
	VPADDD.BCST consts<>+188(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0x96, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x17, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 48.
	VPADDD      Z9, Z5, Z5
	VPADDD.BCST consts<>+192(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0x63, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x06, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 49.
	VPADDD      Z16, Z8, Z8
	VPADDD.BCST consts<>+196(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0x63, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x0a, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 50.
	VPADDD      Z23, Z7, Z7
	VPADDD.BCST consts<>+200(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0x63, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x0f, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 51.
	VPADDD      Z14, Z6, Z6
	VPADDD.BCST consts<>+204(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0x63, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x15, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 52.
	VPADDD      Z21, Z5, Z5
	VPADDD.BCST consts<>+208(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0x63, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x06, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 53.
	VPADDD      Z12, Z8, Z8
	VPADDD.BCST consts<>+212(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0x63, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x0a, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 54.
	VPADDD      Z19, Z7, Z7
	VPADDD.BCST consts<>+216(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0x63, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x0f, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 55.
	VPADDD      Z10, Z6, Z6
	VPADDD.BCST consts<>+220(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0x63, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x15, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 56.
	VPADDD      Z17, Z5, Z5
	VPADDD.BCST consts<>+224(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0x63, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x06, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 57.
	VPADDD      Z24, Z8, Z8
	VPADDD.BCST consts<>+228(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0x63, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x0a, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 58.
	VPADDD      Z15, Z7, Z7
	VPADDD.BCST consts<>+232(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0x63, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x0f, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 59.
	VPADDD      Z22, Z6, Z6
	VPADDD.BCST consts<>+236(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0x63, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x15, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Round 60.
	VPADDD      Z13, Z5, Z5
	VPADDD.BCST consts<>+240(SB), Z5, Z5
	VMOVUPD     Z8, Z0
	VPTERNLOGD  $0x63, Z6, Z7, Z0
	VPADDD      Z0, Z5, Z5
	VPROLD      $0x06, Z5, Z5
	VPADDD      Z6, Z5, Z5

	// Round 61.
	VPADDD      Z20, Z8, Z8
	VPADDD.BCST consts<>+244(SB), Z8, Z8
	VMOVUPD     Z7, Z0
	VPTERNLOGD  $0x63, Z5, Z6, Z0
	VPADDD      Z0, Z8, Z8
	VPROLD      $0x0a, Z8, Z8
	VPADDD      Z5, Z8, Z8

	// Round 62.
	VPADDD      Z11, Z7, Z7
	VPADDD.BCST consts<>+248(SB), Z7, Z7
	VMOVUPD     Z6, Z0
	VPTERNLOGD  $0x63, Z8, Z5, Z0
	VPADDD      Z0, Z7, Z7
	VPROLD      $0x0f, Z7, Z7
	VPADDD      Z8, Z7, Z7

	// Round 63.
	VPADDD      Z18, Z6, Z6
	VPADDD.BCST consts<>+252(SB), Z6, Z6
	VMOVUPD     Z5, Z0
	VPTERNLOGD  $0x63, Z7, Z8, Z0
	VPADDD      Z0, Z6, Z6
	VPROLD      $0x15, Z6, Z6
	VPADDD      Z7, Z6, Z6

	// Final add.
	VPADDD Z5, Z1, Z1
	VPADDD Z6, Z2, Z2
	VPADDD Z7, Z3, Z3
	VPADDD Z8, Z4, Z4

	// Store results back.
	VMOVUPD Z1, (AX)
	VMOVUPD Z2, 64(AX)
	VMOVUPD Z3, 128(AX)
	VMOVUPD Z4, 192(AX)
	VZEROUPPER
	RET
