// File: /workspace/github_cpp_makefile_star2_O2/Pyboon[P]sage/./Eigen/src/Core/GeneralProduct.h
// Function: void Eigen::internal::gemv_dense_selector<2, 1, true>::run<Eigen::Transpose<Eigen::Matrix<std::complex<double>, -1, -1, 0, -1, -1> const>, Eigen::Transpose<Eigen::CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<std::complex<double>>, Eigen::Transpose<Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1> const> const> const>, Eigen::Transpose<Eigen::Matrix<std::complex<double>, 1, -1, 1, 1, -1>>>(Eigen::Transpose<Eigen::Matrix<std::complex<double>, -1, -1, 0, -1, -1> const> const&, Eigen::Transpose<Eigen::CwiseUnaryOp<Eigen::internal::scalar_conjugate_op<std::complex<double>>, Eigen::Transpose<Eigen::Matrix<std::complex<double>, -1, 1, 0, -1, 1> const> const> const> const&, Eigen::Transpose<Eigen::Matrix<std::complex<double>, 1, -1, 1, 1, -1>>&, Eigen::Transpose<Eigen::Matrix<std::complex<double>, 1, -1, 1, 1, -1>>::Scalar const&)
static void run(const Lhs &lhs, const Rhs &rhs, Dest& dest, const typename Dest::Scalar& alpha)
  {
    typedef typename Lhs::Scalar   LhsScalar;
    typedef typename Rhs::Scalar   RhsScalar;
    typedef typename Dest::Scalar  ResScalar;
    
    typedef internal::blas_traits<Lhs> LhsBlasTraits;
    typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
    typedef internal::blas_traits<Rhs> RhsBlasTraits;
    typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
    typedef typename internal::remove_all<ActualRhsType>::type ActualRhsTypeCleaned;

    typename add_const<ActualLhsType>::type actualLhs = LhsBlasTraits::extract(lhs);
    typename add_const<ActualRhsType>::type actualRhs = RhsBlasTraits::extract(rhs);

    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(lhs)
                                  * RhsBlasTraits::extractScalarFactor(rhs);

    enum {
      // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
      // on, the other hand it is good for the cache to pack the vector anyways...
      DirectlyUseRhs = ActualRhsTypeCleaned::InnerStrideAtCompileTime==1
    };

    gemv_static_vector_if<RhsScalar,ActualRhsTypeCleaned::SizeAtCompileTime,ActualRhsTypeCleaned::MaxSizeAtCompileTime,!DirectlyUseRhs> static_rhs;

    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(),
        DirectlyUseRhs ? const_cast<RhsScalar*>(actualRhs.data()) : static_rhs.data());

    if(!DirectlyUseRhs)
    {
      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
      Index size = actualRhs.size();
      EIGEN_DENSE_STORAGE_CTOR_PLUGIN
      #endif
      Map<typename ActualRhsTypeCleaned::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
    }

    typedef const_blas_data_mapper<LhsScalar,Index,RowMajor> LhsMapper;
    typedef const_blas_data_mapper<RhsScalar,Index,ColMajor> RhsMapper;
    general_matrix_vector_product
        <Index,LhsScalar,LhsMapper,RowMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsMapper,RhsBlasTraits::NeedToConjugate>::run(
        actualLhs.rows(), actualLhs.cols(),
        LhsMapper(actualLhs.data(), actualLhs.outerStride()),
        RhsMapper(actualRhsPtr, 1),
        dest.data(), dest.col(0).innerStride(), //NOTE  if dest is not a vector at compile-time, then dest.innerStride() might be wrong. (bug 1166)
        actualAlpha);
  }

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x90, %rsp
movq %rdx, %rbx
movq (%rdi), %r12
movq (%rsi), %r14
movsd 0xf819(%rip), %xmm0     # 0x1d3d8
leaq -0x40(%rbp), %rsi
movaps %xmm0, (%rsi)
movq %rcx, %rdi
callq 0xab66
leaq -0xa8(%rbp), %rdi
movsd %xmm0, (%rdi)
movsd %xmm1, 0x8(%rdi)
movaps 0xf88b(%rip), %xmm0     # 0x1d470
leaq -0x50(%rbp), %rsi
movaps %xmm0, (%rsi)
callq 0xab66
movsd %xmm0, -0x60(%rbp)
movsd %xmm1, -0x58(%rbp)
movq 0x8(%r14), %rcx
movq %rcx, %rax
shrq $0x3c, %rax
je 0xdc11
callq 0x5906
movq 0x8(%r14), %rcx
movq (%r14), %rax
testq %rax, %rax
je 0xdc1d
xorl %edx, %edx
jmp 0xdc56
movq %rcx, %rdi
shlq $0x4, %rdi
cmpq $0x20000, %rdi          # imm = 0x20000
ja 0xdc43
movq %rsp, %rdx
addq $0x1e, %rdi
andq $-0x10, %rdi
subq %rdi, %rdx
movq %rdx, %rsp
movq %rdx, %rax
jmp 0xdc56
callq 0x595a
movq 0x8(%r14), %rcx
xorl %edx, %edx
cmpq $0x0, (%r14)
cmoveq %rax, %rdx
movq %rcx, %rsi
shlq $0x4, %rsi
cmpq $0x20001, %rsi          # imm = 0x20001
movq %rdx, -0x40(%rbp)
movq %rcx, -0x38(%rbp)
setae -0x30(%rbp)
movq 0x8(%r12), %r14
movq 0x10(%r12), %r15
movq (%r12), %rcx
movq %rcx, -0x50(%rbp)
movq %r14, -0x48(%rbp)
movq %rax, -0x70(%rbp)
movq $0x1, -0x68(%rbp)
movq (%rbx), %rax
movq (%rax), %r12
leaq -0xa8(%rbp), %rdi
movq %rbx, %rsi
xorl %edx, %edx
callq 0xe744
leaq -0x50(%rbp), %rdx
leaq -0x70(%rbp), %rcx
pushq $0x1
popq %r9
movq %r15, %rdi
movq %r14, %rsi
movq %r12, %r8
movsd -0x60(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
callq 0xdcf8
leaq -0x40(%rbp), %rdi
callq 0xe734
leaq -0x20(%rbp), %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
leaq -0x40(%rbp), %rdi
callq 0xe734
movq %rbx, %rdi
callq 0x3430
nop