// File: ArashPartow[P]exprtk-extras/exprtk_bsm_benchmark.cpp
// Function: void black_scholes_merton_model<double>()
void black_scholes_merton_model()
{
   typedef exprtk::symbol_table<T> symbol_table_t;
   typedef exprtk::expression<T>   expression_t;
   typedef exprtk::parser<T>       parser_t;

   const std::string bsm_model_program =
      " var d1 := (log(s / k) + (r + v^2 / 2) * t) / (v * sqrt(t)); "
      " var d2 := d1 - v * sqrt(t);                                 "
      "                                                             "
      " if (callput_flag == 'call')                                 "
      "    s * ncdf(d1) - k * e^(-r * t) * ncdf(d2);                "
      " else if (callput_flag == 'put')                             "
      "    k * e^(-r * t) * ncdf(-d2) - s * ncdf(-d1);              "
      "                                                             ";

   const std::string bsm_model_program_opt1 =
      " var v_sqrtt := (v * sqrt(t));                               "
      " var d1   := (log(s / k) + (r + v * v / 2) * t) / v_sqrtt;   "
      " var d2   := d1 - v_sqrtt;                                   "
      " var kert := k * exp(-r * t);                                "
      "                                                             "
      " if (callput_flag == 'call')                                 "
      "    s * ncdf(d1) - kert * ncdf(d2);                          "
      " else if (callput_flag == 'put')                             "
      "    kert * ncdf(-d2) - s * ncdf(-d1);                        "
      "                                                             ";

   const std::string bsm_model_program_opt2 =
      " var v_sqrtt := (v * sqrt(t));                               "
      " var d1   := (log(s / k) + (r + v * v / 2) * t) / v_sqrtt;   "
      " var d2   := d1 - v_sqrtt;                                   "
      "                                                             "
      " if (callput_flag == 'call')                                 "
      "    s * ncdf(d1) - (k * exp(-r * t)) * ncdf(d2);             "
      " else if (callput_flag == 'put')                             "
      "    (k * exp(-r * t)) * ncdf(-d2) - s * ncdf(-d1);           "
      "                                                             ";

   const std::string bsm_model_program_opt3 =
      " if (callput_flag == 'call')                                 "
      "    call_bsm_model(s, k, t, r, v);                           "
      " else if (callput_flag == 'put')                             "
      "    put_bsm_model(s, k, t, r, v);                            "
      "                                                             ";

   bsm_parameters<T> parameters;

   std::string callput_flag;

   static const T e = exprtk::details::numeric::constant::e;

   symbol_table_t symbol_table;
   symbol_table.add_variable ( "s", parameters.s );
   symbol_table.add_variable ( "k", parameters.k );
   symbol_table.add_variable ( "t", parameters.t );
   symbol_table.add_variable ( "r", parameters.r );
   symbol_table.add_variable ( "v", parameters.v );
   symbol_table.add_constant ( "e", e            );
   symbol_table.add_stringvar( "callput_flag"  , callput_flag   );
   symbol_table.add_function ( "call_bsm_model", call_bsm_model );
   symbol_table.add_function ( "put_bsm_model" , put_bsm_model  );

   expression_t bsm_expression     (symbol_table);
   expression_t bsm_expression_opt1(symbol_table);
   expression_t bsm_expression_opt2(symbol_table);
   expression_t bsm_expression_opt3(symbol_table);

   parser_t parser;

   parser.compile(bsm_model_program     , bsm_expression     );
   parser.compile(bsm_model_program_opt1, bsm_expression_opt1);
   parser.compile(bsm_model_program_opt2, bsm_expression_opt2);
   parser.compile(bsm_model_program_opt3, bsm_expression_opt3);

   {
      exprtk::timer timer;
      timer.start();

      T total = T(0);

      for (std::size_t i = 0; i < rounds; ++i)
      {
         const bsm_parameters<T>& current_parameters = bsm_list[i % bsm_list_size];

         parameters = current_parameters;

         callput_flag = "call";
         total += bsm_expression.value();

         callput_flag = "put";
         total += bsm_expression.value();
      }

      timer.stop();

      printf("[exprtk0] Total: %13.5f Time:%6.3fsec Rate:%13.3fbsm/sec execrt: %6.3fns\n",
             total,
             timer.time(),
             (2.0 * rounds) / timer.time(),
             1e9 / ((2.0 * rounds) / timer.time()));
   }

   {
      exprtk::timer timer;
      timer.start();

      T total = T(0);

      for (std::size_t i = 0; i < rounds; ++i)
      {
         const bsm_parameters<T>& current_parameters = bsm_list[i % bsm_list_size];

         parameters = current_parameters;

         callput_flag = "call";
         total += bsm_expression_opt1.value();

         callput_flag = "put";
         total += bsm_expression_opt1.value();
      }

      timer.stop();

      printf("[exprtk1] Total: %13.5f Time:%6.3fsec Rate:%13.3fbsm/sec execrt: %6.3fns\n",
             total,
             timer.time(),
             (2.0 * rounds) / timer.time(),
             1e9 / ((2.0 * rounds) / timer.time()));
   }

   {
      exprtk::timer timer;
      timer.start();

      T total = T(0);

      for (std::size_t i = 0; i < rounds; ++i)
      {
         const bsm_parameters<T>& current_parameters = bsm_list[i % bsm_list_size];

         parameters = current_parameters;

         callput_flag = "call";
         total += bsm_expression_opt2.value();

         callput_flag = "put";
         total += bsm_expression_opt2.value();
      }

      timer.stop();

      printf("[exprtk2] Total: %13.5f Time:%6.3fsec Rate:%13.3fbsm/sec execrt: %6.3fns\n",
             total,
             timer.time(),
             (2.0 * rounds) / timer.time(),
             1e9 / ((2.0 * rounds) / timer.time()));
   }

   {
      exprtk::timer timer;
      timer.start();

      T total = T(0);

      for (std::size_t i = 0; i < rounds; ++i)
      {
         const bsm_parameters<T>& current_parameters = bsm_list[i % bsm_list_size];

         parameters = current_parameters;

         callput_flag = "call";
         total += bsm_expression_opt3.value();

         callput_flag = "put";
         total += bsm_expression_opt3.value();
      }

      timer.stop();

      printf("[exprtk3] Total: %13.5f Time:%6.3fsec Rate:%13.3fbsm/sec execrt: %6.3fns\n",
             total,
             timer.time(),
             (2.0 * rounds) / timer.time(),
             1e9 / ((2.0 * rounds) / timer.time()));
   }
}

