#include <linux/linkage.h>

# enter salsa20_encrypt_bytes
ENTRY(salsa20_encrypt_bytes)
	mov	%rsp,%r11
	and	$31,%r11
	add	$256,%r11
	sub	%r11,%rsp
	# x = arg1
	mov	%rdi,%r8
	# m = arg2
	mov	%rsi,%rsi
	# out = arg3
	mov	%rdx,%rdi
	# bytes = arg4
	mov	%rcx,%rdx
	#               unsigned>? bytes - 0
	cmp	$0,%rdx
	# comment:fp stack unchanged by jump
	# goto done if !unsigned>
	jbe	._done
	# comment:fp stack unchanged by fallthrough
# start:
._start:
	# r11_stack = r11
	movq	%r11,0(%rsp)
	# r12_stack = r12
	movq	%r12,8(%rsp)
	# r13_stack = r13
	movq	%r13,16(%rsp)
	# r14_stack = r14
	movq	%r14,24(%rsp)
	# r15_stack = r15
	movq	%r15,32(%rsp)
	# rbx_stack = rbx
	movq	%rbx,40(%rsp)
	# rbp_stack = rbp
	movq	%rbp,48(%rsp)
	# in0 = *(uint64 *) (x + 0)
	movq	0(%r8),%rcx
	# in2 = *(uint64 *) (x + 8)
	movq	8(%r8),%r9
	# in4 = *(uint64 *) (x + 16)
	movq	16(%r8),%rax
	# in6 = *(uint64 *) (x + 24)
	movq	24(%r8),%r10
	# in8 = *(uint64 *) (x + 32)
	movq	32(%r8),%r11
	# in10 = *(uint64 *) (x + 40)
	movq	40(%r8),%r12
	# in12 = *(uint64 *) (x + 48)
	movq	48(%r8),%r13
	# in14 = *(uint64 *) (x + 56)
	movq	56(%r8),%r14
	# j0 = in0
	movq	%rcx,56(%rsp)
	# j2 = in2
	movq	%r9,64(%rsp)
	# j4 = in4
	movq	%rax,72(%rsp)
	# j6 = in6
	movq	%r10,80(%rsp)
	# j8 = in8
	movq	%r11,88(%rsp)
	# j10 = in10
	movq	%r12,96(%rsp)
	# j12 = in12
	movq	%r13,104(%rsp)
	# j14 = in14
	movq	%r14,112(%rsp)
	# x_backup = x
	movq	%r8,120(%rsp)
# bytesatleast1:
._bytesatleast1:
	#                   unsigned<? bytes - 64
	cmp	$64,%rdx
	# comment:fp stack unchanged by jump
	#   goto nocopy if !unsigned<
	jae	._nocopy
	#     ctarget = out
	movq	%rdi,128(%rsp)
	#     out = &tmp
	leaq	192(%rsp),%rdi
	#     i = bytes
	mov	%rdx,%rcx
	#     while (i) { *out++ = *m++; --i }
	rep	movsb
	#     out = &tmp
	leaq	192(%rsp),%rdi
	#     m = &tmp
	leaq	192(%rsp),%rsi
	# comment:fp stack unchanged by fallthrough
#   nocopy:
._nocopy:
	#   out_backup = out
	movq	%rdi,136(%rsp)
	#   m_backup = m
	movq	%rsi,144(%rsp)
	#   bytes_backup = bytes
	movq	%rdx,152(%rsp)
	#   x1 = j0
	movq	56(%rsp),%rdi
	#   x0 = x1
	mov	%rdi,%rdx
	#   (uint64) x1 >>= 32
	shr	$32,%rdi
	#   		x3 = j2
	movq	64(%rsp),%rsi
	#   		x2 = x3
	mov	%rsi,%rcx
	#   		(uint64) x3 >>= 32
	shr	$32,%rsi
	#   x5 = j4
	movq	72(%rsp),%r8
	#   x4 = x5
	mov	%r8,%r9
	#   (uint64) x5 >>= 32
	shr	$32,%r8
	#   x5_stack = x5
	movq	%r8,160(%rsp)
	#   		x7 = j6
	movq	80(%rsp),%r8
	#   		x6 = x7
	mov	%r8,%rax
	#   		(uint64) x7 >>= 32
	shr	$32,%r8
	#   x9 = j8
	movq	88(%rsp),%r10
	#   x8 = x9
	mov	%r10,%r11
	#   (uint64) x9 >>= 32
	shr	$32,%r10
	#   		x11 = j10
	movq	96(%rsp),%r12
	#   		x10 = x11
	mov	%r12,%r13
	#   		x10_stack = x10
	movq	%r13,168(%rsp)
	#   		(uint64) x11 >>= 32
	shr	$32,%r12
	#   x13 = j12
	movq	104(%rsp),%r13
	#   x12 = x13
	mov	%r13,%r14
	#   (uint64) x13 >>= 32
	shr	$32,%r13
	#   		x15 = j14
	movq	112(%rsp),%r15
	#   		x14 = x15
	mov	%r15,%rbx
	#   		(uint64) x15 >>= 32
	shr	$32,%r15
	#   		x15_stack = x15
	movq	%r15,176(%rsp)
	#   i = 20
	mov	$20,%r15
#   mainloop:
._mainloop:
	#   i_backup = i
	movq	%r15,184(%rsp)
	# 		x5 = x5_stack
	movq	160(%rsp),%r15
	# a = x12 + x0
	lea	(%r14,%rdx),%rbp
	# (uint32) a <<<= 7
	rol	$7,%ebp
	# x4 ^= a
	xor	%rbp,%r9
	# 		b = x1 + x5
	lea	(%rdi,%r15),%rbp
	# 		(uint32) b <<<= 7
	rol	$7,%ebp
	# 		x9 ^= b
	xor	%rbp,%r10
	# a = x0 + x4
	lea	(%rdx,%r9),%rbp
	# (uint32) a <<<= 9
	rol	$9,%ebp
	# x8 ^= a
	xor	%rbp,%r11
	# 		b = x5 + x9
	lea	(%r15,%r10),%rbp
	# 		(uint32) b <<<= 9
	rol	$9,%ebp
	# 		x13 ^= b
	xor	%rbp,%r13
	# a = x4 + x8
	lea	(%r9,%r11),%rbp
	# (uint32) a <<<= 13
	rol	$13,%ebp
	# x12 ^= a
	xor	%rbp,%r14
	# 		b = x9 + x13
	lea	(%r10,%r13),%rbp
	# 		(uint32) b <<<= 13
	rol	$13,%ebp
	# 		x1 ^= b
	xor	%rbp,%rdi
	# a = x8 + x12
	lea	(%r11,%r14),%rbp
	# (uint32) a <<<= 18
	rol	$18,%ebp
	# x0 ^= a
	xor	%rbp,%rdx
	# 		b = x13 + x1
	lea	(%r13,%rdi),%rbp
	# 		(uint32) b <<<= 18
	rol	$18,%ebp
	# 		x5 ^= b
	xor	%rbp,%r15
	# 				x10 = x10_stack
	movq	168(%rsp),%rbp
	# 		x5_stack = x5
	movq	%r15,160(%rsp)
	# 				c = x6 + x10
	lea	(%rax,%rbp),%r15
	# 				(uint32) c <<<= 7
	rol	$7,%r15d
	# 				x14 ^= c
	xor	%r15,%rbx
	# 				c = x10 + x14
	lea	(%rbp,%rbx),%r15
	# 				(uint32) c <<<= 9
	rol	$9,%r15d
	# 				x2 ^= c
	xor	%r15,%rcx
	# 				c = x14 + x2
	lea	(%rbx,%rcx),%r15
	# 				(uint32) c <<<= 13
	rol	$13,%r15d
	# 				x6 ^= c
	xor	%r15,%rax
	# 				c = x2 + x6
	lea	(%rcx,%rax),%r15
	# 				(uint32) c <<<= 18
	rol	$18,%r15d
	# 				x10 ^= c
	xor	%r15,%rbp
	# 						x15 = x15_stack
	movq	176(%rsp),%r15
	# 				x10_stack = x10
	movq	%rbp,168(%rsp)
	# 						d = x11 + x15
	lea	(%r12,%r15),%rbp
	# 						(uint32) d <<<= 7
	rol	$7,%ebp
	# 						x3 ^= d
	xor	%rbp,%rsi
	# 						d = x15 + x3
	lea	(%r15,%rsi),%rbp
	# 						(uint32) d <<<= 9
	rol	$9,%ebp
	# 						x7 ^= d
	xor	%rbp,%r8
	# 						d = x3 + x7
	lea	(%rsi,%r8),%rbp
	# 						(uint32) d <<<= 13
	rol	$13,%ebp
	# 						x11 ^= d
	xor	%rbp,%r12
	# 						d = x7 + x11
	lea	(%r8,%r12),%rbp
	# 						(uint32) d <<<= 18
	rol	$18,%ebp
	# 						x15 ^= d
	xor	%rbp,%r15
	# 						x15_stack = x15
	movq	%r15,176(%rsp)
	# 		x5 = x5_stack
	movq	160(%rsp),%r15
	# a = x3 + x0
	lea	(%rsi,%rdx),%rbp
	# (uint32) a <<<= 7
	rol	$7,%ebp
	# x1 ^= a
	xor	%rbp,%rdi
	# 		b = x4 + x5
	lea	(%r9,%r15),%rbp
	# 		(uint32) b <<<= 7
	rol	$7,%ebp
	# 		x6 ^= b
	xor	%rbp,%rax
	# a = x0 + x1
	lea	(%rdx,%rdi),%rbp
	# (uint32) a <<<= 9
	rol	$9,%ebp
	# x2 ^= a
	xor	%rbp,%rcx
	# 		b = x5 + x6
	lea	(%r15,%rax),%rbp
	# 		(uint32) b <<<= 9
	rol	$9,%ebp
	# 		x7 ^= b
	xor	%rbp,%r8
	# a = x1 + x2
	lea	(%rdi,%rcx),%rbp
	# (uint32) a <<<= 13
	rol	$13,%ebp
	# x3 ^= a
	xor	%rbp,%rsi
	# 		b = x6 + x7
	lea	(%rax,%r8),%rbp
	# 		(uint32) b <<<= 13
	rol	$13,%ebp
	# 		x4 ^= b
	xor	%rbp,%r9
	# a = x2 + x3
	lea	(%rcx,%rsi),%rbp
	# (uint32) a <<<= 18
	rol	$18,%ebp
	# x0 ^= a
	xor	%rbp,%rdx
	# 		b = x7 + x4
	lea	(%r8,%r9),%rbp
	# 		(uint32) b <<<= 18
	rol	$18,%ebp
	# 		x5 ^= b
	xor	%rbp,%r15
	# 				x10 = x10_stack
	movq	168(%rsp),%rbp
	# 		x5_stack = x5
	movq	%r15,160(%rsp)
	# 				c = x9 + x10
	lea	(%r10,%rbp),%r15
	# 				(uint32) c <<<= 7
	rol	$7,%r15d
	# 				x11 ^= c
	xor	%r15,%r12
	# 				c = x10 + x11
	lea	(%rbp,%r12),%r15
	# 				(uint32) c <<<= 9
	rol	$9,%r15d
	# 				x8 ^= c
	xor	%r15,%r11
	# 				c = x11 + x8
	lea	(%r12,%r11),%r15
	# 				(uint32) c <<<= 13
	rol	$13,%r15d
	# 				x9 ^= c
	xor	%r15,%r10
	# 				c = x8 + x9
	lea	(%r11,%r10),%r15
	# 				(uint32) c <<<= 18
	rol	$18,%r15d
	# 				x10 ^= c
	xor	%r15,%rbp
	# 						x15 = x15_stack
	movq	176(%rsp),%r15
	# 				x10_stack = x10
	movq	%rbp,168(%rsp)
	# 						d = x14 + x15
	lea	(%rbx,%r15),%rbp
	# 						(uint32) d <<<= 7
	rol	$7,%ebp
	# 						x12 ^= d
	xor	%rbp,%r14
	# 						d = x15 + x12
	lea	(%r15,%r14),%rbp
	# 						(uint32) d <<<= 9
	rol	$9,%ebp
	# 						x13 ^= d
	xor	%rbp,%r13
	# 						d = x12 + x13
	lea	(%r14,%r13),%rbp
	# 						(uint32) d <<<= 13
	rol	$13,%ebp
	# 						x14 ^= d
	xor	%rbp,%rbx
	# 						d = x13 + x14
	lea	(%r13,%rbx),%rbp
	# 						(uint32) d <<<= 18
	rol	$18,%ebp
	# 						x15 ^= d
	xor	%rbp,%r15
	# 						x15_stack = x15
	movq	%r15,176(%rsp)
	# 		x5 = x5_stack
	movq	160(%rsp),%r15
	# a = x12 + x0
	lea	(%r14,%rdx),%rbp
	# (uint32) a <<<= 7
	rol	$7,%ebp
	# x4 ^= a
	xor	%rbp,%r9
	# 		b = x1 + x5
	lea	(%rdi,%r15),%rbp
	# 		(uint32) b <<<= 7
	rol	$7,%ebp
	# 		x9 ^= b
	xor	%rbp,%r10
	# a = x0 + x4
	lea	(%rdx,%r9),%rbp
	# (uint32) a <<<= 9
	rol	$9,%ebp
	# x8 ^= a
	xor	%rbp,%r11
	# 		b = x5 + x9
	lea	(%r15,%r10),%rbp
	# 		(uint32) b <<<= 9
	rol	$9,%ebp
	# 		x13 ^= b
	xor	%rbp,%r13
	# a = x4 + x8
	lea	(%r9,%r11),%rbp
	# (uint32) a <<<= 13
	rol	$13,%ebp
	# x12 ^= a
	xor	%rbp,%r14
	# 		b = x9 + x13
	lea	(%r10,%r13),%rbp
	# 		(uint32) b <<<= 13
	rol	$13,%ebp
	# 		x1 ^= b
	xor	%rbp,%rdi
	# a = x8 + x12
	lea	(%r11,%r14),%rbp
	# (uint32) a <<<= 18
	rol	$18,%ebp
	# x0 ^= a
	xor	%rbp,%rdx
	# 		b = x13 + x1
	lea	(%r13,%rdi),%rbp
	# 		(uint32) b <<<= 18
	rol	$18,%ebp
	# 		x5 ^= b
	xor	%rbp,%r15
	# 				x10 = x10_stack
	movq	168(%rsp),%rbp
	# 		x5_stack = x5
	movq	%r15,160(%rsp)
	# 				c = x6 + x10
	lea	(%rax,%rbp),%r15
	# 				(uint32) c <<<= 7
	rol	$7,%r15d
	# 				x14 ^= c
	xor	%r15,%rbx
	# 				c = x10 + x14
	lea	(%rbp,%rbx),%r15
	# 				(uint32) c <<<= 9
	rol	$9,%r15d
	# 				x2 ^= c
	xor	%r15,%rcx
	# 				c = x14 + x2
	lea	(%rbx,%rcx),%r15
	# 				(uint32) c <<<= 13
	rol	$13,%r15d
	# 				x6 ^= c
	xor	%r15,%rax
	# 				c = x2 + x6
	lea	(%rcx,%rax),%r15
	# 				(uint32) c <<<= 18
	rol	$18,%r15d
	# 				x10 ^= c
	xor	%r15,%rbp
	# 						x15 = x15_stack
	movq	176(%rsp),%r15
	# 				x10_stack = x10
	movq	%rbp,168(%rsp)
	# 						d = x11 + x15
	lea	(%r12,%r15),%rbp
	# 						(uint32) d <<<= 7
	rol	$7,%ebp
	# 						x3 ^= d
	xor	%rbp,%rsi
	# 						d = x15 + x3
	lea	(%r15,%rsi),%rbp
	# 						(uint32) d <<<= 9
	rol	$9,%ebp
	# 						x7 ^= d
	xor	%rbp,%r8
	# 						d = x3 + x7
	lea	(%rsi,%r8),%rbp
	# 						(uint32) d <<<= 13
	rol	$13,%ebp
	# 						x11 ^= d
	xor	%rbp,%r12
	# 						d = x7 + x11
	lea	(%r8,%r12),%rbp
	# 						(uint32) d <<<= 18
	rol	$18,%ebp
	# 						x15 ^= d
	xor	%rbp,%r15
	# 						x15_stack = x15
	movq	%r15,176(%rsp)
	# 		x5 = x5_stack
	movq	160(%rsp),%r15
	# a = x3 + x0
	lea	(%rsi,%rdx),%rbp
	# (uint32) a <<<= 7
	rol	$7,%ebp
	# x1 ^= a
	xor	%rbp,%rdi
	# 		b = x4 + x5
	lea	(%r9,%r15),%rbp
	# 		(uint32) b <<<= 7
	rol	$7,%ebp
	# 		x6 ^= b
	xor	%rbp,%rax
	# a = x0 + x1
	lea	(%rdx,%rdi),%rbp
	# (uint32) a <<<= 9
	rol	$9,%ebp
	# x2 ^= a
	xor	%rbp,%rcx
	# 		b = x5 + x6
	lea	(%r15,%rax),%rbp
	# 		(uint32) b <<<= 9
	rol	$9,%ebp
	# 		x7 ^= b
	xor	%rbp,%r8
	# a = x1 + x2
	lea	(%rdi,%rcx),%rbp
	# (uint32) a <<<= 13
	rol	$13,%ebp
	# x3 ^= a
	xor	%rbp,%rsi
	# 		b = x6 + x7
	lea	(%rax,%r8),%rbp
	# 		(uint32) b <<<= 13
	rol	$13,%ebp
	# 		x4 ^= b
	xor	%rbp,%r9
	# a = x2 + x3
	lea	(%rcx,%rsi),%rbp
	# (uint32) a <<<= 18
	rol	$18,%ebp
	# x0 ^= a
	xor	%rbp,%rdx
	# 		b = x7 + x4
	lea	(%r8,%r9),%rbp
	# 		(uint32) b <<<= 18
	rol	$18,%ebp
	# 		x5 ^= b
	xor	%rbp,%r15
	# 				x10 = x10_stack
	movq	168(%rsp),%rbp
	# 		x5_stack = x5
	movq	%r15,160(%rsp)
	# 				c = x9 + x10
	lea	(%r10,%rbp),%r15
	# 				(uint32) c <<<= 7
	rol	$7,%r15d
	# 				x11 ^= c
	xor	%r15,%r12
	# 				c = x10 + x11
	lea	(%rbp,%r12),%r15
	# 				(uint32) c <<<= 9
	rol	$9,%r15d
	# 				x8 ^= c
	xor	%r15,%r11
	# 				c = x11 + x8
	lea	(%r12,%r11),%r15
	# 				(uint32) c <<<= 13
	rol	$13,%r15d
	# 				x9 ^= c
	xor	%r15,%r10
	# 				c = x8 + x9
	lea	(%r11,%r10),%r15
	# 				(uint32) c <<<= 18
	rol	$18,%r15d
	# 				x10 ^= c
	xor	%r15,%rbp
	# 						x15 = x15_stack
	movq	176(%rsp),%r15
	# 				x10_stack = x10
	movq	%rbp,168(%rsp)
	# 						d = x14 + x15
	lea	(%rbx,%r15),%rbp
	# 						(uint32) d <<<= 7
	rol	$7,%ebp
	# 						x12 ^= d
	xor	%rbp,%r14
	# 						d = x15 + x12
	lea	(%r15,%r14),%rbp
	# 						(uint32) d <<<= 9
	rol	$9,%ebp
	# 						x13 ^= d
	xor	%rbp,%r13
	# 						d = x12 + x13
	lea	(%r14,%r13),%rbp
	# 						(uint32) d <<<= 13
	rol	$13,%ebp
	# 						x14 ^= d
	xor	%rbp,%rbx
	# 						d = x13 + x14
	lea	(%r13,%rbx),%rbp
	# 						(uint32) d <<<= 18
	rol	$18,%ebp
	# 						x15 ^= d
	xor	%rbp,%r15
	# 						x15_stack = x15
	movq	%r15,176(%rsp)
	#   i = i_backup
	movq	184(%rsp),%r15
	#                  unsigned>? i -= 4
	sub	$4,%r15
	# comment:fp stack unchanged by jump
	# goto mainloop if unsigned>
	ja	._mainloop
	#   (uint32) x2 += j2
	addl	64(%rsp),%ecx
	#   x3 <<= 32
	shl	$32,%rsi
	#   x3 += j2
	addq	64(%rsp),%rsi
	#   (uint64) x3 >>= 32
	shr	$32,%rsi
	#   x3 <<= 32
	shl	$32,%rsi
	#   x2 += x3
	add	%rsi,%rcx
	#   (uint32) x6 += j6
	addl	80(%rsp),%eax
	#   x7 <<= 32
	shl	$32,%r8
	#   x7 += j6
	addq	80(%rsp),%r8
	#   (uint64) x7 >>= 32
	shr	$32,%r8
	#   x7 <<= 32
	shl	$32,%r8
	#   x6 += x7
	add	%r8,%rax
	#   (uint32) x8 += j8
	addl	88(%rsp),%r11d
	#   x9 <<= 32
	shl	$32,%r10
	#   x9 += j8
	addq	88(%rsp),%r10
	#   (uint64) x9 >>= 32
	shr	$32,%r10
	#   x9 <<= 32
	shl	$32,%r10
	#   x8 += x9
	add	%r10,%r11
	#   (uint32) x12 += j12
	addl	104(%rsp),%r14d
	#   x13 <<= 32
	shl	$32,%r13
	#   x13 += j12
	addq	104(%rsp),%r13
	#   (uint64) x13 >>= 32
	shr	$32,%r13
	#   x13 <<= 32
	shl	$32,%r13
	#   x12 += x13
	add	%r13,%r14
	#   (uint32) x0 += j0
	addl	56(%rsp),%edx
	#   x1 <<= 32
	shl	$32,%rdi
	#   x1 += j0
	addq	56(%rsp),%rdi
	#   (uint64) x1 >>= 32
	shr	$32,%rdi
	#   x1 <<= 32
	shl	$32,%rdi
	#   x0 += x1
	add	%rdi,%rdx
	#   x5 = x5_stack
	movq	160(%rsp),%rdi
	#   (uint32) x4 += j4
	addl	72(%rsp),%r9d
	#   x5 <<= 32
	shl	$32,%rdi
	#   x5 += j4
	addq	72(%rsp),%rdi
	#   (uint64) x5 >>= 32
	shr	$32,%rdi
	#   x5 <<= 32
	shl	$32,%rdi
	#   x4 += x5
	add	%rdi,%r9
	#   x10 = x10_stack
	movq	168(%rsp),%r8
	#   (uint32) x10 += j10
	addl	96(%rsp),%r8d
	#   x11 <<= 32
	shl	$32,%r12
	#   x11 += j10
	addq	96(%rsp),%r12
	#   (uint64) x11 >>= 32
	shr	$32,%r12
	#   x11 <<= 32
	shl	$32,%r12
	#   x10 += x11
	add	%r12,%r8
	#   x15 = x15_stack
	movq	176(%rsp),%rdi
	#   (uint32) x14 += j14
	addl	112(%rsp),%ebx
	#   x15 <<= 32
	shl	$32,%rdi
	#   x15 += j14
	addq	112(%rsp),%rdi
	#   (uint64) x15 >>= 32
	shr	$32,%rdi
	#   x15 <<= 32
	shl	$32,%rdi
	#   x14 += x15
	add	%rdi,%rbx
	#   out = out_backup
	movq	136(%rsp),%rdi
	#   m = m_backup
	movq	144(%rsp),%rsi
	#   x0 ^= *(uint64 *) (m + 0)
	xorq	0(%rsi),%rdx
	#   *(uint64 *) (out + 0) = x0
	movq	%rdx,0(%rdi)
	#   x2 ^= *(uint64 *) (m + 8)
	xorq	8(%rsi),%rcx
	#   *(uint64 *) (out + 8) = x2
	movq	%rcx,8(%rdi)
	#   x4 ^= *(uint64 *) (m + 16)
	xorq	16(%rsi),%r9
	#   *(uint64 *) (out + 16) = x4
	movq	%r9,16(%rdi)
	#   x6 ^= *(uint64 *) (m + 24)
	xorq	24(%rsi),%rax
	#   *(uint64 *) (out + 24) = x6
	movq	%rax,24(%rdi)
	#   x8 ^= *(uint64 *) (m + 32)
	xorq	32(%rsi),%r11
	#   *(uint64 *) (out + 32) = x8
	movq	%r11,32(%rdi)
	#   x10 ^= *(uint64 *) (m + 40)
	xorq	40(%rsi),%r8
	#   *(uint64 *) (out + 40) = x10
	movq	%r8,40(%rdi)
	#   x12 ^= *(uint64 *) (m + 48)
	xorq	48(%rsi),%r14
	#   *(uint64 *) (out + 48) = x12
	movq	%r14,48(%rdi)
	#   x14 ^= *(uint64 *) (m + 56)
	xorq	56(%rsi),%rbx
	#   *(uint64 *) (out + 56) = x14
	movq	%rbx,56(%rdi)
	#   bytes = bytes_backup
	movq	152(%rsp),%rdx
	#   in8 = j8
	movq	88(%rsp),%rcx
	#   in8 += 1
	add	$1,%rcx
	#   j8 = in8
	movq	%rcx,88(%rsp)
	#                          unsigned>? unsigned<? bytes - 64
	cmp	$64,%rdx
	# comment:fp stack unchanged by jump
	#   goto bytesatleast65 if unsigned>
	ja	._bytesatleast65
	# comment:fp stack unchanged by jump
	#     goto bytesatleast64 if !unsigned<
	jae	._bytesatleast64
	#       m = out
	mov	%rdi,%rsi
	#       out = ctarget
	movq	128(%rsp),%rdi
	#       i = bytes
	mov	%rdx,%rcx
	#       while (i) { *out++ = *m++; --i }
	rep	movsb
	# comment:fp stack unchanged by fallthrough
