; This file is generated from a similarly-named Perl script in the BoringSSL
; source tree. Do not edit by hand.

%ifdef BORINGSSL_PREFIX
%include "boringssl_prefix_symbols_nasm.inc"
%endif
%ifidn __OUTPUT_FORMAT__,obj
section	code	use32 class=code align=64
%elifidn __OUTPUT_FORMAT__,win32
%ifdef __YASM_VERSION_ID__
%if __YASM_VERSION_ID__ < 01010000h
%error yasm version 1.1.0 or later needed.
%endif
; Yasm automatically includes .00 and complains about redefining it.
; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html
%else
$@feat.00 equ 1
%endif
section	.text	code align=64
%else
section	.text	code
%endif
;extern	_GFp_ia32cap_P
align	64
global	_GFp_poly1305_init_asm
align	16
_GFp_poly1305_init_asm:
L$_GFp_poly1305_init_asm_begin:
	push	ebp
	push	ebx
	push	esi
	push	edi
	mov	edi,DWORD [20+esp]
	mov	esi,DWORD [24+esp]
	mov	ebp,DWORD [28+esp]
	xor	eax,eax
	mov	DWORD [edi],eax
	mov	DWORD [4+edi],eax
	mov	DWORD [8+edi],eax
	mov	DWORD [12+edi],eax
	mov	DWORD [16+edi],eax
	mov	DWORD [20+edi],eax
	cmp	esi,0
	je	NEAR L$000nokey
	call	L$001pic_point
L$001pic_point:
	pop	ebx
	lea	eax,[(_GFp_poly1305_blocks-L$001pic_point)+ebx]
	lea	edx,[(_GFp_poly1305_emit-L$001pic_point)+ebx]
	lea	edi,[_GFp_ia32cap_P]
	mov	ecx,DWORD [edi]
	and	ecx,83886080
	cmp	ecx,83886080
	lea	eax,[(__poly1305_blocks_sse2-L$001pic_point)+ebx]
	lea	edx,[(__poly1305_emit_sse2-L$001pic_point)+ebx]
	mov	edi,DWORD [20+esp]
	mov	DWORD [ebp],eax
	mov	DWORD [4+ebp],edx
	mov	eax,DWORD [esi]
	mov	ebx,DWORD [4+esi]
	mov	ecx,DWORD [8+esi]
	mov	edx,DWORD [12+esi]
	and	eax,268435455
	and	ebx,268435452
	and	ecx,268435452
	and	edx,268435452
	mov	DWORD [24+edi],eax
	mov	DWORD [28+edi],ebx
	mov	DWORD [32+edi],ecx
	mov	DWORD [36+edi],edx
	mov	eax,1
L$000nokey:
	pop	edi
	pop	esi
	pop	ebx
	pop	ebp
	ret
global	_GFp_poly1305_blocks
align	16
_GFp_poly1305_blocks:
L$_GFp_poly1305_blocks_begin:
	push	ebp
	push	ebx
	push	esi
	push	edi
	mov	edi,DWORD [20+esp]
	mov	esi,DWORD [24+esp]
	mov	ecx,DWORD [28+esp]
L$enter_blocks:
	and	ecx,-15
	jz	NEAR L$002nodata
	sub	esp,64
	mov	eax,DWORD [24+edi]
	mov	ebx,DWORD [28+edi]
	lea	ebp,[ecx*1+esi]
	mov	ecx,DWORD [32+edi]
	mov	edx,DWORD [36+edi]
	mov	DWORD [92+esp],ebp
	mov	ebp,esi
	mov	DWORD [36+esp],eax
	mov	eax,ebx
	shr	eax,2
	mov	DWORD [40+esp],ebx
	add	eax,ebx
	mov	ebx,ecx
	shr	ebx,2
	mov	DWORD [44+esp],ecx
	add	ebx,ecx
	mov	ecx,edx
	shr	ecx,2
	mov	DWORD [48+esp],edx
	add	ecx,edx
	mov	DWORD [52+esp],eax
	mov	DWORD [56+esp],ebx
	mov	DWORD [60+esp],ecx
	mov	eax,DWORD [edi]
	mov	ebx,DWORD [4+edi]
	mov	ecx,DWORD [8+edi]
	mov	esi,DWORD [12+edi]
	mov	edi,DWORD [16+edi]
	jmp	NEAR L$003loop
