// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::details::expression_node<double>* exprtk::parser<double>::expression_generator<double>::function<1ul>(exprtk::ifunction<double>*, exprtk::details::expression_node<double>* (&) [1ul])
inline expression_node_ptr function(ifunction_t* f, expression_node_ptr (&b)[N])
         {
            typedef typename details::function_N_node<T,ifunction_t,N> function_N_node_t;
            expression_node_ptr result = synthesize_expression<function_N_node_t,N>(f,b);

            if (0 == result)
               return error_node();
            else
            {
               // Can the function call be completely optimised?
               if (details::is_constant_node(result))
                  return result;
               else if (!all_nodes_valid(b))
               {
                  details::free_node(*node_allocator_,result);
                  std::fill_n(b, N, reinterpret_cast<expression_node_ptr>(0));

                  return error_node();
               }
               else if (N != f->param_count)
               {
                  details::free_node(*node_allocator_,result);
                  std::fill_n(b, N, reinterpret_cast<expression_node_ptr>(0));

                  return error_node();
               }

               function_N_node_t* func_node_ptr = reinterpret_cast<function_N_node_t*>(result);

               if (!func_node_ptr->init_branches(b))
               {
                  details::free_node(*node_allocator_,result);
                  std::fill_n(b, N, reinterpret_cast<expression_node_ptr>(0));

                  return error_node();
               }

               if (result && result->valid())
               {
                  return result;
               }

               parser_->set_error(parser_error::make_error(
                  parser_error::e_synthesis,
                  token_t(),
                  "ERR264 - Failed to synthesize node: function_N_node_t",
                  exprtk_error_location));

               details::free_node(*node_allocator_, result);
               return error_node();
            }
         }

