// File: /workspace/github_c_makefile_star2_O2/gplessis[P]dotdeb-redis/deps/geohash-int/geohash.c
// Function: geohashEncode
int geohashEncode(const GeoHashRange *long_range, const GeoHashRange *lat_range,
                  double longitude, double latitude, uint8_t step,
                  GeoHashBits *hash) {
    /* Check basic arguments sanity. */
    if (hash == NULL || step > 32 || step == 0 ||
        RANGEPISZERO(lat_range) || RANGEPISZERO(long_range)) return 0;

    /* Return an error when trying to index outside the supported
     * constraints. */
    if (longitude > 180 || longitude < -180 ||
        latitude > 85.05112878 || latitude < -85.05112878) return 0;

    hash->bits = 0;
    hash->step = step;

    if (latitude < lat_range->min || latitude > lat_range->max ||
        longitude < long_range->min || longitude > long_range->max) {
        return 0;
    }

    double lat_offset =
        (latitude - lat_range->min) / (lat_range->max - lat_range->min);
    double long_offset =
        (longitude - long_range->min) / (long_range->max - long_range->min);

    /* convert to fixed point based on the step size */
    lat_offset *= (1 << step);
    long_offset *= (1 << step);
    hash->bits = interleave64(lat_offset, long_offset);
    return 1;
}

// Assembly:
xorl %eax, %eax
testq %rsi, %rsi
je 0x8dd52
movq %rcx, %r8
testq %rcx, %rcx
je 0x8dd52
leal -0x21(%rdx), %ecx
cmpb $-0x20, %cl
jb 0x8dd52
movsd 0x8(%rsi), %xmm2
xorpd %xmm3, %xmm3
ucomisd %xmm3, %xmm2
jne 0x8dd4d
jnp 0x8dd53
testq %rdi, %rdi
jne 0x8dd68
retq
testq %rdi, %rdi
je 0x8dd52
movsd (%rsi), %xmm3
xorpd %xmm4, %xmm4
ucomisd %xmm4, %xmm3
jne 0x8dd68
jnp 0x8dd52
movsd 0x8(%rdi), %xmm3
xorpd %xmm4, %xmm4
ucomisd %xmm4, %xmm3
jne 0x8dd85
jp 0x8dd85
movsd (%rdi), %xmm5
ucomisd %xmm4, %xmm5
jne 0x8dd85
jnp 0x8dd52
movsd 0x353d3(%rip), %xmm4    # 0xc3160
ucomisd %xmm1, %xmm4
ja 0x8dd52
movapd 0x323d5(%rip), %xmm4    # 0xc0170
andpd %xmm0, %xmm4
ucomisd 0x32391(%rip), %xmm4    # 0xc0138
ja 0x8dd52
ucomisd 0x3238f(%rip), %xmm1    # 0xc0140
ja 0x8dd52
andq $0x0, (%r8)
movb %dl, 0x8(%r8)
ucomisd %xmm2, %xmm1
ja 0x8dd52
movsd (%rsi), %xmm5
ucomisd %xmm1, %xmm5
ja 0x8dd52
ucomisd %xmm3, %xmm0
ja 0x8dd52
movsd (%rdi), %xmm4
ucomisd %xmm0, %xmm4
ja 0x8dd52
unpcklpd %xmm1, %xmm0            # xmm0 = xmm0[0],xmm1[0]
unpcklpd %xmm5, %xmm4            # xmm4 = xmm4[0],xmm5[0]
subpd %xmm4, %xmm0
unpcklpd %xmm2, %xmm3            # xmm3 = xmm3[0],xmm2[0]
pushq $0x1
popq %rax
movl %eax, %esi
movl %edx, %ecx
shll %cl, %esi
subpd %xmm4, %xmm3
divpd %xmm3, %xmm0
cvtsi2sd %esi, %xmm1
unpcklpd %xmm1, %xmm1            # xmm1 = xmm1[0,0]
mulpd %xmm0, %xmm1
cvttpd2dq %xmm1, %xmm0
movapd %xmm0, %xmm2
addpd 0x352e4(%rip), %xmm1    # 0xc3100
psrad $0x1f, %xmm2
cvttpd2dq %xmm1, %xmm1
andpd %xmm2, %xmm1
orpd %xmm0, %xmm1
xorpd %xmm0, %xmm0
unpcklps %xmm0, %xmm1            # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
movapd %xmm1, %xmm0
psllq $0x10, %xmm0
por %xmm1, %xmm0
pand 0x352c7(%rip), %xmm0    # 0xc3110
movdqa %xmm0, %xmm1
psllq $0x8, %xmm1
por %xmm0, %xmm1
pand 0x352c2(%rip), %xmm1    # 0xc3120
movdqa %xmm1, %xmm0
psllq $0x4, %xmm0
por %xmm1, %xmm0
pand 0x2ed1d(%rip), %xmm0    # 0xbcb90
movdqa %xmm0, %xmm1
psllq $0x2, %xmm1
por %xmm0, %xmm1
pand 0x2ecf8(%rip), %xmm1    # 0xbcb80
movdqa %xmm1, %xmm0
movq %xmm1, %rcx
addq %rcx, %rcx
movq %rcx, %xmm2
shufpd $0x2, %xmm1, %xmm2      # xmm2 = xmm2[0],xmm1[1]
psllq $0x2, %xmm1
paddq %xmm0, %xmm0
movsd %xmm1, %xmm0            # xmm0 = xmm1[0],xmm0[1]
orpd %xmm0, %xmm2
andpd 0x35279(%rip), %xmm2    # 0xc3130
pshufd $0xee, %xmm2, %xmm0     # xmm0 = xmm2[2,3,2,3]
por %xmm2, %xmm0
movq %xmm0, (%r8)
retq