align	32
L$003loop:
	add	eax,DWORD [ebp]
	adc	ebx,DWORD [4+ebp]
	adc	ecx,DWORD [8+ebp]
	adc	esi,DWORD [12+ebp]
	lea	ebp,[16+ebp]
	adc	edi,DWORD [96+esp]
	mov	DWORD [esp],eax
	mov	DWORD [12+esp],esi
	mul	DWORD [36+esp]
	mov	DWORD [16+esp],edi
	mov	edi,eax
	mov	eax,ebx
	mov	esi,edx
	mul	DWORD [60+esp]
	add	edi,eax
	mov	eax,ecx
	adc	esi,edx
	mul	DWORD [56+esp]
	add	edi,eax
	mov	eax,DWORD [12+esp]
	adc	esi,edx
	mul	DWORD [52+esp]
	add	edi,eax
	mov	eax,DWORD [esp]
	adc	esi,edx
	mul	DWORD [40+esp]
	mov	DWORD [20+esp],edi
	xor	edi,edi
	add	esi,eax
	mov	eax,ebx
	adc	edi,edx
	mul	DWORD [36+esp]
	add	esi,eax
	mov	eax,ecx
	adc	edi,edx
	mul	DWORD [60+esp]
	add	esi,eax
	mov	eax,DWORD [12+esp]
	adc	edi,edx
	mul	DWORD [56+esp]
	add	esi,eax
	mov	eax,DWORD [16+esp]
	adc	edi,edx
	imul	eax,DWORD [52+esp]
	add	esi,eax
	mov	eax,DWORD [esp]
	adc	edi,0
	mul	DWORD [44+esp]
	mov	DWORD [24+esp],esi
	xor	esi,esi
	add	edi,eax
	mov	eax,ebx
	adc	esi,edx
	mul	DWORD [40+esp]
	add	edi,eax
	mov	eax,ecx
	adc	esi,edx
	mul	DWORD [36+esp]
	add	edi,eax
	mov	eax,DWORD [12+esp]
	adc	esi,edx
	mul	DWORD [60+esp]
	add	edi,eax
	mov	eax,DWORD [16+esp]
	adc	esi,edx
	imul	eax,DWORD [56+esp]
	add	edi,eax
	mov	eax,DWORD [esp]
	adc	esi,0
	mul	DWORD [48+esp]
	mov	DWORD [28+esp],edi
	xor	edi,edi
	add	esi,eax
	mov	eax,ebx
	adc	edi,edx
	mul	DWORD [44+esp]
	add	esi,eax
	mov	eax,ecx
	adc	edi,edx
	mul	DWORD [40+esp]
	add	esi,eax
	mov	eax,DWORD [12+esp]
	adc	edi,edx
	mul	DWORD [36+esp]
	add	esi,eax
	mov	ecx,DWORD [16+esp]
	adc	edi,edx
	mov	edx,ecx
	imul	ecx,DWORD [60+esp]
	add	esi,ecx
	mov	eax,DWORD [20+esp]
	adc	edi,0
	imul	edx,DWORD [36+esp]
	add	edx,edi
	mov	ebx,DWORD [24+esp]
	mov	ecx,DWORD [28+esp]
	mov	edi,edx
	shr	edx,2
	and	edi,3
	lea	edx,[edx*4+edx]
	add	eax,edx
	adc	ebx,0
	adc	ecx,0
	adc	esi,0
	adc	edi,0
	cmp	ebp,DWORD [92+esp]
	jne	NEAR L$003loop
	mov	edx,DWORD [84+esp]
	add	esp,64
	mov	DWORD [edx],eax
	mov	DWORD [4+edx],ebx
	mov	DWORD [8+edx],ecx
	mov	DWORD [12+edx],esi
	mov	DWORD [16+edx],edi
L$002nodata:
	pop	edi
	pop	esi
	pop	ebx
	pop	ebp
	ret
global	_GFp_poly1305_emit
align	16
_GFp_poly1305_emit:
L$_GFp_poly1305_emit_begin:
	push	ebp
	push	ebx
	push	esi
	push	edi
	mov	ebp,DWORD [20+esp]
L$enter_emit:
	mov	edi,DWORD [24+esp]
	mov	eax,DWORD [ebp]
	mov	ebx,DWORD [4+ebp]
	mov	ecx,DWORD [8+ebp]
	mov	edx,DWORD [12+ebp]
	mov	esi,DWORD [16+ebp]
	add	eax,5
	adc	ebx,0
	adc	ecx,0
	adc	edx,0
	adc	esi,0
	shr	esi,2
	neg	esi
	and	eax,esi
	and	ebx,esi
	and	ecx,esi
	and	edx,esi
	mov	DWORD [edi],eax
	mov	DWORD [4+edi],ebx
	mov	DWORD [8+edi],ecx
	mov	DWORD [12+edi],edx
	not	esi
	mov	eax,DWORD [ebp]
	mov	ebx,DWORD [4+ebp]
	mov	ecx,DWORD [8+ebp]
	mov	edx,DWORD [12+ebp]
	mov	ebp,DWORD [28+esp]
	and	eax,esi
	and	ebx,esi
	and	ecx,esi
	and	edx,esi
	or	eax,DWORD [edi]
	or	ebx,DWORD [4+edi]
	or	ecx,DWORD [8+edi]
	or	edx,DWORD [12+edi]
	add	eax,DWORD [ebp]
	adc	ebx,DWORD [4+ebp]
	adc	ecx,DWORD [8+ebp]
	adc	edx,DWORD [12+ebp]
	mov	DWORD [edi],eax
	mov	DWORD [4+edi],ebx
	mov	DWORD [8+edi],ecx
	mov	DWORD [12+edi],edx
	pop	edi
	pop	esi
	pop	ebx
	pop	ebp
	ret
align	32
align	16
__poly1305_init_sse2:
	movdqu	xmm4,[24+edi]
	lea	edi,[48+edi]
	mov	ebp,esp
	sub	esp,224
	and	esp,-16
	movq	xmm7,[64+ebx]
	movdqa	xmm0,xmm4
	movdqa	xmm1,xmm4
	movdqa	xmm2,xmm4
	pand	xmm0,xmm7
	psrlq	xmm1,26
	psrldq	xmm2,6
	pand	xmm1,xmm7
	movdqa	xmm3,xmm2
	psrlq	xmm2,4
	psrlq	xmm3,30
	pand	xmm2,xmm7
	pand	xmm3,xmm7
	psrldq	xmm4,13
	lea	edx,[144+esp]
	mov	ecx,2
