// File: /workspace/github_cpp_makefile_star2_O2/ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::parse_generic_function_call(exprtk::igeneric_function<double>*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
inline expression_node_ptr parse_generic_function_call(igeneric_function<T>* function, const std::string& function_name)
      {
         std::vector<expression_node_ptr> arg_list;

         scoped_vec_delete<expression_node_t> svd((*this), arg_list);

         next_token();

         std::string param_type_list;

         type_checker tc(
            (*this),
            function_name,
            function->parameter_sequence,
            type_checker::e_string);

         if (tc.invalid())
         {
            set_error(make_error(
               parser_error::e_syntax,
               current_token(),
               "ERR136 - Type checker instantiation failure for generic function: " + function_name,
               exprtk_error_location));

            return error_node();
         }

         if (token_is(token_t::e_lbracket))
         {
            if (token_is(token_t::e_rbracket))
            {
               if (
                    !function->allow_zero_parameters() &&
                    !tc       .allow_zero_parameters()
                  )
               {
                  set_error(make_error(
                     parser_error::e_syntax,
                     current_token(),
                     "ERR137 - Zero parameter call to generic function: "
                     + function_name + " not allowed",
                     exprtk_error_location));

                  return error_node();
               }
            }
            else
            {
               for ( ; ; )
               {
                  expression_node_ptr arg = parse_expression();

                  if (0 == arg)
                     return error_node();

                  if (is_ivector_node(arg))
                     param_type_list += 'V';
                  else if (is_generally_string_node(arg))
                     param_type_list += 'S';
                  else // Everything else is assumed to be a scalar returning expression
                     param_type_list += 'T';

                  arg_list.push_back(arg);

                  if (token_is(token_t::e_rbracket))
                     break;
                  else if (!token_is(token_t::e_comma))
                  {
                     set_error(make_error(
                        parser_error::e_syntax,
                        current_token(),
                        "ERR138 - Expected ',' for call to generic function: " + function_name,
                        exprtk_error_location));

                     return error_node();
                  }
               }
            }
         }
         else if (
                   !function->parameter_sequence.empty() &&
                   function->allow_zero_parameters    () &&
                   !tc      .allow_zero_parameters    ()
                 )
         {
            set_error(make_error(
               parser_error::e_syntax,
               current_token(),
               "ERR139 - Zero parameter call to generic function: "
               + function_name + " not allowed",
               exprtk_error_location));

            return error_node();
         }

         std::size_t param_seq_index = 0;

         if (
              state_.type_check_enabled &&
              !tc.verify(param_type_list, param_seq_index)
            )
         {
            set_error(make_error(
               parser_error::e_syntax,
               current_token(),
               "ERR140 - Invalid input parameter sequence for call to generic function: " + function_name,
               exprtk_error_location));

            return error_node();
         }

         expression_node_ptr result =
            (tc.paramseq_count() <= 1) ?
               expression_generator_
                  .generic_function_call(function, arg_list) :
               expression_generator_
                  .generic_function_call(function, arg_list, param_seq_index);

         svd.delete_ptr = (0 == result);

         return result;
      }

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x1d8, %rsp            # imm = 0x1D8
movq %rdx, %r14
movq %rsi, %r15
movq %rdi, %rbx
xorps %xmm0, %xmm0
leaq 0xa0(%rsp), %rax
andq $0x0, 0x10(%rax)
movaps %xmm0, (%rax)
movb $0x1, 0x88(%rsp)
movq %rdi, 0x90(%rsp)
movq %rax, 0x98(%rsp)
callq 0x1f6d68
leaq 0xd0(%rsp), %rax
movq %rax, -0x10(%rax)
andq $0x0, -0x8(%rax)
movb $0x0, (%rax)
leaq 0x20(%r15), %rcx
leaq 0x188(%rsp), %rdi
pushq $0x53
popq %r8
movq %rbx, %rsi
movq %r14, %rdx
callq 0x2b58fa
cmpb $0x0, 0x188(%rsp)
je 0x2a5055
leaq 0xe0(%rsp), %r12
movl $0x28, (%r12)
pushq $0x1
popq %rdx
movq %rbx, %rdi
movq %r12, %rsi
callq 0x1fae6e
testb %al, %al
je 0x2a50f5
leaq 0xe0(%rsp), %rsi
movl $0x29, (%rsi)
pushq $0x1
popq %rdx
movq %rbx, %rdi
callq 0x1fae6e
testb %al, %al
je 0x2a51eb
cmpb $0x0, 0x8(%r15)
jne 0x2a5118
leaq 0x188(%rsp), %rdi
callq 0x2b596a
testb %al, %al
jne 0x2a5118
leaq 0x388a3(%rip), %rsi     # 0x2dd876
leaq 0x28(%rsp), %rdi
movq %r14, %rdx
callq 0x1f8aab
leaq 0x36c4d(%rip), %rdx     # 0x2dbc34
leaq 0x48(%rsp), %rdi
leaq 0x28(%rsp), %rsi
callq 0x1b42c3
leaq 0x68(%rsp), %rdi
movl $0x703f, %esi           # imm = 0x703F
callq 0x1f7a3c
leaq 0x34bef(%rip), %rsi     # 0x2d9bfb
leaq 0x8(%rsp), %rdi
leaq 0x68(%rsp), %rdx
callq 0x1b4349
leaq 0x70(%rbx), %rdx
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rsi
leaq 0x48(%rsp), %rcx
leaq 0x8(%rsp), %r8
callq 0x1f7341
addq $0x308, %rbx            # imm = 0x308
leaq 0xe0(%rsp), %rsi
movq %rbx, %rdi
callq 0x1f76ce
jmp 0x2a5408
leaq 0x387d7(%rip), %rsi     # 0x2dd833
leaq 0x48(%rsp), %rdi
movq %r14, %rdx
callq 0x1f8aab
leaq 0x8(%rsp), %rdi
movl $0x702c, %esi           # imm = 0x702C
callq 0x1f7a3c
leaq 0x34b7c(%rip), %rsi     # 0x2d9bfb
leaq 0x28(%rsp), %rdi
leaq 0x8(%rsp), %rdx
callq 0x1b4349
leaq 0x70(%rbx), %rdx
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rsi
leaq 0x48(%rsp), %rcx
leaq 0x28(%rsp), %r8
callq 0x1f7341
addq $0x308, %rbx            # imm = 0x308
leaq 0xe0(%rsp), %rsi
movq %rbx, %rdi
callq 0x1f76ce
leaq 0xe0(%rsp), %rdi
callq 0x1f5c4c
leaq 0x28(%rsp), %rdi
callq 0x118648
leaq 0x8(%rsp), %rdi
callq 0x118648
leaq 0x48(%rsp), %rdi
callq 0x118648
xorl %ebx, %ebx
jmp 0x2a51a2
cmpq $0x0, 0x28(%r15)
je 0x2a5118
cmpb $0x1, 0x8(%r15)
jne 0x2a5118
leaq 0x188(%rsp), %rdi
callq 0x2b596a
testb %al, %al
je 0x2a5384
andq $0x0, 0x68(%rsp)
cmpb $0x1, 0x3ad(%rbx)
jne 0x2a5149
leaq 0x188(%rsp), %rdi
leaq 0xc0(%rsp), %rsi
leaq 0x68(%rsp), %rdx
callq 0x2b59d2
testb %al, %al
je 0x2a5311
movq 0x1c8(%rsp), %rax
subq 0x1c0(%rsp), %rax
pushq $0x28
popq %rcx
cqto
idivq %rcx
addq $0x220, %rbx            # imm = 0x220
cmpq $0x1, %rax
ja 0x2a5179
orq $-0x1, 0xe0(%rsp)
jmp 0x2a517e
leaq 0x68(%rsp), %r12
leaq 0xa0(%rsp), %rdx
movq %rbx, %rdi
movq %r15, %rsi
movq %r12, %rcx
callq 0x2b5e4e
movq %rax, %rbx
testq %rax, %rax
sete 0x88(%rsp)
leaq 0x188(%rsp), %rdi
callq 0x2b6142
leaq 0xc0(%rsp), %rdi
callq 0x118648
leaq 0x88(%rsp), %rdi
callq 0x1fb1b8
leaq 0xa0(%rsp), %rdi
callq 0x29e264
movq %rbx, %rax
addq $0x1d8, %rsp            # imm = 0x1D8
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0xe0(%rsp), %rbp
pushq $0x1
popq %r13
movq %rbx, %rdi
xorl %esi, %esi
callq 0x1f9016
movq %rax, 0x68(%rsp)
testq %rax, %rax
je 0x2a50ee
movq (%rax), %rcx
movq %rax, %rdi
callq *0x28(%rcx)
addl $-0x7c, %eax
cmpl $0x19, %eax
jae 0x2a522c
movb $0x56, %cl
movl $0x1f17801, %edx        # imm = 0x1F17801
btl %eax, %edx
jb 0x2a523a
movq 0x68(%rsp), %rdi
callq 0x20b691
movb $0x54, %cl
subb %al, %cl
movzbl %cl, %esi
leaq 0xc0(%rsp), %rdi
callq 0x1185f0
leaq 0xa0(%rsp), %rdi
leaq 0x68(%rsp), %rsi
callq 0x1fadc0
movl $0x29, 0xe0(%rsp)
movq %rbx, %rdi
movq %rbp, %rsi
movl %r13d, %edx
callq 0x1fae6e
testb %al, %al
jne 0x2a5118
movl $0x2c, 0xe0(%rsp)
movq %rbx, %rdi
movq %rbp, %rsi
movl %r13d, %edx
callq 0x1fae6e
testb %al, %al
jne 0x2a51f7
leaq 0x38604(%rip), %rsi     # 0x2dd8a9
leaq 0x48(%rsp), %rdi
movq %r14, %rdx
callq 0x1f8aab
leaq 0x8(%rsp), %rdi
movl $0x705e, %esi           # imm = 0x705E
callq 0x1f7a3c
leaq 0x34933(%rip), %rsi     # 0x2d9bfb
leaq 0x28(%rsp), %rdi
leaq 0x8(%rsp), %rdx
callq 0x1b4349
leaq 0x70(%rbx), %rdx
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rsi
leaq 0x48(%rsp), %rcx
leaq 0x28(%rsp), %r8
callq 0x1f7341
addq $0x308, %rbx            # imm = 0x308
leaq 0xe0(%rsp), %rsi
movq %rbx, %rdi
callq 0x1f76ce
jmp 0x2a50c3
leaq 0x385f9(%rip), %rsi     # 0x2dd911
leaq 0x48(%rsp), %rdi
movq %r14, %rdx
callq 0x1f8aab
leaq 0x8(%rsp), %rdi
movl $0x7080, %esi           # imm = 0x7080
callq 0x1f7a3c
leaq 0x348c0(%rip), %rsi     # 0x2d9bfb
leaq 0x28(%rsp), %rdi
leaq 0x8(%rsp), %rdx
callq 0x1b4349
leaq 0x70(%rbx), %rdx
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rsi
leaq 0x48(%rsp), %rcx
leaq 0x28(%rsp), %r8
callq 0x1f7341
addq $0x308, %rbx            # imm = 0x308
leaq 0xe0(%rsp), %rsi
movq %rbx, %rdi
callq 0x1f76ce
jmp 0x2a50c3
leaq 0x38553(%rip), %rsi     # 0x2dd8de
leaq 0x28(%rsp), %rdi
movq %r14, %rdx
callq 0x1f8aab
leaq 0x36895(%rip), %rdx     # 0x2dbc34
leaq 0x48(%rsp), %rdi
leaq 0x28(%rsp), %rsi
callq 0x1b42c3
leaq 0x68(%rsp), %rdi
movl $0x7070, %esi           # imm = 0x7070
callq 0x1f7a3c
leaq 0x34837(%rip), %rsi     # 0x2d9bfb
leaq 0x8(%rsp), %rdi
leaq 0x68(%rsp), %rdx
callq 0x1b4349
leaq 0x70(%rbx), %rdx
leaq 0xe0(%rsp), %rdi
pushq $0x1
popq %rsi
leaq 0x48(%rsp), %rcx
leaq 0x8(%rsp), %r8
callq 0x1f7341
addq $0x308, %rbx            # imm = 0x308
leaq 0xe0(%rsp), %rsi
movq %rbx, %rdi
callq 0x1f76ce
leaq 0xe0(%rsp), %rdi
callq 0x1f5c4c
leaq 0x8(%rsp), %rdi
callq 0x118648
leaq 0x68(%rsp), %rdi
callq 0x118648
leaq 0x48(%rsp), %rdi
callq 0x118648
leaq 0x28(%rsp), %rdi
jmp 0x2a50e9
jmp 0x2a544c
jmp 0x2a545e
jmp 0x2a546d
jmp 0x2a547c
jmp 0x2a548b
jmp 0x2a5502
movq %rax, %rbx
leaq 0xe0(%rsp), %rdi
callq 0x1f5c4c
jmp 0x2a5461
movq %rax, %rbx
leaq 0x8(%rsp), %rdi
callq 0x118648
jmp 0x2a5470
movq %rax, %rbx
leaq 0x68(%rsp), %rdi
callq 0x118648
jmp 0x2a547f
movq %rax, %rbx
leaq 0x48(%rsp), %rdi
callq 0x118648
jmp 0x2a548e
movq %rax, %rbx
leaq 0x28(%rsp), %rdi
jmp 0x2a54e9
jmp 0x2a5502
jmp 0x2a54b1
jmp 0x2a54c3
jmp 0x2a54d2
jmp 0x2a54e1
jmp 0x2a5502
jmp 0x2a54b1
jmp 0x2a54c3
jmp 0x2a54d2
jmp 0x2a54e1
jmp 0x2a5502
jmp 0x2a5502
jmp 0x2a5502
jmp 0x2a5502
movq %rax, %rbx
leaq 0xe0(%rsp), %rdi
callq 0x1f5c4c
jmp 0x2a54c6
movq %rax, %rbx
leaq 0x28(%rsp), %rdi
callq 0x118648
jmp 0x2a54d5
movq %rax, %rbx
leaq 0x8(%rsp), %rdi
callq 0x118648
jmp 0x2a54e4
movq %rax, %rbx
leaq 0x48(%rsp), %rdi
callq 0x118648
jmp 0x2a5505
jmp 0x2a5502
jmp 0x2a5502
movq %rax, %rbx
jmp 0x2a5512
movq %rax, %rbx
jmp 0x2a551f
jmp 0x2a5502
jmp 0x2a5502
movq %rax, %rbx
leaq 0x188(%rsp), %rdi
callq 0x2b6142
leaq 0xc0(%rsp), %rdi
callq 0x118648
leaq 0x88(%rsp), %rdi
callq 0x1fb1b8
leaq 0xa0(%rsp), %rdi
callq 0x29e264
movq %rbx, %rdi
callq 0x118360
nop