// File: /workspace/github_cpp_makefile_star2_O1/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
xorl %r12d, %r12d
movl %r12d, (%rdi)
movb %r12b, 0x4(%rdi)
movq %r12, 0x8(%rdi)
movb $0x1, 0x10(%rdi)
fldz
fstpt 0x20(%rdi)
movl %r12d, 0x30(%rdi)
movq $-0x1, 0x40(%rdi)
leaq 0x58(%rdi), %rax
movq %rax, 0x48(%rdi)
movq %r12, 0x50(%rdi)
movq %rdi, 0x18(%rsp)
movb %r12b, 0x58(%rdi)
movq (%rsi), %rbx
movl $0x40, %ebp
cmpq %rdx, %rbx
je 0x4690
xorl %r12d, %r12d
movb (%rbx), %r13b
movsbl %r13b, %edi
callq 0x2060
testl %eax, %eax
je 0x4690
cmpl $0x4, %ebp
jl 0x4685
addl $-0x4, %ebp
leal -0x61(%r13), %eax
cmpb $0x6, %al
movl $0xd0, %eax
movl $0xa9, %ecx
cmovbl %ecx, %eax
leal -0x41(%r13), %ecx
cmpb $0x6, %cl
movl $0xc9, %ecx
cmovbl %ecx, %eax
addb %r13b, %al
movzbl %al, %eax
movl %ebp, %ecx
shlq %cl, %rax
addq %rax, %r12
incq %rbx
movq %rbx, (%r15)
cmpq %r14, %rbx
jne 0x463d
testq %r12, %r12
je 0x46b3
movq %r12, %rax
shrq $0x3c, %rax
jne 0x46b8
movq %r12, %r13
addl $0x4, %ebp
shlq $0x4, %r13
shrq $0x38, %r12
movq %r13, %r12
je 0x46a1
jmp 0x46bb
xorl %r13d, %r13d
jmp 0x46c4
movq %r12, %r13
cmpl $0x41, %ebp
jge 0x47c5
movq (%r15), %rbx
cmpq %r14, %rbx
movq %r15, 0x8(%rsp)
je 0x474a
cmpb $0x2e, (%rbx)
jne 0x474a
incq %rbx
movq %rbx, (%r15)
cmpq %r14, %rbx
je 0x474a
movl %ebp, %r12d
movq %r14, %r15
movb (%rbx), %r14b
movsbl %r14b, %edi
callq 0x2060
testl %eax, %eax
je 0x4747
cmpl $0x4, %r12d
jl 0x4732
addl $-0x4, %r12d
leal -0x61(%r14), %eax
cmpb $0x6, %al
movl $0xd0, %eax
movl $0xa9, %ecx
cmovbl %ecx, %eax
leal -0x41(%r14), %ecx
cmpb $0x6, %cl
movl $0xc9, %ecx
cmovbl %ecx, %eax
addb %r14b, %al
movzbl %al, %eax
movl %r12d, %ecx
shlq %cl, %rax
addq %rax, %r13
incq %rbx
movq 0x8(%rsp), %rax
movq %rbx, (%rax)
movq %r15, %r14
cmpq %r15, %rbx
jne 0x46e4
jmp 0x474a
movq %r15, %r14
negl %ebp
movslq %ebp, %rax
movq %rax, 0x10(%rsp)
movq 0x8(%rsp), %rsi
movq (%rsi), %rax
cmpq %r14, %rax
je 0x4766
cmpb $0x70, (%rax)
je 0x4773
movq (%rsi), %rax
cmpq %r14, %rax
je 0x4786
cmpb $0x50, (%rax)
jne 0x4786
incq %rax
movq %rax, (%rsi)
leaq 0x10(%rsp), %rdi
movq %r14, %rdx
callq 0x4279
movq 0x18(%rsp), %rax
movl $0xa, (%rax)
movq %r13, 0x20(%rsp)
xorl %edx, %edx
testq %r13, %r13
sets %dl
fildll 0x20(%rsp)
leaq 0xef0f(%rip), %rcx      # 0x136b8
fadds (%rcx,%rdx,4)
fstpt 0x20(%rax)
movl 0x10(%rsp), %ecx
movl %ecx, 0x30(%rax)
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0xf291(%rip), %rdi      # 0x13a5d
leaq 0xf297(%rip), %rsi      # 0x13a6a
leaq 0xf29a(%rip), %rcx      # 0x13a74
movl $0x59f, %edx            # imm = 0x59F
callq 0x2130