// File: /workspace/github_cpp_makefile_star2_O2/joncampbell123[P]haxcc/haxpp.cpp
// Function: parse_hex_number_float_sub(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>&, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>)
token parse_hex_number_float_sub(string::iterator &li,const string::iterator lie) {
    const unsigned long long tmp_msd = 0xfull << (64ull - 4ull);
    unsigned long long tmp = 0;
    int tmpshf = 64;
    token r;

    if (li != lie) {
        while (li != lie && isxdigit(*li)) {
            if (tmpshf >= 4) {
                tmpshf -= 4;
                tmp += ((unsigned long long)char2hex_assume(*li)) << (unsigned long long)tmpshf;
            }

            li++;
        }
    }

    if (tmp != 0ull) { /* or else this will loop forever */
        while ((tmp & tmp_msd) == 0ull) {
            tmpshf += 4;
            tmp <<= 4ull;
        }

        assert(tmpshf <= 64);
    }

    const int dpshf = tmpshf;

    if (strit_next_match_inc(li,lie,'.')) {
        while (li != lie && isxdigit(*li)) {
            if (tmpshf >= 4) {
                tmpshf -= 4;
                tmp += ((unsigned long long)char2hex_assume(*li)) << (unsigned long long)tmpshf;
            }

            li++;
        }
    }

    signed long long exponent = -dpshf;

    /* FIXME: GCC behavior suggests the 'p' is mandatory. */
    if (strit_next_match_inc(li,lie,'p'))
        parse_float_hexponent(exponent,li,lie);
    else if (strit_next_match_inc(li,lie,'P'))
        parse_float_hexponent(exponent,li,lie);

    r.tval = token::FLOAT;
    r.f.fraction = tmp;
    r.f.exponent = exponent;
    return r;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %rdx, %r14
movq %rsi, %r15
movq %rdi, %r12
callq 0x2870
movq (%r15), %rbx
cmpq %r14, %rbx
movq %r12, 0x8(%rsp)
pushq $0x40
popq %rbp
je 0x3f92
xorl %r13d, %r13d
cmpq %r14, %rbx
je 0x3f52
movb (%rbx), %r12b
movsbl %r12b, %edi
callq 0x2060
testl %eax, %eax
je 0x3f52
cmpl $0x4, %ebp
jl 0x3f4a
addl $-0x4, %ebp
leal -0x61(%r12), %eax
cmpb $0x6, %al
movl $0xd0, %eax
movl $0xa9, %ecx
cmovbl %ecx, %eax
leal -0x41(%r12), %ecx
cmpb $0x6, %cl
movl $0xc9, %ecx
cmovbl %ecx, %eax
addb %r12b, %al
movzbl %al, %eax
movl %ebp, %ecx
shlq %cl, %rax
addq %rax, %r13
incq %rbx
movq %rbx, (%r15)
jmp 0x3efb
testq %r13, %r13
je 0x3f97
movq 0x8(%rsp), %r12
movq %r13, %rax
shrq $0x3c, %rax
jne 0x3f6e
addl $0x4, %ebp
shlq $0x4, %r13
jmp 0x3f5c
cmpl $0x41, %ebp
jl 0x3f9f
leaq 0xbb73(%rip), %rdi      # 0xfaed
leaq 0xbb79(%rip), %rsi      # 0xfafa
leaq 0xbb7c(%rip), %rcx      # 0xfb04
movl $0x59f, %edx            # imm = 0x59F
callq 0x2130
xorl %r13d, %r13d
jmp 0x3f9f
xorl %r13d, %r13d
movq 0x8(%rsp), %r12
cmpq %r14, %rbx
je 0x4023
cmpb $0x2e, (%rbx)
jne 0x4023
movq %r15, 0x10(%rsp)
movl %ebp, %r15d
incq %rbx
movq 0x10(%rsp), %rax
movq %rbx, (%rax)
cmpq %r14, %rbx
je 0x4019
movb (%rbx), %r12b
movsbl %r12b, %edi
callq 0x2060
testl %eax, %eax
je 0x4019
incq %rbx
cmpl $0x4, %r15d
jl 0x3fb4
movl %r15d, %ecx
addl $-0x4, %ecx
leal -0x41(%r12), %eax
leal -0x61(%r12), %edx
cmpb $0x6, %dl
movl $0xd0, %esi
movl $0xa9, %edx
cmovbl %edx, %esi
cmpb $0x6, %al
movl $0xc9, %eax
cmovbl %eax, %esi
addb %r12b, %sil
movzbl %sil, %eax
movl %ecx, %r15d
shlq %cl, %rax
addq %rax, %r13
decq %rbx
jmp 0x3fb1
movq 0x8(%rsp), %r12
movq 0x10(%rsp), %r15
negl %ebp
movslq %ebp, %rax
movq %rax, 0x18(%rsp)
cmpq %r14, %rbx
je 0x4052
cmpb $0x70, (%rbx)
je 0x403c
cmpb $0x50, (%rbx)
jne 0x4052
incq %rbx
movq %rbx, (%r15)
leaq 0x18(%rsp), %rdi
movq %r15, %rsi
movq %r14, %rdx
callq 0x3cb5
movl $0xa, (%r12)
movq %r13, 0x20(%rsp)
xorl %eax, %eax
testq %r13, %r13
sets %al
fildll 0x20(%rsp)
leaq 0xb6d6(%rip), %rcx      # 0xf748
fadds (%rcx,%rax,4)
fstpt 0x20(%r12)
movl 0x18(%rsp), %eax
movl %eax, 0x30(%r12)
movq %r12, %rax
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq