// File: /workspace/github_cpp_makefile_star2_O3/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 %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movq %rdx, %rbx
movq (%rdi), %r12
movq (%rsi), %r13
movsd 0xc9bc(%rip), %xmm0     # 0x1d3f0
leaq -0x50(%rbp), %rsi
movaps %xmm0, (%rsi)
movups (%rcx), %xmm0
leaq -0x40(%rbp), %r14
movaps %xmm0, (%r14)
movq %r14, %rdi
callq 0xff34
movaps (%r14), %xmm0
movaps 0xca57(%rip), %xmm1     # 0x1d4b0
leaq -0x70(%rbp), %rsi
movaps %xmm1, (%rsi)
movaps %xmm0, (%r14)
leaq -0x40(%rbp), %rdi
callq 0xff34
movq 0x8(%r13), %r15
movq %r15, %rax
shrq $0x3c, %rax
jne 0x10b51
movsd -0x40(%rbp), %xmm0
movsd -0x38(%rbp), %xmm1
movq (%r13), %rax
testq %rax, %rax
je 0x10a96
xorl %r14d, %r14d
jmp 0x10aea
movq %r15, %rdi
shlq $0x4, %rdi
cmpq $0x2000, %r15           # imm = 0x2000
ja 0x10abc
movq %rsp, %r14
addq $0x1e, %rdi
andq $-0x10, %rdi
subq %rdi, %r14
movq %r14, %rsp
movq %r14, %rax
jmp 0x10aea
movsd %xmm1, -0x58(%rbp)
movsd %xmm0, -0x60(%rbp)
callq 0x3360
movq %rax, %r14
testb $0xf, %r14b
jne 0x10b9e
movq %r14, %rax
testq %r14, %r14
movsd -0x60(%rbp), %xmm0
movsd -0x58(%rbp), %xmm1
je 0x10b51
movq 0x8(%r12), %rsi
movq 0x10(%r12), %rdi
movq (%r12), %rcx
movq %rcx, -0x40(%rbp)
movq %rsi, -0x38(%rbp)
movq %rax, -0x50(%rbp)
movq $0x1, -0x48(%rbp)
movq (%rbx), %rax
movq (%rax), %r8
testq %r8, %r8
je 0x10b1e
cmpq $0x0, 0x8(%rax)
js 0x10b7f
leaq -0x40(%rbp), %rdx
leaq -0x50(%rbp), %rcx
movl $0x1, %r9d
callq 0x10bda
cmpq $0x2001, %r15           # imm = 0x2001
jb 0x10b42
movq %r14, %rdi
callq 0x3310
leaq -0x28(%rbp), %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movl $0x8, %edi
callq 0x3130
movq 0x1e45e(%rip), %rcx     # 0x2efc0
addq $0x10, %rcx
movq %rcx, (%rax)
movq 0x1e460(%rip), %rsi     # 0x2efd0
movq 0x1e431(%rip), %rdx     # 0x2efa8
movq %rax, %rdi
callq 0x3430
leaq 0xd58c(%rip), %rdi      # 0x1e112
leaq 0xd62f(%rip), %rsi      # 0x1e1bc
leaq 0x109ac(%rip), %rcx     # 0x21540
movl $0xaf, %edx
callq 0x31b0
leaq 0xbd56(%rip), %rdi      # 0x1c8fb
leaq 0xbe09(%rip), %rsi      # 0x1c9b5
leaq 0xbe21(%rip), %rcx      # 0x1c9d4
movl $0xa1, %edx
callq 0x31b0
movq %rax, %rbx
cmpq $0x2001, %r15           # imm = 0x2001
jb 0x10bd1
movq %r14, %rdi
callq 0x3310
movq %rbx, %rdi
callq 0x3450
nop