// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::parser<double>::parse_special_function()
inline expression_node_ptr parse_special_function()
      {
         const std::string sf_name = current_token().value;

         // Expect: $fDD(expr0,expr1,expr2) or $fDD(expr0,expr1,expr2,expr3)
         if (
              !details::is_digit(sf_name[2]) ||
              !details::is_digit(sf_name[3])
            )
         {
            set_error(make_error(
               parser_error::e_token,
               current_token(),
               "ERR149 - Invalid special function[1]: " + sf_name,
               exprtk_error_location));

            return error_node();
         }

         const int id = (sf_name[2] - '0') * 10 +
                        (sf_name[3] - '0');

         if (id >= details::e_sffinal)
         {
            set_error(make_error(
               parser_error::e_token,
               current_token(),
               "ERR150 - Invalid special function[2]: " + sf_name,
               exprtk_error_location));

            return error_node();
         }

         const int sf_3_to_4                   = details::e_sf48;
         const details::operator_type opt_type = details::operator_type(id + 1000);
         const std::size_t NumberOfParameters  = (id < (sf_3_to_4 - 1000)) ? 3U : 4U;

         switch (NumberOfParameters)
         {
            case 3  : return parse_special_function_impl<T,3>::process((*this), opt_type, sf_name);
            case 4  : return parse_special_function_impl<T,4>::process((*this), opt_type, sf_name);
            default : return error_node();
         }
      }