L$004square:
	movdqa	[esp],xmm0
	movdqa	[16+esp],xmm1
	movdqa	[32+esp],xmm2
	movdqa	[48+esp],xmm3
	movdqa	[64+esp],xmm4
	movdqa	xmm6,xmm1
	movdqa	xmm5,xmm2
	pslld	xmm6,2
	pslld	xmm5,2
	paddd	xmm6,xmm1
	paddd	xmm5,xmm2
	movdqa	[80+esp],xmm6
	movdqa	[96+esp],xmm5
	movdqa	xmm6,xmm3
	movdqa	xmm5,xmm4
	pslld	xmm6,2
	pslld	xmm5,2
	paddd	xmm6,xmm3
	paddd	xmm5,xmm4
	movdqa	[112+esp],xmm6
	movdqa	[128+esp],xmm5
	pshufd	xmm6,xmm0,68
	movdqa	xmm5,xmm1
	pshufd	xmm1,xmm1,68
	pshufd	xmm2,xmm2,68
	pshufd	xmm3,xmm3,68
	pshufd	xmm4,xmm4,68
	movdqa	[edx],xmm6
	movdqa	[16+edx],xmm1
	movdqa	[32+edx],xmm2
	movdqa	[48+edx],xmm3
	movdqa	[64+edx],xmm4
	pmuludq	xmm4,xmm0
	pmuludq	xmm3,xmm0
	pmuludq	xmm2,xmm0
	pmuludq	xmm1,xmm0
	pmuludq	xmm0,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[48+edx]
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[32+edx]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[16+edx]
	paddq	xmm3,xmm6
	movdqa	xmm6,[80+esp]
	pmuludq	xmm5,[edx]
	paddq	xmm2,xmm7
	pmuludq	xmm6,[64+edx]
	movdqa	xmm7,[32+esp]
	paddq	xmm1,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[32+edx]
	paddq	xmm0,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[16+edx]
	paddq	xmm4,xmm7
	movdqa	xmm7,[96+esp]
	pmuludq	xmm6,[edx]
	paddq	xmm3,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[64+edx]
	paddq	xmm2,xmm6
	pmuludq	xmm5,[48+edx]
	movdqa	xmm6,[48+esp]
	paddq	xmm1,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[16+edx]
	paddq	xmm0,xmm5
	movdqa	xmm5,[112+esp]
	pmuludq	xmm7,[edx]
	paddq	xmm4,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[64+edx]
	paddq	xmm3,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[48+edx]
	paddq	xmm2,xmm5
	pmuludq	xmm7,[32+edx]
	movdqa	xmm5,[64+esp]
	paddq	xmm1,xmm6
	movdqa	xmm6,[128+esp]
	pmuludq	xmm5,[edx]
	paddq	xmm0,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[64+edx]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[16+edx]
	paddq	xmm3,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[32+edx]
	paddq	xmm0,xmm7
	pmuludq	xmm6,[48+edx]
	movdqa	xmm7,[64+ebx]
	paddq	xmm1,xmm5
	paddq	xmm2,xmm6
	movdqa	xmm5,xmm3
	pand	xmm3,xmm7
	psrlq	xmm5,26
	paddq	xmm5,xmm4
	movdqa	xmm6,xmm0
	pand	xmm0,xmm7
	psrlq	xmm6,26
	movdqa	xmm4,xmm5
	paddq	xmm6,xmm1
	psrlq	xmm5,26
	pand	xmm4,xmm7
	movdqa	xmm1,xmm6
	psrlq	xmm6,26
	paddd	xmm0,xmm5
	psllq	xmm5,2
	paddq	xmm6,xmm2
	paddq	xmm5,xmm0
	pand	xmm1,xmm7
	movdqa	xmm2,xmm6
	psrlq	xmm6,26
	pand	xmm2,xmm7
	paddd	xmm6,xmm3
	movdqa	xmm0,xmm5
	psrlq	xmm5,26
	movdqa	xmm3,xmm6
	psrlq	xmm6,26
	pand	xmm0,xmm7
	paddd	xmm1,xmm5
	pand	xmm3,xmm7
	paddd	xmm4,xmm6
	dec	ecx
	jz	NEAR L$005square_break
	punpcklqdq	xmm0,[esp]
	punpcklqdq	xmm1,[16+esp]
	punpcklqdq	xmm2,[32+esp]
	punpcklqdq	xmm3,[48+esp]
	punpcklqdq	xmm4,[64+esp]
	jmp	NEAR L$004square
L$005square_break:
	psllq	xmm0,32
	psllq	xmm1,32
	psllq	xmm2,32
	psllq	xmm3,32
	psllq	xmm4,32
	por	xmm0,[esp]
	por	xmm1,[16+esp]
	por	xmm2,[32+esp]
	por	xmm3,[48+esp]
	por	xmm4,[64+esp]
	pshufd	xmm0,xmm0,141
	pshufd	xmm1,xmm1,141
	pshufd	xmm2,xmm2,141
	pshufd	xmm3,xmm3,141
	pshufd	xmm4,xmm4,141
	movdqu	[edi],xmm0
	movdqu	[16+edi],xmm1
	movdqu	[32+edi],xmm2
	movdqu	[48+edi],xmm3
	movdqu	[64+edi],xmm4
	movdqa	xmm6,xmm1
	movdqa	xmm5,xmm2
	pslld	xmm6,2
	pslld	xmm5,2
	paddd	xmm6,xmm1
	paddd	xmm5,xmm2
	movdqu	[80+edi],xmm6
	movdqu	[96+edi],xmm5
	movdqa	xmm6,xmm3
	movdqa	xmm5,xmm4
	pslld	xmm6,2
	pslld	xmm5,2
	paddd	xmm6,xmm3
	paddd	xmm5,xmm4
	movdqu	[112+edi],xmm6
	movdqu	[128+edi],xmm5
	mov	esp,ebp
	lea	edi,[edi-48]
	ret
