Text file src/internal/runtime/maps/memhash_arm64.s

     1  // Copyright 2026 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  #include "textflag.h"
     6  
     7  // func memHash32AES(k uint32, h uintptr) uintptr
     8  TEXT ·memHash32AES<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
     9  	MOVD	$·aeskeysched+0(SB), R3
    10  
    11  	VEOR	V0.B16, V0.B16, V0.B16
    12  	VLD1	(R3), [V2.B16]
    13  	VMOV	R0, V0.S[2]
    14  	VMOV	R1, V0.D[0]
    15  
    16  	AESE	V2.B16, V0.B16
    17  	AESMC	V0.B16, V0.B16
    18  	AESE	V2.B16, V0.B16
    19  	AESMC	V0.B16, V0.B16
    20  	AESE	V2.B16, V0.B16
    21  
    22  	VMOV	V0.D[0], R0
    23  	RET
    24  
    25  // func memHash64AES(k uint64, h uintptr) uintptr
    26  TEXT ·memHash64AES<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
    27  	MOVD	$·aeskeysched+0(SB), R3
    28  
    29  	VEOR	V0.B16, V0.B16, V0.B16
    30  	VLD1	(R3), [V2.B16]
    31  	VMOV	R0, V0.D[1]
    32  	VMOV	R1, V0.D[0]
    33  
    34  	AESE	V2.B16, V0.B16
    35  	AESMC	V0.B16, V0.B16
    36  	AESE	V2.B16, V0.B16
    37  	AESMC	V0.B16, V0.B16
    38  	AESE	V2.B16, V0.B16
    39  
    40  	VMOV	V0.D[0], R0
    41  	RET
    42  
    43  // func memHashAES(p unsafe.Pointer, h, size uintptr) uintptr
    44  TEXT ·memHashAES<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-32
    45  	// R0: data
    46  	// R1: seed data
    47  	// R2: length
    48  	// At return, R0 = return value
    49  	VEOR	V30.B16, V30.B16, V30.B16
    50  	VMOV	R1, V30.D[0]
    51  	VMOV	R2, V30.D[1] // load length into seed
    52  
    53  	MOVD	$·aeskeysched+0(SB), R4
    54  	VLD1.P	16(R4), [V0.B16]
    55  	AESE	V30.B16, V0.B16
    56  	AESMC	V0.B16, V0.B16
    57  	CMP	$16, R2
    58  	BLO	aes0to15
    59  	BEQ	aes16
    60  	CMP	$32, R2
    61  	BLS	aes17to32
    62  	CMP	$64, R2
    63  	BLS	aes33to64
    64  	CMP	$128, R2
    65  	BLS	aes65to128
    66  	B	aes129plus
    67  
    68  aes0to15:
    69  	CBZ	R2, aes0
    70  	VEOR	V2.B16, V2.B16, V2.B16
    71  	TBZ	$3, R2, less_than_8
    72  	VLD1.P	8(R0), V2.D[0]
    73  
    74  less_than_8:
    75  	TBZ	$2, R2, less_than_4
    76  	VLD1.P	4(R0), V2.S[2]
    77  
    78  less_than_4:
    79  	TBZ	$1, R2, less_than_2
    80  	VLD1.P	2(R0), V2.H[6]
    81  
    82  less_than_2:
    83  	TBZ	$0, R2, done
    84  	VLD1	(R0), V2.B[14]
    85  done:
    86  	AESE	V0.B16, V2.B16
    87  	AESMC	V2.B16, V2.B16
    88  	AESE	V0.B16, V2.B16
    89  	AESMC	V2.B16, V2.B16
    90  	AESE	V0.B16, V2.B16
    91  	AESMC	V2.B16, V2.B16
    92  
    93  	VMOV	V2.D[0], R0
    94  	RET
    95  
    96  aes0:
    97  	VMOV	V0.D[0], R0
    98  	RET
    99  
   100  aes16:
   101  	VLD1	(R0), [V2.B16]
   102  	B	done
   103  
   104  aes17to32:
   105  	// make second seed
   106  	VLD1	(R4), [V1.B16]
   107  	AESE	V30.B16, V1.B16
   108  	AESMC	V1.B16, V1.B16
   109  	SUB	$16, R2, R10
   110  	VLD1.P	(R0)(R10), [V2.B16]
   111  	VLD1	(R0), [V3.B16]
   112  
   113  	AESE	V0.B16, V2.B16
   114  	AESMC	V2.B16, V2.B16
   115  	AESE	V1.B16, V3.B16
   116  	AESMC	V3.B16, V3.B16
   117  
   118  	AESE	V0.B16, V2.B16
   119  	AESMC	V2.B16, V2.B16
   120  	AESE	V1.B16, V3.B16
   121  	AESMC	V3.B16, V3.B16
   122  
   123  	AESE	V0.B16, V2.B16
   124  	AESE	V1.B16, V3.B16
   125  
   126  	VEOR	V3.B16, V2.B16, V2.B16
   127  
   128  	VMOV	V2.D[0], R0
   129  	RET
   130  
   131  aes33to64:
   132  	VLD1	(R4), [V1.B16, V2.B16, V3.B16]
   133  	AESE	V30.B16, V1.B16
   134  	AESMC	V1.B16, V1.B16
   135  	AESE	V30.B16, V2.B16
   136  	AESMC	V2.B16, V2.B16
   137  	AESE	V30.B16, V3.B16
   138  	AESMC	V3.B16, V3.B16
   139  	SUB	$32, R2, R10
   140  
   141  	VLD1.P	(R0)(R10), [V4.B16, V5.B16]
   142  	VLD1	(R0), [V6.B16, V7.B16]
   143  
   144  	AESE	V0.B16, V4.B16
   145  	AESMC	V4.B16, V4.B16
   146  	AESE	V1.B16, V5.B16
   147  	AESMC	V5.B16, V5.B16
   148  	AESE	V2.B16, V6.B16
   149  	AESMC	V6.B16, V6.B16
   150  	AESE	V3.B16, V7.B16
   151  	AESMC	V7.B16, V7.B16
   152  
   153  	AESE	V0.B16, V4.B16
   154  	AESMC	V4.B16, V4.B16
   155  	AESE	V1.B16, V5.B16
   156  	AESMC	V5.B16, V5.B16
   157  	AESE	V2.B16, V6.B16
   158  	AESMC	V6.B16, V6.B16
   159  	AESE	V3.B16, V7.B16
   160  	AESMC	V7.B16, V7.B16
   161  
   162  	AESE	V0.B16, V4.B16
   163  	AESE	V1.B16, V5.B16
   164  	AESE	V2.B16, V6.B16
   165  	AESE	V3.B16, V7.B16
   166  
   167  	VEOR	V6.B16, V4.B16, V4.B16
   168  	VEOR	V7.B16, V5.B16, V5.B16
   169  	VEOR	V5.B16, V4.B16, V4.B16
   170  
   171  	VMOV	V4.D[0], R0
   172  	RET
   173  
   174  aes65to128:
   175  	VLD1.P	64(R4), [V1.B16, V2.B16, V3.B16, V4.B16]
   176  	VLD1	(R4), [V5.B16, V6.B16, V7.B16]
   177  	AESE	V30.B16, V1.B16
   178  	AESMC	V1.B16, V1.B16
   179  	AESE	V30.B16, V2.B16
   180  	AESMC	V2.B16, V2.B16
   181  	AESE	V30.B16, V3.B16
   182  	AESMC	V3.B16, V3.B16
   183  	AESE	V30.B16, V4.B16
   184  	AESMC	V4.B16, V4.B16
   185  	AESE	V30.B16, V5.B16
   186  	AESMC	V5.B16, V5.B16
   187  	AESE	V30.B16, V6.B16
   188  	AESMC	V6.B16, V6.B16
   189  	AESE	V30.B16, V7.B16
   190  	AESMC	V7.B16, V7.B16
   191  
   192  	SUB	$64, R2, R10
   193  	VLD1.P	(R0)(R10), [V8.B16, V9.B16, V10.B16, V11.B16]
   194  	VLD1	(R0), [V12.B16, V13.B16, V14.B16, V15.B16]
   195  	AESE	V0.B16,	 V8.B16
   196  	AESMC	V8.B16,  V8.B16
   197  	AESE	V1.B16,	 V9.B16
   198  	AESMC	V9.B16,  V9.B16
   199  	AESE	V2.B16, V10.B16
   200  	AESMC	V10.B16,  V10.B16
   201  	AESE	V3.B16, V11.B16
   202  	AESMC	V11.B16,  V11.B16
   203  	AESE	V4.B16, V12.B16
   204  	AESMC	V12.B16,  V12.B16
   205  	AESE	V5.B16, V13.B16
   206  	AESMC	V13.B16,  V13.B16
   207  	AESE	V6.B16, V14.B16
   208  	AESMC	V14.B16,  V14.B16
   209  	AESE	V7.B16, V15.B16
   210  	AESMC	V15.B16,  V15.B16
   211  
   212  	AESE	V0.B16,	 V8.B16
   213  	AESMC	V8.B16,  V8.B16
   214  	AESE	V1.B16,	 V9.B16
   215  	AESMC	V9.B16,  V9.B16
   216  	AESE	V2.B16, V10.B16
   217  	AESMC	V10.B16,  V10.B16
   218  	AESE	V3.B16, V11.B16
   219  	AESMC	V11.B16,  V11.B16
   220  	AESE	V4.B16, V12.B16
   221  	AESMC	V12.B16,  V12.B16
   222  	AESE	V5.B16, V13.B16
   223  	AESMC	V13.B16,  V13.B16
   224  	AESE	V6.B16, V14.B16
   225  	AESMC	V14.B16,  V14.B16
   226  	AESE	V7.B16, V15.B16
   227  	AESMC	V15.B16,  V15.B16
   228  
   229  	AESE	V0.B16,	 V8.B16
   230  	AESE	V1.B16,	 V9.B16
   231  	AESE	V2.B16, V10.B16
   232  	AESE	V3.B16, V11.B16
   233  	AESE	V4.B16, V12.B16
   234  	AESE	V5.B16, V13.B16
   235  	AESE	V6.B16, V14.B16
   236  	AESE	V7.B16, V15.B16
   237  
   238  	VEOR	V12.B16, V8.B16, V8.B16
   239  	VEOR	V13.B16, V9.B16, V9.B16
   240  	VEOR	V14.B16, V10.B16, V10.B16
   241  	VEOR	V15.B16, V11.B16, V11.B16
   242  	VEOR	V10.B16, V8.B16, V8.B16
   243  	VEOR	V11.B16, V9.B16, V9.B16
   244  	VEOR	V9.B16, V8.B16, V8.B16
   245  
   246  	VMOV	V8.D[0], R0
   247  	RET
   248  
   249  aes129plus:
   250  	PRFM (R0), PLDL1KEEP
   251  	VLD1.P	64(R4), [V1.B16, V2.B16, V3.B16, V4.B16]
   252  	VLD1	(R4), [V5.B16, V6.B16, V7.B16]
   253  	AESE	V30.B16, V1.B16
   254  	AESMC	V1.B16, V1.B16
   255  	AESE	V30.B16, V2.B16
   256  	AESMC	V2.B16, V2.B16
   257  	AESE	V30.B16, V3.B16
   258  	AESMC	V3.B16, V3.B16
   259  	AESE	V30.B16, V4.B16
   260  	AESMC	V4.B16, V4.B16
   261  	AESE	V30.B16, V5.B16
   262  	AESMC	V5.B16, V5.B16
   263  	AESE	V30.B16, V6.B16
   264  	AESMC	V6.B16, V6.B16
   265  	AESE	V30.B16, V7.B16
   266  	AESMC	V7.B16, V7.B16
   267  	ADD	R0, R2, R10
   268  	SUB	$128, R10, R10
   269  	VLD1.P	64(R10), [V8.B16, V9.B16, V10.B16, V11.B16]
   270  	VLD1	(R10), [V12.B16, V13.B16, V14.B16, V15.B16]
   271  	SUB	$1, R2, R2
   272  	LSR	$7, R2, R2
   273  
   274  aesloop:
   275  	AESE	V8.B16,	 V0.B16
   276  	AESMC	V0.B16,  V0.B16
   277  	AESE	V9.B16,	 V1.B16
   278  	AESMC	V1.B16,  V1.B16
   279  	AESE	V10.B16, V2.B16
   280  	AESMC	V2.B16,  V2.B16
   281  	AESE	V11.B16, V3.B16
   282  	AESMC	V3.B16,  V3.B16
   283  	AESE	V12.B16, V4.B16
   284  	AESMC	V4.B16,  V4.B16
   285  	AESE	V13.B16, V5.B16
   286  	AESMC	V5.B16,  V5.B16
   287  	AESE	V14.B16, V6.B16
   288  	AESMC	V6.B16,  V6.B16
   289  	AESE	V15.B16, V7.B16
   290  	AESMC	V7.B16,  V7.B16
   291  
   292  	VLD1.P	64(R0), [V8.B16, V9.B16, V10.B16, V11.B16]
   293  	AESE	V8.B16,	 V0.B16
   294  	AESMC	V0.B16,  V0.B16
   295  	AESE	V9.B16,	 V1.B16
   296  	AESMC	V1.B16,  V1.B16
   297  	AESE	V10.B16, V2.B16
   298  	AESMC	V2.B16,  V2.B16
   299  	AESE	V11.B16, V3.B16
   300  	AESMC	V3.B16,  V3.B16
   301  
   302  	VLD1.P	64(R0), [V12.B16, V13.B16, V14.B16, V15.B16]
   303  	AESE	V12.B16, V4.B16
   304  	AESMC	V4.B16,  V4.B16
   305  	AESE	V13.B16, V5.B16
   306  	AESMC	V5.B16,  V5.B16
   307  	AESE	V14.B16, V6.B16
   308  	AESMC	V6.B16,  V6.B16
   309  	AESE	V15.B16, V7.B16
   310  	AESMC	V7.B16,  V7.B16
   311  	SUB	$1, R2, R2
   312  	CBNZ	R2, aesloop
   313  
   314  	AESE	V8.B16,	 V0.B16
   315  	AESMC	V0.B16,  V0.B16
   316  	AESE	V9.B16,	 V1.B16
   317  	AESMC	V1.B16,  V1.B16
   318  	AESE	V10.B16, V2.B16
   319  	AESMC	V2.B16,  V2.B16
   320  	AESE	V11.B16, V3.B16
   321  	AESMC	V3.B16,  V3.B16
   322  	AESE	V12.B16, V4.B16
   323  	AESMC	V4.B16,  V4.B16
   324  	AESE	V13.B16, V5.B16
   325  	AESMC	V5.B16,  V5.B16
   326  	AESE	V14.B16, V6.B16
   327  	AESMC	V6.B16,  V6.B16
   328  	AESE	V15.B16, V7.B16
   329  	AESMC	V7.B16,  V7.B16
   330  
   331  	AESE	V8.B16,	 V0.B16
   332  	AESMC	V0.B16,  V0.B16
   333  	AESE	V9.B16,	 V1.B16
   334  	AESMC	V1.B16,  V1.B16
   335  	AESE	V10.B16, V2.B16
   336  	AESMC	V2.B16,  V2.B16
   337  	AESE	V11.B16, V3.B16
   338  	AESMC	V3.B16,  V3.B16
   339  	AESE	V12.B16, V4.B16
   340  	AESMC	V4.B16,  V4.B16
   341  	AESE	V13.B16, V5.B16
   342  	AESMC	V5.B16,  V5.B16
   343  	AESE	V14.B16, V6.B16
   344  	AESMC	V6.B16,  V6.B16
   345  	AESE	V15.B16, V7.B16
   346  	AESMC	V7.B16,  V7.B16
   347  
   348  	AESE	V8.B16,	 V0.B16
   349  	AESE	V9.B16,	 V1.B16
   350  	AESE	V10.B16, V2.B16
   351  	AESE	V11.B16, V3.B16
   352  	AESE	V12.B16, V4.B16
   353  	AESE	V13.B16, V5.B16
   354  	AESE	V14.B16, V6.B16
   355  	AESE	V15.B16, V7.B16
   356  
   357  	VEOR	V0.B16, V1.B16, V0.B16
   358  	VEOR	V2.B16, V3.B16, V2.B16
   359  	VEOR	V4.B16, V5.B16, V4.B16
   360  	VEOR	V6.B16, V7.B16, V6.B16
   361  	VEOR	V0.B16, V2.B16, V0.B16
   362  	VEOR	V4.B16, V6.B16, V4.B16
   363  	VEOR	V4.B16, V0.B16, V0.B16
   364  
   365  	VMOV	V0.D[0], R0
   366  	RET
   367  

View as plain text