sha1block_arm64.s raw

   1  // Copyright 2017 The Go Authors. All rights reserved.
   2  // Use of this source code is governed by a BSD-style
   3  // license that can be found in the LICENSE file.
   4  
   5  //go:build !purego
   6  
   7  #include "textflag.h"
   8  
   9  #define HASHUPDATECHOOSE \
  10  	SHA1C	V16.S4, V1, V2 \
  11  	SHA1H	V3, V1 \
  12  	VMOV	V2.B16, V3.B16
  13  
  14  #define HASHUPDATEPARITY \
  15  	SHA1P	V16.S4, V1, V2 \
  16  	SHA1H	V3, V1 \
  17  	VMOV	V2.B16, V3.B16
  18  
  19  #define HASHUPDATEMAJ \
  20  	SHA1M	V16.S4, V1, V2 \
  21  	SHA1H	V3, V1 \
  22  	VMOV	V2.B16, V3.B16
  23  
  24  // func sha1block(h []uint32, p []byte, k []uint32)
  25  TEXT ·sha1block(SB),NOSPLIT,$0
  26  	MOVD	h_base+0(FP), R0                             // hash value first address
  27  	MOVD	p_base+24(FP), R1                            // message first address
  28  	MOVD	k_base+48(FP), R2                            // k constants first address
  29  	MOVD	p_len+32(FP), R3                             // message length
  30  	VLD1.P	16(R0), [V0.S4]
  31  	FMOVS	(R0), F20
  32  	SUB	$16, R0, R0
  33  
  34  blockloop:
  35  
  36  	VLD1.P	16(R1), [V4.B16]                             // load message
  37  	VLD1.P	16(R1), [V5.B16]
  38  	VLD1.P	16(R1), [V6.B16]
  39  	VLD1.P	16(R1), [V7.B16]
  40  	VLD1	(R2), [V19.S4]                               // load constant k0-k79
  41  	VMOV	V0.B16, V2.B16
  42  	VMOV	V20.S[0], V1
  43  	VMOV	V2.B16, V3.B16
  44  	VDUP	V19.S[0], V17.S4
  45  	VREV32	V4.B16, V4.B16                               // prepare for using message in Byte format
  46  	VREV32	V5.B16, V5.B16
  47  	VREV32	V6.B16, V6.B16
  48  	VREV32	V7.B16, V7.B16
  49  
  50  
  51  	VDUP	V19.S[1], V18.S4
  52  	VADD	V17.S4, V4.S4, V16.S4
  53  	SHA1SU0	V6.S4, V5.S4, V4.S4
  54  	HASHUPDATECHOOSE
  55  	SHA1SU1	V7.S4, V4.S4
  56  
  57  	VADD	V17.S4, V5.S4, V16.S4
  58  	SHA1SU0	V7.S4, V6.S4, V5.S4
  59  	HASHUPDATECHOOSE
  60  	SHA1SU1	V4.S4, V5.S4
  61  	VADD	V17.S4, V6.S4, V16.S4
  62  	SHA1SU0	V4.S4, V7.S4, V6.S4
  63  	HASHUPDATECHOOSE
  64  	SHA1SU1	V5.S4, V6.S4
  65  
  66  	VADD	V17.S4, V7.S4, V16.S4
  67  	SHA1SU0	V5.S4, V4.S4, V7.S4
  68  	HASHUPDATECHOOSE
  69  	SHA1SU1	V6.S4, V7.S4
  70  
  71  	VADD	V17.S4, V4.S4, V16.S4
  72  	SHA1SU0	V6.S4, V5.S4, V4.S4
  73  	HASHUPDATECHOOSE
  74  	SHA1SU1	V7.S4, V4.S4
  75  
  76  	VDUP	V19.S[2], V17.S4
  77  	VADD	V18.S4, V5.S4, V16.S4
  78  	SHA1SU0	V7.S4, V6.S4, V5.S4
  79  	HASHUPDATEPARITY
  80  	SHA1SU1	V4.S4, V5.S4
  81  
  82  	VADD	V18.S4, V6.S4, V16.S4
  83  	SHA1SU0	V4.S4, V7.S4, V6.S4
  84  	HASHUPDATEPARITY
  85  	SHA1SU1	V5.S4, V6.S4
  86  
  87  	VADD	V18.S4, V7.S4, V16.S4
  88  	SHA1SU0	V5.S4, V4.S4, V7.S4
  89  	HASHUPDATEPARITY
  90  	SHA1SU1	V6.S4, V7.S4
  91  
  92  	VADD	V18.S4, V4.S4, V16.S4
  93  	SHA1SU0	V6.S4, V5.S4, V4.S4
  94  	HASHUPDATEPARITY
  95  	SHA1SU1	V7.S4, V4.S4
  96  
  97  	VADD	V18.S4, V5.S4, V16.S4
  98  	SHA1SU0	V7.S4, V6.S4, V5.S4
  99  	HASHUPDATEPARITY
 100  	SHA1SU1	V4.S4, V5.S4
 101  
 102  	VDUP	V19.S[3], V18.S4
 103  	VADD	V17.S4, V6.S4, V16.S4
 104  	SHA1SU0	V4.S4, V7.S4, V6.S4
 105  	HASHUPDATEMAJ
 106  	SHA1SU1	V5.S4, V6.S4
 107  
 108  	VADD	V17.S4, V7.S4, V16.S4
 109  	SHA1SU0	V5.S4, V4.S4, V7.S4
 110  	HASHUPDATEMAJ
 111  	SHA1SU1	V6.S4, V7.S4
 112  
 113  	VADD	V17.S4, V4.S4, V16.S4
 114  	SHA1SU0	V6.S4, V5.S4, V4.S4
 115  	HASHUPDATEMAJ
 116  	SHA1SU1	V7.S4, V4.S4
 117  
 118  	VADD	V17.S4, V5.S4, V16.S4
 119  	SHA1SU0	V7.S4, V6.S4, V5.S4
 120  	HASHUPDATEMAJ
 121  	SHA1SU1	V4.S4, V5.S4
 122  
 123  	VADD	V17.S4, V6.S4, V16.S4
 124  	SHA1SU0	V4.S4, V7.S4, V6.S4
 125  	HASHUPDATEMAJ
 126  	SHA1SU1	V5.S4, V6.S4
 127  
 128  	VADD	V18.S4, V7.S4, V16.S4
 129  	SHA1SU0	V5.S4, V4.S4, V7.S4
 130  	HASHUPDATEPARITY
 131  	SHA1SU1	V6.S4, V7.S4
 132  
 133  	VADD	V18.S4, V4.S4, V16.S4
 134  	HASHUPDATEPARITY
 135  
 136  	VADD	V18.S4, V5.S4, V16.S4
 137  	HASHUPDATEPARITY
 138  
 139  	VADD	V18.S4, V6.S4, V16.S4
 140  	HASHUPDATEPARITY
 141  
 142  	VADD	V18.S4, V7.S4, V16.S4
 143  	HASHUPDATEPARITY
 144  
 145  	SUB	$64, R3, R3                                  // message length - 64bytes, then compare with 64bytes
 146  	VADD	V2.S4, V0.S4, V0.S4
 147  	VADD	V1.S4, V20.S4, V20.S4
 148  	CBNZ	R3, blockloop
 149  
 150  sha1ret:
 151  
 152  	VST1.P	[V0.S4], 16(R0)                               // store hash value H(dcba)
 153  	FMOVS	F20, (R0)                                     // store hash value H(e)
 154  	RET
 155