align	32
align	16
__poly1305_blocks_sse2:
	push	ebp
	push	ebx
	push	esi
	push	edi
	mov	edi,DWORD [20+esp]
	mov	esi,DWORD [24+esp]
	mov	ecx,DWORD [28+esp]
	mov	eax,DWORD [20+edi]
	and	ecx,-16
	jz	NEAR L$006nodata
	cmp	ecx,64
	jae	NEAR L$007enter_sse2
	test	eax,eax
	jz	NEAR L$enter_blocks
align	16
L$007enter_sse2:
	call	L$008pic_point
L$008pic_point:
	pop	ebx
	lea	ebx,[(L$const_sse2-L$008pic_point)+ebx]
	test	eax,eax
	jnz	NEAR L$009base2_26
	call	__poly1305_init_sse2
	mov	eax,DWORD [edi]
	mov	ecx,DWORD [3+edi]
	mov	edx,DWORD [6+edi]
	mov	esi,DWORD [9+edi]
	mov	ebp,DWORD [13+edi]
	mov	DWORD [20+edi],1
	shr	ecx,2
	and	eax,67108863
	shr	edx,4
	and	ecx,67108863
	shr	esi,6
	and	edx,67108863
	movd	xmm0,eax
	movd	xmm1,ecx
	movd	xmm2,edx
	movd	xmm3,esi
	movd	xmm4,ebp
	mov	esi,DWORD [24+esp]
	mov	ecx,DWORD [28+esp]
	jmp	NEAR L$010base2_32
align	16
L$009base2_26:
	movd	xmm0,DWORD [edi]
	movd	xmm1,DWORD [4+edi]
	movd	xmm2,DWORD [8+edi]
	movd	xmm3,DWORD [12+edi]
	movd	xmm4,DWORD [16+edi]
	movdqa	xmm7,[64+ebx]
L$010base2_32:
	mov	eax,DWORD [32+esp]
	mov	ebp,esp
	sub	esp,528
	and	esp,-16
	lea	edi,[48+edi]
	shl	eax,24
	test	ecx,31
	jz	NEAR L$011even
	movdqu	xmm6,[esi]
	lea	esi,[16+esi]
	movdqa	xmm5,xmm6
	pand	xmm6,xmm7
	paddd	xmm0,xmm6
	movdqa	xmm6,xmm5
	psrlq	xmm5,26
	psrldq	xmm6,6
	pand	xmm5,xmm7
	paddd	xmm1,xmm5
	movdqa	xmm5,xmm6
	psrlq	xmm6,4
	pand	xmm6,xmm7
	paddd	xmm2,xmm6
	movdqa	xmm6,xmm5
	psrlq	xmm5,30
	pand	xmm5,xmm7
	psrldq	xmm6,7
	paddd	xmm3,xmm5
	movd	xmm5,eax
	paddd	xmm4,xmm6
	movd	xmm6,DWORD [12+edi]
	paddd	xmm4,xmm5
	movdqa	[esp],xmm0
	movdqa	[16+esp],xmm1
	movdqa	[32+esp],xmm2
	movdqa	[48+esp],xmm3
	movdqa	[64+esp],xmm4
	pmuludq	xmm0,xmm6
	pmuludq	xmm1,xmm6
	pmuludq	xmm2,xmm6
	movd	xmm5,DWORD [28+edi]
	pmuludq	xmm3,xmm6
	pmuludq	xmm4,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[48+esp]
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[32+esp]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[16+esp]
	paddq	xmm3,xmm6
	movd	xmm6,DWORD [92+edi]
	pmuludq	xmm5,[esp]
	paddq	xmm2,xmm7
	pmuludq	xmm6,[64+esp]
	movd	xmm7,DWORD [44+edi]
	paddq	xmm1,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[32+esp]
	paddq	xmm0,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[16+esp]
	paddq	xmm4,xmm7
	movd	xmm7,DWORD [108+edi]
	pmuludq	xmm6,[esp]
	paddq	xmm3,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[64+esp]
	paddq	xmm2,xmm6
	pmuludq	xmm5,[48+esp]
	movd	xmm6,DWORD [60+edi]
	paddq	xmm1,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[16+esp]
	paddq	xmm0,xmm5
	movd	xmm5,DWORD [124+edi]
	pmuludq	xmm7,[esp]
	paddq	xmm4,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[64+esp]
	paddq	xmm3,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[48+esp]
	paddq	xmm2,xmm5
	pmuludq	xmm7,[32+esp]
	movd	xmm5,DWORD [76+edi]
	paddq	xmm1,xmm6
	movd	xmm6,DWORD [140+edi]
	pmuludq	xmm5,[esp]
	paddq	xmm0,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[64+esp]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[16+esp]
	paddq	xmm3,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[32+esp]
	paddq	xmm0,xmm7
	pmuludq	xmm6,[48+esp]
	movdqa	xmm7,[64+ebx]
	paddq	xmm1,xmm5
	paddq	xmm2,xmm6
	movdqa	xmm5,xmm3
	pand	xmm3,xmm7
	psrlq	xmm5,26
	paddq	xmm5,xmm4
	movdqa	xmm6,xmm0
	pand	xmm0,xmm7
	psrlq	xmm6,26
	movdqa	xmm4,xmm5
	paddq	xmm6,xmm1
	psrlq	xmm5,26
	pand	xmm4,xmm7
	movdqa	xmm1,xmm6
	psrlq	xmm6,26
	paddd	xmm0,xmm5
	psllq	xmm5,2
	paddq	xmm6,xmm2
	paddq	xmm5,xmm0
	pand	xmm1,xmm7
	movdqa	xmm2,xmm6
	psrlq	xmm6,26
	pand	xmm2,xmm7
	paddd	xmm6,xmm3
	movdqa	xmm0,xmm5
	psrlq	xmm5,26
	movdqa	xmm3,xmm6
	psrlq	xmm6,26
	pand	xmm0,xmm7
	paddd	xmm1,xmm5
	pand	xmm3,xmm7
	paddd	xmm4,xmm6
	sub	ecx,16
	jz	NEAR L$012done