// Assembly:
subq $0xfa8, %rsp            # imm = 0xFA8
leaq 0xf87(%rsp), %rdi
movq %rdi, 0x140(%rsp)
callq 0x111650
movq 0x140(%rsp), %rdx
leaq 0x333d1e(%rip), %rsi    # 0x44c559
leaq 0xf88(%rsp), %rdi
callq 0x118750
jmp 0x11884a
leaq 0xf87(%rsp), %rdi
callq 0x111770
leaq 0xf4f(%rsp), %rdi
movq %rdi, 0x138(%rsp)
callq 0x111650
movq 0x138(%rsp), %rdx
leaq 0x333ec7(%rip), %rsi    # 0x44c742
leaq 0xf50(%rsp), %rdi
callq 0x118750
jmp 0x11888a
leaq 0xf4f(%rsp), %rdi
callq 0x111770
leaq 0xf27(%rsp), %rdi
movq %rdi, 0x130(%rsp)
callq 0x111650
movq 0x130(%rsp), %rdx
leaq 0x3340ea(%rip), %rsi    # 0x44c9a5
leaq 0xf28(%rsp), %rdi
callq 0x118750
jmp 0x1188ca
leaq 0xf27(%rsp), %rdi
callq 0x111770
leaq 0xeff(%rsp), %rdi
movq %rdi, 0x128(%rsp)
callq 0x111650
movq 0x128(%rsp), %rdx
leaq 0x3342d0(%rip), %rsi    # 0x44cbcb
leaq 0xf00(%rsp), %rdi
callq 0x118750
jmp 0x11890a
leaq 0xeff(%rsp), %rdi
callq 0x111770
leaq 0xeb0(%rsp), %rdi
callq 0x111260
leaq 0xea8(%rsp), %rdi
movl $0x1, %esi
callq 0x11a050
jmp 0x118938
leaq 0xe87(%rsp), %rdi
movq %rdi, 0x120(%rsp)
callq 0x111650
movq 0x120(%rsp), %rdx
leaq 0x333aad(%rip), %rsi    # 0x44c409
leaq 0xe88(%rsp), %rdi
callq 0x118750
jmp 0x11896b
leaq 0xea8(%rsp), %rdi
leaq 0xe88(%rsp), %rsi
leaq 0xed0(%rsp), %rdx
xorl %ecx, %ecx
callq 0x11a090
jmp 0x11898c
leaq 0xe88(%rsp), %rdi
callq 0x111788
leaq 0xe87(%rsp), %rdi
callq 0x111770
leaq 0xe5f(%rsp), %rdi
movq %rdi, 0x118(%rsp)
callq 0x111650
movq 0x118(%rsp), %rdx
leaq 0x3339d2(%rip), %rsi    # 0x44c39c
leaq 0xe60(%rsp), %rdi
callq 0x118750
jmp 0x1189d9
leaq 0xed8(%rsp), %rdx
leaq 0xea8(%rsp), %rdi
leaq 0xe60(%rsp), %rsi
xorl %ecx, %ecx
callq 0x11a090
jmp 0x1189fa
leaq 0xe60(%rsp), %rdi
callq 0x111788
leaq 0xe5f(%rsp), %rdi
callq 0x111770
leaq 0xe37(%rsp), %rdi
movq %rdi, 0x110(%rsp)
callq 0x111650
movq 0x110(%rsp), %rdx
leaq 0x334aac(%rip), %rsi    # 0x44d4e4
leaq 0xe38(%rsp), %rdi
callq 0x118750
jmp 0x118a47
leaq 0xee8(%rsp), %rdx
leaq 0xea8(%rsp), %rdi
leaq 0xe38(%rsp), %rsi
xorl %ecx, %ecx
callq 0x11a090
jmp 0x118a68
leaq 0xe38(%rsp), %rdi
callq 0x111788
leaq 0xe37(%rsp), %rdi
callq 0x111770
leaq 0xe0f(%rsp), %rdi
movq %rdi, 0x108(%rsp)
callq 0x111650
movq 0x108(%rsp), %rdx
leaq 0x33394e(%rip), %rsi    # 0x44c3f4
leaq 0xe10(%rsp), %rdi
callq 0x118750
jmp 0x118ab5
leaq 0xef0(%rsp), %rdx
leaq 0xea8(%rsp), %rdi
leaq 0xe10(%rsp), %rsi
xorl %ecx, %ecx
callq 0x11a090
jmp 0x118ad6
leaq 0xe10(%rsp), %rdi
callq 0x111788
leaq 0xe0f(%rsp), %rdi
callq 0x111770
leaq 0xde7(%rsp), %rdi
movq %rdi, 0x100(%rsp)
callq 0x111650
movq 0x100(%rsp), %rdx
leaq 0x3341e9(%rip), %rsi    # 0x44ccfd
leaq 0xde8(%rsp), %rdi
callq 0x118750
jmp 0x118b23
leaq 0xee0(%rsp), %rdx
leaq 0xea8(%rsp), %rdi
leaq 0xde8(%rsp), %rsi
xorl %ecx, %ecx
callq 0x11a090
jmp 0x118b44
leaq 0xde8(%rsp), %rdi
callq 0x111788
leaq 0xde7(%rsp), %rdi
callq 0x111770
leaq 0xdbf(%rsp), %rdi
movq %rdi, 0xf8(%rsp)
callq 0x111650
movq 0xf8(%rsp), %rdx
leaq 0x335054(%rip), %rsi    # 0x44dbd6
leaq 0xdc0(%rsp), %rdi
callq 0x118750
jmp 0x118b91
leaq 0x338e18(%rip), %rdx    # 0x4519b0
leaq 0xea8(%rsp), %rdi
leaq 0xdc0(%rsp), %rsi
callq 0x11a140
jmp 0x118baf
leaq 0xdc0(%rsp), %rdi
callq 0x111788
leaq 0xdbf(%rsp), %rdi
callq 0x111770
leaq 0xd97(%rsp), %rdi
movq %rdi, 0xf0(%rsp)
callq 0x111650
movq 0xf0(%rsp), %rdx
leaq 0x334112(%rip), %rsi    # 0x44ccff
leaq 0xd98(%rsp), %rdi
callq 0x118750
jmp 0x118bfc
leaq 0xea8(%rsp), %rdi
leaq 0xd98(%rsp), %rsi
leaq 0xeb0(%rsp), %rdx
xorl %ecx, %ecx
callq 0x11a220
jmp 0x118c1d
leaq 0xd98(%rsp), %rdi
callq 0x111788
leaq 0xd97(%rsp), %rdi
callq 0x111770
leaq 0xd6f(%rsp), %rdi
movq %rdi, 0xe8(%rsp)
callq 0x111650
movq 0xe8(%rsp), %rdx
leaq 0x3340b1(%rip), %rsi    # 0x44cd0c
leaq 0xd70(%rsp), %rdi
callq 0x118750
jmp 0x118c6a
leaq 0x179f(%rip), %rdx      # 0x11a410
leaq 0xea8(%rsp), %rdi
leaq 0xd70(%rsp), %rsi
callq 0x11a2e0
jmp 0x118c88
leaq 0xd70(%rsp), %rdi
callq 0x111788
leaq 0xd6f(%rsp), %rdi
callq 0x111770
leaq 0xd47(%rsp), %rdi
movq %rdi, 0xe0(%rsp)
callq 0x111650
movq 0xe0(%rsp), %rdx
leaq 0x334055(%rip), %rsi    # 0x44cd1b
leaq 0xd48(%rsp), %rdi
callq 0x118750
jmp 0x118cd5
leaq 0x18e4(%rip), %rdx      # 0x11a5c0
leaq 0xea8(%rsp), %rdi
leaq 0xd48(%rsp), %rsi
callq 0x11a2e0
jmp 0x118cf3
leaq 0xd48(%rsp), %rdi
callq 0x111788
leaq 0xd47(%rsp), %rdi
callq 0x111770
leaq 0xd20(%rsp), %rdi
leaq 0xea8(%rsp), %rsi
callq 0x11a790
jmp 0x118d24
leaq 0xd00(%rsp), %rdi
leaq 0xea8(%rsp), %rsi
callq 0x11a790
jmp 0x118d3b
leaq 0xce0(%rsp), %rdi
leaq 0xea8(%rsp), %rsi
callq 0x11a790
jmp 0x118d52
leaq 0xcc0(%rsp), %rdi
leaq 0xea8(%rsp), %rsi
callq 0x11a790
jmp 0x118d69
leaq 0x248(%rsp), %rdi
movl $0x7f, %esi
callq 0x11a850
jmp 0x118d7d
leaq 0x398(%rsp), %rdi
leaq 0x248(%rsp), %rsi
callq 0x11a980
jmp 0x118d94
leaq 0x248(%rsp), %rdi
callq 0x11b1b0
leaq 0x398(%rsp), %rdi
leaq 0xf88(%rsp), %rsi
leaq 0xd20(%rsp), %rdx
callq 0x11b220
jmp 0x118dc0
leaq 0x398(%rsp), %rdi
leaq 0xf50(%rsp), %rsi
leaq 0xd00(%rsp), %rdx
callq 0x11b220
jmp 0x118ddf
leaq 0x398(%rsp), %rdi
leaq 0xf28(%rsp), %rsi
leaq 0xce0(%rsp), %rdx
callq 0x11b220
jmp 0x118dfe
leaq 0x398(%rsp), %rdi
leaq 0xf00(%rsp), %rsi
leaq 0xcc0(%rsp), %rdx
callq 0x11b220
jmp 0x118e1d
leaq 0x220(%rsp), %rdi
callq 0x11bab0
jmp 0x118e2c
leaq 0x220(%rsp), %rdi
callq 0x11bae0
jmp 0x118e3b
xorps %xmm0, %xmm0
movsd %xmm0, 0x218(%rsp)
movq $0x0, 0x210(%rsp)
cmpq $0x1312d00, 0x210(%rsp) # imm = 0x1312D00
jae 0x11936c
movq 0x210(%rsp), %rax
andl $0xf, %eax
leaq (%rax,%rax,4), %rcx
leaq 0x338b45(%rip), %rax    # 0x4519c0
leaq (%rax,%rcx,8), %rax
movq %rax, 0x208(%rsp)
movq 0x208(%rsp), %rax
movq 0x20(%rax), %rcx
movq %rcx, 0xef0(%rsp)
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movaps %xmm1, 0xee0(%rsp)
movaps %xmm0, 0xed0(%rsp)
leaq 0x3378b5(%rip), %rsi    # 0x45076e
leaq 0xeb0(%rsp), %rdi
callq 0x1112e0
jmp 0x118ec8
leaq 0xd20(%rsp), %rdi
callq 0x11bb00
movsd %xmm0, 0xd8(%rsp)
jmp 0x118ee0
movsd 0xd8(%rsp), %xmm1
movsd 0x218(%rsp), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x218(%rsp)
leaq 0x333e23(%rip), %rsi    # 0x44cd29
leaq 0xeb0(%rsp), %rdi
callq 0x1112e0
jmp 0x118f15
leaq 0xd20(%rsp), %rdi
callq 0x11bb00
movsd %xmm0, 0xd0(%rsp)
jmp 0x118f2d
movsd 0xd0(%rsp), %xmm0
addsd 0x218(%rsp), %xmm0
movsd %xmm0, 0x218(%rsp)
movq 0x210(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x210(%rsp)
jmp 0x118e53
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xf87(%rsp), %rdi
callq 0x111770
jmp 0x119b3b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xf4f(%rsp), %rdi
callq 0x111770
jmp 0x119b2e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xf27(%rsp), %rdi
callq 0x111770
jmp 0x119b21
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xeff(%rsp), %rdi
callq 0x111770
jmp 0x119b14
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119afa
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119049
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xe88(%rsp), %rdi
callq 0x111788
leaq 0xe87(%rsp), %rdi
callq 0x111770
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119092
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xe60(%rsp), %rdi
callq 0x111788
leaq 0xe5f(%rsp), %rdi
callq 0x111770
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x1190db
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xe38(%rsp), %rdi
callq 0x111788
leaq 0xe37(%rsp), %rdi
callq 0x111770
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119124
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xe10(%rsp), %rdi
callq 0x111788
leaq 0xe0f(%rsp), %rdi
callq 0x111770
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x11916d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xde8(%rsp), %rdi
callq 0x111788
leaq 0xde7(%rsp), %rdi
callq 0x111770
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x1191b6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xdc0(%rsp), %rdi
callq 0x111788
leaq 0xdbf(%rsp), %rdi
callq 0x111770
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x1191ff
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xd98(%rsp), %rdi
callq 0x111788
leaq 0xd97(%rsp), %rdi
callq 0x111770
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119248
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xd70(%rsp), %rdi
callq 0x111788
leaq 0xd6f(%rsp), %rdi
callq 0x111770
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119291
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0xd48(%rsp), %rdi
callq 0x111788
leaq 0xd47(%rsp), %rdi
callq 0x111770
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119aed
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119ae0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119ad3
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119ac6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
jmp 0x119ab9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0x248(%rsp), %rdi
callq 0x11b1b0
jmp 0x119ab9
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0xf78(%rsp)
movl %eax, 0xf74(%rsp)
leaq 0x398(%rsp), %rdi
callq 0x11bba0
jmp 0x119ab9
leaq 0x220(%rsp), %rdi
callq 0x11bb20
jmp 0x11937b
movsd 0x218(%rsp), %xmm0
movsd %xmm0, 0xc0(%rsp)
leaq 0x220(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0xc8(%rsp)
jmp 0x1193a5
leaq 0x220(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0xb8(%rsp)
jmp 0x1193bd
movsd 0xb8(%rsp), %xmm1
movsd 0x32dc3a(%rip), %xmm0   # 0x447008
divsd %xmm1, %xmm0
movsd %xmm0, 0xa8(%rsp)
leaq 0x220(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0xb0(%rsp)
jmp 0x1193f3
movsd 0xa8(%rsp), %xmm2
movsd 0xc8(%rsp), %xmm1
movsd 0xc0(%rsp), %xmm0
movsd 0xb0(%rsp), %xmm3
movsd 0x32dbe9(%rip), %xmm4   # 0x447008
divsd %xmm3, %xmm4
movsd 0x32dbe5(%rip), %xmm3   # 0x447010
divsd %xmm4, %xmm3
leaq 0x3338f7(%rip), %rdi    # 0x44cd2d
movb $0x4, %al
callq 0x111080
jmp 0x11943f
leaq 0x1e0(%rsp), %rdi
callq 0x11bab0
jmp 0x11944e
leaq 0x1e0(%rsp), %rdi
callq 0x11bae0
jmp 0x11945d
xorps %xmm0, %xmm0
movsd %xmm0, 0x1d8(%rsp)
movq $0x0, 0x1d0(%rsp)
cmpq $0x1312d00, 0x1d0(%rsp) # imm = 0x1312D00
jae 0x119583
movq 0x1d0(%rsp), %rax
andl $0xf, %eax
leaq (%rax,%rax,4), %rcx
leaq 0x338523(%rip), %rax    # 0x4519c0
leaq (%rax,%rcx,8), %rax
movq %rax, 0x1c8(%rsp)
movq 0x1c8(%rsp), %rax
movq 0x20(%rax), %rcx
movq %rcx, 0xef0(%rsp)
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movaps %xmm1, 0xee0(%rsp)
movaps %xmm0, 0xed0(%rsp)
leaq 0x337293(%rip), %rsi    # 0x45076e
leaq 0xeb0(%rsp), %rdi
callq 0x1112e0
jmp 0x1194ea
leaq 0xd00(%rsp), %rdi
callq 0x11bb00
movsd %xmm0, 0xa0(%rsp)
jmp 0x119502
movsd 0xa0(%rsp), %xmm1
movsd 0x1d8(%rsp), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x1d8(%rsp)
leaq 0x333801(%rip), %rsi    # 0x44cd29
leaq 0xeb0(%rsp), %rdi
callq 0x1112e0
jmp 0x119537
leaq 0xd00(%rsp), %rdi
callq 0x11bb00
movsd %xmm0, 0x98(%rsp)
jmp 0x11954f
movsd 0x98(%rsp), %xmm0
addsd 0x1d8(%rsp), %xmm0
movsd %xmm0, 0x1d8(%rsp)
movq 0x1d0(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x1d0(%rsp)
jmp 0x119475
leaq 0x1e0(%rsp), %rdi
callq 0x11bb20
jmp 0x119592
movsd 0x1d8(%rsp), %xmm0
movsd %xmm0, 0x88(%rsp)
leaq 0x1e0(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0x90(%rsp)
jmp 0x1195bc
leaq 0x1e0(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0x80(%rsp)
jmp 0x1195d4
movsd 0x80(%rsp), %xmm1
movsd 0x32da23(%rip), %xmm0   # 0x447008
divsd %xmm1, %xmm0
movsd %xmm0, 0x70(%rsp)
leaq 0x1e0(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0x78(%rsp)
jmp 0x119604
movsd 0x70(%rsp), %xmm2
movsd 0x90(%rsp), %xmm1
movsd 0x88(%rsp), %xmm0
movsd 0x78(%rsp), %xmm3
movsd 0x32d9de(%rip), %xmm4   # 0x447008
divsd %xmm3, %xmm4
movsd 0x32d9da(%rip), %xmm3   # 0x447010
divsd %xmm4, %xmm3
leaq 0x333736(%rip), %rdi    # 0x44cd77
movb $0x4, %al
callq 0x111080
jmp 0x11964a
leaq 0x1a0(%rsp), %rdi
callq 0x11bab0
jmp 0x119659
leaq 0x1a0(%rsp), %rdi
callq 0x11bae0
jmp 0x119668
xorps %xmm0, %xmm0
movsd %xmm0, 0x198(%rsp)
movq $0x0, 0x190(%rsp)
cmpq $0x1312d00, 0x190(%rsp) # imm = 0x1312D00
jae 0x119782
movq 0x190(%rsp), %rax
andl $0xf, %eax
leaq (%rax,%rax,4), %rcx
leaq 0x338318(%rip), %rax    # 0x4519c0
leaq (%rax,%rcx,8), %rax
movq %rax, 0x188(%rsp)
movq 0x188(%rsp), %rax
movq 0x20(%rax), %rcx
movq %rcx, 0xef0(%rsp)
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movaps %xmm1, 0xee0(%rsp)
movaps %xmm0, 0xed0(%rsp)
leaq 0x337088(%rip), %rsi    # 0x45076e
leaq 0xeb0(%rsp), %rdi
callq 0x1112e0
jmp 0x1196f5
leaq 0xce0(%rsp), %rdi
callq 0x11bb00
movsd %xmm0, 0x68(%rsp)
jmp 0x11970a
movsd 0x68(%rsp), %xmm1
movsd 0x198(%rsp), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x198(%rsp)
leaq 0x3335fc(%rip), %rsi    # 0x44cd29
leaq 0xeb0(%rsp), %rdi
callq 0x1112e0
jmp 0x11973c
leaq 0xce0(%rsp), %rdi
callq 0x11bb00
movsd %xmm0, 0x60(%rsp)
jmp 0x119751
movsd 0x60(%rsp), %xmm0
addsd 0x198(%rsp), %xmm0
movsd %xmm0, 0x198(%rsp)
movq 0x190(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x190(%rsp)
jmp 0x119680
leaq 0x1a0(%rsp), %rdi
callq 0x11bb20
jmp 0x119791
movsd 0x198(%rsp), %xmm0
movsd %xmm0, 0x50(%rsp)
leaq 0x1a0(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0x58(%rsp)
jmp 0x1197b5
leaq 0x1a0(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0x48(%rsp)
jmp 0x1197ca
movsd 0x48(%rsp), %xmm1
movsd 0x32d830(%rip), %xmm0   # 0x447008
divsd %xmm1, %xmm0
movsd %xmm0, 0x38(%rsp)
leaq 0x1a0(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0x40(%rsp)
jmp 0x1197f7
movsd 0x38(%rsp), %xmm2
movsd 0x58(%rsp), %xmm1
movsd 0x50(%rsp), %xmm0
movsd 0x40(%rsp), %xmm3
movsd 0x32d7f1(%rip), %xmm4   # 0x447008
divsd %xmm3, %xmm4
movsd 0x32d7ed(%rip), %xmm3   # 0x447010
divsd %xmm4, %xmm3
leaq 0x333593(%rip), %rdi    # 0x44cdc1
movb $0x4, %al
callq 0x111080
jmp 0x119837
leaq 0x160(%rsp), %rdi
callq 0x11bab0
jmp 0x119846
leaq 0x160(%rsp), %rdi
callq 0x11bae0
jmp 0x119855
xorps %xmm0, %xmm0
movsd %xmm0, 0x158(%rsp)
movq $0x0, 0x150(%rsp)
cmpq $0x1312d00, 0x150(%rsp) # imm = 0x1312D00
jae 0x11996f
movq 0x150(%rsp), %rax
andl $0xf, %eax
leaq (%rax,%rax,4), %rcx
leaq 0x33812b(%rip), %rax    # 0x4519c0
leaq (%rax,%rcx,8), %rax
movq %rax, 0x148(%rsp)
movq 0x148(%rsp), %rax
movq 0x20(%rax), %rcx
movq %rcx, 0xef0(%rsp)
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movaps %xmm1, 0xee0(%rsp)
movaps %xmm0, 0xed0(%rsp)
leaq 0x336e9b(%rip), %rsi    # 0x45076e
leaq 0xeb0(%rsp), %rdi
callq 0x1112e0
jmp 0x1198e2
leaq 0xcc0(%rsp), %rdi
callq 0x11bb00
movsd %xmm0, 0x30(%rsp)
jmp 0x1198f7
movsd 0x30(%rsp), %xmm1
movsd 0x158(%rsp), %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, 0x158(%rsp)
leaq 0x33340f(%rip), %rsi    # 0x44cd29
leaq 0xeb0(%rsp), %rdi
callq 0x1112e0
jmp 0x119929
leaq 0xcc0(%rsp), %rdi
callq 0x11bb00
movsd %xmm0, 0x28(%rsp)
jmp 0x11993e
movsd 0x28(%rsp), %xmm0
addsd 0x158(%rsp), %xmm0
movsd %xmm0, 0x158(%rsp)
movq 0x150(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x150(%rsp)
jmp 0x11986d
leaq 0x160(%rsp), %rdi
callq 0x11bb20
jmp 0x11997e
movsd 0x158(%rsp), %xmm0
movsd %xmm0, 0x18(%rsp)
leaq 0x160(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0x20(%rsp)
jmp 0x1199a2
leaq 0x160(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0x10(%rsp)
jmp 0x1199b7
movsd 0x10(%rsp), %xmm1
movsd 0x32d643(%rip), %xmm0   # 0x447008
divsd %xmm1, %xmm0
movsd %xmm0, (%rsp)
leaq 0x160(%rsp), %rdi
callq 0x11bb50
movsd %xmm0, 0x8(%rsp)
jmp 0x1199e3
movsd (%rsp), %xmm2
movsd 0x20(%rsp), %xmm1
movsd 0x18(%rsp), %xmm0
movsd 0x8(%rsp), %xmm3
movsd 0x32d606(%rip), %xmm4   # 0x447008
divsd %xmm3, %xmm4
movsd 0x32d602(%rip), %xmm3   # 0x447010
divsd %xmm4, %xmm3
leaq 0x3333f2(%rip), %rdi    # 0x44ce0b
movb $0x4, %al
callq 0x111080
jmp 0x119a22
leaq 0x398(%rsp), %rdi
callq 0x11bba0
leaq 0xcc0(%rsp), %rdi
callq 0x11bda0
leaq 0xce0(%rsp), %rdi
callq 0x11bda0
leaq 0xd00(%rsp), %rdi
callq 0x11bda0
leaq 0xd20(%rsp), %rdi
callq 0x11bda0
leaq 0xea8(%rsp), %rdi
callq 0x11bde0
leaq 0xeb0(%rsp), %rdi
callq 0x111788
leaq 0xf00(%rsp), %rdi
callq 0x111788
leaq 0xf28(%rsp), %rdi
callq 0x111788
leaq 0xf50(%rsp), %rdi
callq 0x111788
leaq 0xf88(%rsp), %rdi
callq 0x111788
addq $0xfa8, %rsp            # imm = 0xFA8
retq
leaq 0xcc0(%rsp), %rdi
callq 0x11bda0
leaq 0xce0(%rsp), %rdi
callq 0x11bda0
leaq 0xd00(%rsp), %rdi
callq 0x11bda0
leaq 0xd20(%rsp), %rdi
callq 0x11bda0
leaq 0xea8(%rsp), %rdi
callq 0x11bde0
leaq 0xeb0(%rsp), %rdi
callq 0x111788
leaq 0xf00(%rsp), %rdi
callq 0x111788
leaq 0xf28(%rsp), %rdi
callq 0x111788
leaq 0xf50(%rsp), %rdi
callq 0x111788
leaq 0xf88(%rsp), %rdi
callq 0x111788
movq 0xf78(%rsp), %rdi
callq 0x111450
nopl (%rax,%rax)