// File: /workspace/github_c_makefile_star2_O0/naleksiev[P]fin/src/fin_mod.c
// Function: fin_mod_binary_get_signature
static fin_str_t* fin_mod_binary_get_signature(fin_ctx_t* ctx, fin_mod_compiler_t* cmp, fin_ast_binary_expr_t* bin_expr) {
    char sign[128];
    sign[0] = '\0';
    switch (bin_expr->op) {
        case fin_ast_binary_type_add:  strcat(sign, "__op_add");  break;
        case fin_ast_binary_type_sub:  strcat(sign, "__op_sub");  break;
        case fin_ast_binary_type_mul:  strcat(sign, "__op_mul");  break;
        case fin_ast_binary_type_div:  strcat(sign, "__op_div");  break;
        case fin_ast_binary_type_mod:  strcat(sign, "__op_mod");  break;
        case fin_ast_binary_type_shl:  strcat(sign, "__op_shl");  break;
        case fin_ast_binary_type_shr:  strcat(sign, "__op_shr");  break;
        case fin_ast_binary_type_ls:   strcat(sign, "__op_lt");   break;
        case fin_ast_binary_type_leq:  strcat(sign, "__op_leq");  break;
        case fin_ast_binary_type_gr:   strcat(sign, "__op_gt");   break;
        case fin_ast_binary_type_geq:  strcat(sign, "__op_geq");  break;
        case fin_ast_binary_type_eq:   strcat(sign, "__op_eq");   break;
        case fin_ast_binary_type_neq:  strcat(sign, "__op_neq");  break;
        case fin_ast_binary_type_band: strcat(sign, "__op_band"); break;
        case fin_ast_binary_type_bor:  strcat(sign, "__op_bor");  break;
        case fin_ast_binary_type_bxor: strcat(sign, "__op_bxor"); break;
        case fin_ast_binary_type_and:  strcat(sign, "__op_and");  break;
        case fin_ast_binary_type_or:   strcat(sign, "__op_or");   break;
    }
    strcat(sign, "(");
    fin_str_t* lhs_type = fin_mod_resolve_type(ctx, cmp, bin_expr->lhs);
    strcat(sign, fin_str_cstr(lhs_type));
    fin_str_destroy(ctx, lhs_type);
    strcat(sign, ",");
    fin_str_t* rhs_type = fin_mod_resolve_type(ctx, cmp, bin_expr->rhs);
    strcat(sign, fin_str_cstr(rhs_type));
    fin_str_destroy(ctx, rhs_type);
    strcat(sign, ")");
    return fin_str_create(ctx, sign, -1);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xd0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movb $0x0, -0xa0(%rbp)
movq -0x18(%rbp), %rax
movl 0x4(%rax), %eax
movq %rax, -0xb8(%rbp)
subq $0x11, %rax
ja 0xa5d6
movq -0xb8(%rbp), %rax
leaq 0x31f4(%rip), %rcx      # 0xd628
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq -0xa0(%rbp), %rdi
leaq 0x349c(%rip), %rsi      # 0xd8e7
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x348d(%rip), %rsi      # 0xd8f0
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x347e(%rip), %rsi      # 0xd8f9
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x346f(%rip), %rsi      # 0xd902
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x3460(%rip), %rsi      # 0xd90b
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x3451(%rip), %rsi      # 0xd914
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x3442(%rip), %rsi      # 0xd91d
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x3433(%rip), %rsi      # 0xd926
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x3423(%rip), %rsi      # 0xd92e
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x3414(%rip), %rsi      # 0xd937
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x3404(%rip), %rsi      # 0xd93f
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x33f5(%rip), %rsi      # 0xd948
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x33e8(%rip), %rsi      # 0xd950
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x33dc(%rip), %rsi      # 0xd959
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x33d1(%rip), %rsi      # 0xd963
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x33c5(%rip), %rsi      # 0xd96c
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x33ba(%rip), %rsi      # 0xd976
callq 0x3270
jmp 0xa5d6
leaq -0xa0(%rbp), %rdi
leaq 0x33ae(%rip), %rsi      # 0xd97f
callq 0x3270
leaq -0xa0(%rbp), %rdi
leaq 0x31dc(%rip), %rsi      # 0xd7c0
callq 0x3270
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rdx
callq 0x9cb0
movq %rax, -0xa8(%rbp)
leaq -0xa0(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0xa8(%rbp), %rdi
callq 0xb370
movq -0xc8(%rbp), %rdi
movq %rax, %rsi
callq 0x3270
movq -0x8(%rbp), %rdi
movq -0xa8(%rbp), %rsi
callq 0xb0b0
leaq -0xa0(%rbp), %rdi
leaq 0x3024(%rip), %rsi      # 0xd670
callq 0x3270
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdx
callq 0x9cb0
movq %rax, -0xb0(%rbp)
leaq -0xa0(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0xb0(%rbp), %rdi
callq 0xb370
movq -0xc0(%rbp), %rdi
movq %rax, %rsi
callq 0x3270
movq -0x8(%rbp), %rdi
movq -0xb0(%rbp), %rsi
callq 0xb0b0
leaq -0xa0(%rbp), %rdi
leaq 0x3a60(%rip), %rsi      # 0xe114
callq 0x3270
movq -0x8(%rbp), %rdi
leaq -0xa0(%rbp), %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0xae20
addq $0xd0, %rsp
popq %rbp
retq
nopw (%rax,%rax)