L$011even:
	lea	edx,[384+esp]
	lea	eax,[esi-32]
	sub	ecx,64
	movdqu	xmm5,[edi]
	pshufd	xmm6,xmm5,68
	cmovb	esi,eax
	pshufd	xmm5,xmm5,238
	movdqa	[edx],xmm6
	lea	eax,[160+esp]
	movdqu	xmm6,[16+edi]
	movdqa	[edx-144],xmm5
	pshufd	xmm5,xmm6,68
	pshufd	xmm6,xmm6,238
	movdqa	[16+edx],xmm5
	movdqu	xmm5,[32+edi]
	movdqa	[edx-128],xmm6
	pshufd	xmm6,xmm5,68
	pshufd	xmm5,xmm5,238
	movdqa	[32+edx],xmm6
	movdqu	xmm6,[48+edi]
	movdqa	[edx-112],xmm5
	pshufd	xmm5,xmm6,68
	pshufd	xmm6,xmm6,238
	movdqa	[48+edx],xmm5
	movdqu	xmm5,[64+edi]
	movdqa	[edx-96],xmm6
	pshufd	xmm6,xmm5,68
	pshufd	xmm5,xmm5,238
	movdqa	[64+edx],xmm6
	movdqu	xmm6,[80+edi]
	movdqa	[edx-80],xmm5
	pshufd	xmm5,xmm6,68
	pshufd	xmm6,xmm6,238
	movdqa	[80+edx],xmm5
	movdqu	xmm5,[96+edi]
	movdqa	[edx-64],xmm6
	pshufd	xmm6,xmm5,68
	pshufd	xmm5,xmm5,238
	movdqa	[96+edx],xmm6
	movdqu	xmm6,[112+edi]
	movdqa	[edx-48],xmm5
	pshufd	xmm5,xmm6,68
	pshufd	xmm6,xmm6,238
	movdqa	[112+edx],xmm5
	movdqu	xmm5,[128+edi]
	movdqa	[edx-32],xmm6
	pshufd	xmm6,xmm5,68
	pshufd	xmm5,xmm5,238
	movdqa	[128+edx],xmm6
	movdqa	[edx-16],xmm5
	movdqu	xmm5,[32+esi]
	movdqu	xmm6,[48+esi]
	lea	esi,[32+esi]
	movdqa	[112+esp],xmm2
	movdqa	[128+esp],xmm3
	movdqa	[144+esp],xmm4
	movdqa	xmm2,xmm5
	movdqa	xmm3,xmm6
	psrldq	xmm2,6
	psrldq	xmm3,6
	movdqa	xmm4,xmm5
	punpcklqdq	xmm2,xmm3
	punpckhqdq	xmm4,xmm6
	punpcklqdq	xmm5,xmm6
	movdqa	xmm3,xmm2
	psrlq	xmm2,4
	psrlq	xmm3,30
	movdqa	xmm6,xmm5
	psrlq	xmm4,40
	psrlq	xmm6,26
	pand	xmm5,xmm7
	pand	xmm6,xmm7
	pand	xmm2,xmm7
	pand	xmm3,xmm7
	por	xmm4,[ebx]
	movdqa	[80+esp],xmm0
	movdqa	[96+esp],xmm1
	jbe	NEAR L$013skip_loop
	jmp	NEAR L$014loop
