// File: /workspace/github_c_makefile_star2_O0/generot[P]VM-0/src/vm/handling.c
// Function: handle_instr
void handle_instr(instr in, double *data_segment, size_s *ip) {
    double lhs = 0, rhs = 0;
    size_s addr;

    if(in.op >= OPC_ADDF && in.op <= OPC_NEQ) {
        lhs = stack_pop();
        rhs = stack_pop();
    }

    switch(in.op) {
    case OPC_PUSH:
        if(in.content_type == INST_ADDR)
            stack_push(in.addr);
        else
            stack_push(in.val);
        
        break;
    case OPC_POP:
        stack_pop();
        break;
    case OPC_DEREF:
        addr = (size_s)stack_pop();
        stack_push(data_segment[addr]);
        break;
    case OPC_STORE:
        data_segment[in.addr] = stack_pop();
        break;
    case OPC_ADDF:
        stack_push(lhs + rhs);
        break;
    case OPC_SUBF:
        stack_push(rhs - lhs);
        break;
    case OPC_MULTF:
        stack_push(lhs * rhs);
        break;
    case OPC_DIVF:
        stack_push(rhs / lhs);
        break;
    case OPC_AND:
        stack_push(lhs && rhs);
        break;
    case OPC_OR:
        stack_push(lhs || rhs);
        break;
    case OPC_GT:
        stack_push(lhs < rhs);
        break;
    case OPC_LT:
        stack_push(lhs > rhs);
        break;
    case OPC_GEQ:
        stack_push(lhs <= rhs);
        break;
    case OPC_LEQ:
        stack_push(lhs >= rhs);
        break;
    case OPC_EQ:
        stack_push(lhs == rhs);
        break;
    case OPC_NEQ:
        stack_push(lhs != rhs);
        break;
    case OPC_JMP:
        *ip = in.addr - 1;
        break;
    case OPC_JNZ:
        lhs = stack_pop();
        if(lhs != 0) *ip = in.addr - 1;

        break;
    case OPC_JEZ:
        lhs = stack_pop();
        if(lhs == 0) *ip = in.addr - 1;

        break;
    case OPC_CALL:
        if(in.content_type == INST_ADDR) {
            double ret_addr = (double)(*ip) + 1;
            // printf("Return address(from OPC_CALL): %lf\n", ret_addr);

            stack_push(ret_addr);
            *ip = in.addr - 1;
        }

        break;
    case OPC_RET:
        lhs = stack_pop();
        *ip = (size_s)lhs - 1;

        break;
    case OPC_SYSCALL:
        handle_syscall(in, data_segment);
        break;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
leaq 0x10(%rbp), %rax
movq %rax, -0x38(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x18(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x20(%rbp)
cmpl $0x14, 0x4(%rax)
jb 0x160c
movq -0x38(%rbp), %rax
cmpl $0x1f, 0x4(%rax)
ja 0x160c
callq 0x1390
movsd %xmm0, -0x18(%rbp)
callq 0x1390
movsd %xmm0, -0x20(%rbp)
movq -0x38(%rbp), %rax
movl 0x4(%rax), %eax
addl $-0x10, %eax
movl %eax, %ecx
movq %rcx, -0x40(%rbp)
subl $0x15, %eax
ja 0x195b
movq -0x40(%rbp), %rax
leaq 0xa70(%rip), %rcx       # 0x20a0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x38(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x1653
movq -0x38(%rbp), %rax
cvtsi2sdq 0x10(%rax), %xmm0
callq 0x1310
jmp 0x1661
movq -0x38(%rbp), %rax
movsd 0x10(%rax), %xmm0
callq 0x1310
jmp 0x195b
callq 0x1390
jmp 0x195b
callq 0x1390
cvttsd2si %xmm0, %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rax
movq -0x28(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
callq 0x1310
jmp 0x195b
callq 0x1390
movq -0x38(%rbp), %rcx
movq -0x8(%rbp), %rax
movq 0x10(%rcx), %rcx
movsd %xmm0, (%rax,%rcx,8)
jmp 0x195b
movsd -0x18(%rbp), %xmm0
addsd -0x20(%rbp), %xmm0
callq 0x1310
jmp 0x195b
movsd -0x20(%rbp), %xmm0
subsd -0x18(%rbp), %xmm0
callq 0x1310
jmp 0x195b
movsd -0x18(%rbp), %xmm0
mulsd -0x20(%rbp), %xmm0
callq 0x1310
jmp 0x195b
movsd -0x20(%rbp), %xmm0
divsd -0x18(%rbp), %xmm0
callq 0x1310
jmp 0x195b
movsd -0x18(%rbp), %xmm0
xorl %eax, %eax
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movb %al, -0x41(%rbp)
jne 0x1717
jp 0x1717
jmp 0x172e
movsd -0x20(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
movb %al, -0x41(%rbp)
movb -0x41(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
callq 0x1310
jmp 0x195b
movsd -0x18(%rbp), %xmm0
movb $0x1, %al
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
movb %al, -0x42(%rbp)
jne 0x1770
jp 0x1770
movsd -0x20(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
setne %al
setp %cl
orb %cl, %al
movb %al, -0x42(%rbp)
movb -0x42(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
callq 0x1310
jmp 0x195b
movsd -0x18(%rbp), %xmm1
movsd -0x20(%rbp), %xmm0
ucomisd %xmm1, %xmm0
seta %al
andb $0x1, %al
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
callq 0x1310
jmp 0x195b
movsd -0x18(%rbp), %xmm0
ucomisd -0x20(%rbp), %xmm0
seta %al
andb $0x1, %al
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
callq 0x1310
jmp 0x195b
movsd -0x18(%rbp), %xmm1
movsd -0x20(%rbp), %xmm0
ucomisd %xmm1, %xmm0
setae %al
andb $0x1, %al
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
callq 0x1310
jmp 0x195b
movsd -0x18(%rbp), %xmm0
ucomisd -0x20(%rbp), %xmm0
setae %al
andb $0x1, %al
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
callq 0x1310
jmp 0x195b
movsd -0x18(%rbp), %xmm0
ucomisd -0x20(%rbp), %xmm0
sete %al
setnp %cl
andb %cl, %al
andb $0x1, %al
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
callq 0x1310
jmp 0x195b
movsd -0x18(%rbp), %xmm0
ucomisd -0x20(%rbp), %xmm0
setne %al
setp %cl
orb %cl, %al
andb $0x1, %al
movzbl %al, %eax
cvtsi2sd %eax, %xmm0
callq 0x1310
jmp 0x195b
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rcx
subq $0x1, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
jmp 0x195b
callq 0x1390
movsd %xmm0, -0x18(%rbp)
movsd -0x18(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x188c
jp 0x188c
jmp 0x189f
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rcx
subq $0x1, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
jmp 0x195b
callq 0x1390
movsd %xmm0, -0x18(%rbp)
movsd -0x18(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x18d1
jp 0x18d1
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rcx
subq $0x1, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
jmp 0x195b
movq -0x38(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x1916
movq -0x10(%rbp), %rax
cvtsi2sdq (%rax), %xmm0
movsd 0x7a8(%rip), %xmm1      # 0x2098
addsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
movsd -0x30(%rbp), %xmm0
callq 0x1310
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rcx
subq $0x1, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
jmp 0x195b
callq 0x1390
movsd %xmm0, -0x18(%rbp)
cvttsd2si -0x18(%rbp), %rcx
subq $0x1, %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
jmp 0x195b
movq -0x38(%rbp), %rax
movq -0x8(%rbp), %rdi
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0x1970
addq $0x60, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)