// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::expression_generator<double>::synthesize_coboc_expression::process(exprtk::parser<double>::expression_generator<double>&, exprtk::details::operator_type const&, exprtk::details::expression_node<double>* (&) [2])
static inline expression_node_ptr process(expression_generator<Type>& expr_gen,
                                                      const details::operator_type& operation,
                                                      expression_node_ptr (&branch)[2])
            {
               expression_node_ptr result = error_node();

               // (boc) o c --> boc
               if (details::is_boc_node(branch[0]))
               {
                  details::boc_base_node<Type>* bocnode = static_cast<details::boc_base_node<Type>*>(branch[0]);

                  const Type c = static_cast<details::literal_node<Type>*>(branch[1])->value();

                  if (details::e_add == bocnode->operation())
                  {
                     switch (operation)
                     {
                        case details::e_add : bocnode->set_c(bocnode->c() + c); break;
                        case details::e_sub : bocnode->set_c(bocnode->c() - c); break;
                        default             : return error_node();
                     }

                     result = bocnode;
                  }
                  else if (details::e_mul == bocnode->operation())
                  {
                     switch (operation)
                     {
                        case details::e_mul : bocnode->set_c(bocnode->c() * c); break;
                        case details::e_div : bocnode->set_c(bocnode->c() / c); break;
                        default             : return error_node();
                     }

                     result = bocnode;
                  }
                  else if (details::e_sub == bocnode->operation())
                  {
                     if (details::e_add == operation)
                     {
                        result = expr_gen.node_allocator_->
                                    template allocate_tt<typename details::boc_node<Type,details::add_op<Type> > >
                                       (bocnode->move_branch(0), c - bocnode->c());

                        details::free_node(*expr_gen.node_allocator_,branch[0]);
                     }
                     else if (details::e_sub == operation)
                     {
                        bocnode->set_c(bocnode->c() + c);
                        result = bocnode;
                     }
                  }
                  else if (details::e_div == bocnode->operation())
                  {
                     switch (operation)
                     {
                        case details::e_div : bocnode->set_c(bocnode->c() * c); break;
                        case details::e_mul : bocnode->set_c(bocnode->c() / c); break;
                        default             : return error_node();
                     }

                     result = bocnode;
                  }

                  if (result)
                  {
                     details::free_node(*expr_gen.node_allocator_, branch[1]);
                  }
               }

               // c o (boc) --> boc
               else if (details::is_boc_node(branch[1]))
               {
                  details::boc_base_node<Type>* bocnode = static_cast<details::boc_base_node<Type>*>(branch[1]);

                  const Type c = static_cast<details::literal_node<Type>*>(branch[0])->value();

                  if (details::e_add == bocnode->operation())
                  {
                     if (details::e_add == operation)
                     {
                        bocnode->set_c(c + bocnode->c());
                        result = bocnode;
                     }
                     else if (details::e_sub == operation)
                     {
                        result = expr_gen.node_allocator_->
                                    template allocate_tt<typename details::cob_node<Type,details::sub_op<Type> > >
                                       (c - bocnode->c(), bocnode->move_branch(0));

                        details::free_node(*expr_gen.node_allocator_,branch[1]);
                     }
                  }
                  else if (details::e_sub == bocnode->operation())
                  {
                     if (details::e_add == operation)
                     {
                        result = expr_gen.node_allocator_->
                                    template allocate_tt<typename details::boc_node<Type,details::add_op<Type> > >
                                       (bocnode->move_branch(0), c - bocnode->c());

                        details::free_node(*expr_gen.node_allocator_,branch[1]);
                     }
                     else if (details::e_sub == operation)
                     {
                        result = expr_gen.node_allocator_->
                                    template allocate_tt<typename details::cob_node<Type,details::sub_op<Type> > >
                                       (c + bocnode->c(), bocnode->move_branch(0));

                        details::free_node(*expr_gen.node_allocator_,branch[1]);
                     }
                  }
                  else if (details::e_mul == bocnode->operation())
                  {
                     if (details::e_mul == operation)
                     {
                        bocnode->set_c(c * bocnode->c());
                        result = bocnode;
                     }
                     else if (details::e_div == operation)
                     {
                        result = expr_gen.node_allocator_->
                                    template allocate_tt<typename details::cob_node<Type,details::div_op<Type> > >
                                       (c / bocnode->c(), bocnode->move_branch(0));

                        details::free_node(*expr_gen.node_allocator_,branch[1]);
                     }
                  }
                  else if (details::e_div == bocnode->operation())
                  {
                     if (details::e_mul == operation)
                     {
                        bocnode->set_c(bocnode->c() / c);
                        result = bocnode;
                     }
                     else if (details::e_div == operation)
                     {
                        result = expr_gen.node_allocator_->
                                    template allocate_tt<typename details::cob_node<Type,details::div_op<Type> > >
                                       (c * bocnode->c(), bocnode->move_branch(0));

                        details::free_node(*expr_gen.node_allocator_,branch[1]);
                     }
                  }

                  if (result)
                  {
                     details::free_node(*expr_gen.node_allocator_,branch[0]);
                  }
               }

               return result;
            }

