1// +build amd64,!appengine,!gccgo
2
3// This is a translation of the gcc output of FloodyBerry's pure-C public
4// domain siphash implementation at https://github.com/floodyberry/siphash
5// func Hash(k0, k1 uint64, b []byte) uint64
6TEXT	·Hash(SB),4,$0-48
7	MOVQ	k0+0(FP),CX
8	MOVQ	$0x736F6D6570736575,R9
9	MOVQ	k1+8(FP),DI
10	MOVQ	$0x6C7967656E657261,BX
11	MOVQ	$0x646F72616E646F6D,AX
12	MOVQ	b_len+24(FP),DX
13	MOVQ	DX,R11
14	MOVQ	DX,R10
15	XORQ	CX,R9
16	XORQ	CX,BX
17	MOVQ	$0x7465646279746573,CX
18	XORQ	DI,AX
19	XORQ	DI,CX
20	SHLQ	$0x38,R11
21	XORQ	DI,DI
22	MOVQ	b_base+16(FP),SI
23	ANDQ	$0xFFFFFFFFFFFFFFF8,R10
24	JE	afterLoop
25	XCHGQ	AX,AX
26loopBody:
27	MOVQ	0(SI)(DI*1),R8
28	ADDQ	AX,R9
29	RORQ	$0x33,AX
30	XORQ	R9,AX
31	RORQ	$0x20,R9
32	ADDQ	$0x8,DI
33	XORQ	R8,CX
34	ADDQ	CX,BX
35	RORQ	$0x30,CX
36	XORQ	BX,CX
37	ADDQ	AX,BX
38	RORQ	$0x2F,AX
39	ADDQ	CX,R9
40	RORQ	$0x2B,CX
41	XORQ	BX,AX
42	XORQ	R9,CX
43	RORQ	$0x20,BX
44	ADDQ	AX,R9
45	ADDQ	CX,BX
46	RORQ	$0x33,AX
47	RORQ	$0x30,CX
48	XORQ	R9,AX
49	XORQ	BX,CX
50	RORQ	$0x20,R9
51	ADDQ	AX,BX
52	ADDQ	CX,R9
53	RORQ	$0x2F,AX
54	RORQ	$0x2B,CX
55	XORQ	BX,AX
56	RORQ	$0x20,BX
57	XORQ	R9,CX
58	XORQ	R8,R9
59	CMPQ	R10,DI
60	JA	loopBody
61afterLoop:
62	SUBQ	R10,DX
63
64	CMPQ	DX,$0x7
65	JA	afterSwitch
66
67	// no support for jump tables
68
69	CMPQ	DX,$0x7
70	JE	sw7
71
72	CMPQ	DX,$0x6
73	JE	sw6
74
75	CMPQ	DX,$0x5
76	JE	sw5
77
78	CMPQ	DX,$0x4
79	JE	sw4
80
81	CMPQ	DX,$0x3
82	JE	sw3
83
84	CMPQ	DX,$0x2
85	JE	sw2
86
87	CMPQ	DX,$0x1
88	JE	sw1
89
90	JMP	afterSwitch
91
92sw7:	MOVBQZX	6(SI)(DI*1),DX
93	SHLQ	$0x30,DX
94	ORQ	DX,R11
95sw6:	MOVBQZX	0x5(SI)(DI*1),DX
96	SHLQ	$0x28,DX
97	ORQ	DX,R11
98sw5:	MOVBQZX	0x4(SI)(DI*1),DX
99	SHLQ	$0x20,DX
100	ORQ	DX,R11
101sw4:	MOVBQZX	0x3(SI)(DI*1),DX
102	SHLQ	$0x18,DX
103	ORQ	DX,R11
104sw3:	MOVBQZX	0x2(SI)(DI*1),DX
105	SHLQ	$0x10,DX
106	ORQ	DX,R11
107sw2:	MOVBQZX	0x1(SI)(DI*1),DX
108	SHLQ	$0x8,DX
109	ORQ	DX,R11
110sw1:	MOVBQZX	0(SI)(DI*1),DX
111	ORQ	DX,R11
112afterSwitch:
113	LEAQ	(AX)(R9*1),SI
114	XORQ	R11,CX
115	RORQ	$0x33,AX
116	ADDQ	CX,BX
117	MOVQ	CX,DX
118	XORQ	SI,AX
119	RORQ	$0x30,DX
120	RORQ	$0x20,SI
121	LEAQ	0(BX)(AX*1),CX
122	XORQ	BX,DX
123	RORQ	$0x2F,AX
124	ADDQ	DX,SI
125	RORQ	$0x2B,DX
126	XORQ	CX,AX
127	XORQ	SI,DX
128	RORQ	$0x20,CX
129	ADDQ	AX,SI
130	RORQ	$0x33,AX
131	ADDQ	DX,CX
132	XORQ	SI,AX
133	RORQ	$0x30,DX
134	RORQ	$0x20,SI
135	XORQ	CX,DX
136	ADDQ	AX,CX
137	RORQ	$0x2F,AX
138	ADDQ	DX,SI
139	XORQ	CX,AX
140	RORQ	$0x2B,DX
141	RORQ	$0x20,CX
142	XORQ	SI,DX
143	XORQ	R11,SI
144	XORB	$0xFF,CL
145	ADDQ	AX,SI
146	RORQ	$0x33,AX
147	ADDQ	DX,CX
148	RORQ	$0x30,DX
149	XORQ	SI,AX
150	XORQ	CX,DX
151	RORQ	$0x20,SI
152	ADDQ	AX,CX
153	ADDQ	DX,SI
154	RORQ	$0x2F,AX
155	RORQ	$0x2B,DX
156	XORQ	CX,AX
157	XORQ	SI,DX
158	RORQ	$0x20,CX
159	ADDQ	AX,SI
160	ADDQ	DX,CX
161	RORQ	$0x33,AX
162	RORQ	$0x30,DX
163	XORQ	SI,AX
164	RORQ	$0x20,SI
165	XORQ	CX,DX
166	ADDQ	AX,CX
167	RORQ	$0x2F,AX
168	ADDQ	DX,SI
169	RORQ	$0x2B,DX
170	XORQ	CX,AX
171	XORQ	SI,DX
172	RORQ	$0x20,CX
173	ADDQ	AX,SI
174	ADDQ	DX,CX
175	RORQ	$0x33,AX
176	RORQ	$0x30,DX
177	XORQ	CX,DX
178	XORQ	SI,AX
179	RORQ	$0x20,SI
180	ADDQ	DX,SI
181	ADDQ	AX,CX
182	RORQ	$0x2F,AX
183	XORQ	CX,AX
184	RORQ	$0x2B,DX
185	RORQ	$0x20,CX
186	XORQ	SI,DX
187	ADDQ	AX,SI
188	RORQ	$0x33,AX
189	ADDQ	DX,CX
190	XORQ	SI,AX
191	RORQ	$0x30,DX
192	XORQ	CX,DX
193	ADDQ	AX,CX
194	RORQ	$0x2F,AX
195	XORQ	CX,AX
196	RORQ	$0x2B,DX
197	RORQ	$0x20,CX
198	XORQ	DX,AX
199	XORQ	CX,AX
200	MOVQ	AX,ret+40(FP)
201	RET
202