align	32
L$014loop:
	movdqa	xmm7,[edx-144]
	movdqa	[16+eax],xmm6
	movdqa	[32+eax],xmm2
	movdqa	[48+eax],xmm3
	movdqa	[64+eax],xmm4
	movdqa	xmm1,xmm5
	pmuludq	xmm5,xmm7
	movdqa	xmm0,xmm6
	pmuludq	xmm6,xmm7
	pmuludq	xmm2,xmm7
	pmuludq	xmm3,xmm7
	pmuludq	xmm4,xmm7
	pmuludq	xmm0,[edx-16]
	movdqa	xmm7,xmm1
	pmuludq	xmm1,[edx-128]
	paddq	xmm0,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[edx-112]
	paddq	xmm1,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[edx-96]
	paddq	xmm2,xmm7
	movdqa	xmm7,[16+eax]
	pmuludq	xmm6,[edx-80]
	paddq	xmm3,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[edx-128]
	paddq	xmm4,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[edx-112]
	paddq	xmm2,xmm7
	movdqa	xmm7,[32+eax]
	pmuludq	xmm6,[edx-96]
	paddq	xmm3,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[edx-32]
	paddq	xmm4,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[edx-16]
	paddq	xmm0,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[edx-128]
	paddq	xmm1,xmm5
	movdqa	xmm5,[48+eax]
	pmuludq	xmm7,[edx-112]
	paddq	xmm3,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[edx-48]
	paddq	xmm4,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[edx-32]
	paddq	xmm0,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[edx-16]
	paddq	xmm1,xmm6
	movdqa	xmm6,[64+eax]
	pmuludq	xmm5,[edx-128]
	paddq	xmm2,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[edx-16]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[edx-64]
	paddq	xmm3,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[edx-48]
	paddq	xmm0,xmm7
	movdqa	xmm7,[64+ebx]
	pmuludq	xmm6,[edx-32]
	paddq	xmm1,xmm5
	paddq	xmm2,xmm6
	movdqu	xmm5,[esi-32]
	movdqu	xmm6,[esi-16]
	lea	esi,[32+esi]
	movdqa	[32+esp],xmm2
	movdqa	[48+esp],xmm3
	movdqa	[64+esp],xmm4
	movdqa	xmm2,xmm5
	movdqa	xmm3,xmm6
	psrldq	xmm2,6
	psrldq	xmm3,6
	movdqa	xmm4,xmm5
	punpcklqdq	xmm2,xmm3
	punpckhqdq	xmm4,xmm6
	punpcklqdq	xmm5,xmm6
	movdqa	xmm3,xmm2
	psrlq	xmm2,4
	psrlq	xmm3,30
	movdqa	xmm6,xmm5
	psrlq	xmm4,40
	psrlq	xmm6,26
	pand	xmm5,xmm7
	pand	xmm6,xmm7
	pand	xmm2,xmm7
	pand	xmm3,xmm7
	por	xmm4,[ebx]
	lea	eax,[esi-32]
	sub	ecx,64
	paddd	xmm5,[80+esp]
	paddd	xmm6,[96+esp]
	paddd	xmm2,[112+esp]
	paddd	xmm3,[128+esp]
	paddd	xmm4,[144+esp]
	cmovb	esi,eax
	lea	eax,[160+esp]
	movdqa	xmm7,[edx]
	movdqa	[16+esp],xmm1
	movdqa	[16+eax],xmm6
	movdqa	[32+eax],xmm2
	movdqa	[48+eax],xmm3
	movdqa	[64+eax],xmm4
	movdqa	xmm1,xmm5
	pmuludq	xmm5,xmm7
	paddq	xmm5,xmm0
	movdqa	xmm0,xmm6
	pmuludq	xmm6,xmm7
	pmuludq	xmm2,xmm7
	pmuludq	xmm3,xmm7
	pmuludq	xmm4,xmm7
	paddq	xmm6,[16+esp]
	paddq	xmm2,[32+esp]
	paddq	xmm3,[48+esp]
	paddq	xmm4,[64+esp]
	pmuludq	xmm0,[128+edx]
	movdqa	xmm7,xmm1
	pmuludq	xmm1,[16+edx]
	paddq	xmm0,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[32+edx]
	paddq	xmm1,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[48+edx]
	paddq	xmm2,xmm7
	movdqa	xmm7,[16+eax]
	pmuludq	xmm6,[64+edx]
	paddq	xmm3,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[16+edx]
	paddq	xmm4,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[32+edx]
	paddq	xmm2,xmm7
	movdqa	xmm7,[32+eax]
	pmuludq	xmm6,[48+edx]
	paddq	xmm3,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[112+edx]
	paddq	xmm4,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[128+edx]
	paddq	xmm0,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[16+edx]
	paddq	xmm1,xmm5
	movdqa	xmm5,[48+eax]
	pmuludq	xmm7,[32+edx]
	paddq	xmm3,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[96+edx]
	paddq	xmm4,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[112+edx]
	paddq	xmm0,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[128+edx]
	paddq	xmm1,xmm6
	movdqa	xmm6,[64+eax]
	pmuludq	xmm5,[16+edx]
	paddq	xmm2,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[128+edx]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[80+edx]
	paddq	xmm3,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[96+edx]
	paddq	xmm0,xmm7
	movdqa	xmm7,[64+ebx]
	pmuludq	xmm6,[112+edx]
	paddq	xmm1,xmm5
	paddq	xmm2,xmm6
	movdqa	xmm5,xmm3
	pand	xmm3,xmm7
	psrlq	xmm5,26
	paddq	xmm5,xmm4
	movdqa	xmm6,xmm0
	pand	xmm0,xmm7
	psrlq	xmm6,26
	movdqa	xmm4,xmm5
	paddq	xmm6,xmm1
	psrlq	xmm5,26
	pand	xmm4,xmm7
	movdqa	xmm1,xmm6
	psrlq	xmm6,26
	paddd	xmm0,xmm5
	psllq	xmm5,2
	paddq	xmm6,xmm2
	paddq	xmm5,xmm0
	pand	xmm1,xmm7
	movdqa	xmm2,xmm6
	psrlq	xmm6,26
	pand	xmm2,xmm7
	paddd	xmm6,xmm3
	movdqa	xmm0,xmm5
	psrlq	xmm5,26
	movdqa	xmm3,xmm6
	psrlq	xmm6,26
	pand	xmm0,xmm7
	paddd	xmm1,xmm5
	pand	xmm3,xmm7
	paddd	xmm4,xmm6
	movdqu	xmm5,[32+esi]
	movdqu	xmm6,[48+esi]
	lea	esi,[32+esi]
	movdqa	[112+esp],xmm2
	movdqa	[128+esp],xmm3
	movdqa	[144+esp],xmm4
	movdqa	xmm2,xmm5
	movdqa	xmm3,xmm6
	psrldq	xmm2,6
	psrldq	xmm3,6
	movdqa	xmm4,xmm5
	punpcklqdq	xmm2,xmm3
	punpckhqdq	xmm4,xmm6
	punpcklqdq	xmm5,xmm6
	movdqa	xmm3,xmm2
	psrlq	xmm2,4
	psrlq	xmm3,30
	movdqa	xmm6,xmm5
	psrlq	xmm4,40
	psrlq	xmm6,26
	pand	xmm5,xmm7
	pand	xmm6,xmm7
	pand	xmm2,xmm7
	pand	xmm3,xmm7
	por	xmm4,[ebx]
	movdqa	[80+esp],xmm0
	movdqa	[96+esp],xmm1
	ja	NEAR L$014loop
