// File: /workspace/github_cpp_makefile_star2_O3/IsaacLaw12[P]RayTracer/./Eigen/Eigen/src/Core/ProductEvaluators.h
// Function: Eigen::internal::product_evaluator<Eigen::Product<Eigen::Product<Eigen::Product<Eigen::Product<Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, 0>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, 0>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, 0>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, 1>, 3, Eigen::DenseShape, Eigen::DenseShape, double, double>::product_evaluator(Eigen::Product<Eigen::Product<Eigen::Product<Eigen::Product<Eigen::Matrix<double, 4, 4, 0, 4, 4>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, 0>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, 0>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, 0>, Eigen::Matrix<double, 4, 4, 0, 4, 4>, 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:
subq $0xe8, %rsp
movq 0x18(%rsi), %rax
movq (%rsi), %r8
movq 0x8(%rsi), %rdx
movq 0x10(%rsi), %rcx
movapd (%r8), %xmm0
movapd 0x10(%r8), %xmm1
movapd 0x20(%r8), %xmm2
movapd 0x30(%r8), %xmm3
movapd 0x40(%r8), %xmm4
movapd 0x60(%r8), %xmm5
movapd 0x50(%r8), %xmm6
movapd 0x70(%r8), %xmm7
xorl %r8d, %r8d
movsd (%rdx,%r8), %xmm11
movsd 0x8(%rdx,%r8), %xmm10
movsd 0x10(%rdx,%r8), %xmm8
movsd 0x18(%rdx,%r8), %xmm9
unpcklpd %xmm11, %xmm11          # xmm11 = xmm11[0,0]
movapd %xmm0, %xmm12
mulpd %xmm11, %xmm12
unpcklpd %xmm10, %xmm10          # xmm10 = xmm10[0,0]
movapd %xmm2, %xmm13
mulpd %xmm10, %xmm13
addpd %xmm12, %xmm13
unpcklpd %xmm8, %xmm8            # xmm8 = xmm8[0,0]
movapd %xmm4, %xmm12
mulpd %xmm8, %xmm12
addpd %xmm13, %xmm12
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
movapd %xmm5, %xmm13
mulpd %xmm9, %xmm13
addpd %xmm12, %xmm13
movapd %xmm13, 0x30(%rsp,%r8)
mulpd %xmm1, %xmm11
mulpd %xmm3, %xmm10
addpd %xmm11, %xmm10
mulpd %xmm6, %xmm8
addpd %xmm10, %xmm8
mulpd %xmm7, %xmm9
addpd %xmm8, %xmm9
movapd %xmm9, 0x40(%rsp,%r8)
addq $0x20, %r8
cmpq $0x80, %r8
jne 0x11d96
movapd 0x30(%rsp), %xmm0
movapd 0x40(%rsp), %xmm1
movapd 0x50(%rsp), %xmm2
movapd 0x60(%rsp), %xmm3
movapd 0x70(%rsp), %xmm4
movapd 0x90(%rsp), %xmm5
movapd 0x80(%rsp), %xmm6
movapd 0xa0(%rsp), %xmm7
xorl %edx, %edx
movsd (%rcx,%rdx), %xmm11
movsd 0x8(%rcx,%rdx), %xmm10
movsd 0x10(%rcx,%rdx), %xmm8
movsd 0x18(%rcx,%rdx), %xmm9
unpcklpd %xmm11, %xmm11          # xmm11 = xmm11[0,0]
movapd %xmm0, %xmm12
mulpd %xmm11, %xmm12
unpcklpd %xmm10, %xmm10          # xmm10 = xmm10[0,0]
movapd %xmm2, %xmm13
mulpd %xmm10, %xmm13
addpd %xmm12, %xmm13
unpcklpd %xmm8, %xmm8            # xmm8 = xmm8[0,0]
movapd %xmm4, %xmm12
mulpd %xmm8, %xmm12
addpd %xmm13, %xmm12
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
movapd %xmm5, %xmm13
mulpd %xmm9, %xmm13
addpd %xmm12, %xmm13
movapd %xmm13, -0x80(%rsp,%rdx)
mulpd %xmm1, %xmm11
mulpd %xmm3, %xmm10
addpd %xmm11, %xmm10
mulpd %xmm6, %xmm8
addpd %xmm10, %xmm8
mulpd %xmm7, %xmm9
addpd %xmm8, %xmm9
movapd %xmm9, -0x70(%rsp,%rdx)
addq $0x20, %rdx
cmpq $0x80, %rdx
jne 0x11e79
movapd -0x80(%rsp), %xmm0
movapd -0x70(%rsp), %xmm1
movapd -0x60(%rsp), %xmm2
movapd -0x50(%rsp), %xmm3
movapd -0x40(%rsp), %xmm4
movapd -0x20(%rsp), %xmm5
movapd -0x30(%rsp), %xmm6
movapd -0x10(%rsp), %xmm7
xorl %ecx, %ecx
movsd (%rax,%rcx), %xmm8
movsd 0x8(%rax,%rcx), %xmm9
movsd 0x10(%rax,%rcx), %xmm10
movsd 0x18(%rax,%rcx), %xmm11
unpcklpd %xmm8, %xmm8            # xmm8 = xmm8[0,0]
mulpd %xmm0, %xmm8
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
mulpd %xmm2, %xmm9
addpd %xmm8, %xmm9
unpcklpd %xmm10, %xmm10          # xmm10 = xmm10[0,0]
mulpd %xmm4, %xmm10
addpd %xmm9, %xmm10
unpcklpd %xmm11, %xmm11          # xmm11 = xmm11[0,0]
mulpd %xmm5, %xmm11
addpd %xmm10, %xmm11
movapd %xmm11, (%rdi,%rcx)
movsd (%rax,%rcx), %xmm8
movsd 0x8(%rax,%rcx), %xmm9
movsd 0x10(%rax,%rcx), %xmm10
movsd 0x18(%rax,%rcx), %xmm11
unpcklpd %xmm8, %xmm8            # xmm8 = xmm8[0,0]
mulpd %xmm1, %xmm8
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
mulpd %xmm3, %xmm9
addpd %xmm8, %xmm9
unpcklpd %xmm10, %xmm10          # xmm10 = xmm10[0,0]
mulpd %xmm6, %xmm10
addpd %xmm9, %xmm10
unpcklpd %xmm11, %xmm11          # xmm11 = xmm11[0,0]
mulpd %xmm7, %xmm11
addpd %xmm10, %xmm11
movapd %xmm11, 0x10(%rdi,%rcx)
addq $0x20, %rcx
cmpq $0x80, %rcx
jne 0x11f53
movq 0x20(%rsi), %rax
movq %rax, 0x80(%rdi)
movq %rdi, 0x88(%rdi)
movq %rax, 0x98(%rdi)
movq $0x4, 0xa8(%rdi)
addq $0xe8, %rsp
retq
nop