// File: /workspace/github_cpp_makefile_star2_O1/wangyu-[P]pwdgen/lib/pbkdf2-sha256.cpp
// Function: sha2_finish(sha2_context*, unsigned char*)
void sha2_finish( sha2_context *ctx, unsigned char output[32] )
{
    unsigned long last, padn;
    unsigned long high, low;
    unsigned char msglen[8];

    high = ( ctx->total[0] >> 29 )
         | ( ctx->total[1] <<  3 );
    low  = ( ctx->total[0] <<  3 );

    PUT_ULONG_BE( high, msglen, 0 );
    PUT_ULONG_BE( low,  msglen, 4 );

    last = ctx->total[0] & 0x3F;
    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );

    sha2_update( ctx, (unsigned char *) sha2_padding, padn );
    sha2_update( ctx, msglen, 8 );

    PUT_ULONG_BE( ctx->state[0], output,  0 );
    PUT_ULONG_BE( ctx->state[1], output,  4 );
    PUT_ULONG_BE( ctx->state[2], output,  8 );
    PUT_ULONG_BE( ctx->state[3], output, 12 );
    PUT_ULONG_BE( ctx->state[4], output, 16 );
    PUT_ULONG_BE( ctx->state[5], output, 20 );
    PUT_ULONG_BE( ctx->state[6], output, 24 );

    if( ctx->is224 == 0 )
        PUT_ULONG_BE( ctx->state[7], output, 28 );
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x10, %rsp
movq %rsi, %rbx
movq %rdi, %r14
movq (%rdi), %rax
movq 0x8(%rdi), %rcx
movq %rax, %rdx
shrq $0x1d, %rdx
shlq $0x3, %rcx
orq %rdx, %rcx
leal (,%rax,8), %edx
movl %ecx, %esi
shrl $0x18, %esi
leaq 0x8(%rsp), %r15
movb %sil, (%r15)
movl %ecx, %esi
shrl $0x10, %esi
movb %sil, 0x1(%r15)
movb %ch, 0xa(%rsp)
movb %cl, 0x3(%r15)
movl %eax, %ecx
shrl $0x15, %ecx
movb %cl, 0x4(%r15)
movl %eax, %ecx
shrl $0xd, %ecx
movb %cl, 0x5(%r15)
movl %eax, %ecx
shrl $0x5, %ecx
movb %cl, 0x6(%r15)
movb %dl, 0x7(%r15)
andl $0x3f, %eax
xorl %edx, %edx
cmpq $0x38, %rax
setae %dl
shll $0x6, %edx
orq $0x38, %rdx
subq %rax, %rdx
leaq 0xca87e(%rip), %rsi     # 0x4d4650
callq 0x405686
movl $0x8, %edx
movq %r14, %rdi
movq %r15, %rsi
callq 0x405686
movb 0x13(%r14), %al
movb %al, (%rbx)
movb 0x12(%r14), %al
movb %al, 0x1(%rbx)
movb 0x11(%r14), %al
movb %al, 0x2(%rbx)
movb 0x10(%r14), %al
movb %al, 0x3(%rbx)
movb 0x1b(%r14), %al
movb %al, 0x4(%rbx)
movb 0x1a(%r14), %al
movb %al, 0x5(%rbx)
movb 0x19(%r14), %al
movb %al, 0x6(%rbx)
movb 0x18(%r14), %al
movb %al, 0x7(%rbx)
movb 0x23(%r14), %al
movb %al, 0x8(%rbx)
movb 0x22(%r14), %al
movb %al, 0x9(%rbx)
movb 0x21(%r14), %al
movb %al, 0xa(%rbx)
movb 0x20(%r14), %al
movb %al, 0xb(%rbx)
movb 0x2b(%r14), %al
movb %al, 0xc(%rbx)
movb 0x2a(%r14), %al
movb %al, 0xd(%rbx)
movb 0x29(%r14), %al
movb %al, 0xe(%rbx)
movb 0x28(%r14), %al
movb %al, 0xf(%rbx)
movb 0x33(%r14), %al
movb %al, 0x10(%rbx)
movb 0x32(%r14), %al
movb %al, 0x11(%rbx)
movb 0x31(%r14), %al
movb %al, 0x12(%rbx)
movb 0x30(%r14), %al
movb %al, 0x13(%rbx)
movb 0x3b(%r14), %al
movb %al, 0x14(%rbx)
movb 0x3a(%r14), %al
movb %al, 0x15(%rbx)
movb 0x39(%r14), %al
movb %al, 0x16(%rbx)
movb 0x38(%r14), %al
movb %al, 0x17(%rbx)
movb 0x43(%r14), %al
movb %al, 0x18(%rbx)
movb 0x42(%r14), %al
movb %al, 0x19(%rbx)
movb 0x41(%r14), %al
movb %al, 0x1a(%rbx)
movb 0x40(%r14), %al
movb %al, 0x1b(%rbx)
cmpl $0x0, 0x110(%r14)
jne 0x409ed0
movb 0x4b(%r14), %al
movb %al, 0x1c(%rbx)
movb 0x4a(%r14), %al
movb %al, 0x1d(%rbx)
movb 0x49(%r14), %al
movb %al, 0x1e(%rbx)
movb 0x48(%r14), %al
movb %al, 0x1f(%rbx)
addq $0x10, %rsp
popq %rbx
popq %r14
popq %r15
retq