#include "x86_arch.h"
.text	

.globl	_sha512_block_data_order

.p2align	4
_sha512_block_data_order:
	pushq	%rbx
	pushq	%rbp
	pushq	%r12
	pushq	%r13
	pushq	%r14
	pushq	%r15
	movq	%rsp,%r11
	shlq	$4,%rdx
	subq	$128+32,%rsp
	leaq	(%rsi,%rdx,8),%rdx
	andq	$-64,%rsp
	movq	%rdi,128+0(%rsp)
	movq	%rsi,128+8(%rsp)
	movq	%rdx,128+16(%rsp)
	movq	%r11,128+24(%rsp)
L$prologue:

	leaq	K512(%rip),%rbp

	movq	0(%rdi),%rax
	movq	8(%rdi),%rbx
	movq	16(%rdi),%rcx
	movq	24(%rdi),%rdx
	movq	32(%rdi),%r8
	movq	40(%rdi),%r9
	movq	48(%rdi),%r10
	movq	56(%rdi),%r11
	jmp	L$loop

.p2align	4
L$loop:
	xorq	%rdi,%rdi
	movq	0(%rsi),%r12
	movq	%r8,%r13
	movq	%rax,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%r9,%r15
	movq	%r12,0(%rsp)

	rorq	$5,%r14
	xorq	%r8,%r13
	xorq	%r10,%r15

	rorq	$4,%r13
	addq	%r11,%r12
	xorq	%rax,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r8,%r15
	movq	%rbx,%r11

	rorq	$6,%r14
	xorq	%r8,%r13
	xorq	%r10,%r15

	xorq	%rcx,%r11
	xorq	%rax,%r14
	addq	%r15,%r12
	movq	%rbx,%r15

	rorq	$14,%r13
	andq	%rax,%r11
	andq	%rcx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r11

	addq	%r12,%rdx
	addq	%r12,%r11
	leaq	1(%rdi),%rdi
	addq	%r14,%r11

	movq	8(%rsi),%r12
	movq	%rdx,%r13
	movq	%r11,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%r8,%r15
	movq	%r12,8(%rsp)

	rorq	$5,%r14
	xorq	%rdx,%r13
	xorq	%r9,%r15

	rorq	$4,%r13
	addq	%r10,%r12
	xorq	%r11,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rdx,%r15
	movq	%rax,%r10

	rorq	$6,%r14
	xorq	%rdx,%r13
	xorq	%r9,%r15

	xorq	%rbx,%r10
	xorq	%r11,%r14
	addq	%r15,%r12
	movq	%rax,%r15

	rorq	$14,%r13
	andq	%r11,%r10
	andq	%rbx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r10

	addq	%r12,%rcx
	addq	%r12,%r10
	leaq	1(%rdi),%rdi
	addq	%r14,%r10

	movq	16(%rsi),%r12
	movq	%rcx,%r13
	movq	%r10,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%rdx,%r15
	movq	%r12,16(%rsp)

	rorq	$5,%r14
	xorq	%rcx,%r13
	xorq	%r8,%r15

	rorq	$4,%r13
	addq	%r9,%r12
	xorq	%r10,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rcx,%r15
	movq	%r11,%r9

	rorq	$6,%r14
	xorq	%rcx,%r13
	xorq	%r8,%r15

	xorq	%rax,%r9
	xorq	%r10,%r14
	addq	%r15,%r12
	movq	%r11,%r15

	rorq	$14,%r13
	andq	%r10,%r9
	andq	%rax,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r9

	addq	%r12,%rbx
	addq	%r12,%r9
	leaq	1(%rdi),%rdi
	addq	%r14,%r9

	movq	24(%rsi),%r12
	movq	%rbx,%r13
	movq	%r9,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%rcx,%r15
	movq	%r12,24(%rsp)

	rorq	$5,%r14
	xorq	%rbx,%r13
	xorq	%rdx,%r15

	rorq	$4,%r13
	addq	%r8,%r12
	xorq	%r9,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rbx,%r15
	movq	%r10,%r8

	rorq	$6,%r14
	xorq	%rbx,%r13
	xorq	%rdx,%r15

	xorq	%r11,%r8
	xorq	%r9,%r14
	addq	%r15,%r12
	movq	%r10,%r15

	rorq	$14,%r13
	andq	%r9,%r8
	andq	%r11,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r8

	addq	%r12,%rax
	addq	%r12,%r8
	leaq	1(%rdi),%rdi
	addq	%r14,%r8

	movq	32(%rsi),%r12
	movq	%rax,%r13
	movq	%r8,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%rbx,%r15
	movq	%r12,32(%rsp)

	rorq	$5,%r14
	xorq	%rax,%r13
	xorq	%rcx,%r15

	rorq	$4,%r13
	addq	%rdx,%r12
	xorq	%r8,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rax,%r15
	movq	%r9,%rdx

	rorq	$6,%r14
	xorq	%rax,%r13
	xorq	%rcx,%r15

	xorq	%r10,%rdx
	xorq	%r8,%r14
	addq	%r15,%r12
	movq	%r9,%r15

	rorq	$14,%r13
	andq	%r8,%rdx
	andq	%r10,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rdx

	addq	%r12,%r11
	addq	%r12,%rdx
	leaq	1(%rdi),%rdi
	addq	%r14,%rdx

	movq	40(%rsi),%r12
	movq	%r11,%r13
	movq	%rdx,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%rax,%r15
	movq	%r12,40(%rsp)

	rorq	$5,%r14
	xorq	%r11,%r13
	xorq	%rbx,%r15

	rorq	$4,%r13
	addq	%rcx,%r12
	xorq	%rdx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r11,%r15
	movq	%r8,%rcx

	rorq	$6,%r14
	xorq	%r11,%r13
	xorq	%rbx,%r15

	xorq	%r9,%rcx
	xorq	%rdx,%r14
	addq	%r15,%r12
	movq	%r8,%r15

	rorq	$14,%r13
	andq	%rdx,%rcx
	andq	%r9,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rcx

	addq	%r12,%r10
	addq	%r12,%rcx
	leaq	1(%rdi),%rdi
	addq	%r14,%rcx

	movq	48(%rsi),%r12
	movq	%r10,%r13
	movq	%rcx,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%r11,%r15
	movq	%r12,48(%rsp)

	rorq	$5,%r14
	xorq	%r10,%r13
	xorq	%rax,%r15

	rorq	$4,%r13
	addq	%rbx,%r12
	xorq	%rcx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r10,%r15
	movq	%rdx,%rbx

	rorq	$6,%r14
	xorq	%r10,%r13
	xorq	%rax,%r15

	xorq	%r8,%rbx
	xorq	%rcx,%r14
	addq	%r15,%r12
	movq	%rdx,%r15

	rorq	$14,%r13
	andq	%rcx,%rbx
	andq	%r8,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rbx

	addq	%r12,%r9
	addq	%r12,%rbx
	leaq	1(%rdi),%rdi
	addq	%r14,%rbx

	movq	56(%rsi),%r12
	movq	%r9,%r13
	movq	%rbx,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%r10,%r15
	movq	%r12,56(%rsp)

	rorq	$5,%r14
	xorq	%r9,%r13
	xorq	%r11,%r15

	rorq	$4,%r13
	addq	%rax,%r12
	xorq	%rbx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r9,%r15
	movq	%rcx,%rax

	rorq	$6,%r14
	xorq	%r9,%r13
	xorq	%r11,%r15

	xorq	%rdx,%rax
	xorq	%rbx,%r14
	addq	%r15,%r12
	movq	%rcx,%r15

	rorq	$14,%r13
	andq	%rbx,%rax
	andq	%rdx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rax

	addq	%r12,%r8
	addq	%r12,%rax
	leaq	1(%rdi),%rdi
	addq	%r14,%rax

	movq	64(%rsi),%r12
	movq	%r8,%r13
	movq	%rax,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%r9,%r15
	movq	%r12,64(%rsp)

	rorq	$5,%r14
	xorq	%r8,%r13
	xorq	%r10,%r15

	rorq	$4,%r13
	addq	%r11,%r12
	xorq	%rax,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r8,%r15
	movq	%rbx,%r11

	rorq	$6,%r14
	xorq	%r8,%r13
	xorq	%r10,%r15

	xorq	%rcx,%r11
	xorq	%rax,%r14
	addq	%r15,%r12
	movq	%rbx,%r15

	rorq	$14,%r13
	andq	%rax,%r11
	andq	%rcx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r11

	addq	%r12,%rdx
	addq	%r12,%r11
	leaq	1(%rdi),%rdi
	addq	%r14,%r11

	movq	72(%rsi),%r12
	movq	%rdx,%r13
	movq	%r11,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%r8,%r15
	movq	%r12,72(%rsp)

	rorq	$5,%r14
	xorq	%rdx,%r13
	xorq	%r9,%r15

	rorq	$4,%r13
	addq	%r10,%r12
	xorq	%r11,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rdx,%r15
	movq	%rax,%r10

	rorq	$6,%r14
	xorq	%rdx,%r13
	xorq	%r9,%r15

	xorq	%rbx,%r10
	xorq	%r11,%r14
	addq	%r15,%r12
	movq	%rax,%r15

	rorq	$14,%r13
	andq	%r11,%r10
	andq	%rbx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r10

	addq	%r12,%rcx
	addq	%r12,%r10
	leaq	1(%rdi),%rdi
	addq	%r14,%r10

	movq	80(%rsi),%r12
	movq	%rcx,%r13
	movq	%r10,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%rdx,%r15
	movq	%r12,80(%rsp)

	rorq	$5,%r14
	xorq	%rcx,%r13
	xorq	%r8,%r15

	rorq	$4,%r13
	addq	%r9,%r12
	xorq	%r10,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rcx,%r15
	movq	%r11,%r9

	rorq	$6,%r14
	xorq	%rcx,%r13
	xorq	%r8,%r15

	xorq	%rax,%r9
	xorq	%r10,%r14
	addq	%r15,%r12
	movq	%r11,%r15

	rorq	$14,%r13
	andq	%r10,%r9
	andq	%rax,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r9

	addq	%r12,%rbx
	addq	%r12,%r9
	leaq	1(%rdi),%rdi
	addq	%r14,%r9

	movq	88(%rsi),%r12
	movq	%rbx,%r13
	movq	%r9,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%rcx,%r15
	movq	%r12,88(%rsp)

	rorq	$5,%r14
	xorq	%rbx,%r13
	xorq	%rdx,%r15

	rorq	$4,%r13
	addq	%r8,%r12
	xorq	%r9,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rbx,%r15
	movq	%r10,%r8

	rorq	$6,%r14
	xorq	%rbx,%r13
	xorq	%rdx,%r15

	xorq	%r11,%r8
	xorq	%r9,%r14
	addq	%r15,%r12
	movq	%r10,%r15

	rorq	$14,%r13
	andq	%r9,%r8
	andq	%r11,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r8

	addq	%r12,%rax
	addq	%r12,%r8
	leaq	1(%rdi),%rdi
	addq	%r14,%r8

	movq	96(%rsi),%r12
	movq	%rax,%r13
	movq	%r8,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%rbx,%r15
	movq	%r12,96(%rsp)

	rorq	$5,%r14
	xorq	%rax,%r13
	xorq	%rcx,%r15

	rorq	$4,%r13
	addq	%rdx,%r12
	xorq	%r8,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rax,%r15
	movq	%r9,%rdx

	rorq	$6,%r14
	xorq	%rax,%r13
	xorq	%rcx,%r15

	xorq	%r10,%rdx
	xorq	%r8,%r14
	addq	%r15,%r12
	movq	%r9,%r15

	rorq	$14,%r13
	andq	%r8,%rdx
	andq	%r10,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rdx

	addq	%r12,%r11
	addq	%r12,%rdx
	leaq	1(%rdi),%rdi
	addq	%r14,%rdx

	movq	104(%rsi),%r12
	movq	%r11,%r13
	movq	%rdx,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%rax,%r15
	movq	%r12,104(%rsp)

	rorq	$5,%r14
	xorq	%r11,%r13
	xorq	%rbx,%r15

	rorq	$4,%r13
	addq	%rcx,%r12
	xorq	%rdx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r11,%r15
	movq	%r8,%rcx

	rorq	$6,%r14
	xorq	%r11,%r13
	xorq	%rbx,%r15

	xorq	%r9,%rcx
	xorq	%rdx,%r14
	addq	%r15,%r12
	movq	%r8,%r15

	rorq	$14,%r13
	andq	%rdx,%rcx
	andq	%r9,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rcx

	addq	%r12,%r10
	addq	%r12,%rcx
	leaq	1(%rdi),%rdi
	addq	%r14,%rcx

	movq	112(%rsi),%r12
	movq	%r10,%r13
	movq	%rcx,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%r11,%r15
	movq	%r12,112(%rsp)

	rorq	$5,%r14
	xorq	%r10,%r13
	xorq	%rax,%r15

	rorq	$4,%r13
	addq	%rbx,%r12
	xorq	%rcx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r10,%r15
	movq	%rdx,%rbx

	rorq	$6,%r14
	xorq	%r10,%r13
	xorq	%rax,%r15

	xorq	%r8,%rbx
	xorq	%rcx,%r14
	addq	%r15,%r12
	movq	%rdx,%r15

	rorq	$14,%r13
	andq	%rcx,%rbx
	andq	%r8,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rbx

	addq	%r12,%r9
	addq	%r12,%rbx
	leaq	1(%rdi),%rdi
	addq	%r14,%rbx

	movq	120(%rsi),%r12
	movq	%r9,%r13
	movq	%rbx,%r14
	bswapq	%r12
	rorq	$23,%r13
	movq	%r10,%r15
	movq	%r12,120(%rsp)

	rorq	$5,%r14
	xorq	%r9,%r13
	xorq	%r11,%r15

	rorq	$4,%r13
	addq	%rax,%r12
	xorq	%rbx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r9,%r15
	movq	%rcx,%rax

	rorq	$6,%r14
	xorq	%r9,%r13
	xorq	%r11,%r15

	xorq	%rdx,%rax
	xorq	%rbx,%r14
	addq	%r15,%r12
	movq	%rcx,%r15

	rorq	$14,%r13
	andq	%rbx,%rax
	andq	%rdx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rax

	addq	%r12,%r8
	addq	%r12,%rax
	leaq	1(%rdi),%rdi
	addq	%r14,%rax

	jmp	L$rounds_16_xx
.p2align	4
L$rounds_16_xx:
	movq	8(%rsp),%r13
	movq	112(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	72(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	0(%rsp),%r12
	movq	%r8,%r13
	addq	%r14,%r12
	movq	%rax,%r14
	rorq	$23,%r13
	movq	%r9,%r15
	movq	%r12,0(%rsp)

	rorq	$5,%r14
	xorq	%r8,%r13
	xorq	%r10,%r15

	rorq	$4,%r13
	addq	%r11,%r12
	xorq	%rax,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r8,%r15
	movq	%rbx,%r11

	rorq	$6,%r14
	xorq	%r8,%r13
	xorq	%r10,%r15

	xorq	%rcx,%r11
	xorq	%rax,%r14
	addq	%r15,%r12
	movq	%rbx,%r15

	rorq	$14,%r13
	andq	%rax,%r11
	andq	%rcx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r11

	addq	%r12,%rdx
	addq	%r12,%r11
	leaq	1(%rdi),%rdi
	addq	%r14,%r11

	movq	16(%rsp),%r13
	movq	120(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	80(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	8(%rsp),%r12
	movq	%rdx,%r13
	addq	%r14,%r12
	movq	%r11,%r14
	rorq	$23,%r13
	movq	%r8,%r15
	movq	%r12,8(%rsp)

	rorq	$5,%r14
	xorq	%rdx,%r13
	xorq	%r9,%r15

	rorq	$4,%r13
	addq	%r10,%r12
	xorq	%r11,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rdx,%r15
	movq	%rax,%r10

	rorq	$6,%r14
	xorq	%rdx,%r13
	xorq	%r9,%r15

	xorq	%rbx,%r10
	xorq	%r11,%r14
	addq	%r15,%r12
	movq	%rax,%r15

	rorq	$14,%r13
	andq	%r11,%r10
	andq	%rbx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r10

	addq	%r12,%rcx
	addq	%r12,%r10
	leaq	1(%rdi),%rdi
	addq	%r14,%r10

	movq	24(%rsp),%r13
	movq	0(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	88(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	16(%rsp),%r12
	movq	%rcx,%r13
	addq	%r14,%r12
	movq	%r10,%r14
	rorq	$23,%r13
	movq	%rdx,%r15
	movq	%r12,16(%rsp)

	rorq	$5,%r14
	xorq	%rcx,%r13
	xorq	%r8,%r15

	rorq	$4,%r13
	addq	%r9,%r12
	xorq	%r10,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rcx,%r15
	movq	%r11,%r9

	rorq	$6,%r14
	xorq	%rcx,%r13
	xorq	%r8,%r15

	xorq	%rax,%r9
	xorq	%r10,%r14
	addq	%r15,%r12
	movq	%r11,%r15

	rorq	$14,%r13
	andq	%r10,%r9
	andq	%rax,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r9

	addq	%r12,%rbx
	addq	%r12,%r9
	leaq	1(%rdi),%rdi
	addq	%r14,%r9

	movq	32(%rsp),%r13
	movq	8(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	96(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	24(%rsp),%r12
	movq	%rbx,%r13
	addq	%r14,%r12
	movq	%r9,%r14
	rorq	$23,%r13
	movq	%rcx,%r15
	movq	%r12,24(%rsp)

	rorq	$5,%r14
	xorq	%rbx,%r13
	xorq	%rdx,%r15

	rorq	$4,%r13
	addq	%r8,%r12
	xorq	%r9,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rbx,%r15
	movq	%r10,%r8

	rorq	$6,%r14
	xorq	%rbx,%r13
	xorq	%rdx,%r15

	xorq	%r11,%r8
	xorq	%r9,%r14
	addq	%r15,%r12
	movq	%r10,%r15

	rorq	$14,%r13
	andq	%r9,%r8
	andq	%r11,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r8

	addq	%r12,%rax
	addq	%r12,%r8
	leaq	1(%rdi),%rdi
	addq	%r14,%r8

	movq	40(%rsp),%r13
	movq	16(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	104(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	32(%rsp),%r12
	movq	%rax,%r13
	addq	%r14,%r12
	movq	%r8,%r14
	rorq	$23,%r13
	movq	%rbx,%r15
	movq	%r12,32(%rsp)

	rorq	$5,%r14
	xorq	%rax,%r13
	xorq	%rcx,%r15

	rorq	$4,%r13
	addq	%rdx,%r12
	xorq	%r8,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rax,%r15
	movq	%r9,%rdx

	rorq	$6,%r14
	xorq	%rax,%r13
	xorq	%rcx,%r15

	xorq	%r10,%rdx
	xorq	%r8,%r14
	addq	%r15,%r12
	movq	%r9,%r15

	rorq	$14,%r13
	andq	%r8,%rdx
	andq	%r10,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rdx

	addq	%r12,%r11
	addq	%r12,%rdx
	leaq	1(%rdi),%rdi
	addq	%r14,%rdx

	movq	48(%rsp),%r13
	movq	24(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	112(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	40(%rsp),%r12
	movq	%r11,%r13
	addq	%r14,%r12
	movq	%rdx,%r14
	rorq	$23,%r13
	movq	%rax,%r15
	movq	%r12,40(%rsp)

	rorq	$5,%r14
	xorq	%r11,%r13
	xorq	%rbx,%r15

	rorq	$4,%r13
	addq	%rcx,%r12
	xorq	%rdx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r11,%r15
	movq	%r8,%rcx

	rorq	$6,%r14
	xorq	%r11,%r13
	xorq	%rbx,%r15

	xorq	%r9,%rcx
	xorq	%rdx,%r14
	addq	%r15,%r12
	movq	%r8,%r15

	rorq	$14,%r13
	andq	%rdx,%rcx
	andq	%r9,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rcx

	addq	%r12,%r10
	addq	%r12,%rcx
	leaq	1(%rdi),%rdi
	addq	%r14,%rcx

	movq	56(%rsp),%r13
	movq	32(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	120(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	48(%rsp),%r12
	movq	%r10,%r13
	addq	%r14,%r12
	movq	%rcx,%r14
	rorq	$23,%r13
	movq	%r11,%r15
	movq	%r12,48(%rsp)

	rorq	$5,%r14
	xorq	%r10,%r13
	xorq	%rax,%r15

	rorq	$4,%r13
	addq	%rbx,%r12
	xorq	%rcx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r10,%r15
	movq	%rdx,%rbx

	rorq	$6,%r14
	xorq	%r10,%r13
	xorq	%rax,%r15

	xorq	%r8,%rbx
	xorq	%rcx,%r14
	addq	%r15,%r12
	movq	%rdx,%r15

	rorq	$14,%r13
	andq	%rcx,%rbx
	andq	%r8,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rbx

	addq	%r12,%r9
	addq	%r12,%rbx
	leaq	1(%rdi),%rdi
	addq	%r14,%rbx

	movq	64(%rsp),%r13
	movq	40(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	0(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	56(%rsp),%r12
	movq	%r9,%r13
	addq	%r14,%r12
	movq	%rbx,%r14
	rorq	$23,%r13
	movq	%r10,%r15
	movq	%r12,56(%rsp)

	rorq	$5,%r14
	xorq	%r9,%r13
	xorq	%r11,%r15

	rorq	$4,%r13
	addq	%rax,%r12
	xorq	%rbx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r9,%r15
	movq	%rcx,%rax

	rorq	$6,%r14
	xorq	%r9,%r13
	xorq	%r11,%r15

	xorq	%rdx,%rax
	xorq	%rbx,%r14
	addq	%r15,%r12
	movq	%rcx,%r15

	rorq	$14,%r13
	andq	%rbx,%rax
	andq	%rdx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rax

	addq	%r12,%r8
	addq	%r12,%rax
	leaq	1(%rdi),%rdi
	addq	%r14,%rax

	movq	72(%rsp),%r13
	movq	48(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	8(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	64(%rsp),%r12
	movq	%r8,%r13
	addq	%r14,%r12
	movq	%rax,%r14
	rorq	$23,%r13
	movq	%r9,%r15
	movq	%r12,64(%rsp)

	rorq	$5,%r14
	xorq	%r8,%r13
	xorq	%r10,%r15

	rorq	$4,%r13
	addq	%r11,%r12
	xorq	%rax,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r8,%r15
	movq	%rbx,%r11

	rorq	$6,%r14
	xorq	%r8,%r13
	xorq	%r10,%r15

	xorq	%rcx,%r11
	xorq	%rax,%r14
	addq	%r15,%r12
	movq	%rbx,%r15

	rorq	$14,%r13
	andq	%rax,%r11
	andq	%rcx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r11

	addq	%r12,%rdx
	addq	%r12,%r11
	leaq	1(%rdi),%rdi
	addq	%r14,%r11

	movq	80(%rsp),%r13
	movq	56(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	16(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	72(%rsp),%r12
	movq	%rdx,%r13
	addq	%r14,%r12
	movq	%r11,%r14
	rorq	$23,%r13
	movq	%r8,%r15
	movq	%r12,72(%rsp)

	rorq	$5,%r14
	xorq	%rdx,%r13
	xorq	%r9,%r15

	rorq	$4,%r13
	addq	%r10,%r12
	xorq	%r11,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rdx,%r15
	movq	%rax,%r10

	rorq	$6,%r14
	xorq	%rdx,%r13
	xorq	%r9,%r15

	xorq	%rbx,%r10
	xorq	%r11,%r14
	addq	%r15,%r12
	movq	%rax,%r15

	rorq	$14,%r13
	andq	%r11,%r10
	andq	%rbx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r10

	addq	%r12,%rcx
	addq	%r12,%r10
	leaq	1(%rdi),%rdi
	addq	%r14,%r10

	movq	88(%rsp),%r13
	movq	64(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	24(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	80(%rsp),%r12
	movq	%rcx,%r13
	addq	%r14,%r12
	movq	%r10,%r14
	rorq	$23,%r13
	movq	%rdx,%r15
	movq	%r12,80(%rsp)

	rorq	$5,%r14
	xorq	%rcx,%r13
	xorq	%r8,%r15

	rorq	$4,%r13
	addq	%r9,%r12
	xorq	%r10,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rcx,%r15
	movq	%r11,%r9

	rorq	$6,%r14
	xorq	%rcx,%r13
	xorq	%r8,%r15

	xorq	%rax,%r9
	xorq	%r10,%r14
	addq	%r15,%r12
	movq	%r11,%r15

	rorq	$14,%r13
	andq	%r10,%r9
	andq	%rax,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r9

	addq	%r12,%rbx
	addq	%r12,%r9
	leaq	1(%rdi),%rdi
	addq	%r14,%r9

	movq	96(%rsp),%r13
	movq	72(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	32(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	88(%rsp),%r12
	movq	%rbx,%r13
	addq	%r14,%r12
	movq	%r9,%r14
	rorq	$23,%r13
	movq	%rcx,%r15
	movq	%r12,88(%rsp)

	rorq	$5,%r14
	xorq	%rbx,%r13
	xorq	%rdx,%r15

	rorq	$4,%r13
	addq	%r8,%r12
	xorq	%r9,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rbx,%r15
	movq	%r10,%r8

	rorq	$6,%r14
	xorq	%rbx,%r13
	xorq	%rdx,%r15

	xorq	%r11,%r8
	xorq	%r9,%r14
	addq	%r15,%r12
	movq	%r10,%r15

	rorq	$14,%r13
	andq	%r9,%r8
	andq	%r11,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%r8

	addq	%r12,%rax
	addq	%r12,%r8
	leaq	1(%rdi),%rdi
	addq	%r14,%r8

	movq	104(%rsp),%r13
	movq	80(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	40(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	96(%rsp),%r12
	movq	%rax,%r13
	addq	%r14,%r12
	movq	%r8,%r14
	rorq	$23,%r13
	movq	%rbx,%r15
	movq	%r12,96(%rsp)

	rorq	$5,%r14
	xorq	%rax,%r13
	xorq	%rcx,%r15

	rorq	$4,%r13
	addq	%rdx,%r12
	xorq	%r8,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%rax,%r15
	movq	%r9,%rdx

	rorq	$6,%r14
	xorq	%rax,%r13
	xorq	%rcx,%r15

	xorq	%r10,%rdx
	xorq	%r8,%r14
	addq	%r15,%r12
	movq	%r9,%r15

	rorq	$14,%r13
	andq	%r8,%rdx
	andq	%r10,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rdx

	addq	%r12,%r11
	addq	%r12,%rdx
	leaq	1(%rdi),%rdi
	addq	%r14,%rdx

	movq	112(%rsp),%r13
	movq	88(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	48(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	104(%rsp),%r12
	movq	%r11,%r13
	addq	%r14,%r12
	movq	%rdx,%r14
	rorq	$23,%r13
	movq	%rax,%r15
	movq	%r12,104(%rsp)

	rorq	$5,%r14
	xorq	%r11,%r13
	xorq	%rbx,%r15

	rorq	$4,%r13
	addq	%rcx,%r12
	xorq	%rdx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r11,%r15
	movq	%r8,%rcx

	rorq	$6,%r14
	xorq	%r11,%r13
	xorq	%rbx,%r15

	xorq	%r9,%rcx
	xorq	%rdx,%r14
	addq	%r15,%r12
	movq	%r8,%r15

	rorq	$14,%r13
	andq	%rdx,%rcx
	andq	%r9,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rcx

	addq	%r12,%r10
	addq	%r12,%rcx
	leaq	1(%rdi),%rdi
	addq	%r14,%rcx

	movq	120(%rsp),%r13
	movq	96(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	56(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	112(%rsp),%r12
	movq	%r10,%r13
	addq	%r14,%r12
	movq	%rcx,%r14
	rorq	$23,%r13
	movq	%r11,%r15
	movq	%r12,112(%rsp)

	rorq	$5,%r14
	xorq	%r10,%r13
	xorq	%rax,%r15

	rorq	$4,%r13
	addq	%rbx,%r12
	xorq	%rcx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r10,%r15
	movq	%rdx,%rbx

	rorq	$6,%r14
	xorq	%r10,%r13
	xorq	%rax,%r15

	xorq	%r8,%rbx
	xorq	%rcx,%r14
	addq	%r15,%r12
	movq	%rdx,%r15

	rorq	$14,%r13
	andq	%rcx,%rbx
	andq	%r8,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rbx

	addq	%r12,%r9
	addq	%r12,%rbx
	leaq	1(%rdi),%rdi
	addq	%r14,%rbx

	movq	0(%rsp),%r13
	movq	104(%rsp),%r14
	movq	%r13,%r12
	movq	%r14,%r15

	rorq	$7,%r12
	xorq	%r13,%r12
	shrq	$7,%r13

	rorq	$1,%r12
	xorq	%r12,%r13
	movq	64(%rsp),%r12

	rorq	$42,%r15
	xorq	%r14,%r15
	shrq	$6,%r14

	rorq	$19,%r15
	addq	%r13,%r12
	xorq	%r15,%r14

	addq	120(%rsp),%r12
	movq	%r9,%r13
	addq	%r14,%r12
	movq	%rbx,%r14
	rorq	$23,%r13
	movq	%r10,%r15
	movq	%r12,120(%rsp)

	rorq	$5,%r14
	xorq	%r9,%r13
	xorq	%r11,%r15

	rorq	$4,%r13
	addq	%rax,%r12
	xorq	%rbx,%r14

	addq	(%rbp,%rdi,8),%r12
	andq	%r9,%r15
	movq	%rcx,%rax

	rorq	$6,%r14
	xorq	%r9,%r13
	xorq	%r11,%r15

	xorq	%rdx,%rax
	xorq	%rbx,%r14
	addq	%r15,%r12
	movq	%rcx,%r15

	rorq	$14,%r13
	andq	%rbx,%rax
	andq	%rdx,%r15

	rorq	$28,%r14
	addq	%r13,%r12
	addq	%r15,%rax

	addq	%r12,%r8
	addq	%r12,%rax
	leaq	1(%rdi),%rdi
	addq	%r14,%rax

	cmpq	$80,%rdi
	jb	L$rounds_16_xx

	movq	128+0(%rsp),%rdi
	leaq	128(%rsi),%rsi

	addq	0(%rdi),%rax
	addq	8(%rdi),%rbx
	addq	16(%rdi),%rcx
	addq	24(%rdi),%rdx
	addq	32(%rdi),%r8
	addq	40(%rdi),%r9
	addq	48(%rdi),%r10
	addq	56(%rdi),%r11

	cmpq	128+16(%rsp),%rsi

	movq	%rax,0(%rdi)
	movq	%rbx,8(%rdi)
	movq	%rcx,16(%rdi)
	movq	%rdx,24(%rdi)
	movq	%r8,32(%rdi)
	movq	%r9,40(%rdi)
	movq	%r10,48(%rdi)
	movq	%r11,56(%rdi)
	jb	L$loop

	movq	128+24(%rsp),%rsi
	movq	(%rsi),%r15
	movq	8(%rsi),%r14
	movq	16(%rsi),%r13
	movq	24(%rsi),%r12
	movq	32(%rsi),%rbp
	movq	40(%rsi),%rbx
	leaq	48(%rsi),%rsp
L$epilogue:
	retq

.p2align	6

K512:
.quad	0x428a2f98d728ae22,0x7137449123ef65cd
.quad	0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc
.quad	0x3956c25bf348b538,0x59f111f1b605d019
.quad	0x923f82a4af194f9b,0xab1c5ed5da6d8118
.quad	0xd807aa98a3030242,0x12835b0145706fbe
.quad	0x243185be4ee4b28c,0x550c7dc3d5ffb4e2
.quad	0x72be5d74f27b896f,0x80deb1fe3b1696b1
.quad	0x9bdc06a725c71235,0xc19bf174cf692694
.quad	0xe49b69c19ef14ad2,0xefbe4786384f25e3
.quad	0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65
.quad	0x2de92c6f592b0275,0x4a7484aa6ea6e483
.quad	0x5cb0a9dcbd41fbd4,0x76f988da831153b5
.quad	0x983e5152ee66dfab,0xa831c66d2db43210
.quad	0xb00327c898fb213f,0xbf597fc7beef0ee4
.quad	0xc6e00bf33da88fc2,0xd5a79147930aa725
.quad	0x06ca6351e003826f,0x142929670a0e6e70
.quad	0x27b70a8546d22ffc,0x2e1b21385c26c926
.quad	0x4d2c6dfc5ac42aed,0x53380d139d95b3df
.quad	0x650a73548baf63de,0x766a0abb3c77b2a8
.quad	0x81c2c92e47edaee6,0x92722c851482353b
.quad	0xa2bfe8a14cf10364,0xa81a664bbc423001
.quad	0xc24b8b70d0f89791,0xc76c51a30654be30
.quad	0xd192e819d6ef5218,0xd69906245565a910
.quad	0xf40e35855771202a,0x106aa07032bbd1b8
.quad	0x19a4c116b8d2d0c8,0x1e376c085141ab53
.quad	0x2748774cdf8eeb99,0x34b0bcb5e19b48a8
.quad	0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb
.quad	0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3
.quad	0x748f82ee5defb2fc,0x78a5636f43172f60
.quad	0x84c87814a1f0ab72,0x8cc702081a6439ec
.quad	0x90befffa23631e28,0xa4506cebde82bde9
.quad	0xbef9a3f7b2c67915,0xc67178f2e372532b
.quad	0xca273eceea26619c,0xd186b8c721c0c207
.quad	0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178
.quad	0x06f067aa72176fba,0x0a637dc5a2c898a6
.quad	0x113f9804bef90dae,0x1b710b35131c471b
.quad	0x28db77f523047d84,0x32caab7b40c72493
.quad	0x3c9ebe0a15c9bebc,0x431d67c49c100d4c
.quad	0x4cc5d4becb3e42b6,0x597f299cfc657e2a
.quad	0x5fcb6fab3ad6faec,0x6c44198c4a475817
