// File: sgielen[P]clife/./xxhash/xxhash.h
// Function: XXH3_len_17to128_64b(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long)
XXH_FORCE_INLINE XXH_PUREF XXH64_hash_t
XXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len,
                     const xxh_u8* XXH_RESTRICT secret, size_t secretSize,
                     XXH64_hash_t seed)
{
    XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;
    XXH_ASSERT(16 < len && len <= 128);

    {   xxh_u64 acc = len * XXH_PRIME64_1;
#if XXH_SIZE_OPT >= 1
        /* Smaller and cleaner, but slightly slower. */
        size_t i = (len - 1) / 32;
        do {
            acc += XXH3_mix16B(input+16 * i, secret+32*i, seed);
            acc += XXH3_mix16B(input+len-16*(i+1), secret+32*i+16, seed);
        } while (i-- != 0);
#else
        if (len > 32) {
            if (len > 64) {
                if (len > 96) {
                    acc += XXH3_mix16B(input+48, secret+96, seed);
                    acc += XXH3_mix16B(input+len-64, secret+112, seed);
                }
                acc += XXH3_mix16B(input+32, secret+64, seed);
                acc += XXH3_mix16B(input+len-48, secret+80, seed);
            }
            acc += XXH3_mix16B(input+16, secret+32, seed);
            acc += XXH3_mix16B(input+len-32, secret+48, seed);
        }
        acc += XXH3_mix16B(input+0, secret+0, seed);
        acc += XXH3_mix16B(input+len-16, secret+16, seed);
#endif
        return XXH3_avalanche(acc);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movabsq $-0x61c8864e7a143579, %rax # imm = 0x9E3779B185EBCA87
imulq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
cmpq $0x20, -0x10(%rbp)
jbe 0x5fee
cmpq $0x40, -0x10(%rbp)
jbe 0x5fa8
cmpq $0x60, -0x10(%rbp)
jbe 0x5f62
movq -0x8(%rbp), %rdi
addq $0x30, %rdi
movq -0x18(%rbp), %rsi
addq $0x60, %rsi
movq -0x28(%rbp), %rdx
callq 0x6540
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
addq -0x10(%rbp), %rdi
addq $-0x40, %rdi
movq -0x18(%rbp), %rsi
addq $0x70, %rsi
movq -0x28(%rbp), %rdx
callq 0x6540
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
addq $0x20, %rdi
movq -0x18(%rbp), %rsi
addq $0x40, %rsi
movq -0x28(%rbp), %rdx
callq 0x6540
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
addq -0x10(%rbp), %rdi
addq $-0x30, %rdi
movq -0x18(%rbp), %rsi
addq $0x50, %rsi
movq -0x28(%rbp), %rdx
callq 0x6540
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
addq $0x10, %rdi
movq -0x18(%rbp), %rsi
addq $0x20, %rsi
movq -0x28(%rbp), %rdx
callq 0x6540
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
addq -0x10(%rbp), %rdi
addq $-0x20, %rdi
movq -0x18(%rbp), %rsi
addq $0x30, %rsi
movq -0x28(%rbp), %rdx
callq 0x6540
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x28(%rbp), %rdx
callq 0x6540
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
addq -0x10(%rbp), %rdi
addq $-0x10, %rdi
movq -0x18(%rbp), %rsi
addq $0x10, %rsi
movq -0x28(%rbp), %rdx
callq 0x6540
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rdi
callq 0x6400
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax,%rax)