// File: /workspace/github_c_makefile_star2_O3/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x88, %rsp
movq %rdx, %r15
movq %rsi, %r14
movq %rdi, %rbx
movb $0x0, -0xb0(%rbp)
movl 0x4(%rdx), %eax
cmpq $0x11, %rax
ja 0x7bd8
leaq 0x2a17(%rip), %rcx      # 0xa3d8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x6464615f706f5f5f, %rcx # imm = 0x6464615F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x646e615f706f5f5f, %rcx # imm = 0x646E615F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x726f625f706f5f5f, %rcx # imm = 0x726F625F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x71655f706f5f5f, %rcx # imm = 0x71655F706F5F5F
jmp 0x7b33
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x646f6d5f706f5f5f, %rcx # imm = 0x646F6D5F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x71656e5f706f5f5f, %rcx # imm = 0x71656E5F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x74675f706f5f5f, %rcx # imm = 0x74675F706F5F5F
jmp 0x7b33
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x6c756d5f706f5f5f, %rcx # imm = 0x6C756D5F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x6f78625f706f5f5f, %rcx # imm = 0x6F78625F706F5F5F
movq %rcx, -0xb0(%rbp,%rax)
movw $0x72, -0xa8(%rbp,%rax)
jmp 0x7bd8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x7669645f706f5f5f, %rcx # imm = 0x7669645F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x746c5f706f5f5f, %rcx # imm = 0x746C5F706F5F5F
jmp 0x7b33
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x6275735f706f5f5f, %rcx # imm = 0x6275735F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x726f5f706f5f5f, %rcx # imm = 0x726F5F706F5F5F
movq %rcx, -0xb0(%rbp,%rax)
jmp 0x7bd8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x6c68735f706f5f5f, %rcx # imm = 0x6C68735F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x6e61625f706f5f5f, %rcx # imm = 0x6E61625F706F5F5F
movq %rcx, -0xb0(%rbp,%rax)
movw $0x64, -0xa8(%rbp,%rax)
jmp 0x7bd8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x7268735f706f5f5f, %rcx # imm = 0x7268735F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x7165675f706f5f5f, %rcx # imm = 0x7165675F706F5F5F
jmp 0x7bc8
leaq -0xb0(%rbp), %rdi
callq 0x3100
movabsq $0x71656c5f706f5f5f, %rcx # imm = 0x71656C5F706F5F5F
movq %rcx, -0xb0(%rbp,%rax)
movb $0x0, -0xa8(%rbp,%rax)
leaq -0xb0(%rbp), %r12
movq %r12, %rdi
callq 0x3100
movw $0x28, -0xb0(%rbp,%rax)
movq 0x8(%r15), %rdx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x754c
movq %rax, %r13
movq %rax, %rdi
callq 0x83b1
movq %r12, %rdi
movq %rax, %rsi
callq 0x3280
movq %rbx, %rdi
movq %r13, %rsi
callq 0x8217
movq %r12, %rdi
callq 0x3100
movw $0x2c, -0xb0(%rbp,%rax)
movq 0x10(%r15), %rdx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x754c
movq %rax, %r14
movq %rax, %rdi
callq 0x83b1
movq %r12, %rdi
movq %rax, %rsi
callq 0x3280
movq %rbx, %rdi
movq %r14, %rsi
callq 0x8217
movq %r12, %rdi
callq 0x3100
movw $0x29, -0xb0(%rbp,%rax)
movq %rbx, %rdi
movq %r12, %rsi
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
callq 0x8040
addq $0x88, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq