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