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// Hash128(k0, k1 uint64, b []byte) (uint64, uint64)
54TEXT ·Hash128(SB),NOSPLIT,$8-44
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	$0x6e646f83,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)
80hashloop128:
81	MOVW	endb-4(SP),R11
82	SUB	R10,R11,R11
83	SUB.S	$8,R11
84	BLO	hashend128
85	MOVM.IA.W (R10),[R12,R14]
86	EOR	R12,R6,R6
87	EOR	R14,R7,R7
88	ROUND()
89	EOR	R12,R0,R0
90	EOR	R14,R1,R1
91	B	hashloop128
92hashloop128unaligned:
93	MOVW	endb-4(SP),R11
94	SUB	R10,R11,R11
95	SUB.S	$8,R11
96	BLO	hashend128
97	MOVB	(R10),R12
98	MOVB	1(R10),R11
99	ORR	R11<<8,R12,R12
100	MOVB	2(R10),R11
101	ORR	R11<<16,R12,R12
102	MOVB	3(R10),R11
103	ORR	R11<<24,R12,R12
104	MOVB	4(R10),R14
105	MOVB	5(R10),R11
106	ORR	R11<<8,R14,R14
107	MOVB	6(R10),R11
108	ORR	R11<<16,R14,R14
109	MOVB	7(R10),R11
110	ORR	R11<<24,R14,R14
111	ADD	$8,R10,R10
112	EOR	R12,R6,R6
113	EOR	R14,R7,R7
114	ROUND()
115	EOR	R12,R0,R0
116	EOR	R14,R1,R1
117	B	hashloop128unaligned
118hashend128:
119	MOVW	$0x0,R12
120	MOVW	$0x0,R14
121	RSB	$0,R11,R11
122	AND.S	$7,R11
123	BEQ	hashlast128
124	MOVW	(R10),R12
125	SLL	$3,R11
126	AND	$63,R11
127	SUB.S	$32,R11,R11
128	BEQ	hashlast128
129	BLO	hashhi128
130	MOVW	R12<<R11,R12
131	MOVW	R12>>R11,R12
132	B	hashlast128
133hashhi128:
134	ADD	$32,R11
135	MOVW	4(R10),R14
136	MOVW	R14<<R11,R14
137	MOVW	R14>>R11,R14
138hashlast128:
139	MOVW	b_len+20(FP),R11
140	ORR	R11<<24,R14,R14
141	EOR	R12,R6,R6
142	EOR	R14,R7,R7
143	ROUND()
144	EOR	R12,R0,R0
145	EOR	R14,R1,R1
146	EOR	$238,R4
147	ROUND()
148	ROUND()
149	EOR	R0,R2,R12
150	EOR	R1,R3,R14
151	EOR	R4,R12,R12
152	EOR	R5,R14,R14
153	EOR	R6,R12,R12
154	EOR	R7,R14,R14
155	MOVW	R12,ret_lo+28(FP)
156	MOVW	R14,ret_hi+32(FP)
157	EOR	$221,R2
158	ROUND()
159	ROUND()
160	EOR	R0,R2,R12
161	EOR	R1,R3,R14
162	EOR	R4,R12,R12
163	EOR	R5,R14,R14
164	EOR	R6,R12,R12
165	EOR	R7,R14,R14
166	MOVW	R12,unnamed_lo+36(FP)
167	MOVW	R14,unnamed_hi+40(FP)
168	MOVW	sav-8(SP),R10
169	RET
170