#     bytesatleast64:
._bytesatleast64:
	#     x = x_backup
	movq	120(%rsp),%rdi
	#     in8 = j8
	movq	88(%rsp),%rsi
	#     *(uint64 *) (x + 32) = in8
	movq	%rsi,32(%rdi)
	#     r11 = r11_stack
	movq	0(%rsp),%r11
	#     r12 = r12_stack
	movq	8(%rsp),%r12
	#     r13 = r13_stack
	movq	16(%rsp),%r13
	#     r14 = r14_stack
	movq	24(%rsp),%r14
	#     r15 = r15_stack
	movq	32(%rsp),%r15
	#     rbx = rbx_stack
	movq	40(%rsp),%rbx
	#     rbp = rbp_stack
	movq	48(%rsp),%rbp
	# comment:fp stack unchanged by fallthrough
#     done:
._done:
	#     leave
	add	%r11,%rsp
	mov	%rdi,%rax
	mov	%rsi,%rdx
	ret
#   bytesatleast65:
._bytesatleast65:
	#   bytes -= 64
	sub	$64,%rdx
	#   out += 64
	add	$64,%rdi
	#   m += 64
	add	$64,%rsi
	# comment:fp stack unchanged by jump
	# goto bytesatleast1
	jmp	._bytesatleast1
ENDPROC(salsa20_encrypt_bytes)

# enter salsa20_keysetup
ENTRY(salsa20_keysetup)
	mov	%rsp,%r11
	and	$31,%r11
	add	$256,%r11
	sub	%r11,%rsp
	#   k = arg2
	mov	%rsi,%rsi
	#   kbits = arg3
	mov	%rdx,%rdx
	#   x = arg1
	mov	%rdi,%rdi
	#   in0 = *(uint64 *) (k + 0)
	movq	0(%rsi),%r8
	#   in2 = *(uint64 *) (k + 8)
	movq	8(%rsi),%r9
	#   *(uint64 *) (x + 4) = in0
	movq	%r8,4(%rdi)
	#   *(uint64 *) (x + 12) = in2
	movq	%r9,12(%rdi)
	#                    unsigned<? kbits - 256
	cmp	$256,%rdx
	# comment:fp stack unchanged by jump
	#   goto kbits128 if unsigned<
	jb	._kbits128
#   kbits256:
._kbits256:
	#     in10 = *(uint64 *) (k + 16)
	movq	16(%rsi),%rdx
	#     in12 = *(uint64 *) (k + 24)
	movq	24(%rsi),%rsi
	#     *(uint64 *) (x + 44) = in10
	movq	%rdx,44(%rdi)
	#     *(uint64 *) (x + 52) = in12
	movq	%rsi,52(%rdi)
	#     in0 = 1634760805
	mov	$1634760805,%rsi
	#     in4 = 857760878
	mov	$857760878,%rdx
	#     in10 = 2036477234
	mov	$2036477234,%rcx
	#     in14 = 1797285236
	mov	$1797285236,%r8
	#     *(uint32 *) (x + 0) = in0
	movl	%esi,0(%rdi)
	#     *(uint32 *) (x + 20) = in4
	movl	%edx,20(%rdi)
	#     *(uint32 *) (x + 40) = in10
	movl	%ecx,40(%rdi)
	#     *(uint32 *) (x + 60) = in14
	movl	%r8d,60(%rdi)
	# comment:fp stack unchanged by jump
	#   goto keysetupdone
	jmp	._keysetupdone
