// File: /workspace/github_c_makefile_star2_O3/naleksiev[P]fin/src/fin_mod.c
// Function: fin_mod_compile_expr
static void fin_mod_compile_expr(fin_ctx_t* ctx, fin_mod_compiler_t* cmp, fin_ast_expr_t* expr) {
    switch (expr->type) {
        case fin_ast_expr_type_id: {
            fin_ast_id_expr_t* id_expr = (fin_ast_id_expr_t*)expr;
            if (id_expr->primary) {
                fin_mod_compile_expr(ctx, cmp, id_expr->primary);
                fin_str_t* type_name = fin_mod_resolve_type(ctx, cmp, id_expr->primary);
                int32_t field_idx = fin_mod_resolve_field(ctx, cmp->mod, type_name, id_expr->name);
                fin_str_destroy(ctx, type_name);
                if (field_idx >= 0) {
                    fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_load_field);
                    fin_mod_code_emit_uint8(ctx, &cmp->code, field_idx);
                    FIN_LOG("\tload_fld   %2d         // %s\n", field_idx, fin_str_cstr(id_expr->name));
                    break;
                }
            }
            else {
                fin_mod_local_t* local = fin_mod_resolve_local(cmp, id_expr->name);
                assert(local);
                fin_mod_code_emit_uint8(ctx, &cmp->code, local->is_param ? fin_op_load_arg : fin_op_load_local);
                fin_mod_code_emit_uint8(ctx, &cmp->code, local->idx);
                FIN_LOG("\t%s   %2d         // %s\n",
                    local->is_param ? "load_arg" : "load_loc", local->idx, fin_str_cstr(local->name));
            }
            break;
        }
        case fin_ast_expr_type_bool: {
            fin_ast_bool_expr_t* bool_expr = (fin_ast_bool_expr_t*)expr;
            fin_val_t val = { .b = bool_expr->value };
            int16_t idx = fin_mod_const_idx(cmp, val);
            fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_load_const);
            fin_mod_code_emit_uint16(ctx, &cmp->code, idx);
            FIN_LOG("\tload_const %2d         // %s\n", idx, bool_expr->value ? "true" : "false");
            break;
        }
        case fin_ast_expr_type_int: {
            fin_ast_int_expr_t* int_expr = (fin_ast_int_expr_t*)expr;
            fin_val_t val = { .i = int_expr->value };
            int16_t idx = fin_mod_const_idx(cmp, val);
            fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_load_const);
            fin_mod_code_emit_uint16(ctx, &cmp->code, idx);
            FIN_LOG("\tload_const %2d         // %d\n", idx, (int32_t)int_expr->value);
            break;
        }
        case fin_ast_expr_type_float: {
            fin_ast_float_expr_t* float_expr = (fin_ast_float_expr_t*)expr;
            fin_val_t val = { .f = float_expr->value };
            int16_t idx = fin_mod_const_idx(cmp, val);
            fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_load_const);
            fin_mod_code_emit_uint16(ctx, &cmp->code, idx);
            FIN_LOG("\tload_const %2d         // %f\n", idx, float_expr->value);
            break;
        }
        case fin_ast_expr_type_str: {
            fin_ast_str_expr_t* str_expr = (fin_ast_str_expr_t*)expr;
            fin_val_t val = { .s = str_expr->value };
            if (val.s)
                val.s = fin_str_clone(val.s);
            int16_t idx = fin_mod_const_idx(cmp, val);
            fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_load_const);
            fin_mod_code_emit_uint16(ctx, &cmp->code, idx);
            FIN_LOG("\tload_const %2d         // \"%s\"\n", idx, fin_str_cstr(str_expr->value));
            break;
        }
        case fin_ast_expr_type_str_interp: {
            fin_ast_str_interp_expr_t* interp_expr = (fin_ast_str_interp_expr_t*)expr;
            fin_mod_compile_expr(ctx, cmp, interp_expr->expr);
            fin_str_t* type = fin_mod_resolve_type(ctx, cmp, interp_expr->expr);
            if (strcmp(fin_str_cstr(type), "string") != 0) {
                char signature[256];
                signature[0] = '\0';
                strcat(signature, "string(");
                strcat(signature, fin_str_cstr(type));
                strcat(signature, ")");
                fin_str_t* sign = fin_str_create(ctx, signature, -1);
                int16_t idx = fin_mod_bind_idx(cmp, sign);
                fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_call);
                fin_mod_code_emit_uint16(ctx, &cmp->code, idx);
                FIN_LOG("\tcall       %2d         // %s\n", idx, fin_str_cstr(sign));
                fin_str_destroy(ctx, sign);
            }
            fin_str_destroy(ctx, type);
            if (interp_expr->next) {
                fin_mod_compile_expr(ctx, cmp, &interp_expr->next->base);
                fin_str_t* sign = fin_str_create(ctx, "__op_add(string,string)", -1);
                int16_t idx = fin_mod_bind_idx(cmp, sign);
                fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_call);
                fin_mod_code_emit_uint16(ctx, &cmp->code, idx);
                FIN_LOG("\tcall       %2d         // %s\n", idx, fin_str_cstr(sign));
                fin_str_destroy(ctx, sign);
            }
            break;
        }
        case fin_ast_expr_type_unary: {
            fin_ast_unary_expr_t* unary_expr = (fin_ast_unary_expr_t*)expr;
            fin_mod_compile_expr(ctx, cmp, unary_expr->expr);

            fin_str_t* sign = fin_mod_unary_get_signature(ctx, cmp, unary_expr);
            int16_t idx = fin_mod_bind_idx(cmp, sign);
            fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_call);
            fin_mod_code_emit_uint16(ctx, &cmp->code, idx);
            FIN_LOG("\tcall       %2d         // %s\n", idx, fin_str_cstr(sign));
            fin_str_destroy(ctx, sign);
            break;
        }
        case fin_ast_expr_type_binary: {
            fin_ast_binary_expr_t* bin_expr = (fin_ast_binary_expr_t*)expr;
            fin_mod_compile_expr(ctx, cmp, bin_expr->lhs);
            fin_mod_compile_expr(ctx, cmp, bin_expr->rhs);

            fin_str_t* sign = fin_mod_binary_get_signature(ctx, cmp, bin_expr);
            int16_t idx = fin_mod_bind_idx(cmp, sign);
            fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_call);
            fin_mod_code_emit_uint16(ctx, &cmp->code, idx);
            FIN_LOG("\tcall       %2d         // %s\n", idx, fin_str_cstr(sign));
            fin_str_destroy(ctx, sign);
            break;
        }
        case fin_ast_expr_type_cond: {
            fin_ast_cond_expr_t* cond_expr = (fin_ast_cond_expr_t*)expr;
            fin_mod_compile_expr(ctx, cmp, cond_expr->cond);
            fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_branch_if_n);
            uint8_t* lbl_else = cmp->code.top;
            fin_mod_code_emit_uint16(ctx, &cmp->code, 0);
            FIN_LOG("\tbr_if_n     lbl_%d\n", (int32_t)(lbl_else - cmp->code.begin));
            fin_mod_compile_expr(ctx, cmp, cond_expr->true_expr);
            if (cond_expr->false_expr) {
                fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_branch);
                uint8_t* lbl_end = cmp->code.top;
                fin_mod_code_emit_uint16(ctx, &cmp->code, 0);
                FIN_LOG("\tbr          lbl_%d\n", (int32_t)(lbl_end - cmp->code.begin));
                FIN_LOG("lbl_%d:\n", (int32_t)(lbl_else - cmp->code.begin));
                uint16_t offset = cmp->code.top - lbl_else - 2;
                *lbl_else++ = offset & 0xFF;
                *lbl_else++ = (offset >> 8) & 0xFF;
                fin_mod_compile_expr(ctx, cmp, cond_expr->false_expr);
                FIN_LOG("lbl_%d:\n", (int32_t)(lbl_end - cmp->code.begin));
                offset = cmp->code.top - lbl_end - 2;
                *lbl_end++ = offset & 0xFF;
                *lbl_end++ = (offset >> 8) & 0xFF;
            }
            else {
                FIN_LOG("lbl_%d:\n", (int32_t)(lbl_else - cmp->code.begin));
                uint16_t offset = cmp->code.top - lbl_else - 2;
                *lbl_else++ = offset & 0xFF;
                *lbl_else++ = (offset >> 8) & 0xFF;
            }
            break;
        }
        case fin_ast_expr_type_arg: {
            fin_ast_arg_expr_t* arg_expr = (fin_ast_arg_expr_t*)expr;
            fin_mod_compile_expr(ctx, cmp, arg_expr->expr);
            break;
        }
        case fin_ast_expr_type_invoke: {
            fin_ast_invoke_expr_t* invoke_expr = (fin_ast_invoke_expr_t*)expr;
            for (fin_ast_arg_expr_t* e = invoke_expr->args; e; e = e->next)
                fin_mod_compile_expr(ctx, cmp, &e->base);
            fin_str_t* sign = fin_mod_invoke_get_signature(ctx, cmp, invoke_expr);
            int16_t idx = fin_mod_bind_idx(cmp, sign);
            fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_call);
            fin_mod_code_emit_uint16(ctx, &cmp->code, idx);
            FIN_LOG("\tcall       %2d         // %s\n", idx, fin_str_cstr(sign));
            fin_str_destroy(ctx, sign);
            break;
        }
        case fin_ast_expr_type_assign: {
            fin_ast_assign_expr_t* assign_expr = (fin_ast_assign_expr_t*)expr;
            assert(assign_expr->op == fin_ast_assign_type_assign); // rest not supported yet
            assert(assign_expr->lhs->type == fin_ast_expr_type_id);
            fin_ast_id_expr_t* id_expr = (fin_ast_id_expr_t*)assign_expr->lhs;
            if (id_expr->primary)
                fin_mod_compile_expr(ctx, cmp, id_expr->primary);
            fin_mod_compile_expr(ctx, cmp, assign_expr->rhs);
            if (id_expr->primary) {
                fin_str_t* type_name = fin_mod_resolve_type(ctx, cmp, id_expr->primary);
                int32_t field_idx = fin_mod_resolve_field(ctx, cmp->mod, type_name, id_expr->name);
                fin_str_destroy(ctx, type_name);
                if (field_idx >= 0) {
                    fin_mod_code_emit_uint8(ctx, &cmp->code, fin_op_store_field);
                    fin_mod_code_emit_uint8(ctx, &cmp->code, field_idx);
                    FIN_LOG("\tstore_fld  %2d         // %s\n", field_idx, fin_str_cstr(id_expr->name));
                    break;
                }
            }
            else {
                fin_mod_local_t* local = fin_mod_resolve_local(cmp, id_expr->name);
                assert(local);
                fin_mod_code_emit_uint8(ctx, &cmp->code, local->is_param ? fin_op_store_arg : fin_op_store_local);
                fin_mod_code_emit_uint8(ctx, &cmp->code, local->idx);
                FIN_LOG("\t%s  %2d         // %s\n",
                local->is_param ? "store_arg" : "store_loc", local->idx, fin_str_cstr(local->name));
            }
            break;
        }
        default:
            assert(0);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x118, %rsp            # imm = 0x118
