github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/others/siphash/blocks_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  // once(d *digest)
    54  TEXT ·once(SB),NOSPLIT,$4-4
    55  	MOVW	d+0(FP),R8
    56  	MOVM.IA	(R8),[R0,R1,R2,R3,R4,R5,R6,R7]
    57  	MOVW	48(R8),R12
    58  	MOVW	52(R8),R14
    59  	EOR	R12,R6,R6
    60  	EOR	R14,R7,R7
    61  	ROUND()
    62  	EOR	R12,R0,R0
    63  	EOR	R14,R1,R1
    64  	MOVW	d+0(FP),R8
    65  	MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8)
    66  	RET
    67  
    68  // finalize(d *digest) uint64
    69  TEXT ·finalize(SB),NOSPLIT,$4-12
    70  	MOVW	d+0(FP),R8
    71  	MOVM.IA	(R8),[R0,R1,R2,R3,R4,R5,R6,R7]
    72  	MOVW	48(R8),R12
    73  	MOVW	52(R8),R14
    74  	EOR	R12,R6,R6
    75  	EOR	R14,R7,R7
    76  	ROUND()
    77  	EOR	R12,R0,R0
    78  	EOR	R14,R1,R1
    79  	EOR	$255,R4
    80  	ROUND()
    81  	ROUND()
    82  	EOR	R2,R0,R0
    83  	EOR	R3,R1,R1
    84  	EOR	R6,R4,R4
    85  	EOR	R7,R5,R5
    86  	EOR	R4,R0,R0
    87  	EOR	R5,R1,R1
    88  	MOVW	R0,ret_lo+4(FP)
    89  	MOVW	R1,ret_hi+8(FP)
    90  	RET
    91  
    92  // blocks(d *digest, data []uint8)
    93  TEXT ·blocks(SB),NOSPLIT,$8-16
    94  	MOVW	R10,sav-8(SP)
    95  	MOVW	d+0(FP),R8
    96  	MOVM.IA	(R8),[R0,R1,R2,R3,R4,R5,R6,R7]
    97  	MOVW	p+4(FP),R10
    98  	MOVW	p_len+8(FP),R11
    99  	ADD	R10,R11,R11
   100  	MOVW	R11,endp-4(SP)
   101  	AND.S	$3,R10,R8
   102  	BNE	blocksunaligned
   103  blocksloop:
   104  	MOVM.IA.W (R10),[R12,R14]
   105  	EOR	R12,R6,R6
   106  	EOR	R14,R7,R7
   107  	ROUND()
   108  	EOR	R12,R0,R0
   109  	EOR	R14,R1,R1
   110  	MOVW	endp-4(SP),R11
   111  	CMP	R11,R10
   112  	BLO	blocksloop
   113  	MOVW	d+0(FP),R8
   114  	MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8)
   115  	MOVW	sav-8(SP),R10
   116  	RET
   117  blocksunaligned:
   118  	MOVB	(R10),R12
   119  	MOVB	1(R10),R11
   120  	ORR	R11<<8,R12,R12
   121  	MOVB	2(R10),R11
   122  	ORR	R11<<16,R12,R12
   123  	MOVB	3(R10),R11
   124  	ORR	R11<<24,R12,R12
   125  	MOVB	4(R10),R14
   126  	MOVB	5(R10),R11
   127  	ORR	R11<<8,R14,R14
   128  	MOVB	6(R10),R11
   129  	ORR	R11<<16,R14,R14
   130  	MOVB	7(R10),R11
   131  	ORR	R11<<24,R14,R14
   132  	ADD	$8,R10,R10
   133  	EOR	R12,R6,R6
   134  	EOR	R14,R7,R7
   135  	ROUND()
   136  	EOR	R12,R0,R0
   137  	EOR	R14,R1,R1
   138  	MOVW	endp-4(SP),R11
   139  	CMP	R11,R10
   140  	BLO	blocksunaligned
   141  	MOVW	d+0(FP),R8
   142  	MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8)
   143  	MOVW	sav-8(SP),R10
   144  	RET