1OPTION	DOTNAME
2.text$	SEGMENT ALIGN(256) 'CODE'
3EXTERN	OPENSSL_ia32cap_P:NEAR
4
5PUBLIC	gcm_gmult_4bit
6
7ALIGN	16
8gcm_gmult_4bit	PROC PUBLIC
9	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
10	mov	QWORD PTR[16+rsp],rsi
11	mov	rax,rsp
12$L$SEH_begin_gcm_gmult_4bit::
13	mov	rdi,rcx
14	mov	rsi,rdx
15
16
17	push	rbx
18	push	rbp
19	push	r12
20$L$gmult_prologue::
21
22	movzx	r8,BYTE PTR[15+rdi]
23	lea	r11,QWORD PTR[$L$rem_4bit]
24	xor	rax,rax
25	xor	rbx,rbx
26	mov	al,r8b
27	mov	bl,r8b
28	shl	al,4
29	mov	rcx,14
30	mov	r8,QWORD PTR[8+rax*1+rsi]
31	mov	r9,QWORD PTR[rax*1+rsi]
32	and	bl,0f0h
33	mov	rdx,r8
34	jmp	$L$oop1
35
36ALIGN	16
37$L$oop1::
38	shr	r8,4
39	and	rdx,0fh
40	mov	r10,r9
41	mov	al,BYTE PTR[rcx*1+rdi]
42	shr	r9,4
43	xor	r8,QWORD PTR[8+rbx*1+rsi]
44	shl	r10,60
45	xor	r9,QWORD PTR[rbx*1+rsi]
46	mov	bl,al
47	xor	r9,QWORD PTR[rdx*8+r11]
48	mov	rdx,r8
49	shl	al,4
50	xor	r8,r10
51	dec	rcx
52	js	$L$break1
53
54	shr	r8,4
55	and	rdx,0fh
56	mov	r10,r9
57	shr	r9,4
58	xor	r8,QWORD PTR[8+rax*1+rsi]
59	shl	r10,60
60	xor	r9,QWORD PTR[rax*1+rsi]
61	and	bl,0f0h
62	xor	r9,QWORD PTR[rdx*8+r11]
63	mov	rdx,r8
64	xor	r8,r10
65	jmp	$L$oop1
66
67ALIGN	16
68$L$break1::
69	shr	r8,4
70	and	rdx,0fh
71	mov	r10,r9
72	shr	r9,4
73	xor	r8,QWORD PTR[8+rax*1+rsi]
74	shl	r10,60
75	xor	r9,QWORD PTR[rax*1+rsi]
76	and	bl,0f0h
77	xor	r9,QWORD PTR[rdx*8+r11]
78	mov	rdx,r8
79	xor	r8,r10
80
81	shr	r8,4
82	and	rdx,0fh
83	mov	r10,r9
84	shr	r9,4
85	xor	r8,QWORD PTR[8+rbx*1+rsi]
86	shl	r10,60
87	xor	r9,QWORD PTR[rbx*1+rsi]
88	xor	r8,r10
89	xor	r9,QWORD PTR[rdx*8+r11]
90
91	bswap	r8
92	bswap	r9
93	mov	QWORD PTR[8+rdi],r8
94	mov	QWORD PTR[rdi],r9
95
96	mov	rbx,QWORD PTR[16+rsp]
97	lea	rsp,QWORD PTR[24+rsp]
98$L$gmult_epilogue::
99	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
100	mov	rsi,QWORD PTR[16+rsp]
101	DB	0F3h,0C3h		;repret
102$L$SEH_end_gcm_gmult_4bit::
103gcm_gmult_4bit	ENDP
104PUBLIC	gcm_ghash_4bit
105
106ALIGN	16
107gcm_ghash_4bit	PROC PUBLIC
108	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
109	mov	QWORD PTR[16+rsp],rsi
110	mov	rax,rsp
111$L$SEH_begin_gcm_ghash_4bit::
112	mov	rdi,rcx
113	mov	rsi,rdx
114	mov	rdx,r8
115	mov	rcx,r9
116
117
118	push	rbx
119	push	rbp
120	push	r12
121	push	r13
122	push	r14
123	push	r15
124	sub	rsp,280
125$L$ghash_prologue::
126	mov	r14,rdx
127	mov	r15,rcx
128	sub	rsi,-128
129	lea	rbp,QWORD PTR[((16+128))+rsp]
130	xor	edx,edx
131	mov	r8,QWORD PTR[((0+0-128))+rsi]
132	mov	rax,QWORD PTR[((0+8-128))+rsi]
133	mov	dl,al
134	shr	rax,4
135	mov	r10,r8
136	shr	r8,4
137	mov	r9,QWORD PTR[((16+0-128))+rsi]
138	shl	dl,4
139	mov	rbx,QWORD PTR[((16+8-128))+rsi]
140	shl	r10,60
141	mov	BYTE PTR[rsp],dl
142	or	rax,r10
143	mov	dl,bl
144	shr	rbx,4
145	mov	r10,r9
146	shr	r9,4
147	mov	QWORD PTR[rbp],r8
148	mov	r8,QWORD PTR[((32+0-128))+rsi]
149	shl	dl,4
150	mov	QWORD PTR[((0-128))+rbp],rax
151	mov	rax,QWORD PTR[((32+8-128))+rsi]
152	shl	r10,60
153	mov	BYTE PTR[1+rsp],dl
154	or	rbx,r10
155	mov	dl,al
156	shr	rax,4
157	mov	r10,r8
158	shr	r8,4
159	mov	QWORD PTR[8+rbp],r9
160	mov	r9,QWORD PTR[((48+0-128))+rsi]
161	shl	dl,4
162	mov	QWORD PTR[((8-128))+rbp],rbx
163	mov	rbx,QWORD PTR[((48+8-128))+rsi]
164	shl	r10,60
165	mov	BYTE PTR[2+rsp],dl
166	or	rax,r10
167	mov	dl,bl
168	shr	rbx,4
169	mov	r10,r9
170	shr	r9,4
171	mov	QWORD PTR[16+rbp],r8
172	mov	r8,QWORD PTR[((64+0-128))+rsi]
173	shl	dl,4
174	mov	QWORD PTR[((16-128))+rbp],rax
175	mov	rax,QWORD PTR[((64+8-128))+rsi]
176	shl	r10,60
177	mov	BYTE PTR[3+rsp],dl
178	or	rbx,r10
179	mov	dl,al
180	shr	rax,4
181	mov	r10,r8
182	shr	r8,4
183	mov	QWORD PTR[24+rbp],r9
184	mov	r9,QWORD PTR[((80+0-128))+rsi]
185	shl	dl,4
186	mov	QWORD PTR[((24-128))+rbp],rbx
187	mov	rbx,QWORD PTR[((80+8-128))+rsi]
188	shl	r10,60
189	mov	BYTE PTR[4+rsp],dl
190	or	rax,r10
191	mov	dl,bl
192	shr	rbx,4
193	mov	r10,r9
194	shr	r9,4
195	mov	QWORD PTR[32+rbp],r8
196	mov	r8,QWORD PTR[((96+0-128))+rsi]
197	shl	dl,4
198	mov	QWORD PTR[((32-128))+rbp],rax
199	mov	rax,QWORD PTR[((96+8-128))+rsi]
200	shl	r10,60
201	mov	BYTE PTR[5+rsp],dl
202	or	rbx,r10
203	mov	dl,al
204	shr	rax,4
205	mov	r10,r8
206	shr	r8,4
207	mov	QWORD PTR[40+rbp],r9
208	mov	r9,QWORD PTR[((112+0-128))+rsi]
209	shl	dl,4
210	mov	QWORD PTR[((40-128))+rbp],rbx
211	mov	rbx,QWORD PTR[((112+8-128))+rsi]
212	shl	r10,60
213	mov	BYTE PTR[6+rsp],dl
214	or	rax,r10
215	mov	dl,bl
216	shr	rbx,4
217	mov	r10,r9
218	shr	r9,4
219	mov	QWORD PTR[48+rbp],r8
220	mov	r8,QWORD PTR[((128+0-128))+rsi]
221	shl	dl,4
222	mov	QWORD PTR[((48-128))+rbp],rax
223	mov	rax,QWORD PTR[((128+8-128))+rsi]
224	shl	r10,60
225	mov	BYTE PTR[7+rsp],dl
226	or	rbx,r10
227	mov	dl,al
228	shr	rax,4
229	mov	r10,r8
230	shr	r8,4
231	mov	QWORD PTR[56+rbp],r9
232	mov	r9,QWORD PTR[((144+0-128))+rsi]
233	shl	dl,4
234	mov	QWORD PTR[((56-128))+rbp],rbx
235	mov	rbx,QWORD PTR[((144+8-128))+rsi]
236	shl	r10,60
237	mov	BYTE PTR[8+rsp],dl
238	or	rax,r10
239	mov	dl,bl
240	shr	rbx,4
241	mov	r10,r9
242	shr	r9,4
243	mov	QWORD PTR[64+rbp],r8
244	mov	r8,QWORD PTR[((160+0-128))+rsi]
245	shl	dl,4
246	mov	QWORD PTR[((64-128))+rbp],rax
247	mov	rax,QWORD PTR[((160+8-128))+rsi]
248	shl	r10,60
249	mov	BYTE PTR[9+rsp],dl
250	or	rbx,r10
251	mov	dl,al
252	shr	rax,4
253	mov	r10,r8
254	shr	r8,4
255	mov	QWORD PTR[72+rbp],r9
256	mov	r9,QWORD PTR[((176+0-128))+rsi]
257	shl	dl,4
258	mov	QWORD PTR[((72-128))+rbp],rbx
259	mov	rbx,QWORD PTR[((176+8-128))+rsi]
260	shl	r10,60
261	mov	BYTE PTR[10+rsp],dl
262	or	rax,r10
263	mov	dl,bl
264	shr	rbx,4
265	mov	r10,r9
266	shr	r9,4
267	mov	QWORD PTR[80+rbp],r8
268	mov	r8,QWORD PTR[((192+0-128))+rsi]
269	shl	dl,4
270	mov	QWORD PTR[((80-128))+rbp],rax
271	mov	rax,QWORD PTR[((192+8-128))+rsi]
272	shl	r10,60
273	mov	BYTE PTR[11+rsp],dl
274	or	rbx,r10
275	mov	dl,al
276	shr	rax,4
277	mov	r10,r8
278	shr	r8,4
279	mov	QWORD PTR[88+rbp],r9
280	mov	r9,QWORD PTR[((208+0-128))+rsi]
281	shl	dl,4
282	mov	QWORD PTR[((88-128))+rbp],rbx
283	mov	rbx,QWORD PTR[((208+8-128))+rsi]
284	shl	r10,60
285	mov	BYTE PTR[12+rsp],dl
286	or	rax,r10
287	mov	dl,bl
288	shr	rbx,4
289	mov	r10,r9
290	shr	r9,4
291	mov	QWORD PTR[96+rbp],r8
292	mov	r8,QWORD PTR[((224+0-128))+rsi]
293	shl	dl,4
294	mov	QWORD PTR[((96-128))+rbp],rax
295	mov	rax,QWORD PTR[((224+8-128))+rsi]
296	shl	r10,60
297	mov	BYTE PTR[13+rsp],dl
298	or	rbx,r10
299	mov	dl,al
300	shr	rax,4
301	mov	r10,r8
302	shr	r8,4
303	mov	QWORD PTR[104+rbp],r9
304	mov	r9,QWORD PTR[((240+0-128))+rsi]
305	shl	dl,4
306	mov	QWORD PTR[((104-128))+rbp],rbx
307	mov	rbx,QWORD PTR[((240+8-128))+rsi]
308	shl	r10,60
309	mov	BYTE PTR[14+rsp],dl
310	or	rax,r10
311	mov	dl,bl
312	shr	rbx,4
313	mov	r10,r9
314	shr	r9,4
315	mov	QWORD PTR[112+rbp],r8
316	shl	dl,4
317	mov	QWORD PTR[((112-128))+rbp],rax
318	shl	r10,60
319	mov	BYTE PTR[15+rsp],dl
320	or	rbx,r10
321	mov	QWORD PTR[120+rbp],r9
322	mov	QWORD PTR[((120-128))+rbp],rbx
323	add	rsi,-128
324	mov	r8,QWORD PTR[8+rdi]
325	mov	r9,QWORD PTR[rdi]
326	add	r15,r14
327	lea	r11,QWORD PTR[$L$rem_8bit]
328	jmp	$L$outer_loop
329ALIGN	16
330$L$outer_loop::
331	xor	r9,QWORD PTR[r14]
332	mov	rdx,QWORD PTR[8+r14]
333	lea	r14,QWORD PTR[16+r14]
334	xor	rdx,r8
335	mov	QWORD PTR[rdi],r9
336	mov	QWORD PTR[8+rdi],rdx
337	shr	rdx,32
338	xor	rax,rax
339	rol	edx,8
340	mov	al,dl
341	movzx	ebx,dl
342	shl	al,4
343	shr	ebx,4
344	rol	edx,8
345	mov	r8,QWORD PTR[8+rax*1+rsi]
346	mov	r9,QWORD PTR[rax*1+rsi]
347	mov	al,dl
348	movzx	ecx,dl
349	shl	al,4
350	movzx	r12,BYTE PTR[rbx*1+rsp]
351	shr	ecx,4
352	xor	r12,r8
353	mov	r10,r9
354	shr	r8,8
355	movzx	r12,r12b
356	shr	r9,8
357	xor	r8,QWORD PTR[((-128))+rbx*8+rbp]
358	shl	r10,56
359	xor	r9,QWORD PTR[rbx*8+rbp]
360	rol	edx,8
361	xor	r8,QWORD PTR[8+rax*1+rsi]
362	xor	r9,QWORD PTR[rax*1+rsi]
363	mov	al,dl
364	xor	r8,r10
365	movzx	r12,WORD PTR[r12*2+r11]
366	movzx	ebx,dl
367	shl	al,4
368	movzx	r13,BYTE PTR[rcx*1+rsp]
369	shr	ebx,4
370	shl	r12,48
371	xor	r13,r8
372	mov	r10,r9
373	xor	r9,r12
374	shr	r8,8
375	movzx	r13,r13b
376	shr	r9,8
377	xor	r8,QWORD PTR[((-128))+rcx*8+rbp]
378	shl	r10,56
379	xor	r9,QWORD PTR[rcx*8+rbp]
380	rol	edx,8
381	xor	r8,QWORD PTR[8+rax*1+rsi]
382	xor	r9,QWORD PTR[rax*1+rsi]
383	mov	al,dl
384	xor	r8,r10
385	movzx	r13,WORD PTR[r13*2+r11]
386	movzx	ecx,dl
387	shl	al,4
388	movzx	r12,BYTE PTR[rbx*1+rsp]
389	shr	ecx,4
390	shl	r13,48
391	xor	r12,r8
392	mov	r10,r9
393	xor	r9,r13
394	shr	r8,8
395	movzx	r12,r12b
396	mov	edx,DWORD PTR[8+rdi]
397	shr	r9,8
398	xor	r8,QWORD PTR[((-128))+rbx*8+rbp]
399	shl	r10,56
400	xor	r9,QWORD PTR[rbx*8+rbp]
401	rol	edx,8
402	xor	r8,QWORD PTR[8+rax*1+rsi]
403	xor	r9,QWORD PTR[rax*1+rsi]
404	mov	al,dl
405	xor	r8,r10
406	movzx	r12,WORD PTR[r12*2+r11]
407	movzx	ebx,dl
408	shl	al,4
409	movzx	r13,BYTE PTR[rcx*1+rsp]
410	shr	ebx,4
411	shl	r12,48
412	xor	r13,r8
413	mov	r10,r9
414	xor	r9,r12
415	shr	r8,8
416	movzx	r13,r13b
417	shr	r9,8
418	xor	r8,QWORD PTR[((-128))+rcx*8+rbp]
419	shl	r10,56
420	xor	r9,QWORD PTR[rcx*8+rbp]
421	rol	edx,8
422	xor	r8,QWORD PTR[8+rax*1+rsi]
423	xor	r9,QWORD PTR[rax*1+rsi]
424	mov	al,dl
425	xor	r8,r10
426	movzx	r13,WORD PTR[r13*2+r11]
427	movzx	ecx,dl
428	shl	al,4
429	movzx	r12,BYTE PTR[rbx*1+rsp]
430	shr	ecx,4
431	shl	r13,48
432	xor	r12,r8
433	mov	r10,r9
434	xor	r9,r13
435	shr	r8,8
436	movzx	r12,r12b
437	shr	r9,8
438	xor	r8,QWORD PTR[((-128))+rbx*8+rbp]
439	shl	r10,56
440	xor	r9,QWORD PTR[rbx*8+rbp]
441	rol	edx,8
442	xor	r8,QWORD PTR[8+rax*1+rsi]
443	xor	r9,QWORD PTR[rax*1+rsi]
444	mov	al,dl
445	xor	r8,r10
446	movzx	r12,WORD PTR[r12*2+r11]
447	movzx	ebx,dl
448	shl	al,4
449	movzx	r13,BYTE PTR[rcx*1+rsp]
450	shr	ebx,4
451	shl	r12,48
452	xor	r13,r8
453	mov	r10,r9
454	xor	r9,r12
455	shr	r8,8
456	movzx	r13,r13b
457	shr	r9,8
458	xor	r8,QWORD PTR[((-128))+rcx*8+rbp]
459	shl	r10,56
460	xor	r9,QWORD PTR[rcx*8+rbp]
461	rol	edx,8
462	xor	r8,QWORD PTR[8+rax*1+rsi]
463	xor	r9,QWORD PTR[rax*1+rsi]
464	mov	al,dl
465	xor	r8,r10
466	movzx	r13,WORD PTR[r13*2+r11]
467	movzx	ecx,dl
468	shl	al,4
469	movzx	r12,BYTE PTR[rbx*1+rsp]
470	shr	ecx,4
471	shl	r13,48
472	xor	r12,r8
473	mov	r10,r9
474	xor	r9,r13
475	shr	r8,8
476	movzx	r12,r12b
477	mov	edx,DWORD PTR[4+rdi]
478	shr	r9,8
479	xor	r8,QWORD PTR[((-128))+rbx*8+rbp]
480	shl	r10,56
481	xor	r9,QWORD PTR[rbx*8+rbp]
482	rol	edx,8
483	xor	r8,QWORD PTR[8+rax*1+rsi]
484	xor	r9,QWORD PTR[rax*1+rsi]
485	mov	al,dl
486	xor	r8,r10
487	movzx	r12,WORD PTR[r12*2+r11]
488	movzx	ebx,dl
489	shl	al,4
490	movzx	r13,BYTE PTR[rcx*1+rsp]
491	shr	ebx,4
492	shl	r12,48
493	xor	r13,r8
494	mov	r10,r9
495	xor	r9,r12
496	shr	r8,8
497	movzx	r13,r13b
498	shr	r9,8
499	xor	r8,QWORD PTR[((-128))+rcx*8+rbp]
500	shl	r10,56
501	xor	r9,QWORD PTR[rcx*8+rbp]
502	rol	edx,8
503	xor	r8,QWORD PTR[8+rax*1+rsi]
504	xor	r9,QWORD PTR[rax*1+rsi]
505	mov	al,dl
506	xor	r8,r10
507	movzx	r13,WORD PTR[r13*2+r11]
508	movzx	ecx,dl
509	shl	al,4
510	movzx	r12,BYTE PTR[rbx*1+rsp]
511	shr	ecx,4
512	shl	r13,48
513	xor	r12,r8
514	mov	r10,r9
515	xor	r9,r13
516	shr	r8,8
517	movzx	r12,r12b
518	shr	r9,8
519	xor	r8,QWORD PTR[((-128))+rbx*8+rbp]
520	shl	r10,56
521	xor	r9,QWORD PTR[rbx*8+rbp]
522	rol	edx,8
523	xor	r8,QWORD PTR[8+rax*1+rsi]
524	xor	r9,QWORD PTR[rax*1+rsi]
525	mov	al,dl
526	xor	r8,r10
527	movzx	r12,WORD PTR[r12*2+r11]
528	movzx	ebx,dl
529	shl	al,4
530	movzx	r13,BYTE PTR[rcx*1+rsp]
531	shr	ebx,4
532	shl	r12,48
533	xor	r13,r8
534	mov	r10,r9
535	xor	r9,r12
536	shr	r8,8
537	movzx	r13,r13b
538	shr	r9,8
539	xor	r8,QWORD PTR[((-128))+rcx*8+rbp]
540	shl	r10,56
541	xor	r9,QWORD PTR[rcx*8+rbp]
542	rol	edx,8
543	xor	r8,QWORD PTR[8+rax*1+rsi]
544	xor	r9,QWORD PTR[rax*1+rsi]
545	mov	al,dl
546	xor	r8,r10
547	movzx	r13,WORD PTR[r13*2+r11]
548	movzx	ecx,dl
549	shl	al,4
550	movzx	r12,BYTE PTR[rbx*1+rsp]
551	shr	ecx,4
552	shl	r13,48
553	xor	r12,r8
554	mov	r10,r9
555	xor	r9,r13
556	shr	r8,8
557	movzx	r12,r12b
558	mov	edx,DWORD PTR[rdi]
559	shr	r9,8
560	xor	r8,QWORD PTR[((-128))+rbx*8+rbp]
561	shl	r10,56
562	xor	r9,QWORD PTR[rbx*8+rbp]
563	rol	edx,8
564	xor	r8,QWORD PTR[8+rax*1+rsi]
565	xor	r9,QWORD PTR[rax*1+rsi]
566	mov	al,dl
567	xor	r8,r10
568	movzx	r12,WORD PTR[r12*2+r11]
569	movzx	ebx,dl
570	shl	al,4
571	movzx	r13,BYTE PTR[rcx*1+rsp]
572	shr	ebx,4
573	shl	r12,48
574	xor	r13,r8
575	mov	r10,r9
576	xor	r9,r12
577	shr	r8,8
578	movzx	r13,r13b
579	shr	r9,8
580	xor	r8,QWORD PTR[((-128))+rcx*8+rbp]
581	shl	r10,56
582	xor	r9,QWORD PTR[rcx*8+rbp]
583	rol	edx,8
584	xor	r8,QWORD PTR[8+rax*1+rsi]
585	xor	r9,QWORD PTR[rax*1+rsi]
586	mov	al,dl
587	xor	r8,r10
588	movzx	r13,WORD PTR[r13*2+r11]
589	movzx	ecx,dl
590	shl	al,4
591	movzx	r12,BYTE PTR[rbx*1+rsp]
592	shr	ecx,4
593	shl	r13,48
594	xor	r12,r8
595	mov	r10,r9
596	xor	r9,r13
597	shr	r8,8
598	movzx	r12,r12b
599	shr	r9,8
600	xor	r8,QWORD PTR[((-128))+rbx*8+rbp]
601	shl	r10,56
602	xor	r9,QWORD PTR[rbx*8+rbp]
603	rol	edx,8
604	xor	r8,QWORD PTR[8+rax*1+rsi]
605	xor	r9,QWORD PTR[rax*1+rsi]
606	mov	al,dl
607	xor	r8,r10
608	movzx	r12,WORD PTR[r12*2+r11]
609	movzx	ebx,dl
610	shl	al,4
611	movzx	r13,BYTE PTR[rcx*1+rsp]
612	shr	ebx,4
613	shl	r12,48
614	xor	r13,r8
615	mov	r10,r9
616	xor	r9,r12
617	shr	r8,8
618	movzx	r13,r13b
619	shr	r9,8
620	xor	r8,QWORD PTR[((-128))+rcx*8+rbp]
621	shl	r10,56
622	xor	r9,QWORD PTR[rcx*8+rbp]
623	rol	edx,8
624	xor	r8,QWORD PTR[8+rax*1+rsi]
625	xor	r9,QWORD PTR[rax*1+rsi]
626	mov	al,dl
627	xor	r8,r10
628	movzx	r13,WORD PTR[r13*2+r11]
629	movzx	ecx,dl
630	shl	al,4
631	movzx	r12,BYTE PTR[rbx*1+rsp]
632	and	ecx,240
633	shl	r13,48
634	xor	r12,r8
635	mov	r10,r9
636	xor	r9,r13
637	shr	r8,8
638	movzx	r12,r12b
639	mov	edx,DWORD PTR[((-4))+rdi]
640	shr	r9,8
641	xor	r8,QWORD PTR[((-128))+rbx*8+rbp]
642	shl	r10,56
643	xor	r9,QWORD PTR[rbx*8+rbp]
644	movzx	r12,WORD PTR[r12*2+r11]
645	xor	r8,QWORD PTR[8+rax*1+rsi]
646	xor	r9,QWORD PTR[rax*1+rsi]
647	shl	r12,48
648	xor	r8,r10
649	xor	r9,r12
650	movzx	r13,r8b
651	shr	r8,4
652	mov	r10,r9
653	shl	r13b,4
654	shr	r9,4
655	xor	r8,QWORD PTR[8+rcx*1+rsi]
656	movzx	r13,WORD PTR[r13*2+r11]
657	shl	r10,60
658	xor	r9,QWORD PTR[rcx*1+rsi]
659	xor	r8,r10
660	shl	r13,48
661	bswap	r8
662	xor	r9,r13
663	bswap	r9
664	cmp	r14,r15
665	jb	$L$outer_loop
666	mov	QWORD PTR[8+rdi],r8
667	mov	QWORD PTR[rdi],r9
668
669	lea	rsi,QWORD PTR[280+rsp]
670	mov	r15,QWORD PTR[rsi]
671	mov	r14,QWORD PTR[8+rsi]
672	mov	r13,QWORD PTR[16+rsi]
673	mov	r12,QWORD PTR[24+rsi]
674	mov	rbp,QWORD PTR[32+rsi]
675	mov	rbx,QWORD PTR[40+rsi]
676	lea	rsp,QWORD PTR[48+rsi]
677$L$ghash_epilogue::
678	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
679	mov	rsi,QWORD PTR[16+rsp]
680	DB	0F3h,0C3h		;repret
681$L$SEH_end_gcm_ghash_4bit::
682gcm_ghash_4bit	ENDP
683PUBLIC	gcm_init_clmul
684
685ALIGN	16
686gcm_init_clmul	PROC PUBLIC
687$L$_init_clmul::
688$L$SEH_begin_gcm_init_clmul::
689
690DB	048h,083h,0ech,018h
691DB	00fh,029h,034h,024h
692	movdqu	xmm2,XMMWORD PTR[rdx]
693	pshufd	xmm2,xmm2,78
694
695
696	pshufd	xmm4,xmm2,255
697	movdqa	xmm3,xmm2
698	psllq	xmm2,1
699	pxor	xmm5,xmm5
700	psrlq	xmm3,63
701	pcmpgtd	xmm5,xmm4
702	pslldq	xmm3,8
703	por	xmm2,xmm3
704
705
706	pand	xmm5,XMMWORD PTR[$L$0x1c2_polynomial]
707	pxor	xmm2,xmm5
708
709
710	pshufd	xmm6,xmm2,78
711	movdqa	xmm0,xmm2
712	pxor	xmm6,xmm2
713	movdqa	xmm1,xmm0
714	pshufd	xmm3,xmm0,78
715	pxor	xmm3,xmm0
716DB	102,15,58,68,194,0
717DB	102,15,58,68,202,17
718DB	102,15,58,68,222,0
719	pxor	xmm3,xmm0
720	pxor	xmm3,xmm1
721
722	movdqa	xmm4,xmm3
723	psrldq	xmm3,8
724	pslldq	xmm4,8
725	pxor	xmm1,xmm3
726	pxor	xmm0,xmm4
727
728	movdqa	xmm4,xmm0
729	movdqa	xmm3,xmm0
730	psllq	xmm0,5
731	pxor	xmm3,xmm0
732	psllq	xmm0,1
733	pxor	xmm0,xmm3
734	psllq	xmm0,57
735	movdqa	xmm3,xmm0
736	pslldq	xmm0,8
737	psrldq	xmm3,8
738	pxor	xmm0,xmm4
739	pxor	xmm1,xmm3
740
741
742	movdqa	xmm4,xmm0
743	psrlq	xmm0,1
744	pxor	xmm1,xmm4
745	pxor	xmm4,xmm0
746	psrlq	xmm0,5
747	pxor	xmm0,xmm4
748	psrlq	xmm0,1
749	pxor	xmm0,xmm1
750	pshufd	xmm3,xmm2,78
751	pshufd	xmm4,xmm0,78
752	pxor	xmm3,xmm2
753	movdqu	XMMWORD PTR[rcx],xmm2
754	pxor	xmm4,xmm0
755	movdqu	XMMWORD PTR[16+rcx],xmm0
756DB	102,15,58,15,227,8
757	movdqu	XMMWORD PTR[32+rcx],xmm4
758	movdqa	xmm1,xmm0
759	pshufd	xmm3,xmm0,78
760	pxor	xmm3,xmm0
761DB	102,15,58,68,194,0
762DB	102,15,58,68,202,17
763DB	102,15,58,68,222,0
764	pxor	xmm3,xmm0
765	pxor	xmm3,xmm1
766
767	movdqa	xmm4,xmm3
768	psrldq	xmm3,8
769	pslldq	xmm4,8
770	pxor	xmm1,xmm3
771	pxor	xmm0,xmm4
772
773	movdqa	xmm4,xmm0
774	movdqa	xmm3,xmm0
775	psllq	xmm0,5
776	pxor	xmm3,xmm0
777	psllq	xmm0,1
778	pxor	xmm0,xmm3
779	psllq	xmm0,57
780	movdqa	xmm3,xmm0
781	pslldq	xmm0,8
782	psrldq	xmm3,8
783	pxor	xmm0,xmm4
784	pxor	xmm1,xmm3
785
786
787	movdqa	xmm4,xmm0
788	psrlq	xmm0,1
789	pxor	xmm1,xmm4
790	pxor	xmm4,xmm0
791	psrlq	xmm0,5
792	pxor	xmm0,xmm4
793	psrlq	xmm0,1
794	pxor	xmm0,xmm1
795	movdqa	xmm5,xmm0
796	movdqa	xmm1,xmm0
797	pshufd	xmm3,xmm0,78
798	pxor	xmm3,xmm0
799DB	102,15,58,68,194,0
800DB	102,15,58,68,202,17
801DB	102,15,58,68,222,0
802	pxor	xmm3,xmm0
803	pxor	xmm3,xmm1
804
805	movdqa	xmm4,xmm3
806	psrldq	xmm3,8
807	pslldq	xmm4,8
808	pxor	xmm1,xmm3
809	pxor	xmm0,xmm4
810
811	movdqa	xmm4,xmm0
812	movdqa	xmm3,xmm0
813	psllq	xmm0,5
814	pxor	xmm3,xmm0
815	psllq	xmm0,1
816	pxor	xmm0,xmm3
817	psllq	xmm0,57
818	movdqa	xmm3,xmm0
819	pslldq	xmm0,8
820	psrldq	xmm3,8
821	pxor	xmm0,xmm4
822	pxor	xmm1,xmm3
823
824
825	movdqa	xmm4,xmm0
826	psrlq	xmm0,1
827	pxor	xmm1,xmm4
828	pxor	xmm4,xmm0
829	psrlq	xmm0,5
830	pxor	xmm0,xmm4
831	psrlq	xmm0,1
832	pxor	xmm0,xmm1
833	pshufd	xmm3,xmm5,78
834	pshufd	xmm4,xmm0,78
835	pxor	xmm3,xmm5
836	movdqu	XMMWORD PTR[48+rcx],xmm5
837	pxor	xmm4,xmm0
838	movdqu	XMMWORD PTR[64+rcx],xmm0
839DB	102,15,58,15,227,8
840	movdqu	XMMWORD PTR[80+rcx],xmm4
841	movaps	xmm6,XMMWORD PTR[rsp]
842	lea	rsp,QWORD PTR[24+rsp]
843$L$SEH_end_gcm_init_clmul::
844	DB	0F3h,0C3h		;repret
845gcm_init_clmul	ENDP
846PUBLIC	gcm_gmult_clmul
847
848ALIGN	16
849gcm_gmult_clmul	PROC PUBLIC
850$L$_gmult_clmul::
851	movdqu	xmm0,XMMWORD PTR[rcx]
852	movdqa	xmm5,XMMWORD PTR[$L$bswap_mask]
853	movdqu	xmm2,XMMWORD PTR[rdx]
854	movdqu	xmm4,XMMWORD PTR[32+rdx]
855DB	102,15,56,0,197
856	movdqa	xmm1,xmm0
857	pshufd	xmm3,xmm0,78
858	pxor	xmm3,xmm0
859DB	102,15,58,68,194,0
860DB	102,15,58,68,202,17
861DB	102,15,58,68,220,0
862	pxor	xmm3,xmm0
863	pxor	xmm3,xmm1
864
865	movdqa	xmm4,xmm3
866	psrldq	xmm3,8
867	pslldq	xmm4,8
868	pxor	xmm1,xmm3
869	pxor	xmm0,xmm4
870
871	movdqa	xmm4,xmm0
872	movdqa	xmm3,xmm0
873	psllq	xmm0,5
874	pxor	xmm3,xmm0
875	psllq	xmm0,1
876	pxor	xmm0,xmm3
877	psllq	xmm0,57
878	movdqa	xmm3,xmm0
879	pslldq	xmm0,8
880	psrldq	xmm3,8
881	pxor	xmm0,xmm4
882	pxor	xmm1,xmm3
883
884
885	movdqa	xmm4,xmm0
886	psrlq	xmm0,1
887	pxor	xmm1,xmm4
888	pxor	xmm4,xmm0
889	psrlq	xmm0,5
890	pxor	xmm0,xmm4
891	psrlq	xmm0,1
892	pxor	xmm0,xmm1
893DB	102,15,56,0,197
894	movdqu	XMMWORD PTR[rcx],xmm0
895	DB	0F3h,0C3h		;repret
896gcm_gmult_clmul	ENDP
897PUBLIC	gcm_ghash_clmul
898
899ALIGN	32
900gcm_ghash_clmul	PROC PUBLIC
901$L$_ghash_clmul::
902	lea	rax,QWORD PTR[((-136))+rsp]
903$L$SEH_begin_gcm_ghash_clmul::
904
905DB	048h,08dh,060h,0e0h
906DB	00fh,029h,070h,0e0h
907DB	00fh,029h,078h,0f0h
908DB	044h,00fh,029h,000h
909DB	044h,00fh,029h,048h,010h
910DB	044h,00fh,029h,050h,020h
911DB	044h,00fh,029h,058h,030h
912DB	044h,00fh,029h,060h,040h
913DB	044h,00fh,029h,068h,050h
914DB	044h,00fh,029h,070h,060h
915DB	044h,00fh,029h,078h,070h
916	movdqa	xmm10,XMMWORD PTR[$L$bswap_mask]
917
918	movdqu	xmm0,XMMWORD PTR[rcx]
919	movdqu	xmm2,XMMWORD PTR[rdx]
920	movdqu	xmm7,XMMWORD PTR[32+rdx]
921DB	102,65,15,56,0,194
922
923	sub	r9,010h
924	jz	$L$odd_tail
925
926	movdqu	xmm6,XMMWORD PTR[16+rdx]
927	mov	eax,DWORD PTR[((OPENSSL_ia32cap_P+4))]
928	cmp	r9,030h
929	jb	$L$skip4x
930
931	and	eax,71303168
932	cmp	eax,4194304
933	je	$L$skip4x
934
935	sub	r9,030h
936	mov	rax,0A040608020C0E000h
937	movdqu	xmm14,XMMWORD PTR[48+rdx]
938	movdqu	xmm15,XMMWORD PTR[64+rdx]
939
940
941
942
943	movdqu	xmm3,XMMWORD PTR[48+r8]
944	movdqu	xmm11,XMMWORD PTR[32+r8]
945DB	102,65,15,56,0,218
946DB	102,69,15,56,0,218
947	movdqa	xmm5,xmm3
948	pshufd	xmm4,xmm3,78
949	pxor	xmm4,xmm3
950DB	102,15,58,68,218,0
951DB	102,15,58,68,234,17
952DB	102,15,58,68,231,0
953
954	movdqa	xmm13,xmm11
955	pshufd	xmm12,xmm11,78
956	pxor	xmm12,xmm11
957DB	102,68,15,58,68,222,0
958DB	102,68,15,58,68,238,17
959DB	102,68,15,58,68,231,16
960	xorps	xmm3,xmm11
961	xorps	xmm5,xmm13
962	movups	xmm7,XMMWORD PTR[80+rdx]
963	xorps	xmm4,xmm12
964
965	movdqu	xmm11,XMMWORD PTR[16+r8]
966	movdqu	xmm8,XMMWORD PTR[r8]
967DB	102,69,15,56,0,218
968DB	102,69,15,56,0,194
969	movdqa	xmm13,xmm11
970	pshufd	xmm12,xmm11,78
971	pxor	xmm0,xmm8
972	pxor	xmm12,xmm11
973DB	102,69,15,58,68,222,0
974	movdqa	xmm1,xmm0
975	pshufd	xmm8,xmm0,78
976	pxor	xmm8,xmm0
977DB	102,69,15,58,68,238,17
978DB	102,68,15,58,68,231,0
979	xorps	xmm3,xmm11
980	xorps	xmm5,xmm13
981
982	lea	r8,QWORD PTR[64+r8]
983	sub	r9,040h
984	jc	$L$tail4x
985
986	jmp	$L$mod4_loop
987ALIGN	32
988$L$mod4_loop::
989DB	102,65,15,58,68,199,0
990	xorps	xmm4,xmm12
991	movdqu	xmm11,XMMWORD PTR[48+r8]
992DB	102,69,15,56,0,218
993DB	102,65,15,58,68,207,17
994	xorps	xmm0,xmm3
995	movdqu	xmm3,XMMWORD PTR[32+r8]
996	movdqa	xmm13,xmm11
997DB	102,68,15,58,68,199,16
998	pshufd	xmm12,xmm11,78
999	xorps	xmm1,xmm5
1000	pxor	xmm12,xmm11
1001DB	102,65,15,56,0,218
1002	movups	xmm7,XMMWORD PTR[32+rdx]
1003	xorps	xmm8,xmm4
1004DB	102,68,15,58,68,218,0
1005	pshufd	xmm4,xmm3,78
1006
1007	pxor	xmm8,xmm0
1008	movdqa	xmm5,xmm3
1009	pxor	xmm8,xmm1
1010	pxor	xmm4,xmm3
1011	movdqa	xmm9,xmm8
1012DB	102,68,15,58,68,234,17
1013	pslldq	xmm8,8
1014	psrldq	xmm9,8
1015	pxor	xmm0,xmm8
1016	movdqa	xmm8,XMMWORD PTR[$L$7_mask]
1017	pxor	xmm1,xmm9
1018DB	102,76,15,110,200
1019
1020	pand	xmm8,xmm0
1021DB	102,69,15,56,0,200
1022	pxor	xmm9,xmm0
1023DB	102,68,15,58,68,231,0
1024	psllq	xmm9,57
1025	movdqa	xmm8,xmm9
1026	pslldq	xmm9,8
1027DB	102,15,58,68,222,0
1028	psrldq	xmm8,8
1029	pxor	xmm0,xmm9
1030	pxor	xmm1,xmm8
1031	movdqu	xmm8,XMMWORD PTR[r8]
1032
1033	movdqa	xmm9,xmm0
1034	psrlq	xmm0,1
1035DB	102,15,58,68,238,17
1036	xorps	xmm3,xmm11
1037	movdqu	xmm11,XMMWORD PTR[16+r8]
1038DB	102,69,15,56,0,218
1039DB	102,15,58,68,231,16
1040	xorps	xmm5,xmm13
1041	movups	xmm7,XMMWORD PTR[80+rdx]
1042DB	102,69,15,56,0,194
1043	pxor	xmm1,xmm9
1044	pxor	xmm9,xmm0
1045	psrlq	xmm0,5
1046
1047	movdqa	xmm13,xmm11
1048	pxor	xmm4,xmm12
1049	pshufd	xmm12,xmm11,78
1050	pxor	xmm0,xmm9
1051	pxor	xmm1,xmm8
1052	pxor	xmm12,xmm11
1053DB	102,69,15,58,68,222,0
1054	psrlq	xmm0,1
1055	pxor	xmm0,xmm1
1056	movdqa	xmm1,xmm0
1057DB	102,69,15,58,68,238,17
1058	xorps	xmm3,xmm11
1059	pshufd	xmm8,xmm0,78
1060	pxor	xmm8,xmm0
1061
1062DB	102,68,15,58,68,231,0
1063	xorps	xmm5,xmm13
1064
1065	lea	r8,QWORD PTR[64+r8]
1066	sub	r9,040h
1067	jnc	$L$mod4_loop
1068
1069$L$tail4x::
1070DB	102,65,15,58,68,199,0
1071DB	102,65,15,58,68,207,17
1072DB	102,68,15,58,68,199,16
1073	xorps	xmm4,xmm12
1074	xorps	xmm0,xmm3
1075	xorps	xmm1,xmm5
1076	pxor	xmm1,xmm0
1077	pxor	xmm8,xmm4
1078
1079	pxor	xmm8,xmm1
1080	pxor	xmm1,xmm0
1081
1082	movdqa	xmm9,xmm8
1083	psrldq	xmm8,8
1084	pslldq	xmm9,8
1085	pxor	xmm1,xmm8
1086	pxor	xmm0,xmm9
1087
1088	movdqa	xmm4,xmm0
1089	movdqa	xmm3,xmm0
1090	psllq	xmm0,5
1091	pxor	xmm3,xmm0
1092	psllq	xmm0,1
1093	pxor	xmm0,xmm3
1094	psllq	xmm0,57
1095	movdqa	xmm3,xmm0
1096	pslldq	xmm0,8
1097	psrldq	xmm3,8
1098	pxor	xmm0,xmm4
1099	pxor	xmm1,xmm3
1100
1101
1102	movdqa	xmm4,xmm0
1103	psrlq	xmm0,1
1104	pxor	xmm1,xmm4
1105	pxor	xmm4,xmm0
1106	psrlq	xmm0,5
1107	pxor	xmm0,xmm4
1108	psrlq	xmm0,1
1109	pxor	xmm0,xmm1
1110	add	r9,040h
1111	jz	$L$done
1112	movdqu	xmm7,XMMWORD PTR[32+rdx]
1113	sub	r9,010h
1114	jz	$L$odd_tail
1115$L$skip4x::
1116
1117
1118
1119
1120
1121	movdqu	xmm8,XMMWORD PTR[r8]
1122	movdqu	xmm3,XMMWORD PTR[16+r8]
1123DB	102,69,15,56,0,194
1124DB	102,65,15,56,0,218
1125	pxor	xmm0,xmm8
1126
1127	movdqa	xmm5,xmm3
1128	pshufd	xmm4,xmm3,78
1129	pxor	xmm4,xmm3
1130DB	102,15,58,68,218,0
1131DB	102,15,58,68,234,17
1132DB	102,15,58,68,231,0
1133
1134	lea	r8,QWORD PTR[32+r8]
1135	nop
1136	sub	r9,020h
1137	jbe	$L$even_tail
1138	nop
1139	jmp	$L$mod_loop
1140
1141ALIGN	32
1142$L$mod_loop::
1143	movdqa	xmm1,xmm0
1144	movdqa	xmm8,xmm4
1145	pshufd	xmm4,xmm0,78
1146	pxor	xmm4,xmm0
1147
1148DB	102,15,58,68,198,0
1149DB	102,15,58,68,206,17
1150DB	102,15,58,68,231,16
1151
1152	pxor	xmm0,xmm3
1153	pxor	xmm1,xmm5
1154	movdqu	xmm9,XMMWORD PTR[r8]
1155	pxor	xmm8,xmm0
1156DB	102,69,15,56,0,202
1157	movdqu	xmm3,XMMWORD PTR[16+r8]
1158
1159	pxor	xmm8,xmm1
1160	pxor	xmm1,xmm9
1161	pxor	xmm4,xmm8
1162DB	102,65,15,56,0,218
1163	movdqa	xmm8,xmm4
1164	psrldq	xmm8,8
1165	pslldq	xmm4,8
1166	pxor	xmm1,xmm8
1167	pxor	xmm0,xmm4
1168
1169	movdqa	xmm5,xmm3
1170
1171	movdqa	xmm9,xmm0
1172	movdqa	xmm8,xmm0
1173	psllq	xmm0,5
1174	pxor	xmm8,xmm0
1175DB	102,15,58,68,218,0
1176	psllq	xmm0,1
1177	pxor	xmm0,xmm8
1178	psllq	xmm0,57
1179	movdqa	xmm8,xmm0
1180	pslldq	xmm0,8
1181	psrldq	xmm8,8
1182	pxor	xmm0,xmm9
1183	pshufd	xmm4,xmm5,78
1184	pxor	xmm1,xmm8
1185	pxor	xmm4,xmm5
1186
1187	movdqa	xmm9,xmm0
1188	psrlq	xmm0,1
1189DB	102,15,58,68,234,17
1190	pxor	xmm1,xmm9
1191	pxor	xmm9,xmm0
1192	psrlq	xmm0,5
1193	pxor	xmm0,xmm9
1194	lea	r8,QWORD PTR[32+r8]
1195	psrlq	xmm0,1
1196DB	102,15,58,68,231,0
1197	pxor	xmm0,xmm1
1198
1199	sub	r9,020h
1200	ja	$L$mod_loop
1201
1202$L$even_tail::
1203	movdqa	xmm1,xmm0
1204	movdqa	xmm8,xmm4
1205	pshufd	xmm4,xmm0,78
1206	pxor	xmm4,xmm0
1207
1208DB	102,15,58,68,198,0
1209DB	102,15,58,68,206,17
1210DB	102,15,58,68,231,16
1211
1212	pxor	xmm0,xmm3
1213	pxor	xmm1,xmm5
1214	pxor	xmm8,xmm0
1215	pxor	xmm8,xmm1
1216	pxor	xmm4,xmm8
1217	movdqa	xmm8,xmm4
1218	psrldq	xmm8,8
1219	pslldq	xmm4,8
1220	pxor	xmm1,xmm8
1221	pxor	xmm0,xmm4
1222
1223	movdqa	xmm4,xmm0
1224	movdqa	xmm3,xmm0
1225	psllq	xmm0,5
1226	pxor	xmm3,xmm0
1227	psllq	xmm0,1
1228	pxor	xmm0,xmm3
1229	psllq	xmm0,57
1230	movdqa	xmm3,xmm0
1231	pslldq	xmm0,8
1232	psrldq	xmm3,8
1233	pxor	xmm0,xmm4
1234	pxor	xmm1,xmm3
1235
1236
1237	movdqa	xmm4,xmm0
1238	psrlq	xmm0,1
1239	pxor	xmm1,xmm4
1240	pxor	xmm4,xmm0
1241	psrlq	xmm0,5
1242	pxor	xmm0,xmm4
1243	psrlq	xmm0,1
1244	pxor	xmm0,xmm1
1245	test	r9,r9
1246	jnz	$L$done
1247
1248$L$odd_tail::
1249	movdqu	xmm8,XMMWORD PTR[r8]
1250DB	102,69,15,56,0,194
1251	pxor	xmm0,xmm8
1252	movdqa	xmm1,xmm0
1253	pshufd	xmm3,xmm0,78
1254	pxor	xmm3,xmm0
1255DB	102,15,58,68,194,0
1256DB	102,15,58,68,202,17
1257DB	102,15,58,68,223,0
1258	pxor	xmm3,xmm0
1259	pxor	xmm3,xmm1
1260
1261	movdqa	xmm4,xmm3
1262	psrldq	xmm3,8
1263	pslldq	xmm4,8
1264	pxor	xmm1,xmm3
1265	pxor	xmm0,xmm4
1266
1267	movdqa	xmm4,xmm0
1268	movdqa	xmm3,xmm0
1269	psllq	xmm0,5
1270	pxor	xmm3,xmm0
1271	psllq	xmm0,1
1272	pxor	xmm0,xmm3
1273	psllq	xmm0,57
1274	movdqa	xmm3,xmm0
1275	pslldq	xmm0,8
1276	psrldq	xmm3,8
1277	pxor	xmm0,xmm4
1278	pxor	xmm1,xmm3
1279
1280
1281	movdqa	xmm4,xmm0
1282	psrlq	xmm0,1
1283	pxor	xmm1,xmm4
1284	pxor	xmm4,xmm0
1285	psrlq	xmm0,5
1286	pxor	xmm0,xmm4
1287	psrlq	xmm0,1
1288	pxor	xmm0,xmm1
1289$L$done::
1290DB	102,65,15,56,0,194
1291	movdqu	XMMWORD PTR[rcx],xmm0
1292	movaps	xmm6,XMMWORD PTR[rsp]
1293	movaps	xmm7,XMMWORD PTR[16+rsp]
1294	movaps	xmm8,XMMWORD PTR[32+rsp]
1295	movaps	xmm9,XMMWORD PTR[48+rsp]
1296	movaps	xmm10,XMMWORD PTR[64+rsp]
1297	movaps	xmm11,XMMWORD PTR[80+rsp]
1298	movaps	xmm12,XMMWORD PTR[96+rsp]
1299	movaps	xmm13,XMMWORD PTR[112+rsp]
1300	movaps	xmm14,XMMWORD PTR[128+rsp]
1301	movaps	xmm15,XMMWORD PTR[144+rsp]
1302	lea	rsp,QWORD PTR[168+rsp]
1303$L$SEH_end_gcm_ghash_clmul::
1304	DB	0F3h,0C3h		;repret
1305gcm_ghash_clmul	ENDP
1306PUBLIC	gcm_init_avx
1307
1308ALIGN	32
1309gcm_init_avx	PROC PUBLIC
1310	jmp	$L$_init_clmul
1311gcm_init_avx	ENDP
1312PUBLIC	gcm_gmult_avx
1313
1314ALIGN	32
1315gcm_gmult_avx	PROC PUBLIC
1316	jmp	$L$_gmult_clmul
1317gcm_gmult_avx	ENDP
1318PUBLIC	gcm_ghash_avx
1319
1320ALIGN	32
1321gcm_ghash_avx	PROC PUBLIC
1322	jmp	$L$_ghash_clmul
1323gcm_ghash_avx	ENDP
1324ALIGN	64
1325$L$bswap_mask::
1326DB	15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
1327$L$0x1c2_polynomial::
1328DB	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0c2h
1329$L$7_mask::
1330	DD	7,0,7,0
1331$L$7_mask_poly::
1332	DD	7,0,450,0
1333ALIGN	64
1334
1335$L$rem_4bit::
1336	DD	0,0,0,471859200,0,943718400,0,610271232
1337	DD	0,1887436800,0,1822425088,0,1220542464,0,1423966208
1338	DD	0,3774873600,0,4246732800,0,3644850176,0,3311403008
1339	DD	0,2441084928,0,2376073216,0,2847932416,0,3051356160
1340
1341$L$rem_8bit::
1342	DW	00000h,001C2h,00384h,00246h,00708h,006CAh,0048Ch,0054Eh
1343	DW	00E10h,00FD2h,00D94h,00C56h,00918h,008DAh,00A9Ch,00B5Eh
1344	DW	01C20h,01DE2h,01FA4h,01E66h,01B28h,01AEAh,018ACh,0196Eh
1345	DW	01230h,013F2h,011B4h,01076h,01538h,014FAh,016BCh,0177Eh
1346	DW	03840h,03982h,03BC4h,03A06h,03F48h,03E8Ah,03CCCh,03D0Eh
1347	DW	03650h,03792h,035D4h,03416h,03158h,0309Ah,032DCh,0331Eh
1348	DW	02460h,025A2h,027E4h,02626h,02368h,022AAh,020ECh,0212Eh
1349	DW	02A70h,02BB2h,029F4h,02836h,02D78h,02CBAh,02EFCh,02F3Eh
1350	DW	07080h,07142h,07304h,072C6h,07788h,0764Ah,0740Ch,075CEh
1351	DW	07E90h,07F52h,07D14h,07CD6h,07998h,0785Ah,07A1Ch,07BDEh
1352	DW	06CA0h,06D62h,06F24h,06EE6h,06BA8h,06A6Ah,0682Ch,069EEh
1353	DW	062B0h,06372h,06134h,060F6h,065B8h,0647Ah,0663Ch,067FEh
1354	DW	048C0h,04902h,04B44h,04A86h,04FC8h,04E0Ah,04C4Ch,04D8Eh
1355	DW	046D0h,04712h,04554h,04496h,041D8h,0401Ah,0425Ch,0439Eh
1356	DW	054E0h,05522h,05764h,056A6h,053E8h,0522Ah,0506Ch,051AEh
1357	DW	05AF0h,05B32h,05974h,058B6h,05DF8h,05C3Ah,05E7Ch,05FBEh
1358	DW	0E100h,0E0C2h,0E284h,0E346h,0E608h,0E7CAh,0E58Ch,0E44Eh
1359	DW	0EF10h,0EED2h,0EC94h,0ED56h,0E818h,0E9DAh,0EB9Ch,0EA5Eh
1360	DW	0FD20h,0FCE2h,0FEA4h,0FF66h,0FA28h,0FBEAh,0F9ACh,0F86Eh
1361	DW	0F330h,0F2F2h,0F0B4h,0F176h,0F438h,0F5FAh,0F7BCh,0F67Eh
1362	DW	0D940h,0D882h,0DAC4h,0DB06h,0DE48h,0DF8Ah,0DDCCh,0DC0Eh
1363	DW	0D750h,0D692h,0D4D4h,0D516h,0D058h,0D19Ah,0D3DCh,0D21Eh
1364	DW	0C560h,0C4A2h,0C6E4h,0C726h,0C268h,0C3AAh,0C1ECh,0C02Eh
1365	DW	0CB70h,0CAB2h,0C8F4h,0C936h,0CC78h,0CDBAh,0CFFCh,0CE3Eh
1366	DW	09180h,09042h,09204h,093C6h,09688h,0974Ah,0950Ch,094CEh
1367	DW	09F90h,09E52h,09C14h,09DD6h,09898h,0995Ah,09B1Ch,09ADEh
1368	DW	08DA0h,08C62h,08E24h,08FE6h,08AA8h,08B6Ah,0892Ch,088EEh
1369	DW	083B0h,08272h,08034h,081F6h,084B8h,0857Ah,0873Ch,086FEh
1370	DW	0A9C0h,0A802h,0AA44h,0AB86h,0AEC8h,0AF0Ah,0AD4Ch,0AC8Eh
1371	DW	0A7D0h,0A612h,0A454h,0A596h,0A0D8h,0A11Ah,0A35Ch,0A29Eh
1372	DW	0B5E0h,0B422h,0B664h,0B7A6h,0B2E8h,0B32Ah,0B16Ch,0B0AEh
1373	DW	0BBF0h,0BA32h,0B874h,0B9B6h,0BCF8h,0BD3Ah,0BF7Ch,0BEBEh
1374
1375DB	71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52
1376DB	44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32
1377DB	60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111
1378DB	114,103,62,0
1379ALIGN	64
1380EXTERN	__imp_RtlVirtualUnwind:NEAR
1381
1382ALIGN	16
1383se_handler	PROC PRIVATE
1384	push	rsi
1385	push	rdi
1386	push	rbx
1387	push	rbp
1388	push	r12
1389	push	r13
1390	push	r14
1391	push	r15
1392	pushfq
1393	sub	rsp,64
1394
1395	mov	rax,QWORD PTR[120+r8]
1396	mov	rbx,QWORD PTR[248+r8]
1397
1398	mov	rsi,QWORD PTR[8+r9]
1399	mov	r11,QWORD PTR[56+r9]
1400
1401	mov	r10d,DWORD PTR[r11]
1402	lea	r10,QWORD PTR[r10*1+rsi]
1403	cmp	rbx,r10
1404	jb	$L$in_prologue
1405
1406	mov	rax,QWORD PTR[152+r8]
1407
1408	mov	r10d,DWORD PTR[4+r11]
1409	lea	r10,QWORD PTR[r10*1+rsi]
1410	cmp	rbx,r10
1411	jae	$L$in_prologue
1412
1413	lea	rax,QWORD PTR[24+rax]
1414
1415	mov	rbx,QWORD PTR[((-8))+rax]
1416	mov	rbp,QWORD PTR[((-16))+rax]
1417	mov	r12,QWORD PTR[((-24))+rax]
1418	mov	QWORD PTR[144+r8],rbx
1419	mov	QWORD PTR[160+r8],rbp
1420	mov	QWORD PTR[216+r8],r12
1421
1422$L$in_prologue::
1423	mov	rdi,QWORD PTR[8+rax]
1424	mov	rsi,QWORD PTR[16+rax]
1425	mov	QWORD PTR[152+r8],rax
1426	mov	QWORD PTR[168+r8],rsi
1427	mov	QWORD PTR[176+r8],rdi
1428
1429	mov	rdi,QWORD PTR[40+r9]
1430	mov	rsi,r8
1431	mov	ecx,154
1432	DD	0a548f3fch
1433
1434	mov	rsi,r9
1435	xor	rcx,rcx
1436	mov	rdx,QWORD PTR[8+rsi]
1437	mov	r8,QWORD PTR[rsi]
1438	mov	r9,QWORD PTR[16+rsi]
1439	mov	r10,QWORD PTR[40+rsi]
1440	lea	r11,QWORD PTR[56+rsi]
1441	lea	r12,QWORD PTR[24+rsi]
1442	mov	QWORD PTR[32+rsp],r10
1443	mov	QWORD PTR[40+rsp],r11
1444	mov	QWORD PTR[48+rsp],r12
1445	mov	QWORD PTR[56+rsp],rcx
1446	call	QWORD PTR[__imp_RtlVirtualUnwind]
1447
1448	mov	eax,1
1449	add	rsp,64
1450	popfq
1451	pop	r15
1452	pop	r14
1453	pop	r13
1454	pop	r12
1455	pop	rbp
1456	pop	rbx
1457	pop	rdi
1458	pop	rsi
1459	DB	0F3h,0C3h		;repret
1460se_handler	ENDP
1461
1462.text$	ENDS
1463.pdata	SEGMENT READONLY ALIGN(4)
1464ALIGN	4
1465	DD	imagerel $L$SEH_begin_gcm_gmult_4bit
1466	DD	imagerel $L$SEH_end_gcm_gmult_4bit
1467	DD	imagerel $L$SEH_info_gcm_gmult_4bit
1468
1469	DD	imagerel $L$SEH_begin_gcm_ghash_4bit
1470	DD	imagerel $L$SEH_end_gcm_ghash_4bit
1471	DD	imagerel $L$SEH_info_gcm_ghash_4bit
1472
1473	DD	imagerel $L$SEH_begin_gcm_init_clmul
1474	DD	imagerel $L$SEH_end_gcm_init_clmul
1475	DD	imagerel $L$SEH_info_gcm_init_clmul
1476
1477	DD	imagerel $L$SEH_begin_gcm_ghash_clmul
1478	DD	imagerel $L$SEH_end_gcm_ghash_clmul
1479	DD	imagerel $L$SEH_info_gcm_ghash_clmul
1480.pdata	ENDS
1481.xdata	SEGMENT READONLY ALIGN(8)
1482ALIGN	8
1483$L$SEH_info_gcm_gmult_4bit::
1484DB	9,0,0,0
1485	DD	imagerel se_handler
1486	DD	imagerel $L$gmult_prologue,imagerel $L$gmult_epilogue
1487$L$SEH_info_gcm_ghash_4bit::
1488DB	9,0,0,0
1489	DD	imagerel se_handler
1490	DD	imagerel $L$ghash_prologue,imagerel $L$ghash_epilogue
1491$L$SEH_info_gcm_init_clmul::
1492DB	001h,008h,003h,000h
1493DB	008h,068h,000h,000h
1494DB	004h,022h,000h,000h
1495$L$SEH_info_gcm_ghash_clmul::
1496DB	001h,033h,016h,000h
1497DB	033h,0f8h,009h,000h
1498DB	02eh,0e8h,008h,000h
1499DB	029h,0d8h,007h,000h
1500DB	024h,0c8h,006h,000h
1501DB	01fh,0b8h,005h,000h
1502DB	01ah,0a8h,004h,000h
1503DB	015h,098h,003h,000h
1504DB	010h,088h,002h,000h
1505DB	00ch,078h,001h,000h
1506DB	008h,068h,000h,000h
1507DB	004h,001h,015h,000h
1508
1509.xdata	ENDS
1510END
1511