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

            if (details::is_constant_node(branch[0]))
            {
               if (
                    (details::e_scand == operation) &&
                    std::equal_to<T>()(T(0),branch[0]->value())
                  )
                  result = node_allocator_->allocate_c<literal_node_t>(T(0));
               else if (
                         (details::e_scor == operation) &&
                         std::not_equal_to<T>()(T(0),branch[0]->value())
                       )
                  result = node_allocator_->allocate_c<literal_node_t>(T(1));
            }

            if (details::is_constant_node(branch[1]) && (0 == result))
            {
               if (
                    (details::e_scand == operation) &&
                    std::equal_to<T>()(T(0),branch[1]->value())
                  )
                  result = node_allocator_->allocate_c<literal_node_t>(T(0));
               else if (
                         (details::e_scor == operation) &&
                         std::not_equal_to<T>()(T(0),branch[1]->value())
                       )
                  result = node_allocator_->allocate_c<literal_node_t>(T(1));
            }

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

               return result;
            }
            else if (details::e_scand == operation)
            {
               return synthesize_expression<scand_node_t,2>(operation, branch);
            }
            else if (details::e_scor == operation)
            {
               return synthesize_expression<scor_node_t,2>(operation, branch);
            }
            else
               return error_node();
         }

// Assembly:
subq $0xb8, %rsp
movq %rdi, 0xa8(%rsp)
movq %rsi, 0xa0(%rsp)
movq %rdx, 0x98(%rsp)
movq 0xa8(%rsp), %rax
movq %rax, 0x8(%rsp)
callq 0x2821f0
movq %rax, 0x90(%rsp)
movq 0x98(%rsp), %rax
movq (%rax), %rdi
callq 0x39cbf0
testb $0x1, %al
jne 0x3e16f2
jmp 0x3e1803
movq 0xa0(%rsp), %rdx
xorl %eax, %eax
movl $0x1e, %ecx
cmpl (%rdx), %ecx
movb %al, 0x7(%rsp)
jne 0x3e174a
xorps %xmm0, %xmm0
movsd %xmm0, 0x80(%rsp)
movq 0x98(%rsp), %rax
movq (%rax), %rdi
movq (%rdi), %rax
callq *0x18(%rax)
movsd %xmm0, 0x78(%rsp)
leaq 0x8f(%rsp), %rdi
leaq 0x80(%rsp), %rsi
leaq 0x78(%rsp), %rdx
callq 0x266f00
movb %al, 0x7(%rsp)
movb 0x7(%rsp), %al
testb $0x1, %al
jne 0x3e1754
jmp 0x3e177d
movq 0x8(%rsp), %rax
movq 0x8(%rax), %rdi
xorps %xmm0, %xmm0
movsd %xmm0, 0x70(%rsp)
leaq 0x70(%rsp), %rsi
callq 0x287b60
movq %rax, 0x90(%rsp)
jmp 0x3e1801
movq 0xa0(%rsp), %rdx
xorl %eax, %eax
movl $0x1f, %ecx
cmpl (%rdx), %ecx
movb %al, 0x6(%rsp)
jne 0x3e17cc
xorps %xmm0, %xmm0
movsd %xmm0, 0x60(%rsp)
movq 0x98(%rsp), %rax
movq (%rax), %rdi
movq (%rdi), %rax
callq *0x18(%rax)
movsd %xmm0, 0x58(%rsp)
leaq 0x6f(%rsp), %rdi
leaq 0x60(%rsp), %rsi
leaq 0x58(%rsp), %rdx
callq 0x265d60
movb %al, 0x6(%rsp)
movb 0x6(%rsp), %al
testb $0x1, %al
jne 0x3e17d6
jmp 0x3e17ff
movq 0x8(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x1b9859(%rip), %xmm0   # 0x59b040
movsd %xmm0, 0x50(%rsp)
leaq 0x50(%rsp), %rsi
callq 0x287b60
movq %rax, 0x90(%rsp)
jmp 0x3e1801
jmp 0x3e1803
movq 0x98(%rsp), %rax
movq 0x8(%rax), %rdi
callq 0x39cbf0
testb $0x1, %al
jne 0x3e181d
jmp 0x3e1937
xorl %eax, %eax
cmpq 0x90(%rsp), %rax
jne 0x3e1937
movq 0xa0(%rsp), %rdx
xorl %eax, %eax
movl $0x1e, %ecx
cmpl (%rdx), %ecx
movb %al, 0x5(%rsp)
jne 0x3e187d
xorps %xmm0, %xmm0
movsd %xmm0, 0x40(%rsp)
movq 0x98(%rsp), %rax
movq 0x8(%rax), %rdi
movq (%rdi), %rax
callq *0x18(%rax)
movsd %xmm0, 0x38(%rsp)
leaq 0x4f(%rsp), %rdi
leaq 0x40(%rsp), %rsi
leaq 0x38(%rsp), %rdx
callq 0x266f00
movb %al, 0x5(%rsp)
movb 0x5(%rsp), %al
testb $0x1, %al
jne 0x3e1887
jmp 0x3e18b0
movq 0x8(%rsp), %rax
movq 0x8(%rax), %rdi
xorps %xmm0, %xmm0
movsd %xmm0, 0x30(%rsp)
leaq 0x30(%rsp), %rsi
callq 0x287b60
movq %rax, 0x90(%rsp)
jmp 0x3e1935
movq 0xa0(%rsp), %rdx
xorl %eax, %eax
movl $0x1f, %ecx
cmpl (%rdx), %ecx
movb %al, 0x4(%rsp)
jne 0x3e1900
xorps %xmm0, %xmm0
movsd %xmm0, 0x20(%rsp)
movq 0x98(%rsp), %rax
movq 0x8(%rax), %rdi
movq (%rdi), %rax
callq *0x18(%rax)
movsd %xmm0, 0x18(%rsp)
leaq 0x2f(%rsp), %rdi
leaq 0x20(%rsp), %rsi
leaq 0x18(%rsp), %rdx
callq 0x265d60
movb %al, 0x4(%rsp)
movb 0x4(%rsp), %al
testb $0x1, %al
jne 0x3e190a
jmp 0x3e1933
movq 0x8(%rsp), %rax
movq 0x8(%rax), %rdi
movsd 0x1b9725(%rip), %xmm0   # 0x59b040
movsd %xmm0, 0x10(%rsp)
leaq 0x10(%rsp), %rsi
callq 0x287b60
movq %rax, 0x90(%rsp)
jmp 0x3e1935
jmp 0x3e1937
cmpq $0x0, 0x90(%rsp)
je 0x3e1984
movq 0x8(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x98(%rsp), %rsi
callq 0x284bd0
movq 0x8(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x98(%rsp), %rsi
addq $0x8, %rsi
callq 0x284bd0
movq 0x90(%rsp), %rax
movq %rax, 0xb0(%rsp)
jmp 0x3e19fb
movq 0xa0(%rsp), %rcx
movl $0x1e, %eax
cmpl (%rcx), %eax
jne 0x3e19b9
movq 0x8(%rsp), %rdi
movq 0xa0(%rsp), %rsi
movq 0x98(%rsp), %rdx
callq 0x437a30
movq %rax, 0xb0(%rsp)
jmp 0x3e19fb
movq 0xa0(%rsp), %rcx
movl $0x1f, %eax
cmpl (%rcx), %eax
jne 0x3e19ee
movq 0x8(%rsp), %rdi
movq 0xa0(%rsp), %rsi
movq 0x98(%rsp), %rdx
callq 0x437d90
movq %rax, 0xb0(%rsp)
jmp 0x3e19fb
callq 0x2821f0
movq %rax, 0xb0(%rsp)
movq 0xb0(%rsp), %rax
addq $0xb8, %rsp
retq
nopl (%rax,%rax)