// File: vssense[P]Compiler/src/middle-end/tree_optimize.cpp
// Function: CalculateOP(Node*)
void CalculateOP(Node* node)
{
	assert(node);
	assert(node->type == MATH_TYPE);
	assert(node->left->type == NUMB_TYPE && node->right->type == NUMB_TYPE);

	switch (node->value.op)
	{
		case ADD_OP: node->value.number = node->left->value.number + node->right->value.number; break;
		case SUB_OP: node->value.number = node->left->value.number - node->right->value.number; break;
		case MUL_OP: node->value.number = node->left->value.number * node->right->value.number; break;
		case DIV_OP: node->value.number = node->left->value.number / node->right->value.number; break;

        case EQUAL_OP        : node->value.number = node->left->value.number == node->right->value.number; break;
        case NOT_EQUAL_OP    : node->value.number = node->left->value.number != node->right->value.number; break;
        case LESS_OP         : node->value.number = node->left->value.number <  node->right->value.number; break;
        case GREATER_OP      : node->value.number = node->left->value.number >  node->right->value.number; break;
        case LESS_EQUAL_OP   : node->value.number = node->left->value.number <= node->right->value.number; break;
        case GREATER_EQUAL_OP: node->value.number = node->left->value.number >= node->right->value.number; break;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x29f5
jmp 0x2a14
leaq 0x46cd(%rip), %rdi      # 0x70c9
leaq 0x4765(%rip), %rsi      # 0x7168
movl $0x2b, %edx
leaq 0x47b5(%rip), %rcx      # 0x71c4
callq 0x2090
movq -0x8(%rbp), %rax
cmpl $0xe, (%rax)
jne 0x2a1f
jmp 0x2a3e
leaq 0x47b7(%rip), %rdi      # 0x71dd
leaq 0x473b(%rip), %rsi      # 0x7168
movl $0x2c, %edx
leaq 0x478b(%rip), %rcx      # 0x71c4
callq 0x2090
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rcx
xorl %eax, %eax
cmpl $0xf, (%rcx)
movb %al, -0x9(%rbp)
jne 0x2a61
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
cmpl $0xf, (%rax)
sete %al
movb %al, -0x9(%rbp)
movb -0x9(%rbp), %al
testb $0x1, %al
jne 0x2a6a
jmp 0x2a6c
jmp 0x2a8b
leaq 0x4782(%rip), %rdi      # 0x71f5
leaq 0x46ee(%rip), %rsi      # 0x7168
movl $0x2d, %edx
leaq 0x473e(%rip), %rcx      # 0x71c4
callq 0x2090
movq -0x8(%rbp), %rax
movl 0x8(%rax), %eax
movq %rax, -0x18(%rbp)
subq $0x9, %rax
ja 0x2c2e
movq -0x18(%rbp), %rax
leaq 0x4695(%rip), %rcx      # 0x7140
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %ecx
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
addl 0x8(%rax), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
jmp 0x2c2e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %ecx
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
subl 0x8(%rax), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
jmp 0x2c2e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %ecx
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
imull 0x8(%rax), %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
jmp 0x2c2e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x20(%rcx), %rcx
cltd
idivl 0x8(%rcx)
movl %eax, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
jmp 0x2c2e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x20(%rcx), %rcx
cmpl 0x8(%rcx), %eax
sete %al
andb $0x1, %al
movzbl %al, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
jmp 0x2c2e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x20(%rcx), %rcx
cmpl 0x8(%rcx), %eax
setne %al
andb $0x1, %al
movzbl %al, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
jmp 0x2c2e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x20(%rcx), %rcx
cmpl 0x8(%rcx), %eax
setl %al
andb $0x1, %al
movzbl %al, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
jmp 0x2c2e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x20(%rcx), %rcx
cmpl 0x8(%rcx), %eax
setg %al
andb $0x1, %al
movzbl %al, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
jmp 0x2c2e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x20(%rcx), %rcx
cmpl 0x8(%rcx), %eax
setle %al
andb $0x1, %al
movzbl %al, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
jmp 0x2c2e
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movl 0x8(%rax), %eax
movq -0x8(%rbp), %rcx
movq 0x20(%rcx), %rcx
cmpl 0x8(%rcx), %eax
setge %al
andb $0x1, %al
movzbl %al, %ecx
movq -0x8(%rbp), %rax
movl %ecx, 0x8(%rax)
addq $0x20, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nop