// File: /workspace/github_c_makefile_star2_O0/sebbekarlsson[P]cola/src/interpret.c
// Function: interpret_visit_binop
ast_node* interpret_visit_binop(ast_node_binop* node) {
    ast_node* left = node->left;
    ast_node* right = interpret_visit(node->right);
    ast_node_variable_definition* definition;

    if (node->tok->type == _EQUALS) {
        if (left->type != AST_TYPE_VARIABLE)
            error_in_interpreter("Can only use assign on variables");

        ast_node_variable* ast_var = (ast_node_variable*) left;

        definition = get_variable_definition(
            (scope*) ast_node_get_scope((ast_node*)node),
            ast_var->tok->value
        );

        if (!definition)
            error_in_interpreter("Variables must be defined before they can be assigned");

        // this causes undefined behaviour
        //free(definition->value);
        //definition->value = malloc(sizeof(right));
        ast_node* value = interpret_visit(right);

        if (
            (definition->data_type == _DATA_TYPE_INTEGER && value->type != AST_TYPE_INTEGER) ||
            (definition->data_type == _DATA_TYPE_FLOAT && value->type != AST_TYPE_FLOAT) ||
            (definition->data_type == _DATA_TYPE_VOID && value->type != AST_TYPE_EMPTY) ||
            (definition->data_type == _DATA_TYPE_STRING && value->type != AST_TYPE_STRING)
        ) {
            error_in_interpreter("Wrong data_type");
        }

        definition->value = value;
        return definition->value;
    }

    left = interpret_visit(node->left);

    if (left->type == AST_TYPE_INTEGER && right->type == AST_TYPE_INTEGER) {
        int left_integer = ((ast_node_integer*) left)->value;
        int right_integer = ((ast_node_integer*) right)->value;
        
        if (node->tok->type == _OP_PLUS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer + right_integer);
        } else if (node->tok->type == _OP_SUBTRACT) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer - right_integer);
        } else if (node->tok->type == _OP_DIVIDE) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer / right_integer);
        } else if (node->tok->type == _OP_MULTIPLY) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer * right_integer);
        } else if (node->tok->type == _EQUALS_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer == right_integer);
        } else if (node->tok->type == _NOT_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer != right_integer);
        } else if (node->tok->type == _LESS_THAN) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer < right_integer);
        } else if (node->tok->type == _LARGER_THAN) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer > right_integer);
        }
    } else if (left->type == AST_TYPE_FLOAT && right->type == AST_TYPE_FLOAT) {
        float left_float = ((ast_node_float*) left)->value;
        float right_float = ((ast_node_float*) right)->value;
        
        if (node->tok->type == _OP_PLUS) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_float + right_float);
        } else if (node->tok->type == _OP_SUBTRACT) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_float - right_float);
        } else if (node->tok->type == _OP_DIVIDE) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_float / right_float);
        } else if (node->tok->type == _OP_MULTIPLY) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_float * right_float);
        } else if (node->tok->type == _EQUALS_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_float == right_float);
        } else if (node->tok->type == _NOT_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_float != right_float);
        } else if (node->tok->type == _LESS_THAN) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_float < right_float);
        } else if (node->tok->type == _LARGER_THAN) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_float > right_float);
        }
    } else if (left->type == AST_TYPE_INTEGER && right->type == AST_TYPE_FLOAT) {
        int left_integer = ((ast_node_integer*) left)->value;
        float right_float = ((ast_node_float*) right)->value;
        
        if (node->tok->type == _OP_PLUS) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_integer + right_float);
        } else if (node->tok->type == _OP_SUBTRACT) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_integer - right_float);
        } else if (node->tok->type == _OP_DIVIDE) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_integer / right_float);
        } else if (node->tok->type == _OP_MULTIPLY) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_integer * right_float);
        } else if (node->tok->type == _EQUALS_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer == right_float);
        } else if (node->tok->type == _NOT_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer != right_float);
        } else if (node->tok->type == _LESS_THAN) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer < right_float);
        } else if (node->tok->type == _LARGER_THAN) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_integer > right_float);
        }
    } else if (left->type == AST_TYPE_FLOAT && right->type == AST_TYPE_INTEGER) {
        float left_float = ((ast_node_float*) left)->value;
        int right_integer = ((ast_node_integer*) right)->value;
        
        if (node->tok->type == _OP_PLUS) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_float + right_integer);
        } else if (node->tok->type == _OP_SUBTRACT) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_float - right_integer);
        } else if (node->tok->type == _OP_DIVIDE) {
            return (ast_node*) init_ast_node_float(init_token(_FLOAT, node->value), left_float / right_integer);
        } else if (node->tok->type == _OP_MULTIPLY) {
            return (ast_node*) init_ast_node_integer(init_token(_FLOAT, node->value), left_float * right_integer);
        } else if (node->tok->type == _EQUALS_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_float == right_integer);
        } else if (node->tok->type == _NOT_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_float != right_integer);
        } else if (node->tok->type == _LESS_THAN) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_float < right_integer);
        } else if (node->tok->type == _LARGER_THAN) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), left_float > right_integer);
        }
    } else if (left->type == AST_TYPE_STRING && right->type == AST_TYPE_STRING) {
        char* left_string = ((ast_node_string*) left)->value;
        char* right_string = ((ast_node_string*) right)->value;

        
        if (node->tok->type == _OP_PLUS) {
            strcat(left_string, right_string);
            return (ast_node*) init_ast_node_string(init_token(_STRING, node->value), left_string);
        } else if (node->tok->type == _EQUALS_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), strcmp(left_string, right_string) == 0);
        } else if (node->tok->type == _NOT_EQUALS) {
            return (ast_node*) init_ast_node_integer(init_token(_INTEGER, node->value), strcmp(left_string, right_string) != 0);
        }
    } else {
        error_in_interpreter("Invalid binop"); 
    }

    return (ast_node*) node;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rdi
