// File: Eshaancoding[P]AutoDiff/src/Variable/eval.cpp
// Function: Variable::exec_op(double, op, double)
double Variable::exec_op(double num_one, op operation, double num_two) {
    if (operation == add) return num_one + num_two;
    else if (operation == subtract) return num_one - num_two;
    else if (operation == multiply) return num_one * num_two;
    else if (operation == divide) return num_one / num_two;
    else if (operation == exponent) return pow(num_one, num_two);
    else if (operation == op::min && num_one > num_two) return num_two;
    else if (operation == op::min && num_one < num_two) return num_one;
    else if (operation == op::max && num_one > num_two) return num_one;
    else if (operation == op::max && num_one < num_two) return num_two; 
    else if (operation == op::sin_r_op) return sin(num_one);
    else if (operation == op::cos_r_op) return cos(num_one);
    else if (operation == op::sin_d_op) return sin(num_one * (pi/180)); 
    else if (operation == op::cos_d_op) return cos(num_one * (pi/180)); 
    else {throw invalid_argument("exec op error");}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movsd %xmm0, -0x18(%rbp)
movl %esi, -0x1c(%rbp)
movsd %xmm1, -0x28(%rbp)
cmpl $0x2, -0x1c(%rbp)
jne 0x4b03
movsd -0x18(%rbp), %xmm0
addsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0x3, -0x1c(%rbp)
jne 0x4b1d
movsd -0x18(%rbp), %xmm0
subsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0x5, -0x1c(%rbp)
jne 0x4b37
movsd -0x18(%rbp), %xmm0
mulsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0x4, -0x1c(%rbp)
jne 0x4b51
movsd -0x18(%rbp), %xmm0
divsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0x6, -0x1c(%rbp)
jne 0x4b70
movsd -0x18(%rbp), %xmm0
movsd -0x28(%rbp), %xmm1
callq 0x2270
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0x8, -0x1c(%rbp)
jne 0x4b91
movsd -0x18(%rbp), %xmm0
ucomisd -0x28(%rbp), %xmm0
jbe 0x4b91
movsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0x8, -0x1c(%rbp)
jne 0x4bb6
movsd -0x18(%rbp), %xmm1
movsd -0x28(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x4bb6
movsd -0x18(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0x9, -0x1c(%rbp)
jne 0x4bd7
movsd -0x18(%rbp), %xmm0
ucomisd -0x28(%rbp), %xmm0
jbe 0x4bd7
movsd -0x18(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0x9, -0x1c(%rbp)
jne 0x4bfc
movsd -0x18(%rbp), %xmm1
movsd -0x28(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x4bfc
movsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0xd, -0x1c(%rbp)
jne 0x4c16
movsd -0x18(%rbp), %xmm0
callq 0x2060
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0xe, -0x1c(%rbp)
jne 0x4c30
movsd -0x18(%rbp), %xmm0
callq 0x22b0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0xb, -0x1c(%rbp)
jne 0x4c4f
movsd 0xa522(%rip), %xmm0     # 0xf160
mulsd -0x18(%rbp), %xmm0
callq 0x2060
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
cmpl $0xc, -0x1c(%rbp)
jne 0x4c6e
movsd 0xa503(%rip), %xmm0     # 0xf160
mulsd -0x18(%rbp), %xmm0
callq 0x22b0
movsd %xmm0, -0x8(%rbp)
jmp 0x4cbe
movl $0x10, %edi
callq 0x20c0
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x40(%rbp)
leaq 0xa4df(%rip), %rsi      # 0xf168
callq 0x22c0
jmp 0x4c90
movq -0x40(%rbp), %rdi
movq 0x10345(%rip), %rsi     # 0x14fe0
movq 0x1032e(%rip), %rdx     # 0x14fd0
callq 0x2240
movq -0x40(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
callq 0x2150
jmp 0x4cc9
movsd -0x8(%rbp), %xmm0
addq $0x40, %rsp
popq %rbp
retq
movq -0x30(%rbp), %rdi
callq 0x2280
nopw %cs:(%rax,%rax)