L$013skip_loop:
	pshufd	xmm7,[edx-144],16
	add	ecx,32
	jnz	NEAR L$015long_tail
	paddd	xmm5,xmm0
	paddd	xmm6,xmm1
	paddd	xmm2,[112+esp]
	paddd	xmm3,[128+esp]
	paddd	xmm4,[144+esp]
L$015long_tail:
	movdqa	[eax],xmm5
	movdqa	[16+eax],xmm6
	movdqa	[32+eax],xmm2
	movdqa	[48+eax],xmm3
	movdqa	[64+eax],xmm4
	pmuludq	xmm5,xmm7
	pmuludq	xmm6,xmm7
	pmuludq	xmm2,xmm7
	movdqa	xmm0,xmm5
	pshufd	xmm5,[edx-128],16
	pmuludq	xmm3,xmm7
	movdqa	xmm1,xmm6
	pmuludq	xmm4,xmm7
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[48+eax]
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[32+eax]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[16+eax]
	paddq	xmm3,xmm6
	pshufd	xmm6,[edx-64],16
	pmuludq	xmm5,[eax]
	paddq	xmm2,xmm7
	pmuludq	xmm6,[64+eax]
	pshufd	xmm7,[edx-112],16
	paddq	xmm1,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[32+eax]
	paddq	xmm0,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[16+eax]
	paddq	xmm4,xmm7
	pshufd	xmm7,[edx-48],16
	pmuludq	xmm6,[eax]
	paddq	xmm3,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[64+eax]
	paddq	xmm2,xmm6
	pmuludq	xmm5,[48+eax]
	pshufd	xmm6,[edx-96],16
	paddq	xmm1,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[16+eax]
	paddq	xmm0,xmm5
	pshufd	xmm5,[edx-32],16
	pmuludq	xmm7,[eax]
	paddq	xmm4,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[64+eax]
	paddq	xmm3,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[48+eax]
	paddq	xmm2,xmm5
	pmuludq	xmm7,[32+eax]
	pshufd	xmm5,[edx-80],16
	paddq	xmm1,xmm6
	pshufd	xmm6,[edx-16],16
	pmuludq	xmm5,[eax]
	paddq	xmm0,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[64+eax]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[16+eax]
	paddq	xmm3,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[32+eax]
	paddq	xmm0,xmm7
	pmuludq	xmm6,[48+eax]
	movdqa	xmm7,[64+ebx]
	paddq	xmm1,xmm5
	paddq	xmm2,xmm6
	jz	NEAR L$016short_tail
	movdqu	xmm5,[esi-32]
	movdqu	xmm6,[esi-16]
	lea	esi,[32+esi]
	movdqa	[32+esp],xmm2
	movdqa	[48+esp],xmm3
	movdqa	[64+esp],xmm4
	movdqa	xmm2,xmm5
	movdqa	xmm3,xmm6
	psrldq	xmm2,6
	psrldq	xmm3,6
	movdqa	xmm4,xmm5
	punpcklqdq	xmm2,xmm3
	punpckhqdq	xmm4,xmm6
	punpcklqdq	xmm5,xmm6
	movdqa	xmm3,xmm2
	psrlq	xmm2,4
	psrlq	xmm3,30
	movdqa	xmm6,xmm5
	psrlq	xmm4,40
	psrlq	xmm6,26
	pand	xmm5,xmm7
	pand	xmm6,xmm7
	pand	xmm2,xmm7
	pand	xmm3,xmm7
	por	xmm4,[ebx]
	pshufd	xmm7,[edx],16
	paddd	xmm5,[80+esp]
	paddd	xmm6,[96+esp]
	paddd	xmm2,[112+esp]
	paddd	xmm3,[128+esp]
	paddd	xmm4,[144+esp]
	movdqa	[esp],xmm5
	pmuludq	xmm5,xmm7
	movdqa	[16+esp],xmm6
	pmuludq	xmm6,xmm7
	paddq	xmm0,xmm5
	movdqa	xmm5,xmm2
	pmuludq	xmm2,xmm7
	paddq	xmm1,xmm6
	movdqa	xmm6,xmm3
	pmuludq	xmm3,xmm7
	paddq	xmm2,[32+esp]
	movdqa	[32+esp],xmm5
	pshufd	xmm5,[16+edx],16
	paddq	xmm3,[48+esp]
	movdqa	[48+esp],xmm6
	movdqa	xmm6,xmm4
	pmuludq	xmm4,xmm7
	paddq	xmm4,[64+esp]
	movdqa	[64+esp],xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[48+esp]
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[32+esp]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[16+esp]
	paddq	xmm3,xmm6
	pshufd	xmm6,[80+edx],16
	pmuludq	xmm5,[esp]
	paddq	xmm2,xmm7
	pmuludq	xmm6,[64+esp]
	pshufd	xmm7,[32+edx],16
	paddq	xmm1,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[32+esp]
	paddq	xmm0,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[16+esp]
	paddq	xmm4,xmm7
	pshufd	xmm7,[96+edx],16
	pmuludq	xmm6,[esp]
	paddq	xmm3,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[64+esp]
	paddq	xmm2,xmm6
	pmuludq	xmm5,[48+esp]
	pshufd	xmm6,[48+edx],16
	paddq	xmm1,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[16+esp]
	paddq	xmm0,xmm5
	pshufd	xmm5,[112+edx],16
	pmuludq	xmm7,[esp]
	paddq	xmm4,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[64+esp]
	paddq	xmm3,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[48+esp]
	paddq	xmm2,xmm5
	pmuludq	xmm7,[32+esp]
	pshufd	xmm5,[64+edx],16
	paddq	xmm1,xmm6
	pshufd	xmm6,[128+edx],16
	pmuludq	xmm5,[esp]
	paddq	xmm0,xmm7
	movdqa	xmm7,xmm6
	pmuludq	xmm6,[64+esp]
	paddq	xmm4,xmm5
	movdqa	xmm5,xmm7
	pmuludq	xmm7,[16+esp]
	paddq	xmm3,xmm6
	movdqa	xmm6,xmm5
	pmuludq	xmm5,[32+esp]
	paddq	xmm0,xmm7
	pmuludq	xmm6,[48+esp]
	movdqa	xmm7,[64+ebx]
	paddq	xmm1,xmm5
	paddq	xmm2,xmm6
