// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::expression_generator<double>::synthesize_boc_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])
            {
               const Type c = static_cast<details::literal_node<Type>*>(branch[1])->value();

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

               if (std::equal_to<T>()(T(0),c) && (details::e_mul == operation))
               {
                  details::free_node(*expr_gen.node_allocator_, branch[0]);

                  return expr_gen(T(0));
               }
               else if (std::equal_to<T>()(T(0),c) && (details::e_div == operation))
               {
                  details::free_node(*expr_gen.node_allocator_, branch[0]);

                  return expr_gen(std::numeric_limits<T>::quiet_NaN());
               }
               else if (std::equal_to<T>()(T(0),c) && (details::e_add == operation))
                  return branch[0];
               else if (std::equal_to<T>()(T(1),c) && (details::e_mul == operation))
                  return branch[0];

               if (details::is_boc_node(branch[0]))
               {
                  // Simplify expressions of the form:
                  // 1. (((((((((x + 9) * 8) * 7) * 6) * 5) * 4) * 3) * 2) * 1) --> (x + 9) * 40320
                  // 2. (((((((((x + 9) + 8) + 7) + 6) + 5) + 4) + 3) + 2) + 1) --> x + 45
                  if (
                       (details::e_mul == operation) ||
                       (details::e_add == operation)
                     )
                  {
                     details::boc_base_node<Type>* bocnode = static_cast<details::boc_base_node<Type>*>(branch[0]);

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

                        return bocnode;
                     }
                  }
                  else if (operation == details::e_div)
                  {
                     details::boc_base_node<Type>* bocnode = static_cast<details::boc_base_node<Type>*>(branch[0]);
                     details::operator_type        boc_opr = bocnode->operation();

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

                        return bocnode;
                     }
                  }
                  else if (operation == details::e_pow)
                  {
                     // (v ^ c0) ^ c1 --> v ^(c0 * c1)
                     details::boc_base_node<Type>* bocnode = static_cast<details::boc_base_node<Type>*>(branch[0]);
                     details::operator_type        boc_opr = bocnode->operation();

                     if (details::e_pow == boc_opr)
                     {
                        bocnode->set_c(bocnode->c() * c);

                        return bocnode;
                     }
                  }
               }

               #ifndef exprtk_disable_enhanced_features
               if (details::is_sf3ext_node(branch[0]))
               {
                  expression_node_ptr result = error_node();

                  const bool synthesis_result =
                     synthesize_sf4ext_expression::template compile_left<ctype>
                        (expr_gen, c, operation, branch[0], result);

                  if (synthesis_result)
                  {
                     free_node(*expr_gen.node_allocator_, branch[0]);

                     return result;
                  }
               }
               #endif

               switch (operation)
               {
                  #define case_stmt(op0, op1)                                                      \
                  case op0 : return expr_gen.node_allocator_->                                     \
                                template allocate_cr<typename details::boc_node<Type,op1<Type> > > \
                                   (branch[0], c);                                                 \

                  basic_opr_switch_statements
                  extended_opr_switch_statements
                  #undef case_stmt
                  default : return error_node();
               }
            }

// Assembly:
subq $0x118, %rsp            # imm = 0x118
movq %rdi, 0x108(%rsp)
movq %rsi, 0x100(%rsp)
movq %rdx, 0xf8(%rsp)
movq 0xf8(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x284bc0
movsd %xmm0, 0xf0(%rsp)
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
xorps %xmm0, %xmm0
movsd %xmm0, 0xe0(%rsp)
leaq 0xef(%rsp), %rdi
leaq 0xe0(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x266f00
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, 0x6e(%rsp)
jne 0x3e5dae
jmp 0x3e5dc4
movq 0x100(%rsp), %rcx
movl $0x4, %eax
cmpl (%rcx), %eax
sete %al
movb %al, 0x6e(%rsp)
movb 0x6e(%rsp), %al
testb $0x1, %al
jne 0x3e5dce
jmp 0x3e5e15
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
callq 0x284bd0
movq 0x108(%rsp), %rdi
xorps %xmm0, %xmm0
movsd %xmm0, 0xd8(%rsp)
leaq 0xd8(%rsp), %rsi
callq 0x284c20
movq %rax, 0x110(%rsp)
jmp 0x3e6693
xorps %xmm0, %xmm0
movsd %xmm0, 0xc8(%rsp)
leaq 0xd7(%rsp), %rdi
leaq 0xc8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x266f00
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, 0x6d(%rsp)
jne 0x3e5e4d
jmp 0x3e5e63
movq 0x100(%rsp), %rcx
movl $0x5, %eax
cmpl (%rcx), %eax
sete %al
movb %al, 0x6d(%rsp)
movb 0x6d(%rsp), %al
testb $0x1, %al
jne 0x3e5e6d
jmp 0x3e5ec0
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
callq 0x284bd0
movq 0x108(%rsp), %rax
movq %rax, 0x60(%rsp)
callq 0x2361c0
movq 0x60(%rsp), %rdi
movsd %xmm0, 0xc0(%rsp)
leaq 0xc0(%rsp), %rsi
callq 0x284c20
movq %rax, 0x110(%rsp)
jmp 0x3e6693
xorps %xmm0, %xmm0
movsd %xmm0, 0xb0(%rsp)
leaq 0xbf(%rsp), %rdi
leaq 0xb0(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x266f00
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, 0x5f(%rsp)
jne 0x3e5ef8
jmp 0x3e5f0e
movq 0x100(%rsp), %rcx
movl $0x2, %eax
cmpl (%rcx), %eax
sete %al
movb %al, 0x5f(%rsp)
movb 0x5f(%rsp), %al
testb $0x1, %al
jne 0x3e5f18
jmp 0x3e5f30
movq 0xf8(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movsd 0x1b5108(%rip), %xmm0   # 0x59b040
movsd %xmm0, 0xa0(%rsp)
leaq 0xaf(%rsp), %rdi
leaq 0xa0(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x266f00
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, 0x5e(%rsp)
jne 0x3e5f6d
jmp 0x3e5f83
movq 0x100(%rsp), %rcx
movl $0x4, %eax
cmpl (%rcx), %eax
sete %al
movb %al, 0x5e(%rsp)
movb 0x5e(%rsp), %al
testb $0x1, %al
jne 0x3e5f8d
jmp 0x3e5fa5
movq 0xf8(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x110(%rsp)
jmp 0x3e6693
jmp 0x3e5fa7
jmp 0x3e5fa9
jmp 0x3e5fab
movq 0xf8(%rsp), %rax
movq (%rax), %rdi
callq 0x484fb0
testb $0x1, %al
jne 0x3e5fc4
jmp 0x3e629e
movq 0x100(%rsp), %rcx
movl $0x4, %eax
cmpl (%rcx), %eax
je 0x3e5fea
movq 0x100(%rsp), %rcx
movl $0x2, %eax
cmpl (%rcx), %eax
jne 0x3e60fe
movq 0xf8(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x98(%rsp)
movq 0x100(%rsp), %rax
movl (%rax), %eax
movl %eax, 0x58(%rsp)
movq 0x98(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, %ecx
movl 0x58(%rsp), %eax
cmpl %ecx, %eax
jne 0x3e60f9
movq 0x100(%rsp), %rax
movl (%rax), %eax
movl %eax, 0x54(%rsp)
subl $0x2, %eax
je 0x3e604a
jmp 0x3e603c
movl 0x54(%rsp), %eax
subl $0x4, %eax
je 0x3e608e
jmp 0x3e60d2
movq 0x98(%rsp), %rax
movq %rax, 0x40(%rsp)
movsd 0xf0(%rsp), %xmm0
movsd %xmm0, 0x48(%rsp)
movq 0x98(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x40(%rsp), %rdi
movaps %xmm0, %xmm1
movsd 0x48(%rsp), %xmm0
addsd %xmm1, %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e60e4
movq 0x98(%rsp), %rax
movq %rax, 0x30(%rsp)
movsd 0xf0(%rsp), %xmm0
movsd %xmm0, 0x38(%rsp)
movq 0x98(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x30(%rsp), %rdi
movaps %xmm0, %xmm1
movsd 0x38(%rsp), %xmm0
mulsd %xmm1, %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e60e4
callq 0x2821f0
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x98(%rsp), %rax
movq %rax, 0x110(%rsp)
jmp 0x3e6693
jmp 0x3e629c
movq 0x100(%rsp), %rax
cmpl $0x5, (%rax)
jne 0x3e6215
movq 0xf8(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x90(%rsp)
movq 0x90(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, 0x8c(%rsp)
movl $0x5, %eax
cmpl 0x8c(%rsp), %eax
je 0x3e6157
movl $0x4, %eax
cmpl 0x8c(%rsp), %eax
jne 0x3e6210
movl 0x8c(%rsp), %eax
movl %eax, 0x2c(%rsp)
subl $0x4, %eax
je 0x3e61b8
jmp 0x3e6169
movl 0x2c(%rsp), %eax
subl $0x5, %eax
jne 0x3e61e9
jmp 0x3e6174
movq 0x90(%rsp), %rax
movq %rax, 0x18(%rsp)
movsd 0xf0(%rsp), %xmm0
movsd %xmm0, 0x20(%rsp)
movq 0x90(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x18(%rsp), %rdi
movaps %xmm0, %xmm1
movsd 0x20(%rsp), %xmm0
mulsd %xmm1, %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e61fb
movq 0x90(%rsp), %rax
movq %rax, 0x10(%rsp)
movq 0x90(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x10(%rsp), %rdi
divsd 0xf0(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
jmp 0x3e61fb
callq 0x2821f0
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x90(%rsp), %rax
movq %rax, 0x110(%rsp)
jmp 0x3e6693
jmp 0x3e629a
movq 0x100(%rsp), %rax
cmpl $0x7, (%rax)
jne 0x3e6298
movq 0xf8(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x80(%rsp)
movq 0x80(%rsp), %rdi
movq (%rdi), %rax
callq *0x38(%rax)
movl %eax, 0x7c(%rsp)
movl $0x7, %eax
cmpl 0x7c(%rsp), %eax
jne 0x3e6296
movq 0x80(%rsp), %rax
movq %rax, 0x8(%rsp)
movq 0x80(%rsp), %rdi
movq (%rdi), %rax
callq *0x40(%rax)
movq 0x8(%rsp), %rdi
mulsd 0xf0(%rsp), %xmm0
movq (%rdi), %rax
callq *0x48(%rax)
movq 0x80(%rsp), %rax
movq %rax, 0x110(%rsp)
jmp 0x3e6693
jmp 0x3e6298
jmp 0x3e629a
jmp 0x3e629c
jmp 0x3e629e
movq 0xf8(%rsp), %rax
movq (%rax), %rdi
callq 0x4858f0
testb $0x1, %al
jne 0x3e62b4
jmp 0x3e6323
callq 0x2821f0
movq %rax, 0x70(%rsp)
movq 0x108(%rsp), %rdi
movsd 0xf0(%rsp), %xmm0
movq 0x100(%rsp), %rsi
movq 0xf8(%rsp), %rdx
leaq 0x70(%rsp), %rcx
callq 0x4b1e40
andb $0x1, %al
movb %al, 0x6f(%rsp)
testb $0x1, 0x6f(%rsp)
je 0x3e6321
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
callq 0x284bd0
movq 0x70(%rsp), %rax
movq %rax, 0x110(%rsp)
jmp 0x3e6693
jmp 0x3e6323
movq 0x100(%rsp), %rax
movl (%rax), %eax
addl $-0x2, %eax
movl %eax, %ecx
movq %rcx, (%rsp)
subl $0x19, %eax
ja 0x3e6686
movq (%rsp), %rax
leaq 0x1b703e(%rip), %rcx    # 0x59d388
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2240
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b22d0
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2360
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b23f0
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2480
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2510
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b25a0
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2630
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b26c0
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2750
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b27e0
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2870
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2900
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2990
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2a20
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2ab0
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2b40
movq %rax, 0x110(%rsp)
jmp 0x3e6693
movq 0x108(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0xf8(%rsp), %rsi
leaq 0xf0(%rsp), %rdx
callq 0x4b2bd0
movq %rax, 0x110(%rsp)
jmp 0x3e6693
callq 0x2821f0
movq %rax, 0x110(%rsp)
movq 0x110(%rsp), %rax
addq $0x118, %rsp            # imm = 0x118
retq
nopw %cs:(%rax,%rax)
nopl (%rax)