github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/others/siphash/hash_arm.s (about)

     1  #include "textflag.h"
     2  #define R10 g
     3  #define ROUND()\
     4  	ADD.S	R2,R0,R0;\
     5  	ADC	R3,R1,R1;\
     6  	EOR	R2<<13,R0,R8;\
     7  	EOR	R3>>19,R8,R8;\
     8  	EOR	R2>>19,R1,R11;\
     9  	EOR	R3<<13,R11,R11;\
    10  	ADD.S	R6,R4,R4;\
    11  	ADC	R7,R5,R5;\
    12  	EOR	R6<<16,R4,R2;\
    13  	EOR	R7>>16,R2,R2;\
    14  	EOR	R6>>16,R5,R3;\
    15  	EOR	R7<<16,R3,R3;\
    16  	ADD.S	R2,R1,R1;\
    17  	ADC	R3,R0,R0;\
    18  	EOR	R2<<21,R1,R6;\
    19  	EOR	R3>>11,R6,R6;\
    20  	EOR	R2>>11,R0,R7;\
    21  	EOR	R3<<21,R7,R7;\
    22  	ADD.S	R8,R4,R4;\
    23  	ADC	R11,R5,R5;\
    24  	EOR	R8<<17,R4,R2;\
    25  	EOR	R11>>15,R2,R2;\
    26  	EOR	R8>>15,R5,R3;\
    27  	EOR	R11<<17,R3,R3;\
    28  	ADD.S	R2,R1,R1;\
    29  	ADC	R3,R0,R0;\
    30  	EOR	R2<<13,R1,R8;\
    31  	EOR	R3>>19,R8,R8;\
    32  	EOR	R2>>19,R0,R11;\
    33  	EOR	R3<<13,R11,R11;\
    34  	ADD.S	R6,R5,R5;\
    35  	ADC	R7,R4,R4;\
    36  	EOR	R6<<16,R5,R2;\
    37  	EOR	R7>>16,R2,R2;\
    38  	EOR	R6>>16,R4,R3;\
    39  	EOR	R7<<16,R3,R3;\
    40  	ADD.S	R2,R0,R0;\
    41  	ADC	R3,R1,R1;\
    42  	EOR	R2<<21,R0,R6;\
    43  	EOR	R3>>11,R6,R6;\
    44  	EOR	R2>>11,R1,R7;\
    45  	EOR	R3<<21,R7,R7;\
    46  	ADD.S	R8,R5,R5;\
    47  	ADC	R11,R4,R4;\
    48  	EOR	R8<<17,R5,R2;\
    49  	EOR	R11>>15,R2,R2;\
    50  	EOR	R8>>15,R4,R3;\
    51  	EOR	R11<<17,R3,R3;\
    52  
    53  // Hash(k0, k1 uint64, b []byte) uint64
    54  TEXT ·Hash(SB),NOSPLIT,$8-36
    55  	MOVW	R10,sav-8(SP)
    56  	MOVW	k0_lo+0(FP),R12
    57  	MOVW	k0_hi+4(FP),R14
    58  	MOVW	$0x70736575,R0
    59  	MOVW	$0x736f6d65,R1
    60  	MOVW	$0x6e657261,R4
    61  	MOVW	$0x6c796765,R5
    62  	EOR	R12,R0,R0
    63  	EOR	R14,R1,R1
    64  	EOR	R12,R4,R4
    65  	EOR	R14,R5,R5
    66  	MOVW	k1_lo+8(FP),R12
    67  	MOVW	k1_hi+12(FP),R14
    68  	MOVW	$0x6e646f6d,R2
    69  	MOVW	$0x646f7261,R3
    70  	MOVW	$0x79746573,R6
    71  	MOVW	$0x74656462,R7
    72  	EOR	R12,R2,R2
    73  	EOR	R14,R3,R3
    74  	EOR	R12,R6,R6
    75  	EOR	R14,R7,R7
    76  	MOVW	b+16(FP),R10
    77  	MOVW	b_len+20(FP),R11
    78  	ADD	R10,R11,R11
    79  	MOVW	R11,endb-4(SP)
    80  	AND.S	$3,R10,R8
    81  	BNE	hashloopunaligned
    82  hashloop:
    83  	MOVW	endb-4(SP),R11
    84  	SUB	R10,R11,R11
    85  	SUB.S	$8,R11
    86  	BLO	hashend
    87  	MOVM.IA.W (R10),[R12,R14]
    88  	EOR	R12,R6,R6
    89  	EOR	R14,R7,R7
    90  	ROUND()
    91  	EOR	R12,R0,R0
    92  	EOR	R14,R1,R1
    93  	B	hashloop
    94  hashloopunaligned:
    95  	MOVW	endb-4(SP),R11
    96  	SUB	R10,R11,R11
    97  	SUB.S	$8,R11
    98  	BLO	hashend
    99  	MOVB	(R10),R12
   100  	MOVB	1(R10),R11
   101  	ORR	R11<<8,R12,R12
   102  	MOVB	2(R10),R11
   103  	ORR	R11<<16,R12,R12
   104  	MOVB	3(R10),R11
   105  	ORR	R11<<24,R12,R12
   106  	MOVB	4(R10),R14
   107  	MOVB	5(R10),R11
   108  	ORR	R11<<8,R14,R14
   109  	MOVB	6(R10),R11
   110  	ORR	R11<<16,R14,R14
   111  	MOVB	7(R10),R11
   112  	ORR	R11<<24,R14,R14
   113  	ADD	$8,R10,R10
   114  	EOR	R12,R6,R6
   115  	EOR	R14,R7,R7
   116  	ROUND()
   117  	EOR	R12,R0,R0
   118  	EOR	R14,R1,R1
   119  	B	hashloopunaligned
   120  hashend:
   121  	MOVW	$0x0,R12
   122  	MOVW	$0x0,R14
   123  	RSB	$0,R11,R11
   124  	AND.S	$7,R11
   125  	BEQ	hashlast
   126  	MOVW	(R10),R12
   127  	SLL	$3,R11
   128  	AND	$63,R11
   129  	SUB.S	$32,R11,R11
   130  	BEQ	hashlast
   131  	BLO	hashhi
   132  	MOVW	R12<<R11,R12
   133  	MOVW	R12>>R11,R12
   134  	B	hashlast
   135  hashhi:
   136  	ADD	$32,R11
   137  	MOVW	4(R10),R14
   138  	MOVW	R14<<R11,R14
   139  	MOVW	R14>>R11,R14
   140  hashlast:
   141  	MOVW	b_len+20(FP),R11
   142  	ORR	R11<<24,R14,R14
   143  	EOR	R12,R6,R6
   144  	EOR	R14,R7,R7
   145  	ROUND()
   146  	EOR	R12,R0,R0
   147  	EOR	R14,R1,R1
   148  	EOR	$255,R4
   149  	ROUND()
   150  	ROUND()
   151  	EOR	R2,R0,R0
   152  	EOR	R3,R1,R1
   153  	EOR	R6,R4,R4
   154  	EOR	R7,R5,R5
   155  	EOR	R4,R0,R0
   156  	EOR	R5,R1,R1
   157  	MOVW	sav-8(SP),R10
   158  	MOVW	R0,ret_lo+28(FP)
   159  	MOVW	R1,ret_hi+32(FP)
   160  	RET