// File: Pyboon[P]sage/./Eigen/src/Core/ProductEvaluators.h
// Function: Eigen::internal::product_evaluator<Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<std::complex<double>>, Eigen::Transpose<Eigen::Matrix<std::complex<double>, 4, 1, 0, 4, 1> const> const>, Eigen::Inverse<Eigen::Matrix<std::complex<double>, -1, -1, 0, -1, -1>>, 1>, 3, Eigen::DenseShape, Eigen::DenseShape, std::complex<double>, std::complex<double>>::product_evaluator(Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<std::complex<double>>, Eigen::Transpose<Eigen::Matrix<std::complex<double>, 4, 1, 0, 4, 1> const> const>, Eigen::Inverse<Eigen::Matrix<std::complex<double>, -1, -1, 0, -1, -1>>, 1> const&)
explicit product_evaluator(const XprType& xpr)
    : m_lhs(xpr.lhs()),
      m_rhs(xpr.rhs()),
      m_lhsImpl(m_lhs),     // FIXME the creation of the evaluator objects should result in a no-op, but check that!
      m_rhsImpl(m_rhs),     //       Moreover, they are only useful for the packet path, so we could completely disable them when not needed,
                            //       or perhaps declare them on the fly on the packet method... We have experiment to check what's best.
      m_innerDim(xpr.lhs().cols())
  {
    EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits<Scalar>::MulCost);
    EIGEN_INTERNAL_CHECK_COST_VALUE(NumTraits<Scalar>::AddCost);
    EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
#if 0
    std::cerr << "LhsOuterStrideBytes=  " << LhsOuterStrideBytes << "\n";
    std::cerr << "RhsOuterStrideBytes=  " << RhsOuterStrideBytes << "\n";
    std::cerr << "LhsAlignment=         " << LhsAlignment << "\n";
    std::cerr << "RhsAlignment=         " << RhsAlignment << "\n";
    std::cerr << "CanVectorizeLhs=      " << CanVectorizeLhs << "\n";
    std::cerr << "CanVectorizeRhs=      " << CanVectorizeRhs << "\n";
    std::cerr << "CanVectorizeInner=    " << CanVectorizeInner << "\n";
    std::cerr << "EvalToRowMajor=       " << EvalToRowMajor << "\n";
    std::cerr << "Alignment=            " << Alignment << "\n";
    std::cerr << "Flags=                " << Flags << "\n";
#endif
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x38(%rbp)
movq %rdi, %rax
movq %rax, -0x30(%rbp)
callq 0x46900
movq -0x10(%rbp), %rdi
callq 0x46920
movq %rax, -0x28(%rbp)
jmp 0x467f3
movq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rdi
callq 0x46930
jmp 0x46802
movq -0x30(%rbp), %rax
addq $0x40, %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rdi
callq 0x46970
movq %rax, -0x40(%rbp)
jmp 0x4681d
movq -0x40(%rbp), %rsi
movq -0x48(%rbp), %rdi
callq 0x46990
jmp 0x4682c
movq -0x30(%rbp), %rsi
movq %rsi, %rdi
addq $0x58, %rdi
movq %rdi, -0x50(%rbp)
callq 0x469f0
jmp 0x46842
movq -0x30(%rbp), %rsi
movq %rsi, %rdi
addq $0x68, %rdi
movq %rdi, -0x58(%rbp)
addq $0x40, %rsi
callq 0x148d0
jmp 0x4685c
movq -0x30(%rbp), %rax
addq $0x78, %rax
movq %rax, -0x68(%rbp)
movq -0x10(%rbp), %rdi
callq 0x46920
movq %rax, -0x60(%rbp)
jmp 0x46877
movq -0x60(%rbp), %rdi
callq 0x44ef0
movq %rax, -0x70(%rbp)
jmp 0x46886
movq -0x68(%rbp), %rax
movq -0x70(%rbp), %rcx
movq %rcx, (%rax)
addq $0x70, %rsp
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x468e8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x468df
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
jmp 0x468d6
movq -0x58(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x18(%rbp)
movl %eax, -0x1c(%rbp)
callq 0x149f0
movq -0x50(%rbp), %rdi
callq 0x46a20
movq -0x48(%rbp), %rdi
callq 0xfac0
movq -0x30(%rbp), %rdi
callq 0x46a40
movq -0x18(%rbp), %rdi
callq 0x9dc0
nopw (%rax,%rax)