// Assembly:
subq $0x188, %rsp            # imm = 0x188
movq %rdi, 0x178(%rsp)
movq %rsi, 0x170(%rsp)
movq %rdx, 0x168(%rsp)
callq 0x2821f0
movq %rax, 0x160(%rsp)
movq 0x168(%rsp), %rax
movq (%rax), %rdi
callq 0x484fb0
testb $0x1, %al
jne 0x3e3945
jmp 0x3e3d5d
movq 0x168(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x158(%rsp)
movq 0x168(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x284bc0
movsd %xmm0, 0x150(%rsp)
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl $0x2, %eax
cmpl %ecx, %eax
jne 0x3e3a4a
movq 0x170(%rsp), %rax
movl (%rax), %eax
movl %eax, 0x10c(%rsp)
subl $0x2, %eax
je 0x3e39b5
jmp 0x3e39a7
movl 0x10c(%rsp), %eax
subl $0x3, %eax
je 0x3e39ec
jmp 0x3e3a23
movq 0x158(%rsp), %rax
movq %rax, 0x100(%rsp)
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x100(%rsp), %rdi
addsd 0x150(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e3a35
movq 0x158(%rsp), %rax
movq %rax, 0xf8(%rsp)
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0xf8(%rsp), %rdi
subsd 0x150(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e3a35
callq 0x2821f0
movq %rax, 0x180(%rsp)
jmp 0x3e4322
movq 0x158(%rsp), %rax
movq %rax, 0x160(%rsp)
jmp 0x3e3d30
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl $0x4, %eax
cmpl %ecx, %eax
jne 0x3e3b22
movq 0x170(%rsp), %rax
movl (%rax), %eax
movl %eax, 0xf4(%rsp)
subl $0x4, %eax
je 0x3e3a8d
jmp 0x3e3a7f
movl 0xf4(%rsp), %eax
subl $0x5, %eax
je 0x3e3ac4
jmp 0x3e3afb
movq 0x158(%rsp), %rax
movq %rax, 0xe8(%rsp)
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0xe8(%rsp), %rdi
mulsd 0x150(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e3b0d
movq 0x158(%rsp), %rax
movq %rax, 0xe0(%rsp)
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0xe0(%rsp), %rdi
divsd 0x150(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e3b0d
callq 0x2821f0
movq %rax, 0x180(%rsp)
jmp 0x3e4322
movq 0x158(%rsp), %rax
movq %rax, 0x160(%rsp)
jmp 0x3e3d2e
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl $0x3, %eax
cmpl %ecx, %eax
jne 0x3e3c57
movq 0x170(%rsp), %rcx
movl $0x2, %eax
cmpl (%rcx), %eax
jne 0x3e3bfa
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0xc8(%rsp)
movq 0x158(%rsp), %rdi
movq $0x0, 0x148(%rsp)
movq (%rdi), %rax
leaq 0x148(%rsp), %rsi
callq *0x50(%rax)
movq %rax, 0xd0(%rsp)
movsd 0x150(%rsp), %xmm0
movsd %xmm0, 0xd8(%rsp)
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0xc8(%rsp), %rdi
movq 0xd0(%rsp), %rsi
movaps %xmm0, %xmm1
movsd 0xd8(%rsp), %xmm0
subsd %xmm1, %xmm0
callq 0x485010
movq %rax, 0x160(%rsp)
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x168(%rsp), %rsi
callq 0x284bd0
jmp 0x3e3c52
movq 0x170(%rsp), %rcx
movl $0x3, %eax
cmpl (%rcx), %eax
jne 0x3e3c50
movq 0x158(%rsp), %rax
movq %rax, 0xc0(%rsp)
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0xc0(%rsp), %rdi
addsd 0x150(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
movq 0x158(%rsp), %rax
movq %rax, 0x160(%rsp)
jmp 0x3e3c52
jmp 0x3e3d2c
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl $0x5, %eax
cmpl %ecx, %eax
jne 0x3e3d2a
movq 0x170(%rsp), %rax
movl (%rax), %eax
movl %eax, 0xbc(%rsp)
subl $0x4, %eax
je 0x3e3cd1
jmp 0x3e3c8c
movl 0xbc(%rsp), %eax
subl $0x5, %eax
jne 0x3e3d08
jmp 0x3e3c9a
movq 0x158(%rsp), %rax
movq %rax, 0xb0(%rsp)
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0xb0(%rsp), %rdi
mulsd 0x150(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e3d1a
movq 0x158(%rsp), %rax
movq %rax, 0xa8(%rsp)
movq 0x158(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0xa8(%rsp), %rdi
divsd 0x150(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e3d1a
callq 0x2821f0
movq %rax, 0x180(%rsp)
jmp 0x3e4322
movq 0x158(%rsp), %rax
movq %rax, 0x160(%rsp)
jmp 0x3e3d2c
jmp 0x3e3d2e
jmp 0x3e3d30
cmpq $0x0, 0x160(%rsp)
je 0x3e3d58
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x168(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
jmp 0x3e4312
movq 0x168(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x484fb0
testb $0x1, %al
jne 0x3e3d77
jmp 0x3e4310
movq 0x168(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x140(%rsp)
movq 0x168(%rsp), %rax
movq (%rax), %rdi
callq 0x284bc0
movsd %xmm0, 0x138(%rsp)
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl $0x2, %eax
cmpl %ecx, %eax
jne 0x3e3efe
movq 0x170(%rsp), %rcx
movl $0x2, %eax
cmpl (%rcx), %eax
jne 0x3e3e35
movq 0x140(%rsp), %rax
movq %rax, 0x98(%rsp)
movsd 0x138(%rsp), %xmm0
movsd %xmm0, 0xa0(%rsp)
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x98(%rsp), %rdi
movaps %xmm0, %xmm1
movsd 0xa0(%rsp), %xmm0
addsd %xmm1, %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
movq 0x140(%rsp), %rax
movq %rax, 0x160(%rsp)
jmp 0x3e3ef9
movq 0x170(%rsp), %rcx
movl $0x3, %eax
cmpl (%rcx), %eax
jne 0x3e3ef7
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x88(%rsp)
movsd 0x138(%rsp), %xmm0
movsd %xmm0, 0x80(%rsp)
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movaps %xmm0, %xmm1
movsd 0x80(%rsp), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, 0x90(%rsp)
movq 0x140(%rsp), %rdi
movq $0x0, 0x130(%rsp)
movq (%rdi), %rax
leaq 0x130(%rsp), %rsi
callq *0x50(%rax)
movq 0x88(%rsp), %rdi
movsd 0x90(%rsp), %xmm0
movq %rax, %rsi
callq 0x484350
movq %rax, 0x160(%rsp)
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x168(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
jmp 0x3e3ef9
jmp 0x3e42ea
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl $0x3, %eax
cmpl %ecx, %eax
jne 0x3e4082
movq 0x170(%rsp), %rcx
movl $0x2, %eax
cmpl (%rcx), %eax
jne 0x3e3fcb
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x68(%rsp)
movq 0x140(%rsp), %rdi
movq $0x0, 0x128(%rsp)
movq (%rdi), %rax
leaq 0x128(%rsp), %rsi
callq *0x50(%rax)
movq %rax, 0x70(%rsp)
movsd 0x138(%rsp), %xmm0
movsd %xmm0, 0x78(%rsp)
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x68(%rsp), %rdi
movq 0x70(%rsp), %rsi
movaps %xmm0, %xmm1
movsd 0x78(%rsp), %xmm0
subsd %xmm1, %xmm0
callq 0x485010
movq %rax, 0x160(%rsp)
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x168(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
jmp 0x3e407d
movq 0x170(%rsp), %rcx
movl $0x3, %eax
cmpl (%rcx), %eax
jne 0x3e407b
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x58(%rsp)
movsd 0x138(%rsp), %xmm0
movsd %xmm0, 0x50(%rsp)
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movaps %xmm0, %xmm1
movsd 0x50(%rsp), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x60(%rsp)
movq 0x140(%rsp), %rdi
movq $0x0, 0x120(%rsp)
movq (%rdi), %rax
leaq 0x120(%rsp), %rsi
callq *0x50(%rax)
movq 0x58(%rsp), %rdi
movsd 0x60(%rsp), %xmm0
movq %rax, %rsi
callq 0x484350
movq %rax, 0x160(%rsp)
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x168(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
jmp 0x3e407d
jmp 0x3e42e8
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl $0x4, %eax
cmpl %ecx, %eax
jne 0x3e41be
movq 0x170(%rsp), %rcx
movl $0x4, %eax
cmpl (%rcx), %eax
jne 0x3e4107
movq 0x140(%rsp), %rax
movq %rax, 0x40(%rsp)
movsd 0x138(%rsp), %xmm0
movsd %xmm0, 0x48(%rsp)
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x40(%rsp), %rdi
movaps %xmm0, %xmm1
movsd 0x48(%rsp), %xmm0
mulsd %xmm1, %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
movq 0x140(%rsp), %rax
movq %rax, 0x160(%rsp)
jmp 0x3e41b9
movq 0x170(%rsp), %rcx
movl $0x5, %eax
cmpl (%rcx), %eax
jne 0x3e41b7
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x30(%rsp)
movsd 0x138(%rsp), %xmm0
movsd %xmm0, 0x28(%rsp)
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movaps %xmm0, %xmm1
movsd 0x28(%rsp), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, 0x38(%rsp)
movq 0x140(%rsp), %rdi
movq $0x0, 0x118(%rsp)
movq (%rdi), %rax
leaq 0x118(%rsp), %rsi
callq *0x50(%rax)
movq 0x30(%rsp), %rdi
movsd 0x38(%rsp), %xmm0
movq %rax, %rsi
callq 0x4842c0
movq %rax, 0x160(%rsp)
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x168(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
jmp 0x3e41b9
jmp 0x3e42e6
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl $0x5, %eax
cmpl %ecx, %eax
jne 0x3e42e4
movq 0x170(%rsp), %rcx
movl $0x4, %eax
cmpl (%rcx), %eax
jne 0x3e4230
movq 0x140(%rsp), %rax
movq %rax, 0x20(%rsp)
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x20(%rsp), %rdi
divsd 0x138(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
movq 0x140(%rsp), %rax
movq %rax, 0x160(%rsp)
jmp 0x3e42e2
movq 0x170(%rsp), %rcx
movl $0x5, %eax
cmpl (%rcx), %eax
jne 0x3e42e0
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x10(%rsp)
movsd 0x138(%rsp), %xmm0
movsd %xmm0, 0x8(%rsp)
movq 0x140(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movaps %xmm0, %xmm1
movsd 0x8(%rsp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, 0x18(%rsp)
movq 0x140(%rsp), %rdi
movq $0x0, 0x110(%rsp)
movq (%rdi), %rax
leaq 0x110(%rsp), %rsi
callq *0x50(%rax)
movq 0x10(%rsp), %rdi
movsd 0x18(%rsp), %xmm0
movq %rax, %rsi
callq 0x4842c0
movq %rax, 0x160(%rsp)
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x168(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
jmp 0x3e42e2
jmp 0x3e42e4
jmp 0x3e42e6
jmp 0x3e42e8
jmp 0x3e42ea
cmpq $0x0, 0x160(%rsp)
je 0x3e430e
movq 0x178(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x168(%rsp), %rsi
callq 0x284bd0
jmp 0x3e4310
jmp 0x3e4312
movq 0x160(%rsp), %rax
movq %rax, 0x180(%rsp)
movq 0x180(%rsp), %rax
addq $0x188, %rsp            # imm = 0x188
retq
nopw %cs:(%rax,%rax)
nopl (%rax)