blob: 5b4242061537a48951c808fbc13e6c11a3080ace [file] [log] [blame]
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "textflag.h"
// SHA512 block routine. See sha512block.go for Go equivalent.
//
// The algorithm is detailed in FIPS 180-4:
//
// http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
//
// Wt = Mt; for 0 <= t <= 15
// Wt = SIGMA1(Wt-2) + SIGMA0(Wt-15) + Wt-16; for 16 <= t <= 79
//
// a = H0
// b = H1
// c = H2
// d = H3
// e = H4
// f = H5
// g = H6
// h = H7
//
// for t = 0 to 79 {
// T1 = h + BIGSIGMA1(e) + Ch(e,f,g) + Kt + Wt
// T2 = BIGSIGMA0(a) + Maj(a,b,c)
// h = g
// g = f
// f = e
// e = d + T1
// d = c
// c = b
// b = a
// a = T1 + T2
// }
//
// H0 = a + H0
// H1 = b + H1
// H2 = c + H2
// H3 = d + H3
// H4 = e + H4
// H5 = f + H5
// H6 = g + H6
// H7 = h + H7
// Wt = Mt; for 0 <= t <= 15
#define MSGSCHEDULE0(index) \
MOVQ (index*8)(SI), AX; \
BSWAPQ AX; \
MOVQ AX, (index*8)(BP)
// Wt = SIGMA1(Wt-2) + Wt-7 + SIGMA0(Wt-15) + Wt-16; for 16 <= t <= 79
// SIGMA0(x) = ROTR(1,x) XOR ROTR(8,x) XOR SHR(7,x)
// SIGMA1(x) = ROTR(19,x) XOR ROTR(61,x) XOR SHR(6,x)
#define MSGSCHEDULE1(index) \
MOVQ ((index-2)*8)(BP), AX; \
MOVQ AX, CX; \
RORQ $19, AX; \
MOVQ CX, DX; \
RORQ $61, CX; \
SHRQ $6, DX; \
MOVQ ((index-15)*8)(BP), BX; \
XORQ CX, AX; \
MOVQ BX, CX; \
XORQ DX, AX; \
RORQ $1, BX; \
MOVQ CX, DX; \
SHRQ $7, DX; \
RORQ $8, CX; \
ADDQ ((index-7)*8)(BP), AX; \
XORQ CX, BX; \
XORQ DX, BX; \
ADDQ ((index-16)*8)(BP), BX; \
ADDQ BX, AX; \
MOVQ AX, ((index)*8)(BP)
// Calculate T1 in AX - uses AX, CX and DX registers.
// h is also used as an accumulator. Wt is passed in AX.
// T1 = h + BIGSIGMA1(e) + Ch(e, f, g) + Kt + Wt
// BIGSIGMA1(x) = ROTR(14,x) XOR ROTR(18,x) XOR ROTR(41,x)
// Ch(x, y, z) = (x AND y) XOR (NOT x AND z)
#define SHA512T1(const, e, f, g, h) \
MOVQ $const, DX; \
ADDQ AX, h; \
MOVQ e, AX; \
ADDQ DX, h; \
MOVQ e, CX; \
RORQ $14, AX; \
MOVQ e, DX; \
RORQ $18, CX; \
XORQ CX, AX; \
MOVQ e, CX; \
RORQ $41, DX; \
ANDQ f, CX; \
XORQ AX, DX; \
MOVQ e, AX; \
NOTQ AX; \
ADDQ DX, h; \
ANDQ g, AX; \
XORQ CX, AX; \
ADDQ h, AX
// Calculate T2 in BX - uses BX, CX, DX and DI registers.
// T2 = BIGSIGMA0(a) + Maj(a, b, c)
// BIGSIGMA0(x) = ROTR(28,x) XOR ROTR(34,x) XOR ROTR(39,x)
// Maj(x, y, z) = (x AND y) XOR (x AND z) XOR (y AND z)
#define SHA512T2(a, b, c) \
MOVQ a, DI; \
MOVQ c, BX; \
RORQ $28, DI; \
MOVQ a, DX; \
ANDQ b, BX; \
RORQ $34, DX; \
MOVQ a, CX; \
ANDQ c, CX; \
XORQ DX, DI; \
XORQ CX, BX; \
MOVQ a, DX; \
MOVQ b, CX; \
RORQ $39, DX; \
ANDQ a, CX; \
XORQ CX, BX; \
XORQ DX, DI; \
ADDQ DI, BX
// Calculate T1 and T2, then e = d + T1 and a = T1 + T2.
// The values for e and a are stored in d and h, ready for rotation.
#define SHA512ROUND(index, const, a, b, c, d, e, f, g, h) \
SHA512T1(const, e, f, g, h); \
SHA512T2(a, b, c); \
MOVQ BX, h; \
ADDQ AX, d; \
ADDQ AX, h
#define SHA512ROUND0(index, const, a, b, c, d, e, f, g, h) \
MSGSCHEDULE0(index); \
SHA512ROUND(index, const, a, b, c, d, e, f, g, h)
#define SHA512ROUND1(index, const, a, b, c, d, e, f, g, h) \
MSGSCHEDULE1(index); \
SHA512ROUND(index, const, a, b, c, d, e, f, g, h)
TEXT ·blockAMD64(SB),0,$648-32
MOVQ p_base+8(FP), SI
MOVQ p_len+16(FP), DX
SHRQ $7, DX
SHLQ $7, DX
LEAQ (SI)(DX*1), DI
MOVQ DI, 640(SP)
CMPQ SI, DI
JEQ end
MOVQ dig+0(FP), BP
MOVQ (0*8)(BP), R8 // a = H0
MOVQ (1*8)(BP), R9 // b = H1
MOVQ (2*8)(BP), R10 // c = H2
MOVQ (3*8)(BP), R11 // d = H3
MOVQ (4*8)(BP), R12 // e = H4
MOVQ (5*8)(BP), R13 // f = H5
MOVQ (6*8)(BP), R14 // g = H6
MOVQ (7*8)(BP), R15 // h = H7
loop:
MOVQ SP, BP // message schedule
SHA512ROUND0(0, 0x428a2f98d728ae22, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND0(1, 0x7137449123ef65cd, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND0(2, 0xb5c0fbcfec4d3b2f, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND0(3, 0xe9b5dba58189dbbc, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND0(4, 0x3956c25bf348b538, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND0(5, 0x59f111f1b605d019, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND0(6, 0x923f82a4af194f9b, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND0(7, 0xab1c5ed5da6d8118, R9, R10, R11, R12, R13, R14, R15, R8)
SHA512ROUND0(8, 0xd807aa98a3030242, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND0(9, 0x12835b0145706fbe, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND0(10, 0x243185be4ee4b28c, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND0(11, 0x550c7dc3d5ffb4e2, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND0(12, 0x72be5d74f27b896f, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND0(13, 0x80deb1fe3b1696b1, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND0(14, 0x9bdc06a725c71235, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND0(15, 0xc19bf174cf692694, R9, R10, R11, R12, R13, R14, R15, R8)
SHA512ROUND1(16, 0xe49b69c19ef14ad2, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND1(17, 0xefbe4786384f25e3, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND1(18, 0x0fc19dc68b8cd5b5, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND1(19, 0x240ca1cc77ac9c65, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND1(20, 0x2de92c6f592b0275, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND1(21, 0x4a7484aa6ea6e483, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND1(22, 0x5cb0a9dcbd41fbd4, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND1(23, 0x76f988da831153b5, R9, R10, R11, R12, R13, R14, R15, R8)
SHA512ROUND1(24, 0x983e5152ee66dfab, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND1(25, 0xa831c66d2db43210, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND1(26, 0xb00327c898fb213f, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND1(27, 0xbf597fc7beef0ee4, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND1(28, 0xc6e00bf33da88fc2, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND1(29, 0xd5a79147930aa725, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND1(30, 0x06ca6351e003826f, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND1(31, 0x142929670a0e6e70, R9, R10, R11, R12, R13, R14, R15, R8)
SHA512ROUND1(32, 0x27b70a8546d22ffc, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND1(33, 0x2e1b21385c26c926, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND1(34, 0x4d2c6dfc5ac42aed, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND1(35, 0x53380d139d95b3df, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND1(36, 0x650a73548baf63de, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND1(37, 0x766a0abb3c77b2a8, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND1(38, 0x81c2c92e47edaee6, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND1(39, 0x92722c851482353b, R9, R10, R11, R12, R13, R14, R15, R8)
SHA512ROUND1(40, 0xa2bfe8a14cf10364, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND1(41, 0xa81a664bbc423001, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND1(42, 0xc24b8b70d0f89791, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND1(43, 0xc76c51a30654be30, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND1(44, 0xd192e819d6ef5218, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND1(45, 0xd69906245565a910, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND1(46, 0xf40e35855771202a, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND1(47, 0x106aa07032bbd1b8, R9, R10, R11, R12, R13, R14, R15, R8)
SHA512ROUND1(48, 0x19a4c116b8d2d0c8, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND1(49, 0x1e376c085141ab53, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND1(50, 0x2748774cdf8eeb99, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND1(51, 0x34b0bcb5e19b48a8, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND1(52, 0x391c0cb3c5c95a63, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND1(53, 0x4ed8aa4ae3418acb, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND1(54, 0x5b9cca4f7763e373, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND1(55, 0x682e6ff3d6b2b8a3, R9, R10, R11, R12, R13, R14, R15, R8)
SHA512ROUND1(56, 0x748f82ee5defb2fc, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND1(57, 0x78a5636f43172f60, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND1(58, 0x84c87814a1f0ab72, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND1(59, 0x8cc702081a6439ec, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND1(60, 0x90befffa23631e28, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND1(61, 0xa4506cebde82bde9, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND1(62, 0xbef9a3f7b2c67915, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND1(63, 0xc67178f2e372532b, R9, R10, R11, R12, R13, R14, R15, R8)
SHA512ROUND1(64, 0xca273eceea26619c, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND1(65, 0xd186b8c721c0c207, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND1(66, 0xeada7dd6cde0eb1e, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND1(67, 0xf57d4f7fee6ed178, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND1(68, 0x06f067aa72176fba, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND1(69, 0x0a637dc5a2c898a6, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND1(70, 0x113f9804bef90dae, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND1(71, 0x1b710b35131c471b, R9, R10, R11, R12, R13, R14, R15, R8)
SHA512ROUND1(72, 0x28db77f523047d84, R8, R9, R10, R11, R12, R13, R14, R15)
SHA512ROUND1(73, 0x32caab7b40c72493, R15, R8, R9, R10, R11, R12, R13, R14)
SHA512ROUND1(74, 0x3c9ebe0a15c9bebc, R14, R15, R8, R9, R10, R11, R12, R13)
SHA512ROUND1(75, 0x431d67c49c100d4c, R13, R14, R15, R8, R9, R10, R11, R12)
SHA512ROUND1(76, 0x4cc5d4becb3e42b6, R12, R13, R14, R15, R8, R9, R10, R11)
SHA512ROUND1(77, 0x597f299cfc657e2a, R11, R12, R13, R14, R15, R8, R9, R10)
SHA512ROUND1(78, 0x5fcb6fab3ad6faec, R10, R11, R12, R13, R14, R15, R8, R9)
SHA512ROUND1(79, 0x6c44198c4a475817, R9, R10, R11, R12, R13, R14, R15, R8)
MOVQ dig+0(FP), BP
ADDQ (0*8)(BP), R8 // H0 = a + H0
MOVQ R8, (0*8)(BP)
ADDQ (1*8)(BP), R9 // H1 = b + H1
MOVQ R9, (1*8)(BP)
ADDQ (2*8)(BP), R10 // H2 = c + H2
MOVQ R10, (2*8)(BP)
ADDQ (3*8)(BP), R11 // H3 = d + H3
MOVQ R11, (3*8)(BP)
ADDQ (4*8)(BP), R12 // H4 = e + H4
MOVQ R12, (4*8)(BP)
ADDQ (5*8)(BP), R13 // H5 = f + H5
MOVQ R13, (5*8)(BP)
ADDQ (6*8)(BP), R14 // H6 = g + H6
MOVQ R14, (6*8)(BP)
ADDQ (7*8)(BP), R15 // H7 = h + H7
MOVQ R15, (7*8)(BP)
ADDQ $128, SI
CMPQ SI, 640(SP)
JB loop
end:
RET
// Version below is based on "Fast SHA512 Implementations on Intel
// Architecture Processors" White-paper
// http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-sha512-implementations-ia-processors-paper.pdf
// AVX2 version by Intel, same algorithm in Linux kernel:
// https://github.com/torvalds/linux/blob/master/arch/x86/crypto/sha512-avx2-asm.S
// James Guilford <james.guilford@intel.com>
// Kirk Yap <kirk.s.yap@intel.com>
// Tim Chen <tim.c.chen@linux.intel.com>
// David Cote <david.m.cote@intel.com>
// Aleksey Sidorov <aleksey.sidorov@intel.com>
#define YFER_SIZE (4*8)
#define SRND_SIZE (1*8)
#define INP_SIZE (1*8)
#define frame_YFER (0)
#define frame_SRND (frame_YFER + YFER_SIZE)
#define frame_INP (frame_SRND + SRND_SIZE)
#define frame_INPEND (frame_INP + INP_SIZE)
#define addm(p1, p2) \
ADDQ p1, p2; \
MOVQ p2, p1
#define COPY_YMM_AND_BSWAP(p1, p2, p3) \
VMOVDQU p2, p1; \
VPSHUFB p3, p1, p1
#define MY_VPALIGNR(YDST, YSRC1, YSRC2, RVAL) \
VPERM2F128 $0x3, YSRC2, YSRC1, YDST; \
VPALIGNR $RVAL, YSRC2, YDST, YDST
DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x00(SB)/8, $0x0001020304050607
DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x08(SB)/8, $0x08090a0b0c0d0e0f
DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x10(SB)/8, $0x1011121314151617
DATA PSHUFFLE_BYTE_FLIP_MASK<>+0x18(SB)/8, $0x18191a1b1c1d1e1f
GLOBL PSHUFFLE_BYTE_FLIP_MASK<>(SB), (NOPTR+RODATA), $32
DATA MASK_YMM_LO<>+0x00(SB)/8, $0x0000000000000000
DATA MASK_YMM_LO<>+0x08(SB)/8, $0x0000000000000000
DATA MASK_YMM_LO<>+0x10(SB)/8, $0xFFFFFFFFFFFFFFFF
DATA MASK_YMM_LO<>+0x18(SB)/8, $0xFFFFFFFFFFFFFFFF
GLOBL MASK_YMM_LO<>(SB), (NOPTR+RODATA), $32
TEXT ·blockAVX2(SB), NOSPLIT, $56-32
MOVQ dig+0(FP), SI
MOVQ p_base+8(FP), DI
MOVQ p_len+16(FP), DX
SHRQ $7, DX
SHLQ $7, DX
JZ done_hash
ADDQ DI, DX
MOVQ DX, frame_INPEND(SP)
MOVQ (0*8)(SI), AX
MOVQ (1*8)(SI), BX
MOVQ (2*8)(SI), CX
MOVQ (3*8)(SI), R8
MOVQ (4*8)(SI), DX
MOVQ (5*8)(SI), R9
MOVQ (6*8)(SI), R10
MOVQ (7*8)(SI), R11
MOVQ $PSHUFFLE_BYTE_FLIP_MASK<>(SB), R12
VMOVDQU (R12), Y9
loop0:
MOVQ ·_K+0(SB), BP
// byte swap first 16 dwords
COPY_YMM_AND_BSWAP(Y4, (0*32)(DI), Y9)
COPY_YMM_AND_BSWAP(Y5, (1*32)(DI), Y9)
COPY_YMM_AND_BSWAP(Y6, (2*32)(DI), Y9)
COPY_YMM_AND_BSWAP(Y7, (3*32)(DI), Y9)
MOVQ DI, frame_INP(SP)
// schedule 64 input dwords, by doing 12 rounds of 4 each
MOVQ $4, frame_SRND(SP)
loop1:
VPADDQ (BP), Y4, Y0
VMOVDQU Y0, frame_YFER(SP)
MY_VPALIGNR(Y0, Y7, Y6, 8)
VPADDQ Y4, Y0, Y0
MY_VPALIGNR(Y1, Y5, Y4, 8)
VPSRLQ $1, Y1, Y2
VPSLLQ $(64-1), Y1, Y3
VPOR Y2, Y3, Y3
VPSRLQ $7, Y1, Y8
MOVQ AX, DI
RORXQ $41, DX, R13
RORXQ $18, DX, R14
ADDQ frame_YFER(SP), R11
ORQ CX, DI
MOVQ R9, R15
RORXQ $34, AX, R12
XORQ R14, R13
XORQ R10, R15
RORXQ $14, DX, R14
ANDQ DX, R15
XORQ R14, R13
RORXQ $39, AX, R14
ADDQ R11, R8
ANDQ BX, DI
XORQ R12, R14
RORXQ $28, AX, R12
XORQ R10, R15
XORQ R12, R14
MOVQ AX, R12
ANDQ CX, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, R11
ADDQ R15, R8
ADDQ R15, R11
ADDQ DI, R11
VPSRLQ $8, Y1, Y2
VPSLLQ $(64-8), Y1, Y1
VPOR Y2, Y1, Y1
VPXOR Y8, Y3, Y3
VPXOR Y1, Y3, Y1
VPADDQ Y1, Y0, Y0
VPERM2F128 $0x0, Y0, Y0, Y4
MOVQ $MASK_YMM_LO<>(SB), R13
VPAND (R13), Y0, Y0
VPERM2F128 $0x11, Y7, Y7, Y2
VPSRLQ $6, Y2, Y8
MOVQ R11, DI
RORXQ $41, R8, R13
RORXQ $18, R8, R14
ADDQ 1*8+frame_YFER(SP), R10
ORQ BX, DI
MOVQ DX, R15
RORXQ $34, R11, R12
XORQ R14, R13
XORQ R9, R15
RORXQ $14, R8, R14
XORQ R14, R13
RORXQ $39, R11, R14
ANDQ R8, R15
ADDQ R10, CX
ANDQ AX, DI
XORQ R12, R14
RORXQ $28, R11, R12
XORQ R9, R15
XORQ R12, R14
MOVQ R11, R12
ANDQ BX, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, R10
ADDQ R15, CX
ADDQ R15, R10
ADDQ DI, R10
VPSRLQ $19, Y2, Y3
VPSLLQ $(64-19), Y2, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPSRLQ $61, Y2, Y3
VPSLLQ $(64-61), Y2, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPADDQ Y8, Y4, Y4
VPSRLQ $6, Y4, Y8
MOVQ R10, DI
RORXQ $41, CX, R13
ADDQ 2*8+frame_YFER(SP), R9
RORXQ $18, CX, R14
ORQ AX, DI
MOVQ R8, R15
XORQ DX, R15
RORXQ $34, R10, R12
XORQ R14, R13
ANDQ CX, R15
RORXQ $14, CX, R14
ADDQ R9, BX
ANDQ R11, DI
XORQ R14, R13
RORXQ $39, R10, R14
XORQ DX, R15
XORQ R12, R14
RORXQ $28, R10, R12
XORQ R12, R14
MOVQ R10, R12
ANDQ AX, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, R9
ADDQ R15, BX
ADDQ R15, R9
ADDQ DI, R9
VPSRLQ $19, Y4, Y3
VPSLLQ $(64-19), Y4, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPSRLQ $61, Y4, Y3
VPSLLQ $(64-61), Y4, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPADDQ Y8, Y0, Y2
VPBLENDD $0xF0, Y2, Y4, Y4
MOVQ R9, DI
RORXQ $41, BX, R13
RORXQ $18, BX, R14
ADDQ 3*8+frame_YFER(SP), DX
ORQ R11, DI
MOVQ CX, R15
RORXQ $34, R9, R12
XORQ R14, R13
XORQ R8, R15
RORXQ $14, BX, R14
ANDQ BX, R15
ADDQ DX, AX
ANDQ R10, DI
XORQ R14, R13
XORQ R8, R15
RORXQ $39, R9, R14
ADDQ R13, R15
XORQ R12, R14
ADDQ R15, AX
RORXQ $28, R9, R12
XORQ R12, R14
MOVQ R9, R12
ANDQ R11, R12
ORQ R12, DI
ADDQ R14, DX
ADDQ R15, DX
ADDQ DI, DX
VPADDQ 1*32(BP), Y5, Y0
VMOVDQU Y0, frame_YFER(SP)
MY_VPALIGNR(Y0, Y4, Y7, 8)
VPADDQ Y5, Y0, Y0
MY_VPALIGNR(Y1, Y6, Y5, 8)
VPSRLQ $1, Y1, Y2
VPSLLQ $(64-1), Y1, Y3
VPOR Y2, Y3, Y3
VPSRLQ $7, Y1, Y8
MOVQ DX, DI
RORXQ $41, AX, R13
RORXQ $18, AX, R14
ADDQ frame_YFER(SP), R8
ORQ R10, DI
MOVQ BX, R15
RORXQ $34, DX, R12
XORQ R14, R13
XORQ CX, R15
RORXQ $14, AX, R14
ANDQ AX, R15
XORQ R14, R13
RORXQ $39, DX, R14
ADDQ R8, R11
ANDQ R9, DI
XORQ R12, R14
RORXQ $28, DX, R12
XORQ CX, R15
XORQ R12, R14
MOVQ DX, R12
ANDQ R10, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, R8
ADDQ R15, R11
ADDQ R15, R8
ADDQ DI, R8
VPSRLQ $8, Y1, Y2
VPSLLQ $(64-8), Y1, Y1
VPOR Y2, Y1, Y1
VPXOR Y8, Y3, Y3
VPXOR Y1, Y3, Y1
VPADDQ Y1, Y0, Y0
VPERM2F128 $0x0, Y0, Y0, Y5
MOVQ $MASK_YMM_LO<>(SB), R13
VPAND (R13), Y0, Y0
VPERM2F128 $0x11, Y4, Y4, Y2
VPSRLQ $6, Y2, Y8
MOVQ R8, DI
RORXQ $41, R11, R13
RORXQ $18, R11, R14
ADDQ 1*8+frame_YFER(SP), CX
ORQ R9, DI
MOVQ AX, R15
RORXQ $34, R8, R12
XORQ R14, R13
XORQ BX, R15
RORXQ $14, R11, R14
XORQ R14, R13
RORXQ $39, R8, R14
ANDQ R11, R15
ADDQ CX, R10
ANDQ DX, DI
XORQ R12, R14
RORXQ $28, R8, R12
XORQ BX, R15
XORQ R12, R14
MOVQ R8, R12
ANDQ R9, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, CX
ADDQ R15, R10
ADDQ R15, CX
ADDQ DI, CX
VPSRLQ $19, Y2, Y3
VPSLLQ $(64-19), Y2, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPSRLQ $61, Y2, Y3
VPSLLQ $(64-61), Y2, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPADDQ Y8, Y5, Y5
VPSRLQ $6, Y5, Y8
MOVQ CX, DI
RORXQ $41, R10, R13
ADDQ 2*8+frame_YFER(SP), BX
RORXQ $18, R10, R14
ORQ DX, DI
MOVQ R11, R15
XORQ AX, R15
RORXQ $34, CX, R12
XORQ R14, R13
ANDQ R10, R15
RORXQ $14, R10, R14
ADDQ BX, R9
ANDQ R8, DI
XORQ R14, R13
RORXQ $39, CX, R14
XORQ AX, R15
XORQ R12, R14
RORXQ $28, CX, R12
XORQ R12, R14
MOVQ CX, R12
ANDQ DX, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, BX
ADDQ R15, R9
ADDQ R15, BX
ADDQ DI, BX
VPSRLQ $19, Y5, Y3
VPSLLQ $(64-19), Y5, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPSRLQ $61, Y5, Y3
VPSLLQ $(64-61), Y5, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPADDQ Y8, Y0, Y2
VPBLENDD $0xF0, Y2, Y5, Y5
MOVQ BX, DI
RORXQ $41, R9, R13
RORXQ $18, R9, R14
ADDQ 3*8+frame_YFER(SP), AX
ORQ R8, DI
MOVQ R10, R15
RORXQ $34, BX, R12
XORQ R14, R13
XORQ R11, R15
RORXQ $14, R9, R14
ANDQ R9, R15
ADDQ AX, DX
ANDQ CX, DI
XORQ R14, R13
XORQ R11, R15
RORXQ $39, BX, R14
ADDQ R13, R15
XORQ R12, R14
ADDQ R15, DX
RORXQ $28, BX, R12
XORQ R12, R14
MOVQ BX, R12
ANDQ R8, R12
ORQ R12, DI
ADDQ R14, AX
ADDQ R15, AX
ADDQ DI, AX
VPADDQ 2*32(BP), Y6, Y0
VMOVDQU Y0, frame_YFER(SP)
MY_VPALIGNR(Y0, Y5, Y4, 8)
VPADDQ Y6, Y0, Y0
MY_VPALIGNR(Y1, Y7, Y6, 8)
VPSRLQ $1, Y1, Y2
VPSLLQ $(64-1), Y1, Y3
VPOR Y2, Y3, Y3
VPSRLQ $7, Y1, Y8
MOVQ AX, DI
RORXQ $41, DX, R13
RORXQ $18, DX, R14
ADDQ frame_YFER(SP), R11
ORQ CX, DI
MOVQ R9, R15
RORXQ $34, AX, R12
XORQ R14, R13
XORQ R10, R15
RORXQ $14, DX, R14
ANDQ DX, R15
XORQ R14, R13
RORXQ $39, AX, R14
ADDQ R11, R8
ANDQ BX, DI
XORQ R12, R14
RORXQ $28, AX, R12
XORQ R10, R15
XORQ R12, R14
MOVQ AX, R12
ANDQ CX, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, R11
ADDQ R15, R8
ADDQ R15, R11
ADDQ DI, R11
VPSRLQ $8, Y1, Y2
VPSLLQ $(64-8), Y1, Y1
VPOR Y2, Y1, Y1
VPXOR Y8, Y3, Y3
VPXOR Y1, Y3, Y1
VPADDQ Y1, Y0, Y0
VPERM2F128 $0x0, Y0, Y0, Y6
MOVQ $MASK_YMM_LO<>(SB), R13
VPAND (R13), Y0, Y0
VPERM2F128 $0x11, Y5, Y5, Y2
VPSRLQ $6, Y2, Y8
MOVQ R11, DI
RORXQ $41, R8, R13
RORXQ $18, R8, R14
ADDQ 1*8+frame_YFER(SP), R10
ORQ BX, DI
MOVQ DX, R15
RORXQ $34, R11, R12
XORQ R14, R13
XORQ R9, R15
RORXQ $14, R8, R14
XORQ R14, R13
RORXQ $39, R11, R14
ANDQ R8, R15
ADDQ R10, CX
ANDQ AX, DI
XORQ R12, R14
RORXQ $28, R11, R12
XORQ R9, R15
XORQ R12, R14
MOVQ R11, R12
ANDQ BX, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, R10
ADDQ R15, CX
ADDQ R15, R10
ADDQ DI, R10
VPSRLQ $19, Y2, Y3
VPSLLQ $(64-19), Y2, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPSRLQ $61, Y2, Y3
VPSLLQ $(64-61), Y2, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPADDQ Y8, Y6, Y6
VPSRLQ $6, Y6, Y8
MOVQ R10, DI
RORXQ $41, CX, R13
ADDQ 2*8+frame_YFER(SP), R9
RORXQ $18, CX, R14
ORQ AX, DI
MOVQ R8, R15
XORQ DX, R15
RORXQ $34, R10, R12
XORQ R14, R13
ANDQ CX, R15
RORXQ $14, CX, R14
ADDQ R9, BX
ANDQ R11, DI
XORQ R14, R13
RORXQ $39, R10, R14
XORQ DX, R15
XORQ R12, R14
RORXQ $28, R10, R12
XORQ R12, R14
MOVQ R10, R12
ANDQ AX, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, R9
ADDQ R15, BX
ADDQ R15, R9
ADDQ DI, R9
VPSRLQ $19, Y6, Y3
VPSLLQ $(64-19), Y6, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPSRLQ $61, Y6, Y3
VPSLLQ $(64-61), Y6, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPADDQ Y8, Y0, Y2
VPBLENDD $0xF0, Y2, Y6, Y6
MOVQ R9, DI
RORXQ $41, BX, R13
RORXQ $18, BX, R14
ADDQ 3*8+frame_YFER(SP), DX
ORQ R11, DI
MOVQ CX, R15
RORXQ $34, R9, R12
XORQ R14, R13
XORQ R8, R15
RORXQ $14, BX, R14
ANDQ BX, R15
ADDQ DX, AX
ANDQ R10, DI
XORQ R14, R13
XORQ R8, R15
RORXQ $39, R9, R14
ADDQ R13, R15
XORQ R12, R14
ADDQ R15, AX
RORXQ $28, R9, R12
XORQ R12, R14
MOVQ R9, R12
ANDQ R11, R12
ORQ R12, DI
ADDQ R14, DX
ADDQ R15, DX
ADDQ DI, DX
VPADDQ 3*32(BP), Y7, Y0
VMOVDQU Y0, frame_YFER(SP)
ADDQ $(4*32), BP
MY_VPALIGNR(Y0, Y6, Y5, 8)
VPADDQ Y7, Y0, Y0
MY_VPALIGNR(Y1, Y4, Y7, 8)
VPSRLQ $1, Y1, Y2
VPSLLQ $(64-1), Y1, Y3
VPOR Y2, Y3, Y3
VPSRLQ $7, Y1, Y8
MOVQ DX, DI
RORXQ $41, AX, R13
RORXQ $18, AX, R14
ADDQ frame_YFER(SP), R8
ORQ R10, DI
MOVQ BX, R15
RORXQ $34, DX, R12
XORQ R14, R13
XORQ CX, R15
RORXQ $14, AX, R14
ANDQ AX, R15
XORQ R14, R13
RORXQ $39, DX, R14
ADDQ R8, R11
ANDQ R9, DI
XORQ R12, R14
RORXQ $28, DX, R12
XORQ CX, R15
XORQ R12, R14
MOVQ DX, R12
ANDQ R10, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, R8
ADDQ R15, R11
ADDQ R15, R8
ADDQ DI, R8
VPSRLQ $8, Y1, Y2
VPSLLQ $(64-8), Y1, Y1
VPOR Y2, Y1, Y1
VPXOR Y8, Y3, Y3
VPXOR Y1, Y3, Y1
VPADDQ Y1, Y0, Y0
VPERM2F128 $0x0, Y0, Y0, Y7
MOVQ $MASK_YMM_LO<>(SB), R13
VPAND (R13), Y0, Y0
VPERM2F128 $0x11, Y6, Y6, Y2
VPSRLQ $6, Y2, Y8
MOVQ R8, DI
RORXQ $41, R11, R13
RORXQ $18, R11, R14
ADDQ 1*8+frame_YFER(SP), CX
ORQ R9, DI
MOVQ AX, R15
RORXQ $34, R8, R12
XORQ R14, R13
XORQ BX, R15
RORXQ $14, R11, R14
XORQ R14, R13
RORXQ $39, R8, R14
ANDQ R11, R15
ADDQ CX, R10
ANDQ DX, DI
XORQ R12, R14
RORXQ $28, R8, R12
XORQ BX, R15
XORQ R12, R14
MOVQ R8, R12
ANDQ R9, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, CX
ADDQ R15, R10
ADDQ R15, CX
ADDQ DI, CX
VPSRLQ $19, Y2, Y3
VPSLLQ $(64-19), Y2, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPSRLQ $61, Y2, Y3
VPSLLQ $(64-61), Y2, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPADDQ Y8, Y7, Y7
VPSRLQ $6, Y7, Y8
MOVQ CX, DI
RORXQ $41, R10, R13
ADDQ 2*8+frame_YFER(SP), BX
RORXQ $18, R10, R14
ORQ DX, DI
MOVQ R11, R15
XORQ AX, R15
RORXQ $34, CX, R12
XORQ R14, R13
ANDQ R10, R15
RORXQ $14, R10, R14
ADDQ BX, R9
ANDQ R8, DI
XORQ R14, R13
RORXQ $39, CX, R14
XORQ AX, R15
XORQ R12, R14
RORXQ $28, CX, R12
XORQ R12, R14
MOVQ CX, R12
ANDQ DX, R12
ADDQ R13, R15
ORQ R12, DI
ADDQ R14, BX
ADDQ R15, R9
ADDQ R15, BX
ADDQ DI, BX
VPSRLQ $19, Y7, Y3
VPSLLQ $(64-19), Y7, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPSRLQ $61, Y7, Y3
VPSLLQ $(64-61), Y7, Y1
VPOR Y1, Y3, Y3
VPXOR Y3, Y8, Y8
VPADDQ Y8, Y0, Y2
VPBLENDD $0xF0, Y2, Y7, Y7
MOVQ BX, DI
RORXQ $41, R9, R13
RORXQ $18, R9, R14
ADDQ 3*8+frame_YFER(SP), AX
ORQ R8, DI
MOVQ R10, R15
RORXQ $34, BX, R12
XORQ R14, R13
XORQ R11, R15
RORXQ $14, R9, R14
ANDQ R9, R15
ADDQ AX, DX
ANDQ CX, DI
XORQ R14, R13
XORQ R11, R15
RORXQ $39, BX, R14
ADDQ R13, R15
XORQ R12, R14
ADDQ R15, DX
RORXQ $28, BX, R12
XORQ R12, R14
MOVQ BX, R12
ANDQ R8, R12
ORQ R12, DI
ADDQ R14, AX
ADDQ R15, AX
ADDQ DI, AX
SUBQ $1, frame_SRND(SP)
JNE loop1
MOVQ $2, frame_SRND(SP)
loop2:
VPADDQ (BP), Y4, Y0
VMOVDQU Y0, frame_YFER(SP)
MOVQ R9, R15
RORXQ $41, DX, R13
RORXQ $18, DX, R14
XORQ R10, R15
XORQ R14, R13
RORXQ $14, DX, R14
ANDQ DX, R15
XORQ R14, R13
RORXQ $34, AX, R12
XORQ R10, R15
RORXQ $39, AX, R14
MOVQ AX, DI
XORQ R12, R14
RORXQ $28, AX, R12
ADDQ frame_YFER(SP), R11
ORQ CX, DI
XORQ R12, R14
MOVQ AX, R12
ANDQ BX, DI
ANDQ CX, R12
ADDQ R13, R15
ADDQ R11, R8
ORQ R12, DI
ADDQ R14, R11
ADDQ R15, R8
ADDQ R15, R11
MOVQ DX, R15
RORXQ $41, R8, R13
RORXQ $18, R8, R14
XORQ R9, R15
XORQ R14, R13
RORXQ $14, R8, R14
ANDQ R8, R15
ADDQ DI, R11
XORQ R14, R13
RORXQ $34, R11, R12
XORQ R9, R15
RORXQ $39, R11, R14
MOVQ R11, DI
XORQ R12, R14
RORXQ $28, R11, R12
ADDQ 8*1+frame_YFER(SP), R10
ORQ BX, DI
XORQ R12, R14
MOVQ R11, R12
ANDQ AX, DI
ANDQ BX, R12
ADDQ R13, R15
ADDQ R10, CX
ORQ R12, DI
ADDQ R14, R10
ADDQ R15, CX
ADDQ R15, R10
MOVQ R8, R15
RORXQ $41, CX, R13
RORXQ $18, CX, R14
XORQ DX, R15
XORQ R14, R13
RORXQ $14, CX, R14
ANDQ CX, R15
ADDQ DI, R10
XORQ R14, R13
RORXQ $34, R10, R12
XORQ DX, R15
RORXQ $39, R10, R14
MOVQ R10, DI
XORQ R12, R14
RORXQ $28, R10, R12
ADDQ 8*2+frame_YFER(SP), R9
ORQ AX, DI
XORQ R12, R14
MOVQ R10, R12
ANDQ R11, DI
ANDQ AX, R12
ADDQ R13, R15
ADDQ R9, BX
ORQ R12, DI
ADDQ R14, R9
ADDQ R15, BX
ADDQ R15, R9
MOVQ CX, R15
RORXQ $41, BX, R13
RORXQ $18, BX, R14
XORQ R8, R15
XORQ R14, R13
RORXQ $14, BX, R14
ANDQ BX, R15
ADDQ DI, R9
XORQ R14, R13
RORXQ $34, R9, R12
XORQ R8, R15
RORXQ $39, R9, R14
MOVQ R9, DI
XORQ R12, R14
RORXQ $28, R9, R12
ADDQ 8*3+frame_YFER(SP), DX
ORQ R11, DI
XORQ R12, R14
MOVQ R9, R12
ANDQ R10, DI
ANDQ R11, R12
ADDQ R13, R15
ADDQ DX, AX
ORQ R12, DI
ADDQ R14, DX
ADDQ R15, AX
ADDQ R15, DX
ADDQ DI, DX
VPADDQ 1*32(BP), Y5, Y0
VMOVDQU Y0, frame_YFER(SP)
ADDQ $(2*32), BP
MOVQ BX, R15
RORXQ $41, AX, R13
RORXQ $18, AX, R14
XORQ CX, R15
XORQ R14, R13
RORXQ $14, AX, R14
ANDQ AX, R15
XORQ R14, R13
RORXQ $34, DX, R12
XORQ CX, R15
RORXQ $39, DX, R14
MOVQ DX, DI
XORQ R12, R14
RORXQ $28, DX, R12
ADDQ frame_YFER(SP), R8
ORQ R10, DI
XORQ R12, R14
MOVQ DX, R12
ANDQ R9, DI
ANDQ R10, R12
ADDQ R13, R15
ADDQ R8, R11
ORQ R12, DI
ADDQ R14, R8
ADDQ R15, R11
ADDQ R15, R8
MOVQ AX, R15
RORXQ $41, R11, R13
RORXQ $18, R11, R14
XORQ BX, R15
XORQ R14, R13
RORXQ $14, R11, R14
ANDQ R11, R15
ADDQ DI, R8
XORQ R14, R13
RORXQ $34, R8, R12
XORQ BX, R15
RORXQ $39, R8, R14
MOVQ R8, DI
XORQ R12, R14
RORXQ $28, R8, R12
ADDQ 8*1+frame_YFER(SP), CX
ORQ R9, DI
XORQ R12, R14
MOVQ R8, R12
ANDQ DX, DI
ANDQ R9, R12
ADDQ R13, R15
ADDQ CX, R10
ORQ R12, DI
ADDQ R14, CX
ADDQ R15, R10
ADDQ R15, CX
MOVQ R11, R15
RORXQ $41, R10, R13
RORXQ $18, R10, R14
XORQ AX, R15
XORQ R14, R13
RORXQ $14, R10, R14
ANDQ R10, R15
ADDQ DI, CX
XORQ R14, R13
RORXQ $34, CX, R12
XORQ AX, R15
RORXQ $39, CX, R14
MOVQ CX, DI
XORQ R12, R14
RORXQ $28, CX, R12
ADDQ 8*2+frame_YFER(SP), BX
ORQ DX, DI
XORQ R12, R14
MOVQ CX, R12
ANDQ R8, DI
ANDQ DX, R12
ADDQ R13, R15
ADDQ BX, R9
ORQ R12, DI
ADDQ R14, BX
ADDQ R15, R9
ADDQ R15, BX
MOVQ R10, R15
RORXQ $41, R9, R13
RORXQ $18, R9, R14
XORQ R11, R15
XORQ R14, R13
RORXQ $14, R9, R14
ANDQ R9, R15
ADDQ DI, BX
XORQ R14, R13
RORXQ $34, BX, R12
XORQ R11, R15
RORXQ $39, BX, R14
MOVQ BX, DI
XORQ R12, R14
RORXQ $28, BX, R12
ADDQ 8*3+frame_YFER(SP), AX
ORQ R8, DI
XORQ R12, R14
MOVQ BX, R12
ANDQ CX, DI
ANDQ R8, R12
ADDQ R13, R15
ADDQ AX, DX
ORQ R12, DI
ADDQ R14, AX
ADDQ R15, DX
ADDQ R15, AX
ADDQ DI, AX
VMOVDQU Y6, Y4
VMOVDQU Y7, Y5
SUBQ $1, frame_SRND(SP)
JNE loop2
addm(8*0(SI),AX)
addm(8*1(SI),BX)
addm(8*2(SI),CX)
addm(8*3(SI),R8)
addm(8*4(SI),DX)
addm(8*5(SI),R9)
addm(8*6(SI),R10)
addm(8*7(SI),R11)
MOVQ frame_INP(SP), DI
ADDQ $128, DI
CMPQ DI, frame_INPEND(SP)
JNE loop0
done_hash:
VZEROUPPER
RET