// File: /workspace/github_cpp_makefile_star2_O3/ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::details::expression_node<double>* exprtk::parser<double>::simplify<std::allocator<exprtk::details::expression_node<double>*>, std::allocator<bool>, std::vector>(std::vector<exprtk::details::expression_node<double>*, std::allocator<exprtk::details::expression_node<double>*>>&, std::vector<bool, std::allocator<bool>>&, bool)
inline expression_node_ptr simplify(Sequence<expression_node_ptr,Allocator1>& expression_list,
                                          Sequence<bool,Allocator2>& side_effect_list,
                                          const bool specialise_on_final_type = false)
      {
         if (expression_list.empty())
            return error_node();
         else if (1 == expression_list.size())
            return expression_list[0];

         Sequence<expression_node_ptr,Allocator1> tmp_expression_list;

         exprtk_debug(("simplify() - expression_list.size: %d  side_effect_list.size(): %d\n",
                       static_cast<int>(expression_list .size()),
                       static_cast<int>(side_effect_list.size())));

         bool return_node_present = false;

         for (std::size_t i = 0; i < (expression_list.size() - 1); ++i)
         {
            if (is_variable_node(expression_list[i]))
               continue;
            else if (
                      is_return_node  (expression_list[i]) ||
                      is_break_node   (expression_list[i]) ||
                      is_continue_node(expression_list[i])
                    )
            {
               tmp_expression_list.push_back(expression_list[i]);

               // Remove all subexpressions after first short-circuit
               // node has been encountered.

               for (std::size_t j = i + 1; j < expression_list.size(); ++j)
               {
                  free_node(node_allocator_, expression_list[j]);
               }

               return_node_present = true;

               break;
            }
            else if (
                      is_constant_node(expression_list[i]) ||
                      is_null_node    (expression_list[i]) ||
                      !side_effect_list[i]
                    )
            {
               free_node(node_allocator_, expression_list[i]);
               continue;
            }
            else
               tmp_expression_list.push_back(expression_list[i]);
         }

         if (!return_node_present)
         {
            tmp_expression_list.push_back(expression_list.back());
         }

         expression_list.swap(tmp_expression_list);

         if (tmp_expression_list.size() > expression_list.size())
         {
            exprtk_debug(("simplify() - Reduced subexpressions from %d to %d\n",
                          static_cast<int>(tmp_expression_list.size()),
                          static_cast<int>(expression_list    .size())));
         }

         if (
              return_node_present     ||
              side_effect_list.back() ||
              (expression_list.size() > 1)
            )
            state_.activate_side_effect("simplify()");

         if (1 == expression_list.size())
            return expression_list[0];
         else if (specialise_on_final_type && is_generally_string_node(expression_list.back()))
            return expression_generator_.vararg_function(details::e_smulti,expression_list);
         else
            return expression_generator_.vararg_function(details::e_multi,expression_list);
      }

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %rdx, %r15
movq (%rsi), %rax
movq 0x8(%rsi), %rdx
cmpq %rdx, %rax
je 0x2531fe
subq %rax, %rdx
cmpq $0x8, %rdx
jne 0x253205
movq (%rax), %rbx
jmp 0x253633
xorl %ebx, %ebx
jmp 0x253633
movq %rsi, %rbx
movl %ecx, 0x1c(%rsp)
movq %rdi, 0x20(%rsp)
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorps %xmm0, %xmm0
movq %rsp, %rdx
movaps %xmm0, (%rdx)
movq $0x0, 0x10(%rdx)
movl $0x8, %ebp
movl $0x1, %r14d
leaq 0x3f(%rcx), %r12
movq -0x8(%rax,%rbp), %rdi
testq %rdi, %rdi
je 0x2532fb
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0x11, %eax
je 0x2533a3
movq (%rbx), %rax
movq -0x8(%rax,%rbp), %rdi
testq %rdi, %rdi
je 0x2532fb
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0xf, %eax
je 0x2533f5
movq (%rbx), %rax
movq -0x8(%rax,%rbp), %rdi
testq %rdi, %rdi
je 0x2532fb
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0x95, %eax
je 0x2533f5
movq (%rbx), %rax
movq -0x8(%rax,%rbp), %rdi
testq %rdi, %rdi
je 0x2532fb
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0x96, %eax
je 0x2533f5
movq (%rbx), %rax
movq -0x8(%rax,%rbp), %r13
testq %r13, %r13
je 0x2532fb
movq (%r13), %rax
movq %r13, %rdi
callq *0x28(%rax)
cmpl $0x2, %eax
je 0x25335e
movq (%r13), %rax
movq %r13, %rdi
callq *0x28(%rax)
cmpl $0x13, %eax
je 0x25335e
movq (%rbx), %rax
movq -0x8(%rax,%rbp), %rdi
testq %rdi, %rdi
je 0x2532fb
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0x1, %eax
je 0x25335e
leaq -0x1(%r14), %rax
leaq 0x3f(%rax), %rcx
testq %rax, %rax
cmovnsq %rax, %rcx
sarq $0x6, %rcx
shlq $0x3, %rcx
addq (%r15), %rcx
movq %rax, %rdx
andq %r12, %rdx
xorl %esi, %esi
movabsq $-0x8000000000000000, %rdi # imm = 0x8000000000000000
cmpq %rdi, %rdx
setbe %sil
movq -0x8(%rcx,%rsi,8), %rcx
btq %rax, %rcx
jae 0x25335e
movq (%rbx), %rax
leaq (%rax,%rbp), %rdx
addq $-0x8, %rdx
movq 0x8(%rsp), %rsi
cmpq 0x10(%rsp), %rsi
je 0x25339b
movq (%rdx), %rax
movq %rax, (%rsi)
addq $0x8, 0x8(%rsp)
jmp 0x2533a3
movq (%rbx), %r13
movq -0x8(%r13,%rbp), %rdi
testq %rdi, %rdi
je 0x2533a3
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0x11, %eax
je 0x2533a3
addq %rbp, %r13
addq $-0x8, %r13
movq (%r13), %rdi
testq %rdi, %rdi
je 0x253391
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0x12, %eax
je 0x2533a3
movq %r13, %rdi
callq 0x1ea63e
jmp 0x2533a3
movq %rsp, %rdi
callq 0x36ea0a
movq (%rbx), %rax
movq 0x8(%rbx), %rdx
movq %rdx, %rcx
subq %rax, %rcx
sarq $0x3, %rcx
decq %rcx
addq $0x8, %rbp
leaq 0x1(%r14), %rsi
cmpq %rcx, %r14
movq %rsi, %r14
jb 0x25323b
movq 0x8(%rsp), %rsi
addq $-0x8, %rdx
cmpq 0x10(%rsp), %rsi
je 0x253421
movq (%rdx), %rax
movq %rax, (%rsi)
movq 0x8(%rsp), %rax
addq $0x8, %rax
movq 0x20(%rsp), %r13
movl 0x1c(%rsp), %ebp
jmp 0x253437
movq (%rbx), %rax
leaq (%rax,%rbp), %rdx
addq $-0x8, %rdx
movq 0x8(%rsp), %rsi
cmpq 0x10(%rsp), %rsi
je 0x2534b7
movq (%rdx), %rax
movq %rax, (%rsi)
addq $0x8, 0x8(%rsp)
jmp 0x2534bf
movq %rsp, %rdi
callq 0x36ea0a
movq 0x20(%rsp), %r13
movl 0x1c(%rsp), %ebp
movq 0x8(%rsp), %rax
movq 0x10(%rbx), %rdx
movq (%rsp), %rcx
movq 0x10(%rsp), %rsi
movq %rsi, 0x10(%rbx)
movups (%rbx), %xmm0
movq %rcx, (%rbx)
movq %rax, 0x8(%rbx)
movaps %xmm0, (%rsp)
movq %rdx, 0x10(%rsp)
movl 0x18(%r15), %edx
leaq -0x1(%rdx), %rsi
addq $0x3e, %rdx
testq %rsi, %rsi
cmovnsq %rsi, %rdx
sarq $0x6, %rdx
shlq $0x3, %rdx
addq 0x10(%r15), %rdx
andq %rsi, %r12
xorl %edi, %edi
movabsq $-0x8000000000000000, %r8 # imm = 0x8000000000000000
cmpq %r8, %r12
setbe %dil
movq -0x8(%rdx,%rdi,8), %rdx
btq %rsi, %rdx
jb 0x25354c
movq %rax, %rdx
subq %rcx, %rdx
cmpq $0x8, %rdx
ja 0x25354c
movq %rax, %rdx
jmp 0x2535a0
movq %rsp, %rdi
callq 0x36ea0a
movq (%rbx), %r15
movq 0x8(%rbx), %rax
movq %rax, %rcx
subq %r15, %rcx
sarq $0x3, %rcx
cmpq %rcx, %r14
jae 0x253521
movq (%r15,%rbp), %rdi
testq %rdi, %rdi
je 0x253507
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0x11, %eax
je 0x253507
addq %rbp, %r15
movq (%r15), %rdi
testq %rdi, %rdi
je 0x2534ff
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0x12, %eax
je 0x253507
movq %r15, %rdi
callq 0x1ea63e
incq %r14
movq (%rbx), %r15
movq 0x8(%rbx), %rax
movq %rax, %rcx
subq %r15, %rcx
sarq $0x3, %rcx
addq $0x8, %rbp
jmp 0x2534d0
movq 0x10(%rbx), %rcx
movaps (%rsp), %xmm0
movups %xmm0, (%rbx)
movq 0x10(%rsp), %rdx
movq %rdx, 0x10(%rbx)
movq %r15, (%rsp)
movq %rax, 0x8(%rsp)
movq %rcx, 0x10(%rsp)
movq 0x20(%rsp), %r13
movl 0x1c(%rsp), %ebp
leaq 0x38(%rsp), %r14
movq %r14, -0x10(%r14)
leaq 0x1453a4(%rip), %rsi    # 0x398900
leaq 0x1453a7(%rip), %rdx    # 0x39890a
leaq 0x28(%rsp), %rdi
callq 0x1e4740
cmpb $0x0, 0x3ac(%r13)
jne 0x25357f
movb $0x1, 0x3ac(%r13)
movq 0x28(%rsp), %rdi
cmpq %r14, %rdi
je 0x253596
movq 0x38(%rsp), %rsi
incq %rsi
callq 0x11e0c0
movq (%rbx), %rcx
movq 0x8(%rbx), %rdx
movq %rdx, %rax
subq %rcx, %rdx
cmpq $0x8, %rdx
jne 0x2535ae
movq (%rcx), %rbx
jmp 0x25361d
testb %bpl, %bpl
je 0x2535fd
movq -0x8(%rax), %rdi
testq %rdi, %rdi
je 0x2535fd
movq (%rdi), %rax
callq *0x28(%rax)
cmpl $0x21, %eax
ja 0x2535f8
movl %eax, %ecx
movabsq $0x388fc0000, %rdx      # imm = 0x388FC0000
btq %rcx, %rdx
jae 0x2535f8
addq $0x220, %r13            # imm = 0x220
leaq 0x28(%rsp), %rsi
movl $0x5b, (%rsi)
movq %r13, %rdi
movq %rbx, %rdx
callq 0x273ce2
jmp 0x25361a
cmpl $0x7b, %eax
je 0x2535d9
addq $0x220, %r13            # imm = 0x220
leaq 0x28(%rsp), %rsi
movl $0x5a, (%rsi)
movq %r13, %rdi
movq %rbx, %rdx
callq 0x273ce2
movq %rax, %rbx
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x253633
movq 0x10(%rsp), %rsi
subq %rdi, %rsi
callq 0x11e0c0
movq %rbx, %rax
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x253651
jmp 0x253651
jmp 0x253651
jmp 0x253651
jmp 0x253651
jmp 0x253651
movq %rax, %rbx
movq (%rsp), %rdi
testq %rdi, %rdi
je 0x25366a
movq 0x10(%rsp), %rsi
subq %rdi, %rsi
callq 0x11e0c0
movq %rbx, %rdi
callq 0x11e330