| // Copyright 2017 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" | 
 |  | 
 | #define HASHUPDATECHOOSE \ | 
 | 	SHA1C	V16.S4, V1, V2 \ | 
 | 	SHA1H	V3, V1 \ | 
 | 	VMOV	V2.B16, V3.B16 | 
 |  | 
 | #define HASHUPDATEPARITY \ | 
 | 	SHA1P	V16.S4, V1, V2 \ | 
 | 	SHA1H	V3, V1 \ | 
 | 	VMOV	V2.B16, V3.B16 | 
 |  | 
 | #define HASHUPDATEMAJ \ | 
 | 	SHA1M	V16.S4, V1, V2 \ | 
 | 	SHA1H	V3, V1 \ | 
 | 	VMOV	V2.B16, V3.B16 | 
 |  | 
 | // func sha1block(h []uint32, p []byte, k []uint32) | 
 | TEXT ·sha1block(SB),NOSPLIT,$0 | 
 | 	MOVD	h_base+0(FP), R0                             // hash value first address | 
 | 	MOVD	p_base+24(FP), R1                            // message first address | 
 | 	MOVD	k_base+48(FP), R2                            // k constants first address | 
 | 	MOVD	p_len+32(FP), R3                             // message length | 
 | 	VLD1.P	16(R0), [V0.S4] | 
 | 	FMOVS	(R0), F20 | 
 | 	SUB	$16, R0, R0 | 
 |  | 
 | blockloop: | 
 |  | 
 | 	VLD1.P	16(R1), [V4.B16]                             // load message | 
 | 	VLD1.P	16(R1), [V5.B16] | 
 | 	VLD1.P	16(R1), [V6.B16] | 
 | 	VLD1.P	16(R1), [V7.B16] | 
 | 	VLD1	(R2), [V19.S4]                               // load constant k0-k79 | 
 | 	VMOV	V0.B16, V2.B16 | 
 | 	VMOV	V20.S[0], V1 | 
 | 	VMOV	V2.B16, V3.B16 | 
 | 	VDUP	V19.S[0], V17.S4 | 
 | 	VREV32	V4.B16, V4.B16                               // prepare for using message in Byte format | 
 | 	VREV32	V5.B16, V5.B16 | 
 | 	VREV32	V6.B16, V6.B16 | 
 | 	VREV32	V7.B16, V7.B16 | 
 |  | 
 |  | 
 | 	VDUP	V19.S[1], V18.S4 | 
 | 	VADD	V17.S4, V4.S4, V16.S4 | 
 | 	SHA1SU0	V6.S4, V5.S4, V4.S4 | 
 | 	HASHUPDATECHOOSE | 
 | 	SHA1SU1	V7.S4, V4.S4 | 
 |  | 
 | 	VADD	V17.S4, V5.S4, V16.S4 | 
 | 	SHA1SU0	V7.S4, V6.S4, V5.S4 | 
 | 	HASHUPDATECHOOSE | 
 | 	SHA1SU1	V4.S4, V5.S4 | 
 | 	VADD	V17.S4, V6.S4, V16.S4 | 
 | 	SHA1SU0	V4.S4, V7.S4, V6.S4 | 
 | 	HASHUPDATECHOOSE | 
 | 	SHA1SU1	V5.S4, V6.S4 | 
 |  | 
 | 	VADD	V17.S4, V7.S4, V16.S4 | 
 | 	SHA1SU0	V5.S4, V4.S4, V7.S4 | 
 | 	HASHUPDATECHOOSE | 
 | 	SHA1SU1	V6.S4, V7.S4 | 
 |  | 
 | 	VADD	V17.S4, V4.S4, V16.S4 | 
 | 	SHA1SU0	V6.S4, V5.S4, V4.S4 | 
 | 	HASHUPDATECHOOSE | 
 | 	SHA1SU1	V7.S4, V4.S4 | 
 |  | 
 | 	VDUP	V19.S[2], V17.S4 | 
 | 	VADD	V18.S4, V5.S4, V16.S4 | 
 | 	SHA1SU0	V7.S4, V6.S4, V5.S4 | 
 | 	HASHUPDATEPARITY | 
 | 	SHA1SU1	V4.S4, V5.S4 | 
 |  | 
 | 	VADD	V18.S4, V6.S4, V16.S4 | 
 | 	SHA1SU0	V4.S4, V7.S4, V6.S4 | 
 | 	HASHUPDATEPARITY | 
 | 	SHA1SU1	V5.S4, V6.S4 | 
 |  | 
 | 	VADD	V18.S4, V7.S4, V16.S4 | 
 | 	SHA1SU0	V5.S4, V4.S4, V7.S4 | 
 | 	HASHUPDATEPARITY | 
 | 	SHA1SU1	V6.S4, V7.S4 | 
 |  | 
 | 	VADD	V18.S4, V4.S4, V16.S4 | 
 | 	SHA1SU0	V6.S4, V5.S4, V4.S4 | 
 | 	HASHUPDATEPARITY | 
 | 	SHA1SU1	V7.S4, V4.S4 | 
 |  | 
 | 	VADD	V18.S4, V5.S4, V16.S4 | 
 | 	SHA1SU0	V7.S4, V6.S4, V5.S4 | 
 | 	HASHUPDATEPARITY | 
 | 	SHA1SU1	V4.S4, V5.S4 | 
 |  | 
 | 	VDUP	V19.S[3], V18.S4 | 
 | 	VADD	V17.S4, V6.S4, V16.S4 | 
 | 	SHA1SU0	V4.S4, V7.S4, V6.S4 | 
 | 	HASHUPDATEMAJ | 
 | 	SHA1SU1	V5.S4, V6.S4 | 
 |  | 
 | 	VADD	V17.S4, V7.S4, V16.S4 | 
 | 	SHA1SU0	V5.S4, V4.S4, V7.S4 | 
 | 	HASHUPDATEMAJ | 
 | 	SHA1SU1	V6.S4, V7.S4 | 
 |  | 
 | 	VADD	V17.S4, V4.S4, V16.S4 | 
 | 	SHA1SU0	V6.S4, V5.S4, V4.S4 | 
 | 	HASHUPDATEMAJ | 
 | 	SHA1SU1	V7.S4, V4.S4 | 
 |  | 
 | 	VADD	V17.S4, V5.S4, V16.S4 | 
 | 	SHA1SU0	V7.S4, V6.S4, V5.S4 | 
 | 	HASHUPDATEMAJ | 
 | 	SHA1SU1	V4.S4, V5.S4 | 
 |  | 
 | 	VADD	V17.S4, V6.S4, V16.S4 | 
 | 	SHA1SU0	V4.S4, V7.S4, V6.S4 | 
 | 	HASHUPDATEMAJ | 
 | 	SHA1SU1	V5.S4, V6.S4 | 
 |  | 
 | 	VADD	V18.S4, V7.S4, V16.S4 | 
 | 	SHA1SU0	V5.S4, V4.S4, V7.S4 | 
 | 	HASHUPDATEPARITY | 
 | 	SHA1SU1	V6.S4, V7.S4 | 
 |  | 
 | 	VADD	V18.S4, V4.S4, V16.S4 | 
 | 	HASHUPDATEPARITY | 
 |  | 
 | 	VADD	V18.S4, V5.S4, V16.S4 | 
 | 	HASHUPDATEPARITY | 
 |  | 
 | 	VADD	V18.S4, V6.S4, V16.S4 | 
 | 	HASHUPDATEPARITY | 
 |  | 
 | 	VADD	V18.S4, V7.S4, V16.S4 | 
 | 	HASHUPDATEPARITY | 
 |  | 
 | 	SUB	$64, R3, R3                                  // message length - 64bytes, then compare with 64bytes | 
 | 	VADD	V2.S4, V0.S4, V0.S4 | 
 | 	VADD	V1.S4, V20.S4, V20.S4 | 
 | 	CBNZ	R3, blockloop | 
 |  | 
 | sha1ret: | 
 |  | 
 | 	VST1.P	[V0.S4], 16(R0)                               // store hash value H(dcba) | 
 | 	FMOVS	F20, (R0)                                     // store hash value H(e) | 
 | 	RET |