// File: devaigergely81[P]flex-bison-example/interpreter_implementation.cc
// Function: binop_expression::get_value() const
unsigned binop_expression::get_value() const {
    int left_value = left->get_value();
    int right_value = right->get_value();
    if(op == "+") {
        return left_value + right_value;
    } else if(op == "-") {
        return left_value - right_value;
    } else if(op == "*") {
        return left_value * right_value;
    } else if(op == "/") {
        return left_value / right_value;
    } else if(op == "%") {
        return left_value % right_value;
    } else if(op == "<") {
        return left_value < right_value;
    } else if(op == ">") {
        return left_value > right_value;
    } else if(op == "<=") {
        return left_value <= right_value;
    } else if(op == ">=") {
        return left_value >= right_value;
    } else if(op == "and") {
        return left_value && right_value;
    } else if(op == "or") {
        return left_value || right_value;
    } else if(op == "=") {
        return left_value == right_value;
    } else {
        error(line, std::string("Unknown operator: ") + op);
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x78(%rbp)
movq 0x30(%rax), %rdi
movq (%rdi), %rax
callq *0x20(%rax)
movl %eax, %ecx
movq -0x78(%rbp), %rax
movl %ecx, -0x14(%rbp)
movq 0x38(%rax), %rdi
movq (%rdi), %rax
callq *0x20(%rax)
movq -0x78(%rbp), %rdi
movl %eax, -0x18(%rbp)
addq $0x10, %rdi
leaq 0x3bff(%rip), %rsi      # 0x170c5
callq 0x7440
testb $0x1, %al
jne 0x134d1
jmp 0x134df
movl -0x14(%rbp), %eax
addl -0x18(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3bd9(%rip), %rsi      # 0x170c7
callq 0x7440
testb $0x1, %al
jne 0x134f9
jmp 0x13507
movl -0x14(%rbp), %eax
subl -0x18(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3bb3(%rip), %rsi      # 0x170c9
callq 0x7440
testb $0x1, %al
jne 0x13521
jmp 0x13530
movl -0x14(%rbp), %eax
imull -0x18(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3b8c(%rip), %rsi      # 0x170cb
callq 0x7440
testb $0x1, %al
jne 0x1354a
jmp 0x13559
movl -0x14(%rbp), %eax
cltd
idivl -0x18(%rbp)
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3b65(%rip), %rsi      # 0x170cd
callq 0x7440
testb $0x1, %al
jne 0x13573
jmp 0x13582
movl -0x14(%rbp), %eax
cltd
idivl -0x18(%rbp)
movl %edx, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3b3e(%rip), %rsi      # 0x170cf
callq 0x7440
testb $0x1, %al
jne 0x1359c
jmp 0x135b2
movl -0x14(%rbp), %eax
cmpl -0x18(%rbp), %eax
setl %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3b10(%rip), %rsi      # 0x170d1
callq 0x7440
testb $0x1, %al
jne 0x135cc
jmp 0x135e2
movl -0x14(%rbp), %eax
cmpl -0x18(%rbp), %eax
setg %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3ae2(%rip), %rsi      # 0x170d3
callq 0x7440
testb $0x1, %al
jne 0x135fc
jmp 0x13612
movl -0x14(%rbp), %eax
cmpl -0x18(%rbp), %eax
setle %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3ab5(%rip), %rsi      # 0x170d6
callq 0x7440
testb $0x1, %al
jne 0x1362c
jmp 0x13642
movl -0x14(%rbp), %eax
cmpl -0x18(%rbp), %eax
setge %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3a88(%rip), %rsi      # 0x170d9
callq 0x7440
testb $0x1, %al
jne 0x1365c
jmp 0x13681
xorl %eax, %eax
cmpl $0x0, -0x14(%rbp)
movb %al, -0x79(%rbp)
je 0x13671
cmpl $0x0, -0x18(%rbp)
setne %al
movb %al, -0x79(%rbp)
movb -0x79(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3a5b(%rip), %rsi      # 0x170eb
callq 0x7440
testb $0x1, %al
jne 0x1369b
jmp 0x136c0
movb $0x1, %al
cmpl $0x0, -0x14(%rbp)
movb %al, -0x7a(%rbp)
jne 0x136b0
cmpl $0x0, -0x18(%rbp)
setne %al
movb %al, -0x7a(%rbp)
movb -0x7a(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rdi
addq $0x10, %rdi
leaq 0x3a05(%rip), %rsi      # 0x170d4
callq 0x7440
testb $0x1, %al
jne 0x136da
jmp 0x136f0
movl -0x14(%rbp), %eax
cmpl -0x18(%rbp), %eax
sete %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x4(%rbp)
jmp 0x137c8
movq -0x78(%rbp), %rax
movl 0x8(%rax), %eax
movl %eax, -0x8c(%rbp)
leaq -0x59(%rbp), %rdi
movq %rdi, -0x88(%rbp)
callq 0x4480
movq -0x88(%rbp), %rdx
leaq 0x3ee0(%rip), %rsi      # 0x175fb
leaq -0x58(%rbp), %rdi
callq 0x7390
jmp 0x13726
movq -0x78(%rbp), %rdx
addq $0x10, %rdx
leaq -0x38(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0xf030
jmp 0x1373d
movl -0x8c(%rbp), %edi
leaq -0x38(%rbp), %rsi
callq 0xd3d0
jmp 0x1374e
leaq -0x38(%rbp), %rdi
callq 0x41c0
leaq -0x58(%rbp), %rdi
callq 0x41c0
leaq -0x59(%rbp), %rdi
callq 0x42f0
jmp 0x137b0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
jmp 0x137a5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
jmp 0x1379c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x68(%rbp)
movl %eax, -0x6c(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x41c0
leaq -0x58(%rbp), %rdi
callq 0x41c0
leaq -0x59(%rbp), %rdi
callq 0x42f0
jmp 0x137d4
jmp 0x137b2
jmp 0x137b4
jmp 0x137b6
jmp 0x137b8
jmp 0x137ba
jmp 0x137bc
jmp 0x137be
jmp 0x137c0
jmp 0x137c2
jmp 0x137c4
jmp 0x137c6
ud2
movl -0x4(%rbp), %eax
addq $0x90, %rsp
popq %rbp
retq
movq -0x68(%rbp), %rdi
callq 0x4470
nopl (%rax)