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