L$016short_tail:
	pshufd	xmm6,xmm4,78
	pshufd	xmm5,xmm3,78
	paddq	xmm4,xmm6
	paddq	xmm3,xmm5
	pshufd	xmm6,xmm0,78
	pshufd	xmm5,xmm1,78
	paddq	xmm0,xmm6
	paddq	xmm1,xmm5
	pshufd	xmm6,xmm2,78
	movdqa	xmm5,xmm3
	pand	xmm3,xmm7
	psrlq	xmm5,26
	paddq	xmm2,xmm6
	paddq	xmm5,xmm4
	movdqa	xmm6,xmm0
	pand	xmm0,xmm7
	psrlq	xmm6,26
	movdqa	xmm4,xmm5
	paddq	xmm6,xmm1
	psrlq	xmm5,26
	pand	xmm4,xmm7
	movdqa	xmm1,xmm6
	psrlq	xmm6,26
	paddd	xmm0,xmm5
	psllq	xmm5,2
	paddq	xmm6,xmm2
	paddq	xmm5,xmm0
	pand	xmm1,xmm7
	movdqa	xmm2,xmm6
	psrlq	xmm6,26
	pand	xmm2,xmm7
	paddd	xmm6,xmm3
	movdqa	xmm0,xmm5
	psrlq	xmm5,26
	movdqa	xmm3,xmm6
	psrlq	xmm6,26
	pand	xmm0,xmm7
	paddd	xmm1,xmm5
	pand	xmm3,xmm7
	paddd	xmm4,xmm6
L$012done:
	movd	DWORD [edi-48],xmm0
	movd	DWORD [edi-44],xmm1
	movd	DWORD [edi-40],xmm2
	movd	DWORD [edi-36],xmm3
	movd	DWORD [edi-32],xmm4
	mov	esp,ebp
L$006nodata:
	pop	edi
	pop	esi
	pop	ebx
	pop	ebp
	ret
align	32
align	16
__poly1305_emit_sse2:
	push	ebp
	push	ebx
	push	esi
	push	edi
	mov	ebp,DWORD [20+esp]
	cmp	DWORD [20+ebp],0
	je	NEAR L$enter_emit
	mov	eax,DWORD [ebp]
	mov	edi,DWORD [4+ebp]
	mov	ecx,DWORD [8+ebp]
	mov	edx,DWORD [12+ebp]
	mov	esi,DWORD [16+ebp]
	mov	ebx,edi
	shl	edi,26
	shr	ebx,6
	add	eax,edi
	mov	edi,ecx
	adc	ebx,0
	shl	edi,20
	shr	ecx,12
	add	ebx,edi
	mov	edi,edx
	adc	ecx,0
	shl	edi,14
	shr	edx,18
	add	ecx,edi
	mov	edi,esi
	adc	edx,0
	shl	edi,8
	shr	esi,24
	add	edx,edi
	adc	esi,0
	mov	edi,esi
	and	esi,3
	shr	edi,2
	lea	ebp,[edi*4+edi]
	mov	edi,DWORD [24+esp]
	add	eax,ebp
	mov	ebp,DWORD [28+esp]
	adc	ebx,0
	adc	ecx,0
	adc	edx,0
	adc	esi,0
	movd	xmm0,eax
	add	eax,5
	movd	xmm1,ebx
	adc	ebx,0
	movd	xmm2,ecx
	adc	ecx,0
	movd	xmm3,edx
	adc	edx,0
	adc	esi,0
	shr	esi,2
	neg	esi
	and	eax,esi
	and	ebx,esi
	and	ecx,esi
	and	edx,esi
	mov	DWORD [edi],eax
	movd	eax,xmm0
	mov	DWORD [4+edi],ebx
	movd	ebx,xmm1
	mov	DWORD [8+edi],ecx
	movd	ecx,xmm2
	mov	DWORD [12+edi],edx
	movd	edx,xmm3
	not	esi
	and	eax,esi
	and	ebx,esi
	or	eax,DWORD [edi]
	and	ecx,esi
	or	ebx,DWORD [4+edi]
	and	edx,esi
	or	ecx,DWORD [8+edi]
	or	edx,DWORD [12+edi]
	add	eax,DWORD [ebp]
	adc	ebx,DWORD [4+ebp]
	mov	DWORD [edi],eax
	adc	ecx,DWORD [8+ebp]
	mov	DWORD [4+edi],ebx
	adc	edx,DWORD [12+ebp]
	mov	DWORD [8+edi],ecx
	mov	DWORD [12+edi],edx
	pop	edi
	pop	esi
	pop	ebx
	pop	ebp
	ret
align	64
L$const_sse2:
dd	16777216,0,16777216,0,16777216,0,16777216,0
dd	0,0,0,0,0,0,0,0
dd	67108863,0,67108863,0,67108863,0,67108863,0
dd	268435455,268435452,268435452,268435452
db	80,111,108,121,49,51,48,53,32,102,111,114,32,120,56,54
db	44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32
db	60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111
db	114,103,62,0
align	4
segment	.bss
common	_GFp_ia32cap_P 16