callq 0x2110
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x1b, (%rax)
jne 0x2480
movq -0x18(%rbp), %rax
cmpl $0x9, (%rax)
je 0x23c2
leaq 0x4d78(%rip), %rdi      # 0x7135
callq 0x2040
movq -0x18(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rdi
callq 0x12b0
movq %rax, %rdi
movq -0x30(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rsi
callq 0x5e40
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
jne 0x23fe
leaq 0x4d5d(%rip), %rdi      # 0x7156
callq 0x2040
movq -0x20(%rbp), %rdi
callq 0x2110
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
cmpl $0x29, 0x20(%rax)
jne 0x241e
movq -0x38(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x2457
movq -0x28(%rbp), %rax
cmpl $0x2a, 0x20(%rax)
jne 0x2431
movq -0x38(%rbp), %rax
cmpl $0x4, (%rax)
jne 0x2457
movq -0x28(%rbp), %rax
cmpl $0x2b, 0x20(%rax)
jne 0x2444
movq -0x38(%rbp), %rax
cmpl $0x0, (%rax)
jne 0x2457
movq -0x28(%rbp), %rax
cmpl $0x2d, 0x20(%rax)
jne 0x2463
movq -0x38(%rbp), %rax
cmpl $0x5, (%rax)
je 0x2463
leaq 0x4d2e(%rip), %rdi      # 0x718c
callq 0x2040
movq -0x38(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
callq 0x2110
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x26a6
movq -0x20(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x26a6
movq -0x18(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0x3c(%rbp)
movq -0x20(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x5, (%rax)
jne 0x24f5
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movl -0x3c(%rbp), %esi
addl -0x40(%rbp), %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x6, (%rax)
jne 0x252b
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movl -0x3c(%rbp), %esi
subl -0x40(%rbp), %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x8, (%rax)
jne 0x2564
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movl -0x3c(%rbp), %eax
cltd
idivl -0x40(%rbp)
movl %eax, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x7, (%rax)
jne 0x259b
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movl -0x3c(%rbp), %esi
imull -0x40(%rbp), %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x24, (%rax)
jne 0x25d9
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movl -0x3c(%rbp), %eax
cmpl -0x40(%rbp), %eax
sete %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x1a, (%rax)
jne 0x2617
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movl -0x3c(%rbp), %eax
cmpl -0x40(%rbp), %eax
setne %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x16, (%rax)
jne 0x2655
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movl -0x3c(%rbp), %eax
cmpl -0x40(%rbp), %eax
setl %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x17, (%rax)
jne 0x2693
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movl -0x3c(%rbp), %eax
cmpl -0x40(%rbp), %eax
setg %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
jmp 0x2695
jmp 0x2697
jmp 0x2699
jmp 0x269b
jmp 0x269d
jmp 0x269f
jmp 0x26a1
jmp 0x2ea8
movq -0x18(%rbp), %rax
cmpl $0x4, (%rax)
jne 0x28e9
movq -0x20(%rbp), %rax
cmpl $0x4, (%rax)
jne 0x28e9
movq -0x18(%rbp), %rax
movss 0x20(%rax), %xmm0
movss %xmm0, -0x44(%rbp)
movq -0x20(%rbp), %rax
movss 0x20(%rax), %xmm0
movss %xmm0, -0x48(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x5, (%rax)
jne 0x2716
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x44(%rbp), %xmm0
addss -0x48(%rbp), %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x6, (%rax)
jne 0x2750
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x44(%rbp), %xmm0
subss -0x48(%rbp), %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x8, (%rax)
jne 0x278a
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x44(%rbp), %xmm0
divss -0x48(%rbp), %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x7, (%rax)
jne 0x27c4
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x44(%rbp), %xmm0
mulss -0x48(%rbp), %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x24, (%rax)
jne 0x280a
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x44(%rbp), %xmm0
ucomiss -0x48(%rbp), %xmm0
sete %al
setnp %cl
andb %cl, %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x1a, (%rax)
jne 0x2850
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x44(%rbp), %xmm0
ucomiss -0x48(%rbp), %xmm0
setne %al
setp %cl
orb %cl, %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x16, (%rax)
jne 0x2895
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x44(%rbp), %xmm1
movss -0x48(%rbp), %xmm0
ucomiss %xmm1, %xmm0
seta %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x17, (%rax)
jne 0x28d6
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x44(%rbp), %xmm0
ucomiss -0x48(%rbp), %xmm0
seta %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
jmp 0x28d8
jmp 0x28da
jmp 0x28dc
jmp 0x28de
jmp 0x28e0
jmp 0x28e2
jmp 0x28e4
jmp 0x2ea6
movq -0x18(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x2b28
movq -0x20(%rbp), %rax
cmpl $0x4, (%rax)
jne 0x2b28
movq -0x18(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0x4c(%rbp)
movq -0x20(%rbp), %rax
movss 0x20(%rax), %xmm0
movss %xmm0, -0x50(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x5, (%rax)
jne 0x2955
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
cvtsi2ssl -0x4c(%rbp), %xmm0
addss -0x50(%rbp), %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x6, (%rax)
jne 0x298f
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
cvtsi2ssl -0x4c(%rbp), %xmm0
subss -0x50(%rbp), %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x8, (%rax)
jne 0x29c9
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
cvtsi2ssl -0x4c(%rbp), %xmm0
divss -0x50(%rbp), %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x7, (%rax)
jne 0x2a03
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
cvtsi2ssl -0x4c(%rbp), %xmm0
mulss -0x50(%rbp), %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x24, (%rax)
jne 0x2a49
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
cvtsi2ssl -0x4c(%rbp), %xmm0
ucomiss -0x50(%rbp), %xmm0
sete %al
setnp %cl
andb %cl, %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x1a, (%rax)
jne 0x2a8f
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
cvtsi2ssl -0x4c(%rbp), %xmm0
ucomiss -0x50(%rbp), %xmm0
setne %al
setp %cl
orb %cl, %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x16, (%rax)
jne 0x2ad4
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
cvtsi2ssl -0x4c(%rbp), %xmm1
movss -0x50(%rbp), %xmm0
ucomiss %xmm1, %xmm0
seta %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x17, (%rax)
jne 0x2b15
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
cvtsi2ssl -0x4c(%rbp), %xmm0
ucomiss -0x50(%rbp), %xmm0
seta %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
jmp 0x2b17
jmp 0x2b19
jmp 0x2b1b
jmp 0x2b1d
jmp 0x2b1f
jmp 0x2b21
jmp 0x2b23
jmp 0x2ea4
movq -0x18(%rbp), %rax
cmpl $0x4, (%rax)
jne 0x2d87
movq -0x20(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x2d87
movq -0x18(%rbp), %rax
movss 0x20(%rax), %xmm0
movss %xmm0, -0x54(%rbp)
movq -0x20(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0x58(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x5, (%rax)
jne 0x2b98
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x54(%rbp), %xmm0
cvtsi2ssl -0x58(%rbp), %xmm1
addss %xmm1, %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x6, (%rax)
jne 0x2bd6
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x54(%rbp), %xmm0
cvtsi2ssl -0x58(%rbp), %xmm1
subss %xmm1, %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x8, (%rax)
jne 0x2c14
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x54(%rbp), %xmm0
cvtsi2ssl -0x58(%rbp), %xmm1
divss %xmm1, %xmm0
callq 0x15a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x7, (%rax)
jne 0x2c56
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x27, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x54(%rbp), %xmm0
cvtsi2ssl -0x58(%rbp), %xmm1
mulss %xmm1, %xmm0
cvttss2si %xmm0, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x24, (%rax)
jne 0x2ca0
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x54(%rbp), %xmm0
cvtsi2ssl -0x58(%rbp), %xmm1
ucomiss %xmm1, %xmm0
sete %al
setnp %cl
andb %cl, %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x1a, (%rax)
jne 0x2cea
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x54(%rbp), %xmm0
cvtsi2ssl -0x58(%rbp), %xmm1
ucomiss %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x16, (%rax)
jne 0x2d2f
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x54(%rbp), %xmm1
cvtsi2ssl -0x58(%rbp), %xmm0
ucomiss %xmm1, %xmm0
seta %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x17, (%rax)
jne 0x2d74
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, %rdi
movss -0x54(%rbp), %xmm0
cvtsi2ssl -0x58(%rbp), %xmm1
ucomiss %xmm1, %xmm0
seta %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
jmp 0x2d76
jmp 0x2d78
jmp 0x2d7a
jmp 0x2d7c
jmp 0x2d7e
jmp 0x2d80
jmp 0x2d82
jmp 0x2ea2
movq -0x18(%rbp), %rax
cmpl $0x5, (%rax)
jne 0x2e94
movq -0x20(%rbp), %rax
cmpl $0x5, (%rax)
jne 0x2e94
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x68(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x5, (%rax)
jne 0x2dfa
movq -0x60(%rbp), %rdi
movq -0x68(%rbp), %rsi
callq 0x1120
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x3, %edi
callq 0x61f0
movq %rax, %rdi
movq -0x60(%rbp), %rsi
callq 0x18a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x24, (%rax)
jne 0x2e44
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, -0x70(%rbp)
movq -0x60(%rbp), %rdi
movq -0x68(%rbp), %rsi
callq 0x10a0
movq -0x70(%rbp), %rdi
cmpl $0x0, %eax
sete %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x1a, (%rax)
jne 0x2e8e
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rsi
movl $0x2, %edi
callq 0x61f0
movq %rax, -0x78(%rbp)
movq -0x60(%rbp), %rdi
movq -0x68(%rbp), %rsi
callq 0x10a0
movq -0x78(%rbp), %rdi
cmpl $0x0, %eax
setne %al
andb $0x1, %al
movzbl %al, %esi
callq 0x17a0
movq %rax, -0x8(%rbp)
jmp 0x2eb0
jmp 0x2e90
jmp 0x2e92
jmp 0x2ea0
leaq 0x4301(%rip), %rdi      # 0x719c
callq 0x2040
jmp 0x2ea2
jmp 0x2ea4
jmp 0x2ea6
jmp 0x2ea8
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x80, %rsp
popq %rbp
retq
nopl (%rax)