// Assembly:
subq $0x1b8, %rsp            # imm = 0x1B8
movq %rdi, 0x1a8(%rsp)
movq %rsi, 0x1a0(%rsp)
movq %rdx, 0x198(%rsp)
movq 0x1a8(%rsp), %rdi
movq %rdi, 0x18(%rsp)
movq 0x1a0(%rsp), %rsi
movq 0x198(%rsp), %rdx
callq 0x53d680
movq %rax, 0x190(%rsp)
xorl %eax, %eax
cmpq 0x190(%rsp), %rax
jne 0x53d2b7
callq 0x2821f0
movq %rax, 0x1b0(%rsp)
jmp 0x53d5ef
movq 0x190(%rsp), %rdi
callq 0x39cbf0
testb $0x1, %al
jne 0x53d2ca
jmp 0x53d2df
movq 0x190(%rsp), %rax
movq %rax, 0x1b0(%rsp)
jmp 0x53d5ef
movq 0x198(%rsp), %rdi
callq 0x3b0db0
testb $0x1, %al
jne 0x53d33e
movq 0x18(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x190(%rsp), %rsi
callq 0x284bd0
movq 0x198(%rsp), %rdi
movq $0x0, 0x188(%rsp)
movl $0x1, %esi
leaq 0x188(%rsp), %rdx
callq 0x3af2d0
callq 0x2821f0
movq %rax, 0x1b0(%rsp)
jmp 0x53d5ef
movq 0x1a0(%rsp), %rcx
movl $0x1, %eax
cmpq 0x20(%rcx), %rax
je 0x53d39f
movq 0x18(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x190(%rsp), %rsi
callq 0x284bd0
movq 0x198(%rsp), %rdi
movq $0x0, 0x180(%rsp)
movl $0x1, %esi
leaq 0x180(%rsp), %rdx
callq 0x3af2d0
callq 0x2821f0
movq %rax, 0x1b0(%rsp)
jmp 0x53d5ef
jmp 0x53d3a1
jmp 0x53d3a3
movq 0x190(%rsp), %rax
movq %rax, 0x178(%rsp)
movq 0x178(%rsp), %rdi
movq 0x198(%rsp), %rsi
callq 0x53d890
testb $0x1, %al
jne 0x53d41a
movq 0x18(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x190(%rsp), %rsi
callq 0x284bd0
movq 0x198(%rsp), %rdi
movq $0x0, 0x170(%rsp)
movl $0x1, %esi
leaq 0x170(%rsp), %rdx
callq 0x3af2d0
callq 0x2821f0
movq %rax, 0x1b0(%rsp)
jmp 0x53d5ef
cmpq $0x0, 0x190(%rsp)
je 0x53d44e
movq 0x190(%rsp), %rdi
movq (%rdi), %rax
callq *0x30(%rax)
testb $0x1, %al
jne 0x53d439
jmp 0x53d44e
movq 0x190(%rsp), %rax
movq %rax, 0x1b0(%rsp)
jmp 0x53d5ef
movq 0x18(%rsp), %rax
movq 0x68(%rax), %rax
movq %rax, 0x8(%rsp)
leaq 0x98(%rsp), %rdi
callq 0x251250
leaq 0x77(%rsp), %rdi
movq %rdi, 0x10(%rsp)
callq 0x11b6f0
movq 0x10(%rsp), %rdx
leaq 0x6d4d8(%rip), %rsi     # 0x5aa95c
leaq 0x78(%rsp), %rdi
callq 0x134520
jmp 0x53d490
leaq 0x20(%rsp), %rdi
movl $0x83d6, %esi           # imm = 0x83D6
callq 0x371f20
jmp 0x53d4a1
leaq 0x69a6b(%rip), %rsi     # 0x5a6f13
leaq 0x40(%rsp), %rdi
leaq 0x20(%rsp), %rdx
callq 0x29dd70
jmp 0x53d4b9
leaq 0xc8(%rsp), %rdi
movl $0x7, %esi
leaq 0x98(%rsp), %rdx
leaq 0x78(%rsp), %rcx
leaq 0x40(%rsp), %r8
callq 0x3741e0
jmp 0x53d4df
movq 0x8(%rsp), %rdi
leaq 0xc8(%rsp), %rsi
callq 0x371e40
jmp 0x53d4f3
leaq 0xc8(%rsp), %rdi
callq 0x371330
leaq 0x40(%rsp), %rdi
callq 0x11b838
leaq 0x20(%rsp), %rdi
callq 0x11b838
leaq 0x78(%rsp), %rdi
callq 0x11b838
leaq 0x77(%rsp), %rdi
callq 0x11b820
leaq 0x98(%rsp), %rdi
callq 0x2512e0
movq 0x18(%rsp), %rax
movq 0x8(%rax), %rdi
leaq 0x190(%rsp), %rsi
callq 0x284bd0
callq 0x2821f0
movq %rax, 0x1b0(%rsp)
jmp 0x53d5ef
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x68(%rsp)
movl %eax, 0x64(%rsp)
jmp 0x53d5d6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x68(%rsp)
movl %eax, 0x64(%rsp)
jmp 0x53d5cc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x68(%rsp)
movl %eax, 0x64(%rsp)
jmp 0x53d5c2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x68(%rsp)
movl %eax, 0x64(%rsp)
jmp 0x53d5b8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x68(%rsp)
movl %eax, 0x64(%rsp)
leaq 0xc8(%rsp), %rdi
callq 0x371330
leaq 0x40(%rsp), %rdi
callq 0x11b838
leaq 0x20(%rsp), %rdi
callq 0x11b838
leaq 0x78(%rsp), %rdi
callq 0x11b838
leaq 0x77(%rsp), %rdi
callq 0x11b820
leaq 0x98(%rsp), %rdi
callq 0x2512e0
jmp 0x53d5ff
movq 0x1b0(%rsp), %rax
addq $0x1b8, %rsp            # imm = 0x1B8
retq
movq 0x68(%rsp), %rdi
callq 0x11b4e0
nopl (%rax)