movq %rdx, %r15
movq %rsi, %r13
movq %rdi, %r14
movl (%r15), %eax
cmpl $0x9, %eax
jne 0x6c0b
movq 0x8(%r15), %r15
jmp 0x6bfd
cmpl $0xc, %eax
ja 0x7376
movl %eax, %eax
leaq 0x3743(%rip), %rcx      # 0xa360
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x8(%r15), %rdx
testq %rdx, %rdx
je 0x7253
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
movq 0x8(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x754c
movq %rax, %r12
movq (%r13), %rsi
movq 0x10(%r15), %rcx
movq %r14, %rdi
movq %rax, %rdx
callq 0x778c
movl %eax, %r15d
movq %r14, %rdi
movq %r12, %rsi
callq 0x8217
testl %r15d, %r15d
js 0x7241
leaq 0x18(%r13), %r12
movq %r14, %rdi
movq %r12, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb $0x5, (%rax)
jmp 0x6ef6
movq 0x8(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
movq 0x8(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x754c
movq %rax, %r12
movq %rax, %rdi
callq 0x83b1
leaq 0x388f(%rip), %rsi      # 0xa561
movq %rax, %rdi
callq 0x3180
testl %eax, %eax
je 0x6dac
leaq -0x140(%rbp), %rbx
movb $0x0, (%rbx)
movq %rbx, %rdi
callq 0x3100
movabsq $0x28676e69727473, %rcx # imm = 0x28676E69727473
movq %rcx, -0x140(%rbp,%rax)
movq %r12, %rdi
callq 0x83b1
movq %rbx, %rdi
movq %rax, %rsi
callq 0x3280
movq %rbx, %rdi
callq 0x3100
movw $0x29, -0x140(%rbp,%rax)
movq %r14, %rdi
movq %rbx, %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x8040
movq %rax, -0x30(%rbp)
movq (%r13), %rdi
movq %rax, %rsi
callq 0x77cd
movl %eax, -0x34(%rbp)
leaq 0x18(%r13), %rbx
movq %r14, %rdi
movq %rbx, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb $0x7, (%rax)
movq %r14, %rdi
movq %rbx, %rsi
movl $0x2, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movl -0x34(%rbp), %edx
movb %dl, (%rax)
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %dh, (%rax)
movq %r14, %rdi
movq -0x30(%rbp), %rsi
callq 0x8217
movq %r14, %rdi
movq %r12, %rsi
callq 0x8217
movq 0x10(%r15), %rdx
testq %rdx, %rdx
je 0x7241
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
leaq 0x406d(%rip), %rsi      # 0xae43
movq %r14, %rdi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x8040
movq %rax, %r15
movq (%r13), %rdi
movq %rax, %rsi
callq 0x77cd
movl %eax, %ebx
leaq 0x18(%r13), %r12
movq %r14, %rdi
movq %r12, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb $0x7, (%rax)
movq %r14, %rdi
movq %r12, %rsi
movl $0x2, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %bl, (%rax)
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %bh, (%rax)
movq %r14, %rdi
movq %r15, %rsi
callq 0x8217
jmp 0x7241
cmpl $0x0, 0x18(%r15)
jne 0x7395
movq 0x8(%r15), %rbx
cmpl $0x0, (%rbx)
jne 0x73b4
movq 0x8(%rbx), %rdx
testq %rdx, %rdx
je 0x6e7f
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
movq 0x10(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
movq 0x8(%rbx), %rdx
testq %rdx, %rdx
je 0x72b1
movq %r14, %rdi
movq %r13, %rsi
callq 0x754c
movq %rax, %r12
movq (%r13), %rsi
movq 0x10(%rbx), %rcx
movq %r14, %rdi
movq %rax, %rdx
callq 0x778c
movl %eax, %r15d
movq %r14, %rdi
movq %r12, %rsi
callq 0x8217
testl %r15d, %r15d
js 0x7241
leaq 0x18(%r13), %r12
movq %r14, %rdi
movq %r12, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb $0x6, (%rax)
movq %r14, %rdi
movq %r12, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %r15b, (%rax)
jmp 0x7241
movq 0x8(%r15), %rdi
testq %rdi, %rdi
je 0x71c2
callq 0x824c
jmp 0x71c4
movzbl 0x4(%r15), %ecx
movq (%r13), %rax
movslq 0x30(%rax), %rdx
movq 0x18(%rax), %rsi
testq %rdx, %rdx
jle 0x6fe9
xorl %ebx, %ebx
cmpq %rcx, (%rsi,%rbx,8)
je 0x71f2
incq %rbx
cmpq %rbx, %rdx
jne 0x6f4d
jmp 0x6fe9
movq 0x8(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
movq 0x10(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
movq %r14, %rdi
movq %r13, %rsi
movq %r15, %rdx
callq 0x7989
jmp 0x7146
movq 0x8(%r15), %rcx
movq (%r13), %rax
movslq 0x30(%rax), %rdx
movq 0x18(%rax), %rsi
testq %rdx, %rdx
jle 0x6fe9
xorl %ebx, %ebx
cmpq %rcx, (%rsi,%rbx,8)
je 0x71f2
incq %rbx
cmpq %rbx, %rdx
jne 0x6fac
jmp 0x6fe9
movq 0x8(%r15), %rcx
movq (%r13), %rax
movslq 0x30(%rax), %rdx
movq 0x18(%rax), %rsi
testq %rdx, %rdx
jle 0x6fe9
xorl %ebx, %ebx
cmpq %rcx, (%rsi,%rbx,8)
je 0x71f2
incq %rbx
cmpq %rbx, %rdx
jne 0x6fd7
movq %rcx, (%rsi,%rdx,8)
movl 0x30(%rax), %ebx
leal 0x1(%rbx), %ecx
movl %ecx, 0x30(%rax)
jmp 0x71f2
movq 0x8(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
movq %r14, %rdi
movq %r13, %rsi
movq %r15, %rdx
callq 0x782a
jmp 0x7146
movq 0x8(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
leaq 0x18(%r13), %r12
movq %r14, %rdi
movq %r12, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb $0xa, (%rax)
movq 0x18(%r13), %rbx
movq %r14, %rdi
movq %r12, %rsi
movl $0x2, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
xorl %ecx, %ecx
movb %cl, (%rax)
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rdx
movq %rdx, 0x18(%r13)
movb %cl, (%rax)
movq 0x10(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
cmpq $0x0, 0x18(%r15)
je 0x72a3
movq %r14, %rdi
movq %r12, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb $0x8, (%rax)
movq 0x18(%r13), %rax
movq %rax, -0x30(%rbp)
movq %r14, %rdi
movq %r12, %rsi
movl $0x2, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
xorl %ecx, %ecx
movb %cl, (%rax)
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rdx
movq %rdx, 0x18(%r13)
movb %cl, (%rax)
movl 0x18(%r13), %eax
subl %ebx, %eax
addl $-0x2, %eax
movw %ax, (%rbx)
movq 0x18(%r15), %rdx
movq %r14, %rdi
movq %r13, %rsi
callq 0x6be0
movl 0x18(%r13), %eax
movq -0x30(%rbp), %rcx
subl %ecx, %eax
addl $-0x2, %eax
movw %ax, (%rcx)
jmp 0x7241
movq 0x10(%r15), %r12
movq %r14, %rdi
movq %r13, %rsi
testq %r12, %r12
je 0x713e
movq %r12, %rdx
callq 0x6be0
movq 0x10(%r12), %r12
jmp 0x7124
movq %r15, %rdx
callq 0x7c97
movq %rax, %r15
movq (%r13), %rdi
movq %rax, %rsi
callq 0x77cd
movl %eax, %ebx
leaq 0x18(%r13), %r12
movq %r14, %rdi
movq %r12, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb $0x7, (%rax)
movq %r14, %rdi
movq %r12, %rsi
movl $0x2, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %bl, (%rax)
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %bh, (%rax)
movq %r14, %rdi
movq %r15, %rsi
addq $0x118, %rsp            # imm = 0x118
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x8217
xorl %eax, %eax
movq (%r13), %rcx
movslq 0x30(%rcx), %rdx
movq 0x18(%rcx), %rsi
testq %rdx, %rdx
jle 0x71e5
xorl %ebx, %ebx
cmpq %rax, (%rsi,%rbx,8)
je 0x71f2
incq %rbx
cmpq %rbx, %rdx
jne 0x71d7
movq %rax, (%rsi,%rdx,8)
movl 0x30(%rcx), %ebx
leal 0x1(%rbx), %eax
movl %eax, 0x30(%rcx)
leaq 0x18(%r13), %r15
movq %r14, %rdi
movq %r15, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb $0x0, (%rax)
movq %r14, %rdi
movq %r15, %rsi
movl $0x2, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %bl, (%rax)
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %bh, (%rax)
addq $0x118, %rsp            # imm = 0x118
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movzbl 0x1a30(%r13), %ecx
testq %rcx, %rcx
je 0x7284
movq 0x10(%r15), %rax
shll $0x3, %ecx
leaq (%rcx,%rcx,2), %rcx
xorl %ebx, %ebx
cmpq %rax, 0x130(%r13,%rbx)
je 0x72fd
addq $0x18, %rbx
cmpq %rbx, %rcx
jne 0x726d
leaq 0x3281(%rip), %rdi      # 0xa50c
leaq 0x31c0(%rip), %rsi      # 0xa452
leaq 0x3279(%rip), %rcx      # 0xa512
movl $0x15b, %edx            # imm = 0x15B
callq 0x3120
movl (%r12), %eax
subl %ebx, %eax
addl $-0x2, %eax
movw %ax, (%rbx)
jmp 0x7241
movzbl 0x1a30(%r13), %ecx
testq %rcx, %rcx
je 0x72de
movq 0x10(%rbx), %rax
shll $0x3, %ecx
leaq (%rcx,%rcx,2), %rcx
xorl %ebx, %ebx
cmpq %rax, 0x130(%r13,%rbx)
je 0x7315
addq $0x18, %rbx
cmpq %rbx, %rcx
jne 0x72cb
leaq 0x3227(%rip), %rdi      # 0xa50c
leaq 0x3166(%rip), %rsi      # 0xa452
leaq 0x321f(%rip), %rcx      # 0xa512
movl $0x204, %edx            # imm = 0x204
callq 0x3120
leaq 0x18(%r13), %r15
movb 0x141(%r13,%rbx), %r12b
xorb $0x1, %r12b
addb %r12b, %r12b
incb %r12b
jmp 0x732c
leaq 0x18(%r13), %r15
movb 0x141(%r13,%rbx), %r12b
xorb $0x1, %r12b
addb %r12b, %r12b
addb $0x2, %r12b
movq %r14, %rdi
movq %r15, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %r12b, (%rax)
movb 0x140(%r13,%rbx), %bl
movq %r14, %rdi
movq %r15, %rsi
movl $0x1, %edx
callq 0x7e19
movq 0x18(%r13), %rax
leaq 0x1(%rax), %rcx
movq %rcx, 0x18(%r13)
movb %bl, (%rax)
jmp 0x7241
leaq 0x2d44(%rip), %rdi      # 0xa0c1
leaq 0x30ce(%rip), %rsi      # 0xa452
leaq 0x3187(%rip), %rcx      # 0xa512
movl $0x20d, %edx            # imm = 0x20D
callq 0x3120
leaq 0x31cc(%rip), %rdi      # 0xa568
leaq 0x30af(%rip), %rsi      # 0xa452
leaq 0x3168(%rip), %rcx      # 0xa512
movl $0x1f1, %edx            # imm = 0x1F1
callq 0x3120
leaq 0x31db(%rip), %rdi      # 0xa596
leaq 0x3090(%rip), %rsi      # 0xa452
leaq 0x3149(%rip), %rcx      # 0xa512
movl $0x1f2, %edx            # imm = 0x1F2
callq 0x3120