// File: canzarlab[P]Trajan/./Eigen/src/LU/FullPivLU.h
// Function: void Eigen::FullPivLU<Eigen::Matrix<double, -1, -1, 0, -1, -1>>::_solve_impl<Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1>>, Eigen::Matrix<double, -1, -1, 0, -1, -1>>(Eigen::CwiseNullaryOp<Eigen::internal::scalar_identity_op<double>, Eigen::Matrix<double, -1, -1, 0, -1, -1>> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&) const
void FullPivLU<_MatrixType>::_solve_impl(const RhsType &rhs, DstType &dst) const
{
  /* The decomposition PAQ = LU can be rewritten as A = P^{-1} L U Q^{-1}.
  * So we proceed as follows:
  * Step 1: compute c = P * rhs.
  * Step 2: replace c by the solution x to Lx = c. Exists because L is invertible.
  * Step 3: replace c by the solution x to Ux = c. May or may not exist.
  * Step 4: result = Q * c;
  */

  const Index rows = this->rows(),
              cols = this->cols(),
              nonzero_pivots = this->rank();
  eigen_assert(rhs.rows() == rows);
  const Index smalldim = (std::min)(rows, cols);

  if(nonzero_pivots == 0)
  {
    dst.setZero();
    return;
  }

  typename RhsType::PlainObject c(rhs.rows(), rhs.cols());

  // Step 1
  c = permutationP() * rhs;

  // Step 2
  m_lu.topLeftCorner(smalldim,smalldim)
      .template triangularView<UnitLower>()
      .solveInPlace(c.topRows(smalldim));
  if(rows>cols)
    c.bottomRows(rows-cols) -= m_lu.bottomRows(rows-cols) * c.topRows(cols);

  // Step 3
  m_lu.topLeftCorner(nonzero_pivots, nonzero_pivots)
      .template triangularView<Upper>()
      .solveInPlace(c.topRows(nonzero_pivots));

  // Step 4
  for(Index i = 0; i < nonzero_pivots; ++i)
    dst.row(permutationQ().indices().coeff(i)) = c.row(i);
  for(Index i = nonzero_pivots; i < m_lu.cols(); ++i)
    dst.row(permutationQ().indices().coeff(i)).setZero();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x400, %rsp            # imm = 0x400
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x3b8(%rbp)
callq 0x4e200
movq -0x3b8(%rbp), %rdi
movq %rax, -0x20(%rbp)
callq 0x4e220
movq -0x3b8(%rbp), %rdi
movq %rax, -0x28(%rbp)
callq 0x4e8a0
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rdi
callq 0x336a0
cmpq -0x20(%rbp), %rax
jne 0x4e4ac
jmp 0x4e4cb
leaq 0xc7038(%rip), %rdi     # 0x1154eb
leaq 0xc4dd3(%rip), %rsi     # 0x11328d
movl $0x2f8, %edx            # imm = 0x2F8
leaq 0xc7038(%rip), %rcx     # 0x1154fe
callq 0xa2b0
leaq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x2b810
movq (%rax), %rax
movq %rax, -0x38(%rbp)
cmpq $0x0, -0x30(%rbp)
jne 0x4e4f4
movq -0x18(%rbp), %rdi
callq 0x26d20
jmp 0x4e863
movq -0x10(%rbp), %rdi
callq 0x336a0
movq %rax, -0x58(%rbp)
movq -0x10(%rbp), %rdi
callq 0x336c0
movq %rax, -0x60(%rbp)
leaq -0x50(%rbp), %rdi
leaq -0x58(%rbp), %rsi
leaq -0x60(%rbp), %rdx
callq 0x26cb0
movq -0x3b8(%rbp), %rdi
callq 0x4e9e0
movq %rax, -0x3c0(%rbp)
jmp 0x4e534
movq -0x3c0(%rbp), %rsi
movq -0x10(%rbp), %rdx
leaq -0x80(%rbp), %rdi
callq 0x4e990
jmp 0x4e54a
leaq -0x50(%rbp), %rdi
leaq -0x80(%rbp), %rsi
callq 0x4ea40
jmp 0x4e559
movq -0x3b8(%rbp), %rsi
movq -0x38(%rbp), %rcx
leaq -0x100(%rbp), %rdi
movq %rcx, %rdx
callq 0x4ea70
jmp 0x4e575
leaq -0xc8(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0x4eac0
jmp 0x4e58a
movq -0x38(%rbp), %rdx
leaq -0x138(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x4eb30
jmp 0x4e5a0
leaq -0xc8(%rbp), %rdi
leaq -0x138(%rbp), %rsi
callq 0x4eb00
jmp 0x4e5b5
movq -0x20(%rbp), %rax
cmpq -0x28(%rbp), %rax
jle 0x4e669
movq -0x3b8(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
leaq -0x1e0(%rbp), %rdi
callq 0x4eb90
jmp 0x4e5e3
movq -0x28(%rbp), %rdx
leaq -0x218(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x4eb30
jmp 0x4e5f9
leaq -0x1a8(%rbp), %rdi
leaq -0x1e0(%rbp), %rsi
leaq -0x218(%rbp), %rdx
callq 0x4ec10
jmp 0x4e615
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
leaq -0x250(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x4ec60
jmp 0x4e632
leaq -0x250(%rbp), %rdi
leaq -0x1a8(%rbp), %rsi
callq 0x4ece0
jmp 0x4e647
jmp 0x4e669
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x88(%rbp)
movl %eax, -0x8c(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x1ae20
jmp 0x4e86c
movq -0x3b8(%rbp), %rsi
movq -0x30(%rbp), %rcx
leaq -0x2c0(%rbp), %rdi
movq %rcx, %rdx
callq 0x4ea70
jmp 0x4e685
leaq -0x288(%rbp), %rdi
leaq -0x2c0(%rbp), %rsi
callq 0x4ed40
jmp 0x4e69a
movq -0x30(%rbp), %rdx
leaq -0x2f8(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x4eb30
jmp 0x4e6b0
leaq -0x288(%rbp), %rdi
leaq -0x2f8(%rbp), %rsi
callq 0x4ed80
jmp 0x4e6c5
movq $0x0, -0x300(%rbp)
movq -0x300(%rbp), %rax
cmpq -0x30(%rbp), %rax
jge 0x4e78b
movq -0x300(%rbp), %rdx
leaq -0x338(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x269c0
jmp 0x4e6fa
movq -0x3b8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq %rax, -0x3d0(%rbp)
callq 0x4edb0
movq %rax, -0x3c8(%rbp)
jmp 0x4e71a
movq -0x3c8(%rbp), %rdi
callq 0x4d800
movq %rax, %rdi
movq -0x300(%rbp), %rsi
callq 0x4ee10
movq %rax, -0x3d8(%rbp)
jmp 0x4e73e
movq -0x3d0(%rbp), %rsi
movq -0x3d8(%rbp), %rax
movslq (%rax), %rdx
leaq -0x370(%rbp), %rdi
callq 0x269c0
jmp 0x4e75d
leaq -0x370(%rbp), %rdi
leaq -0x338(%rbp), %rsi
callq 0x4ee40
jmp 0x4e772
jmp 0x4e774
movq -0x300(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x300(%rbp)
jmp 0x4e6d0
movq -0x30(%rbp), %rax
movq %rax, -0x378(%rbp)
movq -0x3b8(%rbp), %rdi
movq -0x378(%rbp), %rax
movq %rax, -0x3e8(%rbp)
callq 0x26800
movq %rax, -0x3e0(%rbp)
jmp 0x4e7b9
movq -0x3e8(%rbp), %rax
movq -0x3e0(%rbp), %rcx
cmpq %rcx, %rax
jge 0x4e85a
movq -0x3b8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq %rax, -0x3f8(%rbp)
callq 0x4edb0
movq %rax, -0x3f0(%rbp)
jmp 0x4e7f0
movq -0x3f0(%rbp), %rdi
callq 0x4d800
movq %rax, %rdi
movq -0x378(%rbp), %rsi
callq 0x4ee10
movq %rax, -0x400(%rbp)
jmp 0x4e814
movq -0x3f8(%rbp), %rsi
movq -0x400(%rbp), %rax
movslq (%rax), %rdx
leaq -0x3b0(%rbp), %rdi
callq 0x269c0
jmp 0x4e833
leaq -0x3b0(%rbp), %rdi
callq 0x4ee70
jmp 0x4e841
jmp 0x4e843
movq -0x378(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x378(%rbp)
jmp 0x4e796
leaq -0x50(%rbp), %rdi
callq 0x1ae20
addq $0x400, %rsp            # imm = 0x400
popq %rbp
retq
movq -0x88(%rbp), %rdi
callq 0xa7c0
nopl (%rax,%rax)