// File: /workspace/github_cpp_makefile_star2_O3/j-faria[P]kima/eigen/Eigen/src/Core/products/SelfadjointProduct.h
// Function: Eigen::selfadjoint_product_selector<Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, -1, false>, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, -1, false>, 1, false>::run(Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, -1, false>&, Eigen::Block<Eigen::Matrix<double, -1, -1, 0, -1, -1>, -1, -1, false> const&, double const&)
static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha)
  {
    typedef typename MatrixType::Scalar Scalar;
    typedef internal::blas_traits<OtherType> OtherBlasTraits;
    typedef typename OtherBlasTraits::DirectLinearAccessType ActualOtherType;
    typedef typename internal::remove_all<ActualOtherType>::type _ActualOtherType;
    typename internal::add_const_on_value_type<ActualOtherType>::type actualOther = OtherBlasTraits::extract(other.derived());

    Scalar actualAlpha = alpha * OtherBlasTraits::extractScalarFactor(other.derived());

    enum {
      IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0,
      OtherIsRowMajor = _ActualOtherType::Flags&RowMajorBit ? 1 : 0
    };

    Index size = mat.cols();
    Index depth = actualOther.cols();

    typedef internal::gemm_blocking_space<IsRowMajor ? RowMajor : ColMajor,Scalar,Scalar,
              MatrixType::MaxColsAtCompileTime, MatrixType::MaxColsAtCompileTime, _ActualOtherType::MaxColsAtCompileTime> BlockingType;

    BlockingType blocking(size, size, depth, 1, false);


    internal::general_matrix_matrix_triangular_product<Index,
      Scalar, OtherIsRowMajor ? RowMajor : ColMajor,   OtherBlasTraits::NeedToConjugate  && NumTraits<Scalar>::IsComplex,
      Scalar, OtherIsRowMajor ? ColMajor : RowMajor, (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex,
      IsRowMajor ? RowMajor : ColMajor, MatrixType::InnerStrideAtCompileTime, UpLo>
      ::run(size, depth,
            &actualOther.coeffRef(0,0), actualOther.outerStride(), &actualOther.coeffRef(0,0), actualOther.outerStride(),
            mat.data(), mat.innerStride(), mat.outerStride(), actualAlpha, blocking);
  }

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movsd (%rdx), %xmm0
leaq 0x38(%rsp), %rbp
movsd %xmm0, (%rbp)
movq 0x10(%rdi), %r15
movq 0x10(%rsi), %r12
xorps %xmm0, %xmm0
leaq 0x10(%rsp), %rsi
movaps %xmm0, -0x10(%rsi)
movq %r15, (%rsi)
movq %r15, 0x8(%rsi)
leaq 0x20(%rsp), %r13
movq %r12, (%r13)
leaq 0x40(%rsp), %rdx
movq %r15, (%rdx)
movl $0x1, %ecx
movq %r13, %rdi
callq 0x1db56
movq (%r13), %rax
movq -0x10(%r13), %rcx
imulq %rax, %rcx
movq %rcx, 0x8(%r13)
imulq -0x8(%r13), %rax
movq %rax, 0x10(%r13)
movq (%r14), %rdx
movq 0x30(%r14), %rcx
subq $0x8, %rsp
leaq 0x8(%rsp), %rax
movq %r15, %rdi
movq %r12, %rsi
movq %rdx, %r8
movq %rcx, %r9
pushq %rax
pushq %rbp
pushq 0x30(%rbx)
pushq $0x1
pushq (%rbx)
callq 0x1d5d4
addq $0x30, %rsp
movq (%rsp), %rdi
callq 0x64d0
movq 0x8(%rsp), %rdi
callq 0x64d0
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
movq (%rsp), %rdi
callq 0x64d0
movq 0x8(%rsp), %rdi
callq 0x64d0
movq %rbx, %rdi
callq 0x6710