// Assembly:
subq $0x2a8, %rsp            # imm = 0x2A8
movq %rdi, 0x298(%rsp)
movq 0x298(%rsp), %rdi
movq %rdi, 0x38(%rsp)
callq 0x373e90
movq %rax, %rsi
addq $0x8, %rsi
leaq 0x278(%rsp), %rdi
callq 0x11b140
leaq 0x278(%rsp), %rdi
movl $0x2, %esi
callq 0x11b770
movsbl (%rax), %edi
callq 0x2343b0
testb $0x1, %al
jne 0x38d385
jmp 0x38d3a7
leaq 0x278(%rsp), %rdi
movl $0x3, %esi
callq 0x11b770
movsbl (%rax), %edi
callq 0x2343b0
testb $0x1, %al
jne 0x38d53e
movq 0x38(%rsp), %rdi
callq 0x373e90
movq %rax, 0x30(%rsp)
jmp 0x38d3b8
leaq 0x21ba8a(%rip), %rsi    # 0x5a8e49
leaq 0x1a0(%rsp), %rdi
leaq 0x278(%rsp), %rdx
callq 0x3784f0
jmp 0x38d3d6
leaq 0x160(%rsp), %rdi
movl $0x719d, %esi           # imm = 0x719D
callq 0x371f20
jmp 0x38d3ea
leaq 0x219b22(%rip), %rsi    # 0x5a6f13
leaq 0x180(%rsp), %rdi
leaq 0x160(%rsp), %rdx
callq 0x29dd70
jmp 0x38d408
movq 0x30(%rsp), %rdx
leaq 0x1d0(%rsp), %rdi
movl $0x2, %esi
leaq 0x1a0(%rsp), %rcx
leaq 0x180(%rsp), %r8
callq 0x3741e0
jmp 0x38d431
movq 0x38(%rsp), %rdi
leaq 0x1d0(%rsp), %rsi
callq 0x371e40
jmp 0x38d445
leaq 0x1d0(%rsp), %rdi
callq 0x371330
leaq 0x180(%rsp), %rdi
callq 0x11b838
leaq 0x160(%rsp), %rdi
callq 0x11b838
leaq 0x1a0(%rsp), %rdi
callq 0x11b838
callq 0x2821f0
movq %rax, 0x2a0(%rsp)
movl $0x1, 0x15c(%rsp)
jmp 0x38d7d1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x1c8(%rsp)
movl %eax, 0x1c4(%rsp)
jmp 0x38d7ee
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x1c8(%rsp)
movl %eax, 0x1c4(%rsp)
jmp 0x38d52c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x1c8(%rsp)
movl %eax, 0x1c4(%rsp)
jmp 0x38d51f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x1c8(%rsp)
movl %eax, 0x1c4(%rsp)
jmp 0x38d512
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x1c8(%rsp)
movl %eax, 0x1c4(%rsp)
leaq 0x1d0(%rsp), %rdi
callq 0x371330
leaq 0x180(%rsp), %rdi
callq 0x11b838
leaq 0x160(%rsp), %rdi
callq 0x11b838
leaq 0x1a0(%rsp), %rdi
callq 0x11b838
jmp 0x38d7ee
leaq 0x278(%rsp), %rdi
movl $0x2, %esi
callq 0x11b770
movsbl (%rax), %eax
subl $0x30, %eax
imull $0xa, %eax, %eax
movl %eax, 0x2c(%rsp)
leaq 0x278(%rsp), %rdi
movl $0x3, %esi
callq 0x11b770
movq %rax, %rcx
movl 0x2c(%rsp), %eax
movsbl (%rcx), %ecx
subl $0x30, %ecx
addl %ecx, %eax
movl %eax, 0x158(%rsp)
cmpl $0x44c, 0x158(%rsp) # imm = 0x44C
jl 0x38d6fc
movq 0x38(%rsp), %rdi
callq 0x373e90
movq %rax, 0x20(%rsp)
jmp 0x38d5a7
leaq 0x21b8c2(%rip), %rsi    # 0x5a8e70
leaq 0x90(%rsp), %rdi
leaq 0x278(%rsp), %rdx
callq 0x3784f0
jmp 0x38d5c5
leaq 0x50(%rsp), %rdi
movl $0x71ab, %esi           # imm = 0x71AB
callq 0x371f20
jmp 0x38d5d6
leaq 0x219936(%rip), %rsi    # 0x5a6f13
leaq 0x70(%rsp), %rdi
leaq 0x50(%rsp), %rdx
callq 0x29dd70
jmp 0x38d5ee
movq 0x20(%rsp), %rdx
leaq 0xb0(%rsp), %rdi
movl $0x2, %esi
leaq 0x90(%rsp), %rcx
leaq 0x70(%rsp), %r8
callq 0x3741e0
jmp 0x38d614
movq 0x38(%rsp), %rdi
leaq 0xb0(%rsp), %rsi
callq 0x371e40
jmp 0x38d628
leaq 0xb0(%rsp), %rdi
callq 0x371330
leaq 0x70(%rsp), %rdi
callq 0x11b838
leaq 0x50(%rsp), %rdi
callq 0x11b838
leaq 0x90(%rsp), %rdi
callq 0x11b838
callq 0x2821f0
movq %rax, 0x2a0(%rsp)
movl $0x1, 0x15c(%rsp)
jmp 0x38d7d1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x1c8(%rsp)
movl %eax, 0x1c4(%rsp)
jmp 0x38d6ea
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x1c8(%rsp)
movl %eax, 0x1c4(%rsp)
jmp 0x38d6e0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x1c8(%rsp)
movl %eax, 0x1c4(%rsp)
jmp 0x38d6d6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x1c8(%rsp)
movl %eax, 0x1c4(%rsp)
leaq 0xb0(%rsp), %rdi
callq 0x371330
leaq 0x70(%rsp), %rdi
callq 0x11b838
leaq 0x50(%rsp), %rdi
callq 0x11b838
leaq 0x90(%rsp), %rdi
callq 0x11b838
jmp 0x38d7ee
movl $0x418, 0x4c(%rsp)      # imm = 0x418
movl 0x158(%rsp), %eax
addl $0x3e8, %eax            # imm = 0x3E8
movl %eax, 0x48(%rsp)
movl 0x158(%rsp), %eax
subl $0x30, %eax
setge %al
movzbl %al, %eax
addl $0x3, %eax
movq %rax, 0x40(%rsp)
movq 0x40(%rsp), %rax
movq %rax, 0x18(%rsp)
subq $0x3, %rax
je 0x38d74b
jmp 0x38d73e
movq 0x18(%rsp), %rax
subq $0x4, %rax
je 0x38d782
jmp 0x38d7b9
movq 0x38(%rsp), %rdi
movl 0x48(%rsp), %esi
leaq 0x278(%rsp), %rdx
callq 0x4ee030
movq %rax, 0x10(%rsp)
jmp 0x38d768
movq 0x10(%rsp), %rax
movq %rax, 0x2a0(%rsp)
movl $0x1, 0x15c(%rsp)
jmp 0x38d7d1
movq 0x38(%rsp), %rdi
movl 0x48(%rsp), %esi
leaq 0x278(%rsp), %rdx
callq 0x4ee840
movq %rax, 0x8(%rsp)
jmp 0x38d79f
movq 0x8(%rsp), %rax
movq %rax, 0x2a0(%rsp)
movl $0x1, 0x15c(%rsp)
jmp 0x38d7d1
callq 0x2821f0
movq %rax, 0x2a0(%rsp)
movl $0x1, 0x15c(%rsp)
leaq 0x278(%rsp), %rdi
callq 0x11b838
movq 0x2a0(%rsp), %rax
addq $0x2a8, %rsp            # imm = 0x2A8
retq
leaq 0x278(%rsp), %rdi
callq 0x11b838
movq 0x1c8(%rsp), %rdi
callq 0x11b4e0
nopl (%rax,%rax)