summaryrefslogtreecommitdiff
path: root/vendor/github.com/dchest/siphash/blocks_arm.s
blob: bfcfd9bd340a85d9f7b7407d7f94f9f4103ed0d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include "textflag.h"

#define ROUND()\
	ADD.S	R2,R0,R0;\
	ADC	R3,R1,R1;\
	EOR	R2<<13,R0,R8;\
	EOR	R3>>19,R8,R8;\
	EOR	R2>>19,R1,R11;\
	EOR	R3<<13,R11,R11;\
	ADD.S	R6,R4,R4;\
	ADC	R7,R5,R5;\
	EOR	R6<<16,R4,R2;\
	EOR	R7>>16,R2,R2;\
	EOR	R6>>16,R5,R3;\
	EOR	R7<<16,R3,R3;\
	ADD.S	R2,R1,R1;\
	ADC	R3,R0,R0;\
	EOR	R2<<21,R1,R6;\
	EOR	R3>>11,R6,R6;\
	EOR	R2>>11,R0,R7;\
	EOR	R3<<21,R7,R7;\
	ADD.S	R8,R4,R4;\
	ADC	R11,R5,R5;\
	EOR	R8<<17,R4,R2;\
	EOR	R11>>15,R2,R2;\
	EOR	R8>>15,R5,R3;\
	EOR	R11<<17,R3,R3;\
	ADD.S	R2,R1,R1;\
	ADC	R3,R0,R0;\
	EOR	R2<<13,R1,R8;\
	EOR	R3>>19,R8,R8;\
	EOR	R2>>19,R0,R11;\
	EOR	R3<<13,R11,R11;\
	ADD.S	R6,R5,R5;\
	ADC	R7,R4,R4;\
	EOR	R6<<16,R5,R2;\
	EOR	R7>>16,R2,R2;\
	EOR	R6>>16,R4,R3;\
	EOR	R7<<16,R3,R3;\
	ADD.S	R2,R0,R0;\
	ADC	R3,R1,R1;\
	EOR	R2<<21,R0,R6;\
	EOR	R3>>11,R6,R6;\
	EOR	R2>>11,R1,R7;\
	EOR	R3<<21,R7,R7;\
	ADD.S	R8,R5,R5;\
	ADC	R11,R4,R4;\
	EOR	R8<<17,R5,R2;\
	EOR	R11>>15,R2,R2;\
	EOR	R8>>15,R4,R3;\
	EOR	R11<<17,R3,R3;

// once(d *digest)
TEXT ·once(SB),NOSPLIT,$4-4
	MOVW	d+0(FP),R8
	MOVM.IA	(R8),[R0,R1,R2,R3,R4,R5,R6,R7]
	MOVW	48(R8),R12
	MOVW	52(R8),R14
	EOR	R12,R6,R6
	EOR	R14,R7,R7
	ROUND()
	EOR	R12,R0,R0
	EOR	R14,R1,R1
	MOVW	d+0(FP),R8
	MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8)
	RET

// finalize(d *digest) uint64
TEXT ·finalize(SB),NOSPLIT,$4-12
	MOVW	d+0(FP),R8
	MOVM.IA	(R8),[R0,R1,R2,R3,R4,R5,R6,R7]
	MOVW	48(R8),R12
	MOVW	52(R8),R14
	EOR	R12,R6,R6
	EOR	R14,R7,R7
	ROUND()
	EOR	R12,R0,R0
	EOR	R14,R1,R1
	EOR	$255,R4
	ROUND()
	ROUND()
	EOR	R2,R0,R0
	EOR	R3,R1,R1
	EOR	R6,R4,R4
	EOR	R7,R5,R5
	EOR	R4,R0,R0
	EOR	R5,R1,R1
	MOVW	R0,ret_lo+4(FP)
	MOVW	R1,ret_hi+8(FP)
	RET

// blocks(d *digest, data []uint8)
TEXT ·blocks(SB),NOSPLIT,$8-16
	MOVW	R9,sav-8(SP)
	MOVW	d+0(FP),R8
	MOVM.IA	(R8),[R0,R1,R2,R3,R4,R5,R6,R7]
	MOVW	p+4(FP),R9
	MOVW	p_len+8(FP),R11
	ADD	R9,R11,R11
	MOVW	R11,endp-4(SP)
	AND.S   $3,R9,R8
	BNE     blocksunaligned
blocksloop:
	MOVM.IA.W (R9),[R12,R14]
	EOR	R12,R6,R6
	EOR	R14,R7,R7
	ROUND()
	EOR	R12,R0,R0
	EOR	R14,R1,R1
	MOVW	endp-4(SP),R11
	CMP	R11,R9
	BLO	blocksloop
	MOVW	d+0(FP),R8
	MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8)
	MOVW	sav-8(SP),R9
	RET
blocksunaligned:
	MOVBU    (R9),R12
	MOVBU    1(R9),R11
	ORR     R11<<8,R12,R12
	MOVBU    2(R9),R11
	ORR     R11<<16,R12,R12
	MOVBU    3(R9),R11
	ORR     R11<<24,R12,R12
	MOVBU    4(R9),R14
	MOVBU    5(R9),R11
	ORR     R11<<8,R14,R14
	MOVBU    6(R9),R11
	ORR     R11<<16,R14,R14
	MOVBU    7(R9),R11
	ORR     R11<<24,R14,R14
	ADD     $8,R9,R9
	EOR     R12,R6,R6
	EOR     R14,R7,R7
	ROUND()
	EOR     R12,R0,R0
	EOR     R14,R1,R1
	MOVW    endp-4(SP),R11
	CMP     R11,R9
	BLO     blocksunaligned
	MOVW    d+0(FP),R8
	MOVM.IA [R0,R1,R2,R3,R4,R5,R6,R7],(R8)
	MOVW    sav-8(SP),R9
	RET