1default	rel
2%define XMMWORD
3%define YMMWORD
4%define ZMMWORD
5section	.text code align=64
6
7
8global	whirlpool_block
9
10ALIGN	16
11whirlpool_block:
12	mov	QWORD[8+rsp],rdi	;WIN64 prologue
13	mov	QWORD[16+rsp],rsi
14	mov	rax,rsp
15$L$SEH_begin_whirlpool_block:
16	mov	rdi,rcx
17	mov	rsi,rdx
18	mov	rdx,r8
19
20
21
22	mov	rax,rsp
23
24	push	rbx
25
26	push	rbp
27
28	push	r12
29
30	push	r13
31
32	push	r14
33
34	push	r15
35
36
37	sub	rsp,128+40
38	and	rsp,-64
39
40	lea	r10,[128+rsp]
41	mov	QWORD[r10],rdi
42	mov	QWORD[8+r10],rsi
43	mov	QWORD[16+r10],rdx
44	mov	QWORD[32+r10],rax
45
46$L$prologue:
47
48	mov	rbx,r10
49	lea	rbp,[$L$table]
50
51	xor	rcx,rcx
52	xor	rdx,rdx
53	mov	r8,QWORD[rdi]
54	mov	r9,QWORD[8+rdi]
55	mov	r10,QWORD[16+rdi]
56	mov	r11,QWORD[24+rdi]
57	mov	r12,QWORD[32+rdi]
58	mov	r13,QWORD[40+rdi]
59	mov	r14,QWORD[48+rdi]
60	mov	r15,QWORD[56+rdi]
61$L$outerloop:
62	mov	QWORD[rsp],r8
63	mov	QWORD[8+rsp],r9
64	mov	QWORD[16+rsp],r10
65	mov	QWORD[24+rsp],r11
66	mov	QWORD[32+rsp],r12
67	mov	QWORD[40+rsp],r13
68	mov	QWORD[48+rsp],r14
69	mov	QWORD[56+rsp],r15
70	xor	r8,QWORD[rsi]
71	xor	r9,QWORD[8+rsi]
72	xor	r10,QWORD[16+rsi]
73	xor	r11,QWORD[24+rsi]
74	xor	r12,QWORD[32+rsi]
75	xor	r13,QWORD[40+rsi]
76	xor	r14,QWORD[48+rsi]
77	xor	r15,QWORD[56+rsi]
78	mov	QWORD[((64+0))+rsp],r8
79	mov	QWORD[((64+8))+rsp],r9
80	mov	QWORD[((64+16))+rsp],r10
81	mov	QWORD[((64+24))+rsp],r11
82	mov	QWORD[((64+32))+rsp],r12
83	mov	QWORD[((64+40))+rsp],r13
84	mov	QWORD[((64+48))+rsp],r14
85	mov	QWORD[((64+56))+rsp],r15
86	xor	rsi,rsi
87	mov	QWORD[24+rbx],rsi
88	jmp	NEAR $L$round
89ALIGN	16
90$L$round:
91	mov	r8,QWORD[4096+rsi*8+rbp]
92	mov	eax,DWORD[rsp]
93	mov	ebx,DWORD[4+rsp]
94	movzx	ecx,al
95	movzx	edx,ah
96	shr	eax,16
97	lea	rsi,[rcx*1+rcx]
98	movzx	ecx,al
99	lea	rdi,[rdx*1+rdx]
100	movzx	edx,ah
101	xor	r8,QWORD[rsi*8+rbp]
102	mov	r9,QWORD[7+rdi*8+rbp]
103	mov	eax,DWORD[((0+8))+rsp]
104	lea	rsi,[rcx*1+rcx]
105	movzx	ecx,bl
106	lea	rdi,[rdx*1+rdx]
107	movzx	edx,bh
108	mov	r10,QWORD[6+rsi*8+rbp]
109	mov	r11,QWORD[5+rdi*8+rbp]
110	shr	ebx,16
111	lea	rsi,[rcx*1+rcx]
112	movzx	ecx,bl
113	lea	rdi,[rdx*1+rdx]
114	movzx	edx,bh
115	mov	r12,QWORD[4+rsi*8+rbp]
116	mov	r13,QWORD[3+rdi*8+rbp]
117	mov	ebx,DWORD[((0+8+4))+rsp]
118	lea	rsi,[rcx*1+rcx]
119	movzx	ecx,al
120	lea	rdi,[rdx*1+rdx]
121	movzx	edx,ah
122	mov	r14,QWORD[2+rsi*8+rbp]
123	mov	r15,QWORD[1+rdi*8+rbp]
124	shr	eax,16
125	lea	rsi,[rcx*1+rcx]
126	movzx	ecx,al
127	lea	rdi,[rdx*1+rdx]
128	movzx	edx,ah
129	xor	r9,QWORD[rsi*8+rbp]
130	xor	r10,QWORD[7+rdi*8+rbp]
131	mov	eax,DWORD[((8+8))+rsp]
132	lea	rsi,[rcx*1+rcx]
133	movzx	ecx,bl
134	lea	rdi,[rdx*1+rdx]
135	movzx	edx,bh
136	xor	r11,QWORD[6+rsi*8+rbp]
137	xor	r12,QWORD[5+rdi*8+rbp]
138	shr	ebx,16
139	lea	rsi,[rcx*1+rcx]
140	movzx	ecx,bl
141	lea	rdi,[rdx*1+rdx]
142	movzx	edx,bh
143	xor	r13,QWORD[4+rsi*8+rbp]
144	xor	r14,QWORD[3+rdi*8+rbp]
145	mov	ebx,DWORD[((8+8+4))+rsp]
146	lea	rsi,[rcx*1+rcx]
147	movzx	ecx,al
148	lea	rdi,[rdx*1+rdx]
149	movzx	edx,ah
150	xor	r15,QWORD[2+rsi*8+rbp]
151	xor	r8,QWORD[1+rdi*8+rbp]
152	shr	eax,16
153	lea	rsi,[rcx*1+rcx]
154	movzx	ecx,al
155	lea	rdi,[rdx*1+rdx]
156	movzx	edx,ah
157	xor	r10,QWORD[rsi*8+rbp]
158	xor	r11,QWORD[7+rdi*8+rbp]
159	mov	eax,DWORD[((16+8))+rsp]
160	lea	rsi,[rcx*1+rcx]
161	movzx	ecx,bl
162	lea	rdi,[rdx*1+rdx]
163	movzx	edx,bh
164	xor	r12,QWORD[6+rsi*8+rbp]
165	xor	r13,QWORD[5+rdi*8+rbp]
166	shr	ebx,16
167	lea	rsi,[rcx*1+rcx]
168	movzx	ecx,bl
169	lea	rdi,[rdx*1+rdx]
170	movzx	edx,bh
171	xor	r14,QWORD[4+rsi*8+rbp]
172	xor	r15,QWORD[3+rdi*8+rbp]
173	mov	ebx,DWORD[((16+8+4))+rsp]
174	lea	rsi,[rcx*1+rcx]
175	movzx	ecx,al
176	lea	rdi,[rdx*1+rdx]
177	movzx	edx,ah
178	xor	r8,QWORD[2+rsi*8+rbp]
179	xor	r9,QWORD[1+rdi*8+rbp]
180	shr	eax,16
181	lea	rsi,[rcx*1+rcx]
182	movzx	ecx,al
183	lea	rdi,[rdx*1+rdx]
184	movzx	edx,ah
185	xor	r11,QWORD[rsi*8+rbp]
186	xor	r12,QWORD[7+rdi*8+rbp]
187	mov	eax,DWORD[((24+8))+rsp]
188	lea	rsi,[rcx*1+rcx]
189	movzx	ecx,bl
190	lea	rdi,[rdx*1+rdx]
191	movzx	edx,bh
192	xor	r13,QWORD[6+rsi*8+rbp]
193	xor	r14,QWORD[5+rdi*8+rbp]
194	shr	ebx,16
195	lea	rsi,[rcx*1+rcx]
196	movzx	ecx,bl
197	lea	rdi,[rdx*1+rdx]
198	movzx	edx,bh
199	xor	r15,QWORD[4+rsi*8+rbp]
200	xor	r8,QWORD[3+rdi*8+rbp]
201	mov	ebx,DWORD[((24+8+4))+rsp]
202	lea	rsi,[rcx*1+rcx]
203	movzx	ecx,al
204	lea	rdi,[rdx*1+rdx]
205	movzx	edx,ah
206	xor	r9,QWORD[2+rsi*8+rbp]
207	xor	r10,QWORD[1+rdi*8+rbp]
208	shr	eax,16
209	lea	rsi,[rcx*1+rcx]
210	movzx	ecx,al
211	lea	rdi,[rdx*1+rdx]
212	movzx	edx,ah
213	xor	r12,QWORD[rsi*8+rbp]
214	xor	r13,QWORD[7+rdi*8+rbp]
215	mov	eax,DWORD[((32+8))+rsp]
216	lea	rsi,[rcx*1+rcx]
217	movzx	ecx,bl
218	lea	rdi,[rdx*1+rdx]
219	movzx	edx,bh
220	xor	r14,QWORD[6+rsi*8+rbp]
221	xor	r15,QWORD[5+rdi*8+rbp]
222	shr	ebx,16
223	lea	rsi,[rcx*1+rcx]
224	movzx	ecx,bl
225	lea	rdi,[rdx*1+rdx]
226	movzx	edx,bh
227	xor	r8,QWORD[4+rsi*8+rbp]
228	xor	r9,QWORD[3+rdi*8+rbp]
229	mov	ebx,DWORD[((32+8+4))+rsp]
230	lea	rsi,[rcx*1+rcx]
231	movzx	ecx,al
232	lea	rdi,[rdx*1+rdx]
233	movzx	edx,ah
234	xor	r10,QWORD[2+rsi*8+rbp]
235	xor	r11,QWORD[1+rdi*8+rbp]
236	shr	eax,16
237	lea	rsi,[rcx*1+rcx]
238	movzx	ecx,al
239	lea	rdi,[rdx*1+rdx]
240	movzx	edx,ah
241	xor	r13,QWORD[rsi*8+rbp]
242	xor	r14,QWORD[7+rdi*8+rbp]
243	mov	eax,DWORD[((40+8))+rsp]
244	lea	rsi,[rcx*1+rcx]
245	movzx	ecx,bl
246	lea	rdi,[rdx*1+rdx]
247	movzx	edx,bh
248	xor	r15,QWORD[6+rsi*8+rbp]
249	xor	r8,QWORD[5+rdi*8+rbp]
250	shr	ebx,16
251	lea	rsi,[rcx*1+rcx]
252	movzx	ecx,bl
253	lea	rdi,[rdx*1+rdx]
254	movzx	edx,bh
255	xor	r9,QWORD[4+rsi*8+rbp]
256	xor	r10,QWORD[3+rdi*8+rbp]
257	mov	ebx,DWORD[((40+8+4))+rsp]
258	lea	rsi,[rcx*1+rcx]
259	movzx	ecx,al
260	lea	rdi,[rdx*1+rdx]
261	movzx	edx,ah
262	xor	r11,QWORD[2+rsi*8+rbp]
263	xor	r12,QWORD[1+rdi*8+rbp]
264	shr	eax,16
265	lea	rsi,[rcx*1+rcx]
266	movzx	ecx,al
267	lea	rdi,[rdx*1+rdx]
268	movzx	edx,ah
269	xor	r14,QWORD[rsi*8+rbp]
270	xor	r15,QWORD[7+rdi*8+rbp]
271	mov	eax,DWORD[((48+8))+rsp]
272	lea	rsi,[rcx*1+rcx]
273	movzx	ecx,bl
274	lea	rdi,[rdx*1+rdx]
275	movzx	edx,bh
276	xor	r8,QWORD[6+rsi*8+rbp]
277	xor	r9,QWORD[5+rdi*8+rbp]
278	shr	ebx,16
279	lea	rsi,[rcx*1+rcx]
280	movzx	ecx,bl
281	lea	rdi,[rdx*1+rdx]
282	movzx	edx,bh
283	xor	r10,QWORD[4+rsi*8+rbp]
284	xor	r11,QWORD[3+rdi*8+rbp]
285	mov	ebx,DWORD[((48+8+4))+rsp]
286	lea	rsi,[rcx*1+rcx]
287	movzx	ecx,al
288	lea	rdi,[rdx*1+rdx]
289	movzx	edx,ah
290	xor	r12,QWORD[2+rsi*8+rbp]
291	xor	r13,QWORD[1+rdi*8+rbp]
292	shr	eax,16
293	lea	rsi,[rcx*1+rcx]
294	movzx	ecx,al
295	lea	rdi,[rdx*1+rdx]
296	movzx	edx,ah
297	xor	r15,QWORD[rsi*8+rbp]
298	xor	r8,QWORD[7+rdi*8+rbp]
299	mov	eax,DWORD[((56+8))+rsp]
300	lea	rsi,[rcx*1+rcx]
301	movzx	ecx,bl
302	lea	rdi,[rdx*1+rdx]
303	movzx	edx,bh
304	xor	r9,QWORD[6+rsi*8+rbp]
305	xor	r10,QWORD[5+rdi*8+rbp]
306	shr	ebx,16
307	lea	rsi,[rcx*1+rcx]
308	movzx	ecx,bl
309	lea	rdi,[rdx*1+rdx]
310	movzx	edx,bh
311	xor	r11,QWORD[4+rsi*8+rbp]
312	xor	r12,QWORD[3+rdi*8+rbp]
313	mov	ebx,DWORD[((56+8+4))+rsp]
314	lea	rsi,[rcx*1+rcx]
315	movzx	ecx,al
316	lea	rdi,[rdx*1+rdx]
317	movzx	edx,ah
318	xor	r13,QWORD[2+rsi*8+rbp]
319	xor	r14,QWORD[1+rdi*8+rbp]
320	mov	QWORD[rsp],r8
321	mov	QWORD[8+rsp],r9
322	mov	QWORD[16+rsp],r10
323	mov	QWORD[24+rsp],r11
324	mov	QWORD[32+rsp],r12
325	mov	QWORD[40+rsp],r13
326	mov	QWORD[48+rsp],r14
327	mov	QWORD[56+rsp],r15
328	shr	eax,16
329	lea	rsi,[rcx*1+rcx]
330	movzx	ecx,al
331	lea	rdi,[rdx*1+rdx]
332	movzx	edx,ah
333	xor	r8,QWORD[rsi*8+rbp]
334	xor	r9,QWORD[7+rdi*8+rbp]
335	mov	eax,DWORD[((64+0+8))+rsp]
336	lea	rsi,[rcx*1+rcx]
337	movzx	ecx,bl
338	lea	rdi,[rdx*1+rdx]
339	movzx	edx,bh
340	xor	r10,QWORD[6+rsi*8+rbp]
341	xor	r11,QWORD[5+rdi*8+rbp]
342	shr	ebx,16
343	lea	rsi,[rcx*1+rcx]
344	movzx	ecx,bl
345	lea	rdi,[rdx*1+rdx]
346	movzx	edx,bh
347	xor	r12,QWORD[4+rsi*8+rbp]
348	xor	r13,QWORD[3+rdi*8+rbp]
349	mov	ebx,DWORD[((64+0+8+4))+rsp]
350	lea	rsi,[rcx*1+rcx]
351	movzx	ecx,al
352	lea	rdi,[rdx*1+rdx]
353	movzx	edx,ah
354	xor	r14,QWORD[2+rsi*8+rbp]
355	xor	r15,QWORD[1+rdi*8+rbp]
356	shr	eax,16
357	lea	rsi,[rcx*1+rcx]
358	movzx	ecx,al
359	lea	rdi,[rdx*1+rdx]
360	movzx	edx,ah
361	xor	r9,QWORD[rsi*8+rbp]
362	xor	r10,QWORD[7+rdi*8+rbp]
363	mov	eax,DWORD[((64+8+8))+rsp]
364	lea	rsi,[rcx*1+rcx]
365	movzx	ecx,bl
366	lea	rdi,[rdx*1+rdx]
367	movzx	edx,bh
368	xor	r11,QWORD[6+rsi*8+rbp]
369	xor	r12,QWORD[5+rdi*8+rbp]
370	shr	ebx,16
371	lea	rsi,[rcx*1+rcx]
372	movzx	ecx,bl
373	lea	rdi,[rdx*1+rdx]
374	movzx	edx,bh
375	xor	r13,QWORD[4+rsi*8+rbp]
376	xor	r14,QWORD[3+rdi*8+rbp]
377	mov	ebx,DWORD[((64+8+8+4))+rsp]
378	lea	rsi,[rcx*1+rcx]
379	movzx	ecx,al
380	lea	rdi,[rdx*1+rdx]
381	movzx	edx,ah
382	xor	r15,QWORD[2+rsi*8+rbp]
383	xor	r8,QWORD[1+rdi*8+rbp]
384	shr	eax,16
385	lea	rsi,[rcx*1+rcx]
386	movzx	ecx,al
387	lea	rdi,[rdx*1+rdx]
388	movzx	edx,ah
389	xor	r10,QWORD[rsi*8+rbp]
390	xor	r11,QWORD[7+rdi*8+rbp]
391	mov	eax,DWORD[((64+16+8))+rsp]
392	lea	rsi,[rcx*1+rcx]
393	movzx	ecx,bl
394	lea	rdi,[rdx*1+rdx]
395	movzx	edx,bh
396	xor	r12,QWORD[6+rsi*8+rbp]
397	xor	r13,QWORD[5+rdi*8+rbp]
398	shr	ebx,16
399	lea	rsi,[rcx*1+rcx]
400	movzx	ecx,bl
401	lea	rdi,[rdx*1+rdx]
402	movzx	edx,bh
403	xor	r14,QWORD[4+rsi*8+rbp]
404	xor	r15,QWORD[3+rdi*8+rbp]
405	mov	ebx,DWORD[((64+16+8+4))+rsp]
406	lea	rsi,[rcx*1+rcx]
407	movzx	ecx,al
408	lea	rdi,[rdx*1+rdx]
409	movzx	edx,ah
410	xor	r8,QWORD[2+rsi*8+rbp]
411	xor	r9,QWORD[1+rdi*8+rbp]
412	shr	eax,16
413	lea	rsi,[rcx*1+rcx]
414	movzx	ecx,al
415	lea	rdi,[rdx*1+rdx]
416	movzx	edx,ah
417	xor	r11,QWORD[rsi*8+rbp]
418	xor	r12,QWORD[7+rdi*8+rbp]
419	mov	eax,DWORD[((64+24+8))+rsp]
420	lea	rsi,[rcx*1+rcx]
421	movzx	ecx,bl
422	lea	rdi,[rdx*1+rdx]
423	movzx	edx,bh
424	xor	r13,QWORD[6+rsi*8+rbp]
425	xor	r14,QWORD[5+rdi*8+rbp]
426	shr	ebx,16
427	lea	rsi,[rcx*1+rcx]
428	movzx	ecx,bl
429	lea	rdi,[rdx*1+rdx]
430	movzx	edx,bh
431	xor	r15,QWORD[4+rsi*8+rbp]
432	xor	r8,QWORD[3+rdi*8+rbp]
433	mov	ebx,DWORD[((64+24+8+4))+rsp]
434	lea	rsi,[rcx*1+rcx]
435	movzx	ecx,al
436	lea	rdi,[rdx*1+rdx]
437	movzx	edx,ah
438	xor	r9,QWORD[2+rsi*8+rbp]
439	xor	r10,QWORD[1+rdi*8+rbp]
440	shr	eax,16
441	lea	rsi,[rcx*1+rcx]
442	movzx	ecx,al
443	lea	rdi,[rdx*1+rdx]
444	movzx	edx,ah
445	xor	r12,QWORD[rsi*8+rbp]
446	xor	r13,QWORD[7+rdi*8+rbp]
447	mov	eax,DWORD[((64+32+8))+rsp]
448	lea	rsi,[rcx*1+rcx]
449	movzx	ecx,bl
450	lea	rdi,[rdx*1+rdx]
451	movzx	edx,bh
452	xor	r14,QWORD[6+rsi*8+rbp]
453	xor	r15,QWORD[5+rdi*8+rbp]
454	shr	ebx,16
455	lea	rsi,[rcx*1+rcx]
456	movzx	ecx,bl
457	lea	rdi,[rdx*1+rdx]
458	movzx	edx,bh
459	xor	r8,QWORD[4+rsi*8+rbp]
460	xor	r9,QWORD[3+rdi*8+rbp]
461	mov	ebx,DWORD[((64+32+8+4))+rsp]
462	lea	rsi,[rcx*1+rcx]
463	movzx	ecx,al
464	lea	rdi,[rdx*1+rdx]
465	movzx	edx,ah
466	xor	r10,QWORD[2+rsi*8+rbp]
467	xor	r11,QWORD[1+rdi*8+rbp]
468	shr	eax,16
469	lea	rsi,[rcx*1+rcx]
470	movzx	ecx,al
471	lea	rdi,[rdx*1+rdx]
472	movzx	edx,ah
473	xor	r13,QWORD[rsi*8+rbp]
474	xor	r14,QWORD[7+rdi*8+rbp]
475	mov	eax,DWORD[((64+40+8))+rsp]
476	lea	rsi,[rcx*1+rcx]
477	movzx	ecx,bl
478	lea	rdi,[rdx*1+rdx]
479	movzx	edx,bh
480	xor	r15,QWORD[6+rsi*8+rbp]
481	xor	r8,QWORD[5+rdi*8+rbp]
482	shr	ebx,16
483	lea	rsi,[rcx*1+rcx]
484	movzx	ecx,bl
485	lea	rdi,[rdx*1+rdx]
486	movzx	edx,bh
487	xor	r9,QWORD[4+rsi*8+rbp]
488	xor	r10,QWORD[3+rdi*8+rbp]
489	mov	ebx,DWORD[((64+40+8+4))+rsp]
490	lea	rsi,[rcx*1+rcx]
491	movzx	ecx,al
492	lea	rdi,[rdx*1+rdx]
493	movzx	edx,ah
494	xor	r11,QWORD[2+rsi*8+rbp]
495	xor	r12,QWORD[1+rdi*8+rbp]
496	shr	eax,16
497	lea	rsi,[rcx*1+rcx]
498	movzx	ecx,al
499	lea	rdi,[rdx*1+rdx]
500	movzx	edx,ah
501	xor	r14,QWORD[rsi*8+rbp]
502	xor	r15,QWORD[7+rdi*8+rbp]
503	mov	eax,DWORD[((64+48+8))+rsp]
504	lea	rsi,[rcx*1+rcx]
505	movzx	ecx,bl
506	lea	rdi,[rdx*1+rdx]
507	movzx	edx,bh
508	xor	r8,QWORD[6+rsi*8+rbp]
509	xor	r9,QWORD[5+rdi*8+rbp]
510	shr	ebx,16
511	lea	rsi,[rcx*1+rcx]
512	movzx	ecx,bl
513	lea	rdi,[rdx*1+rdx]
514	movzx	edx,bh
515	xor	r10,QWORD[4+rsi*8+rbp]
516	xor	r11,QWORD[3+rdi*8+rbp]
517	mov	ebx,DWORD[((64+48+8+4))+rsp]
518	lea	rsi,[rcx*1+rcx]
519	movzx	ecx,al
520	lea	rdi,[rdx*1+rdx]
521	movzx	edx,ah
522	xor	r12,QWORD[2+rsi*8+rbp]
523	xor	r13,QWORD[1+rdi*8+rbp]
524	shr	eax,16
525	lea	rsi,[rcx*1+rcx]
526	movzx	ecx,al
527	lea	rdi,[rdx*1+rdx]
528	movzx	edx,ah
529	xor	r15,QWORD[rsi*8+rbp]
530	xor	r8,QWORD[7+rdi*8+rbp]
531
532	lea	rsi,[rcx*1+rcx]
533	movzx	ecx,bl
534	lea	rdi,[rdx*1+rdx]
535	movzx	edx,bh
536	xor	r9,QWORD[6+rsi*8+rbp]
537	xor	r10,QWORD[5+rdi*8+rbp]
538	shr	ebx,16
539	lea	rsi,[rcx*1+rcx]
540	movzx	ecx,bl
541	lea	rdi,[rdx*1+rdx]
542	movzx	edx,bh
543	xor	r11,QWORD[4+rsi*8+rbp]
544	xor	r12,QWORD[3+rdi*8+rbp]
545
546	lea	rsi,[rcx*1+rcx]
547	movzx	ecx,al
548	lea	rdi,[rdx*1+rdx]
549	movzx	edx,ah
550	xor	r13,QWORD[2+rsi*8+rbp]
551	xor	r14,QWORD[1+rdi*8+rbp]
552	lea	rbx,[128+rsp]
553	mov	rsi,QWORD[24+rbx]
554	add	rsi,1
555	cmp	rsi,10
556	je	NEAR $L$roundsdone
557
558	mov	QWORD[24+rbx],rsi
559	mov	QWORD[((64+0))+rsp],r8
560	mov	QWORD[((64+8))+rsp],r9
561	mov	QWORD[((64+16))+rsp],r10
562	mov	QWORD[((64+24))+rsp],r11
563	mov	QWORD[((64+32))+rsp],r12
564	mov	QWORD[((64+40))+rsp],r13
565	mov	QWORD[((64+48))+rsp],r14
566	mov	QWORD[((64+56))+rsp],r15
567	jmp	NEAR $L$round
568ALIGN	16
569$L$roundsdone:
570	mov	rdi,QWORD[rbx]
571	mov	rsi,QWORD[8+rbx]
572	mov	rax,QWORD[16+rbx]
573	xor	r8,QWORD[rsi]
574	xor	r9,QWORD[8+rsi]
575	xor	r10,QWORD[16+rsi]
576	xor	r11,QWORD[24+rsi]
577	xor	r12,QWORD[32+rsi]
578	xor	r13,QWORD[40+rsi]
579	xor	r14,QWORD[48+rsi]
580	xor	r15,QWORD[56+rsi]
581	xor	r8,QWORD[rdi]
582	xor	r9,QWORD[8+rdi]
583	xor	r10,QWORD[16+rdi]
584	xor	r11,QWORD[24+rdi]
585	xor	r12,QWORD[32+rdi]
586	xor	r13,QWORD[40+rdi]
587	xor	r14,QWORD[48+rdi]
588	xor	r15,QWORD[56+rdi]
589	mov	QWORD[rdi],r8
590	mov	QWORD[8+rdi],r9
591	mov	QWORD[16+rdi],r10
592	mov	QWORD[24+rdi],r11
593	mov	QWORD[32+rdi],r12
594	mov	QWORD[40+rdi],r13
595	mov	QWORD[48+rdi],r14
596	mov	QWORD[56+rdi],r15
597	lea	rsi,[64+rsi]
598	sub	rax,1
599	jz	NEAR $L$alldone
600	mov	QWORD[8+rbx],rsi
601	mov	QWORD[16+rbx],rax
602	jmp	NEAR $L$outerloop
603$L$alldone:
604	mov	rsi,QWORD[32+rbx]
605
606	mov	r15,QWORD[((-48))+rsi]
607
608	mov	r14,QWORD[((-40))+rsi]
609
610	mov	r13,QWORD[((-32))+rsi]
611
612	mov	r12,QWORD[((-24))+rsi]
613
614	mov	rbp,QWORD[((-16))+rsi]
615
616	mov	rbx,QWORD[((-8))+rsi]
617
618	lea	rsp,[rsi]
619
620$L$epilogue:
621	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
622	mov	rsi,QWORD[16+rsp]
623	DB	0F3h,0C3h		;repret
624
625$L$SEH_end_whirlpool_block:
626
627ALIGN	64
628
629$L$table:
630DB	24,24,96,24,192,120,48,216,24,24,96,24,192,120,48,216
631DB	35,35,140,35,5,175,70,38,35,35,140,35,5,175,70,38
632DB	198,198,63,198,126,249,145,184,198,198,63,198,126,249,145,184
633DB	232,232,135,232,19,111,205,251,232,232,135,232,19,111,205,251
634DB	135,135,38,135,76,161,19,203,135,135,38,135,76,161,19,203
635DB	184,184,218,184,169,98,109,17,184,184,218,184,169,98,109,17
636DB	1,1,4,1,8,5,2,9,1,1,4,1,8,5,2,9
637DB	79,79,33,79,66,110,158,13,79,79,33,79,66,110,158,13
638DB	54,54,216,54,173,238,108,155,54,54,216,54,173,238,108,155
639DB	166,166,162,166,89,4,81,255,166,166,162,166,89,4,81,255
640DB	210,210,111,210,222,189,185,12,210,210,111,210,222,189,185,12
641DB	245,245,243,245,251,6,247,14,245,245,243,245,251,6,247,14
642DB	121,121,249,121,239,128,242,150,121,121,249,121,239,128,242,150
643DB	111,111,161,111,95,206,222,48,111,111,161,111,95,206,222,48
644DB	145,145,126,145,252,239,63,109,145,145,126,145,252,239,63,109
645DB	82,82,85,82,170,7,164,248,82,82,85,82,170,7,164,248
646DB	96,96,157,96,39,253,192,71,96,96,157,96,39,253,192,71
647DB	188,188,202,188,137,118,101,53,188,188,202,188,137,118,101,53
648DB	155,155,86,155,172,205,43,55,155,155,86,155,172,205,43,55
649DB	142,142,2,142,4,140,1,138,142,142,2,142,4,140,1,138
650DB	163,163,182,163,113,21,91,210,163,163,182,163,113,21,91,210
651DB	12,12,48,12,96,60,24,108,12,12,48,12,96,60,24,108
652DB	123,123,241,123,255,138,246,132,123,123,241,123,255,138,246,132
653DB	53,53,212,53,181,225,106,128,53,53,212,53,181,225,106,128
654DB	29,29,116,29,232,105,58,245,29,29,116,29,232,105,58,245
655DB	224,224,167,224,83,71,221,179,224,224,167,224,83,71,221,179
656DB	215,215,123,215,246,172,179,33,215,215,123,215,246,172,179,33
657DB	194,194,47,194,94,237,153,156,194,194,47,194,94,237,153,156
658DB	46,46,184,46,109,150,92,67,46,46,184,46,109,150,92,67
659DB	75,75,49,75,98,122,150,41,75,75,49,75,98,122,150,41
660DB	254,254,223,254,163,33,225,93,254,254,223,254,163,33,225,93
661DB	87,87,65,87,130,22,174,213,87,87,65,87,130,22,174,213
662DB	21,21,84,21,168,65,42,189,21,21,84,21,168,65,42,189
663DB	119,119,193,119,159,182,238,232,119,119,193,119,159,182,238,232
664DB	55,55,220,55,165,235,110,146,55,55,220,55,165,235,110,146
665DB	229,229,179,229,123,86,215,158,229,229,179,229,123,86,215,158
666DB	159,159,70,159,140,217,35,19,159,159,70,159,140,217,35,19
667DB	240,240,231,240,211,23,253,35,240,240,231,240,211,23,253,35
668DB	74,74,53,74,106,127,148,32,74,74,53,74,106,127,148,32
669DB	218,218,79,218,158,149,169,68,218,218,79,218,158,149,169,68
670DB	88,88,125,88,250,37,176,162,88,88,125,88,250,37,176,162
671DB	201,201,3,201,6,202,143,207,201,201,3,201,6,202,143,207
672DB	41,41,164,41,85,141,82,124,41,41,164,41,85,141,82,124
673DB	10,10,40,10,80,34,20,90,10,10,40,10,80,34,20,90
674DB	177,177,254,177,225,79,127,80,177,177,254,177,225,79,127,80
675DB	160,160,186,160,105,26,93,201,160,160,186,160,105,26,93,201
676DB	107,107,177,107,127,218,214,20,107,107,177,107,127,218,214,20
677DB	133,133,46,133,92,171,23,217,133,133,46,133,92,171,23,217
678DB	189,189,206,189,129,115,103,60,189,189,206,189,129,115,103,60
679DB	93,93,105,93,210,52,186,143,93,93,105,93,210,52,186,143
680DB	16,16,64,16,128,80,32,144,16,16,64,16,128,80,32,144
681DB	244,244,247,244,243,3,245,7,244,244,247,244,243,3,245,7
682DB	203,203,11,203,22,192,139,221,203,203,11,203,22,192,139,221
683DB	62,62,248,62,237,198,124,211,62,62,248,62,237,198,124,211
684DB	5,5,20,5,40,17,10,45,5,5,20,5,40,17,10,45
685DB	103,103,129,103,31,230,206,120,103,103,129,103,31,230,206,120
686DB	228,228,183,228,115,83,213,151,228,228,183,228,115,83,213,151
687DB	39,39,156,39,37,187,78,2,39,39,156,39,37,187,78,2
688DB	65,65,25,65,50,88,130,115,65,65,25,65,50,88,130,115
689DB	139,139,22,139,44,157,11,167,139,139,22,139,44,157,11,167
690DB	167,167,166,167,81,1,83,246,167,167,166,167,81,1,83,246
691DB	125,125,233,125,207,148,250,178,125,125,233,125,207,148,250,178
692DB	149,149,110,149,220,251,55,73,149,149,110,149,220,251,55,73
693DB	216,216,71,216,142,159,173,86,216,216,71,216,142,159,173,86
694DB	251,251,203,251,139,48,235,112,251,251,203,251,139,48,235,112
695DB	238,238,159,238,35,113,193,205,238,238,159,238,35,113,193,205
696DB	124,124,237,124,199,145,248,187,124,124,237,124,199,145,248,187
697DB	102,102,133,102,23,227,204,113,102,102,133,102,23,227,204,113
698DB	221,221,83,221,166,142,167,123,221,221,83,221,166,142,167,123
699DB	23,23,92,23,184,75,46,175,23,23,92,23,184,75,46,175
700DB	71,71,1,71,2,70,142,69,71,71,1,71,2,70,142,69
701DB	158,158,66,158,132,220,33,26,158,158,66,158,132,220,33,26
702DB	202,202,15,202,30,197,137,212,202,202,15,202,30,197,137,212
703DB	45,45,180,45,117,153,90,88,45,45,180,45,117,153,90,88
704DB	191,191,198,191,145,121,99,46,191,191,198,191,145,121,99,46
705DB	7,7,28,7,56,27,14,63,7,7,28,7,56,27,14,63
706DB	173,173,142,173,1,35,71,172,173,173,142,173,1,35,71,172
707DB	90,90,117,90,234,47,180,176,90,90,117,90,234,47,180,176
708DB	131,131,54,131,108,181,27,239,131,131,54,131,108,181,27,239
709DB	51,51,204,51,133,255,102,182,51,51,204,51,133,255,102,182
710DB	99,99,145,99,63,242,198,92,99,99,145,99,63,242,198,92
711DB	2,2,8,2,16,10,4,18,2,2,8,2,16,10,4,18
712DB	170,170,146,170,57,56,73,147,170,170,146,170,57,56,73,147
713DB	113,113,217,113,175,168,226,222,113,113,217,113,175,168,226,222
714DB	200,200,7,200,14,207,141,198,200,200,7,200,14,207,141,198
715DB	25,25,100,25,200,125,50,209,25,25,100,25,200,125,50,209
716DB	73,73,57,73,114,112,146,59,73,73,57,73,114,112,146,59
717DB	217,217,67,217,134,154,175,95,217,217,67,217,134,154,175,95
718DB	242,242,239,242,195,29,249,49,242,242,239,242,195,29,249,49
719DB	227,227,171,227,75,72,219,168,227,227,171,227,75,72,219,168
720DB	91,91,113,91,226,42,182,185,91,91,113,91,226,42,182,185
721DB	136,136,26,136,52,146,13,188,136,136,26,136,52,146,13,188
722DB	154,154,82,154,164,200,41,62,154,154,82,154,164,200,41,62
723DB	38,38,152,38,45,190,76,11,38,38,152,38,45,190,76,11
724DB	50,50,200,50,141,250,100,191,50,50,200,50,141,250,100,191
725DB	176,176,250,176,233,74,125,89,176,176,250,176,233,74,125,89
726DB	233,233,131,233,27,106,207,242,233,233,131,233,27,106,207,242
727DB	15,15,60,15,120,51,30,119,15,15,60,15,120,51,30,119
728DB	213,213,115,213,230,166,183,51,213,213,115,213,230,166,183,51
729DB	128,128,58,128,116,186,29,244,128,128,58,128,116,186,29,244
730DB	190,190,194,190,153,124,97,39,190,190,194,190,153,124,97,39
731DB	205,205,19,205,38,222,135,235,205,205,19,205,38,222,135,235
732DB	52,52,208,52,189,228,104,137,52,52,208,52,189,228,104,137
733DB	72,72,61,72,122,117,144,50,72,72,61,72,122,117,144,50
734DB	255,255,219,255,171,36,227,84,255,255,219,255,171,36,227,84
735DB	122,122,245,122,247,143,244,141,122,122,245,122,247,143,244,141
736DB	144,144,122,144,244,234,61,100,144,144,122,144,244,234,61,100
737DB	95,95,97,95,194,62,190,157,95,95,97,95,194,62,190,157
738DB	32,32,128,32,29,160,64,61,32,32,128,32,29,160,64,61
739DB	104,104,189,104,103,213,208,15,104,104,189,104,103,213,208,15
740DB	26,26,104,26,208,114,52,202,26,26,104,26,208,114,52,202
741DB	174,174,130,174,25,44,65,183,174,174,130,174,25,44,65,183
742DB	180,180,234,180,201,94,117,125,180,180,234,180,201,94,117,125
743DB	84,84,77,84,154,25,168,206,84,84,77,84,154,25,168,206
744DB	147,147,118,147,236,229,59,127,147,147,118,147,236,229,59,127
745DB	34,34,136,34,13,170,68,47,34,34,136,34,13,170,68,47
746DB	100,100,141,100,7,233,200,99,100,100,141,100,7,233,200,99
747DB	241,241,227,241,219,18,255,42,241,241,227,241,219,18,255,42
748DB	115,115,209,115,191,162,230,204,115,115,209,115,191,162,230,204
749DB	18,18,72,18,144,90,36,130,18,18,72,18,144,90,36,130
750DB	64,64,29,64,58,93,128,122,64,64,29,64,58,93,128,122
751DB	8,8,32,8,64,40,16,72,8,8,32,8,64,40,16,72
752DB	195,195,43,195,86,232,155,149,195,195,43,195,86,232,155,149
753DB	236,236,151,236,51,123,197,223,236,236,151,236,51,123,197,223
754DB	219,219,75,219,150,144,171,77,219,219,75,219,150,144,171,77
755DB	161,161,190,161,97,31,95,192,161,161,190,161,97,31,95,192
756DB	141,141,14,141,28,131,7,145,141,141,14,141,28,131,7,145
757DB	61,61,244,61,245,201,122,200,61,61,244,61,245,201,122,200
758DB	151,151,102,151,204,241,51,91,151,151,102,151,204,241,51,91
759DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
760DB	207,207,27,207,54,212,131,249,207,207,27,207,54,212,131,249
761DB	43,43,172,43,69,135,86,110,43,43,172,43,69,135,86,110
762DB	118,118,197,118,151,179,236,225,118,118,197,118,151,179,236,225
763DB	130,130,50,130,100,176,25,230,130,130,50,130,100,176,25,230
764DB	214,214,127,214,254,169,177,40,214,214,127,214,254,169,177,40
765DB	27,27,108,27,216,119,54,195,27,27,108,27,216,119,54,195
766DB	181,181,238,181,193,91,119,116,181,181,238,181,193,91,119,116
767DB	175,175,134,175,17,41,67,190,175,175,134,175,17,41,67,190
768DB	106,106,181,106,119,223,212,29,106,106,181,106,119,223,212,29
769DB	80,80,93,80,186,13,160,234,80,80,93,80,186,13,160,234
770DB	69,69,9,69,18,76,138,87,69,69,9,69,18,76,138,87
771DB	243,243,235,243,203,24,251,56,243,243,235,243,203,24,251,56
772DB	48,48,192,48,157,240,96,173,48,48,192,48,157,240,96,173
773DB	239,239,155,239,43,116,195,196,239,239,155,239,43,116,195,196
774DB	63,63,252,63,229,195,126,218,63,63,252,63,229,195,126,218
775DB	85,85,73,85,146,28,170,199,85,85,73,85,146,28,170,199
776DB	162,162,178,162,121,16,89,219,162,162,178,162,121,16,89,219
777DB	234,234,143,234,3,101,201,233,234,234,143,234,3,101,201,233
778DB	101,101,137,101,15,236,202,106,101,101,137,101,15,236,202,106
779DB	186,186,210,186,185,104,105,3,186,186,210,186,185,104,105,3
780DB	47,47,188,47,101,147,94,74,47,47,188,47,101,147,94,74
781DB	192,192,39,192,78,231,157,142,192,192,39,192,78,231,157,142
782DB	222,222,95,222,190,129,161,96,222,222,95,222,190,129,161,96
783DB	28,28,112,28,224,108,56,252,28,28,112,28,224,108,56,252
784DB	253,253,211,253,187,46,231,70,253,253,211,253,187,46,231,70
785DB	77,77,41,77,82,100,154,31,77,77,41,77,82,100,154,31
786DB	146,146,114,146,228,224,57,118,146,146,114,146,228,224,57,118
787DB	117,117,201,117,143,188,234,250,117,117,201,117,143,188,234,250
788DB	6,6,24,6,48,30,12,54,6,6,24,6,48,30,12,54
789DB	138,138,18,138,36,152,9,174,138,138,18,138,36,152,9,174
790DB	178,178,242,178,249,64,121,75,178,178,242,178,249,64,121,75
791DB	230,230,191,230,99,89,209,133,230,230,191,230,99,89,209,133
792DB	14,14,56,14,112,54,28,126,14,14,56,14,112,54,28,126
793DB	31,31,124,31,248,99,62,231,31,31,124,31,248,99,62,231
794DB	98,98,149,98,55,247,196,85,98,98,149,98,55,247,196,85
795DB	212,212,119,212,238,163,181,58,212,212,119,212,238,163,181,58
796DB	168,168,154,168,41,50,77,129,168,168,154,168,41,50,77,129
797DB	150,150,98,150,196,244,49,82,150,150,98,150,196,244,49,82
798DB	249,249,195,249,155,58,239,98,249,249,195,249,155,58,239,98
799DB	197,197,51,197,102,246,151,163,197,197,51,197,102,246,151,163
800DB	37,37,148,37,53,177,74,16,37,37,148,37,53,177,74,16
801DB	89,89,121,89,242,32,178,171,89,89,121,89,242,32,178,171
802DB	132,132,42,132,84,174,21,208,132,132,42,132,84,174,21,208
803DB	114,114,213,114,183,167,228,197,114,114,213,114,183,167,228,197
804DB	57,57,228,57,213,221,114,236,57,57,228,57,213,221,114,236
805DB	76,76,45,76,90,97,152,22,76,76,45,76,90,97,152,22
806DB	94,94,101,94,202,59,188,148,94,94,101,94,202,59,188,148
807DB	120,120,253,120,231,133,240,159,120,120,253,120,231,133,240,159
808DB	56,56,224,56,221,216,112,229,56,56,224,56,221,216,112,229
809DB	140,140,10,140,20,134,5,152,140,140,10,140,20,134,5,152
810DB	209,209,99,209,198,178,191,23,209,209,99,209,198,178,191,23
811DB	165,165,174,165,65,11,87,228,165,165,174,165,65,11,87,228
812DB	226,226,175,226,67,77,217,161,226,226,175,226,67,77,217,161
813DB	97,97,153,97,47,248,194,78,97,97,153,97,47,248,194,78
814DB	179,179,246,179,241,69,123,66,179,179,246,179,241,69,123,66
815DB	33,33,132,33,21,165,66,52,33,33,132,33,21,165,66,52
816DB	156,156,74,156,148,214,37,8,156,156,74,156,148,214,37,8
817DB	30,30,120,30,240,102,60,238,30,30,120,30,240,102,60,238
818DB	67,67,17,67,34,82,134,97,67,67,17,67,34,82,134,97
819DB	199,199,59,199,118,252,147,177,199,199,59,199,118,252,147,177
820DB	252,252,215,252,179,43,229,79,252,252,215,252,179,43,229,79
821DB	4,4,16,4,32,20,8,36,4,4,16,4,32,20,8,36
822DB	81,81,89,81,178,8,162,227,81,81,89,81,178,8,162,227
823DB	153,153,94,153,188,199,47,37,153,153,94,153,188,199,47,37
824DB	109,109,169,109,79,196,218,34,109,109,169,109,79,196,218,34
825DB	13,13,52,13,104,57,26,101,13,13,52,13,104,57,26,101
826DB	250,250,207,250,131,53,233,121,250,250,207,250,131,53,233,121
827DB	223,223,91,223,182,132,163,105,223,223,91,223,182,132,163,105
828DB	126,126,229,126,215,155,252,169,126,126,229,126,215,155,252,169
829DB	36,36,144,36,61,180,72,25,36,36,144,36,61,180,72,25
830DB	59,59,236,59,197,215,118,254,59,59,236,59,197,215,118,254
831DB	171,171,150,171,49,61,75,154,171,171,150,171,49,61,75,154
832DB	206,206,31,206,62,209,129,240,206,206,31,206,62,209,129,240
833DB	17,17,68,17,136,85,34,153,17,17,68,17,136,85,34,153
834DB	143,143,6,143,12,137,3,131,143,143,6,143,12,137,3,131
835DB	78,78,37,78,74,107,156,4,78,78,37,78,74,107,156,4
836DB	183,183,230,183,209,81,115,102,183,183,230,183,209,81,115,102
837DB	235,235,139,235,11,96,203,224,235,235,139,235,11,96,203,224
838DB	60,60,240,60,253,204,120,193,60,60,240,60,253,204,120,193
839DB	129,129,62,129,124,191,31,253,129,129,62,129,124,191,31,253
840DB	148,148,106,148,212,254,53,64,148,148,106,148,212,254,53,64
841DB	247,247,251,247,235,12,243,28,247,247,251,247,235,12,243,28
842DB	185,185,222,185,161,103,111,24,185,185,222,185,161,103,111,24
843DB	19,19,76,19,152,95,38,139,19,19,76,19,152,95,38,139
844DB	44,44,176,44,125,156,88,81,44,44,176,44,125,156,88,81
845DB	211,211,107,211,214,184,187,5,211,211,107,211,214,184,187,5
846DB	231,231,187,231,107,92,211,140,231,231,187,231,107,92,211,140
847DB	110,110,165,110,87,203,220,57,110,110,165,110,87,203,220,57
848DB	196,196,55,196,110,243,149,170,196,196,55,196,110,243,149,170
849DB	3,3,12,3,24,15,6,27,3,3,12,3,24,15,6,27
850DB	86,86,69,86,138,19,172,220,86,86,69,86,138,19,172,220
851DB	68,68,13,68,26,73,136,94,68,68,13,68,26,73,136,94
852DB	127,127,225,127,223,158,254,160,127,127,225,127,223,158,254,160
853DB	169,169,158,169,33,55,79,136,169,169,158,169,33,55,79,136
854DB	42,42,168,42,77,130,84,103,42,42,168,42,77,130,84,103
855DB	187,187,214,187,177,109,107,10,187,187,214,187,177,109,107,10
856DB	193,193,35,193,70,226,159,135,193,193,35,193,70,226,159,135
857DB	83,83,81,83,162,2,166,241,83,83,81,83,162,2,166,241
858DB	220,220,87,220,174,139,165,114,220,220,87,220,174,139,165,114
859DB	11,11,44,11,88,39,22,83,11,11,44,11,88,39,22,83
860DB	157,157,78,157,156,211,39,1,157,157,78,157,156,211,39,1
861DB	108,108,173,108,71,193,216,43,108,108,173,108,71,193,216,43
862DB	49,49,196,49,149,245,98,164,49,49,196,49,149,245,98,164
863DB	116,116,205,116,135,185,232,243,116,116,205,116,135,185,232,243
864DB	246,246,255,246,227,9,241,21,246,246,255,246,227,9,241,21
865DB	70,70,5,70,10,67,140,76,70,70,5,70,10,67,140,76
866DB	172,172,138,172,9,38,69,165,172,172,138,172,9,38,69,165
867DB	137,137,30,137,60,151,15,181,137,137,30,137,60,151,15,181
868DB	20,20,80,20,160,68,40,180,20,20,80,20,160,68,40,180
869DB	225,225,163,225,91,66,223,186,225,225,163,225,91,66,223,186
870DB	22,22,88,22,176,78,44,166,22,22,88,22,176,78,44,166
871DB	58,58,232,58,205,210,116,247,58,58,232,58,205,210,116,247
872DB	105,105,185,105,111,208,210,6,105,105,185,105,111,208,210,6
873DB	9,9,36,9,72,45,18,65,9,9,36,9,72,45,18,65
874DB	112,112,221,112,167,173,224,215,112,112,221,112,167,173,224,215
875DB	182,182,226,182,217,84,113,111,182,182,226,182,217,84,113,111
876DB	208,208,103,208,206,183,189,30,208,208,103,208,206,183,189,30
877DB	237,237,147,237,59,126,199,214,237,237,147,237,59,126,199,214
878DB	204,204,23,204,46,219,133,226,204,204,23,204,46,219,133,226
879DB	66,66,21,66,42,87,132,104,66,66,21,66,42,87,132,104
880DB	152,152,90,152,180,194,45,44,152,152,90,152,180,194,45,44
881DB	164,164,170,164,73,14,85,237,164,164,170,164,73,14,85,237
882DB	40,40,160,40,93,136,80,117,40,40,160,40,93,136,80,117
883DB	92,92,109,92,218,49,184,134,92,92,109,92,218,49,184,134
884DB	248,248,199,248,147,63,237,107,248,248,199,248,147,63,237,107
885DB	134,134,34,134,68,164,17,194,134,134,34,134,68,164,17,194
886DB	24,35,198,232,135,184,1,79
887DB	54,166,210,245,121,111,145,82
888DB	96,188,155,142,163,12,123,53
889DB	29,224,215,194,46,75,254,87
890DB	21,119,55,229,159,240,74,218
891DB	88,201,41,10,177,160,107,133
892DB	189,93,16,244,203,62,5,103
893DB	228,39,65,139,167,125,149,216
894DB	251,238,124,102,221,23,71,158
895DB	202,45,191,7,173,90,131,51
896EXTERN	__imp_RtlVirtualUnwind
897
898ALIGN	16
899se_handler:
900	push	rsi
901	push	rdi
902	push	rbx
903	push	rbp
904	push	r12
905	push	r13
906	push	r14
907	push	r15
908	pushfq
909	sub	rsp,64
910
911	mov	rax,QWORD[120+r8]
912	mov	rbx,QWORD[248+r8]
913
914	lea	r10,[$L$prologue]
915	cmp	rbx,r10
916	jb	NEAR $L$in_prologue
917
918	mov	rax,QWORD[152+r8]
919
920	lea	r10,[$L$epilogue]
921	cmp	rbx,r10
922	jae	NEAR $L$in_prologue
923
924	mov	rax,QWORD[((128+32))+rax]
925
926	mov	rbx,QWORD[((-8))+rax]
927	mov	rbp,QWORD[((-16))+rax]
928	mov	r12,QWORD[((-24))+rax]
929	mov	r13,QWORD[((-32))+rax]
930	mov	r14,QWORD[((-40))+rax]
931	mov	r15,QWORD[((-48))+rax]
932	mov	QWORD[144+r8],rbx
933	mov	QWORD[160+r8],rbp
934	mov	QWORD[216+r8],r12
935	mov	QWORD[224+r8],r13
936	mov	QWORD[232+r8],r14
937	mov	QWORD[240+r8],r15
938
939$L$in_prologue:
940	mov	rdi,QWORD[8+rax]
941	mov	rsi,QWORD[16+rax]
942	mov	QWORD[152+r8],rax
943	mov	QWORD[168+r8],rsi
944	mov	QWORD[176+r8],rdi
945
946	mov	rdi,QWORD[40+r9]
947	mov	rsi,r8
948	mov	ecx,154
949	DD	0xa548f3fc
950
951	mov	rsi,r9
952	xor	rcx,rcx
953	mov	rdx,QWORD[8+rsi]
954	mov	r8,QWORD[rsi]
955	mov	r9,QWORD[16+rsi]
956	mov	r10,QWORD[40+rsi]
957	lea	r11,[56+rsi]
958	lea	r12,[24+rsi]
959	mov	QWORD[32+rsp],r10
960	mov	QWORD[40+rsp],r11
961	mov	QWORD[48+rsp],r12
962	mov	QWORD[56+rsp],rcx
963	call	QWORD[__imp_RtlVirtualUnwind]
964
965	mov	eax,1
966	add	rsp,64
967	popfq
968	pop	r15
969	pop	r14
970	pop	r13
971	pop	r12
972	pop	rbp
973	pop	rbx
974	pop	rdi
975	pop	rsi
976	DB	0F3h,0C3h		;repret
977
978
979section	.pdata rdata align=4
980ALIGN	4
981	DD	$L$SEH_begin_whirlpool_block wrt ..imagebase
982	DD	$L$SEH_end_whirlpool_block wrt ..imagebase
983	DD	$L$SEH_info_whirlpool_block wrt ..imagebase
984
985section	.xdata rdata align=8
986ALIGN	8
987$L$SEH_info_whirlpool_block:
988DB	9,0,0,0
989	DD	se_handler wrt ..imagebase
990