#   kbits128:
._kbits128:
	#     in10 = *(uint64 *) (k + 0)
	movq	0(%rsi),%rdx
	#     in12 = *(uint64 *) (k + 8)
	movq	8(%rsi),%rsi
	#     *(uint64 *) (x + 44) = in10
	movq	%rdx,44(%rdi)
	#     *(uint64 *) (x + 52) = in12
	movq	%rsi,52(%rdi)
	#     in0 = 1634760805
	mov	$1634760805,%rsi
	#     in4 = 824206446
	mov	$824206446,%rdx
	#     in10 = 2036477238
	mov	$2036477238,%rcx
	#     in14 = 1797285236
	mov	$1797285236,%r8
	#     *(uint32 *) (x + 0) = in0
	movl	%esi,0(%rdi)
	#     *(uint32 *) (x + 20) = in4
	movl	%edx,20(%rdi)
	#     *(uint32 *) (x + 40) = in10
	movl	%ecx,40(%rdi)
	#     *(uint32 *) (x + 60) = in14
	movl	%r8d,60(%rdi)
#   keysetupdone:
._keysetupdone:
	# leave
	add	%r11,%rsp
	mov	%rdi,%rax
	mov	%rsi,%rdx
	ret
ENDPROC(salsa20_keysetup)

# enter salsa20_ivsetup
ENTRY(salsa20_ivsetup)
	mov	%rsp,%r11
	and	$31,%r11
	add	$256,%r11
	sub	%r11,%rsp
	#   iv = arg2
	mov	%rsi,%rsi
	#   x = arg1
	mov	%rdi,%rdi
	#   in6 = *(uint64 *) (iv + 0)
	movq	0(%rsi),%rsi
	#   in8 = 0
	mov	$0,%r8
	#   *(uint64 *) (x + 24) = in6
	movq	%rsi,24(%rdi)
	#   *(uint64 *) (x + 32) = in8
	movq	%r8,32(%rdi)
	# leave
	add	%r11,%rsp
	mov	%rdi,%rax
	mov	%rsi,%rdx
	ret
ENDPROC(salsa20_ivsetup)