// File: canzarlab[P]Trajan/./Eigen/src/Core/products/TriangularSolverMatrix.h
// Function: Eigen::internal::triangular_solve_matrix<double, long, 2, 2, false, 1, 0>::run(long, long, double const*, long, double*, long, Eigen::internal::level3_blocking<double, double>&)
EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor>::run(
    Index size, Index otherSize,
    const Scalar* _tri, Index triStride,
    Scalar* _other, Index otherStride,
    level3_blocking<Scalar,Scalar>& blocking)
  {
    Index rows = otherSize;
    typedef typename NumTraits<Scalar>::Real RealScalar;

    typedef blas_data_mapper<Scalar, Index, ColMajor> LhsMapper;
    typedef const_blas_data_mapper<Scalar, Index, TriStorageOrder> RhsMapper;
    LhsMapper lhs(_other, otherStride);
    RhsMapper rhs(_tri, triStride);

    typedef gebp_traits<Scalar,Scalar> Traits;
    enum {
      RhsStorageOrder   = TriStorageOrder,
      SmallPanelWidth   = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),
      IsLower = (Mode&Lower) == Lower
    };

    Index kc = blocking.kc();                   // cache block size along the K direction
    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction

    std::size_t sizeA = kc*mc;
    std::size_t sizeB = kc*size;

    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());

    conj_if<Conjugate> conj;
    gebp_kernel<Scalar, Scalar, Index, LhsMapper, Traits::mr, Traits::nr, false, Conjugate> gebp_kernel;
    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder> pack_rhs;
    gemm_pack_rhs<Scalar, Index, RhsMapper, Traits::nr, RhsStorageOrder,false,true> pack_rhs_panel;
    gemm_pack_lhs<Scalar, Index, LhsMapper, Traits::mr, Traits::LhsProgress, ColMajor, false, true> pack_lhs_panel;

    for(Index k2=IsLower ? size : 0;
        IsLower ? k2>0 : k2<size;
        IsLower ? k2-=kc : k2+=kc)
    {
      const Index actual_kc = (std::min)(IsLower ? k2 : size-k2, kc);
      Index actual_k2 = IsLower ? k2-actual_kc : k2 ;

      Index startPanel = IsLower ? 0 : k2+actual_kc;
      Index rs = IsLower ? actual_k2 : size - actual_k2 - actual_kc;
      Scalar* geb = blockB+actual_kc*actual_kc;

      if (rs>0) pack_rhs(geb, rhs.getSubMapper(actual_k2,startPanel), actual_kc, rs);

      // triangular packing (we only pack the panels off the diagonal,
      // neglecting the blocks overlapping the diagonal
      {
        for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)
        {
          Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
          Index actual_j2 = actual_k2 + j2;
          Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
          Index panelLength = IsLower ? actual_kc-j2-actualPanelWidth : j2;

          if (panelLength>0)
          pack_rhs_panel(blockB+j2*actual_kc,
                         rhs.getSubMapper(actual_k2+panelOffset, actual_j2),
                         panelLength, actualPanelWidth,
                         actual_kc, panelOffset);
        }
      }

      for(Index i2=0; i2<rows; i2+=mc)
      {
        const Index actual_mc = (std::min)(mc,rows-i2);

        // triangular solver kernel
        {
          // for each small block of the diagonal (=> vertical panels of rhs)
          for (Index j2 = IsLower
                      ? (actual_kc - ((actual_kc%SmallPanelWidth) ? Index(actual_kc%SmallPanelWidth)
                                                                  : Index(SmallPanelWidth)))
                      : 0;
               IsLower ? j2>=0 : j2<actual_kc;
               IsLower ? j2-=SmallPanelWidth : j2+=SmallPanelWidth)
          {
            Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
            Index absolute_j2 = actual_k2 + j2;
            Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
            Index panelLength = IsLower ? actual_kc - j2 - actualPanelWidth : j2;

            // GEBP
            if(panelLength>0)
            {
              gebp_kernel(lhs.getSubMapper(i2,absolute_j2),
                          blockA, blockB+j2*actual_kc,
                          actual_mc, panelLength, actualPanelWidth,
                          Scalar(-1),
                          actual_kc, actual_kc, // strides
                          panelOffset, panelOffset); // offsets
            }

            // unblocked triangular solve
            for (Index k=0; k<actualPanelWidth; ++k)
            {
              Index j = IsLower ? absolute_j2+actualPanelWidth-k-1 : absolute_j2+k;

              Scalar* r = &lhs(i2,j);
              for (Index k3=0; k3<k; ++k3)
              {
                Scalar b = conj(rhs(IsLower ? j+1+k3 : absolute_j2+k3,j));
                Scalar* a = &lhs(i2,IsLower ? j+1+k3 : absolute_j2+k3);
                for (Index i=0; i<actual_mc; ++i)
                  r[i] -= a[i] * b;
              }
              if((Mode & UnitDiag)==0)
              {
                Scalar inv_rjj = RealScalar(1)/conj(rhs(j,j));
                for (Index i=0; i<actual_mc; ++i)
                  r[i] *= inv_rjj;
              }
            }

            // pack the just computed part of lhs to A
            pack_lhs_panel(blockA, LhsMapper(_other+absolute_j2*otherStride+i2, otherStride),
                           actualPanelWidth, actual_mc,
                           actual_kc, j2);
          }
        }

        if (rs>0)
          gebp_kernel(lhs.getSubMapper(i2, startPanel), blockA, geb,
                      actual_mc, actual_kc, rs, Scalar(-1),
                      -1, -1, 0, 0);
      }
    }
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x520, %rsp            # imm = 0x520
movq 0x10(%rbp), %rax
movq %rdi, -0x268(%rbp)
movq %rsi, -0x270(%rbp)
movq %rdx, -0x278(%rbp)
movq %rcx, -0x280(%rbp)
movq %r8, -0x288(%rbp)
movq %r9, -0x290(%rbp)
movq -0x270(%rbp), %rax
movq %rax, -0x298(%rbp)
movq -0x288(%rbp), %rcx
movq -0x290(%rbp), %rax
leaq -0x2a8(%rbp), %rdx
movq %rdx, -0x1e0(%rbp)
movq %rcx, -0x1e8(%rbp)
movq %rax, -0x1f0(%rbp)
movq -0x1e0(%rbp), %rax
movq -0x1e8(%rbp), %rcx
movq %rcx, (%rax)
movq -0x1f0(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x278(%rbp), %rcx
movq -0x280(%rbp), %rax
leaq -0x2b8(%rbp), %rdx
movq %rdx, -0x240(%rbp)
movq %rcx, -0x248(%rbp)
movq %rax, -0x250(%rbp)
movq -0x240(%rbp), %rdx
movq -0x248(%rbp), %rcx
movq -0x250(%rbp), %rax
movq %rdx, -0x1f8(%rbp)
movq %rcx, -0x200(%rbp)
movq %rax, -0x208(%rbp)
movq -0x1f8(%rbp), %rax
movq -0x200(%rbp), %rcx
movq %rcx, (%rax)
movq -0x208(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq 0x10(%rbp), %rdi
callq 0x3a2b0
movq %rax, -0x2c0(%rbp)
movq 0x10(%rbp), %rdi
callq 0x3a2d0
movq %rax, -0x2d0(%rbp)
leaq -0x298(%rbp), %rdi
leaq -0x2d0(%rbp), %rsi
callq 0x2b810
movq (%rax), %rax
movq %rax, -0x2c8(%rbp)
movq -0x2c0(%rbp), %rax
imulq -0x2c8(%rbp), %rax
movq %rax, -0x2d8(%rbp)
movq -0x2c0(%rbp), %rax
imulq -0x268(%rbp), %rax
movq %rax, -0x2e0(%rbp)
movq -0x2d8(%rbp), %rax
movq %rax, -0x258(%rbp)
movabsq $0x1fffffffffffffff, %rax # imm = 0x1FFFFFFFFFFFFFFF
cmpq %rax, -0x258(%rbp)
jbe 0x6a1ac
callq 0x19700
movq 0x10(%rbp), %rdi
callq 0x3a320
cmpq $0x0, %rax
je 0x6a1cd
movq 0x10(%rbp), %rdi
callq 0x3a320
movq %rax, -0x498(%rbp)
jmp 0x6a236
movq -0x2d8(%rbp), %rax
shlq $0x3, %rax
cmpq $0x20000, %rax          # imm = 0x20000
ja 0x6a211
movq -0x2d8(%rbp), %rax
leaq 0x1e(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
addq $0x10, %rax
subq $0x1, %rax
andq $-0x10, %rax
movq %rax, -0x4a0(%rbp)
jmp 0x6a228
movq -0x2d8(%rbp), %rdi
shlq $0x3, %rdi
callq 0x197a0
movq %rax, -0x4a0(%rbp)
movq -0x4a0(%rbp), %rax
movq %rax, -0x498(%rbp)
movq -0x498(%rbp), %rax
movq %rax, -0x2e8(%rbp)
movq 0x10(%rbp), %rdi
callq 0x3a320
cmpq $0x0, %rax
jne 0x6a263
movq -0x2e8(%rbp), %rax
movq %rax, -0x4a8(%rbp)
jmp 0x6a26e
xorl %eax, %eax
movq %rax, -0x4a8(%rbp)
jmp 0x6a26e
movq -0x4a8(%rbp), %rsi
movq -0x2d8(%rbp), %rdx
movq -0x2d8(%rbp), %rax
shlq $0x3, %rax
cmpq $0x20000, %rax          # imm = 0x20000
seta %al
movzbl %al, %ecx
andl $0x1, %ecx
leaq -0x300(%rbp), %rdi
callq 0x2e590
movq -0x2e0(%rbp), %rax
movq %rax, -0x260(%rbp)
movabsq $0x1fffffffffffffff, %rax # imm = 0x1FFFFFFFFFFFFFFF
cmpq %rax, -0x260(%rbp)
jbe 0x6a2cc
callq 0x19700
jmp 0x6a2ca
jmp 0x6a2cc
jmp 0x6a2ce
movq 0x10(%rbp), %rdi
callq 0x3a340
cmpq $0x0, %rax
je 0x6a2ef
movq 0x10(%rbp), %rdi
callq 0x3a340
movq %rax, -0x4b0(%rbp)
jmp 0x6a36a
movq -0x2e0(%rbp), %rax
shlq $0x3, %rax
cmpq $0x20000, %rax          # imm = 0x20000
ja 0x6a333
movq -0x2e0(%rbp), %rax
leaq 0x1e(,%rax,8), %rcx
andq $-0x10, %rcx
movq %rsp, %rax
subq %rcx, %rax
movq %rax, %rsp
addq $0x10, %rax
subq $0x1, %rax
andq $-0x10, %rax
movq %rax, -0x4b8(%rbp)
jmp 0x6a35c
movq -0x2e0(%rbp), %rdi
shlq $0x3, %rdi
callq 0x197a0
movq %rax, -0x4c0(%rbp)
jmp 0x6a34c
movq -0x4c0(%rbp), %rax
movq %rax, -0x4b8(%rbp)
jmp 0x6a35c
movq -0x4b8(%rbp), %rax
movq %rax, -0x4b0(%rbp)
movq -0x4b0(%rbp), %rax
movq %rax, -0x318(%rbp)
movq 0x10(%rbp), %rdi
callq 0x3a340
cmpq $0x0, %rax
jne 0x6a397
movq -0x318(%rbp), %rax
movq %rax, -0x4c8(%rbp)
jmp 0x6a3a2
xorl %eax, %eax
movq %rax, -0x4c8(%rbp)
jmp 0x6a3a2
movq -0x4c8(%rbp), %rsi
movq -0x2e0(%rbp), %rdx
movq %rdx, %rax
shlq $0x3, %rax
subq $0x20001, %rax          # imm = 0x20001
setae %al
movzbl %al, %ecx
leaq -0x330(%rbp), %rdi
callq 0x2e590
jmp 0x6a3d1
movq $0x0, -0x340(%rbp)
movq -0x340(%rbp), %rax
cmpq -0x268(%rbp), %rax
jge 0x6afd8
movq -0x268(%rbp), %rax
subq -0x340(%rbp), %rax
movq %rax, -0x350(%rbp)
leaq -0x350(%rbp), %rdi
leaq -0x2c0(%rbp), %rsi
callq 0x2b810
movq (%rax), %rax
movq %rax, -0x348(%rbp)
movq -0x340(%rbp), %rax
movq %rax, -0x358(%rbp)
movq -0x340(%rbp), %rax
addq -0x348(%rbp), %rax
movq %rax, -0x360(%rbp)
movq -0x268(%rbp), %rax
subq -0x358(%rbp), %rax
subq -0x348(%rbp), %rax
movq %rax, -0x368(%rbp)
movq -0x318(%rbp), %rax
movq -0x348(%rbp), %rcx
imulq -0x348(%rbp), %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x370(%rbp)
cmpq $0x0, -0x368(%rbp)
jle 0x6a5e6
movq -0x370(%rbp), %rax
movq %rax, -0x4e0(%rbp)
movq -0x358(%rbp), %rcx
movq -0x360(%rbp), %rax
leaq -0x2b8(%rbp), %rdx
movq %rdx, -0x60(%rbp)
movq %rcx, -0x68(%rbp)
movq %rax, -0x70(%rbp)
movq -0x60(%rbp), %rax
movq -0x68(%rbp), %rdx
movq -0x70(%rbp), %rcx
movq %rax, -0x20(%rbp)
movq %rdx, -0x28(%rbp)
movq %rcx, -0x30(%rbp)
movq -0x20(%rbp), %rdi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rsi
movq (%rdi), %rcx
movq 0x8(%rdi), %rdi
imulq %rdi, %rsi
addq %rsi, %rdx
leaq (%rcx,%rdx,8), %rcx
movq 0x8(%rax), %rax
leaq -0x58(%rbp), %rdx
movq %rdx, -0x38(%rbp)
movq %rcx, -0x40(%rbp)
movq %rax, -0x48(%rbp)
movq -0x38(%rbp), %rdx
movq -0x40(%rbp), %rcx
movq -0x48(%rbp), %rax
movq %rdx, -0x8(%rbp)
movq %rcx, -0x10(%rbp)
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq -0x10(%rbp), %rcx
movq %rcx, (%rax)
movq -0x18(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x58(%rbp), %rax
movq %rax, -0x4d8(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x4d0(%rbp)
movq -0x4e0(%rbp), %rsi
movq -0x4d0(%rbp), %rax
movq -0x4d8(%rbp), %rcx
movq %rcx, -0x380(%rbp)
movq %rax, -0x378(%rbp)
movq -0x348(%rbp), %rcx
movq -0x368(%rbp), %r8
subq $0x10, %rsp
movq %rsp, %rax
movq $0x0, (%rax)
xorl %eax, %eax
movl %eax, %r9d
leaq -0x333(%rbp), %rdi
leaq -0x380(%rbp), %rdx
callq 0x41f70
addq $0x10, %rsp
jmp 0x6a5aa
jmp 0x6a5e6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x308(%rbp)
movl %eax, -0x30c(%rbp)
jmp 0x6aff5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x308(%rbp)
movl %eax, -0x30c(%rbp)
leaq -0x330(%rbp), %rdi
callq 0x30e60
jmp 0x6aff5
movq $0x0, -0x388(%rbp)
movq -0x388(%rbp), %rax
cmpq -0x348(%rbp), %rax
jge 0x6a81a
movq -0x348(%rbp), %rax
subq -0x388(%rbp), %rax
movq %rax, -0x398(%rbp)
movq $0x4, -0x3a0(%rbp)
leaq -0x398(%rbp), %rdi
leaq -0x3a0(%rbp), %rsi
callq 0x2b810
movq (%rax), %rax
movq %rax, -0x390(%rbp)
movq -0x358(%rbp), %rax
addq -0x388(%rbp), %rax
movq %rax, -0x3a8(%rbp)
movq $0x0, -0x3b0(%rbp)
movq -0x388(%rbp), %rax
movq %rax, -0x3b8(%rbp)
cmpq $0x0, -0x3b8(%rbp)
jle 0x6a801
movq -0x318(%rbp), %rax
movq -0x388(%rbp), %rcx
movq -0x348(%rbp), %rdx
imulq %rdx, %rcx
leaq (%rax,%rcx,8), %rax
movq %rax, -0x4f8(%rbp)
movq -0x358(%rbp), %rcx
movq -0x3b0(%rbp), %rax
addq %rax, %rcx
movq -0x3a8(%rbp), %rax
leaq -0x2b8(%rbp), %rdx
movq %rdx, -0xd0(%rbp)
movq %rcx, -0xd8(%rbp)
movq %rax, -0xe0(%rbp)
movq -0xd0(%rbp), %rax
movq -0xd8(%rbp), %rdx
movq -0xe0(%rbp), %rcx
movq %rax, -0x90(%rbp)
movq %rdx, -0x98(%rbp)
movq %rcx, -0xa0(%rbp)
movq -0x90(%rbp), %rdi
movq -0xa0(%rbp), %rdx
movq -0x98(%rbp), %rsi
movq (%rdi), %rcx
movq 0x8(%rdi), %rdi
imulq %rdi, %rsi
addq %rsi, %rdx
leaq (%rcx,%rdx,8), %rcx
movq 0x8(%rax), %rax
leaq -0xc8(%rbp), %rdx
movq %rdx, -0xa8(%rbp)
movq %rcx, -0xb0(%rbp)
movq %rax, -0xb8(%rbp)
movq -0xa8(%rbp), %rdx
movq -0xb0(%rbp), %rcx
movq -0xb8(%rbp), %rax
movq %rdx, -0x78(%rbp)
movq %rcx, -0x80(%rbp)
movq %rax, -0x88(%rbp)
movq -0x78(%rbp), %rax
movq -0x80(%rbp), %rcx
movq %rcx, (%rax)
movq -0x88(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0xc8(%rbp), %rax
movq %rax, -0x4f0(%rbp)
movq -0xc0(%rbp), %rax
movq %rax, -0x4e8(%rbp)
movq -0x4f8(%rbp), %rsi
movq -0x4e8(%rbp), %rax
movq -0x4f0(%rbp), %rcx
movq %rcx, -0x3c8(%rbp)
movq %rax, -0x3c0(%rbp)
movq -0x3b8(%rbp), %rcx
movq -0x390(%rbp), %r8
movq -0x348(%rbp), %r9
movq -0x3b0(%rbp), %rdx
subq $0x10, %rsp
movq %rsp, %rax
movq %rdx, (%rax)
leaq -0x334(%rbp), %rdi
leaq -0x3c8(%rbp), %rdx
callq 0x6b090
addq $0x10, %rsp
jmp 0x6a7ff
jmp 0x6a801
jmp 0x6a803
movq -0x388(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x388(%rbp)
jmp 0x6a5f1
movq $0x0, -0x3d0(%rbp)
movq -0x3d0(%rbp), %rax
cmpq -0x298(%rbp), %rax
jge 0x6afbc
movq -0x298(%rbp), %rax
subq -0x3d0(%rbp), %rax
movq %rax, -0x3e0(%rbp)
leaq -0x2c8(%rbp), %rdi
leaq -0x3e0(%rbp), %rsi
callq 0x2b810
movq (%rax), %rax
movq %rax, -0x3d8(%rbp)
movq $0x0, -0x3e8(%rbp)
movq -0x3e8(%rbp), %rax
cmpq -0x348(%rbp), %rax
jge 0x6ae33
movq -0x348(%rbp), %rax
subq -0x3e8(%rbp), %rax
movq %rax, -0x3f8(%rbp)
movq $0x4, -0x400(%rbp)
leaq -0x3f8(%rbp), %rdi
leaq -0x400(%rbp), %rsi
callq 0x2b810
movq (%rax), %rax
movq %rax, -0x3f0(%rbp)
movq -0x358(%rbp), %rax
addq -0x3e8(%rbp), %rax
movq %rax, -0x408(%rbp)
movq $0x0, -0x410(%rbp)
movq -0x3e8(%rbp), %rax
movq %rax, -0x418(%rbp)
cmpq $0x0, -0x418(%rbp)
jle 0x6aa6f
movq -0x3d0(%rbp), %rcx
movq -0x408(%rbp), %rax
leaq -0x2a8(%rbp), %rdx
movq %rdx, -0x170(%rbp)
movq %rcx, -0x178(%rbp)
movq %rax, -0x180(%rbp)
movq -0x170(%rbp), %rax
movq -0x178(%rbp), %rdx
movq -0x180(%rbp), %rcx
movq %rax, -0x130(%rbp)
movq %rdx, -0x138(%rbp)
movq %rcx, -0x140(%rbp)
movq -0x130(%rbp), %rdi
movq -0x138(%rbp), %rdx
movq -0x140(%rbp), %rsi
movq (%rdi), %rcx
movq 0x8(%rdi), %rdi
imulq %rdi, %rsi
addq %rsi, %rdx
leaq (%rcx,%rdx,8), %rcx
movq 0x8(%rax), %rax
leaq -0x168(%rbp), %rdx
movq %rdx, -0x148(%rbp)
movq %rcx, -0x150(%rbp)
movq %rax, -0x158(%rbp)
movq -0x148(%rbp), %rax
movq -0x150(%rbp), %rcx
movq %rcx, (%rax)
movq -0x158(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x168(%rbp), %rax
movq %rax, -0x508(%rbp)
movq -0x160(%rbp), %rax
movq %rax, -0x500(%rbp)
movq -0x500(%rbp), %rax
movq -0x508(%rbp), %rcx
movq %rcx, -0x428(%rbp)
movq %rax, -0x420(%rbp)
movq -0x2e8(%rbp), %rdx
movq -0x318(%rbp), %rax
movq -0x3e8(%rbp), %rcx
movq -0x348(%rbp), %rdi
imulq %rdi, %rcx
leaq (%rax,%rcx,8), %rcx
movq -0x3d8(%rbp), %r8
movq -0x418(%rbp), %r9
movq -0x3f0(%rbp), %rsi
movq -0x410(%rbp), %r10
subq $0x30, %rsp
movq %rsp, %rax
movq %r10, 0x20(%rax)
movq %r10, 0x18(%rax)
movq %rdi, 0x10(%rax)
movq %rdi, 0x8(%rax)
movq %rsi, (%rax)
leaq -0x332(%rbp), %rdi
leaq -0x428(%rbp), %rsi
movsd 0xa091e(%rip), %xmm0    # 0x10b380
callq 0x3af50
addq $0x30, %rsp
jmp 0x6aa6d
jmp 0x6aa6f
movq $0x0, -0x430(%rbp)
movq -0x430(%rbp), %rax
cmpq -0x3f0(%rbp), %rax
jge 0x6ad5c
movq -0x408(%rbp), %rax
addq -0x430(%rbp), %rax
movq %rax, -0x438(%rbp)
movq -0x3d0(%rbp), %rcx
movq -0x438(%rbp), %rax
leaq -0x2a8(%rbp), %rdx
movq %rdx, -0xe8(%rbp)
movq %rcx, -0xf0(%rbp)
movq %rax, -0xf8(%rbp)
movq -0xe8(%rbp), %rsi
movq (%rsi), %rax
movq -0xf0(%rbp), %rcx
movq -0xf8(%rbp), %rdx
imulq 0x8(%rsi), %rdx
addq %rdx, %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x440(%rbp)
movq $0x0, -0x448(%rbp)
movq -0x448(%rbp), %rax
cmpq -0x430(%rbp), %rax
jge 0x6ac83
movq -0x408(%rbp), %rcx
addq -0x448(%rbp), %rcx
movq -0x438(%rbp), %rax
leaq -0x2b8(%rbp), %rdx
movq %rdx, -0x210(%rbp)
movq %rcx, -0x218(%rbp)
movq %rax, -0x220(%rbp)
movq -0x210(%rbp), %rdx
movq (%rdx), %rsi
movq -0x220(%rbp), %rax
movq -0x218(%rbp), %rcx
imulq 0x8(%rdx), %rcx
addq %rcx, %rax
shlq $0x3, %rax
addq %rax, %rsi
leaq -0x331(%rbp), %rdi
callq 0x3f4c0
movsd (%rax), %xmm0
movsd %xmm0, -0x450(%rbp)
movq -0x3d0(%rbp), %rcx
movq -0x408(%rbp), %rax
addq -0x448(%rbp), %rax
leaq -0x2a8(%rbp), %rdx
movq %rdx, -0x100(%rbp)
movq %rcx, -0x108(%rbp)
movq %rax, -0x110(%rbp)
movq -0x100(%rbp), %rsi
movq (%rsi), %rax
movq -0x108(%rbp), %rcx
movq -0x110(%rbp), %rdx
imulq 0x8(%rsi), %rdx
addq %rdx, %rcx
shlq $0x3, %rcx
addq %rcx, %rax
movq %rax, -0x458(%rbp)
movq $0x0, -0x460(%rbp)
movq -0x460(%rbp), %rax
cmpq -0x3d8(%rbp), %rax
jge 0x6ac6a
movq -0x458(%rbp), %rax
movq -0x460(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movsd -0x450(%rbp), %xmm2
movq -0x440(%rbp), %rax
movq -0x460(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
movq %xmm0, %rdx
movabsq $-0x8000000000000000, %rsi # imm = 0x8000000000000000
xorq %rsi, %rdx
movq %rdx, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq -0x460(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x460(%rbp)
jmp 0x6abf4
jmp 0x6ac6c
movq -0x448(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x448(%rbp)
jmp 0x6ab06
movq -0x438(%rbp), %rcx
movq -0x438(%rbp), %rax
leaq -0x2b8(%rbp), %rdx
movq %rdx, -0x228(%rbp)
movq %rcx, -0x230(%rbp)
movq %rax, -0x238(%rbp)
movq -0x228(%rbp), %rdx
movq (%rdx), %rsi
movq -0x238(%rbp), %rax
movq -0x230(%rbp), %rcx
imulq 0x8(%rdx), %rcx
addq %rcx, %rax
shlq $0x3, %rax
addq %rax, %rsi
leaq -0x331(%rbp), %rdi
callq 0x3f4c0
movsd 0xa2f80(%rip), %xmm0    # 0x10dc68
divsd (%rax), %xmm0
movsd %xmm0, -0x468(%rbp)
movq $0x0, -0x470(%rbp)
movq -0x470(%rbp), %rax
cmpq -0x3d8(%rbp), %rax
jge 0x6ad43
movsd -0x468(%rbp), %xmm0
movq -0x440(%rbp), %rax
movq -0x470(%rbp), %rcx
mulsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
movq -0x470(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x470(%rbp)
jmp 0x6acff
jmp 0x6ad45
movq -0x430(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x430(%rbp)
jmp 0x6aa7a
movq -0x2e8(%rbp), %rax
movq %rax, -0x510(%rbp)
movq -0x288(%rbp), %rcx
movq -0x408(%rbp), %rax
imulq -0x290(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rcx
movq -0x3d0(%rbp), %rax
shlq $0x3, %rax
addq %rax, %rcx
movq -0x290(%rbp), %rax
leaq -0x480(%rbp), %rdx
movq %rdx, -0x1c8(%rbp)
movq %rcx, -0x1d0(%rbp)
movq %rax, -0x1d8(%rbp)
movq -0x1c8(%rbp), %rax
movq -0x1d0(%rbp), %rcx
movq %rcx, (%rax)
movq -0x1d8(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x510(%rbp), %rsi
movq -0x3f0(%rbp), %rcx
movq -0x3d8(%rbp), %r8
movq -0x348(%rbp), %r9
movq -0x3e8(%rbp), %rdx
subq $0x10, %rsp
movq %rsp, %rax
movq %rdx, (%rax)
leaq -0x335(%rbp), %rdi
leaq -0x480(%rbp), %rdx
callq 0x6b500
addq $0x10, %rsp
jmp 0x6ae1a
jmp 0x6ae1c
movq -0x3e8(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x3e8(%rbp)
jmp 0x6a876
cmpq $0x0, -0x368(%rbp)
jle 0x6afa0
movq -0x3d0(%rbp), %rcx
movq -0x360(%rbp), %rax
leaq -0x2a8(%rbp), %rdx
movq %rdx, -0x1b0(%rbp)
movq %rcx, -0x1b8(%rbp)
movq %rax, -0x1c0(%rbp)
movq -0x1b0(%rbp), %rax
movq -0x1b8(%rbp), %rdx
movq -0x1c0(%rbp), %rcx
movq %rax, -0x118(%rbp)
movq %rdx, -0x120(%rbp)
movq %rcx, -0x128(%rbp)
movq -0x118(%rbp), %rdi
movq -0x120(%rbp), %rdx
movq -0x128(%rbp), %rsi
movq (%rdi), %rcx
movq 0x8(%rdi), %rdi
imulq %rdi, %rsi
addq %rsi, %rdx
leaq (%rcx,%rdx,8), %rcx
movq 0x8(%rax), %rax
leaq -0x1a8(%rbp), %rdx
movq %rdx, -0x188(%rbp)
movq %rcx, -0x190(%rbp)
movq %rax, -0x198(%rbp)
movq -0x188(%rbp), %rax
movq -0x190(%rbp), %rcx
movq %rcx, (%rax)
movq -0x198(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x1a8(%rbp), %rax
movq %rax, -0x520(%rbp)
movq -0x1a0(%rbp), %rax
movq %rax, -0x518(%rbp)
movq -0x518(%rbp), %rax
movq -0x520(%rbp), %rcx
movq %rcx, -0x490(%rbp)
movq %rax, -0x488(%rbp)
movq -0x2e8(%rbp), %rdx
movq -0x370(%rbp), %rcx
movq -0x3d8(%rbp), %r8
movq -0x348(%rbp), %r9
movq -0x368(%rbp), %rsi
subq $0x30, %rsp
movq %rsp, %rax
movq %rsi, (%rax)
movq $0x0, 0x20(%rax)
movq $0x0, 0x18(%rax)
movq $-0x1, 0x10(%rax)
movq $-0x1, 0x8(%rax)
leaq -0x332(%rbp), %rdi
leaq -0x490(%rbp), %rsi
movsd 0xa03ed(%rip), %xmm0    # 0x10b380
callq 0x3af50
addq $0x30, %rsp
jmp 0x6af9e
jmp 0x6afa0
jmp 0x6afa2
movq -0x2c8(%rbp), %rax
addq -0x3d0(%rbp), %rax
movq %rax, -0x3d0(%rbp)
jmp 0x6a825
jmp 0x6afbe
movq -0x2c0(%rbp), %rax
addq -0x340(%rbp), %rax
movq %rax, -0x340(%rbp)
jmp 0x6a3dc
leaq -0x330(%rbp), %rdi
callq 0x30e60
leaq -0x300(%rbp), %rdi
callq 0x30e60
movq %rbp, %rsp
popq %rbp
retq
leaq -0x300(%rbp), %rdi
callq 0x30e60
movq -0x308(%rbp), %rdi
callq 0xa7c0
nopl (%rax)