















































	.file "umac-nh-n.asm"
	
	
	
	.text
	.align 16

.globl _nettle_umac_nh_n
.def _nettle_umac_nh_n
.scl 2
.type 32
.endef
_nettle_umac_nh_n: 
	
  
        push	%rdi
        
      sub	$128, %rsp
      movdqa	%xmm6, 0(%rsp)
    
    
      movdqa	%xmm7, 16(%rsp)
    
    
      movdqa	%xmm8, 32(%rsp)
    
    
      movdqa	%xmm9, 48(%rsp)
    
    
      movdqa	%xmm10, 64(%rsp)
    
    
      movdqa	%xmm11, 80(%rsp)
    
    
      movdqa	%xmm12, 96(%rsp)
    
    
      movdqa	%xmm13, 112(%rsp)
    
    
    
        
      mov	%rcx, %rdi
    
    
            push	%rsi
      mov	%rdx, %rsi
    
    
      mov	%r8, %rdx
    
    
      mov	%r9, %rcx
    
    
      mov	184(%rsp), %r8
    
    
  

	pxor	%xmm12, %xmm12
	cmp	$3, %rsi
	jc	.Lnh2
	je	.Lnh3

.Lnh4:
	movups	(%rdx), %xmm4
	movups	16(%rdx), %xmm10
	movups	32(%rdx), %xmm6	
	lea	48(%rdx), %rdx
	
	movaps	%xmm4, %xmm8
	movaps	%xmm4, %xmm5
	
	punpcklqdq %xmm10, %xmm4	
	punpckhqdq %xmm10, %xmm5	
	movaps	%xmm10, %xmm11
	punpcklqdq %xmm6, %xmm10	
	punpckhqdq %xmm6, %xmm11	

	movaps	%xmm12, %xmm13
	
.Loop4:
	movups	(%r8), %xmm8
	movups	16(%r8), %xmm9

	pshufd	$0xee, %xmm9, %xmm3	
	pshufd	$0x44, %xmm9, %xmm2	
	pshufd	$0xee, %xmm8, %xmm1	
	pshufd	$0x44, %xmm8, %xmm0	

	paddd	%xmm0, %xmm4
	paddd	%xmm1, %xmm5
	paddd	%xmm2, %xmm10
	paddd 	%xmm3, %xmm11

	pshufd	$0xf5,	%xmm4, %xmm8
	pshufd	$0xf5,	%xmm10, %xmm9
	pmuludq %xmm4, %xmm10
	pmuludq %xmm8, %xmm9
	paddq	%xmm10, %xmm12
	paddq	%xmm9, %xmm12

	pshufd	$0xf5,	%xmm5, %xmm8
	pshufd	$0xf5,	%xmm11, %xmm9
	pmuludq %xmm5, %xmm11
	pmuludq %xmm8, %xmm9
	paddq	%xmm11, %xmm12
	paddq	%xmm9, %xmm12

	movaps	%xmm6, %xmm4
	movaps	%xmm6, %xmm5
	movups	(%rdx), %xmm10
	movups	16(%rdx), %xmm6
	punpcklqdq %xmm10, %xmm4	
	punpckhqdq %xmm10, %xmm5	
	movaps	%xmm10, %xmm11

	punpcklqdq %xmm6, %xmm10	
	punpckhqdq %xmm6, %xmm11	

	paddd	%xmm4, %xmm0
	paddd	%xmm5, %xmm1
	paddd	%xmm10, %xmm2
	paddd	%xmm11, %xmm3

	pshufd	$0xf5,	%xmm0, %xmm8
	pshufd	$0xf5,	%xmm2, %xmm9
	pmuludq %xmm0, %xmm2
	pmuludq %xmm8, %xmm9
	paddq	%xmm2, %xmm13
	paddq	%xmm9, %xmm13

	pshufd	$0xf5,	%xmm1, %xmm8
	pshufd	$0xf5,	%xmm3, %xmm9
	pmuludq %xmm1, %xmm3
	pmuludq %xmm8, %xmm9
	paddq	%xmm3, %xmm13
	paddq	%xmm9, %xmm13

	subl	$32, %ecx
	lea	32(%r8), %r8
	lea	32(%rdx), %rdx
	ja	.Loop4

	movups	%xmm12, (%rdi)
	movups	%xmm13, 16(%rdi)

	
  
    
      pop	%rsi
    
    
    
    
      movdqa	112(%rsp), %xmm13
    
    
      movdqa	96(%rsp), %xmm12
    
    
      movdqa	80(%rsp), %xmm11
    
    
      movdqa	64(%rsp), %xmm10
    
    
      movdqa	48(%rsp), %xmm9
    
    
      movdqa	32(%rsp), %xmm8
    
    
      movdqa	16(%rsp), %xmm7
    
    
      movdqa	(%rsp), %xmm6
      add	$128, %rsp
    
    pop	%rdi
  

	ret
	
.Lnh3:
	movups	(%rdx), %xmm4
	movups	16(%rdx), %xmm5
	movaps	%xmm12, %xmm13
.Loop3:
	lea	32(%rdx), %rdx
	movups	(%r8), %xmm8
	movups	16(%r8), %xmm9
	movups	(%rdx), %xmm6
	movups	16(%rdx), %xmm7
	pshufd	$0xee, %xmm9, %xmm3	
	pshufd	$0x44, %xmm9, %xmm2	
	pshufd	$0xee, %xmm8, %xmm1	
	pshufd	$0x44, %xmm8, %xmm0	

	
	paddd	%xmm6, %xmm8
	paddd	%xmm7, %xmm9
	pshufd	$0xf5,	%xmm8, %xmm10
	pshufd	$0xf5,	%xmm9, %xmm11
	pmuludq	%xmm8, %xmm9
	pmuludq	%xmm10, %xmm11
	paddq	%xmm9, %xmm13
	paddq	%xmm11, %xmm13

	
	movaps	%xmm4, %xmm8
	punpcklqdq %xmm5, %xmm4	
	punpckhqdq %xmm5, %xmm8	
	paddd	%xmm4, %xmm0
	paddd	%xmm8, %xmm1
	movaps	%xmm6, %xmm4
	movaps	%xmm5, %xmm8
	punpcklqdq %xmm6, %xmm5	
	punpckhqdq %xmm6, %xmm8	
	paddd	%xmm5, %xmm2
	paddd	%xmm8, %xmm3

	pshufd	$0xf5,	%xmm0, %xmm8
	pshufd	$0xf5,	%xmm2, %xmm9
	pmuludq %xmm0, %xmm2
	pmuludq %xmm8, %xmm9
	paddq	%xmm2, %xmm12
	paddq	%xmm9, %xmm12
	
	pshufd	$0xf5,	%xmm1, %xmm8
	pshufd	$0xf5,	%xmm3, %xmm9
	pmuludq %xmm1, %xmm3
	pmuludq %xmm8, %xmm9
	paddq	%xmm3, %xmm12
	paddq	%xmm9, %xmm12
	subl	$32, %ecx
	lea	32(%r8), %r8
	movaps	%xmm6, %xmm4
	movaps	%xmm7, %xmm5

	ja	.Loop3

	pshufd	$0xe, %xmm13, %xmm8
	paddq	%xmm8, %xmm13
	movups	%xmm12, (%rdi)
	movlpd	%xmm13, 16(%rdi)

	
  
    
      pop	%rsi
    
    
    
    
      movdqa	112(%rsp), %xmm13
    
    
      movdqa	96(%rsp), %xmm12
    
    
      movdqa	80(%rsp), %xmm11
    
    
      movdqa	64(%rsp), %xmm10
    
    
      movdqa	48(%rsp), %xmm9
    
    
      movdqa	32(%rsp), %xmm8
    
    
      movdqa	16(%rsp), %xmm7
    
    
      movdqa	(%rsp), %xmm6
      add	$128, %rsp
    
    pop	%rdi
  

	ret
	
.Lnh2:
	
	
	movups	(%rdx), %xmm4
	lea	16(%rdx), %rdx
.Loop2:
	movups	(%r8), %xmm0
	movups	16(%r8), %xmm1
	pshufd	$0xee, %xmm1, %xmm3	
	pshufd	$0x44, %xmm1, %xmm2	
	pshufd	$0xee, %xmm0, %xmm1	
	pshufd	$0x44, %xmm0, %xmm0	

	movups	(%rdx), %xmm5
	movups	16(%rdx), %xmm6
	movaps	%xmm4, %xmm8
	punpcklqdq %xmm5, %xmm4	
	punpckhqdq %xmm5, %xmm8	
	paddd	%xmm4, %xmm0
	paddd	%xmm8, %xmm1
	movaps	%xmm6, %xmm4
	movaps	%xmm5, %xmm8
	punpcklqdq %xmm6, %xmm5	
	punpckhqdq %xmm6, %xmm8	
	paddd	%xmm5, %xmm2
	paddd	%xmm8, %xmm3

	pshufd	$0xf5,	%xmm0, %xmm8
	pshufd	$0xf5,	%xmm2, %xmm9
	pmuludq %xmm0, %xmm2
	pmuludq %xmm8, %xmm9
	paddq	%xmm2, %xmm12
	paddq	%xmm9, %xmm12
	
	pshufd	$0xf5,	%xmm1, %xmm8
	pshufd	$0xf5,	%xmm3, %xmm9
	pmuludq %xmm1, %xmm3
	pmuludq %xmm8, %xmm9
	paddq	%xmm3, %xmm12
	paddq	%xmm9, %xmm12
	subl	$32, %ecx
	lea	32(%r8), %r8
	lea	32(%rdx), %rdx

	ja	.Loop2

	movups	%xmm12, (%rdi)
.Lend:
	
  
    
      pop	%rsi
    
    
    
    
      movdqa	112(%rsp), %xmm13
    
    
      movdqa	96(%rsp), %xmm12
    
    
      movdqa	80(%rsp), %xmm11
    
    
      movdqa	64(%rsp), %xmm10
    
    
      movdqa	48(%rsp), %xmm9
    
    
      movdqa	32(%rsp), %xmm8
    
    
      movdqa	16(%rsp), %xmm7
    
    
      movdqa	(%rsp), %xmm6
      add	$128, %rsp
    
    pop	%rdi
  

	ret




